1/*************************************************************************** 2 begin : August 03 2010 3 copyright : (C) 2010 by Samuel Strupp 4 5 *************************************************************************** 6 * Please see toplevel file COPYING for license details * 7 ***************************************************************************/ 8 9 10#ifdef HAVE_CONFIG_H 11# include <config.h> 12#endif 13 14 15#include "cocoa_gui_dialog_l.h" 16#include "cocoa_gui_p.h" 17 18#include <assert.h> 19 20#include <gwenhywfar/inherit.h> 21#include <gwenhywfar/debug.h> 22#include <gwenhywfar/gui_be.h> 23#include <gwenhywfar/i18n.h> 24 25#include <gwenhywfar/text.h> 26#include <gwenhywfar/mdigest.h> 27#include <gwenhywfar/debug.h> 28 29 30GWEN_INHERIT(GWEN_GUI, COCOA_GUI) 31 32 33#define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg) 34 35 36 37GWEN_GUI *Cocoa_Gui_new() { 38 GWEN_GUI *gui; 39 COCOA_GUI *xgui; 40 41 gui=GWEN_Gui_new(); 42 GWEN_NEW_OBJECT(COCOA_GUI, xgui); 43 GWEN_INHERIT_SETDATA(GWEN_GUI, COCOA_GUI, gui, xgui, Cocoa_Gui_FreeData); 44 45 GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_DIALOGSUPPORTED); 46 GWEN_Gui_UseDialogs(gui); 47 xgui->execDialogFn=GWEN_Gui_SetExecDialogFn(gui, COCOA_Gui_ExecDialog); 48 xgui->openDialogFn=GWEN_Gui_SetOpenDialogFn(gui, COCOA_Gui_OpenDialog); 49 xgui->closeDialogFn=GWEN_Gui_SetCloseDialogFn(gui, COCOA_Gui_CloseDialog); 50 xgui->runDialogFn=GWEN_Gui_SetRunDialogFn(gui, COCOA_Gui_RunDialog); 51 xgui->getFileNameDialogFn=GWEN_Gui_SetGetFileNameFn(gui, COCOA_Gui_GetFileName); 52 53 return gui; 54} 55 56 57 58void Cocoa_Gui_FreeData(void *bp, void *p) { 59 COCOA_GUI *xgui; 60 61 xgui=(COCOA_GUI*) p; 62 63 GWEN_FREE_OBJECT(xgui); 64} 65 66 67 68 69int COCOA_Gui_ExecDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg, uint32_t guiid) { 70 NSLog(@"ExecDialog"); 71 72 int rv; 73 74 rv = COCOA_Gui_OpenDialog(gui, dlg, guiid); 75 if (rv<0) { 76 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 77 return rv; 78 } 79 80 rv = COCOA_Gui_RunDialog(gui, dlg, 1); 81 COCOA_Gui_CloseDialog(gui, dlg); 82 if (rv<0) { 83 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 84 return rv; 85 } 86 87 return rv; 88} 89 90 91 92int COCOA_Gui_OpenDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg, uint32_t guiid) { 93 int rv; 94 NSWindow *g; 95 96 NSLog(@"OpenDialog"); 97 98 CocoaGui_Dialog_Extend(dlg); 99 rv=CocoaGui_Dialog_Setup(dlg, NULL); 100 if (rv<0) { 101 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 102 CocoaGui_Dialog_Unextend(dlg); 103 return rv; 104 } 105 106 NSLog(@"OpenDialog Setup"); 107 108 g=CocoaGui_Dialog_GetMainWidget(dlg); 109 if (g==NULL) { 110 DBG_ERROR(GWEN_LOGDOMAIN, "No main widget"); 111 CocoaGui_Dialog_Unextend(dlg); 112 return GWEN_ERROR_INVALID; 113 } 114 115 NSLog(@"OpenDialog GetMainWidget"); 116 117 rv=GWEN_Dialog_EmitSignalToAll(dlg, GWEN_DialogEvent_TypeInit, ""); 118 if (rv<0) { 119 DBG_INFO(GWEN_LOGDOMAIN, "Error initializing dialog: %d", rv); 120 CocoaGui_Dialog_Unextend(dlg); 121 return rv; 122 } 123 124 NSLog(@"OpenDialog EmitSignalToAll"); 125 126 /* show dialog */ 127 [g center]; 128 [g makeKeyAndOrderFront:nil]; 129 130 131 return 0; 132} 133 134 135 136int COCOA_Gui_CloseDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg) { 137 NSWindow *g; 138 int rv; 139 140 g=CocoaGui_Dialog_GetMainWidget(dlg); 141 if (g==NULL) { 142 DBG_ERROR(GWEN_LOGDOMAIN, "No main widget"); 143 CocoaGui_Dialog_Unextend(dlg); 144 return GWEN_ERROR_INVALID; 145 } 146 147 /* hide dialog */ 148 [g close]; 149 150 151 /* send fini signal to dialog */ 152 rv=GWEN_Dialog_EmitSignalToAll(dlg, GWEN_DialogEvent_TypeFini, ""); 153 if (rv<0) { 154 DBG_INFO(GWEN_LOGDOMAIN, "Error deinitializing dialog: %d", rv); 155 CocoaGui_Dialog_Unextend(dlg); 156 return rv; 157 } 158 159 CocoaGui_Dialog_Unextend(dlg); 160 return 0; 161} 162 163 164 165int COCOA_Gui_RunDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg, int untilEnd) { 166 int rv; 167 168 rv=Cocoa_Gui_Dialog_Run(dlg, untilEnd); 169 if (rv<0) { 170 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); 171 return rv; 172 } 173 return rv; 174} 175 176 177 178int COCOA_Gui_GetFileName(GWEN_GUI *gui, 179 const char *caption, 180 GWEN_GUI_FILENAME_TYPE fnt, 181 uint32_t flags, 182 const char *patterns, 183 GWEN_BUFFER *pathBuffer, 184 uint32_t guiid) { 185 char *folder=NULL; 186 char *fileName=NULL; 187 188 if (GWEN_Buffer_GetUsedBytes(pathBuffer)) { 189 folder=strdup(GWEN_Buffer_GetStart(pathBuffer)); 190 fileName=strchr(folder, GWEN_DIR_SEPARATOR); 191 if (fileName) { 192 *fileName=0; 193 fileName++; 194 if (*fileName==0) 195 fileName=NULL; 196 } 197 } 198 199 switch(fnt) { 200 case GWEN_Gui_FileNameType_OpenFileName: 201 case GWEN_Gui_FileNameType_OpenDirectory: { 202 203 NSString *title = nil; 204 if (caption && *caption) 205 title = [[[NSString alloc] initWithCString:caption encoding:NSUTF8StringEncoding] autorelease]; 206 207 NSOpenPanel *openPanel = [NSOpenPanel openPanel]; 208 if (openPanel) { 209 if (title) [openPanel setTitle:title]; 210 [openPanel setAllowsMultipleSelection:NO]; 211 [openPanel setCanChooseFiles:(fnt == GWEN_Gui_FileNameType_OpenFileName)]; 212 [openPanel setCanChooseDirectories:(fnt == GWEN_Gui_FileNameType_OpenDirectory)]; 213 214 NSString *pathToFolder = nil; 215 216 if (fileName && *fileName) 217 pathToFolder = [[[NSString alloc] initWithCString:fileName encoding:NSUTF8StringEncoding] autorelease]; 218 219 if (pathToFolder) 220 [openPanel setDirectory:pathToFolder]; 221 222 NSInteger result = [openPanel runModal]; 223 if (result == NSFileHandlingPanelOKButton) { 224 NSArray *urls = [openPanel URLs]; 225 if (urls && [urls count] > 0) { 226 NSString *path = [[(NSURL*)[urls objectAtIndex:0] path] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 227 if (path && [path length]>0) { 228 const char *filename = [path cStringUsingEncoding:NSUTF8StringEncoding]; 229 GWEN_Buffer_Reset(pathBuffer); 230 GWEN_Buffer_AppendString(pathBuffer, filename); 231 return 0; 232 } 233 } 234 } 235 } 236 237 return GWEN_ERROR_USER_ABORTED; 238 } 239 240 case GWEN_Gui_FileNameType_SaveFileName: { 241 242 NSString *title = nil; 243 if (caption && *caption) 244 title = [[[NSString alloc] initWithCString:caption encoding:NSUTF8StringEncoding] autorelease]; 245 246 NSSavePanel *savePanel = [NSSavePanel savePanel]; 247 if (savePanel) { 248 if (title) [savePanel setTitle:title]; 249 [savePanel setCanCreateDirectories:YES]; 250 251 NSString *pathToFolder = nil; 252 253 if (fileName && *fileName) 254 pathToFolder = [[[NSString alloc] initWithCString:fileName encoding:NSUTF8StringEncoding] autorelease]; 255 256 if (pathToFolder) 257 [savePanel setDirectory:pathToFolder]; 258 259 NSInteger result = [savePanel runModal]; 260 if (result == NSFileHandlingPanelOKButton) { 261 NSURL *url = [savePanel URL]; 262 if (url) { 263 NSString *path = [[url path] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 264 if (path && [path length]>0) { 265 const char *filename = [path cStringUsingEncoding:NSUTF8StringEncoding]; 266 GWEN_Buffer_Reset(pathBuffer); 267 GWEN_Buffer_AppendString(pathBuffer, filename); 268 return 0; 269 } 270 } 271 } 272 } 273 274 return GWEN_ERROR_USER_ABORTED; 275 } 276 277 default: 278 break; 279 } 280 free(folder); 281 282 return GWEN_ERROR_USER_ABORTED; 283} 284 285 286 287