cdesktopenv/cde/programs/dtfile/MultiView.c

421 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: MultiView.c /main/5 1996/10/15 10:08:30 mustafa $ */
/************************************<+>*************************************
****************************************************************************
*
* FILE: MultiView.c
*
* COMPONENT_NAME: Desktop File Manager (dtfile)
*
* Description: Contains the shared code for managing multiple toplevel
* main application window.
*
* FUNCTIONS: CreateMenuBtn
* _DtCreateMenuSystem
* _DtGlobalRestoreMenuSensitivity
* _DtGlobalSetMenuSensitivity
* _DtGlobalUpdateMenuItemState
*
* (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 <stdio.h>
#include <signal.h>
#include <pwd.h>
#include <time.h>
#include <Xm/XmP.h>
#include <Xm/CascadeBG.h>
#include <Xm/PushBG.h>
#include <Xm/RowColumn.h>
#include <Xm/SeparatoG.h>
#include <Xm/ToggleBG.h>
#include <Xm/MenuShellP.h>
#include <X11/ShellP.h>
#include <Dt/DtP.h>
#include <Dt/DtNlUtils.h>
#include <Dt/Connect.h>
#include <Xm/XmPrivate.h> /* _XmGetActiveTopLevelMenu */
#include "Encaps.h"
#include "MultiView.h"
/******** Static Function Declarations ********/
extern void _DtGlobalUpdateMenuItemState(
Widget btn,
unsigned int mask,
unsigned int on,
unsigned int * globalMenuStates) ;
extern void _DtGlobalSetMenuSensitivity(
Widget w,
XtPointer client_data,
XtPointer call_data) ;
extern void _DtGlobalRestoreMenuSensitivity(
Widget w,
XtPointer client_data,
XtPointer call_data) ;
static Widget CreateMenuBtn(
Widget parent,
Boolean isPushButton,
MenuDesc * menuDesc,
int btnIndex) ;
/******** End Static Function Declarations ********/
extern Widget * findBtn;
extern Widget * change_directoryBtn;
extern Widget * preferencesBtn;
extern Widget * defaultEnvBtn;
extern Widget * filterBtn;
Widget
_DtCreateMenuSystem(
Widget parent,
char * menuBarName,
XtCallbackProc helpCallback,
XtPointer helpData,
Boolean createSharedComponents,
MenuDesc * menuDesc,
int numMenuComponents,
void (*getMenuDataProc)(),
void (*setMenuSensitivity)(),
void (*restoreMenuSensitivity)() )
{
int n;
int i;
Arg args[20];
Widget menubar;
Widget lastCascadeBtn = NULL;
Widget lastMenuPane = NULL;
char lastMenuPaneType = MENU_PANE;
Boolean firstMenuPane = True;
Widget child;
XmString labelString;
int pulldownIndex = 1;
int menuPaneIndex = 1;
int menuBtnIndex = 1;
/* Use our own menu control functions, if none specified */
if (setMenuSensitivity == NULL)
setMenuSensitivity = _DtGlobalSetMenuSensitivity;
if (restoreMenuSensitivity == NULL)
restoreMenuSensitivity = _DtGlobalRestoreMenuSensitivity;
/* Create the pulldown menu */
n = 0;
XtSetArg(args[n], XmNorientation, XmHORIZONTAL); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
menubar = XmCreateMenuBar(parent, menuBarName, args, n);
XtManageChild(menubar);
if (helpCallback)
XtAddCallback(menubar, XmNhelpCallback, helpCallback, helpData);
for (i = 0; i < numMenuComponents; i++)
{
n = 0;
switch (menuDesc[i].type)
{
case MENU_PULLDOWN_BUTTON:
{
labelString = XmStringCreateLocalized(menuDesc[i].label);
XtSetArg(args[n], XmNlabelString, labelString); n++;
if (menuDesc[i].mnemonic)
{
XtSetArg(args[n], XmNmnemonic, menuDesc[i].mnemonic[0]); n++;
}
XtSetArg(args[n], XmNmarginWidth, 6); n++;
child = XmCreateCascadeButtonGadget(menubar, menuDesc[i].name,
args, n);
if (menuDesc[i].helpCallback)
{
XtAddCallback(child, XmNhelpCallback,
menuDesc[i].helpCallback, menuDesc[i].helpData);
}
if (menuDesc[i].isHelpBtn)
{
XtSetArg(args[0], XmNmenuHelpWidget, child);
XtSetValues(menubar, args, 1);
}
XtManageChild(child);
XmStringFree(labelString);
lastCascadeBtn = menuDesc[i].widget = child;
pulldownIndex++;
break;
}
case SHARED_MENU_PANE:
case MENU_PANE:
{
if (createSharedComponents || (menuDesc[i].type == MENU_PANE))
{
child = XmCreatePulldownMenu(menubar, menuDesc[i].name, NULL, 0);
if (firstMenuPane)
{
XtAddCallback(XtParent(child), XmNpopupCallback,
setMenuSensitivity,
(XtPointer)getMenuDataProc);
XtAddCallback(XtParent(child), XmNpopdownCallback,
restoreMenuSensitivity,
(XtPointer)getMenuDataProc);
firstMenuPane = False;
}
if (menuDesc[i].helpCallback)
{
XtAddCallback(child, XmNhelpCallback,
menuDesc[i].helpCallback, menuDesc[i].helpData);
}
menuDesc[i].widget = child;
}
lastMenuPane = menuDesc[i].widget;
lastMenuPaneType = menuDesc[i].type;
XtSetArg(args[0], XmNsubMenuId, lastMenuPane);
XtSetValues(lastCascadeBtn, args, 1);
menuBtnIndex = 1;
menuPaneIndex++;
break;
}
case MENU_TOGGLE_BUTTON:
case MENU_BUTTON:
{
/* Need to always make btns for non-shared menupanes */
if ((createSharedComponents) || (lastMenuPaneType == MENU_PANE))
{
child = CreateMenuBtn (lastMenuPane,
(menuDesc[i].type == MENU_BUTTON),
menuDesc + i, menuBtnIndex);
XtManageChild(child);
menuDesc[i].widget = child;
}
menuBtnIndex++;
break;
}
case MENU_SEPARATOR:
{
/* Need to always make components for non-shared menupanes */
if ((createSharedComponents) || (lastMenuPaneType == MENU_PANE))
{
child = XmCreateSeparatorGadget(lastMenuPane, menuDesc[i].name,
NULL, 0);
XtManageChild(child);
menuDesc[i].widget = child;
}
break;
}
}
}
return(menubar);
}
/* ARGSUSED */
void
_DtGlobalSetMenuSensitivity(
Widget w,
XtPointer client_data,
XtPointer call_data )
{
Arg menuPaneArgs[1];
Widget mbar;
XmMenuShellWidget mshell = (XmMenuShellWidget) w;
void (*getMenuData)() = (void(*)())client_data;
XtPointer mainRecord;
MenuDesc * menuDesc;
int menuItemCount;
unsigned int * globalMenuStates;
unsigned int * viewMenuStates;
int i;
_XmGetActiveTopLevelMenu(mshell->composite.children[0], &mbar);
(*getMenuData)(mbar, &mainRecord, &menuDesc, &menuItemCount,
&globalMenuStates, &viewMenuStates);
XtSetArg(menuPaneArgs[0], XmNuserData, mainRecord);
for (i = 0; i < menuItemCount; i++)
{
switch (menuDesc[i].type)
{
case SHARED_MENU_PANE:
case MENU_PANE:
{
/* Need to do this to get help working */
XtSetValues(menuDesc[i].widget, menuPaneArgs, 1);
break;
}
case MENU_BUTTON:
{
if ((menuDesc[i].maskBit) &&
((*globalMenuStates & menuDesc[i].maskBit) !=
(*viewMenuStates & menuDesc[i].maskBit)))
{
_DtGlobalUpdateMenuItemState(menuDesc[i].widget,
menuDesc[i].maskBit,
*viewMenuStates & menuDesc[i].maskBit,
globalMenuStates);
}
break;
}
}
}
}
/* ARGSUSED */
void
_DtGlobalRestoreMenuSensitivity(
Widget w,
XtPointer client_data,
XtPointer call_data )
{
Widget mbar;
XmMenuShellWidget mshell = (XmMenuShellWidget) w;
void (*getMenuData)() = (void (*)())client_data;
XtPointer mainRecord;
MenuDesc * menuDesc;
int menuItemCount;
unsigned int * globalMenuStates;
unsigned int * viewMenuStates;
int i;
_XmGetActiveTopLevelMenu(mshell->composite.children[0], &mbar);
(*getMenuData)(mbar, &mainRecord, &menuDesc, &menuItemCount,
&globalMenuStates, &viewMenuStates);
for (i = 0; i < menuItemCount; i++)
{
if (menuDesc[i].type == MENU_BUTTON)
{
if ((menuDesc[i].maskBit) &&
((*globalMenuStates & menuDesc[i].maskBit) == 0))
{
_DtGlobalUpdateMenuItemState(menuDesc[i].widget,
menuDesc[i].maskBit,
True,
globalMenuStates);
}
}
}
}
void
_DtGlobalUpdateMenuItemState(
Widget btn,
unsigned int mask,
unsigned int on,
unsigned int * globalMenuStates )
{
if (on != 0)
{
XtSetSensitive(btn, True);
*globalMenuStates |= mask;
}
else
{
if(btn != *findBtn &&
btn != *change_directoryBtn &&
btn != *preferencesBtn &&
btn != *defaultEnvBtn &&
btn != *filterBtn )
{
XtSetSensitive(btn, False);
*globalMenuStates &= ~mask;
}
}
}
static Widget
CreateMenuBtn (
Widget parent,
Boolean isPushButton,
MenuDesc * menuDesc,
int btnIndex )
{
int n;
Arg args[10];
Widget child;
XmString labelString;
n = 0;
labelString = XmStringCreateLocalized(menuDesc->label);
XtSetArg(args[n], XmNlabelString, labelString); n++;
XtSetArg(args[n], XmNmnemonic, menuDesc->mnemonic[0]); n++;
if (isPushButton)
child = XmCreatePushButtonGadget(parent, menuDesc->name, args, n);
else
{
XtSetArg(args[n], XmNvisibleWhenOff,TRUE);n++;
child = XmCreateToggleButtonGadget(parent, menuDesc->name, args, n);
}
if (menuDesc->helpCallback)
{
XtAddCallback(child, XmNhelpCallback, menuDesc->helpCallback,
menuDesc->helpData);
}
if (menuDesc->activateCallback)
{
if (isPushButton)
{
XtAddCallback(child, XmNactivateCallback, menuDesc->activateCallback,
menuDesc->activateData);
}
else
{
XtAddCallback(child, XmNvalueChangedCallback,
menuDesc->activateCallback, menuDesc->activateData);
}
}
XmStringFree(labelString);
return (child);
}