1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/ext/tk/sample/tkextlib/treectrl/mailwasher.rb
ocean 138b4c427c * lib/treectrl/tktreectrl.rb: performance tuning. (call tk_send_without_enc
if possible)

* sample/tkextlib/treectrl/*.rb: some speed up... cache the result of
  version checking.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8265 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-04-07 14:55:55 +00:00

269 lines
11 KiB
Ruby

#
# Demo: MailWasher
#
def demoMailWasher(t)
init_pics('*checked')
height = t.font.metrics(:linespace) + 2
height = 18 if height < 18
t.configure(:showroot=>false, :showrootbutton=>false, :showbuttons=>false,
:showlines=>false, :itemheight=>height, :selectmode=>:browse,
:xscrollincrement=>1)
pad = 4
if $Version_1_1_OrLater
t.column_create(:text=>'Delete', :textpadx=>pad, :tag=>'delete')
t.column_create(:text=>'Bounce', :textpadx=>pad, :tag=>'bounce')
t.column_create(:text=>'Status', :width=>80, :textpadx=>pad,
:tag=>'status')
t.column_create(:text=>'Size', :width=>40, :textpadx=>pad,
:justify=>:right, :tag=>'size')
t.column_create(:text=>'From', :width=>140, :textpadx=>pad, :tag=>'from')
t.column_create(:text=>'Subject', :width=>240, :textpadx=>pad,
:tag=>'subject')
t.column_create(:text=>'Received', :textpadx=>pad, :arrow=>:up,
:arrowpad=>[4,0], :tag=>'received')
t.column_create(:text=>'Attachments', :textpadx=>pad, :tag=>'attachments')
t.state_define('CHECK')
t.element_create('imgCheck', :image, :image=>[
@images['checked'], ['CHECK'], @images['unchecked'], []
])
else # TreeCtrl 1.0
t.column_configure(0, :text=>'Delete', :textpadx=>pad, :tag=>'delete')
t.column_configure(1, :text=>'Bounce', :textpadx=>pad, :tag=>'bounce')
t.column_configure(2, :text=>'Status', :width=>80, :textpadx=>pad,
:tag=>'status')
t.column_configure(3, :text=>'Size', :width=>40, :textpadx=>pad,
:justify=>:right, :tag=>'size')
t.column_configure(4, :text=>'From', :width=>140, :textpadx=>pad,
:tag=>'from')
t.column_configure(5, :text=>'Subject', :width=>240, :textpadx=>pad,
:tag=>'subject')
t.column_configure(6, :text=>'Received', :textpadx=>pad, :arrow=>:up,
:arrowpad=>[4,0], :tag=>'received')
t.column_configure(7, :text=>'Attachments', :textpadx=>pad,
:tag=>'attachments')
t.element_create('imgOff', :image, :image=>@images['unchecked'])
t.element_create('imgOn', :image, :image=>@images['checked'])
end
t.element_create('border', :rect, :open=>:nw, :outline=>'gray',
:outlinewidth=>1, :fill=>[@SystemHighlight, ['selected']])
t.element_create('txtAny', :text, :lines=>1,
:fill=>[@SystemHighlightText, ['selected']])
t.element_create('txtNone', :text, :text=>'none', :lines=>1,
:fill=>[@SystemHighlightText, ['selected']])
t.element_create('txtYes', :text, :text=>'yes', :lines=>1,
:fill=>[@SystemHighlightText, ['selected']])
t.element_create('txtNormal', :text, :text=>'Normal', :lines=>1,
:fill=>[@SystemHighlightText, ['selected'], '#006800', []])
t.element_create('txtPossSpam', :text, :text=>'Possible Spam', :lines=>1,
:fill=>[@SystemHighlightText, ['selected'], '#787800', []])
t.element_create('txtProbSpam', :text, :text=>'Probably Spam', :lines=>1,
:fill=>[@SystemHighlightText, ['selected'], '#FF9000', []])
t.element_create('txtBlacklist', :text, :text=>'Blacklisted', :lines=>1,
:fill=>[@SystemHighlightText, ['selected'], '#FF5800', []])
if $Version_1_1_OrLater
s = t.style_create('styCheck')
t.style_elements(s, ['border', 'imgCheck'])
t.style_layout(s, 'border', :detach=>true, :iexpand=>:es)
t.style_layout(s, 'imgCheck', :expand=>:news)
else
['Off', 'On'].each{|name|
s = t.style_create('sty' << name)
i = 'img' << name
t.style_elements(s, ['border', i])
t.style_layout(s, 'border', :detach=>true, :iexpand=>:es)
t.style_layout(s, i, :expand=>:news)
}
end
pad = 4
%w(Any None Yes Normal PossSpam ProbSpam Blacklist).each{|name|
s = t.style_create('sty' << name)
e = 'txt' << name
t.style_elements(s, ['border', e])
t.style_layout(s, 'border', :detach=>true, :iexpand=>:es)
t.style_layout(s, e, :padx=>pad, :squeeze=>:x, :expand=>:ns)
}
[
['baldy@spammer.com', "Your hair is thinning"],
['flat@spammer.com', "Your breasts are too small"],
['tiny@spammer.com', "Your penis is too small"],
['dumbass@spammer.com', "You are not very smart"],
['bankrobber@spammer.com', "You need more money"],
['loser@spammer.com', "You need better friends"],
['gossip@spammer.com', "Find out what your coworkers think about you"],
['whoami@spammer.com', "Find out what you think about yourself"],
['downsized@spammer.com', "You need a better job"],
['poorhouse@spammer.com', "Your mortgage is a joke"],
['spam4ever@spammer.com' "You need more spam"]
].each{|frm, subj|
item = t.item_create
status = ['styNormal','styPossSpam','styProbSpam','styBlacklist'][rand(4)]
attachments = ['styNone','styYes'][rand(2)]
if $Version_1_1_OrLater
delete = [false, true][rand(2)]
bounce = [false, true][rand(2)]
t.item_style_set(item,
0, 'styCheck', 1, 'styCheck', 2, status, 3, 'styAny',
4, 'styAny', 5, 'styAny', 6, 'styAny', 7, attachments)
t.item_state_forcolumn(item, 'delete', 'CHECK') if delete
t.item_state_forcolumn(item, 'bounce', 'CHECK') if bounce
else # TreeCtrl 1.0
delete = ['styOn', 'styOff'][rand(2)]
bounce = ['styOn', 'styOff'][rand(2)]
t.item_style_set(item,
0, delete, 1, bounce, 2, status, 3, 'styAny',
4, 'styAny', 5, 'styAny', 6, 'styAny', 7, attachments)
end
bytes = 512 + rand(1024 * 12)
size = "#{bytes / 1024 + 1}KB"
seconds = Tk::Clock.seconds - rand(100000)
received = Tk::Clock.format(seconds, '%d/%m/%y %I:%M %p')
t.item_text(item, 3, size, 4, frm, 5, subj, 6, received)
t.item_lastchild(:root, item)
}
sortColumn = 6
t.notify_bind(t, 'Header-invoke',
proc{|c, w|
if c == sortColumn
if w.column_cget(sortColumn, :arrow) == 'down'
order = :increasing
arrow = :up
else
order = :decreasing
arrow = :down
end
else
if w.column_cget(sortColumn, :arrow) == 'down'
order = :decreasing
arrow = :down
else
order = :increasing
arrow = :up
end
w.column_configure(sortColumn, :arrow=>:none)
sortColumn = c
end
w.column_configure(c, :arrow=>arrow)
case w.column_cget(c, :tag)
when 'bounce', 'delete'
w.item_sort(:root, order,
{
:column=>c,
:command=>proc{|item1, item2|
compareOnOff(w, c, item1, item2)
}
},
{ :column=>'subject', :dictionary=>true })
when 'status'
w.item_sort(:root, order,
{ :column=>c, :dictionary=>true })
when 'from'
w.item_sort(:root, order,
{ :column=>c, :dictionary=>true },
{ :column=>'subject', :dictionary=>true })
when 'subject'
w.item_sort(:root, order,
{ :column=>c, :dictionary=>true })
when 'size'
w.item_sort(:root, order,
{ :column=>c, :dictionary=>true },
{ :column=>'subject', :dictionary=>true })
when 'received'
w.item_sort(:root, order,
{ :column=>c, :dictionary=>true },
{ :column=>'subject', :dictionary=>true })
when 'attachments'
w.item_sort(:root, order,
{ :column=>c, :dictionary=>true },
{ :column=>'subject', :dictionary=>true })
end
}, '%C %T')
mailWasher = TkBindTag.new
if $Version_1_1_OrLater
mailWasher.bind('ButtonPress-1',
proc{|w, x, y|
id = w.identify(x, y)
if id.empty?
elsif id[0] == 'header'
else
what, item, where, arg1, arg2, arg3 = id
if where == 'column'
tag = w.column_cget(arg1, :tag)
if tag == 'delete' || tag == 'bounce'
w.item_state_forcolumn(item, arg1, '~CHECK')
end
end
end
}, '%W %x %y')
else # TreeCtrl 1.0
mailWasher.bind('ButtonPress-1',
proc{|w, x, y|
id = w.identify(x, y)
if id.empty?
elsif id[0] == 'header'
else
what, item, where, arg1, arg2, arg3 = id
if where == 'column'
tag = w.column_cget(arg1, :tag)
if tag == 'delete' || tag == 'bounce'
style = w.item_style_set(item, arg1)
if style == 'styOn'
style = 'styOff'
else
style = 'styOn'
end
w.item_style_set(item, arg1, style)
@display_styles_in_item.call(item)
end
end
end
}, '%W %x %y')
end
t.bindtags = [t, mailWasher, Tk::TreeCtrl, t.winfo_toplevel, TkBindTag::ALL]
end
if $Version_1_1_OrLater
def compareOnOff(w, c, item1, item2)
s1 = w.item_state_forcolumn(item1, c)
s2 = w.item_state_forcolumn(item2, c)
if (s1 == s2)
0
elsif (s1 == 'CHECK')
-1
else
1
end
end
else # TreeCtrl 1.0
def compareOnOff(w, c, item1, item2)
s1 = w.item_style_set(item1, c)
s2 = w.item_style_set(item2, c)
if (s1 == s2)
0
elsif (s1 == 'styOff')
-1
else
1
end
end
end