class_add_ivar (GtkCalendar, #opflags, 0b0); method GtkCalendar.change_option (flag) { self.opflags = self.opflags ^ flag; self.display_options(self.opflags); } method GtkCalendar.safe_select_day(day) { local max_date, ck_date = self.get_date(); m = cadr(ck_date); y = car(ck_date); if (find_equal(m, list(0, 2, 4, 6, 7, 9, 11))) max_date = 31; else if (find_equal(m, list(3, 5, 8, 10))) // Thirty days hath September... max_date = 30; else if ((y % 4) == 0) max_date = 29; else max_date = 28; if (day > max_date) day = max_date; self.select_day(day); } function op_button(label, flag, box, active) { local but = gtk_check_button_new_with_label(label); but.signal ("toggled", `(@cal).change_option(@flag)); but.set_active(active); box.pack_start (but, TRUE, TRUE, 0); } function cal_changed(cal, spinner, dmy) { local new_date = car(nth_cdr(cal.get_date(), dmy)); if (dmy == 1) new_date = new_date +1; spinner.set_value(new_date); } function make_adj (low, up, step, pg_inc, pg_size) { local adj = new(GtkAdjustment); adj.lower = low; adj.upper = up; adj.step_increment = step; adj.page_increment = pg_inc; adj.page_size = pg_size; adj; } function create_calendar () { local box1, box2; win_calendar = new (GtkWindow); win_calendar.signal ("destroy", #win_calendar = nil); win_calendar.title = "GtkCalendar"; box1 = new (GtkVBox); win_calendar.add (box1); box2 = new (GtkVBox); box2.border_width = 15; cal = gtk_calendar_new(); cal.width = 250; cal.height = 130; cal.mark_day(5); cal.select_day(21); cal.select_month(5, 2003); cal.display_options(cal.opflags); box2.pack_start (cal, TRUE, TRUE, 0); op_button("Show heading", GTK_CALENDAR_SHOW_HEADING, box2, TRUE); op_button("Show day names", GTK_CALENDAR_SHOW_DAY_NAMES, box2, TRUE); op_button("No month or year change in heading", GTK_CALENDAR_NO_MONTH_CHANGE, box2, FALSE); op_button("Show week numbers in left column", GTK_CALENDAR_SHOW_WEEK_NUMBERS, box2, FALSE); op_button("Week starts on Monday", GTK_CALENDAR_WEEK_START_MONDAY, box2, FALSE); table = new(GtkTable); table.n_columns = 3; table.n_rows = 3; table.set_row_spacings(5); table.set_col_spacings(5); table.set_homogeneous(FALSE); box2.pack_start(table, FALSE, FALSE, 0); label = new(GtkLabel); label.set_text("Select a day:"); table.attach_defaults(label, 0, 1, 0, 1); adj = make_adj(1, 31, 1, 5, 0); spin1 = new(GtkSpinButton); spin1.configure(adj, 0, 0); spin1.set_value(21); spin1.set_wrap(TRUE); spin1.set_shadow_type(GTK_SHADOW_OUT); table.attach_defaults(spin1, 1, 2, 0, 1); but1 = new (GtkButton); but1.label = "Apply"; table.attach_defaults(but1, 2, 3, 0, 1); label = new(GtkLabel); label.set_text("Select a month:"); table.attach_defaults(label, 0, 1, 1, 2); adj = make_adj(1, 12, 1, 5, 0); spin2 = new(GtkSpinButton); spin2.configure(adj, 0, 0); spin2.set_value(6); spin2.set_wrap(TRUE); spin2.set_shadow_type(GTK_SHADOW_OUT); table.attach_defaults(spin2, 1, 2, 1, 2); but2 = new (GtkButton); but2.label = "Apply"; table.attach_defaults(but2, 2, 3, 1, 2); label = new(GtkLabel); label.set_text("Select a year:"); table.attach_defaults(label, 0, 1, 2, 3); adj = make_adj(1900, 2100, 1, 5, 0); spin3 = new(GtkSpinButton); spin3.configure(adj, 0, 0); spin3.set_value(2003); spin3.set_wrap(TRUE); spin3.set_shadow_type(GTK_SHADOW_OUT); table.attach_defaults(spin3, 1, 2, 2, 3); but3 = new (GtkButton); but3.label = "Apply"; table.attach_defaults(but3, 2, 3, 2, 3); label = new(GtkLabel); label.set_text("Mark this day:"); table.attach_defaults(label, 0, 1, 3, 4); adj = make_adj(1, 31, 1, 5, 0); spin4 = new(GtkSpinButton); spin4.configure(adj, 0, 0); spin4.set_value(5); spin4.set_wrap(TRUE); spin4.set_shadow_type(GTK_SHADOW_OUT); table.attach_defaults(spin4, 1, 2, 3, 4); but4 = new (GtkButton); but4.label = "Apply"; table.attach_defaults(but4, 2, 3, 3, 4); label = new(GtkLabel); label.set_text("Unmark this day:"); table.attach_defaults(label, 0, 1, 4, 5); adj = make_adj(1, 31, 1, 5, 0); spin5 = new(GtkSpinButton); spin5.configure(adj, 0, 0); spin5.set_value(5); spin5.set_wrap(TRUE); spin5.set_shadow_type(GTK_SHADOW_OUT); table.attach_defaults(spin5, 1, 2, 4, 5); but5 = new (GtkButton); but5.label = "Apply"; table.attach_defaults(but5, 2, 3, 4, 5); but6 = new (GtkButton); but6.label = "Clear all marks"; table.attach_defaults(but6, 0, 1, 5, 6); but1.signal("clicked", `(@cal).safe_select_day((@spin1).get_value_as_int())); but2.signal("clicked", `(@cal).select_month((@spin2).get_value_as_int() -1, (@spin3).get_value_as_int())); but3.signal("clicked", `(@cal).select_month((@spin2).get_value_as_int() -1, (@spin3).get_value_as_int())); but4.signal("clicked", `(@cal).mark_day((@spin4).get_value_as_int())); but5.signal("clicked", `(@cal).unmark_day((@spin5).get_value_as_int())); but6.signal("clicked", `(@cal).clear_marks()); cal.signal("day_selected", `cal_changed(@cal, @spin1, 2)); cal.signal("month_changed", `cal_changed(@cal, @spin2, 1)); cal.signal("prev_year", `cal_changed(@cal, @spin3, 0)); cal.signal("next_year", `cal_changed(@cal, @spin3, 0)); box1.pack_start (box2, TRUE, TRUE, 0); separator = new (GtkHSeparator); box1.pack_start (separator, FALSE, TRUE, 0); box2 = new (GtkVBox); box2.border_width = 15; button = new(GtkButton); button.label = "Close"; button.signal("clicked", `(@win_calendar).destroy()); box2.pack_start(button, TRUE, TRUE, 5); box1.pack_start (box2, TRUE, TRUE, 0); win_calendar.show_all(); win_calendar; } function main () { local window, win_calendar; TRUE=1; FALSE=0; window = create_calendar (); window.signal ("destroy", #exit_program(0)); init_ipc("calendar", "calendarq"); gtk_main (); }
Copyright © 1995-2010 by Cogent Real-Time Systems, Inc. All rights reserved.