00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifdef HAVE_CONFIG_H
00010 # include <config.h>
00011 #endif
00012
00013
00014 #include "cocoa_gui_dialog_p.h"
00015 #include <assert.h>
00016
00017 #include <gwenhywfar/inherit.h>
00018 #include <gwenhywfar/debug.h>
00019 #include <gwenhywfar/gui_be.h>
00020 #include <gwenhywfar/i18n.h>
00021
00022 #include <gwenhywfar/text.h>
00023 #include <gwenhywfar/mdigest.h>
00024 #include <gwenhywfar/debug.h>
00025 #include <gwenhywfar/directory.h>
00026
00027
00028
00029 #define COCOA_DIALOG_WIDGET_REAL 0
00030 #define COCOA_DIALOG_WIDGET_CONTENT 1
00031 #define COCOA_DIALOG_WIDGET_DATA 2
00032
00033 #define COCOA_DIALOG_STRING_TITLE 0
00034 #define COCOA_DIALOG_STRING_VALUE 1
00035
00036
00037
00038
00039 #include "w_dialog.mm"
00040 #include "w_label.mm"
00041 #include "w_vlayout.mm"
00042 #include "w_hlayout.mm"
00043 #include "w_pushbutton.mm"
00044 #include "w_lineedit.mm"
00045 #include "w_textedit.mm"
00046 #include "w_checkbox.mm"
00047 #include "w_hline.mm"
00048 #include "w_vline.mm"
00049 #include "w_progressbar.mm"
00050 #include "w_radiobutton.mm"
00051 #include "w_tabbook.mm"
00052 #include "w_groupbox.mm"
00053 #include "w_combobox.mm"
00054 #include "w_gridlayout.mm"
00055 #include "w_hspacer.mm"
00056 #include "w_vspacer.mm"
00057 #include "w_listbox.mm"
00058 #include "w_scrollarea.mm"
00059 #include "w_textbrowser.mm"
00060 #include "w_stack.mm"
00061 #include "w_spinbox.mm"
00062
00063
00064
00065 GWEN_INHERIT(GWEN_DIALOG, COCOA_GUI_DIALOG)
00066
00067
00068
00069
00070 void CocoaGui_Dialog_Extend(GWEN_DIALOG *dlg) {
00071 COCOA_GUI_DIALOG *xdlg;
00072
00073 GWEN_NEW_OBJECT(COCOA_GUI_DIALOG, xdlg);
00074 GWEN_INHERIT_SETDATA(GWEN_DIALOG, COCOA_GUI_DIALOG, dlg, xdlg, CocoaGui_Dialog_FreeData);
00075
00076
00077 xdlg->setIntPropertyFn=GWEN_Dialog_SetSetIntPropertyFn(dlg, CocoaGui_Dialog_SetIntProperty);
00078 xdlg->getIntPropertyFn=GWEN_Dialog_SetGetIntPropertyFn(dlg, CocoaGui_Dialog_GetIntProperty);
00079 xdlg->setCharPropertyFn=GWEN_Dialog_SetSetCharPropertyFn(dlg, CocoaGui_Dialog_SetCharProperty);
00080 xdlg->getCharPropertyFn=GWEN_Dialog_SetGetCharPropertyFn(dlg, CocoaGui_Dialog_GetCharProperty);
00081
00082 }
00083
00084
00085
00086 void CocoaGui_Dialog_Unextend(GWEN_DIALOG *dlg){
00087 COCOA_GUI_DIALOG *xdlg;
00088
00089 assert(dlg);
00090 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, COCOA_GUI_DIALOG, dlg);
00091 assert(xdlg);
00092
00093
00094 GWEN_Dialog_SetSetIntPropertyFn(dlg, xdlg->setIntPropertyFn);
00095 GWEN_Dialog_SetGetIntPropertyFn(dlg, xdlg->getIntPropertyFn);
00096 GWEN_Dialog_SetSetCharPropertyFn(dlg, xdlg->setCharPropertyFn);
00097 GWEN_Dialog_SetGetCharPropertyFn(dlg, xdlg->getCharPropertyFn);
00098
00099 GWEN_INHERIT_UNLINK(GWEN_DIALOG, COCOA_GUI_DIALOG, dlg);
00100 }
00101
00102
00103
00104 void GWENHYWFAR_CB CocoaGui_Dialog_FreeData(void *bp, void *p) {
00105 COCOA_GUI_DIALOG *xdlg;
00106
00107 xdlg=(COCOA_GUI_DIALOG*) p;
00108
00109 if (xdlg->mainWindow) {
00110 NSWindow *window = (xdlg->mainWindow);
00111 [window release];
00112 xdlg->mainWindow = nil;
00113 }
00114
00115 GWEN_FREE_OBJECT(xdlg);
00116 }
00117
00118
00119
00120 CocoaWindow *CocoaGui_Dialog_GetMainWidget(const GWEN_DIALOG *dlg) {
00121 COCOA_GUI_DIALOG *xdlg;
00122
00123 assert(dlg);
00124 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, COCOA_GUI_DIALOG, dlg);
00125 assert(xdlg);
00126
00127 return xdlg->mainWindow;
00128 }
00129
00130
00131
00132 int CocoaGui_Dialog_SetIntProperty(GWEN_DIALOG *dlg,
00133 GWEN_WIDGET *w,
00134 GWEN_DIALOG_PROPERTY prop,
00135 int index,
00136 int value,
00137 int doSignal) {
00138 return GWEN_Widget_SetIntProperty(w, prop, index, value, doSignal);
00139 }
00140
00141
00142
00143 int CocoaGui_Dialog_GetIntProperty(GWEN_DIALOG *dlg,
00144 GWEN_WIDGET *w,
00145 GWEN_DIALOG_PROPERTY prop,
00146 int index,
00147 int defaultValue) {
00148 return GWEN_Widget_GetIntProperty(w, prop, index, defaultValue);
00149 }
00150
00151
00152
00153 int CocoaGui_Dialog_SetCharProperty(GWEN_DIALOG *dlg,
00154 GWEN_WIDGET *w,
00155 GWEN_DIALOG_PROPERTY prop,
00156 int index,
00157 const char *value,
00158 int doSignal) {
00159 return GWEN_Widget_SetCharProperty(w, prop, index, value, doSignal);
00160 }
00161
00162
00163
00164 const char *CocoaGui_Dialog_GetCharProperty(GWEN_DIALOG *dlg,
00165 GWEN_WIDGET *w,
00166 GWEN_DIALOG_PROPERTY prop,
00167 int index,
00168 const char *defaultValue) {
00169 return GWEN_Widget_GetCharProperty(w, prop, index, defaultValue);
00170 }
00171
00172
00173
00174 int CocoaGui_Dialog_Setup(GWEN_DIALOG *dlg, NSWindow *parentWindow) {
00175 COCOA_GUI_DIALOG *xdlg;
00176 GWEN_WIDGET_TREE *wtree;
00177 GWEN_WIDGET *w;
00178 int rv;
00179
00180 assert(dlg);
00181 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, COCOA_GUI_DIALOG, dlg);
00182 assert(xdlg);
00183
00184 wtree=GWEN_Dialog_GetWidgets(dlg);
00185 if (wtree==NULL) {
00186 DBG_ERROR(0, "No widget tree in dialog");
00187 return GWEN_ERROR_NOT_FOUND;
00188 }
00189 w=GWEN_Widget_Tree_GetFirst(wtree);
00190 if (w==NULL) {
00191 DBG_ERROR(0, "No widgets in dialog");
00192 return GWEN_ERROR_NOT_FOUND;
00193 }
00194
00195 rv=CocoaGui_Dialog_SetupTree(w);
00196 if (rv<0) {
00197 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
00198 return rv;
00199 }
00200
00201 xdlg->mainWindow=(CocoaWindow*)(GWEN_Widget_GetImplData(w, COCOA_DIALOG_WIDGET_REAL));
00202
00203 return 0;
00204 }
00205
00206
00207
00208 void CocoaGui_Dialog_Leave(GWEN_DIALOG *dlg, int result) {
00209 COCOA_GUI_DIALOG *xdlg;
00210 GWEN_DIALOG *parent;
00211
00212
00213 while( (parent=GWEN_Dialog_GetParentDialog(dlg)) )
00214 dlg=parent;
00215
00216 assert(dlg);
00217 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, COCOA_GUI_DIALOG, dlg);
00218 assert(xdlg);
00219
00220
00221
00222
00223 if (xdlg->mainWindow) {
00224 [NSApp abortModal];
00225 [xdlg->mainWindow close];
00226 }
00227 }
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279 int Cocoa_Gui_Dialog_Run(GWEN_DIALOG *dlg, int untilEnd) {
00280 COCOA_GUI_DIALOG *xdlg;
00281 CocoaWindow *g;
00282
00283 assert(dlg);
00284 xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, COCOA_GUI_DIALOG, dlg);
00285 assert(xdlg);
00286
00287 g=CocoaGui_Dialog_GetMainWidget(dlg);
00288 if (g==NULL) {
00289 DBG_ERROR(GWEN_LOGDOMAIN, "No main widget");
00290 CocoaGui_Dialog_Unextend(dlg);
00291 return GWEN_ERROR_INVALID;
00292 }
00293
00294 if (untilEnd) {
00295 [NSApp runModalForWindow:g];
00296 }
00297 else {
00298 NSModalSession session = [NSApp beginModalSessionForWindow:g];
00299 for (;;) {
00300 if ([NSApp runModalSession:session] != NSRunContinuesResponse)
00301 break;
00302 }
00303 [NSApp endModalSession:session];
00304 }
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344 return 0;
00345 }
00346
00347
00348
00349 int CocoaGui_Dialog_SetupTree(GWEN_WIDGET *w) {
00350 int rv;
00351
00352 switch(GWEN_Widget_GetType(w)) {
00353 case GWEN_Widget_TypeDialog:
00354 rv=CocoaGui_WDialog_Setup(w);
00355 break;
00356 case GWEN_Widget_TypeLabel:
00357 rv=CocoaGui_WLabel_Setup(w);
00358 break;
00359 case GWEN_Widget_TypeVLayout:
00360 rv=CocoaGui_WVLayout_Setup(w);
00361 break;
00362 case GWEN_Widget_TypePushButton:
00363 rv=CocoaGui_WPushButton_Setup(w);
00364 break;
00365 case GWEN_Widget_TypeHLayout:
00366 rv=CocoaGui_WHLayout_Setup(w);
00367 break;
00368 case GWEN_Widget_TypeLineEdit:
00369 rv=CocoaGui_WLineEdit_Setup(w);
00370 break;
00371 case GWEN_Widget_TypeTextEdit:
00372 rv=CocoaGui_WTextEdit_Setup(w);
00373 break;
00374 case GWEN_Widget_TypeCheckBox:
00375 rv=CocoaGui_WCheckBox_Setup(w);
00376 break;
00377 case GWEN_Widget_TypeHLine:
00378 rv=CocoaGui_WHLine_Setup(w);
00379 break;
00380 case GWEN_Widget_TypeVLine:
00381 rv=CocoaGui_WVLine_Setup(w);
00382 break;
00383 case GWEN_Widget_TypeProgressBar:
00384 rv=CocoaGui_WProgressBar_Setup(w);
00385 break;
00386 case GWEN_Widget_TypeRadioButton:
00387 rv=CocoaGui_WRadioButton_Setup(w);
00388 break;
00389 case GWEN_Widget_TypeTabBook:
00390 rv=CocoaGui_WTabBook_Setup(w);
00391 break;
00392 case GWEN_Widget_TypeTabPage:
00393
00394 GWEN_Widget_AddFlags(w, GWEN_WIDGET_FLAGS_FILLX | GWEN_WIDGET_FLAGS_FILLY);
00395 rv=CocoaGui_WVLayout_Setup(w);
00396 break;
00397 case GWEN_Widget_TypeGroupBox:
00398 rv=CocoaGui_WGroupBox_Setup(w);
00399 break;
00400 case GWEN_Widget_TypeComboBox:
00401 rv=CocoaGui_WComboBox_Setup(w);
00402 break;
00403 case GWEN_Widget_TypeGridLayout:
00404 rv=CocoaGui_WGridLayout_Setup(w);
00405 break;
00406 case GWEN_Widget_TypeHSpacer:
00407 rv=CocoaGui_WHSpacer_Setup(w);
00408 break;
00409 case GWEN_Widget_TypeVSpacer:
00410 rv=CocoaGui_WVSpacer_Setup(w);
00411 break;
00412 case GWEN_Widget_TypeListBox:
00413 rv=CocoaGui_WListBox_Setup(w);
00414 break;
00415 case GWEN_Widget_TypeScrollArea:
00416 rv=CocoaGui_WScrollArea_Setup(w);
00417 break;
00418 case GWEN_Widget_TypeTextBrowser:
00419 rv=CocoaGui_WTextBrowser_Setup(w);
00420 break;
00421 case GWEN_Widget_TypeWidgetStack:
00422 rv=CocoaGui_WStack_Setup(w);
00423 break;
00424 case GWEN_Widget_TypeSpinBox:
00425 rv=CocoaGui_WSpinBox_Setup(w);
00426 break;
00427 default:
00428 DBG_ERROR(GWEN_LOGDOMAIN, "Unhandled widget type %d", GWEN_Widget_GetType(w));
00429 rv=GWEN_ERROR_INVALID;
00430 break;
00431 }
00432
00433 if (rv<0) {
00434 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
00435 return rv;
00436 }
00437 else {
00438 GWEN_WIDGET *wChild;
00439
00440
00441 wChild=GWEN_Widget_Tree_GetFirstChild(w);
00442 while(wChild) {
00443
00444 rv=CocoaGui_Dialog_SetupTree(wChild);
00445 if (rv<0) {
00446 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
00447 return rv;
00448 }
00449 wChild=GWEN_Widget_Tree_GetNext(wChild);
00450 }
00451 }
00452
00453 return 0;
00454 }
00455
00456