cdesktopenv/cde/programs/dtprintinfo/libUI/MotifUI/MainWindow.C

286 lines
8.4 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: MainWindow.C /main/3 1995/11/06 09:42:36 rswiston $ */
/* *
* (c) Copyright 1993, 1994 Hewlett-Packard Company *
* (c) Copyright 1993, 1994 International Business Machines Corp. *
* (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
* (c) Copyright 1993, 1994 Novell, Inc. *
*/
#include "MainWindow.h"
#include "Menu.h"
#include "IconObj.h"
#include "Button.h"
#include "Sep.h"
#include <Xm/MainW.h>
#include <Xm/RowColumn.h>
#include "Icon.h"
XtActionsRec MainWindow::actions[] =
{
{"PopupMenu", (XtActionProc) &MainWindow::KeyboardPopupMenu}
};
class PopupMenuContainer : public MotifUI
{
public:
PopupMenuContainer(MotifUI *);
};
PopupMenuContainer::PopupMenuContainer(MotifUI *parent) :
MotifUI(parent, "PopupMenuContainer", NULL)
{
_w = parent->BaseWidget();
}
MainWindow::MainWindow(MotifUI *parent,
char *name,
char *widgetName,
char *icon,
char *icon_name)
: MotifUI(parent, name, NULL, widgetName)
{
CreateMainWindow(parent, name, widgetName, icon, icon_name);
}
MainWindow::MainWindow(char *category,
MotifUI *parent,
char *name,
char *widgetName,
char *icon,
char *icon_name)
: MotifUI(parent, name, category, widgetName)
{
CreateMainWindow(parent, name, widgetName, icon, icon_name);
}
void MainWindow::CreateMainWindow(MotifUI *parent, char * /*name*/,
char *widgetName, char *_icon,
char *_icon_name)
{
_w = XtVaCreateManagedWidget(widgetName, xmMainWindowWidgetClass,
parent->BaseWidget(), NULL);
XtAppAddActions(appContext, actions, XtNumber(actions));
trans = XtParseTranslationTable("#override\n <Key> osfMenu: PopupMenu()");
XtAddEventHandler(_w, ButtonPressMask, FALSE, PopupMenu, (XtPointer) this);
XtOverrideTranslations(_w, trans);
popups = new PopupMenuContainer(this);
XtVaSetValues(_w, XmNuserData, this, NULL);
LastPopupMenu = NULL;
icon = NULL;
icon_name = NULL;
IconFile(_icon);
IconName(_icon_name);
InstallHelpCB();
}
MainWindow::~MainWindow()
{
delete icon;
delete icon_name;
}
void MainWindow::IconFile(char *_icon)
{
if (_icon)
{
Pixmap pixmap, mask;
GetPixmaps(_w, _icon, &pixmap, &mask);
delete icon;
if (pixmap != XmUNSPECIFIED_PIXMAP)
{
if (depth == 1)
XtVaSetValues(XtParent(_w), XmNiconPixmap, pixmap, NULL);
else
XtVaSetValues(XtParent(_w), XmNiconPixmap, pixmap,
(mask ? XmNiconMask : NULL), mask, NULL);
icon = STRDUP(_icon);
}
else
icon = NULL;
}
}
void MainWindow::IconName(char *_icon_name)
{
delete icon_name;
if (!_icon_name)
icon_name = STRDUP(Name());
else
icon_name = STRDUP(_icon_name);
if (icon_name)
XtVaSetValues(XtParent(_w), XmNiconName, icon_name, NULL);
}
void MainWindow::SetWorkWindow(MotifUI *obj)
{
XtVaSetValues(_w, XmNworkWindow, obj->BaseWidget(), NULL);
}
Button *MainWindow::AddAction(char *name, char *category,
ButtonCallback callback,
void *callback_data, char *mnemonic,
char *acceleratorText, char *accelerator)
{
Menu *menu = (Menu *)popups->FindByCategory(category);
if (!menu)
{
menu = new Menu(category, popups, true, "", "", NULL, POPUP_MENU);
XtVaSetValues(menu->InnerWidget(), XmNpopupEnabled, False, NULL);
}
return new Button(category, menu, name, PUSH_BUTTON, callback, callback_data,
mnemonic, acceleratorText, accelerator);
}
void MainWindow::RegisterPopup(MotifUI *obj)
{
Menu *menu = (Menu *)popups->FindByCategory((char *)obj->Category());
if (!menu)
{
menu = new Menu((char *)obj->Category(), popups, true, "", "",
NULL, POPUP_MENU);
XtVaSetValues(menu->InnerWidget(), XmNpopupEnabled, False, NULL);
}
XtAddEventHandler(obj->InnerWidget(), ButtonPressMask, FALSE,
PopupMenu, (XtPointer) this);
XtOverrideTranslations(obj->InnerWidget(), trans);
XtVaSetValues(obj->InnerWidget(), XmNuserData, obj, NULL);
if (obj->UIClass() == CONTAINER)
{
switch (obj->UISubClass())
{
case SCROLLED_CANVAS:
case SCROLLED_FORM:
case SCROLLED_VERTICAL_ROW_COLUMN:
case SCROLLED_HORIZONTAL_ROW_COLUMN:
case SCROLLED_PANE:
case SCROLLED_WORK_AREA:
case SCROLLED_ICON_LIST:
XtAddEventHandler(XtParent(obj->InnerWidget()), ButtonPressMask, FALSE,
PopupMenu, (XtPointer) this);
XtOverrideTranslations(XtParent(obj->InnerWidget()), trans);
XtVaSetValues(XtParent(obj->InnerWidget()), XmNuserData, obj, NULL);
break;
}
}
}
void MainWindow::AddSep(char *category)
{
Menu *menu = (Menu *)popups->FindByCategory(category);
if (!menu)
{
menu = new Menu(category, popups, true, "", "", NULL, POPUP_MENU);
XtVaSetValues(menu->InnerWidget(), XmNpopupEnabled, False, NULL);
}
new Sep(category, menu);
}
void MainWindow::KeyboardPopupMenu(Widget widget, XEvent *event,
String * /*params*/,
Cardinal * /*num_params*/)
{
Widget focus_widget;
if (!(focus_widget = XmGetFocusWidget(widget)))
focus_widget = widget;
MotifUI *obj;
MainWindow *window;
XtVaGetValues(focus_widget, XmNuserData, &obj, NULL);
window = (MainWindow *) obj;
while (window->UIClass() != MAIN_WINDOW)
window = (MainWindow *) window->Parent();
window->PostMenu(obj, event);
}
void MainWindow::PopupMenu(Widget widget, XtPointer client_data,
XEvent *event, Boolean * /*continued*/)
{
XRectangle pixmap_rect, label_rect;
XButtonEvent * ev;
Window child, parent = 0, root;
int root_x, root_y, win_x, win_y;
unsigned int modMask;
Display * display = XtDisplay(widget);
ev = (XButtonEvent *) event;
if (ev->button != MotifUI::bMenuButton)
return;
child = XtWindow(widget);
while (child)
{
parent = child;
XQueryPointer(display, parent, &root,
&child, &root_x, &root_y, &win_x, &win_y, &modMask);
}
if (XtWindowToWidget(display, parent))
widget = XtWindowToWidget(display, parent);
MainWindow *window = (MainWindow *) client_data;
MotifUI *obj;
XtVaGetValues(widget, XmNuserData, &obj, NULL);
if (!obj)
obj = window;
if (obj->UIClass() == ICON)
{
GuiIconGetRects(widget, &pixmap_rect, &label_rect);
if (!(PointInRect(pixmap_rect, win_x, win_y) ||
PointInRect(label_rect, win_x, win_y)))
{
XtVaGetValues(XtParent(widget), XmNuserData, &obj, NULL);
}
}
window->PostMenu(obj, event);
}
void MainWindow::PostMenu(MotifUI *obj, XEvent *event)
{
BaseUI *popup_menu = popups->FindByCategory((char *)obj->Category());
if (LastPopupMenu)
XtVaSetValues(LastPopupMenu, XmNpopupEnabled, False, NULL);
Widget widget = NULL;
if (popup_menu)
{
popup_menu->Name((char *)obj->Name());
PopupObject = obj;
PopupObjectUniqueID = PopupObject->UniqueID();
widget = ((MotifUI *) popup_menu)->BaseWidget();
XtVaSetValues(widget, XmNpopupEnabled, True, NULL);
if (event->type == ButtonPress)
{
XmMenuPosition(widget, (XButtonPressedEvent *) event);
XtManageChild(widget);
}
}
else
{
PopupObject = NULL;
PopupObjectUniqueID = 0;
}
LastPopupMenu = widget;
}