1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/mac/carbon/radiobox.cpp
4 // Author: Stefan Csomor
5 // Modified by: JS Lair (99/11/15) first implementation
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
16 #include "wx/radiobox.h"
19 #include "wx/radiobut.h"
22 #include "wx/arrstr.h"
23 #include "wx/mac/uma.h"
25 IMPLEMENT_DYNAMIC_CLASS(wxRadioBox
, wxControl
)
28 BEGIN_EVENT_TABLE(wxRadioBox
, wxControl
)
29 EVT_RADIOBUTTON( wxID_ANY
, wxRadioBox::OnRadioButton
)
33 void wxRadioBox::OnRadioButton( wxCommandEvent
&outer
)
35 if ( outer
.IsChecked() )
37 wxCommandEvent
event( wxEVT_COMMAND_RADIOBOX_SELECTED
, m_windowId
);
38 int i
= GetSelection() ;
40 event
.SetString(GetString(i
));
41 event
.SetEventObject( this );
42 ProcessCommand(event
);
46 wxRadioBox::wxRadioBox()
50 m_radioButtonCycle
= NULL
;
53 wxRadioBox::~wxRadioBox()
55 m_isBeingDeleted
= true;
57 wxRadioButton
*next
, *current
;
59 current
= m_radioButtonCycle
->NextInCycle();
62 while (current
!= m_radioButtonCycle
)
64 next
= current
->NextInCycle();
74 // Create the radiobox for two-step construction
76 bool wxRadioBox::Create( wxWindow
*parent
,
77 wxWindowID id
, const wxString
& label
,
78 const wxPoint
& pos
, const wxSize
& size
,
79 const wxArrayString
& choices
,
80 int majorDim
, long style
,
81 const wxValidator
& val
, const wxString
& name
)
83 wxCArrayString
chs(choices
);
86 parent
, id
, label
, pos
, size
, chs
.GetCount(),
87 chs
.GetStrings(), majorDim
, style
, val
, name
);
90 bool wxRadioBox::Create( wxWindow
*parent
,
91 wxWindowID id
, const wxString
& label
,
92 const wxPoint
& pos
, const wxSize
& size
,
93 int n
, const wxString choices
[],
94 int majorDim
, long style
,
95 const wxValidator
& val
, const wxString
& name
)
97 m_macIsUserPane
= false ;
99 if ( !wxControl::Create( parent
, id
, pos
, size
, style
, val
, name
) )
104 m_noItems
= (unsigned int)n
;
105 m_noRowsOrCols
= majorDim
;
106 m_radioButtonCycle
= NULL
;
108 SetMajorDim( majorDim
== 0 ? n
: majorDim
, style
);
112 Rect bounds
= wxMacGetBoundsForControl( this, pos
, size
);
113 if ( bounds
.right
<= bounds
.left
)
114 bounds
.right
= bounds
.left
+ 100;
115 if ( bounds
.bottom
<= bounds
.top
)
116 bounds
.bottom
= bounds
.top
+ 100;
118 m_peer
= new wxMacControl( this );
120 OSStatus err
= CreateGroupBoxControl(
121 MAC_WXHWND(parent
->MacGetTopLevelWindowRef()),
122 &bounds
, CFSTR("") , true /*primary*/,
123 m_peer
->GetControlRefAddr() );
126 for (i
= 0; i
< n
; i
++)
128 wxRadioButton
*radBtn
= new wxRadioButton(
131 wxStripMenuCodes(choices
[i
]),
132 wxPoint( 5, 20 * i
+ 10 ),
134 i
== 0 ? wxRB_GROUP
: 0 );
137 m_radioButtonCycle
= radBtn
;
138 // m_radioButtonCycle = radBtn->AddInCycle( m_radioButtonCycle );
142 MacPostControlCreate( pos
, size
);
147 // Enables or disables the entire radiobox
149 bool wxRadioBox::Enable(bool enable
)
151 wxRadioButton
*current
;
153 if (!wxControl::Enable( enable
))
156 current
= m_radioButtonCycle
;
157 for (unsigned int i
= 0; i
< m_noItems
; i
++)
159 current
->Enable( enable
);
160 current
= current
->NextInCycle();
166 // Enables or disables an given button
168 bool wxRadioBox::Enable(unsigned int item
, bool enable
)
170 if (!IsValid( item
))
174 wxRadioButton
*current
= m_radioButtonCycle
;
178 current
= current
->NextInCycle();
181 return current
->Enable( enable
);
184 // Returns the radiobox label
186 wxString
wxRadioBox::GetLabel() const
188 return wxControl::GetLabel();
191 // Returns the label for the given button
193 wxString
wxRadioBox::GetString(unsigned int item
) const
195 wxRadioButton
*current
;
197 if (!IsValid( item
))
198 return wxEmptyString
;
201 current
= m_radioButtonCycle
;
205 current
= current
->NextInCycle();
208 return current
->GetLabel();
211 // Returns the zero-based position of the selected button
213 int wxRadioBox::GetSelection() const
216 wxRadioButton
*current
;
219 current
= m_radioButtonCycle
;
220 while (!current
->GetValue())
223 current
= current
->NextInCycle();
229 // Sets the radiobox label
231 void wxRadioBox::SetLabel(const wxString
& label
)
233 return wxControl::SetLabel( label
);
236 // Sets the label of a given button
238 void wxRadioBox::SetString(unsigned int item
,const wxString
& label
)
240 if (!IsValid( item
))
244 wxRadioButton
*current
= m_radioButtonCycle
;
248 current
= current
->NextInCycle();
251 return current
->SetLabel( label
);
254 // Sets a button by passing the desired position. This does not cause
255 // wxEVT_COMMAND_RADIOBOX_SELECTED event to get emitted
257 void wxRadioBox::SetSelection(int item
)
260 wxRadioButton
*current
;
262 if (!IsValid( item
))
266 current
= m_radioButtonCycle
;
270 current
= current
->NextInCycle();
273 current
->SetValue( true );
276 // Shows or hides the entire radiobox
278 bool wxRadioBox::Show(bool show
)
280 wxRadioButton
*current
;
282 current
= m_radioButtonCycle
;
283 for (unsigned int i
=0; i
<m_noItems
; i
++)
285 current
->Show( show
);
286 current
= current
->NextInCycle();
289 wxControl::Show( show
);
294 // Shows or hides the given button
296 bool wxRadioBox::Show(unsigned int item
, bool show
)
298 if (!IsValid( item
))
302 wxRadioButton
*current
= m_radioButtonCycle
;
306 current
= current
->NextInCycle();
309 return current
->Show( show
);
312 // Simulates the effect of the user issuing a command to the item
314 void wxRadioBox::Command( wxCommandEvent
& event
)
316 SetSelection( event
.GetInt() );
317 ProcessCommand( event
);
320 // Sets the selected button to receive keyboard input
322 void wxRadioBox::SetFocus()
325 wxRadioButton
*current
;
328 current
= m_radioButtonCycle
;
329 while (!current
->GetValue())
332 current
= current
->NextInCycle();
338 // Simulates the effect of the user issuing a command to the item
340 #define RADIO_SIZE 20
342 void wxRadioBox::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
)
345 wxRadioButton
*current
;
347 // define the position
349 int x_current
, y_current
;
350 int x_offset
, y_offset
;
351 int widthOld
, heightOld
;
353 GetSize( &widthOld
, &heightOld
);
354 GetPosition( &x_current
, &y_current
);
358 if (!(sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
))
360 if (x
== wxDefaultCoord
)
361 x_offset
= x_current
;
362 if (y
== wxDefaultCoord
)
363 y_offset
= y_current
;
367 int charWidth
, charHeight
;
368 int maxWidth
, maxHeight
;
369 int eachWidth
[128], eachHeight
[128];
370 int totWidth
, totHeight
;
373 wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),
374 &charWidth
, &charHeight
);
380 for (unsigned int i
= 0 ; i
< m_noItems
; i
++)
382 GetTextExtent(GetString(i
), &eachWidth
[i
], &eachHeight
[i
] );
383 eachWidth
[i
] = (int)(eachWidth
[i
] + RADIO_SIZE
);
384 eachHeight
[i
] = (int)((3 * eachHeight
[i
]) / 2);
386 if (maxWidth
< eachWidth
[i
])
387 maxWidth
= eachWidth
[i
];
388 if (maxHeight
< eachHeight
[i
])
389 maxHeight
= eachHeight
[i
];
392 totHeight
= GetRowCount() * maxHeight
;
393 totWidth
= GetColumnCount() * (maxWidth
+ charWidth
);
395 wxSize sz
= DoGetSizeFromClientSize( wxSize( totWidth
, totHeight
) ) ;
397 // change the width / height only when specified
398 if ( width
== wxDefaultCoord
)
400 if ( sizeFlags
& wxSIZE_AUTO_WIDTH
)
406 if ( height
== wxDefaultCoord
)
408 if ( sizeFlags
& wxSIZE_AUTO_HEIGHT
)
414 wxControl::DoSetSize( x_offset
, y_offset
, width
, height
, wxSIZE_AUTO
);
416 // arrange radio buttons
417 int x_start
, y_start
;
425 current
= m_radioButtonCycle
;
426 for (i
= 0 ; i
< (int)m_noItems
; i
++)
428 // not to do for the zero button!
429 if ((i
> 0) && ((i
% GetMajorDim()) == 0))
431 if (m_windowStyle
& wxRA_SPECIFY_ROWS
)
433 x_offset
+= maxWidth
+ charWidth
;
439 y_offset
+= maxHeight
; //+ charHeight / 2
443 current
->SetSize( x_offset
, y_offset
, eachWidth
[i
], eachHeight
[i
]);
444 current
= current
->NextInCycle();
446 if (m_windowStyle
& wxRA_SPECIFY_ROWS
)
447 y_offset
+= maxHeight
; // + charHeight / 2
449 x_offset
+= maxWidth
+ charWidth
;
453 wxSize
wxRadioBox::DoGetBestSize() const
455 int charWidth
, charHeight
;
456 int maxWidth
, maxHeight
;
457 int eachWidth
, eachHeight
;
458 int totWidth
, totHeight
;
460 wxFont font
= GetFont(); // GetParent()->GetFont()
462 wxT("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),
463 &charWidth
, &charHeight
, NULL
, NULL
, &font
);
470 for (unsigned int i
= 0 ; i
< m_noItems
; i
++)
472 GetTextExtent(GetString(i
), &eachWidth
, &eachHeight
, NULL
, NULL
, &font
);
473 eachWidth
= (int)(eachWidth
+ RADIO_SIZE
);
474 eachHeight
= (int)((3 * eachHeight
) / 2);
475 if (maxWidth
< eachWidth
)
476 maxWidth
= eachWidth
;
477 if (maxHeight
< eachHeight
)
478 maxHeight
= eachHeight
;
481 totHeight
= GetRowCount() * maxHeight
;
482 totWidth
= GetColumnCount() * (maxWidth
+ charWidth
);
484 wxSize sz
= DoGetSizeFromClientSize( wxSize( totWidth
, totHeight
) );
488 // handle radio box title as well
489 GetTextExtent( GetLabel(), &eachWidth
, NULL
);
490 eachWidth
= (int)(eachWidth
+ RADIO_SIZE
) + 3 * charWidth
;
491 if (totWidth
< eachWidth
)
492 totWidth
= eachWidth
;
494 return wxSize( totWidth
, totHeight
);
497 #endif // wxUSE_RADIOBOX