diff --git a/include/wx/os2/choice.h b/include/wx/os2/choice.h index 4778dc2636..f124982646 100644 --- a/include/wx/os2/choice.h +++ b/include/wx/os2/choice.h @@ -19,48 +19,51 @@ class WXDLLEXPORT wxChoice: public wxChoiceBase { DECLARE_DYNAMIC_CLASS(wxChoice) - public: - inline wxChoice() { } +public: + // ctors + inline wxChoice() { } - inline wxChoice(wxWindow *parent, wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - int n = 0, const wxString choices[] = NULL, - long style = 0, - const wxValidator& validator = wxDefaultValidator, - const wxString& name = wxChoiceNameStr) - { - Create(parent, id, pos, size, n, choices, style, validator, name); - } + inline wxChoice(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr) + { + Create(parent, id, pos, size, n, choices, style, validator, name); + } - bool Create(wxWindow *parent, wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - int n = 0, const wxString choices[] = NULL, - long style = 0, - const wxValidator& validator = wxDefaultValidator, - const wxString& name = wxChoiceNameStr); + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxChoiceNameStr); - virtual int DoAppend(const wxString& item); - virtual void Delete(int n); - virtual void Clear(); + // Implement base class virtuals + virtual int DoAppend(const wxString& item); + virtual void Delete(int n); + virtual void Clear(); - virtual int GetCount() const; - virtual int GetSelection() const ; - virtual void SetSelection(int n); + virtual int GetCount() const; + virtual int GetSelection() const ; + virtual void SetSelection(int n); - virtual int FindString(const wxString& s) const; - virtual wxString GetString(int n) const ; + virtual int FindString(const wxString& s) const; + virtual wxString GetString(int n) const ; + virtual void SetString(int n, const wxString& s); - // OS2 only - virtual bool OS2Command(WXUINT param, WXWORD id); - MRESULT OS2WindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); + // OS2 only + virtual bool OS2Command(WXUINT param, WXWORD id); + MRESULT OS2WindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); protected: - virtual void DoSetClientData( int n, void* clientData ); - virtual void* DoGetClientData( int n ) const; - virtual void DoSetClientObject( int n, wxClientData* clientData ); - virtual wxClientData* DoGetClientObject( int n ) const; + virtual void DoSetItemClientData( int n, void* clientData ); + virtual void* DoGetItemClientData( int n ) const; + virtual void DoSetItemClientObject( int n, wxClientData* clientData ); + virtual wxClientData* DoGetItemClientObject( int n ) const; // OS2 implementation virtual wxSize DoGetBestSize(); @@ -69,6 +72,7 @@ protected: int sizeFlags = wxSIZE_AUTO); private: // Virtual function hiding supression +/* inline virtual void DoSetClientData( void *data ) { wxWindowBase::DoSetClientData(data); } inline virtual void DoSetClientObject( wxClientData *data ) @@ -77,6 +81,7 @@ private: { return(wxWindowBase::DoGetClientObject());} inline virtual void *DoGetClientData() const { return(wxWindowBase::DoGetClientData());} +*/ }; #endif // _WX_CHOICE_H_ diff --git a/include/wx/os2/dataform.h b/include/wx/os2/dataform.h index 23b4b51ee6..d052bf4e0c 100644 --- a/include/wx/os2/dataform.h +++ b/include/wx/os2/dataform.h @@ -19,32 +19,32 @@ public: typedef unsigned short NativeFormat; wxDataFormat(); - wxDataFormat( wxDataFormatId type ); - wxDataFormat( const wxString &id ); - wxDataFormat( const wxChar *id ); - wxDataFormat( NativeFormat format ); + wxDataFormat(wxDataFormatId vType); + wxDataFormat(const wxString& rId); + wxDataFormat(const wxChar* pId); + wxDataFormat(NativeFormat vFormat); - wxDataFormat& operator=(NativeFormat format) - { SetId(format); return *this; } + wxDataFormat& operator=(NativeFormat vFormat) + { SetId(vFormat); return *this; } // comparison (must have both versions) - bool operator==(NativeFormat format) const - { return m_format == (NativeFormat)format; } - bool operator!=(NativeFormat format) const - { return m_format != (NativeFormat)format; } + bool operator==(NativeFormat vFormat) const + { return m_vFormat == (NativeFormat)vFormat; } + bool operator!=(NativeFormat vFormat) const + { return m_vFormat != (NativeFormat)vFormat; } // explicit and implicit conversions to NativeFormat which is one of // standard data types (implicit conversion is useful for preserving the // compatibility with old code) - NativeFormat GetFormatId() const { return m_format; } - operator NativeFormat() const { return m_format; } + NativeFormat GetFormatId() const { return m_vFormat; } + operator NativeFormat() const { return m_vFormat; } - void SetId( NativeFormat format ); + void SetId(NativeFormat vFormat); // string ids are used for custom types - this SetId() must be used for // application-specific formats wxString GetId() const; - void SetId( const wxChar *id ); + void SetId(const wxChar* pId); // implementation wxDataFormatId GetType() const; @@ -54,7 +54,7 @@ private: NativeFormat m_vFormat; void PrepareFormats(); - void SetType( wxDataFormatId type ); + void SetType(wxDataFormatId vType); }; #endif // _WX_GTK_DATAFORM_H diff --git a/include/wx/os2/listbox.h b/include/wx/os2/listbox.h index 5dc6a7a63a..81149bf414 100644 --- a/include/wx/os2/listbox.h +++ b/include/wx/os2/listbox.h @@ -12,9 +12,9 @@ #ifndef _WX_LISTBOX_H_ #define _WX_LISTBOX_H_ -#include "wx/control.h" - -WXDLLEXPORT_DATA(extern const char*) wxListBoxNameStr; +// ---------------------------------------------------------------------------- +// simple types +// ---------------------------------------------------------------------------- #if wxUSE_OWNER_DRAWN class WXDLLEXPORT wxOwnerDrawn; @@ -22,44 +22,68 @@ WXDLLEXPORT_DATA(extern const char*) wxListBoxNameStr; // define the array of list box items #include - WX_DEFINE_ARRAY(wxOwnerDrawn *, wxListBoxItemsArray); -#endif + WX_DEFINE_EXPORTED_ARRAY(wxOwnerDrawn *, wxListBoxItemsArray); +#endif // wxUSE_OWNER_DRAWN // forward decl for GetSelections() -class WXDLLEXPORT wxArrayInt; +class wxArrayInt; -WXDLLEXPORT_DATA(extern const char*) wxEmptyString; +// ---------------------------------------------------------------------------- +// List box control +// ---------------------------------------------------------------------------- -// List box item -class WXDLLEXPORT wxListBox: public wxControl +class WXDLLEXPORT wxListBox : public wxListBoxBase { - DECLARE_DYNAMIC_CLASS(wxListBox) - public: +public: + // ctors and such + wxListBox(); + wxListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr) + { + Create(parent, id, pos, size, n, choices, style, validator, name); + } - wxListBox(); - inline wxListBox(wxWindow *parent, wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - int n = 0, const wxString choices[] = NULL, - long style = 0, - const wxValidator& validator = wxDefaultValidator, - const wxString& name = wxListBoxNameStr) - { - Create(parent, id, pos, size, n, choices, style, validator, name); - } + bool Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxListBoxNameStr); - bool Create(wxWindow *parent, wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - int n = 0, const wxString choices[] = NULL, - long style = 0, - const wxValidator& validator = wxDefaultValidator, - const wxString& name = wxListBoxNameStr); + virtual ~wxListBox(); - ~wxListBox(); + // implement base class pure virtuals + virtual void Clear(); + virtual void Delete(int n); - bool OS2Command(WXUINT param, WXWORD id); + virtual int GetCount() const; + virtual wxString GetString(int n) const; + virtual void SetString(int n, const wxString& s); + virtual int FindString(const wxString& s) const; + virtual bool IsSelected(int n) const; + virtual void SetSelection(int n, bool select = TRUE); + virtual int GetSelection() const; + virtual int GetSelections(wxArrayInt& aSelections) const; + + virtual int DoAppend(const wxString& item); + virtual void DoInsertItems(const wxArrayString& items, int pos); + virtual void DoSetItems(const wxArrayString& items, void **clientData); + + virtual void DoSetFirstItem(int n); + + virtual void DoSetItemClientData(int n, void* clientData); + virtual void* DoGetItemClientData(int n) const; + virtual void DoSetItemClientObject(int n, wxClientData* clientData); + virtual wxClientData* DoGetItemClientObject(int n) const; + + // wxCheckListBox support #if wxUSE_OWNER_DRAWN bool OS2OnMeasure(WXMEASUREITEMSTRUCT *item); bool OS2OnDraw(WXDRAWITEMSTRUCT *item); @@ -74,68 +98,44 @@ class WXDLLEXPORT wxListBox: public wxControl int GetItemIndex(wxOwnerDrawn *item) const { return m_aItems.Index(item); } #endif // wxUSE_OWNER_DRAWN - virtual void Append(const wxString& item); - virtual void Append(const wxString& item, void *clientData); - virtual void Set(int n, const wxString* choices, char **clientData = NULL); - virtual int FindString(const wxString& s) const ; - virtual void Clear(); - virtual void SetSelection(int n, bool select = TRUE); - - virtual void Deselect(int n); - - // For single choice list item only - virtual int GetSelection() const ; - virtual void Delete(int n); - virtual void *GetClientData(int n) const ; - virtual void SetClientData(int n, void *clientData); - virtual void SetString(int n, const wxString& s); - - // For single or multiple choice list item - virtual int GetSelections(wxArrayInt& aSelections) const; - virtual bool Selected(int n) const ; - virtual wxString GetString(int n) const ; - - // Set the specified item at the first visible item - // or scroll to max range. - virtual void SetFirstItem(int n) ; - virtual void SetFirstItem(const wxString& s) ; - - virtual void InsertItems(int nItems, const wxString items[], int pos); - - virtual wxString GetStringSelection() const ; - virtual bool SetStringSelection(const wxString& s, bool flag = TRUE); - virtual int Number() const ; - - void Command(wxCommandEvent& event); - - // OS/2-PM-specific code to set the horizontal extent of - // the listbox, if necessary. If s is non-NULL, it's - // used to calculate the horizontal extent. - // Otherwise, all strings are used. + // Windows-specific code to set the horizontal extent of the listbox, if + // necessary. If s is non-NULL, it's used to calculate the horizontal + // extent. Otherwise, all strings are used. virtual void SetHorizontalExtent(const wxString& s = wxEmptyString); + // Windows callbacks virtual WXHBRUSH OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, - WXUINT message, WXWPARAM wParam, WXLPARAM lParam); + WXUINT message, + WXWPARAM wParam, WXLPARAM lParam); + + bool OS2Command(WXUINT param, WXWORD id); - virtual MRESULT OS2WindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); virtual void SetupColours(); protected: - int m_noItems; - int m_selected; + // do we have multiple selections? + bool HasMultipleSelection() const; - virtual wxSize DoGetBestSize(); + int m_noItems; + int m_selected; + + virtual wxSize DoGetBestSize(); #if wxUSE_OWNER_DRAWN // control items wxListBoxItemsArray m_aItems; #endif + private: - //Virtual function hiding suppression, do not use - virtual wxControl *CreateItem(const wxItemResource* childResource, - const wxItemResource* parentResource, - const wxResourceTable *table = (const wxResourceTable *) NULL) - { return(wxWindowBase::CreateItem(childResource, parentResource, table));}; +#if wxUSE_WX_RESOURCES +# if wxUSE_OWNER_DRAWN + virtual wxControl *CreateItem(const wxItemResource* childResource, + const wxItemResource* parentResource, + const wxResourceTable *table = (const wxResourceTable *) NULL) + { return(wxWindowBase::CreateItem(childResource, parentResource, table)); } +# endif +#endif + DECLARE_DYNAMIC_CLASS(wxListBox) }; #endif diff --git a/src/os2/choice.cpp b/src/os2/choice.cpp index dfe1fe24af..7448ef7e50 100644 --- a/src/os2/choice.cpp +++ b/src/os2/choice.cpp @@ -128,6 +128,16 @@ int wxChoice::FindString(const wxString& s) const return 0; } +void wxChoice::SetString(int n, const wxString& s) +{ + wxFAIL_MSG(wxT("not implemented")); + +#if 0 // should do this, but no Insert() so far + Delete(n); + Insert(n + 1, s); +#endif +} + wxString wxChoice::GetString(int n) const { size_t len = 0; // TODO: (size_t)::SendMessage(GetHwnd(), CB_GETLBTEXTLEN, n, 0); @@ -149,7 +159,7 @@ wxString wxChoice::GetString(int n) const // client data // ---------------------------------------------------------------------------- -void wxChoice::DoSetClientData( int n, void* clientData ) +void wxChoice::DoSetItemClientData( int n, void* clientData ) { // TODO: /* @@ -160,7 +170,7 @@ void wxChoice::DoSetClientData( int n, void* clientData ) */ } -void* wxChoice::DoGetClientData( int n ) const +void* wxChoice::DoGetItemClientData( int n ) const { // TODO: /* @@ -178,12 +188,12 @@ void* wxChoice::DoGetClientData( int n ) const return NULL; } -void wxChoice::DoSetClientObject( int n, wxClientData* clientData ) +void wxChoice::DoSetItemClientObject( int n, wxClientData* clientData ) { DoSetClientData(n, clientData); } -wxClientData* wxChoice::DoGetClientObject( int n ) const +wxClientData* wxChoice::DoGetItemClientObject( int n ) const { // TODO: return (wxClientData *)DoGetClientData(n); return NULL; diff --git a/src/os2/listbox.cpp b/src/os2/listbox.cpp index a3df98c3cf..a6909e537f 100644 --- a/src/os2/listbox.cpp +++ b/src/os2/listbox.cpp @@ -67,52 +67,15 @@ wxOwnerDrawn *wxListBox::CreateItem(size_t n) // list box control implementation // ============================================================================ -bool wxListBox::OS2Command(WXUINT param, WXWORD WXUNUSED(id)) -{ -/* - if (param == LBN_SELCHANGE) - { - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId); - wxArrayInt aSelections; - int count = GetSelections(aSelections); - if ( count > 0 ) - { - event.m_commandInt = aSelections[0] ; - event.m_clientData = GetClientData(event.m_commandInt); - wxString str(GetString(event.m_commandInt)); - if (str != wxT("")) - { - event.m_commandString = str; - } - } - else - { - event.m_commandInt = -1 ; - event.m_commandString.Empty(); - } - - event.SetEventObject( this ); - ProcessCommand(event); - return TRUE; - } - else if (param == LBN_DBLCLK) - { - wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent(event) ; - return TRUE; - } -*/ - return FALSE; -} // Listbox item wxListBox::wxListBox() { - m_noItems = 0; - m_selected = 0; + m_noItems = 0; + m_selected = 0; } -bool wxListBox::Create(wxWindow *parent, wxWindowID id, +bool wxListBox::Create(wxWindow *parent, + wxWindowID id, const wxPoint& pos, const wxSize& size, int n, const wxString choices[], @@ -120,28 +83,29 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString& name) { - m_noItems = n; - m_hWnd = 0; - m_selected = 0; + m_noItems = 0; + m_hWnd = 0; + m_selected = 0; - SetName(name); - SetValidator(validator); + SetName(name); + SetValidator(validator); - if (parent) parent->AddChild(this); + if (parent) + parent->AddChild(this); - wxSystemSettings settings; - SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW)); - SetForegroundColour(parent->GetForegroundColour()); + wxSystemSettings settings; + SetBackgroundColour(settings.GetSystemColour(wxSYS_COLOUR_WINDOW)); + SetForegroundColour(parent->GetForegroundColour()); - m_windowId = ( id == -1 ) ? (int)NewControlId() : id; + m_windowId = ( id == -1 ) ? (int)NewControlId() : id; - int x = pos.x; - int y = pos.y; - int width = size.x; - int height = size.y; - m_windowStyle = style; + int x = pos.x; + int y = pos.y; + int width = size.x; + int height = size.y; + m_windowStyle = style; - // TODO create listbox +// TODO: /* DWORD wstyle = WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | LBS_NOTIFY | LBS_HASSTRINGS; @@ -151,7 +115,7 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, wstyle |= LBS_EXTENDEDSEL; if (m_windowStyle & wxLB_ALWAYS_SB) - wstyle |= LBS_DISABLENOSCROLL ; + wstyle |= LBS_DISABLENOSCROLL; if (m_windowStyle & wxLB_HSCROLL) wstyle |= WS_HSCROLL; if (m_windowStyle & wxLB_SORT) @@ -169,10 +133,10 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, wstyle |= LBS_NOINTEGRALHEIGHT; bool want3D; - WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D) ; + WXDWORD exStyle = Determine3DEffects(WS_EX_CLIENTEDGE, &want3D); - // Even with extended styles, need to combine with WS_BORDER - // for them to look right. + // Even with extended styles, need to combine with WS_BORDER for them to + // look right. if ( want3D || wxStyleHasBorder(m_windowStyle) ) { wstyle |= WS_BORDER; @@ -184,13 +148,7 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, (HWND)parent->GetHWND(), (HMENU)m_windowId, wxGetInstance(), NULL); -#if wxUSE_CTL3D - if (want3D) - { - Ctl3dSubclassCtl(GetHwnd()); - m_useCtl3D = TRUE; - } -#endif + wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create listbox") ); // Subclass again to catch messages SubclassWin(m_hWnd); @@ -202,15 +160,14 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, if ( (m_windowStyle & wxLB_MULTIPLE) == 0 ) SendMessage(GetHwnd(), LB_SETCURSEL, 0, 0); - +*/ SetFont(parent->GetFont()); SetSize(x, y, width, height); Show(TRUE); -*/ - return FALSE; + return TRUE; } wxListBox::~wxListBox() @@ -229,20 +186,16 @@ void wxListBox::SetupColours() SetForegroundColour(GetParent()->GetForegroundColour()); } -void wxListBox::SetFirstItem(int N) +// ---------------------------------------------------------------------------- +// implementation of wxListBoxBase methods +// ---------------------------------------------------------------------------- + +void wxListBox::DoSetFirstItem(int N) { wxCHECK_RET( N >= 0 && N < m_noItems, wxT("invalid index in wxListBox::SetFirstItem") ); - // TODO SendMessage(GetHwnd(),LB_SETTOPINDEX,(WPARAM)N,(LPARAM)0) ; -} - -void wxListBox::SetFirstItem(const wxString& s) -{ - int N = FindString(s) ; - - if ( N >= 0 ) - SetFirstItem(N) ; +// SendMessage(GetHwnd(), LB_SETTOPINDEX, (WPARAM)N, (LPARAM)0); } void wxListBox::Delete(int N) @@ -250,59 +203,68 @@ void wxListBox::Delete(int N) wxCHECK_RET( N >= 0 && N < m_noItems, wxT("invalid index in wxListBox::Delete") ); - // TODO SendMessage(GetHwnd(), LB_DELETESTRING, N, 0); - m_noItems --; +#if wxUSE_OWNER_DRAWN + delete m_aItems[N]; + m_aItems.Remove(N); +#else // !wxUSE_OWNER_DRAWN + if ( HasClientObjectData() ) + { + delete GetClientObject(N); + } +#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN + +// SendMessage(GetHwnd(), LB_DELETESTRING, N, 0); + m_noItems--; + SetHorizontalExtent(""); } -void wxListBox::Append(const wxString& item) +int wxListBox::DoAppend(const wxString& item) { - int index=0; // TODO = ListBox_AddString(GetHwnd(), item); - m_noItems ++; +// TODO: +/* + int index = ListBox_AddString(GetHwnd(), item); + m_noItems++; #if wxUSE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) { wxOwnerDrawn *pNewItem = CreateItem(index); // dummy argument pNewItem->SetName(item); m_aItems.Add(pNewItem); -// ListBox_SetItemData(GetHwnd(), index, pNewItem); + ListBox_SetItemData(GetHwnd(), index, pNewItem); } #endif SetHorizontalExtent(item); + + return index; +*/ + return 0; } -void wxListBox::Append(const wxString& item, void *Client_data) +void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) { - int index; // TODO = ListBox_AddString(GetHwnd(), item); - m_noItems ++; +// TODO: +/* + ShowWindow(GetHwnd(), SW_HIDE); -#if wxUSE_OWNER_DRAWN - if ( m_windowStyle & wxLB_OWNERDRAW ) { - // client data must be pointer to wxOwnerDrawn, otherwise we would crash - // in OnMeasure/OnDraw. - wxFAIL_MSG(wxT("Can't use client data with owner-drawn listboxes")); - } - else -#endif + ListBox_ResetContent(GetHwnd()); - // TODO ListBox_SetItemData(GetHwnd(), index, Client_data); - - SetHorizontalExtent(item); -} - -void wxListBox::Set(int n, const wxString *choices, char** clientData) -{ -// ShowWindow(GetHwnd(), SW_HIDE); -// ListBox_ResetContent(GetHwnd()); + m_noItems = choices.GetCount(); int i; - for (i = 0; i < n; i++) + for (i = 0; i < m_noItems; i++) { -// ListBox_AddString(GetHwnd(), choices[i]); -// if ( clientData ) -// ListBox_SetItemData(GetHwnd(), i, clientData[i]); + ListBox_AddString(GetHwnd(), choices[i]); + if ( clientData ) + { +#if wxUSE_OWNER_DRAWN + wxASSERT_MSG(clientData[ui] == NULL, + wxT("Can't use client data with owner-drawn listboxes")); +#else // !wxUSE_OWNER_DRAWN + ListBox_SetItemData(GetHwnd(), i, clientData[i]); +#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN + } } - m_noItems = n; #if wxUSE_OWNER_DRAWN if ( m_windowStyle & wxLB_OWNERDRAW ) { @@ -314,35 +276,36 @@ void wxListBox::Set(int n, const wxString *choices, char** clientData) m_aItems.Empty(); // then create new ones - for (ui = 0; ui < (size_t)n; ui++) { + for ( ui = 0; ui < (size_t)m_noItems; ui++ ) { wxOwnerDrawn *pNewItem = CreateItem(ui); pNewItem->SetName(choices[ui]); m_aItems.Add(pNewItem); -// ListBox_SetItemData(GetHwnd(), ui, pNewItem); - - wxASSERT_MSG(clientData[ui] == NULL, - wxT("Can't use client data with owner-drawn listboxes")); + ListBox_SetItemData(GetHwnd(), ui, pNewItem); } } -#endif +#endif // wxUSE_OWNER_DRAWN - SetHorizontalExtent(""); -// ShowWindow(GetHwnd(), SW_SHOW); + SetHorizontalExtent(); + + ShowWindow(GetHwnd(), SW_SHOW); +*/ } int wxListBox::FindString(const wxString& s) const { - int pos; // = ListBox_FindStringExact(GetHwnd(), (WPARAM)-1, s); -// if (pos == LB_ERR) -// return -1; -// else +// TODO: +/* + int pos = ListBox_FindStringExact(GetHwnd(), (WPARAM)-1, s); + if (pos == LB_ERR) + return wxNOT_FOUND; + else return pos; +*/ + return 0; } void wxListBox::Clear() { -// ListBox_ResetContent(GetHwnd()); - #if wxUSE_OWNER_DRAWN size_t uiCount = m_aItems.Count(); while ( uiCount-- != 0 ) { @@ -350,31 +313,44 @@ void wxListBox::Clear() } m_aItems.Clear(); -#endif // wxUSE_OWNER_DRAWN +#else // !wxUSE_OWNER_DRAWN + if ( HasClientObjectData() ) + { + for ( size_t n = 0; n < (size_t)m_noItems; n++ ) + { + delete GetClientObject(n); + } + } +#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN +// TODO: +/* + + ListBox_ResetContent(GetHwnd()); m_noItems = 0; -// ListBox_GetHorizontalExtent(GetHwnd()); + SetHorizontalExtent(); +*/ } void wxListBox::SetSelection(int N, bool select) { wxCHECK_RET( N >= 0 && N < m_noItems, wxT("invalid index in wxListBox::SetSelection") ); +// TODO: +/* - if ((m_windowStyle & wxLB_MULTIPLE) || (m_windowStyle & wxLB_EXTENDED)) + if ( HasMultipleSelection() ) { -// SendMessage(GetHwnd(), LB_SETSEL, select, N); + SendMessage(GetHwnd(), LB_SETSEL, select, N); } else { - int N1 = N; - if (!select) - N1 = -1; -// SendMessage(GetHwnd(), LB_SETCURSEL, N1, 0); + SendMessage(GetHwnd(), LB_SETCURSEL, select ? N : -1, 0); } +*/ } -bool wxListBox::Selected(int N) const +bool wxListBox::IsSelected(int N) const { wxCHECK_MSG( N >= 0 && N < m_noItems, FALSE, wxT("invalid index in wxListBox::Selected") ); @@ -383,33 +359,49 @@ bool wxListBox::Selected(int N) const return FALSE; } -void wxListBox::Deselect(int N) +wxClientData* wxListBox::DoGetItemClientObject(int n) const { - wxCHECK_RET( N >= 0 && N < m_noItems, - wxT("invalid index in wxListBox::Deselect") ); - - if ((m_windowStyle & wxLB_MULTIPLE) || (m_windowStyle & wxLB_EXTENDED)) - { -// SendMessage(GetHwnd(), LB_SETSEL, FALSE, N); - } + return (wxClientData *)DoGetItemClientData(n); } -void *wxListBox::GetClientData(int N) const +void *wxListBox::DoGetItemClientData(int n) const { - wxCHECK_MSG( N >= 0 && N < m_noItems, NULL, + wxCHECK_MSG( n >= 0 && n < m_noItems, NULL, wxT("invalid index in wxListBox::GetClientData") ); -// return (void *)SendMessage(GetHwnd(), LB_GETITEMDATA, N, 0); - return (char *)NULL; +// return (void *)SendMessage(GetHwnd(), LB_GETITEMDATA, n, 0); + return NULL; } -void wxListBox::SetClientData(int N, void *Client_data) +void wxListBox::DoSetItemClientObject(int n, wxClientData* clientData) { - wxCHECK_RET( N >= 0 && N < m_noItems, + DoSetItemClientData(n, clientData); +} + +void wxListBox::DoSetItemClientData(int n, void *clientData) +{ + wxCHECK_RET( n >= 0 && n < m_noItems, wxT("invalid index in wxListBox::SetClientData") ); -// if ( ListBox_SetItemData(GetHwnd(), N, Client_data) == LB_ERR ) -// wxLogDebug(wxT("LB_SETITEMDATA failed")); +#if wxUSE_OWNER_DRAWN + if ( m_windowStyle & wxLB_OWNERDRAW ) + { + // client data must be pointer to wxOwnerDrawn, otherwise we would crash + // in OnMeasure/OnDraw. + wxFAIL_MSG(wxT("Can't use client data with owner-drawn listboxes")); + } +#endif // wxUSE_OWNER_DRAWN + +// TODO: +/* + if ( ListBox_SetItemData(GetHwnd(), n, clientData) == LB_ERR ) + wxLogDebug(wxT("LB_SETITEMDATA failed")); +*/ +} + +bool wxListBox::HasMultipleSelection() const +{ + return (m_windowStyle & wxLB_MULTIPLE) || (m_windowStyle & wxLB_EXTENDED); } // Return number of selections and an array of selected integers @@ -417,14 +409,16 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const { aSelections.Empty(); - if ((m_windowStyle & wxLB_MULTIPLE) || (m_windowStyle & wxLB_EXTENDED)) +// TODO: +/* + if ( HasMultipleSelection() ) { - int no_sel; // = ListBox_GetSelCount(GetHwnd()); + int no_sel = ListBox_GetSelCount(GetHwnd()); if (no_sel != 0) { int *selections = new int[no_sel]; -// if ( ListBox_GetSelItems(GetHwnd(), no_sel, selections) == LB_ERR ) { -// wxFAIL_MSG(wxT("This listbox can't have single-selection style!")); -// } + int rc = ListBox_GetSelItems(GetHwnd(), no_sel, selections); + + wxCHECK_MSG(rc != LB_ERR, -1, wxT("ListBox_GetSelItems failed")); aSelections.Alloc(no_sel); for ( int n = 0; n < no_sel; n++ ) @@ -437,23 +431,24 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const } else // single-selection listbox { -// aSelections.Add(ListBox_GetCurSel(GetHwnd())); + aSelections.Add(ListBox_GetCurSel(GetHwnd())); return 1; } +*/ + return 0; } // Get single selection, for single choice list items int wxListBox::GetSelection() const { - wxCHECK_MSG( !(m_windowStyle & wxLB_MULTIPLE) && - !(m_windowStyle & wxLB_EXTENDED), + wxCHECK_MSG( !HasMultipleSelection(), -1, wxT("GetSelection() can't be used with multiple-selection " "listboxes, use GetSelections() instead.") ); // return ListBox_GetCurSel(GetHwnd()); - return -1; + return 0; } // Find string for position @@ -462,28 +457,103 @@ wxString wxListBox::GetString(int N) const wxCHECK_MSG( N >= 0 && N < m_noItems, "", wxT("invalid index in wxListBox::GetClientData") ); -// int len = ListBox_GetTextLen(GetHwnd(), N); +// TODO: +/* + int len = ListBox_GetTextLen(GetHwnd(), N); // +1 for terminating NUL wxString result; -// ListBox_GetText(GetHwnd(), N, result.GetWriteBuf(len + 1)); + ListBox_GetText(GetHwnd(), N, result.GetWriteBuf(len + 1)); result.UngetWriteBuf(); return result; +*/ + return((wxString)""); } -// OS/2-PM-specific code to set the horizontal extent of the listbox, if +void +wxListBox::DoInsertItems(const wxArrayString& items, int pos) +{ + wxCHECK_RET( pos >= 0 && pos <= m_noItems, + wxT("invalid index in wxListBox::InsertItems") ); + +// TODO: +/* + int nItems = items.GetCount(); + for ( int i = 0; i < nItems; i++ ) + ListBox_InsertString(GetHwnd(), i + pos, items[i]); + m_noItems += nItems; + + SetHorizontalExtent(); +*/ +} + +void wxListBox::SetString(int N, const wxString& s) +{ + wxCHECK_RET( N >= 0 && N < m_noItems, + wxT("invalid index in wxListBox::SetString") ); + + // remember the state of the item + bool wasSelected = IsSelected(N); + + void *oldData = NULL; + wxClientData *oldObjData = NULL; + if ( m_clientDataItemsType == ClientData_Void ) + oldData = GetClientData(N); + else if ( m_clientDataItemsType == ClientData_Object ) + oldObjData = GetClientObject(N); +// TODO: +/* + + // delete and recreate it + SendMessage(GetHwnd(), LB_DELETESTRING, N, 0); + + int newN = N; + if ( N == m_noItems - 1 ) + newN = -1; + + ListBox_InsertString(GetHwnd(), newN, s); + + // restore the client data + if ( oldData ) + SetClientData(N, oldData); + else if ( oldObjData ) + SetClientObject(N, oldObjData); + + // we may have lost the selection + if ( wasSelected ) + Select(N); + +#if wxUSE_OWNER_DRAWN + if ( m_windowStyle & wxLB_OWNERDRAW ) + // update item's text + m_aItems[N]->SetName(s); +#endif //USE_OWNER_DRAWN +*/ +} + +int wxListBox::GetCount() const +{ + return m_noItems; +} + +// ---------------------------------------------------------------------------- +// helpers +// ---------------------------------------------------------------------------- + +// Windows-specific code to set the horizontal extent of the listbox, if // necessary. If s is non-NULL, it's used to calculate the horizontal extent. // Otherwise, all strings are used. void wxListBox::SetHorizontalExtent(const wxString& s) { +// TODO: /* // Only necessary if we want a horizontal scrollbar if (!(m_windowStyle & wxHSCROLL)) return; TEXTMETRIC lpTextMetric; - if (s != wxT("")) + if ( !s.IsEmpty() ) { int existingExtent = (int)SendMessage(GetHwnd(), LB_GETHORIZONTALEXTENT, 0, 0L); HDC dc = GetWindowDC(GetHwnd()); @@ -502,7 +572,6 @@ void wxListBox::SetHorizontalExtent(const wxString& s) ReleaseDC(GetHwnd(), dc); if (extentX > existingExtent) SendMessage(GetHwnd(), LB_SETHORIZONTALEXTENT, LOWORD(extentX), 0L); - return; } else { @@ -532,77 +601,6 @@ void wxListBox::SetHorizontalExtent(const wxString& s) } */ } -void wxListBox::InsertItems(int nItems, const wxString items[], int pos) -{ - wxCHECK_RET( pos >= 0 && pos <= m_noItems, - wxT("invalid index in wxListBox::InsertItems") ); - - int i; -// for (i = 0; i < nItems; i++) -// ListBox_InsertString(GetHwnd(), i + pos, items[i]); - m_noItems += nItems; - - SetHorizontalExtent(wxT("")); -} - -void wxListBox::SetString(int N, const wxString& s) -{ - wxCHECK_RET( N >= 0 && N < m_noItems, - wxT("invalid index in wxListBox::SetString") ); - - int sel = -1; - if (!(m_windowStyle & wxLB_MULTIPLE) && !(m_windowStyle & wxLB_EXTENDED)) - sel = GetSelection(); - - void *oldData = wxListBox::GetClientData(N); - -// SendMessage(GetHwnd(), LB_DELETESTRING, N, 0); - - int newN = N; - if (N == (m_noItems - 1)) - newN = -1; - -// SendMessage(GetHwnd(), LB_INSERTSTRING, newN, (LPARAM) (const wxChar *)s); - if (oldData) - wxListBox::SetClientData(N, oldData); - - // Selection may have changed - if (sel >= 0) - SetSelection(sel); - -#if wxUSE_OWNER_DRAWN - if ( m_windowStyle & wxLB_OWNERDRAW ) - // update item's text - m_aItems[N]->SetName(s); -#endif //USE_OWNER_DRAWN -} - -int wxListBox::Number () const -{ - return m_noItems; -} - -// For single selection items only -wxString wxListBox::GetStringSelection () const -{ - int sel = GetSelection (); - if (sel > -1) - return this->GetString (sel); - else - return wxString(""); -} - -bool wxListBox::SetStringSelection (const wxString& s, bool flag) -{ - int sel = FindString (s); - if (sel > -1) - { - SetSelection (sel, flag); - return TRUE; - } - else - return FALSE; -} wxSize wxListBox::DoGetBestSize() { @@ -633,30 +631,61 @@ wxSize wxListBox::DoGetBestSize() return wxSize(wListbox, hListbox); } -void wxListBox::Command (wxCommandEvent & event) +// ---------------------------------------------------------------------------- +// callbacks +// ---------------------------------------------------------------------------- + +bool wxListBox::OS2Command(WXUINT param, WXWORD WXUNUSED(id)) { - if (event.m_extraLong) - SetSelection (event.m_commandInt); - else + /* + if (param == LBN_SELCANCEL) + { + event.extraLong = FALSE; + } + */ +// TODO: +/* + if (param == LBN_SELCHANGE) { - Deselect (event.m_commandInt); - return; + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId); + wxArrayInt aSelections; + int count = GetSelections(aSelections); + if ( count > 0 ) + { + event.m_commandInt = aSelections[0]; + event.m_clientData = GetClientData(event.m_commandInt); + wxString str(GetString(event.m_commandInt)); + if (str != wxT("")) + { + event.m_commandString = str; + } + } + else + { + event.m_commandInt = -1; + event.m_commandString.Empty(); + } + + event.SetEventObject( this ); + ProcessCommand(event); + return TRUE; } - ProcessCommand (event); + else if (param == LBN_DBLCLK) + { + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); + return TRUE; + } +*/ + return FALSE; } WXHBRUSH wxListBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, - WXUINT message, WXWPARAM wParam, WXLPARAM lParam) + WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { +// TODO: /* -#if wxUSE_CTL3D - if ( m_useCtl3D ) - { - HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam); - return (WXHBRUSH) hbrush; - } -#endif - if (GetParent()->GetTransparentBackground()) SetBkMode((HDC) pDC, TRANSPARENT); else @@ -670,15 +699,14 @@ WXHBRUSH wxListBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush // has a zero usage count. backgroundBrush->RealizeResource(); -*/ - wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID); return (WXHBRUSH) backgroundBrush->GetResourceHandle(); +*/ + reutrn (WXBRUSH)0; } -MRESULT wxListBox::OS2WindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) -{ - return wxControl::OS2WindowProc(hwnd, nMsg, wParam, lParam); -} +// ---------------------------------------------------------------------------- +// wxCheckListBox support +// ---------------------------------------------------------------------------- #if wxUSE_OWNER_DRAWN @@ -696,27 +724,33 @@ MRESULT wxListBox::OS2WindowProc(HWND hwnd, WXUINT nMsg, WXWPARAM wParam, WXLPAR // message is not yet sent when we get here! bool wxListBox::OS2OnMeasure(WXMEASUREITEMSTRUCT *item) { +// TODO: +/* // only owner-drawn control should receive this message wxCHECK( ((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), FALSE ); -// MEASUREITEMSTRUCT *pStruct = (MEASUREITEMSTRUCT *)item; + MEASUREITEMSTRUCT *pStruct = (MEASUREITEMSTRUCT *)item; wxDC dc; -// TODO: dc.SetHDC((WXHDC)CreateIC(wxT("DISPLAY"), NULL, NULL, 0)); + dc.SetHDC((WXHDC)CreateIC(wxT("DISPLAY"), NULL, NULL, 0)); dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_ANSI_VAR_FONT)); -// pStruct->itemHeight = dc.GetCharHeight() + 2*OWNER_DRAWN_LISTBOX_EXTRA_SPACE; -// pStruct->itemWidth = dc.GetCharWidth(); + pStruct->itemHeight = dc.GetCharHeight() + 2*OWNER_DRAWN_LISTBOX_EXTRA_SPACE; + pStruct->itemWidth = dc.GetCharWidth(); + return TRUE; +*/ return TRUE; } // forward the message to the appropriate item bool wxListBox::OS2OnDraw(WXDRAWITEMSTRUCT *item) { +// TODO: +/* // only owner-drawn control should receive this message wxCHECK( ((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), FALSE ); -/* + DRAWITEMSTRUCT *pStruct = (DRAWITEMSTRUCT *)item; long data = ListBox_GetItemData(GetHwnd(), pStruct->itemID); @@ -734,8 +768,7 @@ bool wxListBox::OS2OnDraw(WXDRAWITEMSTRUCT *item) (wxOwnerDrawn::wxODAction)pStruct->itemAction, (wxOwnerDrawn::wxODStatus)pStruct->itemState); */ - return FALSE; + return FALSE; } - #endif // wxUSE_OWNER_DRAWN diff --git a/src/os2/makefile.va b/src/os2/makefile.va index 39be3bc7f5..e6e235fa5f 100644 --- a/src/os2/makefile.va +++ b/src/os2/makefile.va @@ -136,9 +136,11 @@ NONESSENTIALOBJS= \ COMMONOBJS = \ ..\common\$D\appcmn.obj \ ..\common\$D\choiccmn.obj \ + ..\common\$D\clipcmn.obj \ ..\common\$D\cmndata.obj \ ..\common\$D\config.obj \ ..\common\$D\ctrlcmn.obj \ + ..\common\$D\ctrlsub.obj \ ..\common\$D\date.obj \ ..\common\$D\datstrm.obj \ ..\common\$D\db.obj \ @@ -178,6 +180,7 @@ COMMONOBJS = \ ..\common\$D\intl.obj \ ..\common\$D\ipcbase.obj \ ..\common\$D\layout.obj \ + ..\common\$D\lboxcmn.obj \ ..\common\$D\list.obj \ ..\common\$D\log.obj \ ..\common\$D\longlong.obj \ @@ -230,9 +233,11 @@ COMMONOBJS = \ COMLIBOBJS1 = \ appcmn.obj \ choiccmn.obj \ + clipcmn.obj \ cmndata.obj \ config.obj \ ctrlcmn.obj \ + ctrlsub.obj \ date.obj \ datstrm.obj \ db.obj \ @@ -272,6 +277,7 @@ COMLIBOBJS1 = \ intl.obj \ ipcbase.obj \ layout.obj \ + lboxcmn.obj \ list.obj \ log.obj @@ -530,9 +536,11 @@ $(HTMLDIR)\$D: $(COMLIBOBJS1): copy ..\common\$D\appcmn.obj copy ..\common\$D\choiccmn.obj + copy ..\common\$D\clipcmn.obj copy ..\common\$D\cmndata.obj copy ..\common\$D\config.obj copy ..\common\$D\ctrlcmn.obj + copy ..\common\$D\ctrlsub.obj copy ..\common\$D\date.obj copy ..\common\$D\datstrm.obj copy ..\common\$D\db.obj @@ -572,6 +580,7 @@ $(COMLIBOBJS1): copy ..\common\$D\intl.obj copy ..\common\$D\ipcbase.obj copy ..\common\$D\layout.obj + copy ..\common\$D\lboxcmn.obj copy ..\common\$D\list.obj copy ..\common\$D\log.obj @@ -838,9 +847,11 @@ $(WXDIR)\lib\wx200.dll: $(OBJECTS) $(WXDIR)\lib\wx210.lib !endif $D\dummy.obj: dummy.$(SRCSUFF) $(WXDIR)\include\wx\wx.h $(WXDIR)\include\wx\os2\setup.h + @echo $< icc $(CPPFLAGS) $(MAKEPRECOMP) /Fo$D\dummy.obj /Tp dummy.cpp $D\dummydll.obj: dummydll.$(SRCSUFF) $(WXDIR)\include\wx\wx.h $(WXDIR)\include\wx\os2\setup.h + @echo $< icc @<< $(CPPFLAGS) $(MAKEPRECOMP) /Fo$D\dummydll.obj /c /Tp dummydll.cpp << @@ -851,11 +862,13 @@ $(WXDIR)\include\wx\os2\setup.h: $(WXDIR)\include\wx\os2\setup0.h copy "$(WXDIR)"\include\wx\os2\setup0.h "$(WXDIR)"\include\wx\os2\setup.h ..\common\$D\extended.obj: ..\common\extended.c + @echo $< icc @<< $(CPPFLAGS2) /Fo$@ $(COMMDIR)\extended.c << ..\common\$D\y_tab.obj: ..\common\y_tab.c ..\common\lex_yy.c + @echo $< icc @<< $(CPPFLAGS2) /DUSE_DEFINE /DYY_USE_PROTOS /Fo$@ ..\common\y_tab.c << @@ -869,6 +882,7 @@ $(CPPFLAGS2) /DUSE_DEFINE /DYY_USE_PROTOS /Fo$@ ..\common\y_tab.c $(OBJECTS): $(WXDIR)/include/wx/setup.h ..\common\$D\unzip.obj: ..\common\unzip.c + @echo $< icc @<< $(CPPFLAGS2) /Fo$@ $(COMMDIR)\unzip.c <<