gwenhywfar  4.3.1
w_combobox.mm
Go to the documentation of this file.
00001 /***************************************************************************
00002  begin       : August 16 2010
00003  copyright   : (C) 2010 by Samuel Strupp
00004  
00005  ***************************************************************************
00006  *          Please see toplevel file COPYING for license details           *
00007  ***************************************************************************/
00008 
00009 #import "CocoaPopUpButton.h"
00010 #import "CocoaComboBox.h"
00011 
00012 
00013 
00014 static GWENHYWFAR_CB
00015 int CocoaGui_WComboBox_SetIntProperty(GWEN_WIDGET *w,
00016                                                                           GWEN_DIALOG_PROPERTY prop,
00017                                                                           int index,
00018                                                                           int value,
00019                                                                           int doSignal) {
00020         CocoaComboBox *comboBox = nil;
00021         CocoaPopUpButton *popUp = nil;
00022         
00023         NSControl *control = (NSControl*)(GWEN_Widget_GetImplData(w, COCOA_DIALOG_WIDGET_REAL));
00024         assert(control);
00025         
00026         if ([control isKindOfClass:[CocoaComboBox class]]) comboBox = (CocoaComboBox*)control;
00027         else popUp = (CocoaPopUpButton*)control;
00028         
00029         switch(prop) {
00030                 case GWEN_DialogProperty_Enabled:
00031                                 [control setEnabled:(value!=0)];
00032                         return 0;
00033                         
00034                 case GWEN_DialogProperty_Focus:
00035                                 [[control window] makeFirstResponder:control];
00036                         return 0;
00037                         
00038                 case GWEN_DialogProperty_Value:
00039                         if (comboBox) {
00040                                 [comboBox selectItemAtIndex:value];
00041                         }
00042                         else if (popUp) {
00043                                 [popUp selectItemAtIndex:value];
00044                         }
00045 
00046                         return 0;
00047                         
00048                 case GWEN_DialogProperty_ClearValues: {
00049                         if (comboBox) [comboBox removeAllItems];
00050                         else if (popUp) [popUp removeAllItems];
00051                         return 0;
00052                 }
00053                         
00054                         
00055                 default:
00056                         break;
00057         }
00058         
00059         DBG_WARN(GWEN_LOGDOMAIN,
00060                          "Function is not appropriate for this type of widget (%s)",
00061                          GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
00062         return GWEN_ERROR_INVALID;
00063 }
00064 
00065 
00066 
00067 
00068 static GWENHYWFAR_CB
00069 int CocoaGui_WComboBox_GetIntProperty(GWEN_WIDGET *w,
00070                                                                           GWEN_DIALOG_PROPERTY prop,
00071                                                                           int index,
00072                                                                           int defaultValue) {
00073         CocoaComboBox *comboBox = nil;
00074         CocoaPopUpButton *popUp = nil;
00075         
00076         NSControl *control = (NSControl*)(GWEN_Widget_GetImplData(w, COCOA_DIALOG_WIDGET_REAL));
00077         assert(control);
00078         
00079         if ([control isKindOfClass:[CocoaComboBox class]]) comboBox = (CocoaComboBox*)control;
00080         else popUp = (CocoaPopUpButton*)control;
00081         
00082         switch(prop) {
00083                 case GWEN_DialogProperty_Enabled:
00084                         return ([control isEnabled])?1:0;
00085                         
00086                 case GWEN_DialogProperty_Focus:
00087                         if ([control window]) {
00088                                 if ([[control window] firstResponder] == control) return 1;
00089                         }
00090                         return 0;
00091                         
00092                 case GWEN_DialogProperty_Value: {
00093                         if (comboBox) {
00094                                 return [comboBox indexOfSelectedItem];
00095                         }
00096                         else if (popUp) {
00097                                 return [popUp indexOfSelectedItem];
00098                         }
00099                         return defaultValue;
00100                 }
00101                         
00102                 case GWEN_DialogProperty_ValueCount: {
00103                         int i = -1;
00104                         if (comboBox) {
00105                                 i = [comboBox numberOfItems];
00106                         }
00107                         else if (popUp) {
00108                                 i = [popUp numberOfItems];
00109                         }
00110                         
00111                         DBG_ERROR(0, "Number: %d", i);
00112                         return i;
00113                 }
00114                         
00115                 default:
00116                         break;
00117         }
00118         
00119         DBG_WARN(GWEN_LOGDOMAIN,
00120                          "Function is not appropriate for this type of widget (%s)",
00121                          GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
00122         return defaultValue;
00123 }
00124 
00125 
00126 
00127 static GWENHYWFAR_CB
00128 int CocoaGui_WComboBox_SetCharProperty(GWEN_WIDGET *w,
00129                                                                            GWEN_DIALOG_PROPERTY prop,
00130                                                                            int index,
00131                                                                            const char *value,
00132                                                                            int doSignal) {
00133         CocoaComboBox *comboBox = nil;
00134         CocoaPopUpButton *popUp = nil;
00135         
00136         NSControl *control = (NSControl*)(GWEN_Widget_GetImplData(w, COCOA_DIALOG_WIDGET_REAL));
00137         assert(control);
00138         
00139         if ([control isKindOfClass:[CocoaComboBox class]]) comboBox = (CocoaComboBox*)control;
00140         else popUp = (CocoaPopUpButton*)control;
00141         
00142         switch(prop) {
00143                 case GWEN_DialogProperty_Value: {
00144                         return GWEN_ERROR_NOT_FOUND;
00145                 }
00146                         
00147                 case GWEN_DialogProperty_AddValue: {
00148                         
00149                         NSString *stringValue = [[NSString alloc] initWithCString:value encoding:NSUTF8StringEncoding];
00150                         if (popUp && stringValue) {
00151                                 [popUp addItemWithTitle:stringValue];
00152                         }
00153                         else if (comboBox && stringValue) {
00154                                 [comboBox addItemWithObjectValue:stringValue];
00155                         }
00156 
00157                         [stringValue release];
00158                         return 0;
00159                 }
00160                         
00161                 case GWEN_DialogProperty_ClearValues: {
00162                         if (comboBox) [comboBox removeAllItems];
00163                         else if (popUp) [popUp removeAllItems];
00164                         return 0;
00165                 }
00166                         
00167                 default:
00168                         break;
00169         }
00170         
00171         DBG_WARN(GWEN_LOGDOMAIN,
00172                          "Function is not appropriate for this type of widget (%s)",
00173                          GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
00174         return GWEN_ERROR_INVALID;
00175 }
00176 
00177 
00178 
00179 static GWENHYWFAR_CB
00180 const char* CocoaGui_WComboBox_GetCharProperty(GWEN_WIDGET *w,
00181                                                                                            GWEN_DIALOG_PROPERTY prop,
00182                                                                                            int index,
00183                                                                                            const char *defaultValue) {
00184         CocoaComboBox *comboBox = nil;
00185         CocoaPopUpButton *popUp = nil;
00186         
00187         NSControl *control = (NSControl*)(GWEN_Widget_GetImplData(w, COCOA_DIALOG_WIDGET_REAL));
00188         assert(control);
00189         
00190         if ([control isKindOfClass:[CocoaComboBox class]]) comboBox = (CocoaComboBox*)control;
00191         else popUp = (CocoaPopUpButton*)control;
00192         
00193         switch(prop) {
00194                 case GWEN_DialogProperty_Value: {
00195                         NSString *value = nil;
00196                         
00197                         if (popUp) {
00198                                 value = [popUp titleOfSelectedItem];
00199                         }
00200                         else if (comboBox && [[comboBox itemObjectValueAtIndex:index] isKindOfClass:[NSString class]]) {
00201                                 value = [comboBox itemObjectValueAtIndex:index];
00202                         }
00203                         
00204                         if (value) return [value cStringUsingEncoding:NSUTF8StringEncoding];
00205                         return NULL;
00206                 }
00207                         
00208                 default:
00209                         break;
00210         }
00211         
00212         DBG_WARN(GWEN_LOGDOMAIN,
00213                          "Function is not appropriate for this type of widget (%s)",
00214                          GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
00215         return defaultValue;
00216 }
00217 
00218 
00219 
00220 static void CocoaGui_WComboBox_Changed_handler(NSControl *comboBoxOrPopUp, void* data) {
00221         GWEN_WIDGET *w;
00222         int rv;
00223         
00224         DBG_ERROR(0, "Changed");
00225         w=(GWEN_WIDGET*)data;
00226         assert(w);
00227         rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
00228                                                           GWEN_DialogEvent_TypeActivated,
00229                                                           GWEN_Widget_GetName(w));
00230         if (rv==GWEN_DialogEvent_ResultAccept)
00231                 CocoaGui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
00232         else if (rv==GWEN_DialogEvent_ResultReject)
00233                 CocoaGui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
00234 }
00235 
00236 /*static void changed_handler(GtkWidget *comboBox, gpointer data) {
00237         GWEN_WIDGET *w;
00238         int rv;
00239         
00240         DBG_ERROR(0, "Changed");
00241         w=data;
00242         assert(w);
00243         rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
00244                                                           GWEN_DialogEvent_TypeActivated,
00245                                                           GWEN_Widget_GetName(w));
00246         if (rv==GWEN_DialogEvent_ResultAccept)
00247                 Gtk2Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
00248         else if (rv==GWEN_DialogEvent_ResultReject)
00249                 Gtk2Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
00250 }*/
00251 
00252 
00253 
00254 int CocoaGui_WComboBox_Setup(GWEN_WIDGET *w) {
00255         // GtkWidget *g;
00256         //GtkCellRenderer *cr;
00257         //GtkListStore *store;
00258         uint32_t flags;
00259         GWEN_WIDGET *wParent;
00260         //gulong changed_handler_id;
00261         
00262         flags=GWEN_Widget_GetFlags(w);
00263         wParent=GWEN_Widget_Tree_GetParent(w);
00264         
00265         
00266         if (flags & GWEN_WIDGET_FLAGS_READONLY) {
00267                 //NSPopUpButton
00268                 CocoaPopUpButton *popUp = [[[CocoaPopUpButton alloc] initWithFrame:NSMakeRect(0.0, 0.0, 60.0, 24.0) pullsDown:NO] autorelease];
00269                 if (flags & GWEN_WIDGET_FLAGS_FILLX) popUp.fillX = YES;
00270                 if (flags & GWEN_WIDGET_FLAGS_FILLY) popUp.fillY = YES;
00271                 
00272                 GWEN_Widget_SetImplData(w, COCOA_DIALOG_WIDGET_REAL, (void*) popUp);
00273                 GWEN_Widget_SetImplData(w, COCOA_DIALOG_WIDGET_CONTENT, (void*) popUp);
00274                 
00275                 gwenPopUpActionPtr ptr = CocoaGui_WComboBox_Changed_handler;
00276                 [popUp setC_PopUpActionPtr:ptr Data:w];
00277         }
00278         else {
00279                 //NSComboBox
00280                 CocoaComboBox *comboBox = [[[CocoaComboBox alloc] initWithFrame:NSMakeRect(0.0, 0.0, 60.0, 24.0)] autorelease];
00281                 if (flags & GWEN_WIDGET_FLAGS_FILLX) comboBox.fillX = YES;
00282                 if (flags & GWEN_WIDGET_FLAGS_FILLY) comboBox.fillY = YES;
00283                 
00284                 GWEN_Widget_SetImplData(w, COCOA_DIALOG_WIDGET_REAL, (void*) comboBox);
00285                 GWEN_Widget_SetImplData(w, COCOA_DIALOG_WIDGET_CONTENT, (void*) comboBox);
00286                 
00287                 gwenComboBoxActionPtr ptr = CocoaGui_WComboBox_Changed_handler;
00288                 [comboBox setC_ComboBoxActionPtr:ptr Data:w];
00289         }
00290         
00291         GWEN_Widget_SetSetIntPropertyFn(w, CocoaGui_WComboBox_SetIntProperty);
00292         GWEN_Widget_SetGetIntPropertyFn(w, CocoaGui_WComboBox_GetIntProperty);
00293         GWEN_Widget_SetSetCharPropertyFn(w, CocoaGui_WComboBox_SetCharProperty);
00294         GWEN_Widget_SetGetCharPropertyFn(w, CocoaGui_WComboBox_GetCharProperty);
00295         
00296 #pragma mark NOCH MACHEN Action setzen
00297         
00298         /*changed_handler_id=g_signal_connect(g,
00299          "changed",
00300          G_CALLBACK (changed_handler),
00301          w);*/
00302         
00303         if (wParent)
00304                 GWEN_Widget_AddChildGuiWidget(wParent, w);
00305         
00306         return 0;
00307 }
00308 
00309