1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Stefan Csomor
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "choice.h"
17 #include "wx/choice.h"
19 #include "wx/mac/uma.h"
21 #if !USE_SHARED_LIBRARY
22 IMPLEMENT_DYNAMIC_CLASS(wxChoice
, wxControl
)
25 extern MenuHandle
NewUniqueMenu() ;
29 if ( HasClientObjectData() )
31 size_t i
, max
= GetCount();
33 for ( i
= 0; i
< max
; ++i
)
34 delete GetClientObject(i
);
37 // DeleteMenu( m_macPopUpMenuId ) ;
38 // DisposeMenu( m_macPopUpMenuHandle ) ;
41 bool wxChoice::Create(wxWindow
*parent
, wxWindowID id
,
44 int n
, const wxString choices
[],
46 const wxValidator
& validator
,
52 MacPreControlCreate( parent
, id
, wxEmptyString
, pos
, size
,style
, validator
, name
, &bounds
, title
) ;
53 m_macControl
= ::NewControl( MAC_WXHWND(parent
->MacGetRootWindow()) , &bounds
, title
, false , 0 , -12345 , 0 ,
54 kControlPopupButtonProc
+ kControlPopupFixedWidthVariant
, (long) this ) ;
56 m_macPopUpMenuHandle
= NewUniqueMenu() ;
57 SetControlData( (ControlHandle
) m_macControl
, kControlNoPart
, kControlPopupButtonMenuHandleTag
, sizeof( MenuHandle
) , (char*) &m_macPopUpMenuHandle
) ;
58 SetControl32BitMinimum( (ControlHandle
) m_macControl
, 0 ) ;
59 SetControl32BitMaximum( (ControlHandle
) m_macControl
, 0) ;
61 SetControl32BitValue( (ControlHandle
) m_macControl
, 1 ) ;
62 MacPostControlCreate() ;
63 for ( int i
= 0; i
< n
; i
++ )
70 // ----------------------------------------------------------------------------
71 // adding/deleting items to/from the list
72 // ----------------------------------------------------------------------------
73 int wxChoice::DoAppend(const wxString
& item
)
75 UMAAppendMenuItem(MAC_WXHMENU( m_macPopUpMenuHandle
) , item
);
76 m_strings
.Add( item
) ;
78 int index
= m_strings
.GetCount() - 1 ;
79 DoSetItemClientData( index
, NULL
) ;
80 SetControl32BitMaximum( (ControlHandle
) m_macControl
, GetCount()) ;
84 int wxChoice::DoInsert(const wxString
& item
, int pos
)
86 wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT
), -1, wxT("can't insert into sorted list"));
87 wxCHECK_MSG((pos
>=0) && (pos
<=GetCount()), -1, wxT("invalid index"));
89 if (pos
== GetCount())
90 return DoAppend(item
);
92 UMAAppendMenuItem(MAC_WXHMENU( m_macPopUpMenuHandle
) , item
);
93 m_strings
.Insert( item
, pos
) ;
94 m_datas
.Insert( NULL
, pos
) ;
95 DoSetItemClientData( pos
, NULL
) ;
96 SetControl32BitMaximum( (ControlHandle
) m_macControl
, pos
) ;
100 void wxChoice::Delete(int n
)
102 wxCHECK_RET( n
< GetCount(), wxT("invalid item index in wxChoice::Delete") );
103 if ( HasClientObjectData() )
105 delete GetClientObject(n
);
107 ::DeleteMenuItem( MAC_WXHMENU(m_macPopUpMenuHandle
) , n
+ 1) ;
108 m_strings
.Remove( n
) ;
109 m_datas
.RemoveAt( n
) ;
110 SetControl32BitMaximum( (ControlHandle
) m_macControl
, GetCount()) ;
113 void wxChoice::Clear()
116 for ( int i
= 0 ; i
< GetCount() ; i
++ )
118 ::DeleteMenuItem( MAC_WXHMENU(m_macPopUpMenuHandle
) , 1 ) ;
122 SetControl32BitMaximum( (ControlHandle
) m_macControl
, 0 ) ;
125 void wxChoice::FreeData()
127 if ( HasClientObjectData() )
129 size_t count
= GetCount();
130 for ( size_t n
= 0; n
< count
; n
++ )
132 delete GetClientObject(n
);
137 // ----------------------------------------------------------------------------
139 // ----------------------------------------------------------------------------
140 int wxChoice::GetSelection() const
142 return GetControl32BitValue( (ControlHandle
) m_macControl
) -1 ;
145 void wxChoice::SetSelection(int n
)
147 SetControl32BitValue( (ControlHandle
) m_macControl
, n
+ 1 ) ;
150 // ----------------------------------------------------------------------------
151 // string list functions
152 // ----------------------------------------------------------------------------
154 int wxChoice::GetCount() const
156 return m_strings
.GetCount() ;
159 int wxChoice::FindString(const wxString
& s
) const
161 for( int i
= 0 ; i
< GetCount() ; i
++ )
163 if ( GetString( i
).IsSameAs(s
, FALSE
) )
169 void wxChoice::SetString(int n
, const wxString
& s
)
171 wxFAIL_MSG(wxT("wxChoice::SetString() not yet implemented"));
172 #if 0 // should do this, but no Insert() so far
178 wxString
wxChoice::GetString(int n
) const
180 return m_strings
[n
] ;
182 // ----------------------------------------------------------------------------
184 // ----------------------------------------------------------------------------
185 void wxChoice::DoSetItemClientData( int n
, void* clientData
)
187 wxCHECK_RET( n
>= 0 && (size_t)n
< m_datas
.GetCount(),
188 wxT("invalid index in wxChoice::SetClientData") );
190 m_datas
[n
] = (char*) clientData
;
193 void *wxChoice::DoGetItemClientData(int n
) const
195 wxCHECK_MSG( n
>= 0 && (size_t)n
< m_datas
.GetCount(), NULL
,
196 wxT("invalid index in wxChoice::GetClientData") );
197 return (void *)m_datas
[n
];
200 void wxChoice::DoSetItemClientObject( int n
, wxClientData
* clientData
)
202 DoSetItemClientData(n
, clientData
);
205 wxClientData
* wxChoice::DoGetItemClientObject( int n
) const
207 return (wxClientData
*)DoGetItemClientData(n
);
210 void wxChoice::MacHandleControlClick( WXWidget control
, wxInt16 controlpart
)
212 wxCommandEvent
event(wxEVT_COMMAND_CHOICE_SELECTED
, m_windowId
);
213 int n
= GetSelection();
214 // actually n should be made sure by the os to be a valid selection, but ...
218 event
.SetString(GetStringSelection());
219 event
.SetEventObject(this);
220 if ( HasClientObjectData() )
221 event
.SetClientObject( GetClientObject(n
) );
222 else if ( HasClientUntypedData() )
223 event
.SetClientData( GetClientData(n
) );
224 ProcessCommand(event
);
228 wxSize
wxChoice::DoGetBestSize() const
230 int lbWidth
= GetCount() > 0 ? 20 : 100; // some defaults
235 GetThemeMetric(kThemeMetricPopupButtonHeight
, &metric
);
239 wxMacPortStateHelper
st( UMAGetWindowPort( (WindowRef
) MacGetRootWindow() ) ) ;
240 wxFontRefData
* font
= (wxFontRefData
*) m_font
.GetRefData() ;
243 ::TextFont( font
->m_macFontNum
) ;
244 ::TextSize( short(font
->m_macFontSize
) ) ;
245 ::TextFace( font
->m_macFontStyle
) ;
249 ::TextFont( kFontIDMonaco
) ;
253 // Find the widest line
254 for(int i
= 0; i
< GetCount(); i
++) {
255 wxString
str(GetString(i
));
259 ::GetThemeTextDimensions( wxMacCFStringHolder( str
) ,
260 kThemeCurrentPortFont
,
267 wxCharBuffer text
= wxMacStringToCString( str
) ;
268 wLine
= ::TextWidth( text
, 0 , strlen(text
) ) ;
270 lbWidth
= wxMax(lbWidth
, wLine
);
272 // Add room for the popup arrow
273 lbWidth
+= 2 * lbHeight
;
274 // And just a bit more
275 int cx
= ::TextWidth( "X" , 0 , 1 ) ;
279 return wxSize(lbWidth
, lbHeight
);