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