X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4bb6408c2631988fab9925014c6619358bf867de..6a44bffd1ac68163e4c1cfe8aa8fe4f7f98a02e7:/src/motif/radiobut.cpp?ds=sidebyside diff --git a/src/motif/radiobut.cpp b/src/motif/radiobut.cpp index 31c7504715..9d77c21388 100644 --- a/src/motif/radiobut.cpp +++ b/src/motif/radiobut.cpp @@ -13,56 +13,151 @@ #pragma implementation "radiobut.h" #endif +#ifdef __VMS +#define XtDisplay XTDISPLAY +#endif + +#include "wx/defs.h" + #include "wx/radiobut.h" +#include "wx/utils.h" -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxRadioButton, wxControl) +#ifdef __VMS__ +#pragma message disable nosimpint +#endif +#include <Xm/Label.h> +#include <Xm/LabelG.h> +#include <Xm/ToggleB.h> +#include <Xm/ToggleBG.h> +#include <Xm/RowColumn.h> +#include <Xm/Form.h> +#ifdef __VMS__ +#pragma message enable nosimpint #endif +#include "wx/motif/private.h" + +void wxRadioButtonCallback (Widget w, XtPointer clientData, + XmToggleButtonCallbackStruct * cbs); + +IMPLEMENT_DYNAMIC_CLASS(wxRadioButton, wxControl) + +wxRadioButton::wxRadioButton() +{ +} + bool wxRadioButton::Create(wxWindow *parent, wxWindowID id, - const wxString& label, - const wxPoint& pos, - const wxSize& size, long style, - const wxValidator& validator, - const wxString& name) + const wxString& label, + const wxPoint& pos, + const wxSize& size, long style, + const wxValidator& validator, + const wxString& name) { SetName(name); SetValidator(validator); + m_backgroundColour = parent->GetBackgroundColour(); + m_foregroundColour = parent->GetForegroundColour(); + m_font = parent->GetFont(); if (parent) parent->AddChild(this); if ( id == -1 ) - m_windowId = (int)NewControlId(); + m_windowId = (int)NewControlId(); else - m_windowId = id; + m_windowId = id; m_windowStyle = style ; - // TODO create radiobutton - return FALSE; -} + Widget parentWidget = (Widget) parent->GetClientWidget(); -void wxRadioButton::SetLabel(const wxString& label) -{ - // TODO + wxString label1(wxStripMenuCodes(label)); + + XmString text = XmStringCreateSimple ((char*) (const char*) label1); + + XmFontList fontList = (XmFontList) m_font.GetFontList(1.0, XtDisplay(parentWidget)); + + Widget radioButtonWidget = XtVaCreateManagedWidget ("toggle", +#if wxUSE_GADGETS + xmToggleButtonGadgetClass, parentWidget, +#else + xmToggleButtonWidgetClass, parentWidget, +#endif + XmNfontList, fontList, + XmNlabelString, text, + XmNfillOnSelect, True, + XmNindicatorType, XmONE_OF_MANY, // diamond-shape + NULL); + XmStringFree (text); + + XtAddCallback (radioButtonWidget, XmNvalueChangedCallback, (XtCallbackProc) wxRadioButtonCallback, + (XtPointer) this); + + m_mainWidget = (WXWidget) radioButtonWidget; + + XtManageChild (radioButtonWidget); + + SetCanAddEventHandler(TRUE); + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); + + ChangeBackgroundColour(); + + return TRUE; } void wxRadioButton::SetValue(bool value) { - // TODO + m_inSetValue = TRUE; + XmToggleButtonSetState ((Widget) m_mainWidget, (Boolean) value, FALSE); + m_inSetValue = FALSE; } // Get single selection, for single choice list items bool wxRadioButton::GetValue() const { - // TODO - return FALSE; + return (XmToggleButtonGetState ((Widget) m_mainWidget) != 0); } void wxRadioButton::Command (wxCommandEvent & event) { - SetValue ( (event.m_commandInt != 0) ); - ProcessCommand (event); + SetValue ( (event.m_commandInt != 0) ); + ProcessCommand (event); +} + +void wxRadioButton::ChangeFont(bool keepOriginalSize) +{ + wxWindow::ChangeFont(keepOriginalSize); +} + +void wxRadioButton::ChangeBackgroundColour() +{ + wxWindow::ChangeBackgroundColour(); + + // What colour should this be? + int selectPixel = wxBLACK->AllocColour(wxGetDisplay()); + + XtVaSetValues ((Widget) GetMainWidget(), + XmNselectColor, selectPixel, + NULL); +} + +void wxRadioButton::ChangeForegroundColour() +{ + wxWindow::ChangeForegroundColour(); } +void wxRadioButtonCallback (Widget w, XtPointer clientData, + XmToggleButtonCallbackStruct * cbs) +{ + if (!cbs->set) + return; + + wxRadioButton *item = (wxRadioButton *) clientData; + if (item->InSetValue()) + return; + + wxCommandEvent event (wxEVT_COMMAND_RADIOBUTTON_SELECTED, item->GetId()); + event.SetEventObject(item); + + item->ProcessCommand (event); +}