[monkey-bubble: 24/753] GnomeApp widget at least compiles. Try it, it might even not segv :)



commit 26de526e10651c7c72dfd791c85c17f606809ce1
Author: Elliot Lee <sopwith src gnome org>
Date:   Mon Dec 29 21:51:06 1997 +0000

    GnomeApp widget at least compiles. Try it, it might even not segv :)

 libgnomeui/Makefile.am |   10 +-
 libgnomeui/gnome-app.c |  254 ++++++++++++++++++++++++++++++++++++++++++++++++
 libgnomeui/gnome-app.h |   99 +++++++++++++++++++
 3 files changed, 359 insertions(+), 4 deletions(-)
---
diff --git a/libgnomeui/Makefile.am b/libgnomeui/Makefile.am
index b00a649..d7caf42 100644
--- a/libgnomeui/Makefile.am
+++ b/libgnomeui/Makefile.am
@@ -7,20 +7,22 @@ INCLUDES = -I.. -I$(srcdir)/.. -I$(includedir)
 lib_LTLIBRARIES = libgnomeui.la
 
 libgnomeui_la_SOURCES = \
+	gnome-actionarea.c		\
+	gnome-app.c			\
 	gnome-color-selector.c 		\
-	gnome-properties.c		\
+	gnome-colors.c			\
 	gnome-ice.c			\
 	gnome-init.c			\
-	gnome-actionarea.c		\
 	gnome-messagebox.c		\
 	gnome-pixmap.c			\
-	gnome-toolbar.c			\
-	gnome-colors.c			\
+	gnome-properties.c		\
 	gnome-session.c			\
+	gnome-toolbar.c			\
 	gtk-clock.c
 
 libgnomeuiinclude_HEADERS = 		\
         gnome-actionarea.h     		\
+	gnome-app.h			\
 	gnome-color-selector.h 		\
 	gnome-colors.h         		\
 	gnome-ice.h			\
diff --git a/libgnomeui/gnome-app.c b/libgnomeui/gnome-app.c
new file mode 100644
index 0000000..ef8b911
--- /dev/null
+++ b/libgnomeui/gnome-app.c
@@ -0,0 +1,254 @@
+#include "libgnome/gnome-defs.h"
+#include "gnome-app.h"
+#include "gnome-pixmap.h"
+
+static void gnome_app_class_init(GnomeAppClass *klass);
+static void gnome_app_init(GnomeApp *app);
+static void gnome_app_do_menu_creation(GtkWidget *parent_widget,
+				       GnomeMenuInfo *menuinfo);
+static void gnome_app_do_toolbar_creation(GnomeApp *app,
+					  GtkWidget *parent_widget,
+					  GnomeToolbarInfo *tbinfo);
+
+guint
+gnome_app_get_type(void)
+{
+  static guint gnomeapp_type = 0;
+  if(!gnomeapp_type) {
+    GtkTypeInfo gnomeapp_info = {
+      "GnomeApp",
+      sizeof(GnomeApp),
+      sizeof(GnomeAppClass),
+      (GtkClassInitFunc) gnome_app_class_init,
+      (GtkObjectInitFunc) gnome_app_init,
+      (GtkArgFunc) NULL,
+    };
+    gnomeapp_type = gtk_type_unique(gtk_window_get_type(), &gnomeapp_info);
+  }
+  return gnomeapp_type;
+}
+
+static void
+gnome_app_class_init(GnomeAppClass *klass)
+{
+}
+
+static void
+gnome_app_init(GnomeApp *app)
+{
+  app->menubar = app->toolbar = app->contents = NULL;
+
+  app->vtable = gtk_table_new(3, 1, FALSE);
+  gtk_widget_show(app->vtable);
+  app->htable = gtk_table_new(1, 3, FALSE);
+  gtk_widget_show(app->htable);
+}
+
+GtkWidget *
+gnome_app_new(gchar *appname)
+{
+  GtkWidget *retval;
+
+  retval = gtk_type_new(gnome_app_get_type());
+  if(appname)
+    gtk_window_set_title(GTK_WINDOW(retval), appname);
+
+  return retval;
+}
+
+static void
+gnome_app_do_menu_creation(GtkWidget *parent_widget,
+			   GnomeMenuInfo *menuinfo)
+{
+  int i;
+  for(i = 0; menuinfo[i].type != MI_ENDOFINFO; i++)
+    {
+      menuinfo[i].widget = gtk_menu_item_new_with_label(menuinfo[i].label);
+      gtk_widget_show(menuinfo[i].widget);
+      gtk_menu_shell_append(GTK_MENU_SHELL(parent_widget),
+			    menuinfo[i].widget);
+
+      if(menuinfo[i].type == MI_ITEM)
+	{
+	  gtk_signal_connect(GTK_OBJECT(menuinfo[i].widget), "activate",
+			     menuinfo[i].moreinfo, NULL);
+	}
+      else if(menuinfo[i].type == MI_SUBMENU)
+	{
+	  GtkWidget *submenu;
+	  submenu = gtk_menu_new();
+	  gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuinfo[i].widget),
+				    submenu);
+	  gtk_widget_show(submenu);
+	  gnome_app_do_menu_creation(submenu, menuinfo[i].moreinfo);
+	}
+    }
+}
+
+void
+gnome_app_create_menu(GnomeApp *app,
+		      GnomeMenuInfo *menuinfo)
+{
+  GtkWidget *hb;
+  int i;
+
+  g_return_if_fail(app != NULL);
+  g_return_if_fail(GNOME_IS_APP(app));
+  g_return_if_fail(app->menubar == NULL);
+
+  hb = gtk_handle_box_new();
+  gtk_widget_show(hb);
+  app->menubar = gtk_menu_bar_new();
+  gtk_widget_show(app->menubar);
+  gtk_container_add(GTK_CONTAINER(hb), app->menubar);
+
+  if(menuinfo)
+    gnome_app_do_menu_creation(app->menubar, menuinfo);
+
+  gnome_app_set_positions(app,
+			  POS_TOP,
+			  POS_NOCHANGE);
+}
+
+static void
+gnome_app_do_toolbar_creation(GnomeApp *app,
+			      GtkWidget *parent_widget,
+			      GnomeToolbarInfo *tbinfo)
+{
+  int i;
+  GtkWidget *pmap;
+
+  if(!GTK_WIDGET(app)->window)
+    gtk_widget_realize(GTK_WIDGET(app));
+
+  for(i = 0; tbinfo[i].type != TBI_ENDOFINFO; i++)
+    {
+      if(tbinfo[i].type == TBI_ITEM)
+	{
+	  if(tbinfo[i].pixmap_type == PMAP_DATA)
+	    pmap = gnome_create_pixmap_widget_d(GTK_WIDGET(app),
+						parent_widget,
+						(char **)tbinfo[i].pixmap_info);
+	  else if(tbinfo[i].pixmap_type == PMAP_FILENAME)
+	    pmap = gnome_create_pixmap_widget(GTK_WIDGET(app),
+					      parent_widget,
+					      (char *)tbinfo[i].pixmap_info);
+	  else
+	    pmap = NULL;
+	  gtk_toolbar_append_item(GTK_TOOLBAR(parent_widget),
+				  tbinfo[i].text,
+				  tbinfo[i].tooltip_text,
+				  GTK_PIXMAP(pmap),
+				  tbinfo[i].clicked_callback,
+				  NULL);
+	}
+      else if(tbinfo[i].type == TBI_SPACE)
+	{
+	  gtk_toolbar_append_space(GTK_TOOLBAR(parent_widget));
+	}
+    }
+}
+
+void gnome_app_create_toolbar(GnomeApp *app,
+			      GnomeToolbarInfo *toolbarinfo)
+{
+  GtkWidget *hb;
+
+  g_return_if_fail(app != NULL);
+  g_return_if_fail(GNOME_IS_APP(app));
+  g_return_if_fail(app->toolbar == NULL);
+
+  hb = gtk_handle_box_new();
+  gtk_widget_show(hb);
+  app->toolbar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL,
+				 GTK_TOOLBAR_BOTH);
+  gtk_widget_show(app->toolbar);
+  gtk_container_add(GTK_CONTAINER(hb), app->toolbar);
+
+  if(toolbarinfo)
+    gnome_do_toolbar_creation(app, app->toolbar, toolbarinfo);
+
+  gnome_app_set_positions(app,
+			  POS_NOCHANGE,
+			  POS_BOTTOM);
+}
+
+void
+gnome_app_set_positions(GnomeApp *app,
+			GnomeAppWidgetPositionType pos_menubar,
+			GnomeAppWidgetPositionType pos_toolbar)
+{
+  g_return_if_fail(app != NULL);
+  g_return_if_fail(GNOME_IS_APP(app));
+
+  if(pos_menubar != POS_NOCHANGE)
+    {
+      g_return_if_fail(app->menubar != NULL);
+
+      /* It's ->parent->parent because this is inside a GtkHandleBox */
+      if(app->menubar->parent->parent)
+	gtk_container_remove(GTK_CONTAINER(app->menubar->parent->parent),
+			     app->menubar);
+      /* Obviously the menu bar can't have vertical orientation,
+	 so we don't support POS_LEFT or POS_RIGHT. */
+      gtk_table_attach_defaults(GTK_TABLE(app->vtable),
+				app->menubar->parent,
+				FALSE,
+				FALSE,
+				pos_menubar==POS_TOP?TRUE:FALSE,
+				pos_menubar==POS_BOTTOM?TRUE:FALSE);
+
+    }
+
+  if(pos_toolbar != POS_NOCHANGE)
+    {
+      g_return_if_fail(app->toolbar != NULL);
+
+      /* It's ->parent->parent because this is inside a GtkHandleBox */
+      if(app->toolbar->parent->parent)
+	gtk_container_remove(GTK_CONTAINER(app->toolbar->parent->parent),
+			     app->toolbar);
+      if(pos_toolbar == POS_LEFT
+	 || pos_toolbar == POS_RIGHT)
+	{
+	  gtk_table_attach_defaults(GTK_TABLE(app->htable),
+				    app->toolbar->parent,
+				    pos_toolbar==POS_LEFT?TRUE:FALSE,
+				    pos_toolbar==POS_RIGHT?TRUE:FALSE,
+				    FALSE,
+				    FALSE);
+	  gtk_toolbar_set_orientation(GTK_TOOLBAR(app->toolbar),
+				      GTK_ORIENTATION_VERTICAL);
+	}
+      else
+	{
+	  /* assume POS_TOP || POS_BOTTOM */
+	  gtk_table_attach_defaults(GTK_TABLE(app->vtable),
+				    app->toolbar->parent,
+				    FALSE,
+				    FALSE,
+				    pos_toolbar==POS_TOP?TRUE:FALSE,
+				    pos_toolbar==POS_BOTTOM?TRUE:FALSE);
+	  gtk_toolbar_set_orientation(GTK_TOOLBAR(app->toolbar),
+				      GTK_ORIENTATION_HORIZONTAL);
+	}
+    }
+}
+
+void
+gnome_app_set_contents(GnomeApp *app, GtkWidget *contents)
+{
+  g_return_if_fail(app != NULL);
+  g_return_if_fail(GNOME_IS_APP(app));
+
+  if(app->contents != NULL)
+    gtk_container_remove(GTK_CONTAINER(app->htable), app->contents);
+
+  /* Is this going to work at all? I'll wager not */
+  gtk_table_attach_defaults(GTK_TABLE(app->htable),
+			    contents,
+			    FALSE, FALSE,
+			    FALSE, FALSE);
+  app->contents = contents;
+  gtk_widget_show(contents);
+}
diff --git a/libgnomeui/gnome-app.h b/libgnomeui/gnome-app.h
new file mode 100644
index 0000000..abe3ddf
--- /dev/null
+++ b/libgnomeui/gnome-app.h
@@ -0,0 +1,99 @@
+/* GnomeApp widget */
+
+#ifndef GNOME_APP_H
+#define GNOME_APP_H
+
+#include <gtk/gtk.h>
+
+BEGIN_GNOME_DECLS
+
+#define GNOME_APP(obj) GTK_CHECK_CAST(obj, gnome_app_get_type(), GnomeApp)
+#define GNOME_APP_CLASS(class) GTK_CHECK_CAST_CLASS(class, gnome_app_get_type(), GnomeAppClass)
+#define GNOME_IS_APP(obj) GTK_CHECK_TYPE(obj, gnome_app_get_type())
+
+typedef struct _GnomeApp GnomeApp;
+typedef struct _GnomeAppClass GnomeAppClass;        
+
+typedef enum 
+{
+  POS_NOCHANGE = -1,
+  POS_LEFT = 0,
+  POS_RIGHT = 1,
+  POS_TOP = 2,
+  POS_BOTTOM = 3,
+} GnomeAppWidgetPositionType;
+
+typedef enum
+{
+  GAPP_MENUBAR = 1,
+  GAPP_TOOLBAR = 2,
+} GnomeAppWidgetType;
+
+struct _GnomeMenuInfo {
+  enum { MI_ENDOFINFO, MI_ITEM, MI_SUBMENU } type;
+  gchar *label;
+  gpointer moreinfo; /* For a menuitem, this should point to the
+		        procedure to be called when this menu item is
+		        activated.
+
+		        For a submenu, it should point to the
+		        GnomeMenuInfo array for that menu. */
+  GtkWidget *widget; /* This is filled in by gnome_app_create_menu() */
+};
+
+typedef struct _GnomeMenuInfo GnomeMenuInfo;
+
+struct _GnomeToolbarInfo {
+  enum { TBI_ENDOFINFO, TBI_ITEM, TBI_SPACE } type;
+  /* You can leave the rest of these to NULL or whatever if this is an
+     TBI_SPACE */
+  gchar *text;
+  gchar *tooltip_text;
+  enum { PMAP_NONE, PMAP_DATA, PMAP_FILENAME } pixmap_type;
+  gpointer pixmap_info; /* Either a pointer to the char ** for the pixmap
+			   (for PMAP_DATA)
+			   or a char * for the filename (PMAP_FILENAME) */
+  GtkSignalFunc clicked_callback; /* Useful for TB_ITEMs only */ 
+};
+typedef struct _GnomeToolbarInfo GnomeToolbarInfo;
+
+/* Everything gets put into a table that looks like:
+
+   XXX
+   ABC
+   YYY
+
+   There's one table element on top, three in the middle, and one on
+   the bottom.
+
+   Obviously you can change the positions of things as needed
+   using the supplied function.
+ */
+struct _GnomeApp {
+  GtkWindow parent_object;
+  GtkWidget *menubar /* GtkMenuBar */,
+    *toolbar /* GtkToolbar */,
+    *contents /* GtkContainer */;
+  GtkWidget *htable, *vtable; /* The table widgets that hold & pack it all */
+};
+
+struct _GnomeAppClass {
+  GtkWindow parent_class;
+};
+
+guint gnome_app_get_type    (void);
+GtkWidget *gnome_app_new    (gchar *appname);
+/* You can OR the various enums here to have more than one piece
+   created at once */
+void gnome_app_create_menu   (GnomeApp *app,
+			      GnomeMenuInfo *menuinfo);
+void gnome_app_create_toolbar(GnomeApp *app,
+			      GnomeToolbarInfo *tbinfo);
+void gnome_app_set_contents  (GnomeApp *app, GtkWidget *contents);
+void gnome_app_set_positions (GnomeApp *app,
+			      GnomeAppWidgetPositionType pos_menubar,
+			      GnomeAppWidgetPositionType pos_toolbar);
+
+END_GNOME_DECLS
+
+#endif /* GNOME_APP_H */



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