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