00001
00002
00003
00004
00005
00006
00007
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "config.h"
00030 #include <glib.h>
00031 #include <gtk/gtk.h>
00032 #include <gtkextra/gtksheet.h>
00033 #include "types.h"
00034 #include "field.h"
00035 #include "dialog_initial.h"
00036 #include "menus.h"
00037 #include "dim_list_menu.h"
00038 #include "fileout.h"
00039
00040 void
00041 main_window (QlContext * qlc)
00042 {
00043 GtkNotebook * notebook;
00044
00045 GtkWidget *list_vbox;
00046
00047 GtkWidget *list_mb;
00048 GtkWidget *data_box;
00049 GtkWidget *qlstatusbar;
00050 GdkPixbuf * qlpixbuf;
00051 GError * qlerr;
00052 gchar * pixpath;
00053
00054 qlc->parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
00055 g_signal_connect (qlc->parent, "delete_event",
00056 G_CALLBACK (file_exit), qlc->parent);
00057 g_signal_connect (qlc->parent, "destroy",
00058 G_CALLBACK (file_exit), qlc->parent);
00059
00060 g_object_set_data (G_OBJECT(qlc->parent),
00061 QLCONTEXT, qlc);
00062 gtk_window_set_position (GTK_WINDOW (qlc->parent),
00063 GTK_WIN_POS_NONE);
00064 gtk_window_set_resizable (GTK_WINDOW (qlc->parent), TRUE);
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 gtk_widget_set_size_request (qlc->parent, 600, 400);
00076
00077 list_mb = build_list_mb (qlc);
00078 list_vbox = gtk_vbox_new (FALSE, 0);
00079 gtk_container_add (GTK_CONTAINER (qlc->parent), list_vbox);
00080 gtk_box_pack_start (GTK_BOX (list_vbox), list_mb, FALSE, TRUE, 0);
00081 qlerr = NULL;
00082 qlc->recent_manager = gtk_recent_manager_new ();
00083
00084 pixpath = g_strconcat (PIXMAPDIR, "/quicklist.xpm", NULL);
00085 qlpixbuf = gdk_pixbuf_new_from_file (pixpath, &qlerr);
00086 g_free (pixpath);
00087 if (qlpixbuf)
00088 {
00089 gtk_window_set_icon (GTK_WINDOW (qlc->parent), qlpixbuf);
00090 gdk_pixbuf_unref (qlpixbuf);
00091 }
00092
00093
00094 data_box = gtk_vbox_new (FALSE, 0);
00095 gtk_box_pack_start (GTK_BOX (list_vbox), data_box, FALSE, TRUE, 0);
00096 notebook = GTK_NOTEBOOK(gtk_notebook_new());
00097 qlc->notebook = notebook;
00098 gtk_notebook_set_scrollable (qlc->notebook, TRUE);
00099 gtk_notebook_popup_enable (qlc->notebook);
00100 gtk_notebook_set_tab_pos (qlc->notebook, GTK_POS_TOP);
00101 gtk_box_pack_start (GTK_BOX(list_vbox),
00102 GTK_WIDGET (qlc->notebook), TRUE, TRUE, 0);
00103 qlstatusbar = gtk_statusbar_new ();
00104 gtk_box_pack_end (GTK_BOX (list_vbox), qlstatusbar, FALSE, FALSE, 0);
00105 gtk_widget_show_all (qlc->parent);
00106 dim_all_menus (qlc);
00107 }
00108
00110 QlContext *
00111 ql_context_init (void)
00112 {
00113 QlContext * qlc;
00114
00115 qlc = g_new0 (QlContext, 1);
00116 qlc->tab_table = g_hash_table_new (g_direct_hash, g_direct_equal);
00117 return qlc;
00118 }
00119
00127 QlContext *
00128 ql_get_context (GtkWidget * widget)
00129 {
00130 QlContext * qlc;
00131 GtkWidget *toplevel;
00132
00133 g_return_val_if_fail (widget, NULL);
00134 toplevel = gtk_widget_get_toplevel (GTK_WIDGET(widget));
00135 if (!toplevel)
00136 return NULL;
00137 if (GTK_WIDGET_TOPLEVEL (toplevel))
00138 {
00139 qlc = (QlContext*) g_object_get_data (G_OBJECT(toplevel), QLCONTEXT);
00140 return qlc;
00141 }
00142 return NULL;
00143 }
00144
00145 static gboolean
00146 ql_filedata_new (QlTabData * tab)
00147 {
00148 g_return_val_if_fail (tab, FALSE);
00149 tab->file = g_new0 (QlFileData, 1);
00150 tab->file->fields = g_hash_table_new (g_direct_hash, g_direct_equal);
00151 return TRUE;
00152 }
00153
00154 static gboolean
00155 ql_viewdata_new (QlTabData * tab)
00156 {
00157 g_return_val_if_fail (tab, FALSE);
00158 tab->view = g_new0 (QlViewData, 1);
00159
00160 return TRUE;
00161 }
00162
00168 QlTabData *
00169 ql_new_tabdata (QlContext * qlc)
00170 {
00171 QlTabData * tab;
00172 gint nindex;
00173
00174 nindex = 0;
00175 tab = g_new0 (QlTabData, 1);
00176 g_return_val_if_fail (ql_viewdata_new (tab), NULL);
00177 g_return_val_if_fail (ql_filedata_new (tab), NULL);
00178 tab->qlc = qlc;
00179 nindex = gtk_notebook_get_n_pages (qlc->notebook);
00180 g_hash_table_insert (qlc->tab_table, GINT_TO_POINTER(nindex), tab);
00181 return tab;
00182 }
00183
00189 QlFileData *
00190 ql_get_filedata (QlContext * qlc)
00191 {
00192 gint index;
00193 QlTabData * tab;
00194
00195 g_return_val_if_fail (qlc, NULL);
00196 g_return_val_if_fail (qlc->notebook, NULL);
00197 index = gtk_notebook_get_current_page (qlc->notebook);
00198 if (index < 0)
00199 return NULL;
00200 tab = (QlTabData*)g_hash_table_lookup (qlc->tab_table,
00201 GINT_TO_POINTER(index));
00202 return tab->file;
00203 }
00204
00205 QlViewData *
00206 ql_get_viewdata (QlContext * qlc)
00207 {
00208 gint index;
00209 QlTabData * tab;
00210
00211 g_return_val_if_fail (qlc, NULL);
00212 g_return_val_if_fail (qlc->notebook, NULL);
00213 index = gtk_notebook_get_current_page (qlc->notebook);
00214 if (index < 0)
00215 return NULL;
00216 tab = (QlTabData*)g_hash_table_lookup (qlc->tab_table,
00217 GINT_TO_POINTER(index));
00218 return tab->view;
00219 }
00220
00221 QlTabData *
00222 ql_get_tabdata (QlContext * qlc)
00223 {
00224 gint index;
00225 QlTabData * tab;
00226
00227 g_return_val_if_fail (qlc, NULL);
00228 g_return_val_if_fail (qlc->notebook, NULL);
00229 index = gtk_notebook_get_current_page (qlc->notebook);
00230 if (index < 0)
00231 return NULL;
00232 tab = (QlTabData*)g_hash_table_lookup (qlc->tab_table,
00233 GINT_TO_POINTER(index));
00234 return tab;
00235 }
00236
00237 QlFieldInfo *
00238 ql_get_fieldinfo (QlTabData * tab, gint field_index)
00239 {
00240 QlFieldInfo * field;
00241
00242 g_return_val_if_fail (tab, NULL);
00243 field = (QlFieldInfo*)g_hash_table_lookup (tab->file->fields,
00244 GINT_TO_POINTER(field_index));
00245 return field;
00246 }
00247
00248 gboolean
00249 ql_add_fieldinfo (QlTabData * tab, QlFieldInfo * field)
00250 {
00251 gint size;
00252 g_return_val_if_fail (tab, FALSE);
00253 g_return_val_if_fail (field, FALSE);
00254 size = g_hash_table_size (tab->file->fields);
00255 g_hash_table_insert (tab->file->fields, GINT_TO_POINTER(size) ,field);
00256 return TRUE;
00257 }
00258
00259 gboolean
00260 ql_set_fieldinfo (QlTabData * tab, QlFieldInfo * field, gint field_index)
00261 {
00262 g_return_val_if_fail (tab, FALSE);
00263 g_return_val_if_fail (field, FALSE);
00264 g_return_val_if_fail (g_hash_table_lookup(tab->file->fields,
00265 GINT_TO_POINTER(field_index)), FALSE);
00266 g_hash_table_replace (tab->file->fields, GINT_TO_POINTER (field_index), field);
00267 return TRUE;
00268 }
00269
00270 void
00271 ql_remove_fieldinfo (QlTabData * tab, gint field_index)
00272 {
00273 g_return_if_fail (tab);
00274 g_return_if_fail (g_hash_table_lookup(tab->file->fields,
00275 GINT_TO_POINTER(field_index)));
00276 g_hash_table_remove (tab->file->fields, GINT_TO_POINTER (field_index));
00277 }
00278
00279 gint
00280 ql_get_last_field (QlTabData * tab)
00281 {
00282 g_return_val_if_fail (tab, -1);
00283 return g_hash_table_size (tab->file->fields);
00284 }
00285
00286 void
00287 ql_fieldinfo_foreach (QlTabData * tab, QlFieldInfoCB cb, gpointer user_data)
00288 {
00289 g_return_if_fail (tab);
00290 g_hash_table_foreach (tab->file->fields, cb, user_data);
00291 }
00292
00293 void
00294 ql_free_context (QlContext *qlc)
00295 {
00296 g_return_if_fail (qlc);
00297 g_hash_table_destroy (qlc->tab_table);
00298 g_object_unref (qlc->recent_manager);
00299 }