X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b412f9be504e07559a98ae234f30bb1bd0b2aa1f..8aa4edd248534c4c1879c93d363d1b7fb8e8c5c6:/src/motif/listbox.cpp diff --git a/src/motif/listbox.cpp b/src/motif/listbox.cpp index 15fc68c34b..a31b554ed9 100644 --- a/src/motif/listbox.cpp +++ b/src/motif/listbox.cpp @@ -23,11 +23,11 @@ #include "wx/motif/private.h" #if !USE_SHARED_LIBRARY - IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) #endif void wxListBoxCallback (Widget w, XtPointer clientData, - XmListCallbackStruct * cbs); + XmListCallbackStruct * cbs); void wxListBoxDefaultActionProc (Widget list_w, XtPointer client_data, XmListCallbackStruct * cbs); @@ -56,16 +56,16 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, // m_backgroundColour = parent->GetBackgroundColour(); m_backgroundColour = * wxWHITE; m_foregroundColour = parent->GetForegroundColour(); - + SetName(name); SetValidator(validator); - + if (parent) parent->AddChild(this); - + m_windowId = ( id == -1 ) ? (int)NewControlId() : id; - + Widget parentWidget = (Widget) parent->GetClientWidget(); - + Arg args[3]; int count; XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT); @@ -82,39 +82,39 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, } else count = 2; - + Widget listWidget = XmCreateScrolledList (parentWidget, (char*) (const char*) name, args, count); - + m_mainWidget = (WXWidget) listWidget; - + Set(n, choices); - + XtManageChild (listWidget); - + long width = size.x; long height = size.y; if (width == -1) width = 150; if (height == -1) 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); + m_windowFont = parent->GetFont(); ChangeFont(FALSE); - + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, width, height); - + ChangeBackgroundColour(); - + return TRUE; } @@ -124,297 +124,297 @@ wxListBox::~wxListBox() void wxListBox::SetFirstItem(int N) { - 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); + 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); } void wxListBox::SetFirstItem(const wxString& s) { - int N = FindString (s); - - if (N >= 0) - SetFirstItem (N); + int N = FindString (s); + + if (N >= 0) + SetFirstItem (N); } void wxListBox::Delete(int N) { - int width1, height1; - int width2, height2; - Widget listBox = (Widget) m_mainWidget; - GetSize (&width1, &height1); - - bool managed = XtIsManaged(listBox); - - if (managed) - XtUnmanageChild (listBox); - - XmListDeletePos (listBox, N + 1); - - 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); - - // (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 --; + int width1, height1; + int width2, height2; + Widget listBox = (Widget) m_mainWidget; + GetSize (&width1, &height1); + + bool managed = XtIsManaged(listBox); + + if (managed) + XtUnmanageChild (listBox); + + XmListDeletePos (listBox, N + 1); + + 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); + + // (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 --; } void wxListBox::Append(const wxString& item) { - int width1, height1; - int width2, height2; - - Widget listBox = (Widget) m_mainWidget; - GetSize (&width1, &height1); - - 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); - - // 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); - - GetSize (&width2, &height2); - // Correct for randomly resized listbox - bad boy, Motif! - if (width1 != width2 || height1 != height2) - SetSize (-1, -1, width1, height1); - m_noItems ++; + int width1, height1; + int width2, height2; + + Widget listBox = (Widget) m_mainWidget; + GetSize (&width1, &height1); + + 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); + + // 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); + + 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) { - int width1, height1; - int width2, height2; - - Widget listBox = (Widget) m_mainWidget; - - GetSize (&width1, &height1); - 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); - - // 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); - - 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 ++; + int width1, height1; + int width2, height2; + + Widget listBox = (Widget) m_mainWidget; + + GetSize (&width1, &height1); + 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); + + // 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); + + 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 ++; } void wxListBox::Set(int n, const wxString *choices, char** clientData) { - m_clientDataList.Clear(); - int width1, height1; - int width2, height2; - - Widget listBox = (Widget) m_mainWidget; - GetSize (&width1, &height1); - - bool managed = XtIsManaged(listBox); - - if (managed) - XtUnmanageChild (listBox); -/*** - for (int i=0; i 0) - { - aSelections.Alloc(posCnt); - - int i; - for (i = 0; i < posCnt; i++) - aSelections.Add(posList[i] - 1); - - XtFree ((char *) posList); - return posCnt; - } - else - return 0; + 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); + + int i; + for (i = 0; i < posCnt; i++) + aSelections.Add(posList[i] - 1); + + XtFree ((char *) posList); + return posCnt; + } + else + return 0; } - else - return 0; + else + return 0; } // Get single selection, for single choice list items @@ -514,15 +514,15 @@ wxString wxListBox::GetString(int N) const void wxListBox::SetSize(int x, int y, int width, int height, int sizeFlags) { wxWindow::SetSize(x, y, width, height, sizeFlags); - + // Check resulting size is correct int tempW, tempH; GetSize (&tempW, &tempH); - + /* if (tempW != width || tempH != height) { - cout << "wxListBox::SetSize sizes not set correctly."); + cout << "wxListBox::SetSize sizes not set correctly."); } */ } @@ -531,21 +531,21 @@ void wxListBox::InsertItems(int nItems, const wxString items[], int pos) { int width1, height1; int width2, height2; - + Widget listBox = (Widget) m_mainWidget; - + GetSize(&width1, &height1); - + bool managed = XtIsManaged(listBox); - + 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]); @@ -554,15 +554,15 @@ 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 for (i = 0; i < nItems; i++) XmStringFree(text[i]); - + delete[] text; - + // It seems that if the list is cleared, we must re-ask for // selection policy!! Arg args[3]; @@ -573,15 +573,15 @@ void wxListBox::InsertItems(int nItems, const wxString items[], int pos) XtSetArg(args[1], XmNselectionPolicy, XmEXTENDED_SELECT); else XtSetArg(args[1], XmNselectionPolicy, XmBROWSE_SELECT); XtSetValues(listBox,args,2) ; - + 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 += nItems; } @@ -589,34 +589,34 @@ void wxListBox::SetString(int N, const wxString& s) { int width1, height1; int width2, height2; - + Widget listBox = (Widget) m_mainWidget; GetSize (&width1, &height1); - + 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. 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) + + /* + // 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) + else if (m_windowStyle & wxLB_EXTENDED) XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT); - else + else XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT); - XtSetValues (listBox, args, 2); -*/ - + XtSetValues (listBox, args, 2); + */ + GetSize (&width2, &height2); // Correct for randomly resized listbox - bad boy, Motif! if (width1 != width2 || height1 != height2) @@ -663,7 +663,7 @@ void wxListBox::Command (wxCommandEvent & event) } void wxListBoxCallback (Widget w, XtPointer clientData, - XmListCallbackStruct * cbs) + XmListCallbackStruct * cbs) { /* if (cbs->reason == XmCR_EXTENDED_SELECT) @@ -681,18 +681,18 @@ 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, 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(); @@ -703,13 +703,13 @@ void wxListBoxCallback (Widget w, XtPointer clientData, //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; @@ -725,13 +725,13 @@ 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. - */ +* 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) { wxListBox *lbox = (wxListBox *) client_data; - + wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, lbox->GetId()); event.SetEventObject( lbox ); lbox->GetEventHandler()->ProcessEvent(event) ; @@ -739,7 +739,7 @@ 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(bool keepOriginalSize) @@ -750,41 +750,41 @@ void wxListBox::ChangeFont(bool 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) - */ + 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::GetSystemColour(wxSYS_COLOUR_3DFACE); DoChangeBackgroundColour((WXWidget) hsb, backgroundColour, TRUE); DoChangeBackgroundColour((WXWidget) vsb, backgroundColour, TRUE); - + 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); + 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); */ }