summaryrefslogtreecommitdiff
path: root/gtk/gtkclist.h
blob: 164e2070c5a7668b0952ecef47f657c9ae761924 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
/* GTK - The GIMP Toolkit
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald
 * Copyright (C) 1997-1998 Jay Painter <jpaint@serv.net><jpaint@gimp.org>
 *
 * 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_CLIST_H__
#define __GTK_CLIST_H__

#include <gdk/gdk.h>
#include <gtk/gtksignal.h>
#include <gtk/gtkalignment.h>
#include <gtk/gtklabel.h>
#include <gtk/gtkbutton.h>
#include <gtk/gtkhscrollbar.h>
#include <gtk/gtkvscrollbar.h>

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

/* clist flags */
enum                    
{
  CLIST_FROZEN          = 1 << 0,                                     
  CLIST_IN_DRAG         = 1 << 1,                                        
  CLIST_ROW_HEIGHT_SET  = 1 << 2,
  CLIST_SHOW_TITLES     = 1 << 3
}; 

/* cell types */
typedef enum
{
  GTK_CELL_EMPTY,
  GTK_CELL_TEXT,
  GTK_CELL_PIXMAP,
  GTK_CELL_PIXTEXT,
  GTK_CELL_WIDGET
} GtkCellType;

#define GTK_CLIST(obj)          GTK_CHECK_CAST (obj, gtk_clist_get_type (), GtkCList)
#define GTK_CLIST_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, gtk_clist_get_type (), GtkCListClass)
#define GTK_IS_CLIST(obj)       GTK_CHECK_TYPE (obj, gtk_clist_get_type ())

#define GTK_CLIST_FLAGS(clist)             (GTK_CLIST (clist)->flags)
#define GTK_CLIST_SET_FLAGS(clist,flag)    (GTK_CLIST_FLAGS (clist) |= (flag))
#define GTK_CLIST_UNSET_FLAGS(clist,flag)  (GTK_CLIST_FLAGS (clist) &= ~(flag))

#define GTK_CLIST_FROZEN(clist)            (GTK_CLIST_FLAGS (clist) & CLIST_FROZEN)
#define GTK_CLIST_IN_DRAG(clist)           (GTK_CLIST_FLAGS (clist) & CLIST_IN_DRAG)
#define GTK_CLIST_ROW_HEIGHT_SET(clist)    (GTK_CLIST_FLAGS (clist) & CLIST_ROW_HEIGHT_SET)
#define GTK_CLIST_SHOW_TITLES(clist)       (GTK_CLIST_FLAGS (clist) & CLIST_SHOW_TITLES)

/* pointer casting for cells */
#define GTK_CELL_TEXT(cell)     (((GtkCellText *) &(cell)))
#define GTK_CELL_PIXMAP(cell)   (((GtkCellPixmap *) &(cell)))
#define GTK_CELL_PIXTEXT(cell)  (((GtkCellPixText *) &(cell)))
#define GTK_CELL_WIDGET(cell)   (((GtkCellWidget *) &(cell)))

typedef struct _GtkCList GtkCList;
typedef struct _GtkCListClass GtkCListClass;
typedef struct _GtkCListColumn GtkCListColumn;
typedef struct _GtkCListRow GtkCListRow;

typedef struct _GtkCell GtkCell;
typedef struct _GtkCellText GtkCellText;
typedef struct _GtkCellPixmap GtkCellPixmap;
typedef struct _GtkCellPixText GtkCellPixText;
typedef struct _GtkCellWidget GtkCellWidget;

struct _GtkCList
{
  GtkContainer container;
  
  guint8 flags;

  /* mem chunks */
  GMemChunk *row_mem_chunk;
  GMemChunk *cell_mem_chunk;

  /* allocation rectangle after the conatiner_border_width
   * and the width of the shadow border */
  GdkRectangle internal_allocation;

  /* rows */
  gint rows;
  gint row_center_offset;
  gint row_height;
  GList *row_list;
  GList *row_list_end;
  
  /* columns */
  gint columns;
  GdkRectangle column_title_area;
  GdkWindow *title_window;
  
  /* dynamicly allocated array of column structures */
  GtkCListColumn *column;
  
  /*the scrolling window and it's height and width to
   * make things a little speedier */
  GdkWindow *clist_window;
  gint clist_window_width;
  gint clist_window_height;
  
  /* offsets for scrolling */
  gint hoffset;
  gint voffset;
  
  /* border shadow style */
  GtkShadowType shadow_type;
  
  /* the list's selection mode (gtkenums.h) */
  GtkSelectionMode selection_mode;

  /* list of selected rows */
  GList *selection;

  /* scrollbars */
  GtkWidget *vscrollbar;
  GtkWidget *hscrollbar;
  guint8 vscrollbar_policy;
  guint8 hscrollbar_policy;

  /* xor GC for the vertical drag line */
  GdkGC *xor_gc;

  /* gc for drawing unselected cells */
  GdkGC *fg_gc;
  GdkGC *bg_gc;

  /* cursor used to indicate dragging */
  GdkCursor *cursor_drag;

  /* the current x-pixel location of the xor-drag line */
  gint x_drag;
};

struct _GtkCListClass
{
  GtkContainerClass parent_class;
  
  void (*select_row) (GtkCList * clist,
		      gint row,
		      gint column,
		      GdkEventButton * event);
  void (*unselect_row) (GtkCList * clist,
			gint row,
			gint column,
			GdkEventButton * event);
  void (*click_column) (GtkCList * clist,
			gint column);

  gint scrollbar_spacing;
};

struct _GtkCListColumn
{
  gchar *title;
  GdkRectangle area;
  
  GtkWidget *button;
  GdkWindow *window;

  gint width;
  GtkJustification justification;

  gint width_set : 1;
};

struct _GtkCListRow
{
  GtkCell *cell;
  GtkStateType state;

  GdkColor foreground;
  GdkColor background;

  gpointer data;

  gint fg_set : 1;
  gint bg_set : 1;
};

/* Cell Structures */
struct _GtkCellText
{
  GtkCellType type;
  
  gint vertical;
  gint horizontal;
  
  gchar *text;
};

struct _GtkCellPixmap
{
  GtkCellType type;
  
  gint vertical;
  gint horizontal;
  
  GdkPixmap *pixmap;
  GdkBitmap *mask;
};

struct _GtkCellPixText
{
  GtkCellType type;
  
  gint vertical;
  gint horizontal;
  
  gchar *text;
  guint8 spacing;
  GdkPixmap *pixmap;
  GdkBitmap *mask;
};

struct _GtkCellWidget
{
  GtkCellType type;
  
  gint vertical;
  gint horizontal;
  
  GtkWidget *widget;
};

struct _GtkCell
{
  GtkCellType type;

  gint vertical;
  gint horizontal;

  union {
    gchar *text;

    struct {
      GdkPixmap *pixmap;
      GdkBitmap *mask;
    } pm;

    struct {
      gchar *text;
      guint8 spacing;
      GdkPixmap *pixmap;
      GdkBitmap *mask;
    } pt;

    GtkWidget *widget;
  } u;
};

guint gtk_clist_get_type (void);

/* create a new GtkCList */
GtkWidget *gtk_clist_new (int columns);
GtkWidget *gtk_clist_new_with_titles (int columns,
				      gchar * titles[]);

/* set the border style of the clist */
void gtk_clist_set_border (GtkCList * clist,
			   GtkShadowType border);

/* set the clist's selection mode */
void gtk_clist_set_selection_mode (GtkCList * clist,
				   GtkSelectionMode mode);

/* set policy on the scrollbar, to either show them all the time
 * or show them only when they are needed, ie., when there is more than one page
 * of information */
void gtk_clist_set_policy (GtkCList * clist,
			   GtkPolicyType vscrollbar_policy,
			   GtkPolicyType hscrollbar_policy);

/* freeze all visual updates of the list, and then thaw the list after you have made
 * a number of changes and the updates wil occure in a more efficent mannor than if
 * you made them on a unfrozen list */
void gtk_clist_freeze (GtkCList * clist);
void gtk_clist_thaw (GtkCList * clist);

/* show and hide the column title buttons */
void gtk_clist_column_titles_show (GtkCList * clist);
void gtk_clist_column_titles_hide (GtkCList * clist);

/* set the column title to be a active title (responds to button presses, 
 * prelights, and grabs keyboard focus), or passive where it acts as just
 * a title */
void gtk_clist_column_title_active (GtkCList * clist,
				     gint column);
void gtk_clist_column_title_passive (GtkCList * clist,
				     gint column);
void gtk_clist_column_titles_active (GtkCList * clist);
void gtk_clist_column_titles_passive (GtkCList * clist);

/* set the title in the column title button */
void gtk_clist_set_column_title (GtkCList * clist,
				 gint column,
				 gchar * title);

/* set a widget instead of a title for the column title button */
void gtk_clist_set_column_widget (GtkCList * clist,
				  gint column,
				  GtkWidget * widget);

/* set the justification on a column */
void gtk_clist_set_column_justification (GtkCList * clist,
					 gint column,
					 GtkJustification justification);

/* set the pixel width of a column; this is a necessary step in
 * creating a CList because otherwise the column width is chozen from
 * the width of the column title, which will never be right */
void gtk_clist_set_column_width (GtkCList * clist,
				 gint column,
				 gint width);

/* change the height of the rows, the default is the hight of the current
 * font */
void gtk_clist_set_row_height (GtkCList * clist,
			       gint height);

/* scroll the viewing area of the list to the given column
 * and row; row_align and col_align are between 0-1 representing the
 * location the row should appear on the screnn, 0.0 being top or left,
 * 1.0 being bottom or right; if row or column is -1 then then there
 * is no change */
void gtk_clist_moveto (GtkCList * clist,
		       gint row,
		       gint column,
		       gfloat row_align,
		       gfloat col_align);

/* returns true if the row is visible */
gint gtk_clist_row_isvisable (GtkCList * clist,
			      gint row);

/* returns the cell type */
GtkCellType gtk_clist_get_cell_type (GtkCList * clist,
				     gint row,
				     gint column);

/* sets a given cell's text, replacing it's current contents */
void gtk_clist_set_text (GtkCList * clist,
			 gint row,
			 gint column,
			 gchar * text);

/* for the "get" functions, any of the return pointer can be
 * NULL if you are not interested */
gint gtk_clist_get_text (GtkCList * clist,
			 gint row,
			 gint column,
			 gchar ** text);

/* sets a given cell's pixmap, replacing it's current contents */
void gtk_clist_set_pixmap (GtkCList * clist,
			   gint row,
			   gint column,
			   GdkPixmap * pixmap,
			   GdkBitmap * mask);

gint gtk_clist_get_pixmap (GtkCList * clist,
			   gint row,
			   gint column,
			   GdkPixmap ** pixmap,
			   GdkBitmap ** mask);

/* sets a given cell's pixmap and text, replacing it's current contents */
void gtk_clist_set_pixtext (GtkCList * clist,
			    gint row,
			    gint column,
			    gchar * text,
			    guint8 spacing,
			    GdkPixmap * pixmap,
			    GdkBitmap * mask);

gint gtk_clist_get_pixtext (GtkCList * clist,
			    gint row,
			    gint column,
			    gchar ** text,
			    guint8 * spacing,
			    GdkPixmap ** pixmap,
			    GdkBitmap ** mask);

/* sets the foreground color of a row, the colar must already
 * be allocated */
void gtk_clist_set_foreground (GtkCList * clist,
			       gint row,
			       GdkColor * color);

/* sets the background color of a row, the colar must already
 * be allocated */
void gtk_clist_set_background (GtkCList * clist,
			       gint row,
			       GdkColor * color);

/* this sets a horizontal and vertical shift for drawing
 * the contents of a cell; it can be positive or negitive; this is
 * partuculary useful for indenting items in a column */
void gtk_clist_set_shift (GtkCList * clist,
			  gint row,
			  gint column,
			  gint vertical,
			  gint horizontal);

/* append returns the index of the row you just added, making
 * it easier to append and modify a row */
gint gtk_clist_append (GtkCList * clist,
		       gchar * text[]);

/* inserts a row at index row */
void gtk_clist_insert (GtkCList * clist,
		       gint row,
		       gchar * text[]);

/* removes row at index row */
void gtk_clist_remove (GtkCList * clist,
		       gint row);

/* sets a arbitrary data pointer for a given row */
void gtk_clist_set_row_data (GtkCList * clist,
			     gint row,
			     gpointer data);

/* returns the data set for a row */
gpointer gtk_clist_get_row_data (GtkCList * clist,
				 gint row);

/* givin a data pointer, find the first (and hopefully only!)
 * row that points to that data, or -1 if none do */
gint gtk_clist_find_row_from_data (GtkCList * clist,
				   gpointer data);

/* force selection of a row */
void gtk_clist_select_row (GtkCList * clist,
			   gint row,
			   gint column);

/* force unselection of a row */
void gtk_clist_unselect_row (GtkCList * clist,
			     gint row,
			     gint column);

/* clear the entire list -- this is much faster than removing each item 
 * with gtk_clist_remove */
void gtk_clist_clear (GtkCList * clist);

#ifdef __cplusplus
}
#endif				/* __cplusplus */


#endif				/* __GTK_CLIST_H__ */