X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/795c00bdccba346945bfea05725ef7050a29ea2a..64ea838d8f4d1853b7d850db93ee565e901d099a:/src/motif/radiobox.cpp diff --git a/src/motif/radiobox.cpp b/src/motif/radiobox.cpp index 62fb7e2b3d..00303033a4 100644 --- a/src/motif/radiobox.cpp +++ b/src/motif/radiobox.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: radiobox.cpp +// Name: src/motif/radiobox.cpp // Purpose: wxRadioBox // Author: Julian Smart // Modified by: @@ -9,18 +9,17 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "radiobox.h" -#endif - -#ifdef __VMS -#define XtDisplay XTDISPLAY -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" -#include "wx/defs.h" +#if wxUSE_RADIOBOX #include "wx/radiobox.h" -#include "wx/utils.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/arrstr.h" +#endif #ifdef __VMS__ #pragma message disable nosimpint @@ -48,7 +47,7 @@ void wxRadioBox::Init() m_selectedButton = -1; m_noItems = 0; m_noRowsOrCols = 0; - m_majorDim = 0 ; + m_labelWidget = (WXWidget) 0; } bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, @@ -59,66 +58,59 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, { if( !CreateControl( parent, id, pos, size, style, val, name ) ) return false; + PreCreation(); - m_noItems = n; + m_noItems = (unsigned int)n; m_noRowsOrCols = majorDim; - if (majorDim==0) - m_majorDim = n ; - else - m_majorDim = majorDim ; + SetMajorDim(majorDim == 0 ? n : majorDim, style); Widget parentWidget = (Widget) parent->GetClientWidget(); + Display* dpy = XtDisplay(parentWidget); m_mainWidget = XtVaCreateWidget ("radioboxframe", - xmFrameWidgetClass, parentWidget, - XmNresizeHeight, True, - XmNresizeWidth, True, - NULL); + xmFrameWidgetClass, parentWidget, + XmNresizeHeight, True, + XmNresizeWidth, True, + NULL); - wxString label1(wxStripMenuCodes(title)); + wxString label1(GetLabelText(title)); - WXFontType fontType = m_font.GetFontType(XtDisplay(parentWidget)); - - if (label1 != "") + if (!label1.empty()) { wxXmString text(label1); m_labelWidget = (WXWidget) - XtVaCreateManagedWidget( label1.c_str(), + XtVaCreateManagedWidget( label1.mb_str(), #if wxUSE_GADGETS - style & wxCOLOURED ? xmLabelWidgetClass - : xmLabelGadgetClass, - (Widget)m_mainWidget, + style & wxCOLOURED ? xmLabelWidgetClass + : xmLabelGadgetClass, + (Widget)m_mainWidget, #else - xmLabelWidgetClass, - (Widget)m_mainWidget, + xmLabelWidgetClass, (Widget)m_mainWidget, #endif - wxFont::GetFontTag(), fontType, - XmNlabelString, text(), + wxFont::GetFontTag(), m_font.GetFontTypeC(dpy), + 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, + XmNframeChildType, XmFRAME_TITLE_CHILD, #else - XmNchildType, XmFRAME_TITLE_CHILD, + XmNchildType, XmFRAME_TITLE_CHILD, #endif - XmNchildVerticalAlignment, - XmALIGNMENT_CENTER, - NULL); + XmNchildVerticalAlignment, XmALIGNMENT_CENTER, + NULL); } Arg args[3]; - m_majorDim = (n + m_majorDim - 1) / m_majorDim; - XtSetArg (args[0], XmNorientation, ((style & wxHORIZONTAL) == wxHORIZONTAL ? XmHORIZONTAL : XmVERTICAL)); - XtSetArg (args[1], XmNnumColumns, m_majorDim); + XtSetArg (args[1], XmNnumColumns, GetMajorDim()); XtSetArg (args[2], XmNadjustLast, False); Widget radioBoxWidget = - XmCreateRadioBox ((Widget)m_mainWidget, "radioBoxWidget", args, 3); + XmCreateRadioBox ((Widget)m_mainWidget, wxMOTIF_STR("radioBoxWidget"), args, 3); m_radioButtons.reserve(n); m_radioButtonLabels.reserve(n); @@ -126,37 +118,45 @@ bool wxRadioBox::Create(wxWindow *parent, wxWindowID id, const wxString& title, int i; for (i = 0; i < n; i++) { - wxString str(wxStripMenuCodes(choices[i])); + wxString str(GetLabelText(choices[i])); m_radioButtonLabels.push_back(str); - Widget radioItem = XtVaCreateManagedWidget (wxConstCast(str.c_str(), char), + Widget radioItem = XtVaCreateManagedWidget ( + str.mb_str(), #if wxUSE_GADGETS - xmToggleButtonGadgetClass, radioBoxWidget, + xmToggleButtonGadgetClass, radioBoxWidget, #else - xmToggleButtonWidgetClass, radioBoxWidget, + xmToggleButtonWidgetClass, radioBoxWidget, #endif - wxFont::GetFontTag(), fontType, - NULL); + wxFont::GetFontTag(), m_font.GetFontTypeC(dpy), + NULL); m_radioButtons.push_back((WXWidget)radioItem); XtAddCallback (radioItem, XmNvalueChangedCallback, (XtCallbackProc) wxRadioBoxCallback, (XtPointer) this); } - ChangeFont(FALSE); - SetSelection (0); - + XtRealizeWidget((Widget)m_mainWidget); XtManageChild (radioBoxWidget); XtManageChild ((Widget)m_mainWidget); + PostCreation(); AttachWidget (parent, m_mainWidget, NULL, pos.x, pos.y, size.x, size.y); - ChangeBackgroundColour(); - - return TRUE; + 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() { @@ -166,15 +166,15 @@ wxRadioBox::~wxRadioBox() m_mainWidget = (WXWidget) 0; } -void wxRadioBox::SetString(int item, const wxString& label) +void wxRadioBox::SetString(unsigned int item, const wxString& label) { - if (item < 0 || item >= m_noItems) + if (!IsValid(item)) return; - Widget widget = (Widget) m_radioButtons[item]; - if (label != "") + Widget widget = (Widget)m_radioButtons[item]; + if (!label.empty()) { - wxString label1(wxStripMenuCodes(label)); + wxString label1(GetLabelText(label)); wxXmString text( label1 ); m_radioButtonLabels[item] = label1; XtVaSetValues (widget, @@ -184,32 +184,22 @@ void wxRadioBox::SetString(int item, const wxString& label) } } -int wxRadioBox::FindString(const wxString& s) const -{ - int i; - for (i = 0; i < m_noItems; i++) - if (s == m_radioButtonLabels[i]) - return i; - return -1; -} - void wxRadioBox::SetSelection(int n) { - if ((n < 0) || (n >= m_noItems)) + if (!IsValid(n)) return; m_selectedButton = n; - m_inSetValue = TRUE; + m_inSetValue = true; - XmToggleButtonSetState ((Widget) m_radioButtons[n], TRUE, FALSE); + XmToggleButtonSetState ((Widget) m_radioButtons[n], True, False); - int i; - for (i = 0; i < m_noItems; i++) - if (i != n) - XmToggleButtonSetState ((Widget) m_radioButtons[i], FALSE, FALSE); + for (unsigned int i = 0; i < m_noItems; i++) + if (i != (unsigned int)n) + XmToggleButtonSetState ((Widget) m_radioButtons[i], False, False); - m_inSetValue = FALSE; + m_inSetValue = false; } // Get single selection, for single choice list items @@ -219,9 +209,9 @@ int wxRadioBox::GetSelection() const } // Find string for position -wxString wxRadioBox::GetString(int n) const +wxString wxRadioBox::GetString(unsigned int n) const { - if ((n < 0) || (n >= m_noItems)) + if (!IsValid(n)) return wxEmptyString; return m_radioButtonLabels[n]; } @@ -239,7 +229,7 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) XtVaSetValues ((Widget) m_mainWidget, XmNx, xx, NULL); if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - XtVaSetValues ((Widget) m_mainWidget, XmNy, yy, NULL); + XtVaSetValues ((Widget) m_mainWidget, XmNy, yy, NULL); if (width > 0) XtVaSetValues ((Widget) m_mainWidget, XmNwidth, width, NULL); @@ -251,25 +241,25 @@ void wxRadioBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) } // Enable a specific button -void wxRadioBox::Enable(int n, bool enable) +bool wxRadioBox::Enable(unsigned int n, bool enable) { - if ((n < 0) || (n >= m_noItems)) - return; + if (!IsValid(n)) + return false; XtSetSensitive ((Widget) m_radioButtons[n], (Boolean) enable); + return true; } // Enable all controls bool wxRadioBox::Enable(bool enable) { if ( !wxControl::Enable(enable) ) - return FALSE; + return false; - int i; - for (i = 0; i < m_noItems; i++) + for (unsigned int i = 0; i < m_noItems; i++) XtSetSensitive ((Widget) m_radioButtons[i], (Boolean) enable); - return TRUE; + return true; } bool wxRadioBox::Show(bool show) @@ -279,21 +269,21 @@ bool wxRadioBox::Show(bool show) } // Show a specific button -void wxRadioBox::Show(int n, bool show) +bool wxRadioBox::Show(unsigned int n, bool show) { // This method isn't complete, and we try do do our best... // It's main purpose isn't for allowing Show/Unshow dynamically, // but rather to provide a way to design wxRadioBox such: // - // o Val1 o Val2 o Val3 - // o Val4 o Val6 - // o Val7 o Val8 o Val9 + // o Val1 o Val2 o Val3 + // o Val4 o Val6 + // o Val7 o Val8 o Val9 // // In my case, this is a 'direction' box, and the Show(5,False) is // coupled with an Enable(5,False) // - if ((n < 0) || (n >= m_noItems)) - return; + if (!IsValid(n)) + return false; XtVaSetValues ((Widget) m_radioButtons[n], XmNindicatorOn, (unsigned char) show, @@ -305,16 +295,18 @@ void wxRadioBox::Show(int n, bool show) // after this call!! if (!show) wxRadioBox::SetString (n, " "); + + return true; } // For single selection items only wxString wxRadioBox::GetStringSelection () const { int sel = GetSelection (); - if (sel > -1) - return this->GetString (sel); + if (sel != wxNOT_FOUND) + return this->GetString((unsigned int)sel); else - return wxString(""); + return wxEmptyString; } bool wxRadioBox::SetStringSelection (const wxString& s) @@ -323,15 +315,15 @@ bool wxRadioBox::SetStringSelection (const wxString& s) if (sel > -1) { SetSelection (sel); - return TRUE; + return true; } else - return FALSE; + return false; } void wxRadioBox::Command (wxCommandEvent & event) { - SetSelection (event.m_commandInt); + SetSelection (event.GetInt()); ProcessCommand (event); } @@ -339,16 +331,12 @@ void wxRadioBox::ChangeFont(bool keepOriginalSize) { wxWindow::ChangeFont(keepOriginalSize); - WXFontType fontType = - m_font.GetFontType(XtDisplay((Widget) GetTopWidget())); - - int i; - for (i = 0; i < m_noItems; i++) + for (unsigned int i = 0; i < m_noItems; i++) { WXWidget radioButton = m_radioButtons[i]; XtVaSetValues ((Widget) radioButton, - wxFont::GetFontTag(), fontType, + wxFont::GetFontTag(), m_font.GetFontTypeC(XtDisplay((Widget) GetTopWidget())), NULL); } } @@ -357,14 +345,14 @@ void wxRadioBox::ChangeBackgroundColour() { wxWindow::ChangeBackgroundColour(); - int selectPixel = wxBLACK->AllocColour(XtDisplay((Widget)m_mainWidget)); + wxColour colour = *wxBLACK; + WXPixel selectPixel = colour.AllocColour(XtDisplay((Widget)m_mainWidget)); - int i; - for (i = 0; i < m_noItems; i++) + for (unsigned int i = 0; i < m_noItems; i++) { WXWidget radioButton = m_radioButtons[i]; - wxDoChangeBackgroundColour(radioButton, m_backgroundColour, TRUE); + wxDoChangeBackgroundColour(radioButton, m_backgroundColour, true); XtVaSetValues ((Widget) radioButton, XmNselectColor, selectPixel, @@ -376,8 +364,7 @@ void wxRadioBox::ChangeForegroundColour() { wxWindow::ChangeForegroundColour(); - int i; - for (i = 0; i < m_noItems; i++) + for (unsigned int i = 0; i < m_noItems; i++) { WXWidget radioButton = m_radioButtons[i]; @@ -385,23 +372,6 @@ 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) { @@ -410,11 +380,11 @@ void wxRadioBoxCallback (Widget w, XtPointer clientData, wxRadioBox *item = (wxRadioBox *) clientData; int sel = -1; - int i; + unsigned int i; const wxWidgetArray& buttons = item->GetRadioButtons(); for (i = 0; i < item->GetCount(); i++) if (((Widget)buttons[i]) == w) - sel = i; + sel = (int)i; item->SetSel(sel); if (item->InSetValue()) @@ -427,3 +397,4 @@ void wxRadioBoxCallback (Widget w, XtPointer clientData, item->ProcessCommand (event); } +#endif // wxUSE_RADIOBOX