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