Changed the Properties menu item to Preferences. These are global

1998-08-24  Federico Mena Quintero  <federico@nuclecu.unam.mx>

	* main.c: Changed the Properties menu item to Preferences.  These
	are global application preferences, not a single calendar's
	properties.

	* prop.c (prop_apply): Save the week_starts_on_monday flag to the
	configuration file.
	(properties): Added a check button for weeks starting on Monday.
	(properties): Beautified the Preferences dialog.

	* month-view.c (month_view_init):
	* goto.c (create_days): Set the month item to start weeks on
	Monday if appropriate.

	* main.c (init_calendar): A boolean is not an hour, so don't
	range_check_hour() on it.
	(init_calendar): Added a global week_starts_on_monday flag.

	* main.h: Added global week_starts_on_monday flag.

svn path=/trunk/; revision=336
This commit is contained in:
Federico Mena Quintero
1998-08-24 19:59:25 +00:00
committed by Arturo Espinosa
parent abdba7c651
commit 4d075f28b5
29 changed files with 517 additions and 2089 deletions

View File

@ -1,3 +1,24 @@
1998-08-24 Federico Mena Quintero <federico@nuclecu.unam.mx>
* main.c: Changed the Properties menu item to Preferences. These
are global application preferences, not a single calendar's
properties.
* prop.c (prop_apply): Save the week_starts_on_monday flag to the
configuration file.
(properties): Added a check button for weeks starting on Monday.
(properties): Beautified the Preferences dialog.
* month-view.c (month_view_init):
* goto.c (create_days): Set the month item to start weeks on
Monday if appropriate.
* main.c (init_calendar): A boolean is not an hour, so don't
range_check_hour() on it.
(init_calendar): Added a global week_starts_on_monday flag.
* main.h: Added global week_starts_on_monday flag.
1998-08-21 Miguel de Icaza <miguel@nuclecu.unam.mx>
* calobj.c (ical_object_create_from_vobject): If mail alarm or

View File

@ -48,10 +48,8 @@ gnomecal_SOURCES = \
timeutil.c \
timeutil.h \
view-utils.h \
view-utils.c \
views.h \
views.c
view-utils.c
LINK_FLAGS = \
$(GNOME_LIBDIR) \
$(GNOMEUI_LIBS) \
@ -59,7 +57,6 @@ LINK_FLAGS = \
#gncal_LDADD = $(LINK_FLAGS)
#objedit_LDADD = $(LINK_FLAGS)
gnomecal_LDADD = $(LINK_FLAGS)

View File

@ -1,253 +0,0 @@
/*
* calc.c Calculations to work out what day it is etc for the Calendar
*
* Most of this stuff was taken from the gcal source by Thomas Esken.
* <esken@uni-muenster.de>
* gcal is a text-based calendar program
*/
#include <time.h>
#include <glib.h>
#include <ctype.h>
#include "calcs.h"
#include <config.h>
#ifndef HAVE_STRCASECMP
int strcasecmp(const char * /*s1*/, const char * /*s2*/);
#endif
/* Number of days in a month */
static const int dvec[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/* Number of past days of a month */
static const int mvec[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
Greg_struct greg_reform_date[6] = {
/* {int year, int month, int f_day, int l_day} */
{ 1582, 10, 5, 14 },
{ 1700, 2, 19, 28 },
{ 1752, 9, 3, 13 },
{ 1753, 2, 18, 28 },
/* must be left with all zeroes */
{ 0,0,0,0 }
};
Greg_struct *greg=greg_reform_date;
/*
* Computes the number of days in February and returns them,
*/
int days_of_february(const int year)
{
return((year&3) ? 28 : (!(year%100)&&(year%400)) ? 28 : 29);
}
int is_leap_year(const int year)
{
return (days_of_february(year) == 29);
}
/*
* Check wether a given date is calid.
*/
int valid_date(const int day, const int month, const int year)
{
if ( day < 1
|| month < MONTH_MIN
|| month > MONTH_MAX
|| ( (month != 2)
&& (day > dvec[month-1]))
|| ( (month == 2)
&& (day > days_of_february (year))))
return(FALSE);
return(TRUE);
}
/*
* Set a date back one day (to yesterday's date)
*/
void prev_date(int *day, int *month, int *year)
{
(*day)--;
if ( !*day || !valid_date(*day, *month, *year)) {
(*month)--;
if (*month < MONTH_MIN) {
*month = MONTH_MAX;
(*year)--;
}
if (*month ==2)
*day = days_of_february(*year);
else
*day = dvec[*month-1];
}
} /* prev_date */
/*
* Set a date forward one day (to tomorrow's date)
*/
void next_date(int *day, int *month, int *year)
{
(*day)++;
if (!valid_date(*day, *month, *year)) {
*day = DAY_MIN;
if (*month == MONTH_MAX) {
*month = MONTH_MIN;
(*year)++;
} else
(*month)++;
}
} /* next_date */
/*
* Get date from the system
*/
void get_system_date(int *day, int *month, int *year)
{
auto struct tm *sys_date;
auto time_t sys_time;
sys_time = time((time_t *)NULL);
sys_date = localtime(&sys_time);
*day = sys_date->tm_mday;
*month = sys_date->tm_mon + 1;
*year = sys_date->tm_year;
if (*year < CENTURY)
*year += CENTURY;
} /* get_system_date */
/*
* Given a string with the name of a month, return 1..12 or 0 if not found
*/
int month_atoi(const char *string)
{
int i;
for (i = MONTH_MIN; i <= MONTH_MAX; i++)
if (strcasecmp(string, (char *)get_month_name(i)) == 0)
return i;
return 0;
}
int day_atoi(const char *string)
{
int i;
for (i = DAY_MIN; i <= DAY_MAX; i++)
if (strcasecmp(string, (char *)get_day_name(i)) == 0)
return i;
return 0;
}
/*
* Returns ordinal suffix (st, nd, rd, th) for a day
*/
const char *day_suffix(int day)
{
static const char *suffix[]={"th", "st", "nd", "rd"};
register int i;
i = 0;
if (day > 100)
day %= 100;
if (day < 11 || day > 13)
i = day % 10;
if (i > 3)
i = 0;
return(suffix[i]);
} /* day_suffix */
/*
* Returns the short name of the day of week, format "%-3s"
*/
const char *short3_day_name(const int day)
{
static const char *name[]={"invalid day", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
return(((day<DAY_MIN)||(day>DAY_MAX)) ? name[0] : name[day]);
} /* short3_day_name */
/*
* Returns the short name of day of week
*/
const char *short_day_name(const int day)
{
static const char *name[]={"invalid day", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"};
return(((day<DAY_MIN)||(day>DAY_MAX)) ? name[0] : name[day]);
} /* short_day_name */
/*
* Returns the complete name of the day
*/
const char *get_day_name(const int day)
{
static const char *name[]={"invalid day", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
return(((day<DAY_MIN)||(day>DAY_MAX)) ? name[0] : name[day]);
} /* day_name */
/*
* Returns the short name of the month
*/
const char *short_month_name(const int month)
{
static const char *name[]={ "invalid month", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
return(((month<MONTH_MIN)||(month>MONTH_MAX)) ? name[0] : name[month]);
} /* short_month_name() */
/*
* Returns the name of the month
*/
const char *get_month_name(const int month)
{
static const char *name[]={ "invalid month", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
return(((month<MONTH_MIN)||(month>MONTH_MAX)) ? name[0] : name[month]);
} /* month_name() */
/*
* Compute the absolute number of days of the given date since 1 Jan 0001
* respecting the missing period of the Gregorian Reformation
* I am glad someone else worked this one out!! - cs
*/
unsigned long int date2num(const int day, const int month, const int year)
{
auto unsigned long int julian_days;
julian_days = (unsigned long int)((year-1)*(unsigned long int)(DAY_LAST)+((year-1)>>2));
if (year > greg->year
|| ( (year == greg->year)
&& ( month > greg->month
|| ( (month == greg->month)
&& (day > greg->last_day)))))
julian_days -= (unsigned long int)(greg->last_day - greg->first_day + 1);
if (year > greg->year) {
julian_days += (((year-1) / 400) - (greg->year / 400));
julian_days -= (((year-1) / 100) - (greg->year / 100));
if (!(greg->year % 100) && (greg->year % 400))
julian_days--;
}
julian_days += (unsigned long int)mvec[month-1];
julian_days += day;
if ( (days_of_february(year) == 29) && (month > 2))
julian_days++;
return(julian_days);
} /* date2num */
/*
* Computes the weekday of a Gregorian/Julian calendar date
* (month must be 1..12) returns 1..7 (mo..su)
*/
int weekday_of_date(const int day, const int month, const int year)
{
auto unsigned long int julian_days=date2num(day, month,year)%DAY_MAX;
return((julian_days>2) ? (int)julian_days-2 : (int)julian_days+5);
} /* weekday_of_date() */

View File

@ -1,53 +0,0 @@
/*
* function prototypes
*/
int days_of_february(const int year);
int is_leap_year(const int year);
int valid_date(const int day, const int month, const int year);
void get_system_date(int *day, int *month, int *year);
void prev_date(int *day, int *month, int *year);
void next_date(int *day, int *month, int *year);
int month_atoi(const char *string);
int day_atoi(const char *string);
const char *day_suffix(int day);
const char *short3_day_name(int day);
const char *short_day_name(int day);
const char *get_day_name(int day);
const char *short_month_name(int month);
const char *get_month_name(int month);
unsigned long int date2num(const int day, const int month, const int year);
int weekday_of_date(const int day, const int month, const int year);
/*
* Important preprocessor symbols for the internal ranges.
*/
#define DAY_LAST 365 /* Last day in a NON leap year */
#define DAY_MIN 1 /* Minimum day of week/month/year */
#define DAY_MAX 7 /* Maximum day/amount of days of week */
#define WEEK_MAX 52 /* Maximum week number of year */
#define MONTH_LAST 31 /* Highest day number in a month */
#define MONTH_MIN 1 /* Minimum month of year */
#define MONTH_MAX 12 /* Maximum month of year */
#define YEAR_MIN 1 /* Minimum year able to compute */
#define YEAR_MAX 9999 /* Maximum year able to compute */
#define EASTER_MIN 30 /* Minimum year for computing Easter Sunday (29+1) */
#define EASTER_MAX YEAR_MAX /* Maximum year for computing Easter Sunday */
#define MONTH_COLS 6 /* Maximum number of columns of a month */
#define VEC_BLOCK 42 /* Maximum number of elements per month (7*6) */
#define VEC_ELEMS 504 /* Maximum number of elements per year (42*12) */
#define CENTURY 1900 /* Operating system standard starting century, DON'T change ! */
/*
* The Gregorian Reformation date record.
*/
typedef
struct greg_type
{
int year; /* Year of Gregorian Reformation */
int month; /* Month of Gregorian Reformation */
int first_day; /* First missing day of Reformation period */
int last_day; /* Last missing day of Reformation period */
}
Greg_struct;

View File

@ -1,97 +0,0 @@
/*
* clist.c: All the good stuf to work with the clists that are used for the
* tasklist.
*
* This file is largely based upon GTT code by Eckehard Berns.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <config.h>
#include <gnome.h>
static void
select_row(GtkCList *clist, gint row, gint col, GdkEventButton *event)
{
if (!event) return;
g_print("select_row, row=%d col=%d button=%d\n", row, col, event->button);
}
static void
unselect_row(GtkCList *clist, gint row, gint col, GdkEventButton *event)
{
if (!event) return;
g_print("unselect_row, row=%d col=%d button=%d\n", row, col, event->button);
}
static void
click_column(GtkCList *clist, gint col)
{
g_print("click_column, col=%d\n ", col);
}
GtkWidget * create_clist(void)
{
GtkStyle *style;
GdkGCValues vals;
GtkWidget *clist;
char *titles[2] = {
N_("Time"),
N_("Event")
};
titles[0] = _(titles[0]);
titles[1] = _(titles[1]);
clist = gtk_clist_new_with_titles(2,titles);
gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_SINGLE);
gtk_clist_set_column_justification(GTK_CLIST(clist), 0, GTK_JUSTIFY_CENTER);
style = gtk_widget_get_style(clist);
g_return_val_if_fail(style != NULL, NULL);
gdk_gc_get_values(style->fg_gc[0], &vals);
gtk_clist_set_column_width(GTK_CLIST(clist), 0, gdk_string_width(vals.font, "00:00"));
gtk_clist_set_policy(GTK_CLIST(clist),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_signal_connect(GTK_OBJECT(clist), "select_row",
GTK_SIGNAL_FUNC(select_row), NULL);
gtk_signal_connect(GTK_OBJECT(clist), "click_column",
GTK_SIGNAL_FUNC(click_column), NULL);
gtk_signal_connect(GTK_OBJECT(clist), "unselect_row",
GTK_SIGNAL_FUNC(unselect_row), NULL);
return clist;
}
void
setup_clist(GtkWidget *clist)
{
char buf1[10];
char buf2[1000] = "Programming GNOME";
char *tmp[2] = { buf1, buf2 };
int i, row;
gtk_clist_freeze(GTK_CLIST(clist));
gtk_clist_clear(GTK_CLIST(clist));
for (i=0; i < 24; i++) {
sprintf(buf1, "%d:00", i);
row = gtk_clist_append(GTK_CLIST(clist), tmp);
}
gtk_clist_thaw(GTK_CLIST(clist));
}

View File

@ -1,2 +0,0 @@
GtkWidget *create_clist(void);
void setup_clist(GtkWidget *clist);

View File

@ -1,700 +0,0 @@
/*
* gnlp.c: LPQ/LPR stuff
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <gnome.h>
#include <config.h>
#include "gncal.h"
#include "calcs.h"
#include "clist.h"
#include "gncal-week-view.h"
void
prueba (void)
{
GtkWidget *window;
GtkWidget *wview;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_policy (GTK_WINDOW (window), TRUE, TRUE, FALSE);
gtk_container_border_width (GTK_CONTAINER (window), 6);
wview = gncal_week_view_new (NULL, time (NULL));
gtk_container_add (GTK_CONTAINER (window), wview);
gtk_widget_show (wview);
gtk_widget_show (window);
}
/* Function declarations */
void parse_args(int argc, char *argv[]);
static int save_state (GnomeClient *client,
gint phase,
GnomeRestartStyle save_style,
gint shutdown,
GnomeInteractStyle interact_style,
gint fast,
gpointer client_data);
static void connect_client (GnomeClient *client,
gint was_restarted,
gpointer client_data);
void discard_session (gchar *id);
static GtkMenuEntry menu_items[] =
{
{ N_("File/Exit"), N_("<control>Q"), menu_file_quit, NULL},
{ N_("Help/About"), N_("<control>A"), menu_help_about, NULL},
};
#define DAY_ARRAY_MAX 35
/* The naughty global variables */
int curr_day, old_day;
int curr_month, old_month;
int curr_year, old_year;
GtkWidget *month_label;
GtkWidget *year_label;
GtkWidget *dailylist;
GtkWidget *calendar_days[DAY_ARRAY_MAX];
GtkWidget *calendar_buttons[DAY_ARRAY_MAX];
GtkWidget *app;
GtkWidget *calendar;
int restarted = 0;
/* Stuff we use for session state */
int os_x = 0,
os_y = 0,
os_w = 0,
os_h = 0;
/* True if parsing determined that all the work is already done. */
int just_exit = 0;
/* These are the arguments that our application supports. */
static struct argp_option arguments[] =
{
#define DISCARD_KEY -1
{ "discard-session", DISCARD_KEY, N_("ID"), 0, N_("Discard session"), 1 },
{ NULL, 0, NULL, 0, NULL, 0 }
};
/* Forward declaration of the function that gets called when one of
our arguments is recognized. */
static error_t parse_an_arg (int key, char *arg, struct argp_state *state);
/* This structure defines our parser. It can be used to specify some
options for how our parsing function should be called. */
static struct argp parser =
{
arguments, /* Options. */
parse_an_arg, /* The parser function. */
NULL, /* Some docs. */
NULL, /* Some more docs. */
NULL, /* Child arguments -- gnome_init fills
this in for us. */
NULL, /* Help filter. */
NULL /* Translation domain; for the app it
can always be NULL. */
};
#define ELEMENTS(x) (sizeof (x) / sizeof (x [0]))
GtkMenuFactory *
create_menu ()
{
GtkMenuFactory *subfactory;
int i;
subfactory = gtk_menu_factory_new (GTK_MENU_FACTORY_MENU_BAR);
gtk_menu_factory_add_entries (subfactory, menu_items, ELEMENTS(menu_items));
return subfactory;
}
/* place marker until i get get something better */
void print_error(char *text)
{
GtkWidget *msgbox;
char buf[512];
if (errno == 0)
sprintf(buf, "%s", text);
else
sprintf(buf, "%s (%s)", text, g_strerror(errno));
g_warning("%s\n", buf);
msgbox = gnome_message_box_new(buf, "error", "OK", NULL, NULL);
gtk_widget_show(msgbox);
}
void menu_file_quit(GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}
void menu_help_about(GtkWidget *widget, gpointer data)
{
GtkWidget *about;
gchar *authors[] = {
"Craig Small <csmall@small.dropbear.id.au>",
NULL };
about = gnome_about_new( _("Gnome Calendar"), VERSION,
"(C) 1998",
authors,
/* Comments */
_("This program shows a nice pretty "
"calendar and will do scheduling "
"real soon now!"),
NULL);
gtk_widget_show(about);
}
void dailylist_item_select(GtkWidget *widget, gpointer data)
{
int *x = (int*)data;
g_print("Selected %d\n", x);
}
void update_today_list(void)
{
GtkWidget *listitem;
GtkWidget *list_hbox;
GtkWidget *hour_label;
GtkWidget *event_label;
char buf[50];
int tmphr, tmpmin,i;
}
/*
* updates the calendar that appears in the left collumn
*/
void month_changed(GtkWidget *widget, gpointer data)
{
curr_month = GTK_CALENDAR(widget)->month;
curr_year = GTK_CALENDAR(widget)->year;
}
void update_calendar()
{
int tmpday;
int i;
char buf[50];
int month_changed;
static int offset;
gtk_calendar_unmark_day(GTK_CALENDAR(calendar),old_day);
gtk_calendar_mark_day(GTK_CALENDAR(calendar), curr_day);
printf("Date changed (nothing happens much\n");
/* gtk_calendar_select_day(GTK_CALENDAR(calendar), curr_day); */
#if 0
/* Only update the whole calendar if the year or month has changed */
tmpday=1;
month_changed = FALSE;
if (curr_month != old_month || curr_year != old_year) {
month_changed = TRUE;
offset = weekday_of_date(tmpday, curr_month, curr_year) - 1;
}
for(i=0; i < DAY_ARRAY_MAX; i++) {
tmpday = i - offset +1;
if (valid_date(tmpday, curr_month, curr_year)) {
sprintf(buf, "%2d", tmpday);
/*if (month_changed) {*/
gtk_label_set(GTK_LABEL(calendar_days[i]), buf);
gtk_widget_show(calendar_buttons[i]);
/*}*/
if (tmpday == curr_day) {
gtk_container_border_width(GTK_CONTAINER(calendar_buttons[i]), 2);
gtk_widget_show(calendar_buttons[i]);
} else {
gtk_container_border_width(GTK_CONTAINER(calendar_buttons[i]), 0);
}
} else if (month_changed) {
gtk_label_set(GTK_LABEL(calendar_days[i]), "");
gtk_widget_hide(calendar_buttons[i]);
gtk_container_border_width(GTK_CONTAINER(calendar_buttons[i]), 0);
}
} /* for i */
#endif /* 0 */
}
/*
* Updates all the main window widgets when the current day of interest is
* changed
*/
void update_today(void)
{
char buf[50];
/* This needs to be fixed to get the right date order for the country*/
/* if (curr_month != old_month) {
gtk_label_set(GTK_LABEL(month_label), month_name(curr_month));
}
if (curr_year != old_year) {
sprintf(buf, "%4d", curr_year);
gtk_label_set(GTK_LABEL(year_label), buf);
}*/
update_today_list();
update_calendar();
}
void next_day_but_clicked(GtkWidget *widget, gpointer data)
{
old_day = curr_day;
old_month = curr_month;
old_year = curr_year;
next_date(&curr_day, &curr_month, &curr_year);
update_today();
}
void prev_day_but_clicked(GtkWidget *widget, gpointer data)
{
old_day = curr_day;
old_month = curr_month;
old_year = curr_year;
prev_date(&curr_day, &curr_month, &curr_year);
update_today();
}
void today_but_clicked(GtkWidget *widget, gpointer data)
{
old_day = curr_day;
old_month = curr_month;
old_year = curr_year;
get_system_date(&curr_day, &curr_month, &curr_year);
update_today();
}
void prev_month_but_clicked(GtkWidget *widget, gpointer data)
{
if (curr_year == 0 && curr_month == MONTH_MIN)
return;
old_day = curr_day;
old_month = curr_month;
old_year = curr_year;
curr_month--;
if (curr_month < MONTH_MIN) {
curr_month = MONTH_MAX;
curr_year--;
}
update_today();
}
void next_month_but_clicked(GtkWidget *widget, gpointer data)
{
if (curr_year == 3000 && curr_month == MONTH_MAX)
return;
old_day = curr_day;
old_month = curr_month;
old_year = curr_year;
curr_month++;
if (curr_month > MONTH_MAX ) {
curr_month = MONTH_MIN;
curr_year++;
}
update_today();
}
void prev_year_but_clicked(GtkWidget *widget, gpointer data)
{
if (curr_year == 0)
return;
old_day = curr_day;
old_month = curr_month;
old_year = curr_year;
curr_year--;
update_today();
}
void next_year_but_clicked(GtkWidget *widget, gpointer data)
{
if (curr_year == 3000)
return;
old_day = curr_day;
old_month = curr_month;
old_year = curr_year;
curr_year++;
update_today();
}
void calendar_but_clicked(GtkWidget *widget, gpointer data)
{
char *ptr;
int x;
ptr = GTK_LABEL(GTK_BUTTON(widget)->child)->label;
x = atoi(ptr);
if (valid_date(x, curr_month, curr_year)) {
old_day = curr_day;
old_month = curr_month;
old_year = curr_year;
curr_day = x;
update_today();
}
}
void test_foreach(GtkWidget *widget, gpointer data)
{
char *ptr;
ptr = GTK_LABEL(GTK_BUTTON(widget)->child)->label;
g_print("%s\n", ptr);
}
void show_main_window()
{
GtkWidget *main_vbox;
/*GtkWidget *menubar;
GtkAcceleratorTable *accel;*/
GtkMenuFactory *menuf;
GtkWidget *main_hbox;
GtkWidget *left_vbox;
GtkWidget *right_vbox;
GtkWidget *date_hbox;
GtkWidget *prev_mth_but;
GtkWidget *next_mth_but;
GtkWidget *prev_year_but;
GtkWidget *next_year_but;
GtkWidget *day_but_hbox;
GtkWidget *prev_day_but;
GtkWidget *today_but;
GtkWidget *next_day_but;
GtkWidget *separator;
GtkWidget *cal_table;
GtkWidget *day_name_label;
GtkWidget *scrolledwindow;
GtkWidget *scroll_hbox;
GtkWidget *hour_list;
GtkWidget *list_item;
GtkWidget *dailylist_item;
GtkWidget *event_label;
int i,j;
struct tm tm;
char buf[50];
bzero((char*)&tm, sizeof(struct tm));
app = gnome_app_new("gncal", "Gnome Calendar");
gtk_widget_realize(app);
gtk_signal_connect(GTK_OBJECT(app), "delete_event",
GTK_SIGNAL_FUNC(menu_file_quit), NULL);
if (restarted) {
gtk_widget_set_uposition(app, os_x, os_y);
gtk_widget_set_usize(app, os_w, os_h);
} else {
gtk_widget_set_usize(app,300,300);
}
main_vbox = gtk_vbox_new(FALSE, 1);
gnome_app_set_contents(GNOME_APP(app), main_vbox);
gtk_widget_show(main_vbox);
menuf = create_menu();
gnome_app_set_menus(GNOME_APP(app), GTK_MENU_BAR(menuf->widget));
main_hbox = gtk_hbox_new(FALSE,1);
gtk_box_pack_start(GTK_BOX(main_vbox), main_hbox, TRUE, TRUE, 0);
gtk_widget_show(main_hbox);
left_vbox = gtk_vbox_new(FALSE, 1);
gtk_box_pack_start(GTK_BOX(main_hbox), left_vbox, FALSE, TRUE,0);
gtk_widget_show(left_vbox);
separator = gtk_vseparator_new();
gtk_box_pack_start(GTK_BOX(main_hbox), separator, FALSE, TRUE, 0);
gtk_widget_show(separator);
right_vbox = gtk_vbox_new(FALSE, 1);
gtk_box_pack_start(GTK_BOX(main_hbox), right_vbox, TRUE, TRUE, 0);
gtk_widget_show(right_vbox);
date_hbox = gtk_hbox_new(FALSE, 1);
gtk_box_pack_start(GTK_BOX(left_vbox), date_hbox, FALSE, FALSE, 0);
gtk_widget_show(date_hbox);
/*
prev_mth_but = gtk_button_new_with_label("<");
gtk_box_pack_start(GTK_BOX(date_hbox), prev_mth_but, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(prev_mth_but), "clicked", GTK_SIGNAL_FUNC(prev_month_but_clicked), NULL);
gtk_widget_show(prev_mth_but);
month_label = gtk_label_new("Fooary");
gtk_box_pack_start(GTK_BOX(date_hbox), month_label, TRUE, FALSE, 0);
gtk_widget_show(month_label);
next_mth_but = gtk_button_new_with_label(">");
gtk_box_pack_start(GTK_BOX(date_hbox), next_mth_but, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(next_mth_but), "clicked", GTK_SIGNAL_FUNC(next_month_but_clicked), NULL);
gtk_widget_show(next_mth_but);
prev_year_but = gtk_button_new_with_label("<");
gtk_box_pack_start(GTK_BOX(date_hbox), prev_year_but, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(prev_year_but), "clicked", GTK_SIGNAL_FUNC(prev_year_but_clicked), NULL);
gtk_widget_show(prev_year_but);
year_label = gtk_label_new("1971");
gtk_box_pack_start(GTK_BOX(date_hbox), year_label, TRUE, FALSE, 0);
gtk_widget_show(year_label);
next_year_but = gtk_button_new_with_label(">");
gtk_box_pack_start(GTK_BOX(date_hbox), next_year_but, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(next_year_but), "clicked", GTK_SIGNAL_FUNC(next_year_but_clicked), NULL);
gtk_widget_show(next_year_but);
*/
/* Build up the calendar table */
/* cal_table = gtk_table_new(7,7,TRUE);
gtk_box_pack_start(GTK_BOX(left_vbox), cal_table, FALSE, FALSE, 0);
gtk_widget_show(cal_table);
for(i=DAY_MIN; i <= DAY_MAX; i++) {
day_name_label = gtk_label_new(short3_day_name(i));
gtk_table_attach_defaults(GTK_TABLE(cal_table), day_name_label, i-1, i, 0, 1);
gtk_widget_show(day_name_label);
}
for(j=0; j < 5; j++) {
for(i=0; i < 7; i++) {
calendar_buttons[i+j*7] = gtk_button_new();
gtk_container_border_width(GTK_CONTAINER(calendar_buttons[i+j*7]), 0);
gtk_table_attach_defaults(GTK_TABLE(cal_table), calendar_buttons[i+j*7], i, i+1, j+2, j+3);
gtk_signal_connect(GTK_OBJECT(calendar_buttons[i+j*7]), "clicked", GTK_SIGNAL_FUNC(calendar_but_clicked), NULL);
gtk_widget_show(calendar_buttons[i+j*7]);
calendar_days[i+j*7] = gtk_label_new("");
gtk_container_add(GTK_CONTAINER(calendar_buttons[i+j*7]), calendar_days[i+j*7]);
gtk_widget_show(calendar_days[i+j*7]);
}
}
*/
calendar = gtk_calendar_new();
gtk_calendar_display_options(GTK_CALENDAR(calendar), GTK_CALENDAR_SHOW_DAY_NAMES | GTK_CALENDAR_SHOW_HEADING);
gtk_box_pack_start(GTK_BOX(left_vbox), calendar, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(calendar), "month_changed",
GTK_SIGNAL_FUNC(month_changed), NULL);
gtk_widget_show(calendar);
day_but_hbox = gtk_hbox_new(TRUE, 1);
gtk_box_pack_start(GTK_BOX(left_vbox), day_but_hbox, FALSE, FALSE, 0);
gtk_widget_show(day_but_hbox);
prev_day_but = gtk_button_new_with_label("Prev");
gtk_box_pack_start(GTK_BOX(day_but_hbox), prev_day_but, TRUE, TRUE, 0);
gtk_signal_connect(GTK_OBJECT(prev_day_but), "clicked", GTK_SIGNAL_FUNC(prev_day_but_clicked), NULL);
gtk_widget_show(prev_day_but);
today_but = gtk_button_new_with_label("Today");
gtk_box_pack_start(GTK_BOX(day_but_hbox), today_but, TRUE, TRUE, 0);
gtk_signal_connect(GTK_OBJECT(today_but), "clicked", GTK_SIGNAL_FUNC(today_but_clicked), NULL);
gtk_widget_show(today_but);
next_day_but = gtk_button_new_with_label("Next");
gtk_box_pack_start(GTK_BOX(day_but_hbox), next_day_but, TRUE, TRUE, 0);
gtk_signal_connect(GTK_OBJECT(next_day_but), "clicked", GTK_SIGNAL_FUNC(next_day_but_clicked), NULL);
gtk_widget_show(next_day_but);
dailylist = create_clist();
gtk_box_pack_start(GTK_BOX(right_vbox), dailylist, TRUE, TRUE, 0);
gtk_widget_show(dailylist);
setup_clist(dailylist);
gtk_widget_show(app);
}
int
main(int argc, char *argv[])
{
GnomeClient *client;
argp_program_version = VERSION;
/* Initialise the i18n stuff */
bindtextdomain(PACKAGE, GNOMELOCALEDIR);
textdomain(PACKAGE);
/* This create a default client and arrages for it to parse some
command line arguments
*/
client = gnome_client_new_default();
/* Arrange to be told when something interesting happens. */
gtk_signal_connect (GTK_OBJECT (client), "save_yourself",
GTK_SIGNAL_FUNC (save_state), (gpointer) argv[0]);
gtk_signal_connect (GTK_OBJECT (client), "connect",
GTK_SIGNAL_FUNC (connect_client), NULL);
gnome_init("gncal", &parser, argc, argv, 0, NULL);
show_main_window();
/* Initialse date to the current day */
old_day = old_month = old_year = 0;
get_system_date(&curr_day, &curr_month, &curr_year);
update_today();
prueba ();
gtk_main();
return 0;
}
static error_t
parse_an_arg (int key, char *arg, struct argp_state *state)
{
if (key == DISCARD_KEY)
{
discard_session (arg);
just_exit = 1;
return 0;
}
/* We didn't recognize it. */
return ARGP_ERR_UNKNOWN;
}
/* Session Management routines */
static int
save_state (GnomeClient *client,
gint phase,
GnomeRestartStyle save_style,
gint shutdown,
GnomeInteractStyle interact_style,
gint fast,
gpointer client_data)
{
gchar *session_id;
gchar *sess;
gchar *buf;
gchar *argv[3];
gint x, y, w, h;
session_id= gnome_client_get_id (client);
/* The only state that gnome-hello has is the window geometry.
Get it. */
gdk_window_get_geometry (app->window, &x, &y, &w, &h, NULL);
/* Save the state using gnome-config stuff. */
sess = g_copy_strings ("/gncal/Saved-Session-",
session_id,
NULL);
buf = g_copy_strings ( sess, "/x", NULL);
gnome_config_set_int (buf, x);
g_free(buf);
buf = g_copy_strings ( sess, "/y", NULL);
gnome_config_set_int (buf, y);
g_free(buf);
buf = g_copy_strings ( sess, "/w", NULL);
gnome_config_set_int (buf, w);
g_free(buf);
buf = g_copy_strings ( sess, "/h", NULL);
gnome_config_set_int (buf, h);
g_free(buf);
gnome_config_sync();
g_free(sess);
/* Here is the real SM code. We set the argv to the parameters needed
to restart/discard the session that we've just saved and call
the gnome_session_set_*_command to tell the session manager it. */
argv[0] = (char*) client_data;
argv[1] = "--discard-session";
argv[2] = session_id;
gnome_client_set_discard_command (client, 3, argv);
/* Set commands to clone and restart this application. Note that we
use the same values for both -- the session management code will
automatically add whatever magic option is required to set the
session id on startup. */
gnome_client_set_clone_command (client, 1, argv);
gnome_client_set_restart_command (client, 1, argv);
g_print("save state\n");
return TRUE;
}
/* Connected to session manager. If restarted from a former session:
reads the state of the previous session. Sets os_* (prepare_app
uses them) */
void
connect_client (GnomeClient *client, gint was_restarted, gpointer client_data)
{
gchar *session_id;
/* Note that information is stored according to our *old*
session id. The id can change across sessions. */
session_id = gnome_client_get_previous_id (client);
if (was_restarted && session_id != NULL)
{
gchar *sess;
gchar *buf;
restarted = 1;
sess = g_copy_strings ("/gncal/Saved-Session-", session_id, NULL);
buf = g_copy_strings ( sess, "/x", NULL);
os_x = gnome_config_get_int (buf);
g_free(buf);
buf = g_copy_strings ( sess, "/y", NULL);
os_y = gnome_config_get_int (buf);
g_free(buf);
buf = g_copy_strings ( sess, "/w", NULL);
os_w = gnome_config_get_int (buf);
g_free(buf);
buf = g_copy_strings ( sess, "/h", NULL);
os_h = gnome_config_get_int (buf);
g_free(buf);
}
/* If we had an old session, we clean up after ourselves. */
if (session_id != NULL)
discard_session (session_id);
return;
}
void
discard_session (gchar *id)
{
gchar *sess;
sess = g_copy_strings ("/gncal/Saved-Session-", id, NULL);
/* we use the gnome_config_get_* to work around a bug in gnome-config
(it's going under a redesign/rewrite, so i didn't correct it) */
gnome_config_get_int ("/gncal/Bug/work-around=0");
gnome_config_clean_section (sess);
gnome_config_sync ();
g_free (sess);
return;
}

View File

@ -1,6 +0,0 @@
void menu_file_quit(GtkWidget *widget, gpointer data);
#define MIN_DAILY_HOUR 8
#define MAX_DAILY_HOUR 19
#define DAILY_MINUTE_STEP 15
void menu_help_about(GtkWidget *widget, gpointer data);

View File

@ -17,7 +17,6 @@
#include "gncal-year-view.h"
#include "month-view.h"
#include "timeutil.h"
#include "views.h"
#include "main.h"
GnomeApp *parent_class;
@ -54,13 +53,11 @@ setup_widgets (GnomeCalendar *gcal)
gcal->week_view = gncal_week_view_new (gcal, now);
gcal->month_view = month_view_new (gcal);
gcal->year_view = gncal_year_view_new (gcal, now);
gcal->task_view = tasks_create (gcal);
gtk_notebook_append_page (GTK_NOTEBOOK (gcal->notebook), gcal->day_view, gtk_label_new (_("Day View")));
gtk_notebook_append_page (GTK_NOTEBOOK (gcal->notebook), gcal->week_view, gtk_label_new (_("Week View")));
gtk_notebook_append_page (GTK_NOTEBOOK (gcal->notebook), gcal->month_view, gtk_label_new (_("Month View")));
gtk_notebook_append_page (GTK_NOTEBOOK (gcal->notebook), gcal->year_view, gtk_label_new (_("Year View")));
/* gtk_notebook_append_page (GTK_NOTEBOOK (gcal->notebook), gcal->task_view, gtk_label_new (_("Todo"))); */
gtk_widget_show_all (gcal->notebook);

View File

@ -30,7 +30,6 @@ typedef struct {
GtkWidget *week_view;
GtkWidget *month_view;
GtkWidget *year_view;
GtkWidget *task_view;
void *event_editor;
} GnomeCalendar;

View File

@ -9,6 +9,7 @@
#include <gnome.h>
#include "gnome-cal.h"
#include "gnome-month-item.h"
#include "main.h"
#include "timeutil.h"
@ -232,6 +233,7 @@ create_days (GtkWidget *dialog, GnomeCalendar *gcal, int day, int month, int yea
gnome_canvas_item_set (mitem,
"month", month,
"year", year,
"start_on_monday", week_starts_on_monday,
NULL);
highlight_current_day (GNOME_MONTH_ITEM (mitem));

View File

@ -48,10 +48,8 @@ gnomecal_SOURCES = \
timeutil.c \
timeutil.h \
view-utils.h \
view-utils.c \
views.h \
views.c
view-utils.c
LINK_FLAGS = \
$(GNOME_LIBDIR) \
$(GNOMEUI_LIBS) \
@ -59,7 +57,6 @@ LINK_FLAGS = \
#gncal_LDADD = $(LINK_FLAGS)
#objedit_LDADD = $(LINK_FLAGS)
gnomecal_LDADD = $(LINK_FLAGS)

View File

@ -17,7 +17,6 @@
#include "gncal-year-view.h"
#include "month-view.h"
#include "timeutil.h"
#include "views.h"
#include "main.h"
GnomeApp *parent_class;
@ -54,13 +53,11 @@ setup_widgets (GnomeCalendar *gcal)
gcal->week_view = gncal_week_view_new (gcal, now);
gcal->month_view = month_view_new (gcal);
gcal->year_view = gncal_year_view_new (gcal, now);
gcal->task_view = tasks_create (gcal);
gtk_notebook_append_page (GTK_NOTEBOOK (gcal->notebook), gcal->day_view, gtk_label_new (_("Day View")));
gtk_notebook_append_page (GTK_NOTEBOOK (gcal->notebook), gcal->week_view, gtk_label_new (_("Week View")));
gtk_notebook_append_page (GTK_NOTEBOOK (gcal->notebook), gcal->month_view, gtk_label_new (_("Month View")));
gtk_notebook_append_page (GTK_NOTEBOOK (gcal->notebook), gcal->year_view, gtk_label_new (_("Year View")));
/* gtk_notebook_append_page (GTK_NOTEBOOK (gcal->notebook), gcal->task_view, gtk_label_new (_("Todo"))); */
gtk_widget_show_all (gcal->notebook);

View File

@ -30,7 +30,6 @@ typedef struct {
GtkWidget *week_view;
GtkWidget *month_view;
GtkWidget *year_view;
GtkWidget *task_view;
void *event_editor;
} GnomeCalendar;

View File

@ -9,6 +9,7 @@
#include <gnome.h>
#include "gnome-cal.h"
#include "gnome-month-item.h"
#include "main.h"
#include "timeutil.h"
@ -232,6 +233,7 @@ create_days (GtkWidget *dialog, GnomeCalendar *gcal, int day, int month, int yea
gnome_canvas_item_set (mitem,
"month", month,
"year", year,
"start_on_monday", week_starts_on_monday,
NULL);
highlight_current_day (GNOME_MONTH_ITEM (mitem));

View File

@ -38,6 +38,9 @@ char *calendar_settings;
/* Day begin, day end parameters */
int day_begin, day_end;
/* Whether weeks starts on Sunday or Monday */
int week_starts_on_monday;
/* Number of calendars active */
int active_calendars = 0;
@ -107,7 +110,8 @@ init_calendar (void)
gnome_config_push_prefix (calendar_settings);
day_begin = range_check_hour (gnome_config_get_int ("/calendar/Calendar/Day start=8"));
day_end = range_check_hour (gnome_config_get_int ("/calendar/Calendar/Day end=17"));
am_pm_flag = range_check_hour (gnome_config_get_bool ("/calendar/Calendar/AM PM flag=0"));
am_pm_flag = gnome_config_get_bool ("/calendar/Calendar/AM PM flag=0");
week_starts_on_monday = gnome_config_get_bool ("/calendar/Calendar/Week starts on Monday=0");
if (day_end < day_begin){
day_begin = 8;
@ -184,14 +188,13 @@ close_cmd (GtkWidget *widget, GnomeCalendar *gcal)
gtk_main_quit ();
}
/*
* Updates all of the open calendars when the day_begin/day_end values have changed
*/
void
day_range_changed (void)
time_format_changed (void)
{
GList *l;
/* FIXME: update all the calendars and stuff */
for (l = all_calendars; l; l = l->next){
GnomeCalendar *cal = GNOME_CALENDAR (l->data);
@ -358,8 +361,8 @@ static GnomeUIInfo gnome_cal_edit_menu [] = {
{ GNOME_APP_UI_ITEM, N_("New appointment..."), NULL, display_objedit },
{ GNOME_APP_UI_ITEM, N_("New appointment for today..."), NULL, display_objedit_today },
GNOMEUIINFO_SEPARATOR,
{ GNOME_APP_UI_ITEM, N_("Properties..."), NULL, properties, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PROP },
{ GNOME_APP_UI_ITEM, N_("Preferences..."), NULL, properties, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PREF },
GNOMEUIINFO_END
};

View File

@ -1,12 +1,22 @@
#ifndef MAIN_H
#define MAIN_H
/* Global preferences */
extern int day_begin, day_end;
extern char *user_name;
extern int am_pm_flag;
extern int week_starts_on_monday;
/* Creates and runs the preferences dialog box */
void properties (void);
void day_range_changed (void);
/* Asks for all the time-related displays to be updated when the user changes the time format
* preferences.
*/
void time_format_changed (void);
/* Creates and runs the Go-to date dialog */
void goto_dialog (GnomeCalendar *gcal);
#endif

View File

@ -7,6 +7,7 @@
#include <config.h>
#include "month-view.h"
#include "main.h"
static void month_view_class_init (MonthViewClass *class);
@ -65,9 +66,7 @@ month_view_init (MonthView *mv)
"y", 0.0,
"anchor", GTK_ANCHOR_NW,
"day_anchor", GTK_ANCHOR_NE,
#if 0
"start_on_monday", TRUE,
#endif
"start_on_monday", week_starts_on_monday,
NULL);
}

View File

@ -2,153 +2,270 @@
* Calendar properties dialog box
* (C) 1998 the Free Software Foundation
*
* Author: Miguel de Icaza <miguel@kernel.org>
* Authors: Miguel de Icaza <miguel@kernel.org>
* Federico Mena <federico@nuclecu.unam.mx>
*/
#include <config.h>
#include <langinfo.h>
#include <gnome.h>
#include "gnome-cal.h"
#include "main.h"
static GtkWidget *prop_win, *r1;
static GtkObject *sa, *ea;
static void
start_changed (GtkAdjustment *sa, GtkAdjustment *ea)
{
if (sa->value > 23.0){
sa->value = 23.0;
ea->value = 24.0;
gtk_signal_emit_by_name (GTK_OBJECT (sa), "value_changed");
gtk_signal_emit_by_name (GTK_OBJECT (ea), "value_changed");
} else if (sa->value >= ea->value){
ea->value = sa->value + 1.0;
gtk_signal_emit_by_name (GTK_OBJECT (ea), "value_changed");
}
gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win));
}
static void
end_changed (GtkAdjustment *ea, GtkAdjustment *sa)
{
if (ea->value < 1.0){
ea->value = 1.0;
sa->value = 0.0;
gtk_signal_emit_by_name (GTK_OBJECT (ea), "value_changed");
gtk_signal_emit_by_name (GTK_OBJECT (sa), "value_changed");
} else if (ea->value < sa->value){
sa->value = ea->value - 1.0;
gtk_signal_emit_by_name (GTK_OBJECT (sa), "value_changed");
}
gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win));
}
/* justifies the text */
static GtkWidget *
align (GtkWidget *w, float side)
{
GtkWidget *a;
a = gtk_alignment_new (side, 0.5, 1.0, 1.0);
gtk_container_add (GTK_CONTAINER (a), w);
return a;
}
static GtkWidget *prop_win; /* The preferences dialog */
static GtkWidget *time_format_12; /* Radio button for 12-hour format */
static GtkWidget *time_format_24; /* Radio button for 24-hour format */
static GtkWidget *start_on_sunday; /* Check button for weeks starting on Sunday */
static GtkWidget *start_on_monday; /* Check button for weeks starting on Monday */
static GtkWidget *start_omenu; /* Option menu for start of day */
static GtkWidget *end_omenu; /* Option menu for end of day */
static GtkWidget *start_items[24]; /* Menu items for start of day menu */
static GtkWidget *end_items[24]; /* Menu items for end of day menu */
/* Callback used when the property box is closed -- just sets the prop_win variable to null. */
static int
prop_cancel (void)
{
prop_win = 0;
prop_win = NULL;
return FALSE;
}
/* Returns the index of the active item in a menu */
static int
get_active_index (GtkWidget *menu)
{
GtkWidget *active;
active = gtk_menu_get_active (GTK_MENU (menu));
return GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (active)));
}
/* Callback used when the Apply button is clicked. */
static void
prop_apply (GtkWidget *w, int page)
{
if (page != -1)
return;
day_begin = GTK_ADJUSTMENT (sa)->value;
day_end = GTK_ADJUSTMENT (ea)->value;
/* Day begin/end */
day_begin = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (start_omenu)));
day_end = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (end_omenu)));
gnome_config_set_int ("/calendar/Calendar/Day start", day_begin);
gnome_config_set_int ("/calendar/Calendar/Day end", day_end);
am_pm_flag = (GTK_TOGGLE_BUTTON (r1)->active) == 0;
/* Time format */
am_pm_flag = GTK_TOGGLE_BUTTON (time_format_12)->active;
gnome_config_set_bool ("/calendar/Calendar/AM PM flag", am_pm_flag);
gnome_config_sync ();
/* Week start */
day_range_changed ();
week_starts_on_monday = GTK_TOGGLE_BUTTON (start_on_monday)->active;
gnome_config_set_bool ("/calendar/Calendar/Week starts on Monday", week_starts_on_monday);
gnome_config_sync ();
time_format_changed ();
}
/* Notifies the property box that the data has changed */
static void
toggled ()
toggled (GtkWidget *widget, gpointer data)
{
gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win));
}
/* Builds and returns a two-element radio button group surrounded by a frame. The radio buttons are
* stored in the specified variables, and the first radio button's state is set according to the
* specified flag value. The buttons are connected to the toggled() function to update the property
* box's dirty state.
*/
static GtkWidget *
build_two_radio_group (char *title,
char *radio_1_title, GtkWidget **radio_1_widget,
char *radio_2_title, GtkWidget **radio_2_widget,
int radio_1_value)
{
GtkWidget *frame;
GtkWidget *vbox;
frame = gtk_frame_new (title);
vbox = gtk_vbox_new (TRUE, 0);
gtk_container_add (GTK_CONTAINER (frame), vbox);
*radio_1_widget = gtk_radio_button_new_with_label (NULL, radio_1_title);
gtk_box_pack_start (GTK_BOX (vbox), *radio_1_widget, FALSE, FALSE, 0);
*radio_2_widget = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (*radio_1_widget),
radio_2_title);
gtk_box_pack_start (GTK_BOX (vbox), *radio_2_widget, FALSE, FALSE, 0);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (*radio_1_widget), radio_1_value);
gtk_signal_connect (GTK_OBJECT (*radio_1_widget), "toggled",
(GtkSignalFunc) toggled,
NULL);
return frame;
}
/* Callback invoked when a menu item from the start/end time option menus is selected. It adjusts
* the other menu to the proper time, if needed.
*/
static void
hour_activated (GtkWidget *widget, gpointer data)
{
int start, end;
if (data == start_omenu) {
/* Adjust the end menu */
start = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (widget)));
end = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (end_omenu)));
if (end < start)
gtk_option_menu_set_history (GTK_OPTION_MENU (end_omenu), start);
} else if (data == end_omenu) {
/* Adjust the start menu */
end = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (widget)));
start = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (start_omenu)));
if (start > end)
gtk_option_menu_set_history (GTK_OPTION_MENU (start_omenu), end);
} else
g_assert_not_reached ();
}
/* Builds an option menu of 24 hours */
static GtkWidget *
build_hours_menu (GtkWidget **items, int active)
{
GtkWidget *omenu;
GtkWidget *menu;
int i;
char buf[100];
struct tm tm;
omenu = gtk_option_menu_new ();
menu = gtk_menu_new ();
memset (&tm, 0, sizeof (tm));
for (i = 0; i < 24; i++) {
tm.tm_hour = i;
strftime (buf, 100, "%I:%M %p", &tm);
items[i] = gtk_menu_item_new_with_label (buf);
gtk_object_set_user_data (GTK_OBJECT (items[i]), GINT_TO_POINTER (i));
gtk_signal_connect (GTK_OBJECT (items[i]), "activate",
(GtkSignalFunc) hour_activated,
omenu);
gtk_menu_append (GTK_MENU (menu), items[i]);
gtk_widget_show (items[i]);
}
gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), active);
return omenu;
}
/* Creates and displays the preferences dialog for the whole application */
void
properties (void)
{
GtkWidget *t, *l, *ds, *de;
GtkWidget *r2;
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *hbox2;
GtkWidget *hbox3;
GtkWidget *w;
if (prop_win)
return;
/* Main window and hbox for property page */
prop_win = gnome_property_box_new ();
gtk_window_set_title (GTK_WINDOW (prop_win), _("Preferences"));
t = gtk_table_new (0, 0, 0);
gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), t,
gtk_label_new (_("Calendar global parameters")));
hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
gtk_container_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL);
gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), hbox,
gtk_label_new (_("Time display")));
/* Time format */
vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
w = build_two_radio_group (_("Time format"),
_("12-hour (AM/PM)"), &time_format_12,
_("24-hour"), &time_format_24,
am_pm_flag);
gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
/* Weeks start on */
w = build_two_radio_group (_("Weeks start on"),
_("Sunday"), &start_on_sunday,
_("Monday"), &start_on_monday,
!week_starts_on_monday);
gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
/* Day range */
frame = gtk_frame_new (_("Day range"));
gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
gtk_container_border_width (GTK_CONTAINER (vbox), GNOME_PAD_SMALL);
gtk_container_add (GTK_CONTAINER (frame), vbox);
w = gtk_label_new (_("Please select the start and end hours you want\n"
"to be displayed in the day view and week view.\n"
"Times outside this range will not be displayed\n"
"by default."));
gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.0);
gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
hbox2 = gtk_hbox_new (FALSE, GNOME_PAD);
gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
/* Day start */
hbox3 = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
gtk_box_pack_start (GTK_BOX (hbox2), hbox3, FALSE, FALSE, 0);
w = gtk_label_new (_("Day start:"));
gtk_box_pack_start (GTK_BOX (hbox3), w, FALSE, FALSE, 0);
start_omenu = build_hours_menu (start_items, day_begin);
gtk_box_pack_start (GTK_BOX (hbox3), start_omenu, FALSE, FALSE, 0);
/* Day end */
hbox3 = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
gtk_box_pack_start (GTK_BOX (hbox2), hbox3, FALSE, FALSE, 0);
w = gtk_label_new (_("Day end:"));
gtk_box_pack_start (GTK_BOX (hbox3), w, FALSE, FALSE, 0);
end_omenu = build_hours_menu (end_items, day_end);
gtk_box_pack_start (GTK_BOX (hbox3), end_omenu, FALSE, FALSE, 0);
/* Done! */
l = gtk_label_new (_("Day start:"));
gtk_table_attach (GTK_TABLE (t), l,
0, 1, 0, 1, 0, 0, 0, 0);
sa = gtk_adjustment_new (day_begin, 0.0, 25.00, 1.0, 1.0, 1.0);
ds = gtk_hscale_new (GTK_ADJUSTMENT (sa));
gtk_scale_set_digits (GTK_SCALE (ds), 0);
gtk_table_attach (GTK_TABLE (t), ds,
1, 2, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
l = gtk_label_new (_("Day end:"));
gtk_table_attach (GTK_TABLE (t), l,
0, 1, 1, 2, 0, 0, 0, 0);
ea = gtk_adjustment_new (day_end, 0.0, 25.00, 1.0, 1.0, 1.0);
de = gtk_hscale_new (GTK_ADJUSTMENT (ea));
gtk_scale_set_digits (GTK_SCALE (de), 0);
gtk_table_attach (GTK_TABLE (t), de,
1, 2, 1, 2, GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_signal_connect (sa, "value_changed",
GTK_SIGNAL_FUNC (start_changed), ea);
gtk_signal_connect (ea, "value_changed",
GTK_SIGNAL_FUNC (end_changed), sa);
/* Nice spacing :-) */
gtk_table_attach (GTK_TABLE (t), gtk_label_new (""),
0, 1, 2, 3, 0, 0, 0, 0);
r1 = gtk_radio_button_new_with_label (NULL, _("24 hour format"));
r2 = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (r1),
_("12 hour format"));
if (am_pm_flag)
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (r2), 1);
gtk_signal_connect (GTK_OBJECT (r1), "toggled",
GTK_SIGNAL_FUNC (toggled), NULL);
gtk_table_attach (GTK_TABLE (t), align (r1, 0.0), 0, 2, 3, 4, GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_table_attach (GTK_TABLE (t), align (r2, 0.0), 0, 2, 4, 5, GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_signal_connect (GTK_OBJECT (prop_win), "destroy",
GTK_SIGNAL_FUNC (prop_cancel), NULL);
(GtkSignalFunc) prop_cancel, NULL);
gtk_signal_connect (GTK_OBJECT (prop_win), "delete_event",
GTK_SIGNAL_FUNC (prop_cancel), NULL);
(GtkSignalFunc) prop_cancel, NULL);
gtk_signal_connect (GTK_OBJECT (prop_win), "apply",
GTK_SIGNAL_FUNC (prop_apply), NULL);
(GtkSignalFunc) prop_apply, NULL);
gtk_widget_show_all (prop_win);
}

View File

@ -1,441 +0,0 @@
/*
* lexer.c: Reads in the .calendar files
*/
#include <stdio.h>
#include <glib.h>
#include "cal_struct.h"
#define opener "["
#define closer "]"
#define VersionMajor 2
GSList *eventlist;
void print_glist(gpointer data, gpointer user_data)
{
struct event *myevent = (struct event*)data;
if (data == NULL)
return;
printf ("===============================================\nNew event\n");
printf ("Start: %s %02d:%02d End: %s %02d:%02d\n", myevent->start.date, myevent->start.time / 60, myevent->start.time % 60, myevent->end.date, myevent->end.time / 60, myevent->end.time % 60);
printf ("Contents: %s\n", myevent->description);
printf ("Repeat = %d (%d)", (int)(myevent->repeat), myevent->repeatcount);
}
int skip_chars(FILE *fp, char *terminator)
{
int c;
int cnt;
cnt = 0;
while( (c = fgetc(fp)) != EOF) {
if (c == terminator[cnt]) {
cnt++;
if (terminator[cnt] == '\0')
return TRUE;
} else
cnt = 0;
}
return FALSE;
}
int peek_char(FILE *fp, char *c)
{
if ( ((*c) = fgetc(fp)) != EOF) {
ungetc((*c), fp);
return TRUE;
} else
return FALSE;
}
int skip_whitespace(FILE *fp)
{
int c;
while( (c = fgetc(fp)) != EOF)
if (!isspace(c)) {
ungetc(c, fp);
return TRUE;
}
return FALSE;
}
int get_until(FILE *fp, char terminator, char *buf)
{
int c;
while( (c = fgetc(fp)) != EOF) {
if (c == terminator) {
*buf = '\0';
return TRUE;
}
*buf = (char)c;
buf++;
}
*buf = '\0';
return FALSE;
}
int get_number(FILE *fp, int *x)
{
char buf[50];
int c;
int cnt;
cnt = 0;
buf[cnt] = '\0';
while( (c= fgetc(fp)) != EOF) {
if (!isdigit(c)) {
ungetc(c, fp);
*x = atoi(buf);
return TRUE;
}
buf[cnt++] = (char)c;
buf[cnt] = '\0';
}
*x = atoi(buf);
return FALSE;
}
/* Get string until EOF or closer_char */
int get_string(FILE *fp, char *string)
{
int c;
int cnt;
cnt = 0;
while ( (c = fgetc(fp)) != EOF) {
if (c == closer[0]) {
string[cnt] = '\0';
ungetc((char)c, fp);
return TRUE;
}
string[cnt++] = (char)c;
}
return FALSE;
}
int get_dates(FILE *fp, char *keyword, struct event *ptr)
{
char *c;
int x;
if (strncmp("Single", keyword, 6) == 0) {
ptr->repeat = Single;
/* It's a single date */
if (! skip_whitespace(fp) || !get_until(fp, ' ', ptr->start.date))
return FALSE;
if (! skip_chars(fp, "End"))
return FALSE;
return TRUE;
} else if (strncmp("Days", keyword, 4) == 0) {
ptr->repeat = Days;
if (! skip_whitespace(fp) || !get_until(fp, ' ', ptr->start.date))
return FALSE;
if (! skip_whitespace(fp) || !get_number(fp, &(ptr->repeatcount)))
return FALSE;
if (! skip_chars(fp, "End"))
return FALSE;
return TRUE;
}
return FALSE;
}
int getid(FILE *fp, char *string)
{
int c;
int cnt;
cnt = 0;
while( (c =fgetc(fp)) != EOF) {
if (isalnum(c))
string[cnt++] = (char)c;
else {
string[cnt] = '\0';
return TRUE;
}
}
string[cnt] = '\0';
return FALSE;
}
int parse_appointment(FILE *fp, struct event *ptr, char keyword[])
{
char buf[50];
int x,y,c;
if (strcmp(keyword, "Start") == 0) {
if ( ! skip_whitespace(fp) || ! get_number(fp, &x) ) {
g_error("Unable to get start time");
return FALSE;
}
g_print ("Appointment start = %02d:%02d\n", x/60, x % 60);
ptr->start.time = x;
return TRUE;
}
if (strcmp(keyword, "Length") == 0) {
if ( ! skip_whitespace(fp) || ! get_number(fp, &x) ) {
g_error("Unable to get length");
return FALSE;
}
g_print ("Appointment length = %d\n", x);
ptr->end.time = ptr->start.time + x;
return TRUE;
}
if (strcmp(keyword, "Alarms") == 0) {
while(TRUE) {
skip_whitespace(fp);
if (!peek_char(fp, (char*)&c)) {
g_error("Cannot read alarm list");
return FALSE;
}
if (!isdigit(c))
break;
if (! get_number(fp, &x))
return FALSE;
g_print("New alarm %d\n", x);
}
return TRUE;
}
g_print("Unknown keyword %s\n", keyword);
return FALSE;
}
int parse_item(FILE *fp, struct event *ptr, char keyword[])
{
char buf[50];
int x, y, c;
if (strcmp(keyword, "Remind") == 0) {
if (! skip_whitespace(fp) || ! get_number(fp, &x)) {
g_error("Cannot get remind level");
return FALSE;
}
g_print("Remind level = %d\n", x);
return TRUE;
}
if (strcmp(keyword, "Owner") == 0) {
if (!get_string(fp, buf)) {
g_error("Cannot get owner information");
return FALSE;
}
g_print("Owner = %s\n", buf);
return TRUE;
}
if (strcmp(keyword, "Uid") == 0) {
if (!skip_whitespace(fp) || !get_until(fp, *closer, buf)) {
g_error("Cannot get unique ID");
return FALSE;
}
g_print("UID = %s\n", buf);
return TRUE;
}
if (strcmp(keyword, "Contents") == 0) {
if (!get_string(fp, buf)) {
g_error("Cannot get item text");
return FALSE;
}
g_print("Contents = %s\n", buf);
strcpy(ptr->description,buf);
return TRUE;
}
if (strcmp(keyword, "Text") == 0) {
if (! skip_whitespace(fp) || ! get_number(fp, &x) ||
(x < 0) || ! skip_whitespace(fp) || ! skip_chars(fp, opener) ) {
g_error("Cannot get item text");
return FALSE;
}
y = 0;
while(y < x) {
if ( (c = fgetc(fp)) == EOF) {
g_error("Short item text");
return FALSE;
}
buf[y++] = (char)c;
}
buf[y] = '\0';
g_print("Text = %s\n", buf);
return TRUE;
}
if (strcmp(keyword, "Dates") == 0) {
if ( ! getid(fp, buf)) {
g_error("Cannot get date");
return FALSE;
}
return get_dates(fp, buf,ptr);
}
if (strcmp(keyword, "Deleted") == 0) {
if (! skip_whitespace(fp) || ! get_number(fp, &x)) {
g_error("Cannot get deleted day");
return FALSE;
}
g_print("%d/", x);
if (! skip_whitespace(fp) || ! get_number(fp, &x)) {
g_error("Cannot get deleted month");
return FALSE;
}
g_print("%d/", x);
if (! skip_whitespace(fp) || ! get_number(fp, &x)) {
g_error("Cannot get deleted year");
return FALSE;
}
g_print("%d\n", x);
return TRUE;
}
if (strcmp(keyword, "Hilite") == 0) {
if (! get_string(fp, buf) ) {
g_error("Cannot get hilite data");
return FALSE;
}
g_print("Hilite = %s\n", buf);
return TRUE;
}
if (strcmp(keyword, "Todo") == 0) {
g_print("Todo\n");
return TRUE;
}
if (strcmp(keyword, "Done") == 0) {
g_print("Done\n");
return TRUE;
}
return FALSE;
}
void parse_ical_file(char const *file)
{
FILE *fp;
int finished;
char keyword[50];
int file_major, file_minor;
char c;
int item_type;
int incomplete_item;
struct event *myevent;
if ( (fp = fopen(file, "r")) == NULL) {
g_error("couldn't open file");
return;
}
finished = FALSE;
if (!skip_whitespace(fp))
return;
if (! skip_chars(fp, "Calendar") || ! skip_whitespace(fp) ) {
g_error("unable to find calendar file");
fclose(fp);
return;
}
if (! skip_chars(fp, opener) || ! skip_chars(fp, "v") ) {
g_error("Unable to get version line");
fclose(fp);
return;
}
if (! get_number(fp, &file_major) || ! (file_major >=0) || (file_major > VersionMajor)) {
g_error("Missing/bad major version");
fclose(fp);
return;
}
if (! skip_chars(fp, ".") || ! get_number(fp, &file_minor) ||
! skip_chars(fp, "]") || ! skip_whitespace(fp) ) {
g_error("Missing minor version");
fclose(fp);
return;
}
if (file_minor > 0) {
g_error("Bad minor version");
fclose(fp);
return;
}
while(TRUE) {
g_print("----------------------------------------\n");
item_type= 0;
skip_whitespace(fp);
if (! getid(fp,keyword) || ! skip_whitespace(fp) ||
! skip_chars(fp, opener) || ! skip_whitespace(fp) ) {
fclose(fp);
return;
}
if (strcmp(keyword, "Appt") == 0) {
g_print("New Appointment\n");
item_type = 1;
} else if (strcmp(keyword, "Note") == 0) {
g_print("New Note\n");
item_type = 2;
} else
g_print("New ??? (%s)\n", keyword);
incomplete_item = TRUE;
myevent = g_malloc0(sizeof(struct event));
while(incomplete_item) {
if (! skip_whitespace(fp) || ! peek_char(fp, &c)) {
g_warning("Incomplete item\n");
fclose(fp);
return;
}
if (c == closer[0]) {
(void)fgetc(fp);
g_print("done!\n");
incomplete_item = FALSE;
g_slist_append(eventlist, myevent);
break;
}
if (! getid(fp,keyword) || ! skip_whitespace(fp) ||
! skip_chars(fp, opener) ) {
g_error("Error reading item property name");
fclose(fp);
return;
}
if ( ! parse_item(fp, myevent, keyword) && ! parse_appointment(fp, myevent, keyword) ) {
g_warning("Unable to parse line\n");
fclose(fp);
return;
}
if ( ! skip_whitespace(fp) || ! skip_chars(fp, closer)) {
g_error("Error reading item property");
fclose(fp);
return;
}
} /* while */
} /* while */
}
int main(int argc, char *argv[])
{
eventlist = g_slist_alloc();
parse_ical_file("/home/csmall/.calendar");
g_slist_foreach(eventlist, print_glist, NULL);
return 0;
}

View File

@ -38,6 +38,9 @@ char *calendar_settings;
/* Day begin, day end parameters */
int day_begin, day_end;
/* Whether weeks starts on Sunday or Monday */
int week_starts_on_monday;
/* Number of calendars active */
int active_calendars = 0;
@ -107,7 +110,8 @@ init_calendar (void)
gnome_config_push_prefix (calendar_settings);
day_begin = range_check_hour (gnome_config_get_int ("/calendar/Calendar/Day start=8"));
day_end = range_check_hour (gnome_config_get_int ("/calendar/Calendar/Day end=17"));
am_pm_flag = range_check_hour (gnome_config_get_bool ("/calendar/Calendar/AM PM flag=0"));
am_pm_flag = gnome_config_get_bool ("/calendar/Calendar/AM PM flag=0");
week_starts_on_monday = gnome_config_get_bool ("/calendar/Calendar/Week starts on Monday=0");
if (day_end < day_begin){
day_begin = 8;
@ -184,14 +188,13 @@ close_cmd (GtkWidget *widget, GnomeCalendar *gcal)
gtk_main_quit ();
}
/*
* Updates all of the open calendars when the day_begin/day_end values have changed
*/
void
day_range_changed (void)
time_format_changed (void)
{
GList *l;
/* FIXME: update all the calendars and stuff */
for (l = all_calendars; l; l = l->next){
GnomeCalendar *cal = GNOME_CALENDAR (l->data);
@ -358,8 +361,8 @@ static GnomeUIInfo gnome_cal_edit_menu [] = {
{ GNOME_APP_UI_ITEM, N_("New appointment..."), NULL, display_objedit },
{ GNOME_APP_UI_ITEM, N_("New appointment for today..."), NULL, display_objedit_today },
GNOMEUIINFO_SEPARATOR,
{ GNOME_APP_UI_ITEM, N_("Properties..."), NULL, properties, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PROP },
{ GNOME_APP_UI_ITEM, N_("Preferences..."), NULL, properties, NULL, NULL,
GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_PREF },
GNOMEUIINFO_END
};

View File

@ -1,12 +1,22 @@
#ifndef MAIN_H
#define MAIN_H
/* Global preferences */
extern int day_begin, day_end;
extern char *user_name;
extern int am_pm_flag;
extern int week_starts_on_monday;
/* Creates and runs the preferences dialog box */
void properties (void);
void day_range_changed (void);
/* Asks for all the time-related displays to be updated when the user changes the time format
* preferences.
*/
void time_format_changed (void);
/* Creates and runs the Go-to date dialog */
void goto_dialog (GnomeCalendar *gcal);
#endif

View File

@ -1,147 +0,0 @@
#include <gtk/gtk.h>
#include <strings.h>
#include "gncal.h"
static void menus_remove_accel(GtkWidget * widget, gchar * signal_name, gchar *
path);
static gint menus_install_accel(GtkWidget * widget, gchar * signal_name, gchar
key, gchar modifiers, gchar * path);
void menus_init(void);
void menus_create(GtkMenuEntry * entries, int nmenu_entries);
/* this is the GtkMenuEntry structure used to create new menus. The
* first member is the menu definition string. The second, the
* default accelerator key used to access this menu function with
* the keyboard. The third is the callback function to call when
* this menu item is selected (by the accelerator key, or with the
* mouse.) The member is the data to pass to your callback function.
*/
static GtkMenuEntry menu_items[] =
{
{"<Main>/File/Exit", "<control>Q", menu_file_quit, NULL},
{"<Main>/Help/About", NULL, menu_help_about, NULL},
};
static int nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]);
static int initialize = TRUE;
static GtkMenuFactory *factory = NULL;
static GtkMenuFactory *subfactory[1];
static GHashTable *entry_ht = NULL;
void get_main_menu(GtkWidget ** menubar, GtkAcceleratorTable ** table)
{
if (initialize)
menus_init();
if (menubar)
*menubar = subfactory[0]->widget;
if (table)
*table = subfactory[0]->table;
}
void menus_init(void)
{
if (initialize) {
initialize = FALSE;
factory = gtk_menu_factory_new(GTK_MENU_FACTORY_MENU_BAR);
subfactory[0] = gtk_menu_factory_new(GTK_MENU_FACTORY_MENU_BAR);
gtk_menu_factory_add_subfactory(factory, subfactory[0], "<Main>");
menus_create(menu_items, nmenu_items);
}
}
void menus_create(GtkMenuEntry * entries, int nmenu_entries)
{
char *accelerator;
int i;
if (initialize)
menus_init();
if (entry_ht)
for (i = 0; i < nmenu_entries; i++) {
accelerator = g_hash_table_lookup(entry_ht, entries[i].path);
if (accelerator) {
if (accelerator[0] == '\0')
entries[i].accelerator = NULL;
else
entries[i].accelerator = accelerator;
}
}
gtk_menu_factory_add_entries(factory, entries, nmenu_entries);
for (i = 0; i < nmenu_entries; i++)
if (entries[i].widget) {
gtk_signal_connect(GTK_OBJECT(entries[i].widget), "install_accelerator",
(GtkSignalFunc) menus_install_accel,
entries[i].path);
gtk_signal_connect(GTK_OBJECT(entries[i].widget), "remove_accelerator",
(GtkSignalFunc) menus_remove_accel,
entries[i].path);
}
}
static gint menus_install_accel(GtkWidget * widget, gchar * signal_name, gchar
key, gchar modifiers, gchar * path)
{
char accel[64];
char *t1, t2[2];
accel[0] = '\0';
if (modifiers & GDK_CONTROL_MASK)
strcat(accel, "<control>");
if (modifiers & GDK_SHIFT_MASK)
strcat(accel, "<shift>");
if (modifiers & GDK_MOD1_MASK)
strcat(accel, "<alt>");
t2[0] = key;
t2[1] = '\0';
strcat(accel, t2);
if (entry_ht) {
t1 = g_hash_table_lookup(entry_ht, path);
g_free(t1);
} else
entry_ht = g_hash_table_new(g_string_hash, g_string_equal);
g_hash_table_insert(entry_ht, path, g_strdup(accel));
return TRUE;
}
static void menus_remove_accel(GtkWidget * widget, gchar * signal_name, gchar *
path)
{
char *t;
if (entry_ht) {
t = g_hash_table_lookup(entry_ht, path);
g_free(t);
g_hash_table_insert(entry_ht, path, g_strdup(""));
}
}
void menus_set_sensitive(char *path, int sensitive)
{
GtkMenuPath *menu_path;
if (initialize)
menus_init();
menu_path = gtk_menu_factory_find(factory, path);
if (menu_path)
gtk_widget_set_sensitive(menu_path->widget, sensitive);
else
g_warning("Unable to set sensitivity for menu which doesn't exist: %s", path);
}

View File

@ -1,17 +0,0 @@
#ifndef __MENUS_H__
#define __MENUS_H__
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <gtk/gtk.h>
void get_main_menu (GtkWidget **menubar, GtkAcceleratorTable **table);
void menus_create(GtkMenuEntry *entries, int nmenu_entries);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __MENUS_H__ */

View File

@ -7,6 +7,7 @@
#include <config.h>
#include "month-view.h"
#include "main.h"
static void month_view_class_init (MonthViewClass *class);
@ -65,9 +66,7 @@ month_view_init (MonthView *mv)
"y", 0.0,
"anchor", GTK_ANCHOR_NW,
"day_anchor", GTK_ANCHOR_NE,
#if 0
"start_on_monday", TRUE,
#endif
"start_on_monday", week_starts_on_monday,
NULL);
}

View File

@ -1,88 +0,0 @@
/*
* Calendar Object editor.
* Copyright (C) 1998 the Free Software Foundation
*
* Author: Miguel de Icaza (miguel@kernel.org)
*/
#include <gnome.h>
/* Day start and day end in hours */
int day_start, day_end;
typedef struct {
GtkWidget *property_box;
GtkWidget *general;
GtkTable *general_table;
GtkWidget *general_time_table;
} ObjEditor;
GtkWidget *
calendar_object_editor_setup_time_frame (ObjEditor *oe)
{
GtkWidget *frame;
GtkWidget *start_time, *end_time;
GtkTable *t;
frame = gtk_frame_new (_("Time"));
t = GTK_TABLE (oe->general_time_table = gtk_table_new (1, 1, 0));
gtk_container_add (GTK_CONTAINER (frame), oe->general_time_table);
start_time = gnome_date_edit_new (0);
end_time = gnome_date_edit_new (0);
gnome_date_edit_set_popup_range ((GnomeDateEdit *) start_time, day_start, day_end);
gnome_date_edit_set_popup_range ((GnomeDateEdit *) end_time, day_start, day_end);
gtk_table_attach (t, gtk_label_new (_("Start time")), 1, 2, 1, 2, 0, 0, 0, 0);
gtk_table_attach (t, gtk_label_new (_("End time")), 1, 2, 2, 3, 0, 0, 0, 0);
gtk_table_attach (t, start_time, 2, 3, 1, 2, 0, 0, 0, 0);
gtk_table_attach (t, end_time, 2, 3, 2, 3, 0, 0, 0, 0);
return frame;
}
void
calendar_general_editor_new (ObjEditor *oe)
{
GtkWidget *frame;
oe->general = gtk_hbox_new (0, 0);
oe->general_table = (GtkTable *) gtk_table_new (1, 1, 0);
gtk_box_pack_start (GTK_BOX (oe->general), (GtkWidget *) oe->general_table, 1, 1, 0);
frame = calendar_object_editor_setup_time_frame (oe);
gtk_table_attach (oe->general_table, frame,
1, 2, 1, 2,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gnome_property_box_append_page (oe->property_box, oe->general, gtk_label_new (_("General")));
}
ObjEditor *
calendar_object_editor_new (void)
{
ObjEditor *oe;
oe = g_new0 (ObjEditor, 1);
oe->property_box = gnome_property_box_new ();
calendar_general_editor_new (oe);
return oe;
}
main (int argc, char *argv [])
{
ObjEditor *oe;
day_start = 7;
day_end = 19;
gnome_init ("myapp", NULL, argc, argv, 0, NULL);
oe = calendar_object_editor_new ();
gtk_widget_show_all (oe->property_box);
gtk_main ();
}

View File

@ -2,153 +2,270 @@
* Calendar properties dialog box
* (C) 1998 the Free Software Foundation
*
* Author: Miguel de Icaza <miguel@kernel.org>
* Authors: Miguel de Icaza <miguel@kernel.org>
* Federico Mena <federico@nuclecu.unam.mx>
*/
#include <config.h>
#include <langinfo.h>
#include <gnome.h>
#include "gnome-cal.h"
#include "main.h"
static GtkWidget *prop_win, *r1;
static GtkObject *sa, *ea;
static void
start_changed (GtkAdjustment *sa, GtkAdjustment *ea)
{
if (sa->value > 23.0){
sa->value = 23.0;
ea->value = 24.0;
gtk_signal_emit_by_name (GTK_OBJECT (sa), "value_changed");
gtk_signal_emit_by_name (GTK_OBJECT (ea), "value_changed");
} else if (sa->value >= ea->value){
ea->value = sa->value + 1.0;
gtk_signal_emit_by_name (GTK_OBJECT (ea), "value_changed");
}
gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win));
}
static void
end_changed (GtkAdjustment *ea, GtkAdjustment *sa)
{
if (ea->value < 1.0){
ea->value = 1.0;
sa->value = 0.0;
gtk_signal_emit_by_name (GTK_OBJECT (ea), "value_changed");
gtk_signal_emit_by_name (GTK_OBJECT (sa), "value_changed");
} else if (ea->value < sa->value){
sa->value = ea->value - 1.0;
gtk_signal_emit_by_name (GTK_OBJECT (sa), "value_changed");
}
gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win));
}
/* justifies the text */
static GtkWidget *
align (GtkWidget *w, float side)
{
GtkWidget *a;
a = gtk_alignment_new (side, 0.5, 1.0, 1.0);
gtk_container_add (GTK_CONTAINER (a), w);
return a;
}
static GtkWidget *prop_win; /* The preferences dialog */
static GtkWidget *time_format_12; /* Radio button for 12-hour format */
static GtkWidget *time_format_24; /* Radio button for 24-hour format */
static GtkWidget *start_on_sunday; /* Check button for weeks starting on Sunday */
static GtkWidget *start_on_monday; /* Check button for weeks starting on Monday */
static GtkWidget *start_omenu; /* Option menu for start of day */
static GtkWidget *end_omenu; /* Option menu for end of day */
static GtkWidget *start_items[24]; /* Menu items for start of day menu */
static GtkWidget *end_items[24]; /* Menu items for end of day menu */
/* Callback used when the property box is closed -- just sets the prop_win variable to null. */
static int
prop_cancel (void)
{
prop_win = 0;
prop_win = NULL;
return FALSE;
}
/* Returns the index of the active item in a menu */
static int
get_active_index (GtkWidget *menu)
{
GtkWidget *active;
active = gtk_menu_get_active (GTK_MENU (menu));
return GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (active)));
}
/* Callback used when the Apply button is clicked. */
static void
prop_apply (GtkWidget *w, int page)
{
if (page != -1)
return;
day_begin = GTK_ADJUSTMENT (sa)->value;
day_end = GTK_ADJUSTMENT (ea)->value;
/* Day begin/end */
day_begin = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (start_omenu)));
day_end = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (end_omenu)));
gnome_config_set_int ("/calendar/Calendar/Day start", day_begin);
gnome_config_set_int ("/calendar/Calendar/Day end", day_end);
am_pm_flag = (GTK_TOGGLE_BUTTON (r1)->active) == 0;
/* Time format */
am_pm_flag = GTK_TOGGLE_BUTTON (time_format_12)->active;
gnome_config_set_bool ("/calendar/Calendar/AM PM flag", am_pm_flag);
gnome_config_sync ();
/* Week start */
day_range_changed ();
week_starts_on_monday = GTK_TOGGLE_BUTTON (start_on_monday)->active;
gnome_config_set_bool ("/calendar/Calendar/Week starts on Monday", week_starts_on_monday);
gnome_config_sync ();
time_format_changed ();
}
/* Notifies the property box that the data has changed */
static void
toggled ()
toggled (GtkWidget *widget, gpointer data)
{
gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win));
}
/* Builds and returns a two-element radio button group surrounded by a frame. The radio buttons are
* stored in the specified variables, and the first radio button's state is set according to the
* specified flag value. The buttons are connected to the toggled() function to update the property
* box's dirty state.
*/
static GtkWidget *
build_two_radio_group (char *title,
char *radio_1_title, GtkWidget **radio_1_widget,
char *radio_2_title, GtkWidget **radio_2_widget,
int radio_1_value)
{
GtkWidget *frame;
GtkWidget *vbox;
frame = gtk_frame_new (title);
vbox = gtk_vbox_new (TRUE, 0);
gtk_container_add (GTK_CONTAINER (frame), vbox);
*radio_1_widget = gtk_radio_button_new_with_label (NULL, radio_1_title);
gtk_box_pack_start (GTK_BOX (vbox), *radio_1_widget, FALSE, FALSE, 0);
*radio_2_widget = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (*radio_1_widget),
radio_2_title);
gtk_box_pack_start (GTK_BOX (vbox), *radio_2_widget, FALSE, FALSE, 0);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (*radio_1_widget), radio_1_value);
gtk_signal_connect (GTK_OBJECT (*radio_1_widget), "toggled",
(GtkSignalFunc) toggled,
NULL);
return frame;
}
/* Callback invoked when a menu item from the start/end time option menus is selected. It adjusts
* the other menu to the proper time, if needed.
*/
static void
hour_activated (GtkWidget *widget, gpointer data)
{
int start, end;
if (data == start_omenu) {
/* Adjust the end menu */
start = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (widget)));
end = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (end_omenu)));
if (end < start)
gtk_option_menu_set_history (GTK_OPTION_MENU (end_omenu), start);
} else if (data == end_omenu) {
/* Adjust the start menu */
end = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (widget)));
start = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (start_omenu)));
if (start > end)
gtk_option_menu_set_history (GTK_OPTION_MENU (start_omenu), end);
} else
g_assert_not_reached ();
}
/* Builds an option menu of 24 hours */
static GtkWidget *
build_hours_menu (GtkWidget **items, int active)
{
GtkWidget *omenu;
GtkWidget *menu;
int i;
char buf[100];
struct tm tm;
omenu = gtk_option_menu_new ();
menu = gtk_menu_new ();
memset (&tm, 0, sizeof (tm));
for (i = 0; i < 24; i++) {
tm.tm_hour = i;
strftime (buf, 100, "%I:%M %p", &tm);
items[i] = gtk_menu_item_new_with_label (buf);
gtk_object_set_user_data (GTK_OBJECT (items[i]), GINT_TO_POINTER (i));
gtk_signal_connect (GTK_OBJECT (items[i]), "activate",
(GtkSignalFunc) hour_activated,
omenu);
gtk_menu_append (GTK_MENU (menu), items[i]);
gtk_widget_show (items[i]);
}
gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), active);
return omenu;
}
/* Creates and displays the preferences dialog for the whole application */
void
properties (void)
{
GtkWidget *t, *l, *ds, *de;
GtkWidget *r2;
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *hbox2;
GtkWidget *hbox3;
GtkWidget *w;
if (prop_win)
return;
/* Main window and hbox for property page */
prop_win = gnome_property_box_new ();
gtk_window_set_title (GTK_WINDOW (prop_win), _("Preferences"));
t = gtk_table_new (0, 0, 0);
gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), t,
gtk_label_new (_("Calendar global parameters")));
hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
gtk_container_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL);
gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), hbox,
gtk_label_new (_("Time display")));
/* Time format */
vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
w = build_two_radio_group (_("Time format"),
_("12-hour (AM/PM)"), &time_format_12,
_("24-hour"), &time_format_24,
am_pm_flag);
gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
/* Weeks start on */
w = build_two_radio_group (_("Weeks start on"),
_("Sunday"), &start_on_sunday,
_("Monday"), &start_on_monday,
!week_starts_on_monday);
gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
/* Day range */
frame = gtk_frame_new (_("Day range"));
gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
gtk_container_border_width (GTK_CONTAINER (vbox), GNOME_PAD_SMALL);
gtk_container_add (GTK_CONTAINER (frame), vbox);
w = gtk_label_new (_("Please select the start and end hours you want\n"
"to be displayed in the day view and week view.\n"
"Times outside this range will not be displayed\n"
"by default."));
gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.0);
gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
hbox2 = gtk_hbox_new (FALSE, GNOME_PAD);
gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
/* Day start */
hbox3 = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
gtk_box_pack_start (GTK_BOX (hbox2), hbox3, FALSE, FALSE, 0);
w = gtk_label_new (_("Day start:"));
gtk_box_pack_start (GTK_BOX (hbox3), w, FALSE, FALSE, 0);
start_omenu = build_hours_menu (start_items, day_begin);
gtk_box_pack_start (GTK_BOX (hbox3), start_omenu, FALSE, FALSE, 0);
/* Day end */
hbox3 = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
gtk_box_pack_start (GTK_BOX (hbox2), hbox3, FALSE, FALSE, 0);
w = gtk_label_new (_("Day end:"));
gtk_box_pack_start (GTK_BOX (hbox3), w, FALSE, FALSE, 0);
end_omenu = build_hours_menu (end_items, day_end);
gtk_box_pack_start (GTK_BOX (hbox3), end_omenu, FALSE, FALSE, 0);
/* Done! */
l = gtk_label_new (_("Day start:"));
gtk_table_attach (GTK_TABLE (t), l,
0, 1, 0, 1, 0, 0, 0, 0);
sa = gtk_adjustment_new (day_begin, 0.0, 25.00, 1.0, 1.0, 1.0);
ds = gtk_hscale_new (GTK_ADJUSTMENT (sa));
gtk_scale_set_digits (GTK_SCALE (ds), 0);
gtk_table_attach (GTK_TABLE (t), ds,
1, 2, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
l = gtk_label_new (_("Day end:"));
gtk_table_attach (GTK_TABLE (t), l,
0, 1, 1, 2, 0, 0, 0, 0);
ea = gtk_adjustment_new (day_end, 0.0, 25.00, 1.0, 1.0, 1.0);
de = gtk_hscale_new (GTK_ADJUSTMENT (ea));
gtk_scale_set_digits (GTK_SCALE (de), 0);
gtk_table_attach (GTK_TABLE (t), de,
1, 2, 1, 2, GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_signal_connect (sa, "value_changed",
GTK_SIGNAL_FUNC (start_changed), ea);
gtk_signal_connect (ea, "value_changed",
GTK_SIGNAL_FUNC (end_changed), sa);
/* Nice spacing :-) */
gtk_table_attach (GTK_TABLE (t), gtk_label_new (""),
0, 1, 2, 3, 0, 0, 0, 0);
r1 = gtk_radio_button_new_with_label (NULL, _("24 hour format"));
r2 = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (r1),
_("12 hour format"));
if (am_pm_flag)
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (r2), 1);
gtk_signal_connect (GTK_OBJECT (r1), "toggled",
GTK_SIGNAL_FUNC (toggled), NULL);
gtk_table_attach (GTK_TABLE (t), align (r1, 0.0), 0, 2, 3, 4, GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_table_attach (GTK_TABLE (t), align (r2, 0.0), 0, 2, 4, 5, GTK_FILL | GTK_EXPAND, 0, 0, 0);
gtk_signal_connect (GTK_OBJECT (prop_win), "destroy",
GTK_SIGNAL_FUNC (prop_cancel), NULL);
(GtkSignalFunc) prop_cancel, NULL);
gtk_signal_connect (GTK_OBJECT (prop_win), "delete_event",
GTK_SIGNAL_FUNC (prop_cancel), NULL);
(GtkSignalFunc) prop_cancel, NULL);
gtk_signal_connect (GTK_OBJECT (prop_win), "apply",
GTK_SIGNAL_FUNC (prop_apply), NULL);
(GtkSignalFunc) prop_apply, NULL);
gtk_widget_show_all (prop_win);
}

View File

@ -1,33 +0,0 @@
/*
* Calendar views.
* Copyright (C) 1998 the Free Software Foundation
*
* Author: Miguel de Icaza (miguel@kernel.org)
*/
#include <gnome.h>
#include "calendar.h"
#include "gnome-cal.h"
GtkWidget *
day_view_create (GnomeCalendar *gcal)
{
return gtk_label_new ("This is supposed to be the Day View");
}
GtkWidget *
week_view_create (GnomeCalendar *gcal)
{
return gtk_label_new ("This is supposed to be the Week View");
}
GtkWidget *
year_view_create (GnomeCalendar *gcal)
{
return gtk_label_new ("This is supposed to be the Year View");
}
GtkWidget *
tasks_create (GnomeCalendar *gcal)
{
return gtk_label_new ("This is supposed to be the Tasks View");
}

View File

@ -1,4 +0,0 @@
GtkWidget *day_view_create (GnomeCalendar *gcal);
GtkWidget *week_view_create (GnomeCalendar *gcal);
GtkWidget *year_view_create (GnomeCalendar *gcal);
GtkWidget *tasks_create (GnomeCalendar *gcal);