X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d57be459406c2830f6abc9d99ae99166c6d133b..82540ef2327daaf6ae78189139a669afc9edf9d9:/src/motif/choice.cpp diff --git a/src/motif/choice.cpp b/src/motif/choice.cpp index d71587ca85..b67015a958 100644 --- a/src/motif/choice.cpp +++ b/src/motif/choice.cpp @@ -29,7 +29,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl) #endif void wxChoiceCallback (Widget w, XtPointer clientData, - XtPointer ptr); + XtPointer ptr); wxChoice::wxChoice() { @@ -41,63 +41,64 @@ wxChoice::wxChoice() } bool wxChoice::Create(wxWindow *parent, wxWindowID id, - const wxPoint& pos, - const wxSize& size, - int n, const wxString choices[], - long style, - const wxValidator& validator, - const wxString& name) + const wxPoint& pos, + const wxSize& size, + int n, const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name) { SetName(name); SetValidator(validator); - m_noStrings = n; + m_noStrings = 0; // Starts off with none, incremented in Append m_windowStyle = style; m_buttonWidget = (WXWidget) 0; m_menuWidget = (WXWidget) 0; m_widgetList = (WXWidget*) 0; m_formWidget = (WXWidget) 0; - + if (parent) parent->AddChild(this); - + if ( id == -1 ) - m_windowId = (int)NewControlId(); + m_windowId = (int)NewControlId(); else - m_windowId = id; - + m_windowId = id; + m_backgroundColour = parent->GetBackgroundColour(); m_foregroundColour = parent->GetForegroundColour(); - + m_windowFont = parent->GetFont(); + Widget parentWidget = (Widget) parent->GetClientWidget(); - + m_formWidget = (WXWidget) XtVaCreateManagedWidget ((char*) (const char*) name, - xmRowColumnWidgetClass, parentWidget, - XmNmarginHeight, 0, - XmNmarginWidth, 0, - XmNpacking, XmPACK_TIGHT, - XmNorientation, XmHORIZONTAL, - NULL); - + xmRowColumnWidgetClass, parentWidget, + XmNmarginHeight, 0, + XmNmarginWidth, 0, + XmNpacking, XmPACK_TIGHT, + XmNorientation, XmHORIZONTAL, + NULL); + XtVaSetValues ((Widget) m_formWidget, XmNspacing, 0, NULL); - - /* + + /* * Create the popup menu */ m_menuWidget = (WXWidget) XmCreatePulldownMenu ((Widget) m_formWidget, "choiceMenu", NULL, 0); - - int i; + + // int i; if (n > 0) { int i; for (i = 0; i < n; i++) Append (choices[i]); } - - /* + + /* * Create button */ Arg args[10]; Cardinal argcnt = 0; - + XtSetArg (args[argcnt], XmNsubMenuId, (Widget) m_menuWidget); argcnt++; XtSetArg (args[argcnt], XmNmarginWidth, 0); @@ -107,9 +108,9 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID id, XtSetArg (args[argcnt], XmNpacking, XmPACK_TIGHT); argcnt++; m_buttonWidget = (WXWidget) XmCreateOptionMenu ((Widget) m_formWidget, "choiceButton", args, argcnt); - + m_mainWidget = m_buttonWidget; - + XtManageChild ((Widget) m_buttonWidget); // New code from Roland Haenel (roland_haenel@ac.cybercity.de) @@ -119,95 +120,107 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID id, #if XmVersion >= 1002 #if XmVersion < 2000 Widget optionLabel = XmOptionLabelGadget ((Widget) m_buttonWidget); - XtUnmanageChild (optionLabel); + // JACS, 24/1/99: this seems to cause a malloc crash later on, e.g. + // in controls sample. + // XtUnmanageChild (optionLabel); #endif #endif XtVaSetValues((Widget) m_formWidget, XmNresizePolicy, XmRESIZE_NONE, NULL); + + ChangeFont(FALSE); AttachWidget (parent, m_buttonWidget, m_formWidget, pos.x, pos.y, size.x, size.y); - - SetFont(* parent->GetFont()); + ChangeBackgroundColour(); - + return TRUE; } wxChoice::~wxChoice() { - // For some reason destroying the menuWidget - // can cause crashes on some machines. It will - // be deleted implicitly by deleting the parent form - // anyway. -// XtDestroyWidget (menuWidget); + // For some reason destroying the menuWidget + // can cause crashes on some machines. It will + // be deleted implicitly by deleting the parent form + // anyway. + // XtDestroyWidget (menuWidget); if (m_widgetList) delete[] m_widgetList; - - DetachWidget(GetMainWidget()); // Removes event handlers - - XtDestroyWidget((Widget) m_formWidget); - m_formWidget = (WXWidget) 0; - - // Presumably the other widgets have been deleted now, via the form - m_mainWidget = (WXWidget) 0; - m_buttonWidget = (WXWidget) 0; + + if (GetMainWidget()) + { + DetachWidget(GetMainWidget()); // Removes event handlers + DetachWidget(m_formWidget); + + XtDestroyWidget((Widget) m_formWidget); + m_formWidget = (WXWidget) 0; + + // Presumably the other widgets have been deleted now, via the form + m_mainWidget = (WXWidget) 0; + m_buttonWidget = (WXWidget) 0; + } } void wxChoice::Append(const wxString& item) { - wxStripMenuCodes ((char *)(const char *)item, wxBuffer); - Widget w = XtVaCreateManagedWidget (wxBuffer, + wxStripMenuCodes ((char *)(const char *)item, wxBuffer); + Widget w = XtVaCreateManagedWidget (wxBuffer, #if USE_GADGETS - xmPushButtonGadgetClass, (Widget) m_menuWidget, + xmPushButtonGadgetClass, (Widget) m_menuWidget, #else - xmPushButtonWidgetClass, (Widget) m_menuWidget, + xmPushButtonWidgetClass, (Widget) m_menuWidget, #endif - NULL); - - if (m_windowFont.Ok()) - XtVaSetValues (w, - XmNfontList, (XmFontList) m_windowFont.GetFontList(1.0, XtDisplay((Widget) m_formWidget)), - NULL); - - WXWidget *new_widgetList = new WXWidget[m_noStrings + 1]; - int i; - for (i = 0; i < m_noStrings; i++) - new_widgetList[i] = m_widgetList[i]; - new_widgetList[m_noStrings] = (WXWidget) w; - if (m_widgetList) - delete[] m_widgetList; - m_widgetList = new_widgetList; - - char mnem = wxFindMnemonic ((char*) (const char*) item); - if (mnem != 0) - XtVaSetValues (w, XmNmnemonic, mnem, NULL); - - XtAddCallback (w, XmNactivateCallback, (XtCallbackProc) wxChoiceCallback, (XtPointer) this); - - if (m_noStrings == 0 && m_buttonWidget) - { - XtVaSetValues ((Widget) m_buttonWidget, XmNmenuHistory, w, NULL); - Widget label = XmOptionButtonGadget ((Widget) m_buttonWidget); - XmString text = XmStringCreateSimple ((char*) (const char*) item); - XtVaSetValues (label, - XmNlabelString, text, - NULL); - XmStringFree (text); - } - wxNode *node = m_stringList.Add (item); - XtVaSetValues (w, XmNuserData, node->Data (), NULL); - - m_noStrings ++; + NULL); + + DoChangeBackgroundColour((WXWidget) w, m_backgroundColour); + + if (m_windowFont.Ok()) + XtVaSetValues (w, + XmNfontList, (XmFontList) m_windowFont.GetFontList(1.0, XtDisplay((Widget) m_formWidget)), + NULL); + + WXWidget *new_widgetList = new WXWidget[m_noStrings + 1]; + int i; + if (m_widgetList) + for (i = 0; i < m_noStrings; i++) + new_widgetList[i] = m_widgetList[i]; + + new_widgetList[m_noStrings] = (WXWidget) w; + + if (m_widgetList) + delete[] m_widgetList; + m_widgetList = new_widgetList; + + char mnem = wxFindMnemonic ((char*) (const char*) item); + if (mnem != 0) + XtVaSetValues (w, XmNmnemonic, mnem, NULL); + + XtAddCallback (w, XmNactivateCallback, (XtCallbackProc) wxChoiceCallback, (XtPointer) this); + + if (m_noStrings == 0 && m_buttonWidget) + { + XtVaSetValues ((Widget) m_buttonWidget, XmNmenuHistory, w, NULL); + Widget label = XmOptionButtonGadget ((Widget) m_buttonWidget); + XmString text = XmStringCreateSimple ((char*) (const char*) item); + XtVaSetValues (label, + XmNlabelString, text, + NULL); + XmStringFree (text); + } + wxNode *node = m_stringList.Add (item); + XtVaSetValues (w, XmNuserData, node->Data (), NULL); + + m_noStrings ++; } -void wxChoice::Delete(int n) +void wxChoice::Delete(int WXUNUSED(n)) { wxFAIL_MSG( "Sorry, wxChoice::Delete isn't implemented yet. Maybe you'd like to volunteer? :-)" ); - + // What should we do -- remove the callback for this button widget, // delete the m_stringList entry, delete the button widget, construct a new widget list // (see Append) - + // TODO m_noStrings --; } @@ -231,59 +244,59 @@ void wxChoice::Clear() int wxChoice::GetSelection() const { - XmString text; - char *s; - Widget label = XmOptionButtonGadget ((Widget) m_buttonWidget); - XtVaGetValues (label, - XmNlabelString, &text, - NULL); - - if (XmStringGetLtoR (text, XmSTRING_DEFAULT_CHARSET, &s)) - { - int i = 0; - for (wxNode * node = m_stringList.First (); node; node = node->Next ()) - { - char *s1 = (char *) node->Data (); - if (s1 == s || strcmp (s1, s) == 0) + XmString text; + char *s; + Widget label = XmOptionButtonGadget ((Widget) m_buttonWidget); + XtVaGetValues (label, + XmNlabelString, &text, + NULL); + + if (XmStringGetLtoR (text, XmSTRING_DEFAULT_CHARSET, &s)) + { + int i = 0; + for (wxNode * node = m_stringList.First (); node; node = node->Next ()) { - XmStringFree(text) ; - XtFree (s); - return i; - } - else - i++; - } // for() - - XmStringFree(text) ; - XtFree (s); - return -1; - } - XmStringFree(text) ; - return -1; + char *s1 = (char *) node->Data (); + if (s1 == s || strcmp (s1, s) == 0) + { + XmStringFree(text) ; + XtFree (s); + return i; + } + else + i++; + } // for() + + XmStringFree(text) ; + XtFree (s); + return -1; + } + XmStringFree(text) ; + return -1; } void wxChoice::SetSelection(int n) { - m_inSetValue = TRUE; - - wxNode *node = m_stringList.Nth (n); - if (node) + m_inSetValue = TRUE; + + wxNode *node = m_stringList.Nth (n); + if (node) { - Dimension selectionWidth, selectionHeight; - - char *s = (char *) node->Data (); - XmString text = XmStringCreateSimple (s); - XtVaGetValues ((Widget) m_widgetList[n], XmNwidth, &selectionWidth, XmNheight, &selectionHeight, NULL); - Widget label = XmOptionButtonGadget ((Widget) m_buttonWidget); - XtVaSetValues (label, - XmNlabelString, text, - NULL); - XmStringFree (text); - XtVaSetValues ((Widget) m_buttonWidget, - XmNwidth, selectionWidth, XmNheight, selectionHeight, - XmNmenuHistory, (Widget) m_widgetList[n], NULL); + Dimension selectionWidth, selectionHeight; + + char *s = (char *) node->Data (); + XmString text = XmStringCreateSimple (s); + XtVaGetValues ((Widget) m_widgetList[n], XmNwidth, &selectionWidth, XmNheight, &selectionHeight, NULL); + Widget label = XmOptionButtonGadget ((Widget) m_buttonWidget); + XtVaSetValues (label, + XmNlabelString, text, + NULL); + XmStringFree (text); + XtVaSetValues ((Widget) m_buttonWidget, + XmNwidth, selectionWidth, XmNheight, selectionHeight, + XmNmenuHistory, (Widget) m_widgetList[n], NULL); } - m_inSetValue = FALSE; + m_inSetValue = FALSE; } int wxChoice::FindString(const wxString& s) const @@ -304,55 +317,55 @@ int wxChoice::FindString(const wxString& s) const wxString wxChoice::GetString(int n) const { - wxNode *node = m_stringList.Nth (n); - if (node) - return wxString((char *) node->Data ()); - else - return wxEmptyString; + wxNode *node = m_stringList.Nth (n); + if (node) + return wxString((char *) node->Data ()); + else + return wxEmptyString; } void wxChoice::SetColumns(int n) { - if (n<1) n = 1 ; - - short numColumns = n ; - Arg args[3]; - - XtSetArg(args[0], XmNnumColumns, numColumns); - XtSetArg(args[1], XmNpacking, XmPACK_COLUMN); - XtSetValues((Widget) m_menuWidget,args,2) ; + if (n<1) n = 1 ; + + short numColumns = n ; + Arg args[3]; + + XtSetArg(args[0], XmNnumColumns, numColumns); + XtSetArg(args[1], XmNpacking, XmPACK_COLUMN); + XtSetValues((Widget) m_menuWidget,args,2) ; } int wxChoice::GetColumns(void) const { - short numColumns ; - - XtVaGetValues((Widget) m_menuWidget,XmNnumColumns,&numColumns,NULL) ; - return numColumns ; + short numColumns ; + + XtVaGetValues((Widget) m_menuWidget,XmNnumColumns,&numColumns,NULL) ; + return numColumns ; } void wxChoice::SetFocus() { - XmProcessTraversal(XtParent((Widget)m_mainWidget), XmTRAVERSE_CURRENT); + XmProcessTraversal(XtParent((Widget)m_mainWidget), XmTRAVERSE_CURRENT); } void wxChoice::SetSize(int x, int y, int width, int height, int sizeFlags) { XtVaSetValues((Widget) m_formWidget, XmNresizePolicy, XmRESIZE_ANY, NULL); bool managed = XtIsManaged((Widget) m_formWidget); - + if (managed) XtUnmanageChild ((Widget) m_formWidget); - + int actualWidth = width, actualHeight = height; - + if (width > -1) { int i; for (i = 0; i < m_noStrings; i++) XtVaSetValues ((Widget) m_widgetList[i], XmNwidth, actualWidth, NULL); XtVaSetValues ((Widget) m_buttonWidget, XmNwidth, actualWidth, - NULL); + NULL); } if (height > -1) { @@ -360,13 +373,13 @@ void wxChoice::SetSize(int x, int y, int width, int height, int sizeFlags) for (i = 0; i < m_noStrings; i++) XtVaSetValues ((Widget) m_widgetList[i], XmNheight, actualHeight, NULL); XtVaSetValues ((Widget) m_buttonWidget, XmNheight, actualHeight, - NULL); + NULL); } - + if (managed) XtManageChild ((Widget) m_formWidget); XtVaSetValues((Widget) m_formWidget, XmNresizePolicy, XmRESIZE_NONE, NULL); - + wxControl::SetSize (x, y, width, height, sizeFlags); } @@ -383,10 +396,10 @@ bool wxChoice::SetStringSelection (const wxString& s) { int sel = FindString (s); if (sel > -1) - { - SetSelection (sel); - return TRUE; - } + { + SetSelection (sel); + return TRUE; + } else return FALSE; } @@ -397,8 +410,7 @@ void wxChoice::Command(wxCommandEvent & event) ProcessCommand (event); } -void wxChoiceCallback (Widget w, XtPointer clientData, - XtPointer ptr) +void wxChoiceCallback (Widget w, XtPointer clientData, XtPointer WXUNUSED(ptr)) { wxChoice *item = (wxChoice *) clientData; if (item) @@ -410,26 +422,58 @@ void wxChoiceCallback (Widget w, XtPointer clientData, XtVaGetValues (w, XmNuserData, &s, NULL); if (s) { - wxCommandEvent event (wxEVT_COMMAND_CHOICE_SELECTED); + wxCommandEvent event (wxEVT_COMMAND_CHOICE_SELECTED, item->GetId()); + event.SetEventObject(item); event.m_commandInt = item->FindString (s); -// event.m_commandString = s; + // event.m_commandString = s; item->ProcessCommand (event); } } } -void wxChoice::ChangeFont() +void wxChoice::ChangeFont(bool keepOriginalSize) { - // TODO + // Note that this causes the widget to be resized back + // to its original size! We therefore have to set the size + // back again. TODO: a better way in Motif? + if (m_windowFont.Ok()) + { + int width, height, width1, height1; + GetSize(& width, & height); + + XmFontList fontList = (XmFontList) m_windowFont.GetFontList(1.0, XtDisplay((Widget) m_mainWidget)); + XtVaSetValues ((Widget) m_mainWidget, XmNfontList, fontList, NULL); + XtVaSetValues ((Widget) m_buttonWidget, XmNfontList, fontList, NULL); + + /* TODO: why does this cause a crash in XtWidgetToApplicationContext? + int i; + for (i = 0; i < m_noStrings; i++) + XtVaSetValues ((Widget) m_widgetList[i], XmNfontList, fontList, NULL); + */ + GetSize(& width1, & height1); + if (keepOriginalSize && (width != width1 || height != height1)) + { + SetSize(-1, -1, width, height); + } + } } void wxChoice::ChangeBackgroundColour() { - // TODO + DoChangeBackgroundColour(m_formWidget, m_backgroundColour); + DoChangeBackgroundColour(m_buttonWidget, m_backgroundColour); + DoChangeBackgroundColour(m_menuWidget, m_backgroundColour); + int i; + for (i = 0; i < m_noStrings; i++) + DoChangeBackgroundColour(m_widgetList[i], m_backgroundColour); } void wxChoice::ChangeForegroundColour() { - // TODO + DoChangeForegroundColour(m_formWidget, m_foregroundColour); + DoChangeForegroundColour(m_buttonWidget, m_foregroundColour); + DoChangeForegroundColour(m_menuWidget, m_foregroundColour); + int i; + for (i = 0; i < m_noStrings; i++) + DoChangeForegroundColour(m_widgetList[i], m_foregroundColour); } -