ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/gclib/clview/mainwin.cpp
Revision: 40
Committed: Sat Aug 27 16:48:50 2011 UTC (13 years, 1 month ago) by gpertea
File size: 19385 byte(s)
Log Message:
added clview files and examples

Line File contents
1 /********************************************************************************
2 * *
3 * *
4 *********************************************************************************/
5 #include "mainwin.h"
6 #include "mdichild.h"
7 #include "clrutils.h"
8 /*******************************************************************************/
9
10 // Map
11 FXDEFMAP(MainWindow) MainWindowMap[]={
12 //________Message_Type____________ID___________________Message_Handler________
13 FXMAPFUNC(SEL_COMMAND, MainWindow::ID_ABOUT, MainWindow::onCmdAbout),
14 FXMAPFUNC(SEL_COMMAND, MainWindow::ID_RANDOM, MainWindow::onRandomLayout),
15 FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FILEFILTER, MainWindow::onCmdFilter),
16 FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FILEOPEN, MainWindow::onCmdFileDlg),
17 FXMAPFUNC(SEL_SIGNAL, MainWindow::ID_CLOSEALL, MainWindow::onCmdCloseAll),
18 FXMAPFUNC(SEL_COMMAND, MainWindow::ID_CLOSEALL, MainWindow::onCmdCloseAll),
19 FXMAPFUNC(SEL_COMMAND, MDIChild::ID_MAXRESTORE, MainWindow::onMaxRestore),
20 FXMAPFUNC(SEL_DOUBLECLICKED, MainWindow::ID_TREELIST, MainWindow::onCmdTreeList),
21 };
22
23 // Object implementation
24 FXIMPLEMENT(MainWindow,FXMainWindow,MainWindowMap,ARRAYNUMBER(MainWindowMap))
25
26
27 // FXSplashDlg implementation
28 FXIMPLEMENT(FXSplashDlg,FXDialogBox,NULL,0)
29
30 /*******************************************************************************/
31
32 const unsigned char penguin[]={
33 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x12,0x00,0xf2,0x00,0x00,0xb2,0xc0,0xdc,
34 0x80,0x80,0x80,0x00,0x00,0x00,0xc0,0xc0,0xc0,0x10,0x10,0x10,0xff,0xff,0xff,0xe0,
35 0xa0,0x08,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x12,0x00,0x00,0x03,
36 0x53,0x08,0xba,0x21,0x12,0x2b,0xc6,0xe6,0x9e,0x94,0x62,0x64,0x77,0xa3,0x20,0x4e,
37 0x21,0x74,0x8b,0x60,0x9c,0x1a,0xa9,0x98,0xa8,0x45,0xb2,0x85,0x38,0x76,0x4f,0x6c,
38 0xbb,0x93,0x60,0xdb,0x0d,0xe4,0xd9,0x83,0x1d,0xe7,0x57,0x18,0x04,0x6f,0xb8,0x4c,
39 0xec,0x88,0x9c,0x01,0x0c,0x47,0x66,0xac,0xa2,0x38,0x19,0x76,0x36,0x83,0xc3,0xf0,
40 0xb4,0x5e,0x77,0x03,0xaf,0xf8,0x7b,0x13,0x77,0xad,0xd3,0xad,0x75,0x61,0xa5,0x54,
41 0x02,0x27,0x45,0x02,0x00,0x3b
42 };
43
44
45 static const FXchar fltfiles[]="ACE files (*.ace,*ACE)\nLayout files (*.lyt)\nAny file (*)";
46
47 FXString fileNameOnly(const FXString& file){
48 register FXint f,n;
49 if(!file.empty()){
50 n=0;
51 #ifdef WIN32
52 if(isalpha((FXuchar)file[0]) && file[1]==':') n=2;
53 #endif
54 f=n;
55 while(file[n]){
56 if(ISPATHSEP(file[n])) f=n+1;
57 n++;
58 }
59 return FXString(file.text()+f,n-f);
60 }
61 return FXString::null;
62 }
63
64 void MainWindow::initColors() {
65 FXRegistry& ini=getApp()->reg();
66 static const char* section="Colors";
67 static const char* bsection="Base Color Mode";
68 static const char* grpsect="Group Colors";
69
70 matchColors[16]=ini.readColorEntry(section, "Mismatch",
71 makeHiliteColor(makeHiliteColor(fxcolorfromname("Red"))));
72 ini.writeColorEntry(section,"Mismatch",matchColors[16]);
73 matchColors[15]=ini.readColorEntry(section, "MaxCoverage",
74 fxcolorfromname("darkBlue"));
75 ini.writeColorEntry(section,"MaxCoverage",matchColors[15]);
76 ctgQuals[16]=ini.readColorEntry(section, "ContigNoCoverage",
77 getApp()->getBaseColor());
78 ini.writeColorEntry(section,"ContigNoCoverage",ctgQuals[16]);
79 ctgQuals[15]=ini.readColorEntry(section,"ContigMaxCoverage",0xFF00FFFF);
80 ini.writeColorEntry(section,"ContigMaxCoverage",ctgQuals[15]);
81
82 /*
83 buffer for color array to pass to
84 the Seq Paint method
85 0 = seq color
86 1 = seq highlight
87 2 = seq shadow
88 3 = seqtext color
89 4 = seqtrim color
90 5 = seq range color
91 6 = seq select color
92 7 = alternate seq color (ET)
93 8 = inter-segment connector color
94 9 = internal trim color
95 10 = major consensus splice site
96 11 = minor consensus splice site
97 */
98 //-- base sequence color:
99
100 seqColors[0]=ini.readColorEntry(section,"SeqBg",fxcolorfromname("darkBlue"));
101 // Hex Colors are BGR style !
102 //-- highlight border:
103 seqColors[1]=ini.readColorEntry(section,"SeqBorderHilight",
104 makeHiliteColor(fxcolorfromname("Gray50")));
105 //--shadow border:
106 seqColors[2]=ini.readColorEntry(section,"SeqBorderShadow",
107 makeShadowColor(fxcolorfromname("Gray20")));
108 //nucleotide font color:
109 seqColors[3]=ini.readColorEntry(section,"SeqText",fxcolorfromname("White"));
110 //-- clipping color:
111 seqColors[4]=ini.readColorEntry(section,"SeqClipping",
112 fxcolorfromname("MistyRose3")); //trimmed ends
113 //seq range color:
114 seqColors[5]=ini.readColorEntry(section,"SeqRange",fxcolorfromname("Green"));
115 //seq select color:
116 seqColors[6]=ini.readColorEntry(section,"SeqSelect", fxcolorfromname("Yellow"));
117 //-- NP/ET color:
118 seqColors[7]=ini.readColorEntry(section,"SeqSpecial", fxcolorfromname("darkRed"));
119 //-- inter-segment gap line:
120 seqColors[8]=ini.readColorEntry(section, "Intron", fxcolorfromname("LightSkyBlue3"));
121 //-- internal clipping color:
122 seqColors[9]=ini.readColorEntry(section, "InternalClipping", fxcolorfromname("MistyRose1"));
123 //-- splice site consensus
124 seqColors[10]=ini.readColorEntry(section, "MajorSplice", fxcolorfromname("Red")); //hard
125 seqColors[11]=ini.readColorEntry(section, "MinorSplice", fxcolorfromname("DarkPink")); //soft
126 ini.writeColorEntry(section, "SeqBg",seqColors[0]);
127 ini.writeColorEntry(section, "SeqBorderHilight",seqColors[1]);
128 ini.writeColorEntry(section, "SeqBorderShadow",seqColors[2]);
129 ini.writeColorEntry(section, "SeqText",seqColors[3]);
130 ini.writeColorEntry(section, "SeqClipping",seqColors[4]);
131 ini.writeColorEntry(section, "SeqRange",seqColors[5]);
132 ini.writeColorEntry(section, "SeqSelect",seqColors[6]);
133 ini.writeColorEntry(section, "SeqSpecial",seqColors[7]);
134 ini.writeColorEntry(section, "Intron",seqColors[8]);
135 ini.writeColorEntry(section, "InternalClipping",seqColors[9]);
136 ini.writeColorEntry(section, "MajorSplice",seqColors[10]);
137 ini.writeColorEntry(section, "MinorSplice",seqColors[11]);
138
139 FXString s;
140 FXColor ggapc;
141 for (int i=0;i<NUM_GROUPS;i++) {
142 s.format("ColorGrp%d",i);
143 grpColors[0][i]=ini.readColorEntry(grpsect, s.text(),
144 getRColor(seqColors[0],NUM_GROUPS,i));
145 ini.writeColorEntry(grpsect,s.text(),grpColors[0][i]);
146 //intron color: increase luminance, decrease saturation of the group color
147 ggapc=makeHiliteColor(makeHiliteColor(grpColors[0][i]));
148 ggapc=modhls(ggapc,0,45,-200);
149 if (ggapc==backColor) { //white, I assume..
150 ggapc=modhls(ggapc, 0,-10,10);
151 }
152 grpColors[1][i]=ggapc;
153 }
154 for (int i=0;i<15;i++) {
155 matchColors[14-i]=modhls(matchColors[15], 0, 10*i, -5*i);
156 ctgQuals[14-i]=modhls(ctgQuals[15], 0, -4*i, 0);
157 }
158 baseColors[0]=ini.readColorEntry(bsection, "BaseText", fxcolorfromname("White")); //font color
159 baseColors[1]=ini.readColorEntry(bsection, "BaseA", fxcolorfromname("DarkGreen")); //A
160 baseColors[2]=ini.readColorEntry(bsection, "BaseC", fxcolorfromname("Blue")); //C
161 baseColors[3]=ini.readColorEntry(bsection, "BaseG", fxcolorfromname("Orange")); //G
162 baseColors[4]=ini.readColorEntry(bsection, "BaseT", fxcolorfromname("Red")); //T
163 baseColors[5]=ini.readColorEntry(bsection, "BaseX", fxcolorfromname("Gray20")); // N,*, other codes
164 ini.writeColorEntry(bsection, "BaseText",baseColors[0]);
165 ini.writeColorEntry(bsection, "BaseA",baseColors[1]);
166 ini.writeColorEntry(bsection, "BaseC",baseColors[2]);
167 ini.writeColorEntry(bsection, "BaseG",baseColors[3]);
168 ini.writeColorEntry(bsection, "BaseT",baseColors[4]);
169 ini.writeColorEntry(bsection, "BaseX",baseColors[5]);
170 ini.write();
171 }
172
173 // Make some windows
174 MainWindow::MainWindow(FXApp *a):FXMainWindow(a,"Cluster viewer",NULL,NULL,
175 DECOR_ALL|PLACEMENT_SCREEN,40,40,760,560) {
176
177 //MDIChild::ifont=NULL;
178 constructing=true;
179 initColors();
180 new FXToolTip(a);
181 menubar=new FXMenuBar(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X);
182 // Status bar
183 statusbar=new FXStatusBar(this,LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER);
184 FXSplitter* splitter=new FXSplitter(this,LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|SPLITTER_TRACKING);
185 /*
186 // Contents
187 FXHorizontalFrame *contents = new FXHorizontalFrame(this,
188 LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 0,0,0,0, 0,0);
189 */
190
191 // Sunken border for tree
192 FXVerticalFrame* treebox=new FXVerticalFrame(splitter,LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,160,0,0,0,0,0);
193 // Make tree
194 FXHorizontalFrame* treeframe=new FXHorizontalFrame(treebox,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0);
195 dirlist=new FXDirList(treeframe,this,ID_TREELIST,
196 DIRLIST_SHOWFILES|TREELIST_BROWSESELECT|
197 TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|LAYOUT_FILL_X|LAYOUT_FILL_Y);
198 FXHorizontalFrame* filterframe=new FXHorizontalFrame(treebox,LAYOUT_FILL_X);
199 new FXLabel(filterframe,"Filter:");
200 filter=new FXComboBox(filterframe,25,this,ID_FILEFILTER,COMBOBOX_STATIC|LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK);
201 filter->appendItem("ACE files (*.ace)");
202 filter->appendItem("Layout files (*.lyt)");
203 filter->appendItem("All Files (*)");
204 filter->setNumVisible(3);
205 setCurrentPattern(0);
206 dirlist->setDirectory(FXSystem::getCurrentDirectory());
207 treebox->hide();
208
209 // --------- MDI Stuff ------------------------------------------
210 // Nice sunken box around the MDIClient
211 FXVerticalFrame *mdibox=new FXVerticalFrame(splitter,
212 FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0, 0,0,0,0);
213 // MDI Client
214 mdiclient=new FXMDIClient(mdibox,LAYOUT_FILL_X|LAYOUT_FILL_Y);
215
216 // Make MDI Menu
217 mdimenu=new FXMDIMenu(this,mdiclient);
218 mdiicon=new FXGIFIcon(a,penguin);
219
220 // MDI buttons in menu:- note the message ID's!!!!!
221 // Normally, MDI commands are simply sensitized or desensitized;
222 // Under the menubar, however, they're hidden if the MDI Client is
223 // not maximized. To do this, they must have different ID's.
224 new FXMDIWindowButton(menubar,mdimenu,mdiclient,FXMDIClient::ID_MDI_MENUWINDOW,LAYOUT_LEFT);
225 new FXMDIDeleteButton(menubar,mdiclient,FXMDIClient::ID_MDI_MENUCLOSE,FRAME_RAISED|LAYOUT_RIGHT);
226 new FXMDIRestoreButton(menubar,mdiclient,FXMDIClient::ID_MDI_MENURESTORE,FRAME_RAISED|LAYOUT_RIGHT);
227 new FXMDIMinimizeButton(menubar,mdiclient,FXMDIClient::ID_MDI_MENUMINIMIZE,FRAME_RAISED|LAYOUT_RIGHT);
228
229 //newMDIChild();
230 //--------------------------------------------------------------------------------------------
231
232 // File Menu
233 filemenu=new FXMenuPane(this);
234 new FXMenuCommand(filemenu,"File Browser\t\tDisplay file list.",NULL,treebox,
235 FXWindow::ID_TOGGLESHOWN);
236 //new FXMenuCommand(filemenu,"&New\tCtl-N\tCreate new empty view",NULL,this,ID_NEW);
237 new FXMenuCommand(filemenu,"&Open\tCtl-O\tOpen ace/layout file ", NULL, this, MainWindow::ID_FILEOPEN);
238 new FXMenuSeparator(filemenu);
239 /*
240 new FXMenuCommand(filemenu,"&Random layout\t\tGenerate a random test layout.",NULL,this,
241 MainWindow::ID_RANDOM,0);
242 new FXMenuSeparator(filemenu);*/
243 new FXMenuCommand(filemenu,"&Quit\tCtl-Q\tQuit application.",NULL,a,FXApp::ID_QUIT,0);
244 new FXMenuTitle(menubar,"&File",NULL,filemenu);
245 // Window menu
246 windowmenu=new FXMenuPane(this);
247 new FXMenuCommand(windowmenu,"Tile &Horizontally",NULL,mdiclient,FXMDIClient::ID_MDI_TILEHORIZONTAL);
248 new FXMenuCommand(windowmenu,"Tile &Vertically",NULL,mdiclient,FXMDIClient::ID_MDI_TILEVERTICAL);
249 new FXMenuCommand(windowmenu,"C&ascade",NULL,mdiclient,FXMDIClient::ID_MDI_CASCADE);
250 new FXMenuCommand(windowmenu,"&Close",NULL,mdiclient,FXMDIClient::ID_MDI_CLOSE);
251 new FXMenuCommand(windowmenu,"Close &All",NULL,mdiclient,MainWindow::ID_CLOSEALL);
252 FXMenuSeparator* sep1=new FXMenuSeparator(windowmenu);
253 sep1->setTarget(mdiclient);
254 sep1->setSelector(FXMDIClient::ID_MDI_ANY);
255 new FXMenuCommand(windowmenu,FXString::null,NULL,mdiclient,FXMDIClient::ID_MDI_1);
256 new FXMenuCommand(windowmenu,FXString::null,NULL,mdiclient,FXMDIClient::ID_MDI_2);
257 new FXMenuCommand(windowmenu,FXString::null,NULL,mdiclient,FXMDIClient::ID_MDI_3);
258 new FXMenuCommand(windowmenu,FXString::null,NULL,mdiclient,FXMDIClient::ID_MDI_4);
259 new FXMenuTitle(menubar,"&Window",NULL,windowmenu);
260 // Help menu
261 helpmenu=new FXMenuPane(this);
262 new FXMenuCommand(helpmenu,"&About clView...",NULL,this,ID_ABOUT,0);
263 new FXMenuTitle(menubar,"&Help",NULL,helpmenu,LAYOUT_RIGHT);
264 constructing=false;
265 a->setAnimSpeed(0);
266 }
267
268
269 // Set current pattern
270 // Strip pattern from text if present
271 static FXString patternFromText(const FXString& pattern){
272 FXint beg,end;
273 end=pattern.rfind(')');
274 beg=pattern.rfind('(',end-1);
275 if(0<=beg && beg<end) return pattern.mid(beg+1,end-beg-1);
276 return pattern;
277 }
278
279 // Close all windows
280 long MainWindow::onCmdCloseAll(FXObject* sender, FXSelector, void*){
281 mdiclient->forallWindows(sender, FXSEL(SEL_CLOSE, 0), NULL);
282 return 1;
283 }
284
285
286
287 void MainWindow::setCurrentPattern(FXint n){
288 n=FXCLAMP(0,n,filter->getNumItems()-1);
289 FXString cdir=dirlist->getDirectory();
290 if (cdir.empty())
291 cdir=FXSystem::getCurrentDirectory();
292 filter->setCurrentItem(n);
293 dirlist->setPattern(patternFromText(filter->getItemText(n)));
294 dirlist->setDirectory(cdir);
295 }
296
297 // Change the pattern
298 long MainWindow::onCmdFilter(FXObject*,FXSelector,void* ptr){
299 dirlist->setPattern(FXFileSelector::patternFromText((FXchar*)ptr));
300
301 FXTreeItem* curitem=dirlist->getCurrentItem();
302 if (dirlist->isItemFile(curitem))
303 curitem=curitem->getParent();
304 dirlist->collapseTree(curitem,1);
305 dirlist->expandTree(curitem,1);
306 dirlist->selectItem(curitem,1);
307 dirlist->makeItemVisible(curitem);
308 return 1;
309 }
310
311
312 // Clean up
313 MainWindow::~MainWindow(){
314 delete filemenu;
315 delete windowmenu;
316 delete helpmenu;
317 delete mdiicon;
318 }
319
320 // Show up
321 void MainWindow::create(){
322 FXMainWindow::create();
323 show();
324 FXTreeItem* curitem=dirlist->getCurrentItem();
325 dirlist->expandTree(curitem,1);
326 dirlist->makeItemVisible(curitem);
327 }
328
329 // About
330 long MainWindow::onCmdAbout(FXObject*,FXSelector,void*){
331 FXMessageBox::information(this,MBOX_OK,"About clView",
332 "Assembly/Cluster layout viewer \n Written using FOX toolkit");
333 return 1;
334 }
335
336 // Change patterns, each pattern separated by newline
337 void MainWindow::setPatterns(const FXString& patterns){
338 FXString pat; FXint i;
339 filter->clearItems();
340 for(i=0; !(pat=patterns.section('\n',i)).empty(); i++){
341 filter->appendItem(pat);
342 }
343 if(!filter->getNumItems()) filter->appendItem("All Files (*)");
344 setCurrentPattern(0);
345 }
346
347
348 // Return list of patterns
349 FXString MainWindow::getPatterns() const {
350 FXString pat; FXint i;
351 for(i=0; i<filter->getNumItems(); i++){
352 if(!pat.empty()) pat+='\n';
353 pat+=filter->getItemText(i);
354 }
355 return pat;
356 }
357
358 // Open existing file
359 long MainWindow::onCmdFileDlg(FXObject*,FXSelector,void*){
360 FXFileDialog opendialog(this,"Open file");
361 opendialog.setSelectMode(SELECTFILE_EXISTING);
362 opendialog.setPatternList(fltfiles);
363 opendialog.setCurrentPattern(getCurrentPattern());
364 //opendialog.setDirectory(FXFile::directory(filename));
365 if(opendialog.execute()){
366 FXString file=opendialog.getFilename();
367 if (!file.empty()) newMDIChild(file.text());
368 }
369 //FXString file=FXFileDialog::getOpenFilename(this,"Open file",NULL,fltfiles,0);
370 return 1;
371 }
372
373
374 // Command from the tree list
375 long MainWindow::onCmdTreeList(FXObject*,FXSelector,void* ptr){
376 FXTreeItem *item=(FXTreeItem*)ptr;
377 FXint x,y;
378 FXuint state;
379 getCursorPosition(x,y,state);
380
381 FXString file;
382 if(!item || !dirlist->isItemFile(item)) return 1;
383 file=dirlist->getItemPathname(item);
384 //loadFile(file); :TO DO
385 MDIChild* mdichild=(MDIChild*)mdiclient->getActiveChild();
386 if ((state & CONTROLMASK) && mdichild!=NULL) {
387 mdichild->loadGroups(file);
388 }
389 else newMDIChild(file.text());
390 return 1;
391 }
392
393 void MainWindow::newMDIChild(const char* openfile) {
394 if (openfile!=NULL) {
395 FXString s;
396 s.format(" Parsing file %s, please wait... ", openfile);
397 splash(s.text());
398 s=openfile;
399 //s.format("Cluster viewer: %s", fileNameOnly(s).text());
400 s=fileNameOnly(s);
401 MDIChild* mdichild=new MDIChild(mdiclient,s.text(),mdiicon,mdimenu,
402 MDI_MAXIMIZED|MDI_TRACKING,10,10,600,400);
403 if (!constructing)
404 mdichild->create();
405 mdichild->alignview->initColors(seqColors, baseColors, matchColors,
406 ctgQuals, grpColors[0], grpColors[1]);
407 mdichild->openFile(openfile);
408 splash();
409 }
410 }
411
412 long MainWindow::onMaxRestore(FXObject* obj,FXSelector sel,void* ptr) {
413 FXMDIChild* active=mdiclient->getActiveChild();
414 FXString appName(getApp()->getAppName());
415 if (active!=NULL && active->isMaximized()) {
416 //FXString newtitle(appName);
417 //newtitle.append(" - ");
418 //newtitle.append(active->getTitle());
419 FXString title=active->getTitle();
420 //fprintf(stderr, "%s\n",title.text());
421 obj->handle(this,FXSEL(SEL_COMMAND,ID_SETSTRINGVALUE),(void*)&title);
422 //this->setTitle(active->getTitle());
423 }
424 else
425 this->setTitle(appName);
426 //pass message to FXMainWindow
427 return FXMainWindow::handle(obj,sel,ptr);
428 }
429
430
431 long MainWindow::onRandomLayout (FXObject*,FXSelector,void* ptr) {
432 MDIChild* mdichild=new MDIChild(mdiclient,"Random layout",mdiicon,mdimenu,
433 MDI_MAXIMIZED,10,10,600,400);
434 if (!constructing)
435 mdichild->create();
436 mdichild->alignview->initColors(seqColors, baseColors, matchColors,
437 ctgQuals, grpColors[0], grpColors[1]);
438 FXString s;
439 for (int i=0;i<1000;i++) {
440 s.format("TEST%04d",i);
441 mdichild->alignview->addSeq(s.text(), rand()%640+120, rand()%1024-120, rand()%2,
442 rand()%20, rand()%20);
443 }
444 mdichild->alignview->buildLayout(); //only after this it is displayed correctly
445 mdichild->alignview->setColorStyle(FXClView::csDensity);
446 if (mdichild->alignview->HasSeqs())
447 mdichild->clropt3->enable();
448 else
449 mdichild->clropt3->disable();
450 return 1;
451 }
452
453 void MainWindow::splash(const char* mesg) {
454 if (mesg==NULL) {
455 splashmsg->hide();
456 delete splashmsg;
457 return;
458 }
459 splashmsg=new FXSplashDlg(this, mesg);
460 splashmsg->create();
461 splashmsg->show();
462 getApp()->flush();
463 }
464
465 /**************************** splash/dialog */
466 // Construct a dialog box
467 FXSplashDlg::FXSplashDlg(FXWindow* ownr, const char* mesg):
468 FXDialogBox(ownr,"splash",DECOR_NONE|PLACEMENT_OWNER,
469 ownr->getX()+ownr->getWidth()/2-60,
470 ownr->getY()+ownr->getHeight()/2-30,0,0,0,0,0,0) {
471 // Contents
472 contents=new FXVerticalFrame(this, FRAME_RAISED|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0,0,0,0,0);
473 FXHorizontalFrame* fr=new FXHorizontalFrame(contents,
474 FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_CENTER_Y|LAYOUT_CENTER_X,
475 0,0,0,0,20,20,20,20);
476 msg=new FXLabel(fr, mesg, NULL, FRAME_NONE|LAYOUT_CENTER_Y|LAYOUT_FILL_X);
477 }
478
479
480 // Must delete the menus
481 FXSplashDlg::~FXSplashDlg(){
482 //anybody?
483 }