X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d57be459406c2830f6abc9d99ae99166c6d133b..7b9da2077d0975db6c965a85c91d5aca671ab5e3:/src/motif/radiobox.cpp?ds=inline diff --git a/src/motif/radiobox.cpp b/src/motif/radiobox.cpp index 152e1d3888..33b1ab2f25 100644 --- a/src/motif/radiobox.cpp +++ b/src/motif/radiobox.cpp @@ -6,7 +6,7 @@ // Created: 17/09/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -22,11 +22,12 @@ #include #include #include +#include -#include +#include "wx/motif/private.h" void wxRadioBoxCallback (Widget w, XtPointer clientData, - XmToggleButtonCallbackStruct * cbs); + XmToggleButtonCallbackStruct * cbs); #if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxRadioBox, wxControl) @@ -41,6 +42,7 @@ wxRadioBox::wxRadioBox() m_majorDim = 0 ; m_formWidget = (WXWidget) 0; + m_frameWidget = (WXWidget) 0; m_labelWidget = (WXWidget) 0; m_radioButtons = (WXWidget*) NULL; m_radioButtonLabels = (wxString*) NULL; @@ -54,11 +56,14 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, { m_selectedButton = -1; m_noItems = n; + m_formWidget = (WXWidget) 0; + m_frameWidget = (WXWidget) 0; m_labelWidget = (WXWidget) 0; m_radioButtons = (WXWidget*) NULL; m_radioButtonLabels = (wxString*) NULL; m_backgroundColour = parent->GetBackgroundColour(); m_foregroundColour = parent->GetForegroundColour(); + m_font = parent->GetFont(); SetName(name); SetValidator(val); @@ -83,65 +88,66 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, wxString label1(wxStripMenuCodes(title)); - XmString text = XmStringCreateSimple ((char*) (const char*) label1); - - Widget formWidget = XtVaCreateManagedWidget ((char*) (const char*) name, - xmFormWidgetClass, parentWidget, - XmNmarginHeight, 0, - XmNmarginWidth, 0, - NULL); + Widget formWidget = XtVaCreateManagedWidget (name.c_str(), + xmFormWidgetClass, parentWidget, + XmNmarginHeight, 0, + XmNmarginWidth, 0, + NULL); m_formWidget = (WXWidget) formWidget; + XmFontList fontList = (XmFontList) m_font.GetFontList(1.0, XtDisplay(parentWidget)); if (label1 != "") { - text = XmStringCreateSimple ((char*) (const char*) label1); - Widget labelWidget = XtVaCreateManagedWidget ((char*) (const char*) label1, + wxXmString text(label1); + (void)XtVaCreateManagedWidget(label1.c_str(), #if wxUSE_GADGETS - style & wxCOLOURED ? - xmLabelWidgetClass : xmLabelGadgetClass, - formWidget, + style & wxCOLOURED ? xmLabelWidgetClass + : xmLabelGadgetClass, + formWidget, #else - xmLabelWidgetClass, formWidget, + xmLabelWidgetClass, formWidget, #endif - XmNlabelString, text, - NULL); + XmNfontList, fontList, + XmNlabelString, text(), + NULL); + } -/* TODO: change label font - if (labelFont) - XtVaSetValues (labelWidget, - XmNfontList, labelFont->GetInternalFont (XtDisplay(formWidget)), - NULL); -*/ + Widget frameWidget = XtVaCreateManagedWidget ("frame", + xmFrameWidgetClass, formWidget, + XmNshadowType, XmSHADOW_IN, +// XmNmarginHeight, 0, +// XmNmarginWidth, 0, + NULL); - XmStringFree (text); - } + m_frameWidget = (WXWidget) frameWidget; Arg args[3]; - majorDim = (n + majorDim - 1) / majorDim; + m_majorDim = (n + m_majorDim - 1) / m_majorDim; XtSetArg (args[0], XmNorientation, ((style & wxHORIZONTAL) == wxHORIZONTAL ? - XmHORIZONTAL : XmVERTICAL)); - XtSetArg (args[1], XmNnumColumns, majorDim); + XmHORIZONTAL : XmVERTICAL)); + XtSetArg (args[1], XmNnumColumns, m_majorDim); - Widget radioBoxWidget = XmCreateRadioBox (formWidget, "radioBoxWidget", args, 2); + Widget radioBoxWidget = XmCreateRadioBox (frameWidget, "radioBoxWidget", args, 2); m_mainWidget = (WXWidget) radioBoxWidget; if (m_labelWidget) - XtVaSetValues ((Widget) m_labelWidget, - XmNtopAttachment, XmATTACH_FORM, - XmNleftAttachment, XmATTACH_FORM, - XmNalignment, XmALIGNMENT_BEGINNING, - NULL); + XtVaSetValues ((Widget) m_labelWidget, + XmNtopAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_FORM, + XmNalignment, XmALIGNMENT_BEGINNING, + NULL); XtVaSetValues (radioBoxWidget, - XmNtopAttachment, m_labelWidget ? XmATTACH_WIDGET : XmATTACH_FORM, - XmNtopWidget, m_labelWidget ? (Widget) m_labelWidget : formWidget, - XmNbottomAttachment, XmATTACH_FORM, - XmNleftAttachment, XmATTACH_FORM, - NULL); + XmNtopAttachment, m_labelWidget ? XmATTACH_WIDGET : XmATTACH_FORM, + XmNtopWidget, m_labelWidget ? (Widget) m_labelWidget : formWidget, + XmNbottomAttachment, XmATTACH_FORM, + XmNleftAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + NULL); // if (style & wxFLAT) // XtVaSetValues (radioBoxWidget, XmNborderWidth, 1, NULL); @@ -155,29 +161,27 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, m_radioButtonLabels[i] = str; m_radioButtons[i] = (WXWidget) XtVaCreateManagedWidget ((char*) (const char*) str, #if wxUSE_GADGETS - xmToggleButtonGadgetClass, radioBoxWidget, + xmToggleButtonGadgetClass, radioBoxWidget, #else - xmToggleButtonWidgetClass, radioBoxWidget, + xmToggleButtonWidgetClass, radioBoxWidget, #endif - NULL); + XmNfontList, fontList, + NULL); XtAddCallback ((Widget) m_radioButtons[i], XmNvalueChangedCallback, (XtCallbackProc) wxRadioBoxCallback, - (XtCallbackProc) this); - -/* TODO: set font - if (buttonFont) - XtVaSetValues ((Widget) m_radioButtons[i], - XmNfontList, buttonFont->GetInternalFont (XtDisplay(formWidget)), - NULL); -*/ + (XtCallbackProc) this); + } SetSelection (0); + m_font = parent->GetFont(); + ChangeFont(FALSE); + + // XtManageChild((Widget) m_formWidget); XtManageChild (radioBoxWidget); SetCanAddEventHandler(TRUE); AttachWidget (parent, m_mainWidget, m_formWidget, pos.x, pos.y, size.x, size.y); - SetFont(* parent->GetFont()); ChangeBackgroundColour(); return TRUE; @@ -188,6 +192,18 @@ wxRadioBox::~wxRadioBox() { delete[] m_radioButtonLabels; delete[] m_radioButtons; + + DetachWidget(m_formWidget); + DetachWidget(m_mainWidget); + + if (m_labelWidget) + XtDestroyWidget((Widget) m_labelWidget); + XtDestroyWidget((Widget) m_mainWidget); + XtDestroyWidget((Widget) m_formWidget); + + m_mainWidget = (WXWidget) 0; + m_formWidget = (WXWidget) 0; + m_labelWidget = (WXWidget) 0; } wxString wxRadioBox::GetLabel(int item) const @@ -199,8 +215,8 @@ wxString wxRadioBox::GetLabel(int item) const XmString text; char *s; XtVaGetValues (widget, - XmNlabelString, &text, - NULL); + XmNlabelString, &text, + NULL); if (XmStringGetLtoR (text, XmSTRING_DEFAULT_CHARSET, &s)) { @@ -228,9 +244,9 @@ void wxRadioBox::SetLabel(int item, const wxString& label) wxString label1(wxStripMenuCodes(label)); XmString text = XmStringCreateSimple ((char*) (const char*) label1); XtVaSetValues (widget, - XmNlabelString, text, - XmNlabelType, XmSTRING, - NULL); + XmNlabelString, text, + XmNlabelType, XmSTRING, + NULL); XmStringFree (text); } } @@ -277,7 +293,7 @@ wxString wxRadioBox::GetString(int n) const return m_radioButtonLabels[n]; } -void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags) +void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) { bool managed = XtIsManaged((Widget) m_formWidget); @@ -289,10 +305,10 @@ void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags) if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) XtVaSetValues ((Widget) m_formWidget, XmNleftAttachment, XmATTACH_SELF, - XmNx, xx, NULL); + XmNx, xx, NULL); if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) XtVaSetValues ((Widget) m_formWidget, XmNtopAttachment, XmATTACH_SELF, - XmNy, yy, NULL); + XmNy, yy, NULL); // Must set the actual RadioBox to be desired size MINUS label size Dimension labelWidth = 0, labelHeight = 0, actualWidth = 0, actualHeight = 0; @@ -325,13 +341,22 @@ void wxRadioBox::Enable(int n, bool enable) } // Enable all controls -void wxRadioBox::Enable(bool enable) +bool wxRadioBox::Enable(bool enable) { - wxControl::Enable(enable); + if ( !wxControl::Enable(enable) ) + return FALSE; int i; for (i = 0; i < m_noItems; i++) XtSetSensitive ((Widget) m_radioButtons[i], (Boolean) enable); + + return TRUE; +} + +bool wxRadioBox::Show(bool show) +{ + // TODO: show/hide all children + return wxControl::Show(show); } // Show a specific button @@ -391,23 +416,60 @@ void wxRadioBox::Command (wxCommandEvent & event) ProcessCommand (event); } -void wxRadioBox::ChangeFont() +void wxRadioBox::ChangeFont(bool keepOriginalSize) { - // TODO + wxWindow::ChangeFont(keepOriginalSize); + + XmFontList fontList = (XmFontList) m_font.GetFontList(1.0, XtDisplay((Widget) GetTopWidget())); + + int i; + for (i = 0; i < m_noItems; i++) + { + WXWidget radioButton = m_radioButtons[i]; + + XtVaSetValues ((Widget) radioButton, + XmNfontList, fontList, + XmNtopAttachment, XmATTACH_FORM, + NULL); + } } void wxRadioBox::ChangeBackgroundColour() { - // TODO + wxWindow::ChangeBackgroundColour(); + + DoChangeBackgroundColour((Widget) m_frameWidget, m_backgroundColour); + + int selectPixel = wxBLACK->AllocColour(wxGetDisplay()); + + int i; + for (i = 0; i < m_noItems; i++) + { + WXWidget radioButton = m_radioButtons[i]; + + DoChangeBackgroundColour(radioButton, m_backgroundColour, TRUE); + + XtVaSetValues ((Widget) radioButton, + XmNselectColor, selectPixel, + NULL); + } } void wxRadioBox::ChangeForegroundColour() { - // TODO + wxWindow::ChangeForegroundColour(); + + int i; + for (i = 0; i < m_noItems; i++) + { + WXWidget radioButton = m_radioButtons[i]; + + DoChangeForegroundColour(radioButton, m_foregroundColour); + } } void wxRadioBoxCallback (Widget w, XtPointer clientData, - XmToggleButtonCallbackStruct * cbs) + XmToggleButtonCallbackStruct * cbs) { if (!cbs->set) return;