1 /********************************************************************************
2 *                                                                               *
3 *                                 Test Table Widget                             *
4 *                                                                               *
5 *********************************************************************************
6 * Copyright (C) 1997,2006 by Jeroen van der Zijp.   All Rights Reserved.        *
7 *********************************************************************************
8 * $Id: table.cpp,v 1.69 2006/01/27 02:07:45 fox Exp $                           *
9 ********************************************************************************/
10 #include "fx.h"
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <math.h>
14 
15 
16 
17 
18 /*******************************************************************************/
19 
20 
21 // Table Window
22 class TableWindow : public FXMainWindow {
23   FXDECLARE(TableWindow)
24 protected:
25 
26   // Member data
27   FXToolTip*         tooltip;
28   FXMenuBar*         menubar;
29   FXMenuPane*        filemenu;
30   FXMenuPane*        tablemenu;
31   FXMenuPane*        manipmenu;
32   FXMenuPane*        selectmenu;
33   FXVerticalFrame*   contents;
34   FXVerticalFrame*   frame;
35   FXTable*           table;
36   FXBMPIcon*         penguinicon;
37 
38 protected:
TableWindow()39   TableWindow(){}
40 
41 public:
42   long onCmdTest(FXObject*,FXSelector,void*);
43   long onCmdResizeTable(FXObject*,FXSelector,void*);
44   long onTableSelected(FXObject*,FXSelector,void*);
45   long onTableDeselected(FXObject*,FXSelector,void*);
46   long onTableInserted(FXObject*,FXSelector,void*);
47   long onTableDeleted(FXObject*,FXSelector,void*);
48   long onTableChanged(FXObject*,FXSelector,void*);
49   long onTableReplaced(FXObject*,FXSelector,void*);
50 
51 public:
52   enum{
53     ID_TEST=FXMainWindow::ID_LAST,
54     ID_RESIZETABLE,
55     ID_TABLE,
56     ID_LAST
57     };
58 
59 public:
60   TableWindow(FXApp* a);
61   virtual void create();
62   virtual ~TableWindow();
63   };
64 
65 
66 /*******************************************************************************/
67 
68 // Map
69 FXDEFMAP(TableWindow) TableWindowMap[]={
70   FXMAPFUNC(SEL_COMMAND,TableWindow::ID_TEST,TableWindow::onCmdTest),
71   FXMAPFUNC(SEL_COMMAND,TableWindow::ID_RESIZETABLE,TableWindow::onCmdResizeTable),
72   FXMAPFUNC(SEL_SELECTED,TableWindow::ID_TABLE,TableWindow::onTableSelected),
73   FXMAPFUNC(SEL_DESELECTED,TableWindow::ID_TABLE,TableWindow::onTableDeselected),
74   FXMAPFUNC(SEL_INSERTED,TableWindow::ID_TABLE,TableWindow::onTableInserted),
75   FXMAPFUNC(SEL_DELETED,TableWindow::ID_TABLE,TableWindow::onTableDeleted),
76   FXMAPFUNC(SEL_CHANGED,TableWindow::ID_TABLE,TableWindow::onTableChanged),
77   FXMAPFUNC(SEL_REPLACED,TableWindow::ID_TABLE,TableWindow::onTableReplaced),
78   };
79 
80 
81 // Object implementation
82 FXIMPLEMENT(TableWindow,FXMainWindow,TableWindowMap,ARRAYNUMBER(TableWindowMap))
83 
84 
85 /*******************************************************************************/
86 
87 extern const unsigned char penguin[]={
88   0x42,0x4d,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x28,0x00,
89   0x00,0x00,0x10,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,
90   0x00,0x00,0x90,0x00,0x00,0x00,0x6d,0x0b,0x00,0x00,0x6d,0x0b,0x00,0x00,0x07,0x00,
91   0x00,0x00,0x07,0x00,0x00,0x00,0xdc,0xc0,0xb2,0x00,0x80,0x80,0x80,0x00,0x00,0x00,
92   0x00,0x00,0xc0,0xc0,0xc0,0x00,0x10,0x10,0x10,0x00,0xff,0xff,0xff,0x00,0x08,0xa0,
93   0xe0,0x00,0x00,0x66,0x61,0x22,0x22,0x21,0x66,0x00,0x06,0x66,0x66,0x55,0x22,0x26,
94   0x66,0x60,0x66,0x66,0x65,0x55,0x55,0x26,0x66,0x66,0x66,0x66,0x65,0x55,0x55,0x36,
95   0x66,0x66,0x06,0x66,0x55,0x55,0x55,0x56,0x22,0x60,0x00,0x63,0x55,0x35,0x55,0x55,
96   0x22,0x20,0x00,0x23,0x55,0x35,0x55,0x55,0x22,0x20,0x00,0x02,0x55,0x33,0x55,0x55,
97   0x22,0x10,0x00,0x02,0x55,0x53,0x55,0x55,0x22,0x00,0x00,0x01,0x25,0x55,0x55,0x51,
98   0x21,0x00,0x00,0x00,0x21,0x55,0x55,0x52,0x10,0x00,0x00,0x00,0x02,0x66,0x55,0x22,
99   0x00,0x00,0x00,0x00,0x02,0x66,0x63,0x21,0x00,0x00,0x00,0x00,0x02,0x66,0x63,0x20,
100   0x00,0x00,0x00,0x00,0x02,0x42,0x25,0x20,0x00,0x00,0x00,0x00,0x02,0x32,0x32,0x20,
101   0x00,0x00,0x00,0x00,0x01,0x22,0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x12,0x21,0x00,
102   0x00,0x00
103   };
104 
105 
106 // Make some windows
TableWindow(FXApp * a)107 TableWindow::TableWindow(FXApp* a):FXMainWindow(a,"Table Widget Test",NULL,NULL,DECOR_ALL,0,0,0,0){
108   static const FXchar *months[]={"January","February","March","April","May","June","July","August","September","October","November","December"};
109   FXint r,c;
110 
111   // Tooltip
112   tooltip=new FXToolTip(getApp());
113 
114   penguinicon=new FXBMPIcon(getApp(),penguin,0,IMAGE_ALPHAGUESS);
115   //penguinicon=new FXBMPIcon(getApp(),penguin,0,IMAGE_OPAQUE);
116 
117   // Menubar
118   menubar=new FXMenuBar(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X);
119 
120   // Separator
121   new FXHorizontalSeparator(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|SEPARATOR_GROOVE);
122 
123   // Contents
124   contents=new FXVerticalFrame(this,LAYOUT_SIDE_TOP|FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y);
125 
126   frame=new FXVerticalFrame(contents,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 0,0,0,0);
127 
128   // Table
129   table=new FXTable(frame,this,ID_TABLE,TABLE_COL_SIZABLE|TABLE_ROW_SIZABLE|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 2,2,2,2);
130   table->setVisibleRows(20);
131   table->setVisibleColumns(8);
132 //  table->setRowHeaderMode(0);
133   table->setTableSize(50,14);
134   table->setBackColor(FXRGB(255,255,255));
135   table->setCellColor(0,0,FXRGB(255,255,255));
136   table->setCellColor(0,1,FXRGB(255,240,240));
137   table->setCellColor(1,0,FXRGB(240,255,240));
138   table->setCellColor(1,1,FXRGB(240,240,255));
139 
140   // Initialize scrollable part of table
141   for(r=0; r<50; r++){
142     for(c=0; c<14; c++){
143       table->setItemText(r,c,"r:"+FXStringVal(r)+" c:"+FXStringVal(c));
144       }
145     }
146 
147   // Initialize column headers
148   for(c=0; c<12; c++){
149     table->setColumnText(c,months[c]);
150     }
151 
152   // Initialize row headers
153   for(r=0; r<50; r++){
154     table->setRowText(r,"Row"+FXStringVal(r));
155     }
156 /*
157   table->setLeadingRows(1);
158   table->setLeadingColumns(1);
159   table->setTrailingRows(1);
160   table->setTrailingColumns(1);
161   // Init corners
162   table->setItemText(0,0,FXString::null);
163   table->setItemText(0,13,FXString::null);
164   table->setItemText(49,0,FXString::null);
165   table->setItemText(49,13,FXString::null);
166 
167   // Initialize first/last fixed rows
168   for(c=1; c<=12; c++){
169     table->setItemText(0,c,months[c-1]);
170     table->setItemText(49,c,months[c-1]);
171     table->setItemButton(0,c,TRUE);
172     table->setItemJustify(0,c,FXTableItem::LEFT|FXTableItem::CENTER_Y);
173     }
174   table->setItemButton(0,0,TRUE);
175   table->setItemButton(0,13,TRUE);
176 
177   // Initialize first/last fixed columns
178   for(r=1; r<=48; r++){
179     table->setItemText(r,0,FXStringVal(r));
180     table->setItemText(r,13,FXStringVal(r));
181     table->setItemButton(r,0,TRUE);
182     }
183   table->setItemButton(49,0,TRUE);
184 */
185   table->setItemText(10,10,"This is multi-\nline text");
186 //  table->setRowHeight(10,35);
187   table->setItemJustify(10,10,FXTableItem::CENTER_X|FXTableItem::CENTER_Y);
188 
189   table->setItem(3,3,NULL);
190   table->setItem(5,6,table->getItem(5,5));      // FIXME this is not the right way to make spanning cells
191   table->setItem(5,7,table->getItem(5,5));
192   table->setItemText(5,5,"Spanning Item");
193   table->setItemJustify(5,5,FXTableItem::CENTER_X|FXTableItem::CENTER_Y);
194 
195   table->setItemBorders(9,9,FXTableItem::TBORDER|FXTableItem::LBORDER|FXTableItem::BBORDER);
196   table->setItemBorders(9,10,FXTableItem::TBORDER|FXTableItem::RBORDER|FXTableItem::BBORDER);
197 
198   table->setItemJustify(10,5,FXTableItem::LEFT|FXTableItem::CENTER_Y);
199 
200   table->setItemBorders(40,13,FXTableItem::LBORDER|FXTableItem::TBORDER|FXTableItem::RBORDER|FXTableItem::BBORDER);
201   table->setItemBorders(49,13,FXTableItem::LBORDER|FXTableItem::TBORDER|FXTableItem::RBORDER|FXTableItem::BBORDER);
202   table->setItemBorders(5,0,FXTableItem::LBORDER|FXTableItem::TBORDER|FXTableItem::RBORDER|FXTableItem::BBORDER);
203 
204   table->setItemIcon(6,6,penguinicon);
205   table->setItemIconPosition(6,6,FXTableItem::ABOVE);
206   table->setItemJustify(6,6,FXTableItem::CENTER_X|FXTableItem::CENTER_Y);
207 
208   table->setItemStipple(3,4,STIPPLE_CROSSDIAG);
209 
210   table->setItem(10,2,new FXComboTableItem("One\nTwo\nThree\nFour"));
211 
212   // File Menu
213   filemenu=new FXMenuPane(this);
214   new FXMenuCommand(filemenu,"&Quit\tCtl-Q",NULL,getApp(),FXApp::ID_QUIT);
215   new FXMenuTitle(menubar,"&File",NULL,filemenu);
216 
217   // Tab side
218   tablemenu=new FXMenuPane(this);
219   new FXMenuCheck(tablemenu,"Horizontal grid",table,FXTable::ID_HORZ_GRID);
220   new FXMenuCheck(tablemenu,"Vertical grid",table,FXTable::ID_VERT_GRID);
221   new FXMenuCheck(tablemenu,"Editable",table,FXTable::ID_TOGGLE_EDITABLE);
222   new FXMenuTitle(menubar,"&Options",NULL,tablemenu);
223 
224   manipmenu=new FXMenuPane(this);
225   new FXMenuCommand(manipmenu,"Edit Cell",NULL,table,FXTable::ID_START_INPUT);
226   new FXMenuCommand(manipmenu,"Delete Column",NULL,table,FXTable::ID_DELETE_COLUMN);
227   new FXMenuCommand(manipmenu,"Delete Row",NULL,table,FXTable::ID_DELETE_ROW);
228   new FXMenuCommand(manipmenu,"Insert Column",NULL,table,FXTable::ID_INSERT_COLUMN);
229   new FXMenuCommand(manipmenu,"Insert Row",NULL,table,FXTable::ID_INSERT_ROW);
230   new FXMenuCommand(manipmenu,"Resize table...",NULL,this,TableWindow::ID_RESIZETABLE);
231   new FXMenuTitle(menubar,"&Manipulations",NULL,manipmenu);
232 
233   selectmenu=new FXMenuPane(this);
234   new FXMenuCommand(selectmenu,"Select All",NULL,table,FXTable::ID_SELECT_ALL);
235   new FXMenuCommand(selectmenu,"Select Cell",NULL,table,FXTable::ID_SELECT_CELL);
236   new FXMenuCommand(selectmenu,"Select Row",NULL,table,FXTable::ID_SELECT_ROW);
237   new FXMenuCommand(selectmenu,"Select Column",NULL,table,FXTable::ID_SELECT_COLUMN);
238   new FXMenuCommand(selectmenu,"Deselect All",NULL,table,FXTable::ID_DESELECT_ALL);
239   new FXMenuCommand(selectmenu,"Cut to clipboard",NULL,table,FXTable::ID_CUT_SEL);
240   new FXMenuCommand(selectmenu,"Copy to clipboard",NULL,table,FXTable::ID_COPY_SEL);
241   new FXMenuCommand(selectmenu,"Paste from clipboard",NULL,table,FXTable::ID_PASTE_SEL);
242   new FXMenuCommand(selectmenu,"Delete",NULL,table,FXTable::ID_DELETE_SEL);
243   new FXMenuTitle(menubar,"&Selection",NULL,selectmenu);
244   }
245 
246 
~TableWindow()247 TableWindow::~TableWindow(){
248   delete filemenu;
249   delete tablemenu;
250   delete manipmenu;
251   delete selectmenu;
252   delete penguinicon;
253   }
254 
255 
256 // Test
onCmdTest(FXObject *,FXSelector,void *)257 long TableWindow::onCmdTest(FXObject*,FXSelector,void*){
258   return 1;
259   }
260 
261 
262 // Resize table
onCmdResizeTable(FXObject *,FXSelector,void *)263 long TableWindow::onCmdResizeTable(FXObject*,FXSelector,void*){
264   FXDialogBox dlg(this,"Resize Table");
265   FXHorizontalFrame *frame=new FXHorizontalFrame(&dlg,LAYOUT_FILL_X|LAYOUT_FILL_Y);
266   new FXLabel(frame,"Rows:",NULL,LAYOUT_SIDE_LEFT|LAYOUT_CENTER_Y);
267   FXTextField* rows=new FXTextField(frame,5,NULL,0,JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_LEFT|LAYOUT_CENTER_Y);
268   new FXLabel(frame,"Columns:",NULL,LAYOUT_SIDE_LEFT|LAYOUT_CENTER_Y);
269   FXTextField* cols=new FXTextField(frame,5,NULL,0,JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_SIDE_LEFT|LAYOUT_CENTER_Y);
270   new FXButton(frame,"Cancel",NULL,&dlg,FXDialogBox::ID_CANCEL,FRAME_RAISED|FRAME_THICK|LAYOUT_SIDE_LEFT|LAYOUT_CENTER_Y);
271   new FXButton(frame,"  OK  ",NULL,&dlg,FXDialogBox::ID_ACCEPT,FRAME_RAISED|FRAME_THICK|LAYOUT_SIDE_LEFT|LAYOUT_CENTER_Y);
272   FXint oldnr,oldnc;
273   oldnr=table->getNumRows();
274   oldnc=table->getNumColumns();
275   rows->setText(FXStringVal(oldnr));
276   cols->setText(FXStringVal(oldnc));
277   if(dlg.execute()){
278     FXint nr,nc,r,c;
279     nr=FXIntVal(rows->getText());
280     nc=FXIntVal(cols->getText());
281     if(nr<0) nr=0;
282     if(nc<0) nc=0;
283     table->setTableSize(nr,nc);
284     for(r=0; r<nr; r++){
285       for(c=0; c<nc; c++){
286         //table->setItemText(r,c,"r:"+FXStringVal(r+1)+" c:"+FXStringVal(c+1));
287         }
288       }
289     }
290   return 1;
291   }
292 
293 // Selected
onTableSelected(FXObject *,FXSelector,void * ptr)294 long TableWindow::onTableSelected(FXObject*,FXSelector,void* ptr){
295   FXTablePos *tp=(FXTablePos*)ptr;
296   FXTRACE((10,"SEL_SELECTED row=%d, col=%d\n",tp->row,tp->col));
297   return 1;
298   }
299 
300 // Deselected
onTableDeselected(FXObject *,FXSelector,void * ptr)301 long TableWindow::onTableDeselected(FXObject*,FXSelector,void* ptr){
302   FXTablePos *tp=(FXTablePos*)ptr;
303   FXTRACE((10,"SEL_DESELECTED row=%d, col=%d\n",tp->row,tp->col));
304   return 1;
305   }
306 
307 // Inserted
onTableInserted(FXObject *,FXSelector,void * ptr)308 long TableWindow::onTableInserted(FXObject*,FXSelector,void* ptr){
309   FXTableRange *tr=(FXTableRange*)ptr;
310   FXTRACE((10,"SEL_INSERTED fm.row=%d, fm.col=%d to.row=%d, to.col=%d\n",tr->fm.row,tr->fm.col,tr->to.row,tr->to.col));
311   return 1;
312   }
313 
314 // Deleted
onTableDeleted(FXObject *,FXSelector,void * ptr)315 long TableWindow::onTableDeleted(FXObject*,FXSelector,void* ptr){
316   FXTableRange *tr=(FXTableRange*)ptr;
317   FXTRACE((10,"SEL_DELETED fm.row=%d, fm.col=%d to.row=%d, to.col=%d\n",tr->fm.row,tr->fm.col,tr->to.row,tr->to.col));
318   return 1;
319   }
320 
321 // Changed
onTableChanged(FXObject *,FXSelector,void * ptr)322 long TableWindow::onTableChanged(FXObject*,FXSelector,void* ptr){
323   FXTablePos *tp=(FXTablePos*)ptr;
324   FXTRACE((10,"SEL_CHANGED row=%d, col=%d\n",tp->row,tp->col));
325   return 1;
326   }
327 
328 
329 // Replaced
onTableReplaced(FXObject *,FXSelector,void * ptr)330 long TableWindow::onTableReplaced(FXObject*,FXSelector,void* ptr){
331   FXTableRange *tr=(FXTableRange*)ptr;
332   FXTRACE((10,"SEL_REPLACED fm.row=%d, fm.col=%d to.row=%d, to.col=%d\n",tr->fm.row,tr->fm.col,tr->to.row,tr->to.col));
333   return 1;
334   }
335 
336 
337 // Start
create()338 void TableWindow::create(){
339   FXMainWindow::create();
340   show(PLACEMENT_SCREEN);
341   }
342 
343 
344 /*******************************************************************************/
345 
346 
347 // Start the whole thing
main(int argc,char * argv[])348 int main(int argc,char *argv[]){
349 
350   // Make application
351   FXApp application("TableApp","FoxTest");
352 
353   // Open display
354   application.init(argc,argv);
355 
356   // Make window
357   new TableWindow(&application);
358 
359   // Create app
360   application.create();
361 
362   // Run
363   return application.run();
364   }
365 
366 
367