]> git.lyx.org Git - lyx.git/blob - src/frontends/xforms/combox.h
Refine yesterday's bug fix a little and apply to the combox also.
[lyx.git] / src / frontends / xforms / combox.h
1 // -*- C++ -*-
2 /**
3  * \file combox.h
4  * Copyright 1996 Alejandro Aguilar Sierra
5  * This file is part of LyX, the document processor.
6  * Licence details can be found in the file COPYING.
7  *
8  * \author Alejandro Aguilar Sierra
9  *
10  * Full author contact details are available in file CREDITS
11  */
12
13 /* A combination of two objects (a button and a browser) is encapsulated to
14  * get a combobox-like object. All XForms functions are hidden.
15  *
16  * Change log:
17  *
18  *  2/06/1996,   Alejandro Aguilar Sierra
19  *    Created and tested.
20  *
21  *  4/06/1996,   Alejandro Aguilar Sierra
22  *    Added droplist mode (a button with a black down arrow at right)
23  *    and support for middle and right buttons, as XForms choice object.
24  */
25
26 #ifndef COMBOX_H
27 #define COMBOX_H
28
29 #ifdef __GNUG__
30 #pragma interface
31 #endif
32
33 #include FORMS_H_LOCATION
34 #include <cstdlib>
35 #include "LString.h"
36
37 ///
38 enum combox_type {
39         ///
40         FL_COMBOX_NORMAL,
41         ///
42         FL_COMBOX_DROPLIST,
43         ///
44         FL_COMBOX_INPUT
45 };
46
47 class Combox;
48
49 /// callback prototype
50 typedef void (*FL_COMBO_CB) (int, void *, Combox *);
51 /// pre post prototype
52 typedef void (*FL_COMBO_PRE_POST) ();
53
54
55 ///
56 class Combox {
57 public:
58         ///
59         explicit Combox(combox_type t = FL_COMBOX_NORMAL);
60         ///
61         ~Combox();
62
63         /** To add this object to a form. Note that there are two heights
64          *  for normal (button) and expanded (browser) mode each.
65          */
66         void add(int x, int y, int w, int hmin, int hmax);
67
68         /// Add lines. Same as for fl_browser object
69         void addline(string const &);
70         /// Add lines. Same as for fl_browser object
71         void addto(string const &);
72
73         /// Returns the selected item
74         int get() const;
75
76         /// Returns a pointer to the selected line of text
77         string const getline() const;
78
79         ///  Select an arbitrary item
80         void select(int);
81         ///
82         bool select(string const &);
83
84         ///  Clear all the list
85         void clear();
86
87         /// Is the combox cleared (empty)
88         bool empty() const { return is_empty; }
89
90         /// Remove the objects from the form they are in.
91         void remove();
92
93         /**
94          * Assign a callback to this object. The callback should be a void
95          * function with a int, a void pointer, and a Combox pointer as
96          * parameters.
97         */
98         void setcallback(FL_COMBO_CB, void *);
99
100         ///  Pre handler
101         void setpre(FL_COMBO_PRE_POST);
102         /// Post handler
103         void setpost(FL_COMBO_PRE_POST);
104
105         ///  XForms attributes
106         void resize(unsigned);
107         ///
108         void gravity(unsigned, unsigned);
109         ///
110         void activate();
111         ///
112         void deactivate();
113         ///
114         void shortcut(string const &, int);
115         ///
116         void redraw();
117         ///
118         void show();
119         ///
120         static void combo_cb(FL_OBJECT *, long);
121         ///
122         static void input_cb(FL_OBJECT *, long);
123         ///
124         static int  peek_event(FL_FORM *, void *);
125  protected:
126         /// At least Hide should not be public
127         void hide(int who = 0);
128         ///
129         FL_OBJECT * browser;
130  private:
131         ///
132         combox_type type;
133         ///
134         int bw;
135         ///
136         int bh;
137         ///
138         int sel;
139         ///
140         bool is_empty;
141         ///
142         FL_COMBO_CB callback;
143         ///
144         void * cb_arg;
145         ///
146         FL_COMBO_PRE_POST _pre;
147         ///
148         FL_COMBO_PRE_POST _post;
149         ///
150         FL_OBJECT * button;
151         ///
152         FL_OBJECT * label;
153         ///
154         FL_FORM* form;
155 };
156
157
158
159 //-----------------  Inline methods  ---------------------------
160
161 inline
162 void Combox::addto(string const & text)
163 {
164         if (browser) {
165                 fl_addto_browser(browser, text.c_str());
166                 is_empty = false;
167         }
168 }
169
170
171 inline
172 void Combox::resize(unsigned r)
173 {
174    fl_set_object_resize(button, r);
175    if (label!= button) fl_set_object_resize(label, r);
176 }
177
178
179 inline
180 void Combox::gravity(unsigned g1, unsigned g2)
181 {
182    fl_set_object_gravity(button, g1, g2);
183    if (label!= button) fl_set_object_gravity(label, g1, g2);
184 }
185
186
187 inline
188 void Combox::shortcut(string const & s, int i)
189 {
190    if (button)
191       fl_set_object_shortcut(button, s.c_str(), i);
192 }
193
194
195 inline
196 void Combox::setcallback(FL_COMBO_CB cb, void * a = 0)
197 {
198    callback = cb;
199    cb_arg = a;
200 }
201
202
203 inline
204 void Combox::setpre(FL_COMBO_PRE_POST cb)
205 {
206         _pre = cb;
207 }
208
209
210 inline
211 void Combox::setpost(FL_COMBO_PRE_POST cb)
212 {
213         _post = cb;
214 }
215
216
217 inline
218 int Combox::get() const
219 {
220    return sel;
221 }
222
223
224 inline
225 string const Combox::getline() const
226 {
227     if (type == FL_COMBOX_INPUT)
228       return fl_get_input(label);
229     else
230       return (browser && sel > 0) ?
231               string(fl_get_browser_line(browser, sel)) : string();
232 }
233
234 #endif