]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/motif/listbox.cpp
_MSC_VER change fixes - now compiles again
[wxWidgets.git] / src / motif / listbox.cpp
... / ...
CommitLineData
1///////////////////////////////////////////////////////////////////////////////
2// Name: listbox.cpp
3// Purpose: wxListBox
4// Author: Julian Smart
5// Modified by:
6// Created: 17/09/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "listbox.h"
14#endif
15
16#include "wx/listbox.h"
17#include "wx/settings.h"
18#include "wx/dynarray.h"
19#include "wx/log.h"
20#include "wx/utils.h"
21
22#include <Xm/List.h>
23#include "wx/motif/private.h"
24
25#if !USE_SHARED_LIBRARY
26IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
27#endif
28
29void wxListBoxCallback (Widget w, XtPointer clientData,
30 XmListCallbackStruct * cbs);
31
32void wxListBoxDefaultActionProc (Widget list_w, XtPointer client_data, XmListCallbackStruct * cbs);
33
34// ============================================================================
35// list box control implementation
36// ============================================================================
37
38// Listbox item
39wxListBox::wxListBox(): m_clientDataList(wxKEY_INTEGER)
40{
41 m_noItems = 0;
42 m_selected = 0;
43}
44
45bool wxListBox::Create(wxWindow *parent, wxWindowID id,
46 const wxPoint& pos,
47 const wxSize& size,
48 int n, const wxString choices[],
49 long style,
50 const wxValidator& validator,
51 const wxString& name)
52{
53 m_windowStyle = style;
54 m_noItems = n;
55 m_selected = 0;
56 // m_backgroundColour = parent->GetBackgroundColour();
57 m_backgroundColour = * wxWHITE;
58 m_foregroundColour = parent->GetForegroundColour();
59
60 SetName(name);
61 SetValidator(validator);
62
63 if (parent) parent->AddChild(this);
64
65 m_windowId = ( id == -1 ) ? (int)NewControlId() : id;
66
67 Widget parentWidget = (Widget) parent->GetClientWidget();
68
69 Arg args[3];
70 int count;
71 XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT);
72 if (m_windowStyle & wxLB_MULTIPLE)
73 XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT);
74 else if (m_windowStyle & wxLB_EXTENDED)
75 XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT);
76 else
77 XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT);
78 if (m_windowStyle & wxLB_ALWAYS_SB)
79 {
80 XtSetArg (args[2], XmNscrollBarDisplayPolicy, XmSTATIC);
81 count = 3;
82 }
83 else
84 count = 2;
85
86 Widget listWidget = XmCreateScrolledList (parentWidget, (char*) (const char*) name, args, count);
87
88 m_mainWidget = (WXWidget) listWidget;
89
90 Set(n, choices);
91
92 XtManageChild (listWidget);
93
94 long width = size.x;
95 long height = size.y;
96 if (width == -1)
97 width = 150;
98 if (height == -1)
99 height = 80;
100
101 XtAddCallback (listWidget, XmNbrowseSelectionCallback, (XtCallbackProc) wxListBoxCallback,
102 (XtPointer) this);
103 XtAddCallback (listWidget, XmNextendedSelectionCallback, (XtCallbackProc) wxListBoxCallback,
104 (XtPointer) this);
105 XtAddCallback (listWidget, XmNmultipleSelectionCallback, (XtCallbackProc) wxListBoxCallback,
106 (XtPointer) this);
107
108 XtAddCallback (listWidget, XmNdefaultActionCallback, (XtCallbackProc) wxListBoxDefaultActionProc,
109 (XtPointer) this);
110
111 m_windowFont = parent->GetFont();
112 ChangeFont(FALSE);
113
114 SetCanAddEventHandler(TRUE);
115 AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, width, height);
116
117 ChangeBackgroundColour();
118
119 return TRUE;
120}
121
122wxListBox::~wxListBox()
123{
124}
125
126void wxListBox::SetFirstItem(int N)
127{
128 int count, length;
129
130 if (N < 0)
131 return;
132 XtVaGetValues ((Widget) m_mainWidget,
133 XmNvisibleItemCount, &count,
134 XmNitemCount, &length,
135 NULL);
136 if ((N + count) >= length)
137 N = length - count;
138 XmListSetPos ((Widget) m_mainWidget, N + 1);
139}
140
141void wxListBox::SetFirstItem(const wxString& s)
142{
143 int N = FindString (s);
144
145 if (N >= 0)
146 SetFirstItem (N);
147}
148
149void wxListBox::Delete(int N)
150{
151 int width1, height1;
152 int width2, height2;
153 Widget listBox = (Widget) m_mainWidget;
154 GetSize (&width1, &height1);
155
156 bool managed = XtIsManaged(listBox);
157
158 if (managed)
159 XtUnmanageChild (listBox);
160
161 XmListDeletePos (listBox, N + 1);
162
163 if (managed)
164 XtManageChild (listBox);
165
166 GetSize (&width2, &height2);
167 // Correct for randomly resized listbox - bad boy, Motif!
168 if (width1 != width2 || height1 != height2)
169 SetSize (-1, -1, width1, height1);
170
171 // (JDH) need to add code here to take care of clientDataList
172 wxNode *node = m_clientDataList.Find((long)N); // get item from list
173 if (node) m_clientDataList.DeleteNode(node); // if existed then delete from list
174 node = m_clientDataList.First(); // we now have to adjust all keys that
175 while (node) // are >=N+1
176 { if (node->GetKeyInteger() >= (long)(N+1))
177 node->SetKeyInteger(node->GetKeyInteger() - 1);
178 node = node->Next();
179 }
180
181 m_noItems --;
182}
183
184void wxListBox::Append(const wxString& item)
185{
186 int width1, height1;
187 int width2, height2;
188
189 Widget listBox = (Widget) m_mainWidget;
190 GetSize (&width1, &height1);
191
192 bool managed = XtIsManaged(listBox);
193
194 if (managed)
195 XtUnmanageChild (listBox);
196 int n;
197 XtVaGetValues (listBox, XmNitemCount, &n, NULL);
198 XmString text = XmStringCreateSimple ((char*) (const char*) item);
199 // XmListAddItem(listBox, text, n + 1);
200 XmListAddItemUnselected (listBox, text, 0);
201 XmStringFree (text);
202
203 // It seems that if the list is cleared, we must re-ask for
204 // selection policy!!
205 Arg args[3];
206 XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT);
207 if (m_windowStyle & wxLB_MULTIPLE)
208 XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT);
209 else if (m_windowStyle & wxLB_EXTENDED)
210 XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT);
211 else
212 XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT);
213 XtSetValues (listBox, args, 2);
214
215 if (managed)
216 XtManageChild (listBox);
217
218 GetSize (&width2, &height2);
219 // Correct for randomly resized listbox - bad boy, Motif!
220 if (width1 != width2 || height1 != height2)
221 SetSize (-1, -1, width1, height1);
222 m_noItems ++;
223}
224
225void wxListBox::Append(const wxString& item, char *clientData)
226{
227 int width1, height1;
228 int width2, height2;
229
230 Widget listBox = (Widget) m_mainWidget;
231
232 GetSize (&width1, &height1);
233 Bool managed = XtIsManaged(listBox);
234
235 if (managed)
236 XtUnmanageChild (listBox);
237
238 int n;
239 XtVaGetValues (listBox, XmNitemCount, &n, NULL);
240 XmString text = XmStringCreateSimple ((char*) (const char*) item);
241 // XmListAddItem(listBox, text, n + 1);
242 XmListAddItemUnselected (listBox, text, 0);
243 XmStringFree (text);
244
245 // It seems that if the list is cleared, we must re-ask for
246 // selection policy!!
247 Arg args[3];
248 XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT);
249 if (m_windowStyle & wxLB_MULTIPLE)
250 XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT);
251 else if (m_windowStyle & wxLB_EXTENDED)
252 XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT);
253 else
254 XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT);
255 XtSetValues (listBox, args, 2);
256
257 m_clientDataList.Append ((long) n, (wxObject *) clientData);
258
259 if (managed)
260 XtManageChild (listBox);
261
262 GetSize (&width2, &height2);
263
264 // Correct for randomly resized listbox - bad boy, Motif!
265 if (width1 != width2 || height1 != height2)
266 SetSize (-1, -1, width1, height1);
267
268 m_noItems ++;
269}
270
271void wxListBox::Set(int n, const wxString *choices, char** clientData)
272{
273 m_clientDataList.Clear();
274 int width1, height1;
275 int width2, height2;
276
277 Widget listBox = (Widget) m_mainWidget;
278 GetSize (&width1, &height1);
279
280 bool managed = XtIsManaged(listBox);
281
282 if (managed)
283 XtUnmanageChild (listBox);
284 /***
285 for (int i=0; i<n; i++)
286 {
287 XmString text = XmStringCreateSimple(choices[i]);
288 XmListAddItemUnselected(listBox, text, 0);
289 XmStringFree(text);
290 }
291 ***/
292 XmString *text = new XmString[n];
293 int i;
294 for (i = 0; i < n; i++)
295 text[i] = XmStringCreateSimple ((char*) (const char*) choices[i]);
296
297 if ( clientData )
298 for (i = 0; i < n; i++)
299 m_clientDataList.Append ((long) i, (wxObject *) clientData[i]);
300
301 XmListAddItems (listBox, text, n, 0);
302 for (i = 0; i < n; i++)
303 XmStringFree (text[i]);
304 delete[]text;
305
306 // It seems that if the list is cleared, we must re-ask for
307 // selection policy!!
308 Arg args[3];
309 XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT);
310 if (m_windowStyle & wxLB_MULTIPLE)
311 XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT);
312 else if (m_windowStyle & wxLB_EXTENDED)
313 XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT);
314 else
315 XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT);
316 XtSetValues (listBox, args, 2);
317
318 if (managed)
319 XtManageChild (listBox);
320
321 GetSize (&width2, &height2);
322 // Correct for randomly resized listbox - bad boy, Motif!
323 if (width1 != width2 || height1 != height2)
324 SetSize (-1, -1, width1, height1);
325
326 m_noItems = n;
327}
328
329int wxListBox::FindString(const wxString& s) const
330{
331 XmString str = XmStringCreateSimple ((char*) (const char*) s);
332 int *positions = NULL;
333 int no_positions = 0;
334 bool success = XmListGetMatchPos ((Widget) m_mainWidget, str, &positions, &no_positions);
335 XmStringFree (str);
336 if (success)
337 {
338 int pos = positions[0];
339 if (positions)
340 XtFree ((char *) positions);
341 return pos - 1;
342 }
343 else
344 return -1;
345}
346
347void wxListBox::Clear()
348{
349 if (m_noItems <= 0)
350 return;
351
352 int width1, height1;
353 int width2, height2;
354
355 Widget listBox = (Widget) m_mainWidget;
356 GetSize (&width1, &height1);
357
358 XmListDeleteAllItems (listBox);
359 m_clientDataList.Clear ();
360 GetSize (&width2, &height2);
361
362 // Correct for randomly resized listbox - bad boy, Motif!
363 if (width1 != width2 || height1 != height2)
364 SetSize (-1, -1, width1, height1);
365
366 m_noItems = 0;
367}
368
369void wxListBox::SetSelection(int N, bool select)
370{
371 m_inSetValue = TRUE;
372 if (select)
373 {
374 /*
375 if (m_windowStyle & wxLB_MULTIPLE)
376 {
377 int *selections = NULL;
378 int n = GetSelections (&selections);
379
380 // This hack is supposed to work, to make it possible to select more
381 // than one item, but it DOESN'T under Motif 1.1.
382
383 XtVaSetValues ((Widget) m_mainWidget, XmNselectionPolicy, XmMULTIPLE_SELECT, NULL);
384
385 int i;
386 for (i = 0; i < n; i++)
387 XmListSelectPos ((Widget) m_mainWidget, selections[i] + 1, FALSE);
388
389 XmListSelectPos ((Widget) m_mainWidget, N + 1, FALSE);
390
391 XtVaSetValues ((Widget) m_mainWidget, XmNselectionPolicy, XmEXTENDED_SELECT, NULL);
392 }
393 else
394 */
395 XmListSelectPos ((Widget) m_mainWidget, N + 1, FALSE);
396
397 }
398 else
399 XmListDeselectPos ((Widget) m_mainWidget, N + 1);
400
401 m_inSetValue = FALSE;
402}
403
404bool wxListBox::Selected(int N) const
405{
406 // In Motif, no simple way to determine if the item is selected.
407 wxArrayInt theSelections;
408 int count = GetSelections (theSelections);
409 if (count == 0)
410 return FALSE;
411 else
412 {
413 int j;
414 for (j = 0; j < count; j++)
415 if (theSelections[j] == N)
416 return TRUE;
417 }
418 return FALSE;
419}
420
421void wxListBox::Deselect(int N)
422{
423 XmListDeselectPos ((Widget) m_mainWidget, N + 1);
424}
425
426char *wxListBox::GetClientData(int N) const
427{
428 wxNode *node = m_clientDataList.Find ((long) N);
429 if (node)
430 return (char *) node->Data ();
431 else
432 return NULL;
433}
434
435void wxListBox::SetClientData(int N, char *Client_data)
436{
437 wxNode *node = m_clientDataList.Find ((long) N);
438 if (node)
439 node->SetData ((wxObject *)Client_data);
440 else
441 node = m_clientDataList.Append((long) N, (wxObject*) Client_data);
442}
443
444// Return number of selections and an array of selected integers
445int wxListBox::GetSelections(wxArrayInt& aSelections) const
446{
447 aSelections.Empty();
448
449 Widget listBox = (Widget) m_mainWidget;
450 int *posList = NULL;
451 int posCnt = 0;
452 bool flag = XmListGetSelectedPos (listBox, &posList, &posCnt);
453 if (flag)
454 {
455 if (posCnt > 0)
456 {
457 aSelections.Alloc(posCnt);
458
459 int i;
460 for (i = 0; i < posCnt; i++)
461 aSelections.Add(posList[i] - 1);
462
463 XtFree ((char *) posList);
464 return posCnt;
465 }
466 else
467 return 0;
468 }
469 else
470 return 0;
471}
472
473// Get single selection, for single choice list items
474int wxListBox::GetSelection() const
475{
476 Widget listBox = (Widget) m_mainWidget;
477 int *posList = NULL;
478 int posCnt = 0;
479 bool flag = XmListGetSelectedPos (listBox, &posList, &posCnt);
480 if (flag)
481 {
482 int id = -1;
483 if (posCnt > 0)
484 id = posList[0] - 1;
485 XtFree ((char *) posList);
486 return id;
487 }
488 else
489 return -1;
490}
491
492// Find string for position
493wxString wxListBox::GetString(int N) const
494{
495 Widget listBox = (Widget) m_mainWidget;
496 XmString *strlist;
497 int n;
498 XtVaGetValues (listBox, XmNitemCount, &n, XmNitems, &strlist, NULL);
499 if (N <= n && N >= 0)
500 {
501 char *txt;
502 if (XmStringGetLtoR (strlist[N], XmSTRING_DEFAULT_CHARSET, &txt))
503 {
504 wxString str(txt);
505 XtFree (txt);
506 return str;
507 }
508 else
509 return wxEmptyString;
510 }
511 else
512 return wxEmptyString;
513}
514
515void wxListBox::SetSize(int x, int y, int width, int height, int sizeFlags)
516{
517 wxWindow::SetSize(x, y, width, height, sizeFlags);
518
519 // Check resulting size is correct
520 int tempW, tempH;
521 GetSize (&tempW, &tempH);
522
523 /*
524 if (tempW != width || tempH != height)
525 {
526 cout << "wxListBox::SetSize sizes not set correctly.");
527 }
528 */
529}
530
531void wxListBox::InsertItems(int nItems, const wxString items[], int pos)
532{
533 int width1, height1;
534 int width2, height2;
535
536 Widget listBox = (Widget) m_mainWidget;
537
538 GetSize(&width1, &height1);
539
540 bool managed = XtIsManaged(listBox);
541
542 if (managed)
543 XtUnmanageChild(listBox);
544
545 XmString *text = new XmString[nItems];
546 int i;
547 // Steve Hammes: Motif 1.1 compatibility
548 // #if XmVersion > 1100
549 // Corrected by Sergey Krasnov from Steve Hammes' code
550#if XmVersion > 1001
551 for (i = 0; i < nItems; i++)
552 text[i] = XmStringCreateSimple((char*) (const char*) items[i]);
553 XmListAddItemsUnselected(listBox, text, nItems, pos+1);
554#else
555 for (i = 0; i < nItems; i++)
556 {
557 text[i] = XmStringCreateSimple((char*) (const char*) items[i]);
558 // XmListAddItemUnselected(listBox, text[i], i);
559 XmListAddItemUnselected(listBox, text[i], pos+i+1); // Another Sergey correction
560 }
561#endif
562 for (i = 0; i < nItems; i++)
563 XmStringFree(text[i]);
564
565 delete[] text;
566
567 // It seems that if the list is cleared, we must re-ask for
568 // selection policy!!
569 Arg args[3];
570 XtSetArg(args[0], XmNlistSizePolicy, XmCONSTANT);
571 if (m_windowStyle & wxLB_MULTIPLE)
572 XtSetArg(args[1], XmNselectionPolicy, XmMULTIPLE_SELECT);
573 else if (m_windowStyle & wxLB_EXTENDED)
574 XtSetArg(args[1], XmNselectionPolicy, XmEXTENDED_SELECT);
575 else XtSetArg(args[1], XmNselectionPolicy, XmBROWSE_SELECT);
576 XtSetValues(listBox,args,2) ;
577
578 if (managed)
579 XtManageChild(listBox);
580
581 GetSize(&width2, &height2);
582 // Correct for randomly resized listbox - bad boy, Motif!
583 if (width1 != width2 /*|| height1 != height2*/)
584 SetSize(-1, -1, width1, height1);
585
586 m_noItems += nItems;
587}
588
589void wxListBox::SetString(int N, const wxString& s)
590{
591 int width1, height1;
592 int width2, height2;
593
594 Widget listBox = (Widget) m_mainWidget;
595 GetSize (&width1, &height1);
596
597 XmString text = XmStringCreateSimple ((char*) (const char*) s);
598
599 // WHAT'S THE MOTIF CALL TO SET THE TEXT OF AN EXISTING
600 // ITEM???
601 // There isn't one, so delete the item and add it again.
602 XmListDeletePos (listBox, N+1);
603 XmListAddItem (listBox, text, N+1);
604
605 XmStringFree(text);
606
607 /*
608 // It seems that if the list is cleared, we must re-ask for
609 // selection policy!!
610 Arg args[3];
611 XtSetArg (args[0], XmNlistSizePolicy, XmCONSTANT);
612 if (m_windowStyle & wxLB_MULTIPLE)
613 XtSetArg (args[1], XmNselectionPolicy, XmMULTIPLE_SELECT);
614 else if (m_windowStyle & wxLB_EXTENDED)
615 XtSetArg (args[1], XmNselectionPolicy, XmEXTENDED_SELECT);
616 else
617 XtSetArg (args[1], XmNselectionPolicy, XmBROWSE_SELECT);
618 XtSetValues (listBox, args, 2);
619 */
620
621 GetSize (&width2, &height2);
622 // Correct for randomly resized listbox - bad boy, Motif!
623 if (width1 != width2 || height1 != height2)
624 SetSize (-1, -1, width1, height1);
625}
626
627int wxListBox::Number () const
628{
629 return m_noItems;
630}
631
632// For single selection items only
633wxString wxListBox::GetStringSelection () const
634{
635 int sel = GetSelection ();
636 if (sel > -1)
637 return this->GetString (sel);
638 else
639 return wxString("");
640}
641
642bool wxListBox::SetStringSelection (const wxString& s, bool flag)
643{
644 int sel = FindString (s);
645 if (sel > -1)
646 {
647 SetSelection (sel, flag);
648 return TRUE;
649 }
650 else
651 return FALSE;
652}
653
654void wxListBox::Command (wxCommandEvent & event)
655{
656 if (event.m_extraLong)
657 SetSelection (event.m_commandInt);
658 else
659 {
660 Deselect (event.m_commandInt);
661 return;
662 }
663 ProcessCommand (event);
664}
665
666void wxListBoxCallback (Widget w, XtPointer clientData,
667 XmListCallbackStruct * cbs)
668{
669/*
670 if (cbs->reason == XmCR_EXTENDED_SELECT)
671 cout << "*** Extend select\n";
672 else if (cbs->reason == XmCR_SINGLE_SELECT)
673 cout << "*** Single select\n";
674 else if (cbs->reason == XmCR_MULTIPLE_SELECT)
675 cout << "*** Multiple select\n";
676 else if (cbs->reason == XmCR_BROWSE_SELECT)
677 cout << "*** Browse select\n";
678
679 if (cbs->selection_type == XmMODIFICATION)
680 cout << "*** Modification\n";
681 else if (cbs->selection_type == XmINITIAL)
682 cout << "*** Initial\n";
683 else if (cbs->selection_type == XmADDITION)
684 cout << "*** Addition\n";
685 */
686
687 wxListBox *item = (wxListBox *) clientData;
688
689 if (item->InSetValue())
690 return;
691
692 wxCommandEvent event (wxEVT_COMMAND_LISTBOX_SELECTED, item->GetId());
693 switch (cbs->reason)
694 {
695 case XmCR_MULTIPLE_SELECT:
696 case XmCR_BROWSE_SELECT:
697 {
698 event.m_clientData = item->GetClientData (cbs->item_position - 1);
699 //event.commandString = item->GetStringSelection();
700 event.m_commandInt = cbs->item_position - 1;
701 event.m_extraLong = TRUE;
702 event.SetEventObject(item);
703 item->ProcessCommand (event);
704 //delete[] event.commandString; // Let's not store the command string any more
705 break;
706 }
707 case XmCR_EXTENDED_SELECT:
708 {
709 switch (cbs->selection_type)
710 {
711 case XmINITIAL:
712 case XmADDITION:
713 case XmMODIFICATION:
714 {
715 event.m_clientData = item->GetClientData (cbs->item_position - 1);
716 event.m_commandInt = cbs->item_position - 1;
717 event.m_extraLong = TRUE;
718 event.SetEventObject(item);
719 item->ProcessCommand (event);
720 break;
721 }
722 }
723 break;
724 }
725 }
726}
727
728/* Respond by getting the
729* designated "default button" in the action area and activate it
730* as if the user had selected it.
731*/
732void wxListBoxDefaultActionProc (Widget list_w, XtPointer client_data, XmListCallbackStruct * cbs)
733{
734 wxListBox *lbox = (wxListBox *) client_data;
735
736 wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, lbox->GetId());
737 event.SetEventObject( lbox );
738 lbox->GetEventHandler()->ProcessEvent(event) ;
739}
740
741WXWidget wxListBox::GetTopWidget() const
742{
743 return (WXWidget) XtParent( (Widget) m_mainWidget );
744}
745
746void wxListBox::ChangeFont(bool keepOriginalSize)
747{
748 wxWindow::ChangeFont(keepOriginalSize);
749}
750
751void wxListBox::ChangeBackgroundColour()
752{
753 wxWindow::ChangeBackgroundColour();
754
755 Widget parent = XtParent ((Widget) m_mainWidget);
756 Widget hsb, vsb;
757
758 XtVaGetValues (parent,
759 XmNhorizontalScrollBar, &hsb,
760 XmNverticalScrollBar, &vsb,
761 NULL);
762
763 /* TODO: should scrollbars be affected? Should probably have separate
764 * function to change them (by default, taken from wxSystemSettings)
765 */
766 wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
767 DoChangeBackgroundColour((WXWidget) hsb, backgroundColour, TRUE);
768 DoChangeBackgroundColour((WXWidget) vsb, backgroundColour, TRUE);
769
770 XtVaSetValues (hsb,
771 XmNtroughColor, backgroundColour.AllocColour(XtDisplay(hsb)),
772 NULL);
773 XtVaSetValues (vsb,
774 XmNtroughColor, backgroundColour.AllocColour(XtDisplay(vsb)),
775 NULL);
776
777 DoChangeBackgroundColour((WXWidget) parent, m_backgroundColour, TRUE);
778}
779
780void wxListBox::ChangeForegroundColour()
781{
782 wxWindow::ChangeForegroundColour();
783
784 Widget parent = XtParent ((Widget) m_mainWidget);
785 Widget hsb, vsb;
786
787 XtVaGetValues (parent,
788 XmNhorizontalScrollBar, &hsb,
789 XmNverticalScrollBar, &vsb,
790 NULL);
791 /* TODO: should scrollbars be affected? Should probably have separate
792 * function to change them (by default, taken from wxSystemSettings)
793 DoChangeForegroundColour((WXWidget) hsb, m_foregroundColour);
794 DoChangeForegroundColour((WXWidget) vsb, m_foregroundColour);
795 DoChangeForegroundColour((WXWidget) parent, m_foregroundColour);
796 */
797}
798
799