cdesktopenv/cde/programs/dtfile/dtcopy/utils.c

447 lines
12 KiB
C

/*
* 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: utils.c /main/5 1996/10/17 09:36:36 mustafa $ */
/************************************<+>*************************************
****************************************************************************
*
* FILE: utils.c
*
*
* DESCRIPTION: Utility routines
*
* FUNCTIONS: Create_Action_Area
* Display_Help
* Get_Help_Dialog
* Help
* _DtChildPosition
* help_callback
* help_close_callback
* help_hyperyperlink_callback
*
* (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 <time.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <Xm/XmP.h>
#include <Xm/Xm.h>
#include <Xm/VendorSEP.h>
#include <Xm/PushB.h>
#include <Xm/Form.h>
#include <Xm/BulletinB.h>
#include <Xm/TextF.h>
/* Copied from Xm/BaseClassI.h */
extern XmWidgetExtData _XmGetWidgetExtData(
Widget widget,
#if NeedWidePrototypes
unsigned int extType) ;
#else
unsigned char extType) ;
#endif /* NeedWidePrototypes */
#include <Dt/HelpDialog.h>
#include "dtcopy.h"
#include "sharedFuncs.h"
/*............... definitions for Help .............................*/
void
Help(
char *helpVolume,
char *locationId);
void
Display_Help(
char *helpVolume,
char *locationId);
/* Help volume tags used to attach a certian help volume
* to a particular call back. Look to function help_callback
* for more code. MJT
*/
#define HELP_USING_HELP_VOLUME "Help4Help"
#define HELP_USING_STR "_HomeTopic"
#define HELP_VOLUME "Filemgr"
#define HELP_HELP_MENU_STR "Reference"
#define HELP_INTRODUCTION_STR "_HomeTopic"
#define HELP_DIR_COPY_STR "FMCopyDirDialogStatusDE"
#define HELP_DIR_ERROR_STR "FMCopyDIrDialogErrorDE"
#define HELP_OVERWRITE_STR "FMCopyDirOverDialogDE"
#define HELP_VERSION_STR "FMHelpMenuDE"
#define STOPW_HELP_STR "FMCopyFoldWarnDialogDE"
/*--------------------------------------------------------------------
* Callback routines
*------------------------------------------------------------------*/
void
help_close_callback(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
XtUnmapWidget(XtParent(widget));
}
void
help_hyperyperlink_callback(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
DtHelpDialogCallbackStruct *pHyper = (DtHelpDialogCallbackStruct *) call_data;
switch(pHyper->hyperType)
{
case DtHELP_LINK_JUMP_NEW:
Display_Help(pHyper->helpVolume, pHyper->locationId);
break;
default:
;
}
}
void
help_callback(
Widget widget,
XtPointer client_data,
XtPointer call_data)
{
char *helpVolume, *locationId;
int topic;
topic = (int)(XtArgVal) client_data;
helpVolume = HELP_VOLUME;
switch (topic)
{
case HELP_HELP_MENU:
locationId = HELP_HELP_MENU_STR;
break;
case HELP_INTRODUCTION:
locationId = HELP_INTRODUCTION_STR;
break;
case HELP_DIR_COPY:
locationId = HELP_DIR_COPY_STR;
break;
case HELP_DIR_ERROR:
locationId = HELP_DIR_ERROR_STR;
break;
case HELP_OVERWRITE:
locationId = HELP_OVERWRITE_STR;
break;
case HELP_USING:
locationId = HELP_USING_STR;
helpVolume = HELP_USING_HELP_VOLUME;
break;
case HELP_VERSION:
locationId = HELP_VERSION_STR;
break;
case STOPW_HELP_DIALOG:
locationId = STOPW_HELP_STR;
break;
default:
locationId = HELP_USING_STR;
helpVolume = HELP_USING_HELP_VOLUME;
break;
}
Help(helpVolume, locationId);
}
/*--------------------------------------------------------------------
* _DtChildPosition
*------------------------------------------------------------------*/
void
_DtChildPosition(
Widget w,
Widget parent,
Position *newX,
Position *newY)
{
Position pY, pX;
XmVendorShellExtObject vendorExt;
XmWidgetExtData extData;
int xOffset, yOffset;
int pHeight, myHeight, sHeight;
int pWidth, myWidth, sWidth;
enum { posRight, posBelow, posLeft, posAbove } pos;
int space;
/* get x, y offsets for the parent's window frame */
extData = _XmGetWidgetExtData(parent, XmSHELL_EXTENSION);
if (extData)
{
vendorExt = (XmVendorShellExtObject)extData->widget;
xOffset = vendorExt->vendor.xOffset;
yOffset = vendorExt->vendor.yOffset;
}
else
xOffset = yOffset = 0;
/* get size/position of screen, parent, and widget */
sHeight = HeightOfScreen(XtScreen(parent));;
sWidth = WidthOfScreen(XtScreen(parent));
pX = XtX(parent) - xOffset;
pY = XtY(parent) - yOffset;
pHeight = XtHeight(parent) + yOffset + xOffset;
pWidth = XtWidth(parent) + 2*xOffset;
myHeight = XtHeight(w) + yOffset + xOffset;
myWidth = XtWidth(w) + 2*xOffset;
{
XWindowAttributes attr;
XGetWindowAttributes(XtDisplay(parent), XtWindow(parent), &attr);
}
/*
* Determine how much space would be left if the child was positioned
* to the right, below, left, or above the parent. Choose the child
* positioning so that the maximum space is left.
*/
pos = posRight;
space = sWidth - (pX + pWidth + myWidth);
if (sHeight - (pY + pHeight + myHeight) > space)
{
pos = posBelow;
space = sHeight - (pY + pHeight + myHeight);
}
if (pX - myWidth > space)
{
pos = posLeft;
space = pX - myWidth;
}
if (pY - myHeight > space)
{
pos = posAbove;
space = pY - myHeight;
}
/* Given relative positioning, determine x, y coordinates for the child */
switch (pos)
{
case posRight:
*newX = pX + pWidth + 5;
*newY = pY + (pHeight - myHeight)/2;
break;
case posBelow:
*newX = pX + (pWidth - myWidth)/2;
*newY = pY + pHeight + 5;
break;
case posLeft:
*newX = pX - myWidth - 5;
*newY = pY + (pHeight - myHeight)/2;
break;
case posAbove:
*newX = pX + (pWidth - myWidth)/2;
*newY = pY - myHeight - 5;
break;
}
}
static Widget
Get_Help_Dialog(void)
{
Widget dialog;
Arg args[5];
int n;
n = 0;
XtSetArg(args[n], XmNtitle, GETMESSAGE(6, 5, "Directory Copy Help")); n++;
dialog = DtCreateHelpDialog(G_toplevel, "helpDlg", args, n);
XtAddCallback(dialog, DtNhyperLinkCallback,
(XtCallbackProc)help_hyperyperlink_callback, NULL);
XtAddCallback(dialog, DtNcloseCallback,
(XtCallbackProc)help_close_callback, NULL);
return dialog;
}
void
Display_Help(
char *helpVolume,
char *locationId)
{
Arg args[10];
int n;
G_help_dialog = Get_Help_Dialog();
n = 0;
XtSetArg(args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
XtSetArg(args[n], DtNhelpVolume, helpVolume); n++;
XtSetArg(args[n], DtNlocationId, locationId); n++;
XtSetValues(G_help_dialog, args, n);
XtManageChild(G_help_dialog);
XtMapWidget(XtParent(G_help_dialog));
}
void
Help(
char *helpVolume,
char *locationId)
{
Arg args[10];
int n;
if(G_help_dialog == NULL)
{
n = 0;
XtSetArg(args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
XtSetArg(args[n], DtNhelpVolume, helpVolume); n++;
XtSetArg(args[n], DtNlocationId, locationId); n++;
XtSetArg (args[n], XmNtitle, GETMESSAGE(6, 5, "Directory Copy Help")); n++;
G_help_dialog = DtCreateHelpDialog(G_toplevel, "helpDlg", args, n);
XtAddCallback(G_help_dialog, DtNhyperLinkCallback,
(XtCallbackProc)help_hyperyperlink_callback, NULL);
XtAddCallback(G_help_dialog, DtNcloseCallback,
(XtCallbackProc)help_close_callback, NULL);
XtManageChild(G_help_dialog);
}
else
{
n = 0;
XtSetArg(args[n], DtNhelpType, DtHELP_TYPE_TOPIC); n++;
XtSetArg(args[n], DtNhelpVolume, helpVolume); n++;
XtSetArg(args[n], DtNlocationId, locationId); n++;
XtSetValues(G_help_dialog, args, n);
}
XtMapWidget(XtParent(G_help_dialog));
}
/*--------------------------------------------------------------------
*
* Create Action Area
*
* Use of this function requires #include "sharedFuncs.h"
* The source for Create_Action_Area is in dtfile/OverWrite.c and
* dtfile/dtcopy/utils.c. Because it uses GETMESSAGE, it could not
* be placed in dtcopy/sharedFunc.c.
*
*------------------------------------------------------------------*/
Widget
Create_Action_Area(
Widget parent_widget,
ActionAreaDefn actions,
Widget *pushbutton_array)
{
Widget action_area, widget;
int i;
int fractbase_value;
XmString xm_string;
if (actions.defaultAction < 0 || actions.defaultAction > actions.numActions-1)
actions.defaultAction = 0;
fractbase_value = (TIGHTNESS * actions.numActions) - 1;
action_area = XtVaCreateManagedWidget("action_area", xmFormWidgetClass ,parent_widget,
XmNfractionBase, fractbase_value,
XmNleftAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
for (i=0; i < actions.numActions ;i++ )
{
xm_string = XmStringCreateLocalized(GETMESSAGE(actions.actionList[i].msg_set,
actions.actionList[i].msg_num,
actions.actionList[i].label));
widget = XtVaCreateManagedWidget(actions.actionList[i].label,
xmPushButtonWidgetClass, action_area,
XmNleftAttachment, (i ? XmATTACH_POSITION: XmATTACH_FORM),
XmNleftPosition, (TIGHTNESS * i),
XmNtopAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
XmNrightAttachment,
((i != (actions.numActions - 1)) ? XmATTACH_POSITION: XmATTACH_FORM),
XmNrightPosition, ((TIGHTNESS*i) + (TIGHTNESS - 1)),
XmNshowAsDefault, (i == actions.defaultAction),
XmNdefaultButtonShadowThickness, 1,
XmNlabelString, xm_string,
NULL);
XmStringFree(xm_string);
if (actions.actionList[i].callback)
{
XtAddCallback(widget, XmNactivateCallback,
actions.actionList[i].callback, actions.actionList[i].data);
}
if (i == actions.defaultAction)
{
XtArgVal arg;
Dimension height, h;
XtVaGetValues (action_area, XmNmarginHeight, &arg, NULL);
h = (Dimension)arg;
XtVaGetValues (widget, XmNheight, &arg, NULL);
height = (Dimension)arg;
height +=2 * h;
XtVaSetValues (action_area,
XmNdefaultButton, widget,
XmNpaneMaximum, height,
XmNpaneMinimum, height,
NULL);
}
if (pushbutton_array != NULL)
pushbutton_array[i] = widget;
} /* endfor */
XtManageChild(action_area);
return action_area;
} /* end Create_Action_Area */