X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bfc6fde4b1dd5bfd8ae22839ff9a69cf24eb9120..23176131010f41b2f9a54bef50c8afa25472e195:/src/motif/radiobox.cpp diff --git a/src/motif/radiobox.cpp b/src/motif/radiobox.cpp index 7fdab898f2..774c4df47c 100644 --- a/src/motif/radiobox.cpp +++ b/src/motif/radiobox.cpp @@ -6,46 +6,50 @@ // Created: 17/09/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "radiobox.h" #endif +#ifdef __VMS +#define XtDisplay XTDISPLAY +#endif + +#include "wx/defs.h" + #include "wx/radiobox.h" #include "wx/utils.h" +#include "wx/arrstr.h" +#ifdef __VMS__ +#pragma message disable nosimpint +#endif #include #include #include #include #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() +void wxRadioBox::Init() { m_selectedButton = -1; m_noItems = 0; 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; } bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, @@ -54,29 +58,10 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, int majorDim, long style, const wxValidator& val, const wxString& name) { - 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(); - - SetName(name); - SetValidator(val); - - parent->AddChild(this); - - m_windowStyle = (long&)style; - - if (id == -1) - m_windowId = NewControlId(); - else - m_windowId = id; + if( !CreateControl( parent, id, pos, size, style, val, name ) ) + return false; + m_noItems = n; m_noRowsOrCols = majorDim; if (majorDim==0) @@ -86,158 +71,113 @@ 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, + 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; + WXFontType fontType = m_font.GetFontType(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); + m_labelWidget = (WXWidget) + 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); + wxFont::GetFontTag(), fontType, + 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); + XmHORIZONTAL : XmVERTICAL)); + XtSetArg (args[1], XmNnumColumns, m_majorDim); + XtSetArg (args[2], XmNadjustLast, False); - Widget radioBoxWidget = XmCreateRadioBox (frameWidget, "radioBoxWidget", args, 2); - m_mainWidget = (WXWidget) radioBoxWidget; + Widget radioBoxWidget = + XmCreateRadioBox ((Widget)m_mainWidget, "radioBoxWidget", args, 3); + m_radioButtons.reserve(n); + m_radioButtonLabels.reserve(n); - 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); - - // if (style & wxFLAT) - // XtVaSetValues (radioBoxWidget, XmNborderWidth, 1, NULL); - - m_radioButtons = new WXWidget[n]; - m_radioButtonLabels = new wxString[n]; int i; for (i = 0; i < n; i++) { wxString str(wxStripMenuCodes(choices[i])); - m_radioButtonLabels[i] = str; - m_radioButtons[i] = (WXWidget) XtVaCreateManagedWidget ((char*) (const char*) str, + m_radioButtonLabels.push_back(str); + Widget radioItem = XtVaCreateManagedWidget (wxConstCast(str.c_str(), char), #if wxUSE_GADGETS - xmToggleButtonGadgetClass, radioBoxWidget, + xmToggleButtonGadgetClass, radioBoxWidget, #else - xmToggleButtonWidgetClass, radioBoxWidget, + xmToggleButtonWidgetClass, radioBoxWidget, #endif - XmNfontList, fontList, - NULL); - XtAddCallback ((Widget) m_radioButtons[i], XmNvalueChangedCallback, (XtCallbackProc) wxRadioBoxCallback, - (XtCallbackProc) this); - + wxFont::GetFontTag(), fontType, + NULL); + m_radioButtons.push_back((WXWidget)radioItem); + XtAddCallback (radioItem, XmNvalueChangedCallback, + (XtCallbackProc) wxRadioBoxCallback, + (XtPointer) this); } - SetSelection (0); - m_windowFont = 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(); return TRUE; } +bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, + const wxPoint& pos, const wxSize& size, + const wxArrayString& choices, + int majorDim, long style, + const wxValidator& val, const wxString& name) +{ + wxCArrayString chs(choices); + return Create(parent, id, title, pos, size, chs.GetCount(), + chs.GetStrings(), majorDim, style, val, name); +} 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; @@ -246,12 +186,12 @@ void wxRadioBox::SetLabel(int item, const wxString& label) if (label != "") { wxString label1(wxStripMenuCodes(label)); - XmString text = XmStringCreateSimple ((char*) (const char*) label1); + wxXmString text( label1 ); + m_radioButtonLabels[item] = label1; XtVaSetValues (widget, - XmNlabelString, text, - XmNlabelType, XmSTRING, - NULL); - XmStringFree (text); + XmNlabelString, text(), + XmNlabelType, XmSTRING, + NULL); } } @@ -299,40 +239,26 @@ wxString wxRadioBox::GetString(int n) const 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 +271,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 +312,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 +350,8 @@ void wxRadioBox::ChangeFont(bool keepOriginalSize) { wxWindow::ChangeFont(keepOriginalSize); - XmFontList fontList = (XmFontList) m_windowFont.GetFontList(1.0, XtDisplay((Widget) GetTopWidget())); + WXFontType fontType = + m_font.GetFontType(XtDisplay((Widget) GetTopWidget())); int i; for (i = 0; i < m_noItems; i++) @@ -429,8 +359,7 @@ void wxRadioBox::ChangeFont(bool keepOriginalSize) WXWidget radioButton = m_radioButtons[i]; XtVaSetValues ((Widget) radioButton, - XmNfontList, fontList, - XmNtopAttachment, XmATTACH_FORM, + wxFont::GetFontTag(), fontType, NULL); } } @@ -439,16 +368,14 @@ void wxRadioBox::ChangeBackgroundColour() { wxWindow::ChangeBackgroundColour(); - DoChangeBackgroundColour((Widget) m_frameWidget, m_backgroundColour); - - int selectPixel = wxBLACK->AllocColour(wxGetDisplay()); + int selectPixel = wxBLACK->AllocColour(XtDisplay((Widget)m_mainWidget)); int i; for (i = 0; i < m_noItems; i++) { WXWidget radioButton = m_radioButtons[i]; - DoChangeBackgroundColour(radioButton, m_backgroundColour, TRUE); + wxDoChangeBackgroundColour(radioButton, m_backgroundColour, TRUE); XtVaSetValues ((Widget) radioButton, XmNselectColor, selectPixel, @@ -465,12 +392,29 @@ void wxRadioBox::ChangeForegroundColour() { WXWidget radioButton = m_radioButtons[i]; - DoChangeForegroundColour(radioButton, m_foregroundColour); + wxDoChangeForegroundColour(radioButton, m_foregroundColour); } } +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,8 +422,9 @@ void wxRadioBoxCallback (Widget w, XtPointer clientData, wxRadioBox *item = (wxRadioBox *) clientData; int sel = -1; int i; - for (i = 0; i < item->Number(); i++) - if (item->GetRadioButtons() && ((Widget) (item->GetRadioButtons()[i]) == w)) + const wxWidgetArray& buttons = item->GetRadioButtons(); + for (i = 0; i < item->GetCount(); i++) + if (((Widget)buttons[i]) == w) sel = i; item->SetSel(sel); @@ -487,7 +432,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); }