From 9b1bd0c6e7ed45535fabc574f69b7670fc28191e Mon Sep 17 00:00:00 2001 From: Mattia Barbon Date: Tue, 4 Feb 2003 21:09:03 +0000 Subject: [PATCH] Applied patch [ 679397 ] remove GPL code from motif build from Ian Brown, with some modifications; this patch replaces the (GPL) Motif ComboBox with an implementation based on the native (for Motif 2.0) ComboBox. The old ComboBox is still used as a fallback for older Motif versions. My modifications include some method's implementation and some workarounds for LessTif. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19114 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- distrib/msw/tmake/filelist.txt | 1 + include/wx/motif/combobox.h | 3 +- include/wx/motif/private.h | 8 + src/motif/combobox.cpp | 19 +- src/motif/combobox_native.cpp | 379 +++++++++++++++++++++++++++++++++ src/motif/files.lst | 2 + src/motif/listbox.cpp | 17 +- src/motif/xmcombo/xmcombo.c | 5 + 8 files changed, 426 insertions(+), 8 deletions(-) create mode 100644 src/motif/combobox_native.cpp diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index bab1a3ae7e..adfc390ae1 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -575,6 +575,7 @@ choice.cpp Motif clipbrd.cpp Motif colour.cpp Motif combobox.cpp Motif +combobox_native.cpp Motif control.cpp Motif cursor.cpp Motif data.cpp Motif diff --git a/include/wx/motif/combobox.h b/include/wx/motif/combobox.h index 059c12c36a..ebf2238539 100644 --- a/include/wx/motif/combobox.h +++ b/include/wx/motif/combobox.h @@ -60,7 +60,8 @@ public: virtual void SetSelection(int n); virtual int FindString(const wxString& s) const; virtual wxString GetString(int n) const ; - + virtual void SetString(int n, const wxString& s); + // Text field functions virtual wxString GetValue() const ; virtual void SetValue(const wxString& value); diff --git a/include/wx/motif/private.h b/include/wx/motif/private.h index 5d1f132aad..8f21c4e12c 100644 --- a/include/wx/motif/private.h +++ b/include/wx/motif/private.h @@ -107,6 +107,14 @@ private: XmString m_string; }; +// ---------------------------------------------------------------------------- +// Routines used in both wxTextCtrl/wxListBox and nativa wxComboBox +// (defined in src/motif/listbox.cpp or src/motif/textctrl.cpp +// ---------------------------------------------------------------------------- + +int wxDoFindStringInList( Widget listWidget, const wxString& str ); +int wxDoGetSelectionInList(Widget listWidget); + // ---------------------------------------------------------------------------- // executes one main loop iteration (implemented in src/motif/evtloop.cpp) // ---------------------------------------------------------------------------- diff --git a/src/motif/combobox.cpp b/src/motif/combobox.cpp index 36e322073f..5e81729e67 100644 --- a/src/motif/combobox.cpp +++ b/src/motif/combobox.cpp @@ -13,10 +13,12 @@ #pragma implementation "combobox.h" #endif -#include "wx/combobox.h" +#include "wx/setup.h" #if wxUSE_COMBOBOX +#include "wx/combobox.h" + #ifdef __VMS__ #pragma message disable nosimpint #endif @@ -24,6 +26,10 @@ #ifdef __VMS__ #pragma message enable nosimpint #endif + +// use the old, GPL'd combobox +#if (XmVersion < 2000) + #include "xmcombo/xmcombo.h" #include "wx/motif/private.h" @@ -124,6 +130,11 @@ void wxComboBox::SetValue(const wxString& value) m_inSetValue = FALSE; } +void wxComboBox::SetString(int n, const wxString& s) +{ + wxFAIL_MSG( wxT("wxComboBox::SetString only implemented for Motif 2.0") ); +} + int wxComboBox::DoAppend(const wxString& item) { wxXmString str( item.c_str() ); @@ -269,7 +280,8 @@ void wxComboBoxCallback (Widget WXUNUSED(w), XtPointer clientData, case XmCR_SINGLE_SELECT: case XmCR_BROWSE_SELECT: { - wxCommandEvent event (wxEVT_COMMAND_COMBOBOX_SELECTED, item->GetId()); + wxCommandEvent event (wxEVT_COMMAND_COMBOBOX_SELECTED, + item->GetId()); event.m_commandInt = cbs->index - 1; event.m_commandString = item->GetString (event.m_commandInt); if ( item->HasClientObjectData() ) @@ -326,5 +338,6 @@ wxSize wxComboBox::DoGetBestSize() const return wxWindow::DoGetBestSize(); } -#endif +#endif // XmVersion < 2000 +#endif // wxUSE_COMBOBOX diff --git a/src/motif/combobox_native.cpp b/src/motif/combobox_native.cpp new file mode 100644 index 0000000000..499e84cadd --- /dev/null +++ b/src/motif/combobox_native.cpp @@ -0,0 +1,379 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: combobox_native.cpp +// Purpose: wxComboBox class +// Author: Julian Smart, Ian Brown +// Modified by: +// Created: 01/02/03 +// RCS-ID: $Id$ +// Copyright: (c) Julian Smart +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#include "wx/setup.h" + +#if wxUSE_COMBOBOX + +#include "wx/combobox.h" + +#ifdef __VMS__ +#pragma message disable nosimpint +#endif +#include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif + +// use the new, shiny combobox for Motif 2.x +#if (XmVersion >= 2000) + +#include +#include +#include + +#include "wx/motif/private.h" + +// utility +static Widget GetXmList( const wxComboBox* cb ) +{ + Widget ret; + XtVaGetValues( (Widget)cb->GetMainWidget(), + XmNlist, &ret, + NULL ); + + return ret; +} + +static Widget GetXmText( const wxComboBox* cb ) +{ + Widget ret; + XtVaGetValues( (Widget)cb->GetMainWidget(), + XmNtextField, &ret, + NULL ); + + return ret; +} + +void wxComboBoxCallback (Widget w, XtPointer clientData, + XmComboBoxCallbackStruct * cbs); + +IMPLEMENT_DYNAMIC_CLASS(wxComboBox, wxControl) + +bool wxComboBox::Create(wxWindow *parent, wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name) +{ + if( !CreateControl( parent, id, pos, size, style, validator, name ) ) + return false; + + Widget parentWidget = (Widget) parent->GetClientWidget(); + + int cb_type = ( style & wxCB_SIMPLE ) ? XmCOMBO_BOX : + ( style & wxCB_READONLY ) ? XmDROP_DOWN_LIST : + ( style & wxCB_DROPDOWN ) ? XmDROP_DOWN_COMBO_BOX : + // default to wxCB_DROPDOWN + XmDROP_DOWN_COMBO_BOX; + + Widget buttonWidget= XtVaCreateManagedWidget(name.c_str(), + xmComboBoxWidgetClass, parentWidget, + XmNcomboBoxType, cb_type, + NULL); + + m_mainWidget = (Widget) buttonWidget; + + int i; + for ( i = 0; i < n; ++i) + Append( choices[i] ); + + XtManageChild (buttonWidget); + + SetValue(value); + + ChangeFont(false); + + XtAddCallback (buttonWidget, XmNselectionCallback, + (XtCallbackProc) wxComboBoxCallback, + (XtPointer) this); + XtAddCallback (GetXmText(this), XmNvalueChangedCallback, + (XtCallbackProc) wxComboBoxCallback, + (XtPointer) this); + + SetCanAddEventHandler(true); + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, + pos.x, pos.y, size.x, size.y); + + XtVaSetValues (GetXmList(this), + XmNvisibleItemCount, 10, + NULL); + + ChangeBackgroundColour(); + + return true; +} + +wxComboBox::~wxComboBox() +{ + DetachWidget((Widget) m_mainWidget); // Removes event handlers + XtDestroyWidget((Widget) m_mainWidget); + m_mainWidget = (WXWidget) 0; + if ( HasClientObjectData() ) + m_clientDataDict.DestroyData(); +} + +void wxComboBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) +{ + // Necessary so it doesn't call wxChoice::SetSize + wxWindow::DoSetSize(x, y, width, DoGetBestSize().y, sizeFlags); +} + +wxString wxComboBox::GetValue() const +{ + char* s = XmTextGetString (GetXmText (this)); + wxString str(s); + if (s) + XtFree (s); + return str; +} + +void wxComboBox::SetString(int n, const wxString& s) +{ + wxXmString text(s); + Widget listBox = GetXmList(this); + + // delete the item and add it again. + // FIXME isn't there a way to change it in place? + XmListDeletePos (listBox, n+1); + XmListAddItem (listBox, text(), n+1); +} + +void wxComboBox::SetValue(const wxString& value) +{ + m_inSetValue = true; + + XtVaSetValues( GetXmText(this), + XmNvalue, (char *)value.c_str(), + NULL); + + m_inSetValue = false; +} + +int wxComboBox::DoAppend(const wxString& item) +{ + wxXmString str( item.c_str() ); + XmComboBoxAddItem((Widget) m_mainWidget, str(), 0, False); + m_stringList.Add(item); + m_noStrings ++; + + return GetCount() - 1; +} + +void wxComboBox::Delete(int n) +{ +#ifdef LESSTIF_VERSION + XmListDeletePos (GetXmList(this), n + 1); +#else + 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--; +} + +void wxComboBox::Clear() +{ +#ifdef LESSTIF_VERSION + XmListDeleteAllItems (GetXmList(this)); +#else + while(m_noStrings > 0) + { + XmComboBoxDeletePos((Widget) m_mainWidget, m_noStrings--); + } + #endif + + m_stringList.Clear(); + + if ( HasClientObjectData() ) + m_clientDataDict.DestroyData(); + m_noStrings = 0; +} + +void wxComboBox::SetSelection (int n) +{ +#ifdef LESSTIF_VERSION + XmListSelectPos (GetXmList(this), n + 1, false); + SetValue(GetString(n)); +#else + wxXmString str( GetString(n).c_str() ); + XmComboBoxSelectItem((Widget) m_mainWidget, str()); +#if 0 + // does it work for Motif + XtVaSetValues( (Widget)m_mainWidget, + XmNselectedPosition, n + 1, + NULL ); +#endif +#endif +} + +int wxComboBox::GetSelection (void) const +{ + return wxDoGetSelectionInList( GetXmList( this ) ); +} + +wxString wxComboBox::GetString(int n) const +{ + wxStringList::Node *node = m_stringList.Item(n); + if (node) + return wxString(node->GetData ()); + else + return wxEmptyString; +} + +int wxComboBox::FindString(const wxString& s) const +{ + return wxDoFindStringInList( GetXmList( this ), s ); +} + +// Clipboard operations +void wxComboBox::Copy() +{ +// XmComboBoxCopy((Widget) m_mainWidget, CurrentTime); +} + +void wxComboBox::Cut() +{ +// XmComboBoxCut((Widget) m_mainWidget, CurrentTime); +} + +void wxComboBox::Paste() +{ +// XmComboBoxPaste((Widget) m_mainWidget); +} + +void wxComboBox::SetEditable(bool WXUNUSED(editable)) +{ + // TODO +} + +void wxComboBox::SetInsertionPoint(long pos) +{ +// XmComboBoxSetInsertionPosition ((Widget) m_mainWidget, (XmTextPosition) pos); +} + +void wxComboBox::SetInsertionPointEnd() +{ +// XmTextPosition pos = XmComboBoxGetLastPosition ((Widget) m_mainWidget); +// XmComboBoxSetInsertionPosition ((Widget) m_mainWidget, (XmTextPosition) (pos + 1)); +} + +long wxComboBox::GetInsertionPoint() const +{ +// return (long) XmComboBoxGetInsertionPosition ((Widget) m_mainWidget); + return -1; +} + +long wxComboBox::GetLastPosition() const +{ +// return (long) XmComboBoxGetLastPosition ((Widget) m_mainWidget); + return -1; +} + +void wxComboBox::Replace(long from, long to, const wxString& value) +{/* + XmComboBoxReplace ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to, + (char*) (const char*) value); +*/ +} + +void wxComboBox::Remove(long from, long to) +{ +/* + XmComboBoxSetSelection ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to, + (Time) 0); + XmComboBoxRemove ((Widget) m_mainWidget); + */ +} + +void wxComboBox::SetSelection(long from, long to) +{ +/* + XmComboBoxSetSelection ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to, + (Time) 0); + */ +} + +void wxComboBoxCallback (Widget WXUNUSED(w), XtPointer clientData, + XmComboBoxCallbackStruct * cbs) +{ + wxComboBox *item = (wxComboBox *) clientData; + + switch (cbs->reason) + { + case XmCR_SELECT: +#if 0 + case XmCR_SINGLE_SELECT: + case XmCR_BROWSE_SELECT: +#endif + { + wxCommandEvent event (wxEVT_COMMAND_COMBOBOX_SELECTED, + item->GetId()); + int idx = cbs->item_position - 1; + event.m_commandInt = idx; + event.m_commandString = item->GetString (idx); + if ( item->HasClientObjectData() ) + event.SetClientObject( item->GetClientObject(idx) ); + else if ( item->HasClientUntypedData() ) + event.SetClientData( item->GetClientData(idx) ); + event.m_extraLong = true; + event.SetEventObject(item); + item->ProcessCommand (event); + break; + } + case XmCR_VALUE_CHANGED: + { + wxCommandEvent event (wxEVT_COMMAND_TEXT_UPDATED, item->GetId()); + event.m_commandInt = -1; + event.m_commandString = item->GetValue(); + event.m_extraLong = true; + event.SetEventObject(item); + item->ProcessCommand (event); + break; + } + default: + break; + } +} + +void wxComboBox::ChangeFont(bool keepOriginalSize) +{ + // Don't use the base class wxChoice's ChangeFont + wxWindow::ChangeFont(keepOriginalSize); +} + +void wxComboBox::ChangeBackgroundColour() +{ + wxWindow::ChangeBackgroundColour(); +} + +void wxComboBox::ChangeForegroundColour() +{ + wxWindow::ChangeForegroundColour(); +} + +wxSize wxComboBox::DoGetBestSize() const +{ + return wxWindow::DoGetBestSize(); +} + +#endif // XmVersion >= 2000 + +#endif // wxUSE_COMBOBOX diff --git a/src/motif/files.lst b/src/motif/files.lst index 98b08d38af..1714782348 100644 --- a/src/motif/files.lst +++ b/src/motif/files.lst @@ -190,6 +190,7 @@ ALL_SOURCES = \ motif/clipbrd.cpp \ motif/colour.cpp \ motif/combobox.cpp \ + motif/combobox_native.cpp \ motif/control.cpp \ motif/cursor.cpp \ motif/data.cpp \ @@ -826,6 +827,7 @@ GUIOBJS = \ clipbrd.o \ colour.o \ combobox.o \ + combobox_native.o \ control.o \ cursor.o \ data.o \ diff --git a/src/motif/listbox.cpp b/src/motif/listbox.cpp index 1b2a48a223..6beec8c9e7 100644 --- a/src/motif/listbox.cpp +++ b/src/motif/listbox.cpp @@ -272,12 +272,12 @@ void wxListBox::DoSetItems(const wxArrayString& items, void** clientData) m_noItems = items.GetCount(); } -int wxListBox::FindString(const wxString& s) const +int wxDoFindStringInList(Widget w, const wxString& s) { wxXmString str( s ); int *positions = NULL; int no_positions = 0; - bool success = XmListGetMatchPos ((Widget) m_mainWidget, str(), + bool success = XmListGetMatchPos (w, str(), &positions, &no_positions); if (success) @@ -291,6 +291,11 @@ int wxListBox::FindString(const wxString& s) const return -1; } +int wxListBox::FindString(const wxString& s) const +{ + return wxDoFindStringInList( (Widget)m_mainWidget, s ); +} + void wxListBox::Clear() { if (m_noItems <= 0) @@ -415,9 +420,8 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const } // Get single selection, for single choice list items -int wxListBox::GetSelection() const +int wxDoGetSelectionInList(Widget listBox) { - Widget listBox = (Widget) m_mainWidget; int *posList = NULL; int posCnt = 0; bool flag = XmListGetSelectedPos (listBox, &posList, &posCnt); @@ -433,6 +437,11 @@ int wxListBox::GetSelection() const return -1; } +int wxListBox::GetSelection() const +{ + return wxDoGetSelectionInList((Widget) m_mainWidget); +} + // Find string for position wxString wxListBox::GetString(int N) const { diff --git a/src/motif/xmcombo/xmcombo.c b/src/motif/xmcombo/xmcombo.c index 6519996ac5..32f5686026 100644 --- a/src/motif/xmcombo/xmcombo.c +++ b/src/motif/xmcombo/xmcombo.c @@ -112,6 +112,9 @@ #include #include #include + +#if (XmVersion < 2000) + #include #include /* define toupper */ #include "combop.h" @@ -3556,3 +3559,5 @@ Widget XmCreateComboBox(Widget parent, String name, ArgList arglist, } /* XmCreateComboBox */ /* Ende von ComboBox.c */ + +#endif /* XmVersion < 2000 */ -- 2.45.2