1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxComboBox class
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "combobox.h"
20 #include "wx/combobox.h"
23 #pragma message disable nosimpint
27 #pragma message enable nosimpint
30 // use the old, GPL'd combobox
31 #if (XmVersion < 2000)
33 #include "xmcombo/xmcombo.h"
35 #include "wx/motif/private.h"
37 void wxComboBoxCallback (Widget w, XtPointer clientData,
38 XmComboBoxSelectionCallbackStruct * cbs);
40 IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxControl)
42 bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
43 const wxString& value,
46 int n, const wxString choices[],
48 const wxValidator& validator,
51 if( !CreateControl( parent, id, pos, size, style, validator, name ) )
56 Widget parentWidget = (Widget) parent->GetClientWidget();
58 Widget buttonWidget = XtVaCreateManagedWidget(name.c_str(),
59 xmComboBoxWidgetClass, parentWidget,
63 XmNeditable, ((style & wxCB_READONLY) != wxCB_READONLY),
64 XmNsorted, ((style & wxCB_SORT) == wxCB_SORT),
65 XmNstaticList, ((style & wxCB_SIMPLE) == wxCB_SIMPLE),
69 for (i = 0; i < n; i++)
71 wxXmString str( choices[i] );
72 XmComboBoxAddItem(buttonWidget, str(), 0);
73 m_stringList.Add(choices[i]);
76 m_mainWidget = (Widget) buttonWidget;
78 XtManageChild (buttonWidget);
84 XtAddCallback (buttonWidget, XmNselectionCallback, (XtCallbackProc) wxComboBoxCallback,
86 XtAddCallback (buttonWidget, XmNvalueChangedCallback, (XtCallbackProc) wxComboBoxCallback,
89 AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y);
91 ChangeBackgroundColour();
96 wxComboBox::~wxComboBox()
98 DetachWidget((Widget) m_mainWidget); // Removes event handlers
99 XtDestroyWidget((Widget) m_mainWidget);
100 m_mainWidget = (WXWidget) 0;
101 if ( HasClientObjectData() )
102 m_clientDataDict.DestroyData();
105 void wxComboBox::DoSetSize(int x, int y, int width, int height, int sizeFlags)
107 // Necessary so it doesn't call wxChoice::SetSize
108 wxWindow::DoSetSize(x, y, width, DoGetBestSize().y, sizeFlags);
111 wxString wxComboBox::GetValue() const
113 char *s = XmComboBoxGetString ((Widget) m_mainWidget);
121 return wxEmptyString;
124 void wxComboBox::SetValue(const wxString& value)
128 XmComboBoxSetString( (Widget)m_mainWidget,
129 wxConstCast(value.c_str(), char) );
130 m_inSetValue = FALSE;
133 void wxComboBox::SetString(int n, const wxString& s)
135 wxFAIL_MSG( wxT("wxComboBox::SetString only implemented for Motif 2.0") );
138 int wxComboBox::DoAppend(const wxString& item)
140 wxXmString str( item.c_str() );
141 XmComboBoxAddItem((Widget) m_mainWidget, str(), 0);
142 m_stringList.Add(item);
145 return GetCount() - 1;
148 int wxComboBox::DoInsert(const wxString& item, int pos)
150 wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list"));
151 wxCHECK_MSG((pos>=0) && (pos<=GetCount()), -1, wxT("invalid index"));
153 if (pos == GetCount())
154 return DoAppend(item);
156 wxXmString str( item.c_str() );
157 XmComboBoxAddItem((Widget) m_mainWidget, str(), pos+1);
159 //FIX me for VMS : no intance for insert function to overload
160 m_stringList.Insert(pos, item);
167 void wxComboBox::Delete(int n)
169 XmComboBoxDeletePos((Widget) m_mainWidget, n+1);
170 wxStringList::Node *node = m_stringList.Item(n);
173 delete[] node->GetData();
176 m_clientDataDict.Delete(n, HasClientObjectData());
180 void wxComboBox::Clear()
182 XmComboBoxDeleteAllItems((Widget) m_mainWidget);
183 m_stringList.Clear();
185 if ( HasClientObjectData() )
186 m_clientDataDict.DestroyData();
190 void wxComboBox::SetSelection (int n)
192 XmComboBoxSelectPos((Widget) m_mainWidget, n+1, False);
195 int wxComboBox::GetSelection (void) const
197 int sel = XmComboBoxGetSelectedPos((Widget) m_mainWidget);
204 wxString wxComboBox::GetString(int n) const
206 wxStringList::Node *node = m_stringList.Item(n);
208 return wxString(node->GetData ());
210 return wxEmptyString;
213 int wxComboBox::FindString(const wxString& s) const
215 int *pos_list = NULL;
217 wxXmString text( s );
218 bool found = (XmComboBoxGetMatchPos((Widget) m_mainWidget,
219 text(), &pos_list, &count) != 0);
221 if (found && count > 0)
223 int pos = pos_list[0] - 1;
231 // Clipboard operations
232 void wxComboBox::Copy()
234 XmComboBoxCopy((Widget) m_mainWidget, CurrentTime);
237 void wxComboBox::Cut()
239 XmComboBoxCut((Widget) m_mainWidget, CurrentTime);
242 void wxComboBox::Paste()
244 XmComboBoxPaste((Widget) m_mainWidget);
247 void wxComboBox::SetEditable(bool WXUNUSED(editable))
252 void wxComboBox::SetInsertionPoint(long pos)
254 XmComboBoxSetInsertionPosition ((Widget) m_mainWidget, (XmTextPosition) pos);
257 void wxComboBox::SetInsertionPointEnd()
259 XmTextPosition pos = XmComboBoxGetLastPosition ((Widget) m_mainWidget);
260 XmComboBoxSetInsertionPosition ((Widget) m_mainWidget, (XmTextPosition) (pos + 1));
263 long wxComboBox::GetInsertionPoint() const
265 return (long) XmComboBoxGetInsertionPosition ((Widget) m_mainWidget);
268 long wxComboBox::GetLastPosition() const
270 return (long) XmComboBoxGetLastPosition ((Widget) m_mainWidget);
273 void wxComboBox::Replace(long from, long to, const wxString& value)
275 XmComboBoxReplace ((Widget) m_mainWidget, (XmTextPosition) from,
277 wxConstCast(value.c_str(), char));
280 void wxComboBox::Remove(long from, long to)
282 XmComboBoxSetSelection ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to,
284 XmComboBoxRemove ((Widget) m_mainWidget);
287 void wxComboBox::SetSelection(long from, long to)
289 XmComboBoxSetSelection ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to,
293 void wxComboBoxCallback (Widget WXUNUSED(w), XtPointer clientData,
294 XmComboBoxSelectionCallbackStruct * cbs)
296 wxComboBox *item = (wxComboBox *) clientData;
300 case XmCR_SINGLE_SELECT:
301 case XmCR_BROWSE_SELECT:
303 wxCommandEvent event (wxEVT_COMMAND_COMBOBOX_SELECTED,
305 event.m_commandInt = cbs->index - 1;
306 event.m_commandString = item->GetString (event.m_commandInt);
307 if ( item->HasClientObjectData() )
308 event.SetClientObject( item->GetClientObject(cbs->index - 1) );
309 else if ( item->HasClientUntypedData() )
310 event.SetClientData( item->GetClientData(cbs->index - 1) );
311 event.m_extraLong = TRUE;
312 event.SetEventObject(item);
313 item->ProcessCommand (event);
316 case XmCR_VALUE_CHANGED:
318 wxCommandEvent event (wxEVT_COMMAND_TEXT_UPDATED, item->GetId());
319 event.m_commandInt = -1;
320 event.m_commandString = item->GetValue();
321 event.m_extraLong = TRUE;
322 event.SetEventObject(item);
323 item->ProcessCommand (event);
331 void wxComboBox::ChangeFont(bool keepOriginalSize)
333 // Don't use the base class wxChoice's ChangeFont
334 wxWindow::ChangeFont(keepOriginalSize);
337 void wxComboBox::ChangeBackgroundColour()
339 wxWindow::ChangeBackgroundColour();
342 void wxComboBox::ChangeForegroundColour()
344 wxWindow::ChangeForegroundColour();
347 wxSize wxComboBox::DoGetBestSize() const
349 if( (GetWindowStyle() & wxCB_DROPDOWN) == wxCB_DROPDOWN ||
350 (GetWindowStyle() & wxCB_READONLY) == wxCB_READONLY )
352 wxSize items = GetItemsSize();
353 // FIXME arbitrary constants
354 return wxSize( ( items.x ? items.x + 50 : 120 ),
358 return wxWindow::DoGetBestSize();
361 #endif // XmVersion < 2000
363 #endif // wxUSE_COMBOBOX