1 /////////////////////////////////////////////////////////////////////////////
8 // Copyright: (c) AUTHOR
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "choice.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/choice.h"
19 #include "wx/mac/uma.h"
21 #if !USE_SHARED_LIBRARY
22 IMPLEMENT_DYNAMIC_CLASS(wxChoice
, wxControl
)
25 short nextMenuId
= 100 ; // wxMenu takes the lower ids
29 // DeleteMenu( m_macPopUpMenuId ) ;
30 // DisposeMenu( m_macPopUpMenuHandle ) ;
33 bool wxChoice::Create(wxWindow
*parent
, wxWindowID id
,
36 int n
, const wxString choices
[],
38 const wxValidator
& validator
,
45 MacPreControlCreate( parent
, id
, "" , pos
, size
,style
, validator
, name
, &bounds
, title
) ;
47 m_macControl
= UMANewControl( parent
->GetMacRootWindow() , &bounds
, title
, true , 0 , -12345 , 0 ,
48 kControlPopupButtonProc
+ kControlPopupFixedWidthVariant
, (long) this ) ;
50 m_macPopUpMenuHandle
= NewMenu( 1 , "\pPopUp Menu" ) ;
51 SetControlData( m_macControl
, kControlNoPart
, kControlPopupButtonMenuHandleTag
, sizeof( MenuHandle
) , (char*) &m_macPopUpMenuHandle
) ;
52 SetControlMinimum( m_macControl
, 0 ) ;
53 SetControlMaximum( m_macControl
, 0) ;
55 SetControlValue( m_macControl
, 1 ) ;
57 MacPostControlCreate() ;
59 for ( int i
= 0; i
< n
; i
++ )
66 // ----------------------------------------------------------------------------
67 // adding/deleting items to/from the list
68 // ----------------------------------------------------------------------------
70 int wxChoice::DoAppend(const wxString
& item
)
73 wxMenuItem::MacBuildMenuString( label
, NULL
, NULL
, item
,false);
74 AppendMenu( m_macPopUpMenuHandle
, label
) ;
75 m_strings
.Add( item
) ;
77 int index
= m_strings
.GetCount() - 1 ;
78 DoSetItemClientData( index
, NULL
) ;
79 SetControlMaximum( m_macControl
, Number()) ;
83 void wxChoice::Delete(int n
)
85 wxCHECK_RET( n
< GetCount(), wxT("invalid item index in wxChoice::Delete") );
87 if ( HasClientObjectData() )
89 delete GetClientObject(n
);
92 ::DeleteMenuItem( m_macPopUpMenuHandle
, n
+ 1) ;
93 m_strings
.Remove( n
) ;
94 SetControlMaximum( m_macControl
, Number()) ;
97 void wxChoice::Clear()
101 for ( int i
= 0 ; i
< GetCount() ; i
++ )
103 ::DeleteMenuItem( m_macPopUpMenuHandle
, 1 ) ;
107 SetControlMaximum( m_macControl
, 0 ) ;
110 void wxChoice::Free()
112 if ( HasClientObjectData() )
114 size_t count
= GetCount();
115 for ( size_t n
= 0; n
< count
; n
++ )
117 delete GetClientObject(n
);
122 // ----------------------------------------------------------------------------
124 // ----------------------------------------------------------------------------
126 int wxChoice::GetSelection() const
128 return GetControlValue( m_macControl
) -1 ;
131 void wxChoice::SetSelection(int n
)
133 SetControlValue( m_macControl
, n
+ 1 ) ;
136 // ----------------------------------------------------------------------------
137 // string list functions
138 // ----------------------------------------------------------------------------
140 int wxChoice::GetCount() const
142 return m_strings
.GetCount() ;
145 int wxChoice::FindString(const wxString
& s
) const
147 for( int i
= 0 ; i
< GetCount() ; i
++ )
149 if ( GetString( i
).IsSameAs(s
, FALSE
) )
155 void wxChoice::SetString(int n
, const wxString
& s
)
157 wxFAIL_MSG(wxT("not implemented"));
159 #if 0 // should do this, but no Insert() so far
166 wxString
wxChoice::GetString(int n
) const
168 return m_strings
[n
] ;
171 // ----------------------------------------------------------------------------
173 // ----------------------------------------------------------------------------
175 void wxChoice::DoSetItemClientData( int n
, void* clientData
)
177 wxCHECK_RET( n
>= 0 && n
< m_datas
.GetCount(),
178 "invalid index in wxChoice::SetClientData" );
179 wxASSERT_MSG( m_datas
.GetCount() >= n
, "invalid client_data array" ) ;
181 if ( m_datas
.GetCount() > n
)
183 m_datas
[n
] = (char*) clientData
;
187 m_datas
.Add( (char*) clientData
) ;
191 void *wxChoice::DoGetItemClientData(int N
) const
193 wxCHECK_MSG( N
>= 0 && N
< m_datas
.GetCount(), NULL
,
194 "invalid index in wxChoice::GetClientData" );
196 return (void *)m_datas
[N
];
199 void wxChoice::DoSetItemClientObject( int n
, wxClientData
* clientData
)
201 DoSetItemClientData(n
, clientData
);
204 wxClientData
* wxChoice::DoGetItemClientObject( int n
) const
206 return (wxClientData
*)DoGetItemClientData(n
);
209 void wxChoice::MacHandleControlClick( ControlHandle control
, SInt16 controlpart
)
211 wxCommandEvent
event(wxEVT_COMMAND_CHOICE_SELECTED
, m_windowId
);
212 event
.SetInt(GetSelection());
213 event
.SetEventObject(this);
214 event
.SetString(GetStringSelection());
215 ProcessCommand(event
);
218 void wxChoice::Command(wxCommandEvent & event)
220 SetSelection (event.GetInt());
221 ProcessCommand (event);