1#!/usr/bin/env ruby
2
3require 'tk'
4require 'tkextlib/blt'
5
6require 'date'
7
8dir = File.join(File.dirname(File.expand_path(__FILE__)), 'images')
9file = File.join(dir, 'chalk.gif')
10active = File.join(dir, 'rain.gif')
11
12texture1 = TkPhotoImage.new(:file=>file)
13texture2 = TkPhotoImage.new(:file=>active)
14
15TkOption.add('*Tile', texture1)
16
17TkOption.add('*HighlightThickness', 0)
18TkOption.add('*calendar.weekframe*Tile', texture2)
19TkOption.add('*Calendar.Label.borderWidth', 0)
20TkOption.add('*Calendar.Label.relief', :sunken)
21TkOption.add('*Calendar.Frame.borderWidth', 2)
22TkOption.add('*Calendar.Frame.relief', :raised)
23TkOption.add('*Calendar.Label.font', 'Helvetica 11')
24TkOption.add('*Calendar.Label.foreground', 'navyblue')
25TkOption.add('*button.foreground', 'navyblue')
26TkOption.add('*background', 'grey85')
27TkOption.add('*Label.ipadX', 200)
28
29TkOption.add('*tile', texture2)
30
31class BLT_Calendar_sample
32  @@monthInfo = [
33    nil,  # dummy
34    ['January', 31],
35    ['February', 28],
36    ['March', 31],
37    ['April', 30],
38    ['May', 31],
39    ['June', 30],
40    ['July', 31],
41    ['August', 31],
42    ['Septembar', 30],
43    ['October', 31],
44    ['November', 30],
45    ['December', 31]
46  ]
47
48  @@abbrDays = [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ]
49
50  def initialize()
51    today = Date.today
52
53    if TkComm.bool(Tk.info(:commands, '.calendar'))
54      Tk.destroy('.calendar')
55    end
56    cal = Tk::BLT::Tile::Frame.new(:widgetname=>'.calendar',
57                                   :classname=>'Calendar',
58                                   :width=>'3i', :height=>'3i')
59
60    mon = Tk::BLT::Tile::Label.new(cal, :font=>'Courier 14 bold',
61                                   :text=>"#{@@monthInfo[today.month][0]} " +
62                                          "#{today.year}")
63    Tk::BLT::Table.add(cal, mon, [1, 0], :cspan=>7, :pady=>10)
64
65    week_f = Tk::BLT::Tile::Frame.new(cal, :widgetname=>'weekframe',
66                                      :relief=>:sunken, :borderwidth=>1)
67    Tk::BLT::Table.add(cal, week_f, [2, 0], :columnspan=>7, :fill=>:both)
68
69    @@abbrDays.each_with_index{|dayName, idx|
70      Tk::BLT::Table.add(cal,
71                         Tk::BLT::Tile::Label.new(cal, :text=>dayName,
72                                                  :font=>'Helvetica 12'),
73                         [2, idx], :pady=>2, :padx=>2)
74    }
75
76    Tk::BLT::Table.itemconfigure(cal, 'c*', 'r2', :pad=>4)
77
78    numDays = @@monthInfo[today.month][1]
79    week = 0
80    cnt = 1
81
82    wkday = today.wday - ((today.day - 1) % 7)
83    wkday += 7 if wkday < 0
84
85    while cnt <= numDays
86      Tk::BLT::Table.add(cal,
87                         Tk::BLT::Tile::Label.new(cal, :text=>cnt){
88                           self.configure(:borderwidth=>1,
89                                          :relief=>:sunken) if cnt == today.day
90                         },
91                         [week+3, wkday], :fill=>:both, :ipadx=>10, :ipady=>4)
92      cnt += 1
93      wkday += 1
94      if wkday == 7
95        week += 1
96        wkday = 0
97      end
98    end
99
100    Tk::BLT::Tile::Frame.new(cal, :borderwidth=>1, :relief=>:sunken){|f|
101      Tk::BLT::Table.add(f,
102                         Tk::BLT::Tile::Button.new(f, :widgetname=>'button',
103                                                   :command=>proc{exit},
104                                                   :borderwidth=>2,
105                                                   :text=>'Quit'),
106                         :padx=>4, :pady=>4)
107      Tk::BLT::Table.add(cal, f, [week+4, 5], :cspan=>2, :pady=>4)
108    }
109
110    Tk::BLT::Table.add(Tk.root, cal, :fill=>:both)
111    Tk::BLT::Table.itemconfigure(cal, 'r0', :resize=>:none)
112  end
113end
114
115BLT_Calendar_sample.new
116
117Tk.mainloop
118