From: David Naseby Date: 2002-08-14T08:55:54+09:00 Subject: FXCalendar class The following is some FXRuby stuff I've found useful.. if the Ruby Cookbook was still around, I'd put it on that, but here it is anyway. <---CODE START---> require 'fox' module Fox class FXCalendar < FXDialogBox attr_reader :selected def initialize(owner, initial_date = Time.now) super(owner, "Calendar") top = FXVerticalFrame.new(self, LAYOUT_FILL_X|LAYOUT_FILL_Y) @headerBGColor = FXRGB(0,0,0) @matrixBGColor = FXRGB(100,100,220) @headerFGColor = FXRGB(255,255,255) @date_showing = initial_date #header row header = FXHorizontalFrame.new(top, LAYOUT_FILL_X) header.setBackColor(@headerBGColor) @backBtn = FXButton.new(header, " << ") @backBtn.connect(SEL_COMMAND) do |send, sel, ev| @date_showing = _last_month _build_date_matrix @current_month.text = _header_date end @current_month = FXLabel.new(header, _header_date, nil, LAYOUT_FILL_X|JUSTIFY_CENTER_X|LAYOUT_FILL_Y) @current_month.setBackColor(@headerBGColor) @current_month.setTextColor(@headerFGColor) @foreBtn = FXButton.new(header, " >> ") @foreBtn.connect(SEL_COMMAND) do |send, sel, ev| @date_showing = _next_month _build_date_matrix @current_month.text = _header_date end @matrix = FXMatrix.new(top, 7, MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED, 0,0,0,0,0,0,0,0) ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'].each {|day| _add_matrix_label(day)} (7*6 - 1).times do s = FXSwitcher.new(@matrix,LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0,0,0,0,0) FXFrame.new(s, LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,0,0,0,0) FXButton.new(s, '99', nil, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_RAISED|FRAME_THICK,0,0,0,0,0,0,0,0).connec t(SEL_COMMAND) do |send, sel, ev| @selected = Time.local(@date_showing.year, @date_showing.month, send.text.to_i) self.handle(self, MKUINT(ID_ACCEPT, SEL_COMMAND), nil) end end _build_date_matrix() end private def _header_date() @date_showing.strftime("%B, %Y") end def _first_day Time.local(@date_showing.year, @date_showing.month, 1) end def _last_day year = @date_showing.year month = @date_showing.month+1 if month > 12 year += 1 month = 1 end Time.local(year, month, 1) - (60*60*24) end def _last_month year = @date_showing.year month = @date_showing.month - 1 if month < 1 year -= 1 month = 12 end Time.local(year, month) end def _next_month year = @date_showing.year month = @date_showing.month + 1 if month > 12 year +=1 month = 1 end Time.local(year, month) end def _build_date_matrix() (0...6*7-1).each { |index| @matrix.childAtRowCol(index/7+1, index.modulo(7)).setCurrent(0) } (_first_day.wday... _last_day.day+_first_day.wday).each do |index| day = index - _first_day.wday + 1 switcher = @matrix.childAtRowCol(index/7 + 1, index.modulo(7)) switcher.setCurrent(1) switcher.childAtIndex(1).text = day.to_s end end def _add_matrix_label(label) l = FXLabel.new(@matrix, label, nil, LAYOUT_FILL_X|JUSTIFY_CENTER_X|FRAME_SUNKEN) l.setBackColor(@headerBGColor) l.setTextColor(@headerFGColor) l.setFont(FXFont.new(getApp, "helvetica", 7)) end end end if __FILE__ == $0 include Fox class TestMW < FXMainWindow def initialize(app, dialog_to_test, *args) super(app, 'test', nil, nil, DECOR_ALL, 0, 0, 500, 500) @d = dialog_to_test.new(self, *args) end def create super show(PLACEMENT_CURSOR) if @d.execute(PLACEMENT_OWNER) != 0 p @d.selected.to_s end end end application = FXApp.new('eOne test', 'eONE') mw = TestMW.new(application, FXCalendar, Time.now) application.init(ARGV) application.create application.run end <---CODE END---> David