00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifdef HAVE_CONFIG_H
00011 # include <config.h>
00012 #endif
00013
00014
00015 #include "fox16_gui.hpp"
00016 #include "fox16_gui_dialog_l.hpp"
00017 #include "fox16_gui_updater_l.hpp"
00018
00019 #include <gwenhywfar/debug.h>
00020
00021
00022
00023 FOX16_Gui::WinScope::WinScope(uint32_t parentId, FXWindow *w)
00024 : m_parentId(parentId)
00025 , m_id(0)
00026 , m_window(w)
00027 , m_type(WIN_SCOPE_TYPE_WINDOW) {
00028 FOX16_Gui *gui=FOX16_Gui::getFgGui();
00029 assert(gui);
00030
00031 if (m_parentId==0)
00032 m_parentId=gui->getIdOfLastScope();
00033 m_id=gui->getNextId();
00034 gui->addWinScope(this);
00035 }
00036
00037
00038
00039 FOX16_Gui::WinScope::WinScope(FXWindow *w)
00040 : m_parentId()
00041 , m_id(ID_MAINWINDOW)
00042 , m_window(w)
00043 , m_type(WIN_SCOPE_TYPE_WINDOW) {
00044 FOX16_Gui *gui=FOX16_Gui::getFgGui();
00045 assert(gui);
00046
00047 gui->addWinScope(this);
00048 }
00049
00050
00051
00052 FOX16_Gui::WinScope::WinScope(FOX16_Gui::WinScope::WIN_SCOPE_TYPE t, uint32_t parentId, FXWindow *w)
00053 : m_parentId(parentId)
00054 , m_id(0)
00055 , m_window(w)
00056 , m_type(t) {
00057 FOX16_Gui *gui=FOX16_Gui::getFgGui();
00058 assert(gui);
00059
00060 if (m_parentId==0)
00061 m_parentId=gui->getIdOfLastScope();
00062 m_id=gui->getNextId();
00063 gui->addWinScope(this);
00064 }
00065
00066
00067
00068 FOX16_Gui::WinScope::~WinScope() {
00069 FOX16_Gui *gui=FOX16_Gui::getFgGui();
00070 assert(gui);
00071 gui->delWinScope(this);
00072 }
00073
00074
00075
00076
00077
00078
00079 FOX16_Gui::FOX16_Gui(FXApp *a)
00080 :CppGui()
00081 ,m_app(a)
00082 ,m_lastId(0)
00083 ,m_updater()
00084 ,m_fontList(NULL)
00085 {
00086 m_updater=new FOX16_GuiUpdater();
00087 GWEN_Gui_AddFlags(_gui, GWEN_GUI_FLAGS_DIALOGSUPPORTED);
00088 GWEN_Gui_UseDialogs(_gui);
00089 GWEN_Gui_SetName(_gui, "fox16-gui");
00090 m_fontList=HtmlFont_List_new();
00091 }
00092
00093
00094
00095 FOX16_Gui::~FOX16_Gui() {
00096 if (!m_scopeList.empty()) {
00097 DBG_ERROR(GWEN_LOGDOMAIN, "ScopeList is not empty!");
00098 }
00099
00100 if (m_updater)
00101 delete m_updater;
00102 HtmlFont_List_free(m_fontList);
00103 }
00104
00105
00106
00107 uint32_t FOX16_Gui::getNextId() {
00108 return ++m_lastId;
00109 }
00110
00111
00112
00113 uint32_t FOX16_Gui::getIdOfLastScope() {
00114 if (!m_scopeList.empty())
00115 return m_scopeList.back()->getId();
00116
00117 return 0;
00118 }
00119
00120
00121
00122 void FOX16_Gui::addWinScope(WinScope *ws) {
00123 m_scopeList.push_back(ws);
00124 }
00125
00126
00127
00128 void FOX16_Gui::delWinScope(WinScope *ws) {
00129 m_scopeList.remove(ws);
00130 }
00131
00132
00133
00134 FOX16_Gui::WinScope *FOX16_Gui::findWinScope(uint32_t id) {
00135 WinScopePtrList::iterator it;
00136
00137 for (it=m_scopeList.begin();
00138 it!=m_scopeList.end();
00139 it++) {
00140 if ((*it)->getId()==id)
00141 return (*it);
00142 }
00143
00144 return NULL;
00145 }
00146
00147
00148
00149 FXWindow *FOX16_Gui::getGuiWindow(uint32_t id) {
00150 return m_app->getActiveWindow();
00151 }
00152
00153
00154
00155
00156 FOX16_Gui *FOX16_Gui::getFgGui() {
00157 CppGui *cppgui;
00158
00159 cppgui=CppGui::getCppGui();
00160 if (cppgui)
00161 return dynamic_cast<FOX16_Gui*>(cppgui);
00162 else
00163 return NULL;
00164 }
00165
00166
00167
00168 void FOX16_Gui::dumpScopeList() {
00169 WinScopePtrList::iterator it;
00170
00171 for (it=m_scopeList.begin();
00172 it!=m_scopeList.end();
00173 it++) {
00174 const char *s;
00175
00176 switch((*it)->getType()) {
00177 case WinScope::WIN_SCOPE_TYPE_WINDOW:
00178 s="window";
00179 break;
00180 default:
00181 s="unknown";
00182 break;
00183 }
00184 fprintf(stderr, "WinScope: id %08x, parent %08x, type %s\n",
00185 (*it)->getId(),
00186 (*it)->getParentId(),
00187 s);
00188 }
00189 }
00190
00191
00192
00193
00194 int FOX16_Gui::print(const char *docTitle,
00195 const char *docType,
00196 const char *descr,
00197 const char *text,
00198 uint32_t guiid) {
00199 DBG_ERROR(GWEN_LOGDOMAIN, "Not implemented");
00200 return GWEN_ERROR_NOT_IMPLEMENTED;
00201 }
00202
00203
00204
00205 FXString FOX16_Gui::getRawText(const char *text) {
00206 const char *p=0;
00207 const char *p2=0;
00208
00209 if (text==NULL)
00210 return FXString("");
00211
00212
00213 p=text;
00214 while ((p=strchr(p, '<'))) {
00215 const char *t;
00216
00217 t=p;
00218 t++;
00219 if (toupper(*t)=='H') {
00220 t++;
00221 if (toupper(*t)=='T') {
00222 t++;
00223 if (toupper(*t)=='M') {
00224 t++;
00225 if (toupper(*t)=='L') {
00226 t++;
00227 if (toupper(*t)=='>') {
00228 break;
00229 }
00230 }
00231 }
00232 }
00233 }
00234 p++;
00235 }
00236
00237
00238 if (p) {
00239 p2=p;
00240 p2+=6;
00241 while ((p2=strchr(p2, '<'))) {
00242 const char *t;
00243
00244 t=p2;
00245 t++;
00246 if (toupper(*t)=='/') {
00247 t++;
00248 if (toupper(*t)=='H') {
00249 t++;
00250 if (toupper(*t)=='T') {
00251 t++;
00252 if (toupper(*t)=='M') {
00253 t++;
00254 if (toupper(*t)=='L') {
00255 t++;
00256 if (toupper(*t)=='>') {
00257 break;
00258 }
00259 }
00260 }
00261 }
00262 }
00263 }
00264 p2++;
00265 }
00266 }
00267
00268 if (p && p2) {
00269 p2+=7;
00270
00271 int startPos=(p-text);
00272 int endPos=(p2-text);
00273 FXString result;
00274
00275 result=FXString(text);
00276 result.erase(startPos, endPos);
00277 return result;
00278 }
00279 else
00280 return FXString(text);
00281 }
00282
00283
00284
00285 FXString FOX16_Gui::getHtmlText(const char *text) {
00286 const char *p=0;
00287 const char *p2=0;
00288
00289 if (text==NULL)
00290 return FXString("");
00291
00292
00293 p=text;
00294 while ((p=strchr(p, '<'))) {
00295 const char *t;
00296
00297 t=p;
00298 t++;
00299 if (toupper(*t)=='H') {
00300 t++;
00301 if (toupper(*t)=='T') {
00302 t++;
00303 if (toupper(*t)=='M') {
00304 t++;
00305 if (toupper(*t)=='L') {
00306 t++;
00307 if (toupper(*t)=='>') {
00308 break;
00309 }
00310 }
00311 }
00312 }
00313 }
00314 p++;
00315 }
00316
00317
00318 if (p) {
00319 p+=6;
00320 p2=p;
00321 while ((p2=strchr(p2, '<'))) {
00322 const char *t;
00323
00324 t=p2;
00325 t++;
00326 if (toupper(*t)=='/') {
00327 t++;
00328 if (toupper(*t)=='H') {
00329 t++;
00330 if (toupper(*t)=='T') {
00331 t++;
00332 if (toupper(*t)=='M') {
00333 t++;
00334 if (toupper(*t)=='L') {
00335 t++;
00336 if (toupper(*t)=='>') {
00337 break;
00338 }
00339 }
00340 }
00341 }
00342 }
00343 }
00344 p2++;
00345 }
00346 }
00347
00348 if (p && p2)
00349 return FXString(p, p2-p);
00350 else
00351 return FXString(text);
00352 }
00353
00354
00355
00356 int FOX16_Gui::execDialog(GWEN_DIALOG *dlg, uint32_t guiid) {
00357 FOX16_GuiDialog foxDlg(this, dlg);
00358 FXWindow *owner;
00359
00360
00361 owner=m_app->getActiveWindow();
00362
00363
00364 if (!(foxDlg.setup(owner))) {
00365 return GWEN_ERROR_GENERIC;
00366 }
00367
00368 return foxDlg.execute();
00369 }
00370
00371
00372
00373 int FOX16_Gui::openDialog(GWEN_DIALOG *dlg, uint32_t guiid) {
00374 FOX16_GuiDialog *foxDlg;
00375 FXWindow *owner;
00376
00377
00378 owner=m_app->getActiveWindow();
00379
00380 foxDlg=new FOX16_GuiDialog(this, dlg);
00381
00382
00383 if (!(foxDlg->setup(owner))) {
00384 delete foxDlg;
00385 return GWEN_ERROR_GENERIC;
00386 }
00387
00388 foxDlg->openDialog();
00389 m_updater->guiUpdate();
00390
00391 return 0;
00392 }
00393
00394
00395
00396 int FOX16_Gui::closeDialog(GWEN_DIALOG *dlg) {
00397 FOX16_GuiDialog *foxDlg;
00398
00399 foxDlg=FOX16_GuiDialog::getDialog(dlg);
00400 assert(foxDlg);
00401
00402 foxDlg->closeDialog();
00403 delete foxDlg;
00404 m_updater->guiUpdate();
00405
00406 return 0;
00407 }
00408
00409
00410
00411 int FOX16_Gui::runDialog(GWEN_DIALOG *dlg, int untilEnd) {
00412 FOX16_GuiDialog *foxDlg;
00413
00414 foxDlg=FOX16_GuiDialog::getDialog(dlg);
00415 assert(foxDlg);
00416
00417 if (untilEnd)
00418 return foxDlg->cont();
00419 else {
00420 m_updater->guiUpdate();
00421 return 0;
00422 }
00423 }
00424
00425
00426
00427 int FOX16_Gui::getFileName(const char *caption,
00428 GWEN_GUI_FILENAME_TYPE fnt,
00429 uint32_t flags,
00430 const char *patterns,
00431 GWEN_BUFFER *pathBuffer,
00432 uint32_t guiid) {
00433 FXString sCaption;
00434 FXString sPatterns;
00435 FXString sPath;
00436 FXString str;
00437 FXWindow *owner;
00438
00439 if (caption)
00440 sCaption=FXString(caption);
00441
00442 if (patterns) {
00443 const char *s1;
00444 const char *s2;
00445
00446 s1=patterns;
00447 while(s1 && *s1) {
00448 s2=strchr(s1, '\t');
00449 if (s2) {
00450 str=FXString(s1, s2-s1);
00451
00452 s2++;
00453 }
00454 else {
00455 str=FXString(s1);
00456 s2=NULL;
00457 }
00458
00459 if (str.contains('(')) {
00460 if (!sPatterns.empty())
00461 sPatterns+='\n';
00462 sPatterns+=str.before('(');
00463 str=str.after('(');
00464 sPatterns+='(';
00465 sPatterns+=str.substitute(';', ',');
00466 }
00467 else {
00468 if (!sPatterns.empty())
00469 sPatterns+='\n';
00470 sPatterns+=str.substitute(';', ',');
00471 }
00472
00473 s1=s2;
00474 }
00475 }
00476
00477 if (GWEN_Buffer_GetUsedBytes(pathBuffer))
00478 sPath=FXString(GWEN_Buffer_GetStart(pathBuffer));
00479
00480 owner=m_app->getModalWindow();
00481 if (owner==NULL) {
00482 owner=m_app->getActiveWindow();
00483 }
00484 if (owner==NULL) {
00485 owner=m_app->getRootWindow();
00486 }
00487 if (owner==NULL) {
00488 DBG_ERROR(GWEN_LOGDOMAIN, "Could not determine owner window");
00489 return GWEN_ERROR_INTERNAL;
00490 }
00491
00492 switch(fnt) {
00493 case GWEN_Gui_FileNameType_OpenFileName:
00494 str=FXFileDialog::getOpenFilename(owner, sCaption, sPath, sPatterns, 0);
00495 break;
00496
00497 case GWEN_Gui_FileNameType_SaveFileName:
00498 str=FXFileDialog::getSaveFilename(owner, sCaption, sPath, sPatterns, 0);
00499 break;
00500
00501 case GWEN_Gui_FileNameType_OpenDirectory:
00502 str=FXFileDialog::getOpenDirectory(owner, sCaption, sPath);
00503 break;
00504 }
00505
00506 if (str.empty()) {
00507 DBG_ERROR(GWEN_LOGDOMAIN, "Empty filename returned.");
00508 return GWEN_ERROR_ABORTED;
00509 }
00510 else {
00511 GWEN_Buffer_Reset(pathBuffer);
00512 GWEN_Buffer_AppendString(pathBuffer, str.text());
00513 return 0;
00514 }
00515 }
00516
00517
00518
00519 HTML_FONT *FOX16_Gui::findFont(const char *fontName,
00520 int fontSize,
00521 uint32_t fontFlags) {
00522 HTML_FONT *fnt;
00523
00524 assert(m_fontList);
00525 fnt=HtmlFont_List_First(m_fontList);
00526 while(fnt) {
00527 const char *s;
00528
00529 s=HtmlFont_GetFontName(fnt);
00530 if (s && *s &&
00531 HtmlFont_GetFontSize(fnt)==fontSize &&
00532 HtmlFont_GetFontFlags(fnt)==fontFlags &&
00533 strcasecmp(s, fontName)==0)
00534 break;
00535 fnt=HtmlFont_List_Next(fnt);
00536 }
00537
00538 return fnt;
00539 }
00540
00541
00542
00543 HTML_FONT *FOX16_Gui::getFont(const char *fontName,
00544 int fontSize,
00545 uint32_t fontFlags) {
00546 HTML_FONT *fnt;
00547
00548 fnt=findFont(fontName, fontSize, fontFlags);
00549 if (fnt)
00550 return fnt;
00551 else {
00552 fnt=HtmlFont_new();
00553 HtmlFont_SetFontName(fnt, fontName);
00554 HtmlFont_SetFontSize(fnt, fontSize);
00555 HtmlFont_SetFontFlags(fnt, fontFlags);
00556 HtmlFont_List_Add(fnt, m_fontList);
00557 return fnt;
00558 }
00559 }
00560
00561
00562
00563
00564