1 /*
2 * ===========================
3 * VDK Visual Development Kit
4 * Version 0.4
5 * October 1998
6 * ===========================
7 *
8 * Copyright (C) 1998, Mario Motta
9 * Developed by Mario Motta <mmotta@guest.net>
10 *
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Library General Public
13 * License as published by the Free Software Foundation; either
14 * version 2 of the License, or (at your option) any later version.
15 *
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Library General Public License for more details.
20 *
21 * You should have received a copy of the GNU Library General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
24 * 02111-1307, USA.
25 *
26 */
27
28 #include "vdk/notebook.h"
29 #include "vdk/forms.h"
30 #include "vdk/pixmaps.h"
31 #include "vdk/label.h"
32 #include "vdk/boxes.h"
33 #include "vdk/colors.h"
34
35 //================
36 // class tab page
37 //================
VDKTabPage(VDKObject * book,VDKObject * child,const char * lbl,char ** closed_xpm,char ** open_xpm)38 VDKTabPage::VDKTabPage(VDKObject* book,
39 VDKObject* child,
40 const char *lbl,
41 char **closed_xpm,
42 char **open_xpm):
43 child(child),book(book)
44 {
45 GtkWidget *pixwid;
46 GdkColor *transparent = NULL;
47 tab = gtk_hbox_new (FALSE, 0);
48 //
49 if(closed_xpm)
50 closed = gdk_pixmap_create_from_xpm_d (book->Widget()->window,
51 &closed_mask,transparent, closed_xpm);
52 else
53 closed = NULL;
54 //
55 if(open_xpm)
56 open = gdk_pixmap_create_from_xpm_d (book->Widget()->window,
57 &open_mask, transparent, open_xpm);
58 else
59 open = NULL;
60 //
61 if(closed)
62 {
63 pixwid = gtk_pixmap_new (closed, closed_mask);
64 gtk_box_pack_start (GTK_BOX (tab), pixwid, FALSE, TRUE, 0);
65 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
66 }
67 TabLabel = new VDKLabel(book->Owner(),lbl);
68 gtk_box_pack_start (GTK_BOX (tab),
69 TabLabel->Widget(),
70 FALSE, TRUE, 0);
71 gtk_widget_show(child->Widget());
72 //
73 gtk_widget_show_all (tab);
74 gtk_notebook_append_page(GTK_NOTEBOOK(book->Widget()),
75 child->Widget(),
76 tab);
77 book->Owner()->Objects().add(TabLabel);
78 }
79
80 //================
81 // class page list
82 //================
83 /*
84 */
operator [](int n)85 VDKTabPage* PageList::operator[](int n)
86 {
87 return PList::operator[](n);
88 }
89 /*
90 */
~PageList()91 PageList::~PageList()
92 {
93 for(PListIterator li(*this);li;li++)
94 delete li.current();
95 }
96 /*
97 */
AddPage(VDKObject * child,const char * label,char ** pixmap_open,char ** pixmap_closed)98 void PageList::AddPage(VDKObject* child,
99 const char *label,
100 char **pixmap_open,
101 char **pixmap_closed)
102 {
103 VDKTabPage *page = new VDKTabPage(book,
104 child,
105 label,
106 pixmap_open,
107 pixmap_closed);
108 add(page);
109 child->Parent(book);
110 }
111 //===============
112 // class notebook
113 //===============
114
PageSwitch(GtkWidget * widget,GtkNotebookPage * page,int pagenum,gpointer gp)115 void VDKNotebook::PageSwitch(GtkWidget *widget,
116 GtkNotebookPage *page,
117 int pagenum,
118 gpointer gp)
119 {
120 GdkPixmap *open = NULL;
121 GdkPixmap *closed = NULL;
122 GdkBitmap *open_mask;
123 GdkBitmap *closed_mask;
124 int lastpage;
125 g_return_if_fail(gp != NULL);
126 VDKNotebook* obj = reinterpret_cast<VDKNotebook*>(gp);
127
128
129 GtkNotebookPage *oldpage;
130 GtkWidget *pixwid = NULL;
131 oldpage = GTK_NOTEBOOK (widget)->cur_page;
132 if ((page == oldpage) ||
133 (!obj->Pages.size()) ||
134 (pagenum < 0) ||
135 (pagenum >= obj->Pages.size())
136 )
137 return;
138 bool enabled = obj->Pages[pagenum]->TabLabel->Enabled;
139 // does not proceed if page is disabled
140 if(! enabled)
141 {
142 gtk_signal_emit_stop_by_name(GTK_OBJECT(widget),"switch_page");
143 return;
144 }
145 //
146 lastpage = gtk_notebook_current_page(GTK_NOTEBOOK(widget));
147 open = obj->Pages[pagenum]->open;
148 open_mask = obj->Pages[pagenum]->open_mask;
149 if(open)
150 {
151 /*
152 this should replace below lines on new gtk+ snapshoots,
153 since GtkNoteBook page is now a private struct on gtknotebook.c
154 */
155 GtkWidget* tab_label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(widget), GTK_WIDGET(page));
156 if(tab_label)
157 {
158 pixwid = ((GtkBoxChild*)(GTK_BOX (tab_label)->children->data))->widget;
159 if(pixwid)
160 gtk_pixmap_set (GTK_PIXMAP (pixwid), open, open_mask);
161 }
162 //
163 /*
164 //================
165 pixwid = ((GtkBoxChild*)
166 (GTK_BOX (page->tab_label)->children->data))->widget;
167 if(pixwid)
168 gtk_pixmap_set (GTK_PIXMAP (pixwid), open, open_mask);
169 //================
170 */
171 }
172 if ( (lastpage >= 0)
173 && (lastpage < obj->Pages.size())
174 && (oldpage && closed))
175 {
176 closed = obj->Pages[lastpage]->closed;
177 closed_mask = obj->Pages[lastpage]->closed_mask;
178 /*
179 this should replace below lines on new gtk+ snapshoots,
180 since GtkNoteBook page is now a private struct on gtknotebook.c
181 */
182 GtkWidget* tab_label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(widget), GTK_WIDGET(oldpage));
183 if(tab_label)
184 {
185 pixwid = ((GtkBoxChild*) (GTK_BOX (tab_label)->children->data))->widget;
186 if(pixwid)
187 gtk_pixmap_set (GTK_PIXMAP (pixwid), closed, closed_mask);
188 }
189 //
190 /*
191 //=================
192 pixwid = ((GtkBoxChild*)
193 (GTK_BOX(oldpage->tab_label)->children->data))->widget;
194 if(pixwid)
195 gtk_pixmap_set (GTK_PIXMAP (pixwid), closed, closed_mask);
196 //=================
197 */
198 }
199 obj->ActivePage(pagenum);
200 obj->SignalEmit(switch_page_signal);
201 #ifdef USE_SIGCPLUSPLUS
202 obj->OnPageSwitch(obj,pagenum);
203 #endif
204 }
205 /*
206 */
VDKNotebook(VDKForm * owner)207 VDKNotebook::VDKNotebook(VDKForm* owner):
208 VDKObjectContainer(owner),
209 ActivePage("ActivePage",this),
210 TabPosition("TabPosition",this),
211 Scrollable("Scrollable",this,false,&VDKNotebook::SetScrollable),
212 PopUp("PopUp",this,false,&VDKNotebook::SetPopUp),
213 PreviousActivePage("PreviousActivePage",this,-1,
214 &VDKNotebook::GetPreviousActivePage)
215 {
216 widget = gtk_notebook_new();
217 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(widget),GTK_POS_TOP);
218 Pages.book = this;
219 gtk_signal_connect (GTK_OBJECT (widget), "switch_page",
220 GTK_SIGNAL_FUNC (VDKNotebook::PageSwitch),this);
221 }
222 /*
223 */
~VDKNotebook()224 VDKNotebook::~VDKNotebook()
225 {
226 }
227 /*
228 */
AddPage(VDKObject * obj,const char * label,char ** pixmap_open,char ** pixmap_closed)229 void VDKNotebook::AddPage(VDKObject* obj,
230 const char *label,
231 char **pixmap_open,
232 char **pixmap_closed)
233 {
234 Pages.AddPage(obj,label,pixmap_open,pixmap_closed);
235 Owner()->Objects().add(obj);
236 }
237 /*
238 */
RemovePage(int page,bool removechild)239 void VDKNotebook::RemovePage(int page, bool removechild)
240 {
241 if(page < 0 || page >= Pages.size())
242 return;
243 VDKObject* child = Pages[page]->child;
244 gtk_notebook_remove_page(GTK_NOTEBOOK(widget),page);
245 VDKTabPage *tabpage = Pages[page];
246 if(Pages.remove(tabpage))
247 {
248 if(removechild)
249 Owner()->RemoveItem(child);
250 delete tabpage;
251 // set active page
252 ActivePage(gtk_notebook_get_current_page(GTK_NOTEBOOK(Widget())));
253 }
254 }
255
256
257 /*
258 */
ActivePageProperty()259 ActivePageProperty::ActivePageProperty(){}
ActivePageProperty(char * name,VDKNotebook * object,void (VDKNotebook::* write)(int),int (VDKNotebook::* read)(void))260 ActivePageProperty::ActivePageProperty(
261 char* name,
262 VDKNotebook* object,
263 void (VDKNotebook::*write)(int),
264 int (VDKNotebook::*read)(void)
265 )
266 : NoteBookIntProp(name,object,0,write,read) {}
~ActivePageProperty()267 ActivePageProperty::~ActivePageProperty() {}
268
269 /*
270 */
operator int()271 ActivePageProperty::operator int()
272 {
273 //value = gtk_notebook_get_current_page(GTK_NOTEBOOK(object->Widget()));
274 return value;
275 }
276 /*
277 */
278 void
operator =(int page)279 ActivePageProperty::operator=(int page)
280 {
281 value = page;
282 if(page >= 0 && page < object->Pages.size())
283 gtk_notebook_set_current_page(GTK_NOTEBOOK(object->Widget()),page);
284 }
285 /*
286 */
287 void
operator ++()288 ActivePageProperty::operator++()
289 {
290 gtk_notebook_next_page(GTK_NOTEBOOK(object->Widget()));
291 }
292 /*
293 */
294 void
operator --()295 ActivePageProperty::operator--()
296 {
297 gtk_notebook_prev_page(GTK_NOTEBOOK(object->Widget()));
298 }
299 /*
300 */
301 void
operator ++(int)302 ActivePageProperty::operator++(int)
303 {
304 gtk_notebook_next_page(GTK_NOTEBOOK(object->Widget()));
305 }
306 /*
307 */
308 void
operator --(int)309 ActivePageProperty::operator--(int)
310 {
311 gtk_notebook_prev_page(GTK_NOTEBOOK(object->Widget()));
312 }
313
314 /*
315 */
NotebookTabPosProperty()316 NotebookTabPosProperty::NotebookTabPosProperty(){}
NotebookTabPosProperty(char * name,VDKNotebook * object,void (VDKNotebook::* write)(int),int (VDKNotebook::* read)(void))317 NotebookTabPosProperty::NotebookTabPosProperty(
318 char* name,
319 VDKNotebook* object,
320 void (VDKNotebook::*write)(int),
321 int (VDKNotebook::*read)(void)
322 ):
323 NoteBookIntProp(name,object,GTK_POS_TOP,write,read) { }
~NotebookTabPosProperty()324 NotebookTabPosProperty::~NotebookTabPosProperty() {}
325
326 void
operator =(int pos)327 NotebookTabPosProperty::operator=(int pos)
328 {
329 value = pos%GTK_POS_BOTTOM;
330 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(object->Widget()),
331 (GtkPositionType) value);
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