// use the new, shiny combobox for Motif 2.x
#if (XmVersion >= 2000)
+#ifdef __VMS__
+#pragma message disable nosimpint
+#endif
#include <Xm/ComboBox.h>
#include <Xm/Text.h>
#include <Xm/List.h>
+#ifdef __VMS__
+#pragma message enable nosimpint
+#endif
#include "wx/motif/private.h"
( style & wxCB_DROPDOWN ) ? XmDROP_DOWN_COMBO_BOX :
// default to wxCB_DROPDOWN
XmDROP_DOWN_COMBO_BOX;
+ if( cb_type == XmDROP_DOWN_COMBO_BOX )
+ SetWindowStyle( style | wxCB_DROPDOWN );
Widget buttonWidget= XtVaCreateManagedWidget(name.c_str(),
xmComboBoxWidgetClass, parentWidget,
(XtCallbackProc) wxComboBoxCallback,
(XtPointer) this);
+ wxSize best = GetBestSize();
+ if( size.x != -1 ) best.x = size.x;
+ if( size.y != -1 ) best.y = size.y;
+
SetCanAddEventHandler(true);
AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
- pos.x, pos.y, size.x, size.y);
-
- XtVaSetValues (GetXmList(this),
- XmNvisibleItemCount, 10,
- NULL);
+ pos.x, pos.y, best.x, best.y);
ChangeBackgroundColour();
return true;
}
+void wxComboBox::AdjustDropDownListSize()
+{
+ int newListCount = -1, itemCount = GetCount();
+ const int MAX = 12;
+
+ if( !itemCount )
+ newListCount = 1;
+ else if( itemCount < MAX )
+ newListCount = itemCount;
+ else
+ newListCount = MAX;
+
+ XtVaSetValues( GetXmList(this),
+ XmNvisibleItemCount, newListCount,
+ NULL );
+}
+
wxComboBox::~wxComboBox()
{
DetachWidget((Widget) m_mainWidget); // Removes event handlers
{
wxXmString str( item.c_str() );
XmComboBoxAddItem((Widget) m_mainWidget, str(), 0, False);
- m_stringList.Add(item);
m_noStrings ++;
+ AdjustDropDownListSize();
return GetCount() - 1;
}
XmComboBoxDeletePos((Widget) m_mainWidget, n+1);
#endif
- wxStringList::Node *node = m_stringList.Item(n);
- if (node)
- {
- delete[] node->GetData();
- delete node;
- }
m_clientDataDict.Delete(n, HasClientObjectData());
m_noStrings--;
+
+ AdjustDropDownListSize();
}
void wxComboBox::Clear()
{
XmComboBoxDeletePos((Widget) m_mainWidget, m_noStrings--);
}
- #endif
-
- m_stringList.Clear();
+#endif
if ( HasClientObjectData() )
m_clientDataDict.DestroyData();
m_noStrings = 0;
+ AdjustDropDownListSize();
}
void wxComboBox::SetSelection (int n)
wxString wxComboBox::GetString(int n) const
{
- wxStringList::Node *node = m_stringList.Item(n);
- if (node)
- return wxString(node->GetData ());
- else
- return wxEmptyString;
+ return wxDoGetStringInList( GetXmList(this), n );
}
int wxComboBox::FindString(const wxString& s) const
// Clipboard operations
void wxComboBox::Copy()
{
-// XmComboBoxCopy((Widget) m_mainWidget, CurrentTime);
+ XmTextCopy( GetXmText(this), CurrentTime );
}
void wxComboBox::Cut()
{
-// XmComboBoxCut((Widget) m_mainWidget, CurrentTime);
+ XmTextCut( GetXmText(this), CurrentTime );
}
void wxComboBox::Paste()
{
-// XmComboBoxPaste((Widget) m_mainWidget);
+ XmTextPaste( GetXmText(this) );
}
void wxComboBox::SetEditable(bool WXUNUSED(editable))
void wxComboBox::SetInsertionPoint(long pos)
{
-// XmComboBoxSetInsertionPosition ((Widget) m_mainWidget, (XmTextPosition) pos);
+ XmTextSetInsertionPosition( GetXmText(this), (XmTextPosition)pos );
}
void wxComboBox::SetInsertionPointEnd()
{
-// XmTextPosition pos = XmComboBoxGetLastPosition ((Widget) m_mainWidget);
-// XmComboBoxSetInsertionPosition ((Widget) m_mainWidget, (XmTextPosition) (pos + 1));
+ SetInsertionPoint( GetLastPosition() );
}
long wxComboBox::GetInsertionPoint() const
{
-// return (long) XmComboBoxGetInsertionPosition ((Widget) m_mainWidget);
- return -1;
+ return (long)XmTextGetInsertionPosition( GetXmText(this) );
}
long wxComboBox::GetLastPosition() const
{
-// return (long) XmComboBoxGetLastPosition ((Widget) m_mainWidget);
- return -1;
+ XmTextPosition pos = XmTextGetLastPosition( GetXmText(this) );
+ return (long)pos;
}
void wxComboBox::Replace(long from, long to, const wxString& value)
-{/*
- XmComboBoxReplace ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to,
- (char*) (const char*) value);
-*/
+{
+ XmTextReplace( GetXmText(this), (XmTextPosition)from, (XmTextPosition)to,
+ (char*)value.c_str() );
}
void wxComboBox::Remove(long from, long to)
{
-/*
- XmComboBoxSetSelection ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to,
- (Time) 0);
- XmComboBoxRemove ((Widget) m_mainWidget);
- */
+ SetSelection( from, to );
+ XmTextRemove( GetXmText(this) );
}
void wxComboBox::SetSelection(long from, long to)
{
-/*
- XmComboBoxSetSelection ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to,
- (Time) 0);
- */
+ if( to == -1 )
+ to = GetLastPosition();
+
+ XmTextSetSelection( GetXmText(this), (XmTextPosition)from,
+ (XmTextPosition)to, (Time)0 );
}
void wxComboBoxCallback (Widget WXUNUSED(w), XtPointer clientData,
void wxComboBox::ChangeFont(bool keepOriginalSize)
{
+ if( m_font.Ok() )
+ {
+ wxDoChangeFont( GetXmText(this), m_font );
+ wxDoChangeFont( GetXmList(this), m_font );
+ }
+
// Don't use the base class wxChoice's ChangeFont
wxWindow::ChangeFont(keepOriginalSize);
}
wxSize wxComboBox::DoGetBestSize() const
{
- return wxWindow::DoGetBestSize();
+ if( (GetWindowStyle() & wxCB_DROPDOWN) == wxCB_DROPDOWN ||
+ (GetWindowStyle() & wxCB_READONLY) == wxCB_READONLY )
+ {
+ Dimension arrowW, arrowS, highlight, xmargin, ymargin, shadow;
+
+ XtVaGetValues( (Widget)m_mainWidget,
+ XmNarrowSize, &arrowW,
+ XmNarrowSpacing, &arrowS,
+ XmNhighlightThickness, &highlight,
+ XmNmarginWidth, &xmargin,
+ XmNmarginHeight, &ymargin,
+ XmNshadowThickness, &shadow,
+ NULL );
+
+ wxSize listSize = wxDoGetListBoxBestSize( GetXmList(this), this );
+ wxSize textSize = wxDoGetSingleTextCtrlBestSize( GetXmText(this),
+ this );
+
+ // FIXME arbitrary constants
+ return wxSize( listSize.x + arrowW + arrowS + 2 * highlight
+ + 2 * shadow + 2 * xmargin ,
+ textSize.y + 2 * highlight + 2 * ymargin + 2 * shadow );
+ }
+ else
+ return wxWindow::DoGetBestSize();
}
#endif // XmVersion >= 2000