X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9838df2cefc5b368bb11f98c784ecc78f45ecaf7..a29ee706139a530a78df1f6f6200b076b5ebdb74:/src/motif/radiobox.cpp diff --git a/src/motif/radiobox.cpp b/src/motif/radiobox.cpp index feb57fe5d4..9076292ca0 100644 --- a/src/motif/radiobox.cpp +++ b/src/motif/radiobox.cpp @@ -6,16 +6,25 @@ // Created: 17/09/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ #pragma implementation "radiobox.h" #endif +#ifdef __VMS +#define XtDisplay XTDISPLAY +#endif + +#include "wx/defs.h" + #include "wx/radiobox.h" #include "wx/utils.h" +#ifdef __VMS__ +#pragma message disable nosimpint +#endif #include #include #include @@ -23,15 +32,16 @@ #include #include #include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif -#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) -#endif // Radio box item wxRadioBox::wxRadioBox() @@ -41,9 +51,6 @@ wxRadioBox::wxRadioBox() m_noRowsOrCols = 0; m_majorDim = 0 ; - m_formWidget = (WXWidget) 0; - m_frameWidget = (WXWidget) 0; - m_labelWidget = (WXWidget) 0; m_radioButtons = (WXWidget*) NULL; m_radioButtonLabels = (wxString*) NULL; } @@ -56,14 +63,11 @@ 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_windowFont = parent->GetFont(); + m_font = parent->GetFont(); SetName(name); SetValidator(val); @@ -86,72 +90,51 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, Widget parentWidget = (Widget) parent->GetClientWidget(); - wxString label1(wxStripMenuCodes(title)); - - XmString text = XmStringCreateSimple ((char*) (const char*) label1); + m_mainWidget = XtVaCreateWidget ("radioboxframe", + xmFrameWidgetClass, parentWidget, + XmNshadowType, XmSHADOW_IN, + XmNresizeHeight, True, + XmNresizeWidth, True, + NULL); - Widget formWidget = XtVaCreateManagedWidget ((char*) (const char*) name, - xmFormWidgetClass, parentWidget, - XmNmarginHeight, 0, - XmNmarginWidth, 0, - NULL); + wxString label1(wxStripMenuCodes(title)); - m_formWidget = (WXWidget) formWidget; + XmFontList fontList = (XmFontList) m_font.GetFontList(1.0, XtDisplay(parentWidget)); - XmFontList fontList = (XmFontList) m_windowFont.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, + (Widget)m_mainWidget, #else - xmLabelWidgetClass, formWidget, + xmLabelWidgetClass, (Widget)m_mainWidget, #endif XmNfontList, fontList, - XmNlabelString, text, - NULL); - - XmStringFree (text); + XmNlabelString, text(), +// XmNframeChildType is not in Motif 1.2, nor in Lesstif, +// if it was compiled with 1.2 compatibility +// TODO: check this still looks OK for Motif 1.2. +#if (XmVersion > 1200) + XmNframeChildType, XmFRAME_TITLE_CHILD, +#else + XmNchildType, XmFRAME_TITLE_CHILD, +#endif + XmNchildVerticalAlignment, XmALIGNMENT_CENTER, + NULL); } - Widget frameWidget = XtVaCreateManagedWidget ("frame", - xmFrameWidgetClass, formWidget, - XmNshadowType, XmSHADOW_IN, -// XmNmarginHeight, 0, -// XmNmarginWidth, 0, - NULL); - - 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); - - Widget radioBoxWidget = XmCreateRadioBox (frameWidget, "radioBoxWidget", args, 2); - m_mainWidget = (WXWidget) radioBoxWidget; - + XmHORIZONTAL : XmVERTICAL)); + XtSetArg (args[1], XmNnumColumns, m_majorDim); - if (m_labelWidget) - 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, - XmNrightAttachment, XmATTACH_FORM, - NULL); + Widget radioBoxWidget = XmCreateRadioBox ((Widget)m_mainWidget, "radioBoxWidget", args, 2); // if (style & wxFLAT) // XtVaSetValues (radioBoxWidget, XmNborderWidth, 1, NULL); @@ -165,26 +148,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 XmNfontList, fontList, - NULL); + NULL); XtAddCallback ((Widget) m_radioButtons[i], XmNvalueChangedCallback, (XtCallbackProc) wxRadioBoxCallback, - (XtCallbackProc) this); - + (XtPointer) this); } - SetSelection (0); - m_windowFont = parent->GetFont(); + m_font = parent->GetFont(); ChangeFont(FALSE); - // XtManageChild((Widget) m_formWidget); + SetSelection (0); + + XtRealizeWidget((Widget)m_mainWidget); XtManageChild (radioBoxWidget); + XtManageChild ((Widget)m_mainWidget); SetCanAddEventHandler(TRUE); - AttachWidget (parent, m_mainWidget, m_formWidget, pos.x, pos.y, size.x, size.y); + AttachWidget (parent, m_mainWidget, NULL, pos.x, pos.y, size.x, size.y); ChangeBackgroundColour(); @@ -197,47 +181,13 @@ 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 -{ - if (item < 0 || item >= m_noItems) - return wxEmptyString; - - Widget widget = (Widget) m_radioButtons[item]; - XmString text; - char *s; - XtVaGetValues (widget, - XmNlabelString, &text, - NULL); - - if (XmStringGetLtoR (text, XmSTRING_DEFAULT_CHARSET, &s)) - { - // Should we free 'text'??? - XmStringFree(text); - wxString str(s); - XtFree (s); - return str; - } - else - { - XmStringFree(text); - return wxEmptyString; - } -} - -void wxRadioBox::SetLabel(int item, const wxString& label) +void wxRadioBox::SetString(int item, const wxString& label) { if (item < 0 || item >= m_noItems) return; @@ -248,9 +198,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); } } @@ -297,42 +247,28 @@ 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); + bool managed = XtIsManaged((Widget) m_mainWidget); if (managed) - XtUnmanageChild ((Widget) m_formWidget); + XtUnmanageChild ((Widget) m_mainWidget); int xx = x; int yy = y; AdjustForParentClientOrigin(xx, yy, sizeFlags); if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - XtVaSetValues ((Widget) m_formWidget, XmNleftAttachment, XmATTACH_SELF, - XmNx, xx, NULL); + XtVaSetValues ((Widget) m_mainWidget, XmNx, xx, NULL); if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - XtVaSetValues ((Widget) m_formWidget, XmNtopAttachment, XmATTACH_SELF, - XmNy, yy, NULL); - - // Must set the actual RadioBox to be desired size MINUS label size - Dimension labelWidth = 0, labelHeight = 0, actualWidth = 0, actualHeight = 0; - - if (m_labelWidget) - XtVaGetValues ((Widget) m_labelWidget, XmNwidth, &labelWidth, XmNheight, &labelHeight, NULL); + XtVaSetValues ((Widget) m_mainWidget, XmNy, yy, NULL); - actualWidth = width; - actualHeight = height - labelHeight; + if (width > 0) + XtVaSetValues ((Widget) m_mainWidget, XmNwidth, width, NULL); + if (height > 0) + XtVaSetValues ((Widget) m_mainWidget, XmNheight, height, NULL); - if (width > -1) - { - XtVaSetValues ((Widget) m_mainWidget, XmNwidth, actualWidth, NULL); - } - if (height > -1) - { - XtVaSetValues ((Widget) m_mainWidget, XmNheight, actualHeight, NULL); - } if (managed) - XtManageChild ((Widget) m_formWidget); + XtManageChild ((Widget) m_mainWidget); } // Enable a specific button @@ -345,13 +281,16 @@ 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) @@ -383,10 +322,10 @@ void wxRadioBox::Show(int n, bool show) // Please note that this is all we can do: removing the label // if switching to unshow state. However, when switching - // to the on state, it's the prog. resp. to call SetLabel(item,...) + // to the on state, it's the prog. resp. to call SetString(item,...) // after this call!! if (!show) - wxRadioBox::SetLabel (n, " "); + wxRadioBox::SetString (n, " "); } // For single selection items only @@ -421,7 +360,7 @@ void wxRadioBox::ChangeFont(bool keepOriginalSize) { wxWindow::ChangeFont(keepOriginalSize); - XmFontList fontList = (XmFontList) m_windowFont.GetFontList(1.0, XtDisplay((Widget) GetTopWidget())); + XmFontList fontList = (XmFontList) m_font.GetFontList(1.0, XtDisplay((Widget) GetTopWidget())); int i; for (i = 0; i < m_noItems; i++) @@ -430,7 +369,6 @@ void wxRadioBox::ChangeFont(bool keepOriginalSize) XtVaSetValues ((Widget) radioButton, XmNfontList, fontList, - XmNtopAttachment, XmATTACH_FORM, NULL); } } @@ -439,8 +377,6 @@ void wxRadioBox::ChangeBackgroundColour() { wxWindow::ChangeBackgroundColour(); - DoChangeBackgroundColour((Widget) m_frameWidget, m_backgroundColour); - int selectPixel = wxBLACK->AllocColour(wxGetDisplay()); int i; @@ -469,8 +405,25 @@ void wxRadioBox::ChangeForegroundColour() } } +static int CalcOtherDim( int items, int dim ) +{ + return items / dim + ( items % dim ? 1 : 0 ); +} + +int wxRadioBox::GetRowCount() const +{ + return m_windowStyle & wxRA_SPECIFY_ROWS ? m_noRowsOrCols + : CalcOtherDim( GetCount(), m_noRowsOrCols ); +} + +int wxRadioBox::GetColumnCount() const +{ + return m_windowStyle & wxRA_SPECIFY_COLS ? m_noRowsOrCols + : CalcOtherDim( GetCount(), m_noRowsOrCols ); +} + void wxRadioBoxCallback (Widget w, XtPointer clientData, - XmToggleButtonCallbackStruct * cbs) + XmToggleButtonCallbackStruct * cbs) { if (!cbs->set) return; @@ -478,7 +431,7 @@ void wxRadioBoxCallback (Widget w, XtPointer clientData, wxRadioBox *item = (wxRadioBox *) clientData; int sel = -1; int i; - for (i = 0; i < item->Number(); i++) + for (i = 0; i < item->GetCount(); i++) if (item->GetRadioButtons() && ((Widget) (item->GetRadioButtons()[i]) == w)) sel = i; item->SetSel(sel); @@ -487,7 +440,8 @@ void wxRadioBoxCallback (Widget w, XtPointer clientData, return; wxCommandEvent event (wxEVT_COMMAND_RADIOBOX_SELECTED, item->GetId()); - event.m_commandInt = sel; + event.SetInt(sel); + event.SetString(item->GetStringSelection()); event.SetEventObject(item); item->ProcessCommand (event); }