123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773 |
- /*
- * 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: HelpCB.c /main/7 1996/11/08 14:32:02 mustafa $ */
- /************************************<+>*************************************
- ****************************************************************************
- *
- * FILE: HelpCB.c
- *
- * COMPONENT_NAME: Desktop File Manager (dtfile)
- *
- * Description: This file contains the help callbacks for the annotator.
- *
- * FUNCTIONS: DTHelpRequestCB
- * HelpRequestCB
- * IsFilterIcon
- * IsMainWinDialog
- * IsMenuWidget
- * LocateRecordStructure
- * MapIconWidgetToFileType
- * ObjectHelp
- * ProcessItemHelp
- * ReusePrimaryHelpWindow
- * TrashHelpRequestCB
- * closeCB_mainHelpDialog
- *
- * (c) Copyright 1993, 1994, 1995 Hewlett-Packard Company
- * (c) Copyright 1993, 1994, 1995 International Business Machines Corp.
- * (c) Copyright 1993, 1994, 1995 Sun Microsystems, Inc.
- * (c) Copyright 1993, 1994, 1995 Novell, Inc.
- *
- ****************************************************************************
- ************************************<+>*************************************/
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/param.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <limits.h>
- #include <errno.h>
- #include <nl_types.h>
- #include <Xm/XmP.h>
- #include <Xm/MessageB.h>
- #include <Xm/MwmUtil.h>
- #include <X11/Shell.h>
- #include <X11/Xatom.h>
- #include <Xm/Protocols.h>
- #include <Dt/DtP.h>
- #include <Dt/UserMsg.h>
- #include <Dt/DtNlUtils.h>
- #include <Dt/FileM.h>
- #include <Dt/Action.h>
- #include <Dt/SharedProcs.h>
- #include "Encaps.h"
- #include <Dt/HelpDialog.h>
- #include "Desktop.h"
- #include "Main.h"
- #include "Help.h"
- #include "FileMgr.h"
- #include "Prefs.h"
- #include "Filter.h"
- #include "SharedMsgs.h"
- /******** Static Function Declarations ********/
- static Boolean IsMainWinDialog(
- DialogData *dialogData) ;
- static XtPointer MapIconWidgetToFileType(
- Widget w,
- FileMgrData * fileMgrData) ;
- static Boolean IsMenuWidget(
- Widget w,
- FileMgrRec * fileMgrRec,
- FileMgrData * fileMgrData,
- String * aName,
- String * ftName) ;
- static Boolean IsFilterIcon(
- Widget w,
- FileMgrData * fileMgrData,
- String * ftName) ;
- static Boolean ProcessItemHelp(
- Widget shell) ;
- static void ReusePrimaryHelpWindow(
- DialogData * primaryHelpDialog,
- char * idString,
- char * volume,
- char * topicTitle,
- char * fileType,
- int helpType) ;
- /******** End Static Function Declarations ********/
- /************************************************************************
- *
- * The main help callback
- *
- ************************************************************************/
- void
- HelpRequestCB(
- Widget w,
- XtPointer clientData,
- XtPointer callData )
- {
- XtPointer recordStruct;
- DialogData * dialogData;
- Arg args[8];
- int n;
- String topicTitle = NULL;
- int helpType;
- Boolean freeClientData;
- String fileType;
- String strVal;
- char *vol;
- char *locId;
- /* Refresh the display */
- /* printf ("in HelpRequestCB: clientdata=\"%s\"\n",(char *)clientData); */
- XmUpdateDisplay(w);
- if (recordStruct = LocateRecordStructure(w))
- {
- if (dialogData = _DtGetInstanceData(recordStruct))
- {
- if (IsMainWinDialog(dialogData))
- {
- FileMgrData * fileMgrData = (FileMgrData *)dialogData->data;
- FileMgrRec * fileMgrRec = (FileMgrRec *)recordStruct;
- /* Check for item help */
- if (clientData && strcmp(clientData, HELP_HELP_MODE_STR) == 0)
- {
- if( !ProcessItemHelp( fileMgrRec->shell ) )
- {
- char *tmpStr, *title, *msg;
- tmpStr = GetSharedMessage(ITEM_HELP_ERROR_TITLE);
- title = XtNewString(tmpStr);
- if( fileMgrData->toolbox )
- {
- tmpStr = GetSharedMessage( AMITEM_HELP_ERROR );
- msg = XtNewString(tmpStr);
- }
- else
- {
- tmpStr = GetSharedMessage( ITEM_HELP_ERROR ),
- msg = XtNewString(tmpStr);
- }
- _DtMessage(fileMgrRec->shell, title, msg, NULL,
- HelpRequestCB);
- XtFree(title);
- XtFree(msg);
- }
- return;
- }
- /* Item help comes in with a NULL client data */
- if (clientData)
- {
- fileType = NULL;
- topicTitle = NULL;
- helpType = DtHELP_TYPE_TOPIC;
- freeClientData = False;
- }
- else
- {
- if(fileMgrData->selected_file_count > 1)
- {
- Widget warn;
- String s;
- XmString xmstr;
- n=0;
- XtSetArg(args[n], XmNokLabelString, okXmString); n++;
- XtSetArg(args[n], XmNcancelLabelString, cancelXmString); n++;
- s = GETMESSAGE(29,10, "Help is not available for multiple selected objects.");
- xmstr = XmStringCreateLocalized(s);
- XtSetArg(args[n], XmNmessageString, xmstr); n++;
- XtSetArg(args[n], XmNtitle, (GETMESSAGE(29,1, "File Manager Help"))); n++;
- warn = XmCreateWarningDialog(fileMgrRec->shell, "warn_msg", args, n);
- XtUnmanageChild(XmMessageBoxGetChild(warn,XmDIALOG_HELP_BUTTON));
- XtManageChild(warn);
- XmStringFree(xmstr);
- return;
- }
- /* Action/Filetype Help */
- topicTitle = GetSharedMessage(ACTION_FT_HELP_TITLE);
- helpType = DtHELP_TYPE_DYNAMIC_STRING;
- fileType = NULL;
- /* Determine string, and set clientData accordingly */
- if ((clientData =
- MapIconWidgetToFileType(w, fileMgrData)) == NULL)
- {
- /* Not a file icon; is it an action menu item? */
- if (!IsMenuWidget(w, fileMgrRec, fileMgrData, &strVal,
- &fileType))
- {
- if (! IsFilterIcon(w, fileMgrData, &strVal))
- return;
- }
- clientData = (XtPointer)strVal;
- }
- freeClientData = True;
- }
- /* printf ("topic = %s\n", clientData); */
- /* Special check for 'Using Help'; required different volume */
- locId = (char *)clientData;
- if ((w == *usingHelp) && (strcmp(locId, HELP_HOME_TOPIC) == 0))
- vol = "Help4Help";
- else
- vol = fileMgrData->helpVol;
- if (fileMgrData->primaryHelpDialog)
- {
- ReusePrimaryHelpWindow( fileMgrData->primaryHelpDialog,
- clientData, vol, topicTitle,
- fileType, helpType);
- }
- else
- {
- /* Create the main help window for this view */
- ShowHelpDialog(fileMgrRec->shell, (XtPointer)fileMgrRec,
- MAIN_HELP_DIALOG,
- NULL, clientData, vol,
- topicTitle, fileType, helpType);
- }
- if (freeClientData)
- {
- XtFree(fileType);
- XtFree(clientData);
- }
- }
- }
- }
- else if (clientData)
- {
- Widget mainHelpDialog=NULL;
- Arg args[10];
- int i=0;
- XtSetArg(args[0],XmNuserData,&mainHelpDialog);
- XtGetValues(w,args,1);
- XtSetArg(args[i], DtNhelpType,(unsigned char) DtHELP_TYPE_TOPIC); i++;
- XtSetArg(args[i], DtNhelpVolume, DTFILE_HELP_NAME); i++;
- XtSetArg(args[i], DtNlocationId, clientData); i++;
- XtSetArg(args[i], XmNtitle, (GETMESSAGE(29,1, "File Manager Help")));i++;
- if(!mainHelpDialog || ( mainHelpDialog && !XtIsManaged(mainHelpDialog)) )
- {
- mainHelpDialog = DtCreateHelpDialog(w, "mainHelpDialog", args, i);
- XtAddCallback(mainHelpDialog, DtNcloseCallback,
- closeCB_mainHelpDialog,
- (XtPointer)NULL);
- XtManageChild(mainHelpDialog);
- XtSetArg(args[0],XmNuserData,mainHelpDialog);
- XtSetValues(w,args,1);
- }
- else
- XtSetValues(mainHelpDialog, args, i);
- }
- }
- /************************************************************************
- *
- * The main help callback for desktop items
- *
- ************************************************************************/
- void
- DTHelpRequestCB(
- Widget w,
- XtPointer clientData,
- XtPointer callData )
- {
- DesktopRec * dtInfo;
- Arg args[8];
- int n,i;
- String topicTitle = NULL;
- int helpType;
- String filetypeOrActionName;
- String fileType = NULL;
- /* Refresh the display */
- XmUpdateDisplay(w);
- /*
- * For all of the following cases, the desktop information is
- * attached as userData to the direct child of the closest shell.
- */
- if ((dtInfo = (DesktopRec *)LocateRecordStructure(w)) == NULL)
- return;
- /*
- * If the clientData is not NULL, then it represents the topic string.
- */
- if (clientData)
- {
- helpType = DtHELP_TYPE_TOPIC;
- filetypeOrActionName = clientData;
- }
- else
- {
- /* Context sensitive help (menu items or the file icon) */
- if (XtParent(w) == desktop_data->popupMenu->popup)
- {
- /*
- * One of the action related menu items. The command
- * string for the action is attached as userData.
- */
- topicTitle = GetSharedMessage(ACTION_FT_HELP_TITLE);
- helpType = DtHELP_TYPE_DYNAMIC_STRING;
- XtSetArg(args[0], XmNuserData, &filetypeOrActionName);
- XtGetValues(w, args, 1);
- /* Get the filetype from the active item */
- fileType = dtInfo->file_view_data->file_data->logical_type;
- }
- else
- {
- /* The desktop icon itself */
- topicTitle = GetSharedMessage(ACTION_FT_HELP_TITLE);
- helpType = DtHELP_TYPE_DYNAMIC_STRING;
- /* Determine string, and set clientData accordingly */
- filetypeOrActionName = dtInfo->file_view_data->file_data->logical_type;
- }
- }
- /* printf ("topic = %s\n", filetypeOrActionName); */
- for(i=0;i<desktop_data->numWorkspaces;i++)
- if(desktop_data->workspaceData[i]->number == dtInfo->workspace_num)
- break;
- if(desktop_data->workspaceData[i]->primaryHelpDialog)
- {
- ReusePrimaryHelpWindow(desktop_data->workspaceData[i]->primaryHelpDialog,
- filetypeOrActionName, DTFILE_HELP_NAME,
- topicTitle, fileType, helpType);
- }
- else
- {
- /* Create the main help window for this workspace */
- ShowDTHelpDialog(NULL, i, MAIN_HELP_DIALOG,
- NULL, filetypeOrActionName, DTFILE_HELP_NAME,
- topicTitle, fileType, helpType);
- }
- }
- /************************************************************************
- *
- * The trash window's help callback
- *
- ************************************************************************/
- void
- TrashHelpRequestCB(
- Widget w,
- XtPointer clientData,
- XtPointer callData )
- {
- Arg args[5];
- char *vol;
- char *locId;
- /* Refresh the display */
- XmUpdateDisplay(w);
- /* printf ("topic = %s\n", clientData); */
- /* Check for item help */
- if (strcmp(clientData, HELP_HELP_MODE_STR) == 0)
- {
- if( ! ProcessItemHelp(trashShell) )
- {
- char *tmpStr, *title, *msg;
- tmpStr = GetSharedMessage(ITEM_HELP_ERROR_TITLE);
- title = XtNewString(tmpStr);
- tmpStr = GetSharedMessage( ITEM_HELP_ERROR ),
- msg = XtNewString(tmpStr);
- _DtMessage(trashShell, title, msg, NULL,
- HelpRequestCB);
- XtFree(title);
- XtFree(msg);
- }
- return;
- }
- /* Special check for 'Using Help'; required different volume */
- locId = (char *)clientData;
- if ((w == *usingHelpTrash) && (strcmp(locId, HELP_HOME_TOPIC) == 0))
- vol = "Help4Help";
- else
- vol = DTFILE_HELP_NAME;
- if (primaryTrashHelpDialog)
- {
- ReusePrimaryHelpWindow(primaryTrashHelpDialog,
- clientData, vol, NULL, NULL, DtHELP_TYPE_TOPIC);
- }
- else
- {
- /* Create the main help window for this view */
- ShowTrashHelpDialog(trashShell, MAIN_HELP_DIALOG, NULL, clientData,
- vol);
- }
- }
- /*
- * Given a widget, trace up through its ancestors, until you come to the
- * shell. Get the userData from the shell's child; this gets the 'record'
- * structure, which can then be used to determine which view's help window
- * to use.
- */
- XtPointer
- LocateRecordStructure(
- Widget w )
- {
- Arg args[2];
- XtPointer recordPtr;
- while (XtParent(w) && !XtIsShell(XtParent(w)))
- w = XtParent(w);
- if (XtParent(w))
- {
- XtSetArg(args[0], XmNuserData, &recordPtr);
- XtGetValues(w, args, 1);
- return(recordPtr);
- }
- return(NULL);
- }
- /*
- * Check to see if this is the dialog data for one of the top level
- * application windows.
- */
- static Boolean
- IsMainWinDialog(
- DialogData * dialogData )
- {
- int i;
- for (i = 0; i < view_count; i++)
- {
- if (view_set[i]->dialog_data == (XtPointer)dialogData)
- return(True);
- }
- if( (FileMgrData *)dialogData->data == trashFileMgrData)
- return(True);
- return(False);
- }
- /*
- * The application must free up the returned string.
- */
- static XtPointer
- MapIconWidgetToFileType(
- Widget w,
- FileMgrData * fileMgrData )
- {
- int i;
- int j;
- int directoryCount;
- char * ftName;
- /* Based on whether in directory graph mode */
- if (fileMgrData->show_type == SINGLE_DIRECTORY)
- directoryCount = 1;
- else
- directoryCount = fileMgrData->directory_count;
- for (i = directoryCount - 1; i >= 0; i--)
- {
- for (j = 0; j < fileMgrData->directory_set[i]->file_count; j++)
- {
- if (w == fileMgrData->directory_set[i]->file_view_data[j]->widget)
- {
- ftName =
- fileMgrData->directory_set[i]->file_view_data[j]->file_data->logical_type;
- return (XtNewString(ftName));
- }
- }
- }
- /* The icon was unknown; should never happen */
- return(NULL);
- }
- /*
- * This function takes a widget, and determines if it is one of the
- * menu buttons in the action menupane, or the action popup. If so,
- * then it returns the action name and the associated filetype string.
- *
- * The caller must free up the returned string values.
- */
- static Boolean
- IsMenuWidget(
- Widget w,
- FileMgrRec * fileMgrRec,
- FileMgrData * fileMgrData,
- String * aName,
- String * ftName )
- {
- int i;
- CompositeWidget action_pane = (CompositeWidget)fileMgrRec->action_pane;
- String actionName;
- Arg args[2];
- if (action_pane == NULL)
- return(False);
- /* First, check if this is a menubar item */
- for (i = 0; i < action_pane->composite.num_children; i++)
- {
- if (w == action_pane->composite.children[i])
- {
- XtSetArg(args[0], XmNuserData, &actionName);
- XtGetValues(w, args, 1);
- *aName = XtNewString(actionName);
- /* Get the filetype from the active item */
- *ftName = XtNewString(
- fileMgrData->selection_list[0]->file_data->logical_type);
- return (True);
- }
- }
- /* Secondly, check if this is a fileMgr popup item */
- if (XtParent(w) == fileMgrPopup.menu)
- {
- XtSetArg(args[0], XmNuserData, &actionName);
- XtGetValues(w, args, 1);
- *aName = XtNewString(actionName);
- /* Get the filetype from the active item */
- *ftName = XtNewString(
- fileMgrData->popup_menu_icon->file_data->logical_type);
- fileMgrData->popup_menu_icon = NULL;
- return (True);
- }
- /* This was not a menu item */
- return(False);
- }
- /*
- * This function takes a widget, and determines if it is one of the
- * filetype icons in the filter dialog. If so, then it returns the
- * filetype string associated with the icon.
- *
- * The caller must free up the returned string values.
- */
- static Boolean
- IsFilterIcon(
- Widget w,
- FileMgrData * fileMgrData,
- String * ftName )
- {
- Arg args[2];
- DialogData * filterEditDialogData;
- FilterData * filterData;
- FilterRec * filterRec;
- FTData * filterEntryData;
- filterEditDialogData = fileMgrData->filter_edit;
- if (!filterEditDialogData)
- return(False);
- filterData = (FilterData *)filterEditDialogData->data;
- if (!filterData->displayed)
- return(False);
- filterRec = (FilterRec *) _DtGetDialogInstance(filterEditDialogData);
- /* Check if the parent of the widget is the filter's drawingArea */
- if (XtParent(w) != filterRec->file_window)
- return(False);
- /*
- * Each icon in the filter dialog has attached as its userData a
- * pointer to a structure of information about the associated
- * filetype; get this structure, to get the filetype index.
- */
- XtSetArg(args[0], XmNuserData, &filterEntryData);
- XtGetValues(w, args, 1);
- *ftName = XtNewString(filterEntryData->filetype);
- return (True);
- }
- static Boolean
- ProcessItemHelp(
- Widget shell )
- {
- Widget selectedWidget;
- int returnVal;
- returnVal = DtHelpReturnSelectedWidgetId(shell, 0, &selectedWidget);
- switch(returnVal)
- {
- case DtHELP_SELECT_VALID:
- {
- while (!XtIsShell(selectedWidget))
- {
- if (XtHasCallbacks(selectedWidget, XmNhelpCallback)
- == XtCallbackHasSome)
- {
- XtCallCallbacks(selectedWidget,
- XmNhelpCallback, NULL);
- return True;
- }
- selectedWidget = XtParent(selectedWidget);
- }
- break;
- }
- case DtHELP_SELECT_INVALID:
- return False;
- case DtHELP_SELECT_ABORT:
- case DtHELP_SELECT_ERROR:
- default:
- break;
- }
- return True;
- }
- static void
- ReusePrimaryHelpWindow(
- DialogData * primaryHelpDialog,
- char * idString,
- char * volume,
- char * topicTitle,
- char * fileType,
- int helpType )
- {
- HelpData * helpData;
- HelpRec * helpRec;
- String helpString = NULL;
- int n;
- Arg args[10];
- /* Reuse the existing main help window for this view */
- helpData = (HelpData *)primaryHelpDialog->data;
- XtFree(helpData->idString);
- XtFree(helpData->volString);
- XtFree(helpData->topicTitle);
- XtFree(helpData->fileType);
- helpData->idString = XtNewString(idString);
- helpData->volString = XtNewString(volume);
- helpData->topicTitle = XtNewString(topicTitle);
- helpData->fileType = XtNewString(fileType);
- helpData->helpType = helpType;
- helpRec = (HelpRec *) _DtGetDialogInstance(primaryHelpDialog);
- n = 0;
- XtSetArg(args[n], DtNhelpType, (unsigned char )helpType); n++;
- XtSetArg(args[n], DtNhelpType, helpType); n++;
- if (helpType == DtHELP_TYPE_TOPIC)
- {
- XtSetArg(args[n], DtNlocationId, helpData->idString); n++;
- }
- else
- {
- helpString = MapFileTypeToHelpString(helpData->idString,
- helpData->fileType);
- XtSetArg(args[n], DtNstringData, helpString); n++;
- XtSetArg(args[n], DtNtopicTitle, helpData->topicTitle); n++;
- }
- XtSetValues(helpRec->helpDialog, args, n);
- XtFree(helpString);
- }
- void
- ObjectHelp(
- Widget w,
- XtPointer clientData,
- XtPointer callData )
- {
- XtCallCallbacks((Widget)clientData, XmNhelpCallback, NULL);
- }
- /******************************************************************************/
- /* */
- /* closeCB_mainHelpDialog */
- /* */
- /* INPUT: Widget wid - widget id */
- /* XtPointer cd - client data */
- /* XtPointer cbs - callback data */
- /* OUTPUT: none */
- /* */
- /******************************************************************************/
- void
- closeCB_mainHelpDialog(Widget wid, XtPointer client_data,
- XtPointer cbs)
- {
- XtDestroyWidget(wid);
- }
|