From fcbf63e62c627deae76c1b8cb8c0876c536ed811 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Mon, 16 Mar 2020 18:49:26 +0900 Subject: Fresh start --- jni/ruby/ext/tk/sample/tkextlib/treectrl/help.rb | 404 +++++++++++++++++++++++ 1 file changed, 404 insertions(+) create mode 100644 jni/ruby/ext/tk/sample/tkextlib/treectrl/help.rb (limited to 'jni/ruby/ext/tk/sample/tkextlib/treectrl/help.rb') diff --git a/jni/ruby/ext/tk/sample/tkextlib/treectrl/help.rb b/jni/ruby/ext/tk/sample/tkextlib/treectrl/help.rb new file mode 100644 index 0000000..31ec9eb --- /dev/null +++ b/jni/ruby/ext/tk/sample/tkextlib/treectrl/help.rb @@ -0,0 +1,404 @@ +# +# Demo: Help contents +# +def demoHelpContents(t) + height = t.font.metrics(:linespace) + height = 18 if height < 18 + t.configure(:showroot=>false, :showbuttons=>false, :showlines=>false, + :itemheight=>height, :selectmode=>:browse) + + init_pics('help-*') + + if $Version_1_1_OrLater + t.column_create(:text=>'Help Contents') + else # TreeCtrl 1.0 + t.column_configure(0, :text=>'Help Contents') + end + + # Define a new item state + t.state_define('mouseover') + + t.element_create('e1', :image, :image=>@images['help-page']) + t.element_create('e2', :image, :image=>[ + @images['help-book-open'], ['open'], + @images['help-book-closed'], [], + ]) + t.element_create('e3', :text, + :font=>[t.font.dup.underline(true), ['mouseover']], + :fill=>[ + @SystemHighlightText, ['selected', 'focus'], + 'blue', ['mouseover'] + ]) + t.element_create('e4', :rect, :showfocus=>true, + :fill=>[@SystemHighlight, ['selected', 'focus']]) + + # book + s = t.style_create('s1') + t.style_elements(s, ['e4', 'e1', 'e3']) + t.style_layout(s, 'e1', :padx=>[0,4], :expand=>:ns) + t.style_layout(s, 'e3', :expand=>:ns) + t.style_layout(s, 'e4', :union=>['e3'], :iexpand=>:ns, :ipadx=>2) + + # page + s = t.style_create('s2') + t.style_elements(s, ['e4', 'e2', 'e3']) + t.style_layout(s, 'e2', :padx=>[0,4], :expand=>:ns) + t.style_layout(s, 'e3', :expand=>:ns) + t.style_layout(s, 'e4', :union=>['e3'], :iexpand=>:ns, :ipadx=>2) + + parentList = [:root, '', '', '', '', '', ''] + parent = :root + [ + [0, 's1', "Welcome to Help"], + [0, 's2', "Introducing Windows 98"], + [1, 's2', "How to Use Help"], + [2, 's1', "Find a topic"], + [2, 's1', "Get more out of help"], + [1, 's2', "Register Your Software"], + [2, 's1', "Registering Windows 98 online"], + [1, 's2', "What's New in Windows 98"], + [2, 's1', "Innovative, easy-to-use features"], + [2, 's1', "Improved reliability"], + [2, 's1', "A faster operating system"], + [2, 's1', "True Web integration"], + [2, 's1', "More entertaining and fun"], + [1, 's2', "If You're New to Windows 98"], + [2, 's2', "Tips for Macintosh Users"], + [3, 's1', "Why does the mouse have two buttons?"] + ].each{|depth, style, text| + item = t.item_create + t.item_style_set(item, 0, style) + t.item_element_configure(item, 0, 'e3', :text=>text) + if $Version_1_1_OrLater + t.item_collapse(item) + else # TreeCtrl 1.0 + t.collapse(item) + end + t.item_lastchild(parentList[depth], item) + depth += 1 + parentList[depth] = item + } + + treeCtrlHelp = TkBindTag.new + + treeCtrlHelp.bind('Double-ButtonPress-1', + proc{|w, x, y| + if w.identify(x, y)[0] == 'header' + Tk::TreeCtrl::BindCallback.doubleButton1(w, x, y) + else + helpButton1(w, x, y) + end + Tk.callback_break + }, '%W %x %y') + + treeCtrlHelp.bind('ButtonPress-1', + proc{|w, x, y| + helpButton1(w, x, y) + Tk.callback_break + }, '%W %x %y') + + treeCtrlHelp.bind('Button1-Motion', + proc{|w, x, y| + helpMotion1(w, x, y) + Tk.callback_break + }, '%W %x %y') + + treeCtrlHelp.bind('Button1-Leave', + proc{|w, x, y| + helpLeave1(w, x, y) + Tk.callback_break + }, '%W %x %y') + + treeCtrlHelp.bind('ButtonRelease-1', + proc{|w, x, y| + helpRelease1(w, x, y) + Tk.callback_break + }, '%W %x %y') + + treeCtrlHelp.bind('Motion', proc{|w, x, y| helpMotion(w, x, y) }, '%W %x %y') + + treeCtrlHelp.bind('Leave', proc{|w, x, y| helpMotion(w, x, y) }, '%W %x %y') + + treeCtrlHelp.bind('KeyPress-Return', + proc{|w, x, y| + if w.selection_get.length == 1 + if $Version_1_1_OrLater + w.item_toggle(w.selection_get[0]) + else # TreeCtrl 1.0 + w.toggle(w.selection_get[0]) + end + end + Tk.callback_break + }, '%W %x %y') + + @Priv[:help, :prev] = '' + + t.bindtags = [ t, treeCtrlHelp, Tk::TreeCtrl, t.winfo_toplevel, :all ] +end + +# This is an alternate implementation that does not define a new item state +# to change the appearance of the item under the cursor. +def demoHelpContents2(t) + height = t.font.metrics(:linespace) + height = 18 if height < 18 + t.configure(:showroot=>false, :showbuttons=>false, :showlines=>false, + :itemheight=>height, :selectmode=>:browse) + + init_pics('help-*') + + if $Version_1_1_OrLater + t.column_create(:text=>'Help Contents') + else # TreeCtrl 1.0 + t.column_configure(0, :text=>'Help Contents') + end + + t.element_create('e1', :image, :image=>@images['help-page']) + t.element_create('e2', :image, :image=>[ + @images['help-book-open'], ['open'], + @images['help-book-closed'], [], + ]) + t.element_create('e3', :text, + :fill=>[ + @SystemHighlightText, ['selected', 'focus'], + 'blue', [] + ]) + t.element_create('e4', :rect, :showfocus=>true, + :fill=>[@SystemHighligh, ['selected', 'focus']]) + t.element_create('e5', :text, :font=>t.font.dup.underline(true), + :fill=>[ + @SystemHighlightText, ['selected', 'focus'], + 'blue', [] + ]) + + # book + s = t.style_create('s1') + t.style_elements(s, ['e4', 'e1', 'e3']) + t.style_layout(s, 'e1', :padx=>[0,4], :expand=>:ns) + t.style_layout(s, 'e3', :expand=>:ns) + t.style_layout(s, 'e4', :union=>['e3'], :iexpand=>:ns, :ipadx=>2) + + # page + s = t.style_create('s2') + t.style_elements(s, ['e4', 'e2', 'e3']) + t.style_layout(s, 'e2', :padx=>[0,4], :expand=>:ns) + t.style_layout(s, 'e3', :expand=>:ns) + t.style_layout(s, 'e4', :union=>['e3'], :iexpand=>:ns, :ipadx=>2) + + # book (focus) + s = t.style_create('s1.f') + t.style_elements(s, ['e4', 'e1', 'e5']) + t.style_layout(s, 'e1', :padx=>[0,4], :expand=>:ns) + t.style_layout(s, 'e5', :expand=>:ns) + t.style_layout(s, 'e4', :union=>['e5'], :iexpand=>:ns, :ipadx=>2) + + # page (focus) + s = t.style_create('s2') + t.style_elements(s, ['e4', 'e2', 'e5']) + t.style_layout(s, 'e2', :padx=>[0,4], :expand=>:ns) + t.style_layout(s, 'e5', :expand=>:ns) + t.style_layout(s, 'e4', :union=>['e5'], :iexpand=>:ns, :ipadx=>2) + + parentList = [:root, '', '', '', '', '', ''] + parent = :root + [ + [0, 's1', "Welcome to Help"], + [0, 's2', "Introducing Windows 98"], + [1, 's2', "How to Use Help"], + [2, 's1' "Find a topic"], + [2, 's1', "Get more out of help"], + [1, 's2', "Register Your Software"], + [2, 's1', "Registering Windows 98 online"], + [1, 's2', "What's New in Windows 98"], + [2, 's1', "Innovative, easy-to-use features"], + [2, 's1', "Improved reliability"], + [2, 's1', "A faster operating system"], + [2, 's1', "True Web integration"], + [2, 's1', "More entertaining and fun"], + [1, 's2', "If You're New to Windows 98"], + [2, 's2', "Tips for Macintosh Users"], + [3, 's1', "Why does the mouse have two buttons?"] + ].each{|depth, style, text| + item = t.item_create + t.item_style_set(item, 0, style) + t.item_element_configure(item, 0, 'e3', :text=>text) + if $Version_1_1_OrLater + t.item_collapse(item) + else # TreeCtrl 1.0 + t.collapse(item) + end + t.item_lastchild(parentList[depth], item) + depth += 1 + parentList[depth] = item + } + + treeCtrlHelp = TkBindTag.new + + treeCtrlHelp.bind('Double-ButtonPress-1', + proc{|w, x, y| + if w.identify(x, y)[0] == 'header' + Tk::TreeCtrl::BindCallback.doubleButton1(w, x, y) + else + helpButton1(w, x, y) + end + Tk.callback_break + }, '%W %x %y') + + treeCtrlHelp.bind('ButtonPress-1', + proc{|w, x, y| + helpButton1(w, x, y) + Tk.callback_break + }, '%W %x %y') + + treeCtrlHelp.bind('Button1-Motion', + proc{|w, x, y| + helpMotion1(w, x, y) + Tk.callback_break + }, '%W %x %y') + + treeCtrlHelp.bind('Button1-Leave', + proc{|w, x, y| + helpLeave1(w, x, y) + Tk.callback_break + }, '%W %x %y') + + treeCtrlHelp.bind('ButtonRelease-1', + proc{|w, x, y| + helpRelease1(w, x, y) + Tk.callback_break + }, '%W %x %y') + + treeCtrlHelp.bind('Motion', proc{|w, x, y| helpMotion(w, x, y) }, '%W %x %y') + + treeCtrlHelp.bind('Leave', proc{|w, x, y| helpMotion(w, x, y) }, '%W %x %y') + + treeCtrlHelp.bind('KeyPress-Return', + proc{|w, x, y| + if w.selection_get.length == 1 + w.item_toggle(w.selection_get[0]) + end + Tk.callback_break + }, '%W %x %y') + + @Priv[:help, :prev] = '' + + t.bindtags = [ t, treeCtrlHelp, Tk::TreeCtrl, t.winfo_toplevel, :all ] +end + +def helpButton1(w, x, y) + w.set_focus + id = w.identify(x, y) + @Priv['buttonMode'] = '' + if id[0] == 'header' + Tk::TreeCtrl::BindCallback.buttonPress1(w, x, y) + elsif id[0] == 'item' + item = id[1] + # didn't click an element + return if id.length != 6 + if w.selection_includes(item) + w.toggle(item) + return + end + if w.selection_get.length > 0 + item2 = w.selection_get[0] + if $Version_1_1_OrLater + w.item_collapse(item2) + else # TreeCtrl 1.0 + w.collapse(item2) + end + w.item_ancestors(item2).each{|i| + if $Version_1_1_OrLater + w.item_collapse(i) if w.compare(item, '!=', i) + else # TreeCtrl 1.0 + w.collapse(i) if w.compare(item, '!=', i) + end + } + end + w.activate(item) + if $Version_1_1_OrLater + w.item_ancestors(item).each{|i| + w.item_expand(i) + } + w.item_toggle(item) + else # TreeCtrl 1.0 + w.expand(*(w.item_ancestors(item))) + w.toggle(item) + end + w.selection_modify(item, :all) + end +end + +def helpMotion1(w, x, y) + case @Priv['buttonMode'] + when 'resize', 'header' + Tk::TreeCtrl::BindCallback.motion1(w, x, y) + end +end + +def helpLeave1(w, x, y) + # This is called when I do ButtonPress-1 on Unix for some reason, + # and buttonMode is undefined. + return unless @Priv.exist?('buttonMode') + case @Priv['buttonMode'] + when 'header' + w.column_configure(@Priv['column'], :sunken=>false) + end +end + +def helpRelease1(w, x, y) + case @Priv['buttonMode'] + when 'resize', 'header' + Tk::TreeCtrl::BindCallback.release1(w, x, y) + end + @Priv['buttonMode'] = '' +end + +def helpMotion(w, x, y) + id = w.identify(x, y) + if id.empty? + elsif id[0] == 'header' + elsif id[0] == 'item' + item = id[1] + if id.length == 6 + if @Priv[:help, :prev] != TkComm._get_eval_string(item) + if @Priv[:help, :prev] != '' + w.item_state_set(@Priv[:help, :prev], '!mouseover') + end + w.item_state_set(item, 'mouseover') + @Priv[:help, :prev] = item + end + return + end + end + if @Priv[:help, :prev] != '' + w.item_state_set(@Priv[:help, :prev], '!mouseover') + @Priv[:help, :prev] = '' + end +end + +# Alternate implementation doesn't rely on mouseover state +def helpMotion2(w, x, y) + id = w.identify(x, y) + if id[0] == 'header' + elsif !id.empty? + item = id[1] + if id.kength == 6 + if @Priv[:help, :prev] != TkComm._get_eval_string(item) + if @Priv[:help, :prev] != '' + style = w.item_style_set(@Priv[:help, :prev], 0) + style.sub!(/\.f$/, '') + w.item_style_map(@Priv[:help, :prev], 0, style, ['e5', 'e3']) + end + style = w.item_style_set(item, 0) + w.item_style_map(item, 0, style + '.f', ['e3', 'e5']) + @Priv[:help, :prev] = item + end + return + end + end + if @Priv[:help, :prev] != '' + style = w.item_style_set(@Priv[:help, :prev], 0) + style.sub!(/\.f$/, '') + w.item_style_map(@Priv[:help, :prev], 0, style, ['e5', 'e3']) + @Priv[:help, :prev] = '' + end +end -- cgit v1.2.3