GtkDate



Hey,

I had no clue which list to post this to.  I made a quick and dirty
alternative to GtkCalendar that due to screen area usage fits more
nicely into a program I'm working on (I'm porting a console program to
GTK).  I decided to post the widget to this list just to see what kind
of response it gets.  I may be writing more widgets and would like to
keep them consistent with the GTK style.  I don't know if I should
refrain from using gtk_* as functions and names.  I wouldn't want to
interfere with potential future widgets.

One more thing, is there currently a listing of third party widgets or
possibly a place to download third party widgets?  If not, I am
willing to compile a list and pointers to websites of third party
widgets if people e-mail me the site of the widget and what license
the widgets are under.

I'm attaching this as 3 files because gmail for some reason is not
letting me send over tar.gz files.  sorry

-- 
Irtza Sharif
/* GtkDate
 * By Irtza Sharif
 *
 * LGPL stuff taken from code
 *   Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the Free
 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "gtkdate.h"
#include <gtk/gtklabel.h>
#include <gtk/gtkvbox.h>

static GtkWidgetClass *parent_class = NULL;

static void
gtk_date_class_init (GtkDateClass *class)
{
  parent_class = gtk_type_class (gtk_hbox_get_type ());
}

static void
gtk_date_init(GtkDate *date)
{
  date->day = NULL;
  date->month = NULL;
  date->year = NULL;
}

void
gtk_date_month_changed_handler(GtkDate *date) {
  gint month = gtk_combo_box_get_active(date->month);
  gint max_day;

  switch (month) {
    case 3:
    case 5:
    case 8:
    case 10:
      max_day = 30;
      break;
    case 1:
      max_day = 28;
      break;
    default:
      max_day = 31;
  }

  gtk_spin_button_set_range(date->day, 1, max_day);
}

GType
gtk_date_get_type ()
{
  static GType date_type = 0;

  if (!date_type)
    {
      static GTypeInfo date_info =
      {
	sizeof (GtkDateClass),
	NULL,
	NULL,
	(GClassInitFunc) gtk_date_class_init,
	NULL,
	NULL,
	sizeof (GtkDate),
	0,
	(GInstanceInitFunc) gtk_date_init,
      };

      date_type = g_type_register_static (gtk_hbox_get_type (), "GtkDate", &date_info, 0);
      //date_type = g_type_register_static(gtk_hbox_get_type(), "GtkDate", &date_info);
    }

  return date_type;
}


GtkWidget *gtk_date_new()
{
  GtkDate *date;
  GtkVBox *vbox;
  GtkLabel *label;
  GtkHBox *hbox;

  date = gtk_type_new(gtk_date_get_type());

  hbox = GTK_HBOX(date);

  date->day = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range(1, 31, 1));
  date->year = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range(1000, 9999, 1));
  date->month = GTK_COMBO_BOX(gtk_combo_box_new_text());
  gtk_combo_box_append_text(date->month, "January");
  gtk_combo_box_append_text(date->month, "February");
  gtk_combo_box_append_text(date->month, "March");
  gtk_combo_box_append_text(date->month, "April");
  gtk_combo_box_append_text(date->month, "May");
  gtk_combo_box_append_text(date->month, "June");
  gtk_combo_box_append_text(date->month, "July");
  gtk_combo_box_append_text(date->month, "August");
  gtk_combo_box_append_text(date->month, "September");
  gtk_combo_box_append_text(date->month, "October");
  gtk_combo_box_append_text(date->month, "November");
  gtk_combo_box_append_text(date->month, "December");
  gtk_combo_box_set_active(date->month, 0);

  gtk_widget_show(GTK_WIDGET(date->year));
  gtk_widget_show(GTK_WIDGET(date->month));
  gtk_widget_show(GTK_WIDGET(date->day));

  vbox = GTK_VBOX(gtk_vbox_new(FALSE, 0));
  label = GTK_LABEL(gtk_label_new("Day"));
  gtk_widget_show(GTK_WIDGET(label));
  gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(label), TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(date->day), TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), TRUE, TRUE, 0);
  gtk_widget_show(GTK_WIDGET(vbox));

  vbox = GTK_VBOX(gtk_vbox_new(FALSE, 0));
  label = GTK_LABEL(gtk_label_new("Month"));
  gtk_widget_show(GTK_WIDGET(label));
  gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(label), TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(date->month), TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), TRUE, TRUE, 0);
  gtk_widget_show(GTK_WIDGET(vbox));

  vbox = GTK_VBOX(gtk_vbox_new(FALSE, 0));
  label = GTK_LABEL(gtk_label_new("Year"));
  gtk_widget_show(GTK_WIDGET(label));
  gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(label), TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(date->year), TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), TRUE, TRUE, 0);
  gtk_widget_show(GTK_WIDGET(vbox));

  gtk_widget_show(GTK_WIDGET(date->year));
  gtk_widget_show(GTK_WIDGET(date->month));
  gtk_widget_show(GTK_WIDGET(date->day));

  g_signal_connect_swapped(GTK_OBJECT(date->month), "changed", G_CALLBACK(gtk_date_month_changed_handler), date);


  return GTK_WIDGET(date);
}

void
gtk_date_set(GtkDate *date, gint y, gint m, gint d)
{
  gtk_spin_button_set_value(date->year, (gdouble) y);
  gtk_spin_button_set_value(date->day, (gdouble) d);
  gtk_combo_box_set_active(date->month, m - 1);
}

void
gtk_date_get(GtkDate *date, gint *y, gint *m, gint *d)
{
  *y = gtk_spin_button_get_value_as_int(date->year);
  *d = gtk_spin_button_get_value_as_int(date->day);
  *m = 1+ gtk_combo_box_get_active(date->month);
}
/* GtkDate
 * By Irtza Sharif
 *
 * LGPL stuff taken from code
 *   Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the Free
 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#ifndef __GTK_DATE_H__
#define __GTK_DATE_H__


#include <gtk/gtkwidget.h>
#include <gtk/gtkhbox.h>
#include <gtk/gtkcombobox.h>
#include <gtk/gtkspinbutton.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */


#define GTK_DATE(obj)		GTK_CHECK_CAST (obj, gtk_date_get_type (), GtkDate)
#define GTK_DATE_CLASS(klass)	GTK_CHECK_CLASS_CAST (klass, gtk_date_get_type (), GtkDateClass)
#define GTK_IS_DATE(obj)	GTK_CHECK_TYPE (obj, gtk_date_get_type ())

typedef struct _GtkDate		GtkDate;
typedef struct _GtkDateClass 	GtkDateClass;

struct _GtkDate
{
  GtkHBox hbox;
  GtkSpinButton *day;
  GtkComboBox *month;
  GtkSpinButton *year;
};

struct _GtkDateClass
{
  GtkHBoxClass parent_class;
};

GtkWidget *gtk_date_new();
void gtk_date_set(GtkDate *date, gint y, gint m, gint d);
void gtk_date_get(GtkDate *date, gint *y, gint *m, gint *d);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __GTK_DATE_H__ */

Attachment: Makefile
Description: Binary data



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]