X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/321db4b6bf15df209942b9c0e6c744c8e7074d1b..c978d36124197b5612a2cabefed7591ad0eea6e2:/src/motif/listbox.cpp diff --git a/src/motif/listbox.cpp b/src/motif/listbox.cpp index 246ee2d909..3502c25afc 100644 --- a/src/motif/listbox.cpp +++ b/src/motif/listbox.cpp @@ -10,33 +10,45 @@ /////////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ -#pragma implementation "listbox.h" + #pragma implementation "listbox.h" #endif -#include "wx/listbox.h" +#ifdef __VMS +#define XtParent XTPARENT +#define XtDisplay XTDISPLAY +#endif + +# include "wx/listbox.h" #include "wx/settings.h" #include "wx/dynarray.h" #include "wx/log.h" #include "wx/utils.h" +#ifdef __VMS__ +#pragma message disable nosimpint +#endif #include <Xm/List.h> +#ifdef __VMS__ +#pragma message enable nosimpint +#endif #include "wx/motif/private.h" -#if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) -#endif + IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) -void wxListBoxCallback (Widget w, XtPointer clientData, - XmListCallbackStruct * cbs); +static void wxListBoxCallback(Widget w, + XtPointer clientData, + XmListCallbackStruct * cbs); -void wxListBoxDefaultActionProc (Widget list_w, XtPointer client_data, XmListCallbackStruct * cbs); +static void wxListBoxDefaultActionProc(Widget list_w, + XtPointer client_data, + XmListCallbackStruct * cbs); // ============================================================================ // list box control implementation // ============================================================================ // Listbox item -wxListBox::wxListBox(): m_clientDataList(wxKEY_INTEGER) +wxListBox::wxListBox() : m_clientDataList(wxKEY_INTEGER) { m_noItems = 0; m_selected = 0; @@ -53,7 +65,8 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, m_windowStyle = style; m_noItems = n; m_selected = 0; - m_backgroundColour = parent->GetBackgroundColour(); + // m_backgroundColour = parent->GetBackgroundColour(); + m_backgroundColour = * wxWHITE; m_foregroundColour = parent->GetForegroundColour(); SetName(name); @@ -98,20 +111,21 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, height = 80; XtAddCallback (listWidget, XmNbrowseSelectionCallback, (XtCallbackProc) wxListBoxCallback, - (XtPointer) this); + (XtPointer) this); XtAddCallback (listWidget, XmNextendedSelectionCallback, (XtCallbackProc) wxListBoxCallback, - (XtPointer) this); + (XtPointer) this); XtAddCallback (listWidget, XmNmultipleSelectionCallback, (XtCallbackProc) wxListBoxCallback, - (XtPointer) this); + (XtPointer) this); XtAddCallback (listWidget, XmNdefaultActionCallback, (XtCallbackProc) wxListBoxDefaultActionProc, - (XtPointer) this); + (XtPointer) this); - AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, width, height); + m_font = parent->GetFont(); + ChangeFont(FALSE); - m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW); + SetCanAddEventHandler(TRUE); + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, width, height); - SetFont(* parent->GetFont()); ChangeBackgroundColour(); return TRUE; @@ -123,297 +137,298 @@ wxListBox::~wxListBox() void wxListBox::SetFirstItem(int N) { - int count, length; + int count, length; - if (N < 0) - return; - XtVaGetValues ((Widget) m_mainWidget, - XmNvisibleItemCount, &count, - XmNitemCount, &length, - NULL); - if ((N + count) >= length) - N = length - count; - XmListSetPos ((Widget) m_mainWidget, N + 1); + if (N < 0) + return; + XtVaGetValues ((Widget) m_mainWidget, + XmNvisibleItemCount, &count, + XmNitemCount, &length, + NULL); + if ((N + count) >= length) + N = length - count; + XmListSetPos ((Widget) m_mainWidget, N + 1); } void wxListBox::SetFirstItem(const wxString& s) { - int N = FindString (s); + int N = FindString (s); - if (N >= 0) - SetFirstItem (N); + if (N >= 0) + SetFirstItem (N); } void wxListBox::Delete(int N) { - int width1, height1; - int width2, height2; - Widget listBox = (Widget) m_mainWidget; - GetSize (&width1, &height1); + int width1, height1; + int width2, height2; + Widget listBox = (Widget) m_mainWidget; + GetSize (&width1, &height1); - bool managed = XtIsManaged(listBox); + bool managed = XtIsManaged(listBox); - if (managed) - XtUnmanageChild (listBox); + if (managed) + XtUnmanageChild (listBox); - XmListDeletePos (listBox, N + 1); + XmListDeletePos (listBox, N + 1); - if (managed) - XtManageChild (listBox); + if (managed) + XtManageChild (listBox); - GetSize (&width2, &height2); - // Correct for randomly resized listbox - bad boy, Motif! - if (width1 != width2 || height1 != height2) - SetSize (-1, -1, width1, height1); + GetSize (&width2, &height2); + // Correct for randomly resized listbox - bad boy, Motif! + if (width1 != width2 || height1 != height2) + SetSize (-1, -1, width1, height1); - // (JDH) need to add code here to take care of clientDataList - wxNode *node = m_clientDataList.Find((long)N); // get item from list - if (node) m_clientDataList.DeleteNode(node); // if existed then delete from list - node = m_clientDataList.First(); // we now have to adjust all keys that - while (node) // are >=N+1 - { if (node->key.integer >= (long)(N+1)) // very ugly C++ wise but no other way - node->key.integer--; // to look at or change key value - node = node->Next(); - } + // (JDH) need to add code here to take care of clientDataList + wxNode *node = m_clientDataList.Find((long)N); // get item from list + if (node) m_clientDataList.DeleteNode(node); // if existed then delete from list + node = m_clientDataList.First(); // we now have to adjust all keys that + while (node) // are >=N+1 + { + if (node->GetKeyInteger() >= (long)(N+1)) + node->SetKeyInteger(node->GetKeyInteger() - 1); + node = node->Next(); + } - m_noItems --; + m_noItems --; } void wxListBox::Append(const wxString& item) { - int width1, height1; - int width2, height2; + int width1, height1; + int width2, height2; - Widget listBox = (Widget) m_mainWidget; - GetSize (&width1, &height1); + Widget listBox = (Widget) m_mainWidget; + GetSize (&width1, &height1); - bool managed = XtIsManaged(listBox); + bool managed = XtIsManaged(listBox); - if (managed) - XtUnmanageChild (listBox); - int n; - XtVaGetValues (listBox, XmNitemCount, &n, NULL); - XmString text = XmStringCreateSimple ((char*) (const char*) item); -// XmListAddItem(listBox, text, n + 1); - XmListAddItemUnselected (listBox, text, 0); - XmStringFree (text); + if (managed) + XtUnmanageChild (listBox); + int n; + XtVaGetValues (listBox, XmNitemCount, &n, NULL); + XmString text = XmStringCreateSimple ((char*) (const char*) item); + // XmListAddItem(listBox, text, n + 1); + XmListAddItemUnselected (listBox, text, 0); + XmStringFree (text); - // It seems that if the list is cleared, we must re-ask for - // selection policy!! - Arg args[3]; - XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT); - if (m_windowStyle & wxLB_MULTIPLE) - XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT); - else if (m_windowStyle & wxLB_EXTENDED) - XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT); - else - XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT); - XtSetValues (listBox, args, 2); + // It seems that if the list is cleared, we must re-ask for + // selection policy!! + Arg args[3]; + XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT); + if (m_windowStyle & wxLB_MULTIPLE) + XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT); + else if (m_windowStyle & wxLB_EXTENDED) + XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT); + else + XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT); + XtSetValues (listBox, args, 2); - if (managed) - XtManageChild (listBox); + if (managed) + XtManageChild (listBox); - GetSize (&width2, &height2); - // Correct for randomly resized listbox - bad boy, Motif! - if (width1 != width2 || height1 != height2) - SetSize (-1, -1, width1, height1); - m_noItems ++; + GetSize (&width2, &height2); + // Correct for randomly resized listbox - bad boy, Motif! + if (width1 != width2 || height1 != height2) + SetSize (-1, -1, width1, height1); + m_noItems ++; } -void wxListBox::Append(const wxString& item, char *clientData) +void wxListBox::Append(const wxString& item, void *clientData) { - int width1, height1; - int width2, height2; + int width1, height1; + int width2, height2; - Widget listBox = (Widget) m_mainWidget; + Widget listBox = (Widget) m_mainWidget; - GetSize (&width1, &height1); - Bool managed = XtIsManaged(listBox); + GetSize (&width1, &height1); + Bool managed = XtIsManaged(listBox); - if (managed) - XtUnmanageChild (listBox); + if (managed) + XtUnmanageChild (listBox); - int n; - XtVaGetValues (listBox, XmNitemCount, &n, NULL); - XmString text = XmStringCreateSimple ((char*) (const char*) item); -// XmListAddItem(listBox, text, n + 1); - XmListAddItemUnselected (listBox, text, 0); - XmStringFree (text); + int n; + XtVaGetValues (listBox, XmNitemCount, &n, NULL); + XmString text = XmStringCreateSimple ((char*) (const char*) item); + // XmListAddItem(listBox, text, n + 1); + XmListAddItemUnselected (listBox, text, 0); + XmStringFree (text); - // It seems that if the list is cleared, we must re-ask for - // selection policy!! - Arg args[3]; - XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT); - if (m_windowStyle & wxLB_MULTIPLE) - XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT); - else if (m_windowStyle & wxLB_EXTENDED) - XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT); - else - XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT); - XtSetValues (listBox, args, 2); + // It seems that if the list is cleared, we must re-ask for + // selection policy!! + Arg args[3]; + XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT); + if (m_windowStyle & wxLB_MULTIPLE) + XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT); + else if (m_windowStyle & wxLB_EXTENDED) + XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT); + else + XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT); + XtSetValues (listBox, args, 2); - m_clientDataList.Append ((long) n, (wxObject *) clientData); + m_clientDataList.Append ((long) n, (wxObject *) clientData); - if (managed) - XtManageChild (listBox); + if (managed) + XtManageChild (listBox); - GetSize (&width2, &height2); + GetSize (&width2, &height2); - // Correct for randomly resized listbox - bad boy, Motif! - if (width1 != width2 || height1 != height2) - SetSize (-1, -1, width1, height1); + // Correct for randomly resized listbox - bad boy, Motif! + if (width1 != width2 || height1 != height2) + SetSize (-1, -1, width1, height1); - m_noItems ++; + m_noItems ++; } -void wxListBox::Set(int n, const wxString *choices, char** clientData) +void wxListBox::Set(int n, const wxString *choices, void** clientData) { - m_clientDataList.Clear(); - int width1, height1; - int width2, height2; + m_clientDataList.Clear(); + int width1, height1; + int width2, height2; - Widget listBox = (Widget) m_mainWidget; - GetSize (&width1, &height1); + Widget listBox = (Widget) m_mainWidget; + GetSize (&width1, &height1); - bool managed = XtIsManaged(listBox); + bool managed = XtIsManaged(listBox); - if (managed) - XtUnmanageChild (listBox); -/*** - for (int i=0; i<n; i++) - { - XmString text = XmStringCreateSimple(choices[i]); - XmListAddItemUnselected(listBox, text, 0); - XmStringFree(text); - } -***/ - XmString *text = new XmString[n]; - int i; - for (i = 0; i < n; i++) - text[i] = XmStringCreateSimple ((char*) (const char*) choices[i]); - - if ( clientData ) + if (managed) + XtUnmanageChild (listBox); + /*** + for (int i=0; i<n; i++) + { + XmString text = XmStringCreateSimple(choices[i]); + XmListAddItemUnselected(listBox, text, 0); + XmStringFree(text); + } + ***/ + XmString *text = new XmString[n]; + int i; for (i = 0; i < n; i++) - m_clientDataList.Append ((long) i, (wxObject *) clientData[i]); - - XmListAddItems (listBox, text, n, 0); - for (i = 0; i < n; i++) - XmStringFree (text[i]); - delete[]text; - - // It seems that if the list is cleared, we must re-ask for - // selection policy!! - Arg args[3]; - XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT); - if (m_windowStyle & wxLB_MULTIPLE) - XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT); - else if (m_windowStyle & wxLB_EXTENDED) - XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT); - else - XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT); - XtSetValues (listBox, args, 2); + text[i] = XmStringCreateSimple ((char*) (const char*) choices[i]); + + if ( clientData ) + for (i = 0; i < n; i++) + m_clientDataList.Append ((long) i, (wxObject *) clientData[i]); + + XmListAddItems (listBox, text, n, 0); + for (i = 0; i < n; i++) + XmStringFree (text[i]); + delete[]text; + + // It seems that if the list is cleared, we must re-ask for + // selection policy!! + Arg args[3]; + XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT); + if (m_windowStyle & wxLB_MULTIPLE) + XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT); + else if (m_windowStyle & wxLB_EXTENDED) + XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT); + else + XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT); + XtSetValues (listBox, args, 2); - if (managed) - XtManageChild (listBox); + if (managed) + XtManageChild (listBox); - GetSize (&width2, &height2); - // Correct for randomly resized listbox - bad boy, Motif! - if (width1 != width2 || height1 != height2) - SetSize (-1, -1, width1, height1); + GetSize (&width2, &height2); + // Correct for randomly resized listbox - bad boy, Motif! + if (width1 != width2 || height1 != height2) + SetSize (-1, -1, width1, height1); - m_noItems = n; + m_noItems = n; } int wxListBox::FindString(const wxString& s) const { - XmString str = XmStringCreateSimple ((char*) (const char*) s); - int *positions = NULL; - int no_positions = 0; - bool success = XmListGetMatchPos ((Widget) m_mainWidget, str, &positions, &no_positions); - XmStringFree (str); - if (success) + XmString str = XmStringCreateSimple ((char*) (const char*) s); + int *positions = NULL; + int no_positions = 0; + bool success = XmListGetMatchPos ((Widget) m_mainWidget, str, &positions, &no_positions); + XmStringFree (str); + if (success) { - int pos = positions[0]; - if (positions) - XtFree ((char *) positions); - return pos - 1; + int pos = positions[0]; + if (positions) + XtFree ((char *) positions); + return pos - 1; } - else - return -1; + else + return -1; } void wxListBox::Clear() { - if (m_noItems <= 0) - return; + if (m_noItems <= 0) + return; - int width1, height1; - int width2, height2; + int width1, height1; + int width2, height2; - Widget listBox = (Widget) m_mainWidget; - GetSize (&width1, &height1); + Widget listBox = (Widget) m_mainWidget; + GetSize (&width1, &height1); - XmListDeleteAllItems (listBox); - m_clientDataList.Clear (); - GetSize (&width2, &height2); + XmListDeleteAllItems (listBox); + m_clientDataList.Clear (); + GetSize (&width2, &height2); - // Correct for randomly resized listbox - bad boy, Motif! - if (width1 != width2 || height1 != height2) - SetSize (-1, -1, width1, height1); + // Correct for randomly resized listbox - bad boy, Motif! + if (width1 != width2 || height1 != height2) + SetSize (-1, -1, width1, height1); - m_noItems = 0; + m_noItems = 0; } void wxListBox::SetSelection(int N, bool select) { - m_inSetValue = TRUE; - if (select) - { -/* - if (m_windowStyle & wxLB_MULTIPLE) + m_inSetValue = TRUE; + if (select) { - int *selections = NULL; - int n = GetSelections (&selections); +#if 0 + if (m_windowStyle & wxLB_MULTIPLE) + { + int *selections = NULL; + int n = GetSelections (&selections); - // This hack is supposed to work, to make it possible to select more - // than one item, but it DOESN'T under Motif 1.1. + // This hack is supposed to work, to make it possible to select more + // than one item, but it DOESN'T under Motif 1.1. - XtVaSetValues ((Widget) m_mainWidget, XmNselectionPolicy, XmMULTIPLE_SELECT, NULL); + XtVaSetValues ((Widget) m_mainWidget, XmNselectionPolicy, XmMULTIPLE_SELECT, NULL); - int i; - for (i = 0; i < n; i++) - XmListSelectPos ((Widget) m_mainWidget, selections[i] + 1, FALSE); + int i; + for (i = 0; i < n; i++) + XmListSelectPos ((Widget) m_mainWidget, selections[i] + 1, FALSE); - XmListSelectPos ((Widget) m_mainWidget, N + 1, FALSE); + XmListSelectPos ((Widget) m_mainWidget, N + 1, FALSE); - XtVaSetValues ((Widget) m_mainWidget, XmNselectionPolicy, XmEXTENDED_SELECT, NULL); - } - else -*/ - XmListSelectPos ((Widget) m_mainWidget, N + 1, FALSE); + XtVaSetValues ((Widget) m_mainWidget, XmNselectionPolicy, XmEXTENDED_SELECT, NULL); + } + else +#endif // 0 + XmListSelectPos ((Widget) m_mainWidget, N + 1, FALSE); } - else - XmListDeselectPos ((Widget) m_mainWidget, N + 1); + else + XmListDeselectPos ((Widget) m_mainWidget, N + 1); - m_inSetValue = FALSE; + m_inSetValue = FALSE; } -bool wxListBox::Selected(int N) const +bool wxListBox::IsSelected(int N) const { - // In Motif, no simple way to determine if the item is selected. - wxArrayInt theSelections; - int count = GetSelections (theSelections); - if (count == 0) + // In Motif, no simple way to determine if the item is selected. + wxArrayInt theSelections; + int count = GetSelections (theSelections); + if (count == 0) + return FALSE; + else + { + int j; + for (j = 0; j < count; j++) + if (theSelections[j] == N) + return TRUE; + } return FALSE; - else - { - int j; - for (j = 0; j < count; j++) - if (theSelections[j] == N) - return TRUE; - } - return FALSE; } void wxListBox::Deselect(int N) @@ -421,16 +436,16 @@ void wxListBox::Deselect(int N) XmListDeselectPos ((Widget) m_mainWidget, N + 1); } -char *wxListBox::GetClientData(int N) const +void *wxListBox::GetClientData(int N) const { wxNode *node = m_clientDataList.Find ((long) N); if (node) - return (char *) node->Data (); + return (void *) node->Data (); else return NULL; } -void wxListBox::SetClientData(int N, char *Client_data) +void wxListBox::SetClientData(int N, void *Client_data) { wxNode *node = m_clientDataList.Find ((long) N); if (node) @@ -442,30 +457,30 @@ void wxListBox::SetClientData(int N, char *Client_data) // Return number of selections and an array of selected integers int wxListBox::GetSelections(wxArrayInt& aSelections) const { - aSelections.Empty(); + aSelections.Empty(); - Widget listBox = (Widget) m_mainWidget; - int *posList = NULL; - int posCnt = 0; - bool flag = XmListGetSelectedPos (listBox, &posList, &posCnt); - if (flag) - { - if (posCnt > 0) - { - aSelections.Alloc(posCnt); + Widget listBox = (Widget) m_mainWidget; + int *posList = NULL; + int posCnt = 0; + bool flag = XmListGetSelectedPos (listBox, &posList, &posCnt); + if (flag) + { + if (posCnt > 0) + { + aSelections.Alloc(posCnt); - int i; - for (i = 0; i < posCnt; i++) - aSelections.Add(posList[i] - 1); + int i; + for (i = 0; i < posCnt; i++) + aSelections.Add(posList[i] - 1); - XtFree ((char *) posList); - return posCnt; - } - else - return 0; + XtFree ((char *) posList); + return posCnt; + } + else + return 0; } - else - return 0; + else + return 0; } // Get single selection, for single choice list items @@ -510,9 +525,9 @@ wxString wxListBox::GetString(int N) const return wxEmptyString; } -void wxListBox::SetSize(int x, int y, int width, int height, int sizeFlags) +void wxListBox::DoSetSize(int x, int y, int width, int height, int sizeFlags) { - wxWindow::SetSize(x, y, width, height, sizeFlags); + wxWindow::DoSetSize(x, y, width, height, sizeFlags); // Check resulting size is correct int tempW, tempH; @@ -521,7 +536,7 @@ void wxListBox::SetSize(int x, int y, int width, int height, int sizeFlags) /* if (tempW != width || tempH != height) { - cout << "wxListBox::SetSize sizes not set correctly."); + cout << "wxListBox::SetSize sizes not set correctly."); } */ } @@ -539,12 +554,12 @@ void wxListBox::InsertItems(int nItems, const wxString items[], int pos) if (managed) XtUnmanageChild(listBox); - + XmString *text = new XmString[nItems]; int i; - // Steve Hammes: Motif 1.1 compatibility -// #if XmVersion > 1100 -// Corrected by Sergey Krasnov from Steve Hammes' code + // Steve Hammes: Motif 1.1 compatibility + // #if XmVersion > 1100 + // Corrected by Sergey Krasnov from Steve Hammes' code #if XmVersion > 1001 for (i = 0; i < nItems; i++) text[i] = XmStringCreateSimple((char*) (const char*) items[i]); @@ -553,7 +568,7 @@ void wxListBox::InsertItems(int nItems, const wxString items[], int pos) for (i = 0; i < nItems; i++) { text[i] = XmStringCreateSimple((char*) (const char*) items[i]); -// XmListAddItemUnselected(listBox, text[i], i); + // XmListAddItemUnselected(listBox, text[i], i); XmListAddItemUnselected(listBox, text[i], pos+i+1); // Another Sergey correction } #endif @@ -594,28 +609,13 @@ void wxListBox::SetString(int N, const wxString& s) XmString text = XmStringCreateSimple ((char*) (const char*) s); - // WHAT'S THE MOTIF CALL TO SET THE TEXT OF AN EXISTING - // ITEM??? - // There isn't one, so delete the item and add it again. + // 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); XmStringFree(text); -/* - // It seems that if the list is cleared, we must re-ask for - // selection policy!! - Arg args[3]; - XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT); - if (m_windowStyle & wxLB_MULTIPLE) - XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT); - else if (m_windowStyle & wxLB_EXTENDED) - XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT); - else - XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT); - XtSetValues (listBox, args, 2); -*/ - GetSize (&width2, &height2); // Correct for randomly resized listbox - bad boy, Motif! if (width1 != width2 || height1 != height2) @@ -630,11 +630,12 @@ int wxListBox::Number () const // For single selection items only wxString wxListBox::GetStringSelection () const { - int sel = GetSelection (); + wxString res; + int sel = GetSelection(); if (sel > -1) - return this->GetString (sel); - else - return wxString(""); + res = GetString(sel); + + return res; } bool wxListBox::SetStringSelection (const wxString& s, bool flag) @@ -661,10 +662,10 @@ void wxListBox::Command (wxCommandEvent & event) ProcessCommand (event); } -void wxListBoxCallback (Widget w, XtPointer clientData, - XmListCallbackStruct * cbs) +void wxListBoxCallback (Widget WXUNUSED(w), XtPointer clientData, + XmListCallbackStruct * cbs) { -/* + /* if (cbs->reason == XmCR_EXTENDED_SELECT) cout << "*** Extend select\n"; else if (cbs->reason == XmCR_SINGLE_SELECT) @@ -680,35 +681,33 @@ void wxListBoxCallback (Widget w, XtPointer clientData, cout << "*** Initial\n"; else if (cbs->selection_type == XmADDITION) cout << "*** Addition\n"; - */ + */ wxListBox *item = (wxListBox *) clientData; if (item->InSetValue()) return; - wxCommandEvent event (wxEVT_COMMAND_LISTBOX_SELECTED); + wxCommandEvent event (wxEVT_COMMAND_LISTBOX_SELECTED, item->GetId()); switch (cbs->reason) { - case XmCR_MULTIPLE_SELECT: - case XmCR_BROWSE_SELECT: + case XmCR_MULTIPLE_SELECT: + case XmCR_BROWSE_SELECT: { event.m_clientData = item->GetClientData (cbs->item_position - 1); - //event.commandString = item->GetStringSelection(); event.m_commandInt = cbs->item_position - 1; event.m_extraLong = TRUE; event.SetEventObject(item); item->ProcessCommand (event); - //delete[] event.commandString; // Let's not store the command string any more break; } - case XmCR_EXTENDED_SELECT: + case XmCR_EXTENDED_SELECT: { switch (cbs->selection_type) { - case XmINITIAL: - case XmADDITION: - case XmMODIFICATION: + case XmINITIAL: + case XmADDITION: + case XmMODIFICATION: { event.m_clientData = item->GetClientData (cbs->item_position - 1); event.m_commandInt = cbs->item_position - 1; @@ -724,10 +723,10 @@ void wxListBoxCallback (Widget w, XtPointer clientData, } /* Respond by getting the - * designated "default button" in the action area and activate it - * as if the user had selected it. - */ -void wxListBoxDefaultActionProc (Widget list_w, XtPointer client_data, XmListCallbackStruct * cbs) +* designated "default button" in the action area and activate it +* as if the user had selected it. +*/ +void wxListBoxDefaultActionProc (Widget WXUNUSED(list_w), XtPointer client_data, XmListCallbackStruct * WXUNUSED(cbs)) { wxListBox *lbox = (wxListBox *) client_data; @@ -738,21 +737,129 @@ void wxListBoxDefaultActionProc (Widget list_w, XtPointer client_data, XmListCal WXWidget wxListBox::GetTopWidget() const { - return (WXWidget) XtParent( (Widget) m_mainWidget ); + return (WXWidget) XtParent( (Widget) m_mainWidget ); } -void wxListBox::ChangeFont() +void wxListBox::ChangeFont(bool keepOriginalSize) { - wxWindow::ChangeFont(); + wxWindow::ChangeFont(keepOriginalSize); } void wxListBox::ChangeBackgroundColour() { wxWindow::ChangeBackgroundColour(); + + Widget parent = XtParent ((Widget) m_mainWidget); + Widget hsb, vsb; + + XtVaGetValues (parent, + XmNhorizontalScrollBar, &hsb, + XmNverticalScrollBar, &vsb, + NULL); + + /* TODO: should scrollbars be affected? Should probably have separate + * function to change them (by default, taken from wxSystemSettings) + */ + wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); + DoChangeBackgroundColour((WXWidget) hsb, backgroundColour, TRUE); + DoChangeBackgroundColour((WXWidget) vsb, backgroundColour, TRUE); + + XtVaSetValues (hsb, + XmNtroughColor, backgroundColour.AllocColour(XtDisplay(hsb)), + NULL); + XtVaSetValues (vsb, + XmNtroughColor, backgroundColour.AllocColour(XtDisplay(vsb)), + NULL); + + DoChangeBackgroundColour((WXWidget) parent, m_backgroundColour, TRUE); } void wxListBox::ChangeForegroundColour() { wxWindow::ChangeForegroundColour(); + + Widget parent = XtParent ((Widget) m_mainWidget); + Widget hsb, vsb; + + XtVaGetValues(parent, + XmNhorizontalScrollBar, &hsb, + XmNverticalScrollBar, &vsb, + NULL); + + /* TODO: should scrollbars be affected? Should probably have separate + function to change them (by default, taken from wxSystemSettings) + + DoChangeForegroundColour((WXWidget) hsb, m_foregroundColour); + DoChangeForegroundColour((WXWidget) vsb, m_foregroundColour); + DoChangeForegroundColour((WXWidget) parent, m_foregroundColour); + */ +} + +// These implement functions needed by wxControlWithItems. +// Unfortunately, they're not all implemented yet. + +int wxListBox::GetCount() const +{ + return Number(); +} + +int wxListBox::DoAppend(const wxString& item) +{ + Append(item, (void*) NULL); + return GetCount() - 1; +} + +// Just appends, doesn't yet insert +void wxListBox::DoInsertItems(const wxArrayString& items, int WXUNUSED(pos)) +{ + size_t nItems = items.GetCount(); + + for ( size_t n = 0; n < nItems; n++ ) + { + Append( items[n], (void*) NULL); + } +} + +void wxListBox::DoSetItems(const wxArrayString& items, void **clientData) +{ + size_t nItems = items.GetCount(); + wxString* strings = new wxString[nItems]; + + for ( size_t n = 0; n < nItems; n++ ) + { + strings[n] = items[n]; + } + Set(nItems, strings, clientData); + + delete[] strings; } +void wxListBox::DoSetFirstItem(int WXUNUSED(n)) +{ + wxFAIL_MSG( wxT("wxListBox::DoSetFirstItem not implemented") ); +} + +void wxListBox::DoSetItemClientData(int n, void* clientData) +{ + SetClientData(n, clientData); +} + +void* wxListBox::DoGetItemClientData(int n) const +{ + return GetClientData(n); +} + +void wxListBox::DoSetItemClientObject(int n, wxClientData* clientData) +{ + DoSetItemClientData(n, (void*) clientData); +} + +wxClientData* wxListBox::DoGetItemClientObject(int n) const +{ + return (wxClientData*) DoGetItemClientData(n); +} + +void wxListBox::Select(int n) +{ + SetSelection(n, TRUE); +}