]> git.saurik.com Git - wxWidgets.git/blame - src/motif/toolbar.cpp
Improved selection mode handling in wxGrid::SelectBlock
[wxWidgets.git] / src / motif / toolbar.cpp
CommitLineData
4bb6408c 1/////////////////////////////////////////////////////////////////////////////
8a0681f9 2// Name: motif/toolbar.cpp
4bb6408c
JS
3// Purpose: wxToolBar
4// Author: Julian Smart
8a0681f9 5// Modified by: 13.12.99 by VZ during toolbar classes reorganization
4bb6408c
JS
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
8a0681f9 9// Licence: wxWindows licence
4bb6408c
JS
10/////////////////////////////////////////////////////////////////////////////
11
8a0681f9
VZ
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
4bb6408c 20#ifdef __GNUG__
8a0681f9 21 #pragma implementation "toolbar.h"
4bb6408c
JS
22#endif
23
24#include "wx/wx.h"
1a3ac83f
JS
25#include "wx/app.h"
26#include "wx/timer.h"
1ccbb61a 27#include "wx/toolbar.h"
0d57be45 28
338dd992
JJ
29#ifdef __VMS__
30#pragma message disable nosimpint
31#endif
0d57be45
JS
32#include <Xm/Xm.h>
33#include <Xm/PushBG.h>
34#include <Xm/PushB.h>
1a3ac83f 35#include <Xm/Label.h>
0d57be45
JS
36#include <Xm/ToggleB.h>
37#include <Xm/ToggleBG.h>
38#include <Xm/Form.h>
338dd992
JJ
39#ifdef __VMS__
40#pragma message enable nosimpint
41#endif
0d57be45
JS
42
43#include "wx/motif/private.h"
4bb6408c 44
8a0681f9
VZ
45// ----------------------------------------------------------------------------
46// wxWin macros
47// ----------------------------------------------------------------------------
48
49#if !USE_SHARED_LIBRARY
50IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
51#endif
4bb6408c 52
8a0681f9
VZ
53// ----------------------------------------------------------------------------
54// private functions
55// ----------------------------------------------------------------------------
4bb6408c 56
1a3ac83f 57static void wxToolButtonCallback (Widget w, XtPointer clientData,
bf6c2b35 58 XtPointer ptr);
1a3ac83f
JS
59static void wxToolButtonPopupCallback (Widget w, XtPointer client_data,
60 XEvent *event, Boolean *continue_to_dispatch);
61
8a0681f9
VZ
62// ----------------------------------------------------------------------------
63// private classes
64// ----------------------------------------------------------------------------
65
66class wxToolBarTimer : public wxTimer
1a3ac83f
JS
67{
68public:
8a0681f9 69 virtual void Notify();
1a3ac83f 70
8a0681f9
VZ
71 static Widget help_popup;
72 static Widget buttonWidget;
73 static wxString helpString;
1a3ac83f
JS
74};
75
8a0681f9
VZ
76class wxToolBarTool : public wxToolBarToolBase
77{
78public:
79 wxToolBarTool(wxToolBar *tbar,
80 int id,
81 const wxBitmap& bitmap1,
82 const wxBitmap& bitmap2,
83 bool toggle,
84 wxObject *clientData,
85 const wxString& shortHelpString,
86 const wxString& longHelpString)
87 : wxToolBarToolBase(tbar, id, bitmap1, bitmap2, toggle,
88 clientData, shortHelpString, longHelpString)
89 {
90 Init();
91 }
92
93 wxToolBarTool(wxToolBar *tbar, wxControl *control)
94 : wxToolBarToolBase(tbar, control)
95 {
96 Init();
97 }
98
99 virtual ~wxToolBarTool();
100
101 // accessors
102 void SetWidget(Widget widget) { m_widget = widget; }
103 Widget GetButtonWidget() const { return m_widget; }
104
105 void SetPixmap(Pixmap pixmap) { m_pixmap = pixmap; }
106 Pixmap GetPixmap() const { return m_pixmap; }
107
108protected:
109 void Init();
110
111 Widget m_widget;
112 Pixmap m_pixmap;
113};
114
115// ----------------------------------------------------------------------------
116// globals
117// ----------------------------------------------------------------------------
118
1a3ac83f
JS
119static wxToolBarTimer* wxTheToolBarTimer = (wxToolBarTimer*) NULL;
120
121Widget wxToolBarTimer::help_popup = (Widget) 0;
122Widget wxToolBarTimer::buttonWidget = (Widget) 0;
8a0681f9
VZ
123wxString wxToolBarTimer::helpString;
124
125// ============================================================================
126// implementation
127// ============================================================================
128
129// ----------------------------------------------------------------------------
130// wxToolBarTool
131// ----------------------------------------------------------------------------
132
982b2cfc
VZ
133wxToolBarToolBase *wxToolBar::CreateTool(int id,
134 const wxBitmap& bitmap1,
135 const wxBitmap& bitmap2,
136 bool toggle,
137 wxObject *clientData,
138 const wxString& shortHelpString,
139 const wxString& longHelpString)
8a0681f9 140{
982b2cfc 141 return new wxToolBarTool(this, id, bitmap1, bitmap2, toggle,
8a0681f9
VZ
142 clientData, shortHelpString, longHelpString);
143}
1a3ac83f 144
982b2cfc 145wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
4bb6408c 146{
982b2cfc 147 return new wxToolBarTool(this, control);
4bb6408c
JS
148}
149
8a0681f9
VZ
150void wxToolBarTool::Init()
151{
152 m_widget = (Widget)0;
153 m_pixmap = (Pixmap)0;
154}
155
156wxToolBarTool::~wxToolBarTool()
157{
982b2cfc
VZ
158 if ( m_widget )
159 XtDestroyWidget(m_widget);
160 if ( m_pixmap )
161 XmDestroyPixmap(DefaultScreenOfDisplay((Display*)wxGetDisplay()),
162 m_pixmap);
8a0681f9
VZ
163}
164
165// ----------------------------------------------------------------------------
166// wxToolBar construction
167// ----------------------------------------------------------------------------
168
169void wxToolBar::Init()
4bb6408c
JS
170{
171 m_maxWidth = -1;
172 m_maxHeight = -1;
4bb6408c
JS
173 m_defaultWidth = 24;
174 m_defaultHeight = 22;
7b28757f
JS
175 m_toolPacking = 2;
176 m_toolSeparation = 8;
177 m_xMargin = 2;
178 m_yMargin = 2;
179 m_maxRows = 100;
180 m_maxCols = 100;
8a0681f9
VZ
181}
182
183bool wxToolBar::Create(wxWindow *parent,
184 wxWindowID id,
185 const wxPoint& pos,
186 const wxSize& size,
187 long style,
188 const wxString& name)
189{
190 Init();
191
192 m_windowId = id;
193
4bb6408c 194 SetName(name);
0d57be45
JS
195 m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
196 m_foregroundColour = parent->GetForegroundColour();
4bb6408c
JS
197 m_windowStyle = style;
198
199 SetParent(parent);
200
201 if (parent) parent->AddChild(this);
202
0d57be45
JS
203 Widget parentWidget = (Widget) parent->GetClientWidget();
204
205 Widget toolbar = XtVaCreateManagedWidget("toolbar",
7fe7d506
JS
206 xmBulletinBoardWidgetClass, (Widget) parentWidget,
207 XmNmarginWidth, 0,
208 XmNmarginHeight, 0,
209 XmNresizePolicy, XmRESIZE_NONE,
210 NULL);
211/*
212 Widget toolbar = XtVaCreateManagedWidget("toolbar",
213 xmFormWidgetClass, (Widget) m_clientWidget,
0d57be45
JS
214 XmNtraversalOn, False,
215 XmNhorizontalSpacing, 0,
216 XmNverticalSpacing, 0,
1a3ac83f
JS
217 XmNleftOffset, 0,
218 XmNrightOffset, 0,
219 XmNmarginWidth, 0,
220 XmNmarginHeight, 0,
0d57be45 221 NULL);
7fe7d506 222*/
0d57be45
JS
223
224 m_mainWidget = (WXWidget) toolbar;
225
da175b2c 226 m_font = parent->GetFont();
4b5f3fe6
JS
227 ChangeFont(FALSE);
228
0d57be45
JS
229 SetCanAddEventHandler(TRUE);
230 AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y);
231
0d57be45 232 ChangeBackgroundColour();
bf6c2b35 233
0d57be45 234 return TRUE;
4bb6408c
JS
235}
236
237wxToolBar::~wxToolBar()
238{
1a3ac83f
JS
239 delete wxTheToolBarTimer;
240 wxTheToolBarTimer = NULL;
4bb6408c
JS
241}
242
8a0681f9 243bool wxToolBar::Realize()
7fe7d506 244{
8a0681f9
VZ
245 if ( m_tools.GetCount() == 0 )
246 {
247 // nothing to do
248 return TRUE;
249 }
7fe7d506
JS
250
251 // Separator spacing
252 const int separatorSize = GetToolSeparation(); // 8;
253 wxSize margins = GetToolMargins();
f3979fcc 254 int packing = GetToolPacking();
7fe7d506
JS
255 int marginX = margins.x;
256 int marginY = margins.y;
257
258 int currentX = marginX;
259 int currentY = marginY;
260
261 int buttonHeight = 0;
262
263 int currentSpacing = 0;
264
8a0681f9
VZ
265 Widget button;
266 Pixmap pixmap, insensPixmap;
267 wxBitmap bmp;
268
269 wxToolBarToolsList::Node *node = m_tools.GetFirst();
270 while ( node )
7fe7d506 271 {
8a0681f9 272 wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
7fe7d506 273
8a0681f9 274 switch ( tool->GetStyle() )
7fe7d506 275 {
8a0681f9 276 case wxTOOL_STYLE_CONTROL:
f3979fcc 277 {
66f55ec6
JS
278 wxControl* control = tool->GetControl();
279 wxSize sz = control->GetSize();
f3979fcc 280 wxPoint pos = control->GetPosition();
66f55ec6 281 control->Move(currentX, pos.y);
f3979fcc 282 currentX += sz.x + packing;
66f55ec6 283
8a0681f9 284 break;
f3979fcc 285 }
8a0681f9
VZ
286 case wxTOOL_STYLE_SEPARATOR:
287 currentX += separatorSize;
288 break;
7fe7d506 289
8a0681f9
VZ
290 case wxTOOL_STYLE_BUTTON:
291 button = (Widget) 0;
bf6c2b35 292
8a0681f9 293 if ( tool->CanBeToggled() )
7fe7d506 294 {
8a0681f9
VZ
295 button = XtVaCreateWidget("toggleButton",
296 xmToggleButtonWidgetClass, (Widget) m_mainWidget,
297 XmNx, currentX, XmNy, currentY,
e838cc14
VZ
298 XmNindicatorOn, False,
299 XmNshadowThickness, 2,
300 XmNborderWidth, 0,
301 XmNspacing, 0,
302 XmNmarginWidth, 0,
303 XmNmarginHeight, 0,
8a0681f9
VZ
304 XmNmultiClick, XmMULTICLICK_KEEP,
305 XmNlabelType, XmPIXMAP,
306 NULL);
307 XtAddCallback ((Widget) button, XmNvalueChangedCallback, (XtCallbackProc) wxToolButtonCallback,
308 (XtPointer) this);
309
310 XtVaSetValues ((Widget) button,
311 XmNselectColor, m_backgroundColour.AllocColour(XtDisplay((Widget) button)),
312 NULL);
bf6c2b35 313 }
7fe7d506 314 else
8a0681f9
VZ
315 {
316 button = XtVaCreateWidget("button",
317 xmPushButtonWidgetClass, (Widget) m_mainWidget,
318 XmNx, currentX, XmNy, currentY,
319 XmNpushButtonEnabled, True,
320 XmNmultiClick, XmMULTICLICK_KEEP,
321 XmNlabelType, XmPIXMAP,
322 NULL);
323 XtAddCallback (button,
324 XmNactivateCallback, (XtCallbackProc) wxToolButtonCallback,
325 (XtPointer) this);
326 }
7fe7d506 327
8a0681f9 328 DoChangeBackgroundColour((WXWidget) button, m_backgroundColour, TRUE);
7fe7d506 329
8a0681f9 330 tool->SetWidget(button);
7fe7d506 331
8a0681f9
VZ
332 // For each button, if there is a mask, we must create
333 // a new wxBitmap that has the correct background colour
334 // for the button. Otherwise the background will just be
335 // e.g. black if a transparent XPM has been loaded.
336 bmp = tool->GetBitmap1();
337 if ( bmp.GetMask() )
7fe7d506 338 {
8a0681f9
VZ
339 int backgroundPixel;
340 XtVaGetValues(button, XmNbackground, &backgroundPixel,
341 NULL);
342
343 wxColour col;
344 col.SetPixel(backgroundPixel);
345
e838cc14 346 bmp = wxCreateMaskedBitmap(bmp, col);
8a0681f9 347
e838cc14 348 tool->SetBitmap1(bmp);
7fe7d506 349 }
8a0681f9
VZ
350
351 // Create a selected/toggled bitmap. If there isn't a 2nd
352 // bitmap, we need to create it (with a darker, selected
353 // background)
354 int backgroundPixel;
355 if ( tool->CanBeToggled() )
356 XtVaGetValues(button, XmNselectColor, &backgroundPixel,
357 NULL);
7fe7d506 358 else
8a0681f9
VZ
359 XtVaGetValues(button, XmNarmColor, &backgroundPixel,
360 NULL);
361
362 wxColour col;
363 col.SetPixel(backgroundPixel);
364
365 if (tool->GetBitmap2().Ok() && tool->GetBitmap2().GetMask())
7fe7d506 366 {
8a0681f9
VZ
367 // Use what's there
368 wxBitmap newBitmap = wxCreateMaskedBitmap(tool->GetBitmap2(), col);
369 tool->SetBitmap2(newBitmap);
7fe7d506 370 }
8a0681f9 371 else
7fe7d506 372 {
8a0681f9
VZ
373 // Use unselected bitmap
374 if ( bmp.GetMask() )
375 {
376 wxBitmap newBitmap = wxCreateMaskedBitmap(bmp, col);
377 tool->SetBitmap2(newBitmap);
378 }
379 else
380 tool->SetBitmap2(bmp);
381 }
382
383 pixmap = (Pixmap) bmp.GetPixmap();
384 insensPixmap = (Pixmap) bmp.GetInsensPixmap();
385
386 if (tool->CanBeToggled())
387 {
388 // Toggle button
389 Pixmap pixmap2 = (Pixmap) 0;
390 Pixmap insensPixmap2 = (Pixmap) 0;
391
392 // If there's a bitmap for the toggled state, use it,
393 // otherwise generate one.
394 if (tool->GetBitmap2().Ok())
395 {
396 wxBitmap bmp2 = tool->GetBitmap2();
397 pixmap2 = (Pixmap) bmp2.GetPixmap();
398 insensPixmap2 = (Pixmap) bmp2.GetInsensPixmap();
399 }
400 else
401 {
402 pixmap2 = (Pixmap) bmp.GetArmPixmap(button);
403 insensPixmap2 = XCreateInsensitivePixmap((Display*) wxGetDisplay(), pixmap2);
404 }
405
982b2cfc
VZ
406 tool->SetPixmap(pixmap2);
407
8a0681f9 408 XtVaSetValues (button,
8a0681f9
VZ
409 XmNfillOnSelect, True,
410 XmNlabelPixmap, pixmap,
411 XmNselectPixmap, pixmap2,
412 XmNlabelInsensitivePixmap, insensPixmap,
413 XmNselectInsensitivePixmap, insensPixmap2,
414 XmNlabelType, XmPIXMAP,
415 NULL);
7fe7d506
JS
416 }
417 else
418 {
8a0681f9
VZ
419 Pixmap pixmap2 = (Pixmap) 0;
420
421 // If there's a bitmap for the armed state, use it,
422 // otherwise generate one.
423 if (tool->GetBitmap2().Ok())
424 {
425 pixmap2 = (Pixmap) tool->GetBitmap2().GetPixmap();
426 }
427 else
428 {
429 pixmap2 = (Pixmap) bmp.GetArmPixmap(button);
430
431 }
982b2cfc
VZ
432
433 tool->SetPixmap(pixmap2);
434
8a0681f9
VZ
435 // Normal button
436 XtVaSetValues(button,
437 XmNlabelPixmap, pixmap,
438 XmNlabelInsensitivePixmap, insensPixmap,
439 XmNarmPixmap, pixmap2,
440 NULL);
441 }
982b2cfc 442
8a0681f9 443 XtManageChild(button);
7fe7d506 444
8a0681f9
VZ
445 {
446 Dimension width, height;
447 XtVaGetValues(button,
448 XmNwidth, &width,
449 XmNheight, & height,
450 NULL);
f3979fcc 451 currentX += width + packing;
8a0681f9 452 buttonHeight = wxMax(buttonHeight, height);
7fe7d506 453 }
8a0681f9
VZ
454
455 XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask,
456 False, wxToolButtonPopupCallback, (XtPointer) this);
457
458 currentSpacing = 0;
459 break;
7fe7d506 460 }
8a0681f9
VZ
461
462 node = node->GetNext();
7fe7d506
JS
463 }
464
465 SetSize(-1, -1, currentX, buttonHeight + 2*marginY);
466
467 return TRUE;
468}
469
982b2cfc
VZ
470wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord WXUNUSED(x),
471 wxCoord WXUNUSED(y)) const
4bb6408c 472{
8a0681f9 473 wxFAIL_MSG( _T("TODO") );
4b5f3fe6 474
982b2cfc 475 return (wxToolBarToolBase *)NULL;
4bb6408c
JS
476}
477
982b2cfc 478bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
4bb6408c 479{
8a0681f9 480 tool->Attach(this);
4bb6408c 481
8a0681f9 482 return TRUE;
4bb6408c
JS
483}
484
982b2cfc 485bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
4bb6408c 486{
8a0681f9 487 tool->Detach();
0d57be45 488
8a0681f9 489 return TRUE;
4bb6408c
JS
490}
491
982b2cfc 492void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable)
1a3ac83f 493{
982b2cfc
VZ
494 wxToolBarTool *tool = (wxToolBarTool *)toolBase;
495
8a0681f9 496 XtSetSensitive(tool->GetButtonWidget(), (Boolean) enable);
1a3ac83f
JS
497}
498
982b2cfc 499void wxToolBar::DoToggleTool(wxToolBarToolBase *toolBase, bool toggle)
4bb6408c 500{
982b2cfc
VZ
501 wxToolBarTool *tool = (wxToolBarTool *)toolBase;
502
8a0681f9 503 XmToggleButtonSetState(tool->GetButtonWidget(), (Boolean) toggle, False);
4bb6408c
JS
504}
505
982b2cfc
VZ
506void wxToolBar::DoSetToggle(wxToolBarToolBase * WXUNUSED(tool),
507 bool WXUNUSED(toggle))
1a3ac83f 508{
982b2cfc 509 // nothing to do
1a3ac83f
JS
510}
511
8a0681f9
VZ
512// ----------------------------------------------------------------------------
513// Motif callbacks
514// ----------------------------------------------------------------------------
1a3ac83f 515
982b2cfc 516wxToolBarToolBase *wxToolBar::FindToolByWidget(WXWidget w) const
7fe7d506 517{
8a0681f9
VZ
518 wxToolBarToolsList::Node* node = m_tools.GetFirst();
519 while ( node )
520 {
521 wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
522 if ( tool->GetButtonWidget() == w)
523 {
524 return tool;
525 }
7fe7d506 526
8a0681f9
VZ
527 node = node->GetNext();
528 }
7fe7d506 529
982b2cfc 530 return (wxToolBarToolBase *)NULL;
7fe7d506
JS
531}
532
8a0681f9
VZ
533static void wxToolButtonCallback(Widget w,
534 XtPointer clientData,
535 XtPointer WXUNUSED(ptr))
1a3ac83f
JS
536{
537 wxToolBar *toolBar = (wxToolBar *) clientData;
982b2cfc 538 wxToolBarToolBase *tool = toolBar->FindToolByWidget((WXWidget) w);
8a0681f9
VZ
539 if ( !tool )
540 return;
1a3ac83f 541
8a0681f9
VZ
542 if ( tool->CanBeToggled() )
543 tool->Toggle();
544
545 if ( !toolBar->OnLeftClick(tool->GetId(), tool->IsToggled()) )
1a3ac83f 546 {
8a0681f9
VZ
547 // revert
548 tool->Toggle();
1a3ac83f 549 }
1a3ac83f
JS
550}
551
1a3ac83f 552
8a0681f9
VZ
553static void wxToolButtonPopupCallback(Widget w,
554 XtPointer client_data,
555 XEvent *event,
556 Boolean *WXUNUSED(continue_to_dispatch))
1a3ac83f
JS
557{
558 // TODO: retrieve delay before popping up tooltip from wxSystemSettings.
8a0681f9 559 static const int delayMilli = 800;
1a3ac83f 560
8a0681f9 561 wxToolBar* toolBar = (wxToolBar*) client_data;
982b2cfc 562 wxToolBarToolBase *tool = toolBar->FindToolByWidget((WXWidget) w);
1a3ac83f 563
8a0681f9
VZ
564 if ( !tool )
565 return;
1a3ac83f 566
8a0681f9
VZ
567 wxString tooltip = tool->GetShortHelp();
568 if ( !tooltip )
569 return;
1a3ac83f 570
8a0681f9
VZ
571 if (!wxTheToolBarTimer)
572 wxTheToolBarTimer = new wxToolBarTimer;
1a3ac83f 573
8a0681f9
VZ
574 wxToolBarTimer::buttonWidget = w;
575 wxToolBarTimer::helpString = tooltip;
1a3ac83f
JS
576
577 /************************************************************/
578 /* Popup help label */
579 /************************************************************/
580 if (event->type == EnterNotify)
581 {
582 if (wxToolBarTimer::help_popup != (Widget) 0)
583 {
584 XtDestroyWidget (wxToolBarTimer::help_popup);
585 XtPopdown (wxToolBarTimer::help_popup);
bf6c2b35 586 }
1a3ac83f
JS
587 wxToolBarTimer::help_popup = (Widget) 0;
588
589 // One shot
590 wxTheToolBarTimer->Start(delayMilli, TRUE);
591
592 }
593 /************************************************************/
594 /* Popdown help label */
595 /************************************************************/
596 else if (event->type == LeaveNotify)
597 {
598 if (wxTheToolBarTimer)
599 wxTheToolBarTimer->Stop();
600 if (wxToolBarTimer::help_popup != (Widget) 0)
601 {
602 XtDestroyWidget (wxToolBarTimer::help_popup);
603 XtPopdown (wxToolBarTimer::help_popup);
bf6c2b35 604 }
1a3ac83f
JS
605 wxToolBarTimer::help_popup = (Widget) 0;
606 }
1a3ac83f
JS
607}
608
609void wxToolBarTimer::Notify()
610{
611 Position x, y;
612
613 /************************************************************/
614 /* Create shell without window decorations */
615 /************************************************************/
bf6c2b35
VZ
616 help_popup = XtVaCreatePopupShell ("shell",
617 overrideShellWidgetClass, (Widget) wxTheApp->GetTopLevelWidget(),
1a3ac83f
JS
618 NULL);
619
620 /************************************************************/
621 /* Get absolute position on display of toolbar button */
622 /************************************************************/
623 XtTranslateCoords (buttonWidget,
bf6c2b35
VZ
624 (Position) 0,
625 (Position) 0,
1a3ac83f
JS
626 &x, &y);
627
628 // Move the tooltip more or less above the button
629 int yOffset = 20; // TODO: What should be really?
630 y -= yOffset;
631 if (y < yOffset) y = 0;
632
633 /************************************************************/
634 /* Set the position of the help popup */
635 /************************************************************/
bf6c2b35
VZ
636 XtVaSetValues (help_popup,
637 XmNx, (Position) x,
638 XmNy, (Position) y,
1a3ac83f 639 NULL);
bf6c2b35 640
1a3ac83f
JS
641 /************************************************************/
642 /* Create help label */
643 /************************************************************/
644 XmString text = XmStringCreateSimple ((char*) (const char*) helpString);
bf6c2b35
VZ
645 XtVaCreateManagedWidget ("help_label",
646 xmLabelWidgetClass, help_popup,
1a3ac83f 647 XmNlabelString, text,
bf6c2b35
VZ
648 XtVaTypedArg,
649 XmNforeground, XtRString, "black",
650 strlen("black")+1,
651 XtVaTypedArg,
652 XmNbackground, XtRString, "LightGoldenrod",
653 strlen("LightGoldenrod")+1,
1a3ac83f
JS
654 NULL);
655 XmStringFree (text);
656
657 /************************************************************/
658 /* Popup help label */
659 /************************************************************/
660 XtPopup (help_popup, XtGrabNone);
661}
662