aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/text/e-reflow.h
blob: d6b49064eb487f105986fee6e6a72c9b2e6273ba (plain) (blame)
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
/*
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) version 3.
 *
 * This program 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with the program; if not, see <http://www.gnu.org/licenses/>
 *
 *
 * Authors:
 *      Chris Lahey <clahey@ximian.com>
 *
 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
 *
 */

#ifndef __E_REFLOW_H__
#define __E_REFLOW_H__

#include <libgnomecanvas/libgnomecanvas.h>
#include <text/e-reflow-model.h>
#include <misc/e-selection-model.h>
#include <e-util/e-sorter-array.h>

G_BEGIN_DECLS

/* EReflow - A canvas item container.
 *
 * The following arguments are available:
 *
 * name     type        read/write  description
 * --------------------------------------------------------------------------------
 * minimum_width gdouble         RW              minimum width of the reflow.  width >= minimum_width
 * width        gdouble          R               width of the reflow
 * height       gdouble          RW              height of the reflow
 */

#define E_REFLOW_TYPE           (e_reflow_get_type ())
#define E_REFLOW(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_REFLOW_TYPE, EReflow))
#define E_REFLOW_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST ((klass), E_REFLOW_TYPE, EReflowClass))
#define E_IS_REFLOW(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_REFLOW_TYPE))
#define E_IS_REFLOW_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE ((obj), E_REFLOW_TYPE))

typedef struct EReflowPriv    EReflowPriv;

typedef struct _EReflow       EReflow;
typedef struct _EReflowClass  EReflowClass;

struct _EReflow
{
    GnomeCanvasGroup parent;

    /* item specific fields */
    EReflowModel *model;
    guint model_changed_id;
    guint comparison_changed_id;
    guint model_items_inserted_id;
    guint model_item_removed_id;
    guint model_item_changed_id;

    ESelectionModel *selection;
    guint selection_changed_id;
    guint selection_row_changed_id;
    guint cursor_changed_id;
    ESorterArray *sorter;

    GtkAdjustment *adjustment;
    guint adjustment_changed_id;
    guint adjustment_value_changed_id;
    guint set_scroll_adjustments_id;

    gint *heights;
    GnomeCanvasItem **items;
    gint count;
    gint allocated_count;

    gint *columns;
    gint column_count; /* Number of columnns */

    GnomeCanvasItem *empty_text;
    gchar *empty_message;

    gdouble minimum_width;
    gdouble width;
    gdouble height;

    gdouble column_width;

    gint incarnate_idle_id;
    gint do_adjustment_idle_id;

    /* These are all for when the column is being dragged. */
    gdouble start_x;
    gint which_column_dragged;
    gdouble temp_column_width;
    gdouble previous_temp_column_width;

    gint cursor_row;

    gint reflow_from_column;

    guint column_drag : 1;

    guint need_height_update : 1;
    guint need_column_resize : 1;
    guint need_reflow_columns : 1;

    guint default_cursor_shown : 1;

    guint maybe_did_something : 1;
    guint maybe_in_drag : 1;
    GdkCursor *arrow_cursor;
    GdkCursor *default_cursor;
};

struct _EReflowClass
{
    GnomeCanvasGroupClass parent_class;

    gint (*selection_event) (EReflow *reflow, GnomeCanvasItem *item, GdkEvent *event);
    void (*column_width_changed) (EReflow *reflow, gdouble width);
};

/*
 * To be added to a reflow, an item must have the argument "width" as
 * a Read/Write argument and "height" as a Read Only argument.  It
 * should also do an ECanvas parent reflow request if its size
 * changes.
 */
GType    e_reflow_get_type       (void);

G_END_DECLS

#endif /* __E_REFLOW_H__ */