1 /* -*- Mode: C; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 3 -*- */
2 
3 /*
4  * gimv_elist.c - a set of clist and edit area widget.
5  * Copyright (C) 2001-2002 Takuro Ashie
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 3S30, Boston, MA 02111-1307, USA.
20  *
21  * $Id: gimv_elist.h,v 1.4 2004/03/07 11:53:30 makeinu Exp $
22  */
23 
24 
25 #ifndef __GIMV_ELIST_H__
26 #define __GIMV_ELIST_H__
27 
28 #ifdef HAVE_CONFIG_H
29 #  include <config.h>
30 #endif /* HAVE_CONFIG_H */
31 
32 #include <gtk/gtk.h>
33 #include "gtk2-compat.h"
34 
35 #define GIMV_ELIST(obj)         GTK_CHECK_CAST (obj, gimv_elist_get_type (), GimvEList)
36 #define GIMV_ELIST_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gimv_elist_get_type, GimvEListClass)
37 #define GIMV_IS_ELIST(obj)      GTK_CHECK_TYPE (obj, gimv_elist_get_type ())
38 
39 
40 typedef struct GimvEList_Tag      GimvEList;
41 typedef struct GimvEListClass_Tag GimvEListClass;
42 
43 typedef struct GimvEListColumnFuncTable_Tag GimvEListColumnFuncTable;
44 
45 
46 typedef enum {
47    GIMV_ELIST_EDIT_AREA_VALUE_INITIALIZED = 1 << 0,
48    GIMV_ELIST_EDIT_AREA_VALUE_CHANGED     = 1 << 1,
49 } GimvEListEditAreaFlags;
50 
51 
52 typedef enum {
53    GIMV_ELIST_CONFIRM_CANNOT_NEW    = 1 << 0,
54    GIMV_ELIST_CONFIRM_CANNOT_ADD    = 1 << 1,
55    GIMV_ELIST_CONFIRM_CANNOT_CHANGE = 1 << 2,
56    GIMV_ELIST_CONFIRM_CANNOT_DELETE = 1 << 3
57 } GimvEListConfirmFlags;
58 
59 
60 typedef enum {
61    GIMV_ELIST_ACTION_RESET,
62    GIMV_ELIST_ACTION_ADD,
63    GIMV_ELIST_ACTION_CHANGE,
64    GIMV_ELIST_ACTION_DELETE,
65    GIMV_ELIST_ACTION_SET_SENSITIVE,
66 } GimvEListActionType;
67 
68 
69 typedef void      (*GimvEListSetDataFn)      (GimvEList *editlist,
70                                               GtkWidget    *widget,
71                                               gint          row, /* -1 if no item is selected */
72                                               gint          col,
73                                               const gchar  *text,/* NULL if no item is selected */
74                                               gpointer      coldata);
75 typedef gchar    *(*GimvEListGetDataFn)      (GimvEList *editlist,
76                                               GimvEListActionType type,
77                                               GtkWidget    *widget,
78                                               gpointer      coldata);
79 typedef void      (*GimvEListResetFn)        (GimvEList *editlist,
80                                               GtkWidget    *widget,
81                                               gpointer      coldata);
82 typedef gboolean  (*GimvEListGetRowDataFn)   (GimvEList *editlist,
83                                               GimvEListActionType type,
84                                               gpointer     *rowdata,
85                                               GtkDestroyNotify *destroy_fn);
86 
87 
88 struct GimvEList_Tag {
89    GtkVBox      parent;
90 
91    /* public (read only) */
92    GtkWidget   *clist;
93 
94    GtkWidget   *new_button;
95    GtkWidget   *add_button;
96    GtkWidget   *change_button;
97    GtkWidget   *del_button;
98    GtkWidget   *up_button;
99    GtkWidget   *down_button;
100 
101    GtkWidget   *edit_area;
102    GtkWidget   *move_button_area;
103    GtkWidget   *action_button_area;
104 
105    /* private */
106    gint         max_row;
107    gint         columns;
108    gint         rows;
109    gint         selected;
110    gint         dest_row;
111 
112    GimvEListEditAreaFlags     edit_area_flags;
113    GimvEListColumnFuncTable **column_func_tables;
114    GimvEListGetRowDataFn      get_rowdata_fn;
115 
116 #if (GTK_MAJOR_VERSION >= 2)
117    GHashTable *rowdata_table;
118    GHashTable *rowdata_destroy_fn_table;
119 #endif /* (GTK_MAJOR_VERSION >= 2) */
120 };
121 
122 
123 struct GimvEListClass_Tag {
124    GtkVBoxClass parent_class;
125 
126    void     (*list_updated)       (GimvEList *editlist);
127    void     (*edit_area_set_data) (GimvEList *editlist);
128    void     (*action_confirm)     (GimvEList *editlist,
129                                    GimvEListActionType    action_type,
130                                    gint                      selected_row,
131                                    GimvEListConfirmFlags *flags);
132 };
133 
134 
135 struct GimvEListColumnFuncTable_Tag {
136    GtkWidget        *widget;
137    gpointer          coldata;
138    GtkDestroyNotify  destroy_fn;
139 
140    /* will be called when an item is selected (or unselected) */
141    GimvEListSetDataFn        set_data_fn;
142 
143    /* will be called when an action button is pressed */
144    GimvEListGetDataFn        get_data_fn;
145    GimvEListResetFn          reset_fn;
146 };
147 
148 
149 GtkType       gimv_elist_get_type              (void);
150 GtkWidget    *gimv_elist_new                   (gint          colnum);
151 GtkWidget    *gimv_elist_new_with_titles       (gint          colnum,
152                                                 gchar        *titles[]);
153 void          gimv_elist_set_column_title_visible
154                                                (GimvEList *editlist,
155                                                 gboolean      visible);
156 void          gimv_elist_set_reorderable       (GimvEList *editlist,
157                                                 gboolean      reorderble);
158 gboolean      gimv_elist_get_reorderable       (GimvEList *editlist);
159 void          gimv_elist_set_auto_sort         (GimvEList *editlist,
160                                                 gint          column);
161 gint          gimv_elist_append_row            (GimvEList *editlist,
162                                                 gchar        *data[]);
163 void          gimv_elist_remove_row            (GimvEList *editlist,
164                                                 gint          row);
165 gint          gimv_elist_get_n_rows            (GimvEList *editlist);
166 gint          gimv_elist_get_selected_row      (GimvEList *editlist);
167 gchar       **gimv_elist_get_row_text          (GimvEList *editlist,
168                                                 gint          row);
169 gchar        *gimv_elist_get_cell_text         (GimvEList *ditlist,
170                                                 gint          row,
171                                                 gint          col);
172 #if 0
173 void          gimv_elist_set_row_text          (GimvEList *ditlist,
174                                                 gint          row,
175                                                 gchar        *data[]);
176 void          gimv_elist_set_cell_text         (GimvEList *ditlist,
177                                                 gint          row,
178                                                 gint          col,
179                                                 gchar        *data);
180 #endif
181 void          gimv_elist_set_row_data          (GimvEList *editlist,
182                                                 gint          row,
183                                                 gpointer      data);
184 void          gimv_elist_set_row_data_full     (GimvEList *editlist,
185                                                 gint          row,
186                                                 gpointer      data,
187                                                 GtkDestroyNotify destroy_fn);
188 gpointer      gimv_elist_get_row_data          (GimvEList *editlist,
189                                                 gint          row);
190 void          gimv_elist_unselect_all          (GimvEList *editlist);
191 void          gimv_elist_set_max_row           (GimvEList *editlist,
192                                                 gint          rownum);
193 void          gimv_elist_set_column_funcs      (GimvEList *editlist,
194                                                 GtkWidget    *widget,
195                                                 gint          column,
196                                                 GimvEListSetDataFn set_data_fn,
197                                                 GimvEListGetDataFn get_data_fn,
198                                                 GimvEListResetFn   reset_fn,
199                                                 gpointer      coldata,
200                                                 GtkDestroyNotify destroy_fn);
201 void          gimv_elist_set_get_row_data_func (GimvEList *editlist,
202                                                 GimvEListGetRowDataFn get_rowdata_func);
203 void          gimv_elist_edit_area_set_value_changed
204                                                (GimvEList *editlist);
205 GimvEListConfirmFlags gimv_elist_action_confirm
206                                                (GimvEList *editlist,
207                                                 GimvEListActionType type);
208 void          gimv_elist_set_action_button_sensitive
209                                                (GimvEList *editlist);
210 
211 
212 /* entry */
213 GtkWidget    *gimv_elist_create_entry          (GimvEList *editlist,
214                                                 gint          column,
215                                                 const gchar  *init_string,
216                                                 gboolean      allow_empty);
217 
218 /* file name entry */
219 /*
220 GtkWidget    *gimv_elist_create_file_entry     (GimvEList *editlist,
221                                                 gint          column,
222                                                 const gchar  *init_string,
223                                                 gboolean      allow_empty)
224 */
225 
226 /* combo */
227 /*
228 GtkWidget    *gimv_elist_create_combo          (GimvEList *editlist,
229                                                 gint column);
230 */
231 
232 /* check button */
233 GtkWidget    *gimv_elist_create_check_button   (GimvEList *editlist,
234                                                 gint          column,
235                                                 const gchar  *label,
236                                                 gboolean      init_value,
237                                                 const gchar  *true_string,
238                                                 const gchar  *false_string);
239 
240 /* spinner */
241 /*
242 GtkWidget    *gimv_elist_create_spinner        (GimvEList *editlist,
243                                                 gint column,
244                                                 gfloat init_val,
245                                                 gflost min, gloat max,
246                                                 gboolean set_as_integer);
247 */
248 
249 #endif /* __GIMV_ELIST_H__ */
250