1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
13 #pragma implementation "checkbox.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
20 #define XtDisplay XTDISPLAY
21 #define XmNtoggleMode 0
22 #define XmTOGGLE_INDETERMINATE 1
23 #define XmTOGGLE_BOOLEAN 2
26 #define XmINDETERMINATE 5
31 #include "wx/checkbox.h"
32 #include "wx/tglbtn.h"
36 #pragma message disable nosimpint
39 #include <Xm/LabelG.h>
40 #include <Xm/ToggleB.h>
41 #include <Xm/ToggleBG.h>
43 #pragma message enable nosimpint
46 #include "wx/motif/private.h"
48 void wxCheckBoxCallback (Widget w
, XtPointer clientData
,
51 IMPLEMENT_DYNAMIC_CLASS(wxCheckBox
, wxControl
)
53 // Single check box item
54 bool wxCheckBox::Create(wxWindow
*parent
, wxWindowID id
, const wxString
& label
,
56 const wxSize
& size
, long style
,
57 const wxValidator
& validator
,
60 if( !wxControl::CreateControl( parent
, id
, pos
, size
, style
, validator
,
64 wxString
label1(wxStripMenuCodes(label
));
65 wxXmString
text( label1
);
67 Widget parentWidget
= (Widget
) parent
->GetClientWidget();
69 m_mainWidget
= (WXWidget
) XtVaCreateManagedWidget ("toggle",
70 xmToggleButtonWidgetClass
, parentWidget
,
71 wxFont::GetFontTag(), m_font
.GetFontType(XtDisplay(parentWidget
)),
72 XmNlabelString
, text(),
73 XmNrecomputeSize
, False
,
74 // XmNindicatorOn, XmINDICATOR_CHECK_BOX,
75 // XmNfillOnSelect, False,
76 XmNtoggleMode
, Is3State() ? XmTOGGLE_INDETERMINATE
: XmTOGGLE_BOOLEAN
,
79 XtAddCallback( (Widget
)m_mainWidget
,
80 XmNvalueChangedCallback
, (XtCallbackProc
)wxCheckBoxCallback
,
83 XmToggleButtonSetState ((Widget
) m_mainWidget
, FALSE
, TRUE
);
85 AttachWidget( parent
, m_mainWidget
, (WXWidget
)NULL
,
86 pos
.x
, pos
.y
, size
.x
, size
.y
);
88 ChangeBackgroundColour();
92 void wxCheckBox::SetValue(bool val
)
96 Set3StateValue(wxCHK_CHECKED
);
100 Set3StateValue(wxCHK_UNCHECKED
);
104 bool wxCheckBox::GetValue() const
106 return (Get3StateValue() != 0);
109 void wxCheckBox::Command (wxCommandEvent
& event
)
111 int state
= event
.GetInt();
112 wxCHECK_RET( (state
== wxCHK_UNCHECKED
) || (state
== wxCHK_CHECKED
)
113 || (state
== wxCHK_UNDETERMINED
),
114 wxT("event.GetInt() returned an invalid checkbox state") );
116 Set3StateValue((wxCheckBoxState
) state
);
117 ProcessCommand(event
);
120 void wxCheckBoxCallback (Widget
WXUNUSED(w
), XtPointer clientData
,
121 XtPointer
WXUNUSED(ptr
))
123 wxCheckBox
*item
= (wxCheckBox
*) clientData
;
125 if (item
->InSetValue())
128 wxCheckBoxState state
= item
->Get3StateValue();
130 if( !item
->Is3rdStateAllowedForUser() && state
== wxCHK_UNDETERMINED
)
132 state
= wxCHK_UNCHECKED
;
133 item
->Set3StateValue( state
);
136 wxCommandEvent
event( item
->m_evtType
, item
->GetId() );
137 event
.SetInt( (int)state
);
138 event
.SetEventObject( item
);
139 item
->ProcessCommand( event
);
142 void wxCheckBox::ChangeBackgroundColour()
144 wxComputeColours (XtDisplay((Widget
) m_mainWidget
), & m_backgroundColour
,
147 XtVaSetValues ((Widget
) m_mainWidget
,
148 XmNbackground
, g_itemColors
[wxBACK_INDEX
].pixel
,
149 XmNtopShadowColor
, g_itemColors
[wxTOPS_INDEX
].pixel
,
150 XmNbottomShadowColor
, g_itemColors
[wxBOTS_INDEX
].pixel
,
151 XmNforeground
, g_itemColors
[wxFORE_INDEX
].pixel
,
154 int selectPixel
= wxBLACK
->AllocColour(XtDisplay((Widget
)m_mainWidget
));
156 // Better to have the checkbox selection in black, or it's
157 // hard to determine what state it is in.
158 XtVaSetValues ((Widget
) m_mainWidget
,
159 XmNselectColor
, selectPixel
,
163 void wxCheckBox::DoSet3StateValue(wxCheckBoxState state
)
171 case wxCHK_UNCHECKED
: value
= XmUNSET
; break;
172 case wxCHK_CHECKED
: value
= XmSET
; break;
173 case wxCHK_UNDETERMINED
: value
= XmINDETERMINATE
; break;
176 XtVaSetValues( (Widget
) m_mainWidget
,
180 m_inSetValue
= false;
183 wxCheckBoxState
wxCheckBox::DoGet3StateValue() const
185 unsigned char value
= 0;
187 XtVaGetValues( (Widget
) m_mainWidget
,
193 case XmUNSET
: return wxCHK_UNCHECKED
;
194 case XmSET
: return wxCHK_CHECKED
;
195 case XmINDETERMINATE
: return wxCHK_UNDETERMINED
;
199 return wxCHK_UNDETERMINED
;
202 ///////////////////////////////////////////////////////////////////////////////
204 ///////////////////////////////////////////////////////////////////////////////
208 DEFINE_EVENT_TYPE(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED
)
209 IMPLEMENT_DYNAMIC_CLASS(wxToggleButton
, wxControl
)
211 bool wxToggleButton::Create( wxWindow
* parent
, wxWindowID id
,
212 const wxString
& label
,
216 const wxValidator
& val
,
217 const wxString
&name
)
219 if( !wxCheckBox::Create( parent
, id
, label
, pos
, size
, style
, val
, name
) )
222 XtVaSetValues( (Widget
)m_mainWidget
,
224 #if XmVersion >= 2000
225 XmNindicatorOn
, XmINDICATOR_NONE
,
227 XmNindicatorOn
, False
,
229 XmNfillOnSelect
, False
,
230 XmNshadowThickness
, 2,
231 XmNalignment
, XmALIGNMENT_CENTER
,
236 // set it again, because the XtVaSetValue above resets it
237 if( size
.x
!= -1 || size
.y
!= -1 )
243 #endif // wxUSE_TOGGLEBUTTON