123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-2012, The Open Group. All rights reserved.
- *
- * These libraries and programs are free software; you can
- * redistribute them and/or modify them under the terms of the GNU
- * Lesser General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * These libraries and programs are distributed in the hope that
- * they will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with these libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /* $XConsortium: DialogManager.C /main/5 1996/04/21 19:32:05 drk $ */
- /*
- *+SNOTICE
- *
- * $XConsortium: DialogManager.C /main/5 1996/04/21 19:32:05 drk $
- *
- * RESTRICTED CONFIDENTIAL INFORMATION:
- *
- * The information in this document is subject to special
- * restrictions in a confidential disclosure agreement bertween
- * HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
- * document outside HP, IBM, Sun, USL, SCO, or Univel wihtout
- * Sun's specific written approval. This documment and all copies
- * and derivative works thereof must be returned or destroyed at
- * Sun's request.
- *
- * Copyright 1993 Sun Microsystems, Inc. All rights reserved.
- *
- *+ENOTICE
- */
- ///////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- // This example code is from the book:
- //
- // Object-Oriented Programming with C++ and OSF/Motif
- // by
- // Douglas Young
- // Prentice Hall, 1992
- // ISBN 0-13-630252-1
- //
- // Copyright 1991 by Prentice Hall
- // All Rights Reserved
- //
- // Permission to use, copy, modify, and distribute this software for
- // any purpose except publication and without fee is hereby granted, provided
- // that the above copyright notice appear in all copies of the software.
- ///////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////
- // DialogManager.C: Support cached dialog widgets
- //////////////////////////////////////////////////////////
- #include "DialogManager.h"
- #include "Application.h"
- #include <Xm/MessageB.h>
- #include <assert.h>
- #include <nl_types.h>
- extern nl_catd catd;
- #include "NLS.hh"
- DialogManager::DialogManager ( char *name ): UIComponent ( name )
- {
- // Empty
- }
- Widget DialogManager::getDialog()
- {
- Widget newDialog = NULL;
-
- // If the permanent widget exists and is not in use,
- // just return it
-
- if ( _w && !XtIsManaged ( _w ) )
- return _w;
-
- // Get a widget from the derived class
-
- newDialog = createDialog ( theApplication->baseWidget() ) ;
-
- // If this is a temporary dialog, install callbacks to
- // destroy it when the user pops it down.
-
- if ( _w )
- {
- XtAddCallback ( newDialog,
- XmNokCallback,
- &DialogManager::destroyTmpDialogCallback,
- (XtPointer) this );
-
- XtAddCallback ( newDialog,
- XmNcancelCallback,
- &DialogManager::destroyTmpDialogCallback,
- (XtPointer) this );
- }
- else // If this is the first dialog to be
- _w = newDialog; // created, save it to be used again.
-
- return newDialog;
- }
- Widget DialogManager::getDialog(
- Widget w
- )
- {
- Widget newDialog = NULL;
-
- // If the permanent widget exists and is not in use,
- // just return it
-
- if ( _w && !XtIsManaged ( _w ) )
- return _w;
-
- // Get a widget from the derived class
- // Parent the dialog to the widget passed in
-
- newDialog = createDialog (w);
-
- // If this is a temporary dialog, install callbacks to
- // destroy it when the user pops it down.
-
- if ( _w )
- {
- XtAddCallback ( newDialog,
- XmNokCallback,
- &DialogManager::destroyTmpDialogCallback,
- (XtPointer) this );
-
- XtAddCallback ( newDialog,
- XmNcancelCallback,
- &DialogManager::destroyTmpDialogCallback,
- (XtPointer) this );
- }
- else // If this is the first dialog to be
- _w = newDialog; // created, save it to be used again.
-
- return newDialog;
- }
- void DialogManager::destroyTmpDialogCallback ( Widget w,
- XtPointer,
- XtPointer clientData)
- {
- XtDestroyWidget ( w );
- // We must set the wiget handle to NULL to prevent multiple
- // destroys.
- ((DialogManager *)clientData)->_w = NULL;
- }
- Widget DialogManager::post (char *title,
- char *text,
- Widget wid,
- void *clientData,
- DialogCallback ok,
- DialogCallback cancel,
- DialogCallback help)
- {
- // Get a dialog widget from the cache
-
- Widget dialog = getDialog(wid);
-
- // Make sure the dialog exists, and that it is an XmMessageBox
- // or subclass, since the callbacks assume this widget type
-
- assert ( dialog != NULL );
- // assert ( XtIsSubclass ( dialog, xmMessageBoxWidgetClass ) );
-
- // Convert the text string to a compound string and
- // specify this to be the message displayed in the dialog.
-
- XmString titleStr = XmStringCreateLocalized (title);
- XmString xmstr = XmStringCreateLocalized ( text );
- XtVaSetValues ( dialog,
- XmNmessageString, xmstr,
- XmNdialogTitle, titleStr,
- NULL );
- XmStringFree ( xmstr );
- XmStringFree ( titleStr );
-
- // Create an object to carry the additional data needed
- // to cache the dialogs.
-
- DialogCallbackData *dcb = new DialogCallbackData( this,
- clientData,
- ok, cancel,
- help );
- // Install callback function for each button
- // support by Motif dialogs. If there is no help callback
- // unmanage the corresponding button instead, if possible.
- if ( ok )
- XtAddCallback ( dialog,
- XmNokCallback,
- &DialogManager::okCallback,
- (XtPointer) dcb );
- else
- {
- Widget w = XmMessageBoxGetChild ( dialog,
- XmDIALOG_OK_BUTTON );
- XtUnmanageChild ( w );
- }
- if ( cancel )
- XtAddCallback ( dialog,
- XmNcancelCallback,
- &DialogManager::cancelCallback,
- (XtPointer) dcb );
- else
- {
- Widget w = XmMessageBoxGetChild ( dialog,
- XmDIALOG_CANCEL_BUTTON );
- XtUnmanageChild ( w );
- }
-
-
- if ( help )
- XtAddCallback ( dialog,
- XmNhelpCallback,
- &DialogManager::helpCallback,
- (XtPointer) dcb );
- else
- {
- Widget w = XmMessageBoxGetChild ( dialog,
- XmDIALOG_HELP_BUTTON );
- XtUnmanageChild ( w );
- }
-
- // Post the dialog.
-
- XtManageChild ( dialog );
-
- return dialog;
- }
- Widget DialogManager::post (char *title,
- char *text,
- void *clientData,
- DialogCallback ok,
- DialogCallback cancel,
- DialogCallback help)
- {
- // Get a dialog widget from the cache
-
- Widget dialog = getDialog();
-
- // Make sure the dialog exists, and that it is an XmMessageBox
- // or subclass, since the callbacks assume this widget type
-
- assert ( dialog != NULL );
- // assert ( XtIsSubclass ( dialog, xmMessageBoxWidgetClass ) );
-
- // Convert the text string to a compound string and
- // specify this to be the message displayed in the dialog.
-
- XmString titleStr = XmStringCreateLocalized (title);
- XmString xmstr = XmStringCreateLocalized ( text );
- XtVaSetValues ( dialog,
- XmNmessageString, xmstr,
- XmNdialogTitle, titleStr,
- NULL );
- XmStringFree ( xmstr );
- XmStringFree ( titleStr );
-
- // Create an object to carry the additional data needed
- // to cache the dialogs.
-
- DialogCallbackData *dcb = new DialogCallbackData( this,
- clientData,
- ok, cancel,
- help );
- // Install callback function for each button
- // support by Motif dialogs. If there is no help callback
- // unmanage the corresponding button instead, if possible.
- if ( ok )
- XtAddCallback ( dialog,
- XmNokCallback,
- &DialogManager::okCallback,
- (XtPointer) dcb );
- else
- {
- Widget w = XmMessageBoxGetChild ( dialog,
- XmDIALOG_OK_BUTTON );
- XtUnmanageChild ( w );
- }
- if ( cancel )
- XtAddCallback ( dialog,
- XmNcancelCallback,
- &DialogManager::cancelCallback,
- (XtPointer) dcb );
- else
- {
- Widget w = XmMessageBoxGetChild ( dialog,
- XmDIALOG_CANCEL_BUTTON );
- XtUnmanageChild ( w );
- }
-
-
- if ( help )
- XtAddCallback ( dialog,
- XmNhelpCallback,
- &DialogManager::helpCallback,
- (XtPointer) dcb );
- else
- {
- Widget w = XmMessageBoxGetChild ( dialog,
- XmDIALOG_HELP_BUTTON );
- XtUnmanageChild ( w );
- }
-
- // Post the dialog.
-
- XtManageChild ( dialog );
-
- return dialog;
- }
- void DialogManager::okCallback ( Widget w,
- XtPointer clientData,
- XtPointer )
- {
- DialogCallbackData *dcd = (DialogCallbackData *) clientData;
- DialogManager *obj = (DialogManager *) dcd->dialogManager();
- DialogCallback callback;
-
- // If caller specified an ok callback, call the function
-
- if ( ( callback = dcd->ok() ) != NULL )
- ( *callback )( dcd->clientData() );
-
- // Reset for the next time
-
- obj->cleanup ( w, dcd );
- }
- void DialogManager::cancelCallback ( Widget w,
- XtPointer clientData,
- XtPointer )
- {
- DialogCallbackData *dcd = (DialogCallbackData *) clientData;
- DialogManager *obj = (DialogManager *) dcd->dialogManager();
- DialogCallback callback;
-
- if ( ( callback = dcd->cancel() ) != NULL )
- ( *callback )( dcd->clientData() );
-
- obj->cleanup ( w, dcd );
- }
- void DialogManager::helpCallback ( Widget w,
- XtPointer clientData,
- XtPointer )
- {
- DialogCallbackData *dcd = (DialogCallbackData *) clientData;
- DialogManager *obj = (DialogManager *) dcd->dialogManager();
- DialogCallback callback;
-
- if ( ( callback = dcd->help() ) != NULL )
- ( *callback )( dcd->clientData() );
-
- obj->cleanup ( w, dcd );
- }
- void DialogManager::cleanup ( Widget w, DialogCallbackData *dcd )
- {
- // Remove all callbacks to avoid having duplicate
- // callback functions installed.
-
- XtRemoveCallback ( w,
- XmNokCallback,
- &DialogManager::okCallback,
- (XtPointer) dcd );
-
- XtRemoveCallback ( w,
- XmNcancelCallback,
- &DialogManager::cancelCallback,
- (XtPointer) dcd );
-
- XtRemoveCallback ( w,
- XmNhelpCallback,
- &DialogManager::helpCallback,
- (XtPointer) dcd );
-
- // Delete the DialogCallbackData instance for this posting
-
- delete dcd;
- }
- void
- DialogManager::forceUpdate( Widget w )
- {
- Widget diashell, topshell;
- Window diawindow, topwindow;
- Display *dpy;
- XWindowAttributes xwa;
- XEvent event;
- if ( !w )
- return;
- XtAppContext cxt=XtWidgetToApplicationContext( w );
- for (diashell=w;!XtIsShell(diashell);diashell=XtParent(diashell));
- for ( topshell=diashell;XtIsTopLevelShell( topshell );
- topshell = XtParent( topshell ) );
- // if (XtIsRealized(diashell) && XtIsRealized(topshell)){
- dpy=XtDisplay(diashell);
- diawindow=XtWindow(diashell);
- topwindow=XtWindow(topshell);
- while ( XGetWindowAttributes(dpy,diawindow,&xwa) &&
- xwa.map_state != IsViewable && XEventsQueued(dpy,QueuedAlready)){
- // if ( XGetWindowAttributes( dpy, topwindow, &xwa ) &&
- // xwa.map_state != IsViewable )
- // break;
- XtAppNextEvent( cxt, &event );
- XtDispatchEvent( &event );
- }
- // }
- XmUpdateDisplay(topshell);
- }
- // Added this extra functionality
- void
- my_okCallback( int *data )
- {
- *data=1;
- }
- void
- my_cancelCallback( int *data )
- {
- *data=2;
- }
- int
- DialogManager::post_and_return(
- char *title_str,
- char *text_str,
- Widget wid
- )
- {
- int answer = 0;
- XmString okLabel, cancelLabel;
- // They may have been set via the overloaded post_and_return()
- // method before. Reset them to their default values...
- okLabel = XmStringCreateLocalized(GETMSG(catd, 1, 2, "OK"));
- cancelLabel = XmStringCreateLocalized(GETMSG(catd, 1, 3, "Cancel"));
- Widget dlg = this->getDialog(wid);
- // Make sure the dialog exists, and that it is an XmMessageBox
- // or subclass, since the callbacks assume this widget type
-
- assert ( dlg != NULL );
- XtVaSetValues(dlg,
- XmNokLabelString, okLabel,
- XmNcancelLabelString, cancelLabel,
- NULL);
- Widget dialog =
- this->post(title_str,
- text_str,
- wid,
- (void *) &answer,
- ( DialogCallback ) &my_okCallback,
- ( DialogCallback ) &my_cancelCallback);
- forceUpdate( dialog );
- while ( answer==0 )
- XtAppProcessEvent(XtWidgetToApplicationContext(dialog), XtIMAll );
- // Process just one more event to pop down dialog.
- XtAppProcessEvent(XtWidgetToApplicationContext(dialog), XtIMAll );
- return(answer);
- }
- int
- DialogManager::post_and_return(
- char *title_str,
- char *text_str,
- char *okLabelString,
- Widget wid
- )
- {
- int answer = 0;
- XmString okLabel;
- okLabel = XmStringCreateLocalized(okLabelString);
- Widget dlg = this->getDialog(wid);
- // Make sure the dialog exists, and that it is an XmMessageBox
- // or subclass, since the callbacks assume this widget type
-
- assert ( dlg != NULL );
- XtVaSetValues(dlg,
- XmNokLabelString, okLabel,
- NULL);
- Widget dialog = this->post(title_str,
- text_str,
- wid,
- (void *) &answer,
- ( DialogCallback ) &my_okCallback);
- forceUpdate( dialog );
- while ( answer==0 )
- XtAppProcessEvent(XtWidgetToApplicationContext(dialog), XtIMAll );
- // Process just one more event to pop down dialog.
- XtAppProcessEvent(XtWidgetToApplicationContext(dialog), XtIMAll );
- return(answer);
- }
- int
- DialogManager::post_and_return(
- char *title_str,
- char *text_str,
- char *okLabelString,
- char *cancelLabelString,
- Widget wid
- )
- {
- int answer = 0;
- XmString okLabel, cancelLabel;
- okLabel = XmStringCreateLocalized(okLabelString);
- cancelLabel = XmStringCreateLocalized(cancelLabelString);
- Widget dlg = this->getDialog(wid);
- // Make sure the dialog exists, and that it is an XmMessageBox
- // or subclass, since the callbacks assume this widget type
-
- assert ( dlg != NULL );
- XtVaSetValues(dlg,
- XmNokLabelString, okLabel,
- XmNcancelLabelString, cancelLabel,
- NULL);
- Widget dialog = this->post(title_str,
- text_str,
- wid,
- (void *) &answer,
- ( DialogCallback ) &my_okCallback,
- ( DialogCallback ) &my_cancelCallback);
- forceUpdate( dialog );
- while ( answer==0 )
- XtAppProcessEvent(XtWidgetToApplicationContext(dialog), XtIMAll );
- // Process just one more event to pop down dialog.
- XtAppProcessEvent(XtWidgetToApplicationContext(dialog), XtIMAll );
- return(answer);
- }
|