1265 lines
43 KiB
C
1265 lines
43 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
|
|
*/
|
|
/* $TOG: dtpad.c /main/14 1999/09/15 15:15:02 mgreess $ */
|
|
/**********************************<+>*************************************
|
|
***************************************************************************
|
|
**
|
|
** File: dtpad.c
|
|
**
|
|
** Project: DT dtpad, a memo maker type editor based on the Dt Editor
|
|
** widget.
|
|
**
|
|
** Description:
|
|
** -----------
|
|
**
|
|
** This file contains routines that create the dtpad menu bar widget
|
|
** and the Dt Editor widget.
|
|
**
|
|
*******************************************************************
|
|
** (c) Copyright Hewlett-Packard Company, 1990, 1991, 1992, 1993.
|
|
** All rights are
|
|
** reserved. Copying or other reproduction of this program
|
|
** except for archival purposes is prohibited without prior
|
|
** written consent of Hewlett-Packard Company.
|
|
********************************************************************
|
|
**
|
|
********************************************************************
|
|
** (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 "dtpad.h"
|
|
#include "signal.h"
|
|
#include "X11/Xutil.h"
|
|
#include <X11/StringDefs.h>
|
|
#include <Dt/HourGlass.h>
|
|
#include <Dt/Wsm.h>
|
|
|
|
#ifndef NO_MESSAGE_CATALOG
|
|
# define TRUE 1
|
|
# define FALSE 0
|
|
# include <Dt/MsgCatP.h>
|
|
#endif
|
|
|
|
extern Editor *pPadList; /* declared in main.c */
|
|
extern int numActivePads; /* declared in main.c */
|
|
extern Widget topLevelWithWmCommand; /* declared in main.c */
|
|
|
|
|
|
/************************************************************************
|
|
* CreateDefaultImage - create a default image for the warning symbol.
|
|
*
|
|
************************************************************************/
|
|
void
|
|
CreateDefaultImage(
|
|
char *bits,
|
|
int width,
|
|
int height,
|
|
char *name )
|
|
{
|
|
XImage *image; /* image for warning pixmap */
|
|
|
|
image = (XImage *) XtMalloc (sizeof (XImage));
|
|
image->width = width;
|
|
image->height = height;
|
|
image->data = bits;
|
|
image->depth = 1;
|
|
image->xoffset = 0;
|
|
image->format = XYBitmap;
|
|
image->byte_order = LSBFirst;
|
|
image->bitmap_unit = 8;
|
|
image->bitmap_bit_order = LSBFirst;
|
|
image->bitmap_pad = 8;
|
|
image->bytes_per_line = (width+7)/8;
|
|
XmInstallImage (image, name);
|
|
}
|
|
|
|
|
|
/*
|
|
* The following functions are multibyte-aware string handling routines,
|
|
* including MbStrchr, MbStrrchr, and MbBasename. These routines are
|
|
* used as substitutes for the single-byte-only strchr and strrchr routines.
|
|
*
|
|
*
|
|
* [SuG 5/12/95] Added MbStrchri which does exactly MbStrchr, but also returns
|
|
* index.
|
|
*/
|
|
|
|
/************************************************************************
|
|
* MbStrchr -
|
|
************************************************************************/
|
|
char *
|
|
MbStrchr(
|
|
char *str,
|
|
int ch)
|
|
{
|
|
size_t mbCurMax = MB_CUR_MAX;
|
|
wchar_t targetChar, curChar;
|
|
char tmpChar;
|
|
int i, numBytes, byteLen;
|
|
|
|
if(mbCurMax <= 1) return strchr(str, ch);
|
|
|
|
tmpChar = (char)ch;
|
|
mbtowc(&targetChar, &tmpChar, mbCurMax);
|
|
for(i = 0, numBytes = 0, byteLen = strlen(str); i < byteLen; i += numBytes)
|
|
{
|
|
numBytes = mbtowc(&curChar, &str[i], mbCurMax);
|
|
if(curChar == targetChar) return &str[i];
|
|
}
|
|
return (char *)NULL;
|
|
}
|
|
|
|
/************************************************************************
|
|
* MbStrchri -
|
|
************************************************************************/
|
|
char *
|
|
MbStrchri(
|
|
char *str,
|
|
int ch, int* in)
|
|
{
|
|
size_t mbCurMax = MB_CUR_MAX;
|
|
wchar_t targetChar, curChar;
|
|
char tmpChar;
|
|
int i, j, numBytes, byteLen;
|
|
|
|
/*if(mbCurMax <= 1) return strchr(str, ch);*/
|
|
|
|
tmpChar = (char)ch;
|
|
mbtowc(&targetChar, &tmpChar, mbCurMax);
|
|
for(i = 0, j = 0, numBytes = 0, byteLen = strlen(str); i < byteLen;
|
|
i += numBytes, j++)
|
|
{
|
|
numBytes = mbtowc(&curChar, &str[i], mbCurMax);
|
|
if(curChar == targetChar) {
|
|
*in = j;
|
|
return &str[i];
|
|
}
|
|
}
|
|
*in = -1;
|
|
return (char *)NULL;
|
|
}
|
|
|
|
/************************************************************************
|
|
* MbStrrchr -
|
|
************************************************************************/
|
|
char *
|
|
MbStrrchr(
|
|
char *str,
|
|
int ch)
|
|
{
|
|
size_t mbCurMax = MB_CUR_MAX;
|
|
wchar_t targetChar, curChar;
|
|
char tmpChar, *lastChar;
|
|
int i, numBytes, byteLen;
|
|
|
|
if(mbCurMax <= 1) return strrchr(str, ch);
|
|
|
|
tmpChar = (char)ch;
|
|
mbtowc(&targetChar, &tmpChar, mbCurMax);
|
|
for(i = 0, numBytes = 0, lastChar = (char *)NULL, byteLen = strlen(str);
|
|
i < byteLen; i += numBytes)
|
|
{
|
|
numBytes = mbtowc(&curChar, &str[i], mbCurMax);
|
|
if(curChar == targetChar) lastChar = &str[i];
|
|
}
|
|
|
|
return lastChar;
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* MbBasename -
|
|
************************************************************************/
|
|
char *
|
|
MbBasename(
|
|
char *str)
|
|
{
|
|
char *lastSlash;
|
|
|
|
lastSlash = MbStrrchr(str, '/');
|
|
|
|
if(lastSlash != (char *)NULL)
|
|
return lastSlash + 1;
|
|
else
|
|
return str;
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* ChangeMainWindowTitle - If necessary, put file name in window title
|
|
************************************************************************/
|
|
void
|
|
ChangeMainWindowTitle(
|
|
Editor *pPad)
|
|
{
|
|
Arg al[5];
|
|
char *name;
|
|
char *title;
|
|
Boolean freeName = False;
|
|
XTextProperty textProp;
|
|
|
|
/* Should happen only when creating a new view */
|
|
if (!XtIsRealized(pPad->app_shell))
|
|
return;
|
|
|
|
if (pPad->ttEditReq.contract &&
|
|
(pPad->ttEditReq.docName && *pPad->ttEditReq.docName)) {
|
|
name = pPad->ttEditReq.docName;
|
|
} else if (pPad->fileStuff.fileName && *pPad->fileStuff.fileName) {
|
|
name = MbBasename(pPad->fileStuff.fileName);
|
|
} else {
|
|
name = strdup(UNNAMED_TITLE);
|
|
freeName = True;
|
|
}
|
|
title = (char *)XtMalloc(strlen(DialogTitle(pPad)) + strlen(name) + 1);
|
|
sprintf(title, "%s%s", DialogTitle(pPad), name);
|
|
|
|
XmbTextListToTextProperty(pPad->display, &name, 1, XStdICCTextStyle,
|
|
&textProp);
|
|
XSetWMIconName(pPad->display, XtWindow(pPad->app_shell), &textProp);
|
|
XFree(textProp.value);
|
|
|
|
XtSetArg(al[0], XmNtitle, title);
|
|
XtSetArg(al[1], XmNtitleEncoding, None);
|
|
XtSetValues(pPad->app_shell, al, 2);
|
|
|
|
if(freeName == True)
|
|
free(name);
|
|
XtFree(title);
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* SetSaveAsLabelAndDialog - set the File menu [Save As] button label and
|
|
* mnemonic, and the SaveAs dialog title based on whether or not the
|
|
* file name can change.
|
|
************************************************************************/
|
|
void
|
|
SetSaveAsLabelAndDialog(
|
|
Editor *pPad)
|
|
{
|
|
char buf[256];
|
|
Arg al[10];
|
|
int ac, count = 0;
|
|
char *mnemonic;
|
|
XmString tmpStr;
|
|
|
|
if (pPad->fileStuff.fileWidgets.saveAsBtn) {
|
|
if (pPad->xrdb.nameChange) {
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 25, "A")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 26, "Save As...")));
|
|
} else {
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 109, "F")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 110, "Copy To File...")));
|
|
}
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
XtSetValues(pPad->fileStuff.fileWidgets.saveAsBtn, al, ac);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
}
|
|
|
|
if (pPad->fileStuff.fileWidgets.saveAs.saveAs_form) {
|
|
strcpy(buf, DialogTitle(pPad));
|
|
if (pPad->xrdb.nameChange) {
|
|
strcat(buf, (char *)GETMESSAGE(5, 7, "Save As"));
|
|
} else {
|
|
strcat(buf, (char *)GETMESSAGE(5, 43, "Copy To File"));
|
|
}
|
|
tmpStr = XmStringCreateLocalized(buf);
|
|
XtSetArg(al[0], XmNdialogTitle, tmpStr);
|
|
XtSetValues(pPad->fileStuff.fileWidgets.saveAs.saveAs_form, al, 1);
|
|
XmStringFree(tmpStr);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/************************************************************************
|
|
* CreateHelpMenu - Create the Help pulldown menu
|
|
*
|
|
* Overview
|
|
* ----------
|
|
* Tasks
|
|
* Table of Contents
|
|
* Reference
|
|
* On Item
|
|
* ----------
|
|
* Using Help
|
|
* ----------
|
|
* About Text Editor
|
|
*
|
|
************************************************************************/
|
|
static void
|
|
CreateHelpMenu(
|
|
Editor *pPad)
|
|
{
|
|
Widget help_pane, cascade, WidgList[12];
|
|
Arg al[10];
|
|
int ac, count = 0;
|
|
char *mnemonic;
|
|
XmString tmpStr;
|
|
|
|
/* -----> create "Help" PulldownMenu */
|
|
ac = 0;
|
|
help_pane = XmCreatePulldownMenu (pPad->menu_bar, "helpMenu", al, ac);
|
|
XtAddCallback(help_pane, XmNhelpCallback,
|
|
(XtCallbackProc)HelpHelpCB, pPad);
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 81, "H")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 82, "Help")));
|
|
ac = 0;
|
|
XtSetArg (al[ac], XmNsubMenuId, help_pane); ac++;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
cascade = XmCreateCascadeButtonGadget(pPad->menu_bar, "Help", al, ac);
|
|
XtAddCallback(cascade, XmNhelpCallback,(XtCallbackProc)HelpHelpCB, pPad);
|
|
XtManageChild(cascade);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNmenuHelpWidget, cascade); ac++;
|
|
XtSetValues (pPad->menu_bar, al, ac);
|
|
|
|
/* -----> create "Overview" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 83, "v")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 84, "Overview")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++]= XmCreatePushButtonGadget(help_pane, "overview", al, ac );
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpOverviewCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> craete Separator */
|
|
ac = 0;
|
|
WidgList[count++] = XmCreateSeparatorGadget (help_pane, "sep1", al, ac);
|
|
|
|
/* -----> create "Tasks" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 85, "T")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 86, "Tasks")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++]= XmCreatePushButtonGadget(help_pane, "tasks", al, ac );
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpTasksCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Table of Contents" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 87, "C")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 88, "Table of Contents")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++]= XmCreatePushButtonGadget(help_pane, "TOC", al, ac );
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpTOCCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Reference" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 89, "R")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 90, "Reference")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++]= XmCreatePushButtonGadget(help_pane, "reference", al, ac );
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpReferenceCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "On Item" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 91, "O")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 92, "On Item")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++]= XmCreatePushButtonGadget(help_pane, "onItem", al, ac );
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpOnItemCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create Separator*/
|
|
ac = 0;
|
|
WidgList[count++] = XmCreateSeparatorGadget (help_pane, "sep2", al, ac);
|
|
|
|
/* -----> create "Using Help" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 93, "U")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 94, "Using Help")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++]= XmCreatePushButtonGadget(help_pane, "usingHelp", al, ac );
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpUsingHelpCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create Separator */
|
|
ac = 0;
|
|
WidgList[count++] = XmCreateSeparatorGadget (help_pane, "sep3", al, ac);
|
|
|
|
/* -----> create "About Text Editor" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 95, "A")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 96, "About Text Editor")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++]= XmCreatePushButtonGadget(help_pane, "about", al, ac );
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)HelpAboutCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
XtManageChildren(WidgList, count);
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* CreateFileMenu - Create the "File" pulldown menu
|
|
*
|
|
* New
|
|
* Open...
|
|
* Include...
|
|
* ----------
|
|
* Save or [Save (needed)]
|
|
* Save As...
|
|
* Print...
|
|
* ----------
|
|
* Close
|
|
*
|
|
************************************************************************/
|
|
static void
|
|
CreateFileMenu(
|
|
Editor *pPad)
|
|
{
|
|
Widget file_pane, cascade, WidgList[12];
|
|
Arg al[10];
|
|
int ac, count = 0;
|
|
char *mnemonic;
|
|
XmString tmpStr;
|
|
FileWidgets *pWidg = &pPad->fileStuff.fileWidgets;
|
|
|
|
/* -----> create "File" PulldownMenu */
|
|
ac = 0;
|
|
file_pane = XmCreatePulldownMenu (pPad->menu_bar, "fileMenu", al, ac);
|
|
XtAddCallback(file_pane, XmNhelpCallback,
|
|
(XtCallbackProc)HelpFileCB, pPad);
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 15, "F")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 16, "File")));
|
|
ac = 0;
|
|
XtSetArg (al[ac], XmNsubMenuId, file_pane); ac++;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
cascade = XmCreateCascadeButtonGadget (pPad->menu_bar, "File", al, ac);
|
|
XtAddCallback (cascade, XmNcascadingCallback,
|
|
(XtCallbackProc)FileCascadingCB, (XtPointer) pPad);
|
|
XtAddCallback(cascade, XmNhelpCallback, (XtCallbackProc)HelpFileCB, pPad);
|
|
XtManageChild (cascade);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "New" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 17, "N")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 18, "New")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget (file_pane, "new", al, ac);
|
|
pWidg->newBtn = WidgList[count-1];
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc)FileNewCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Open..." push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 19, "O")));
|
|
tmpStr=XmStringCreateLocalized(((char *)GETMESSAGE(11, 20, "Open...")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget (file_pane, "open", al, ac);
|
|
pWidg->openBtn = WidgList[count - 1];
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) FileOpenCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Include..." push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 21, "I")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 22, "Include...")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget (file_pane, "include", al, ac);
|
|
pWidg->includeBtn = WidgList[count - 1];
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) FileIncludeCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create save/print separator */
|
|
ac = 0;
|
|
WidgList[count++] = XmCreateSeparatorGadget (file_pane, "SvSp", al, ac);
|
|
|
|
/* -----> create "Save" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 23, "S")));
|
|
/* Note: The "Save" label is set in FileCascadingCB() when the File menu
|
|
* is displayed based on whether or not there are unsaved changes */
|
|
pPad->fileStuff.saveBtnLabel =
|
|
XmStringCreateLocalized(((char *)GETMESSAGE(11, 24, "Save")));
|
|
pPad->fileStuff.saveNeededBtnLabel =
|
|
XmStringCreateLocalized(((char *)GETMESSAGE(11, 73, "Save (needed)")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget (file_pane, "save", al, ac);
|
|
pWidg->saveBtn = WidgList[count - 1];
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) FileSaveCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
|
|
/* -----> create "Save As..." push button
|
|
* (its label/mnemonic are set later in SetSaveAsLabelAndDialog()
|
|
* based on xrdb.nameChange) */
|
|
ac = 0;
|
|
WidgList[count++] = XmCreatePushButtonGadget (file_pane, "saveAs", al, ac);
|
|
pWidg->saveAsBtn = WidgList[count - 1];
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) FileSaveAsCB, (XtPointer) pPad);
|
|
|
|
/* -----> create "Print..." push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 27, "P")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 28, "Print...")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget (file_pane, "print", al, ac);
|
|
pWidg->printBtn = WidgList[count - 1];
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) FileXpPrintCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create close/exit separator */
|
|
ac = 0;
|
|
WidgList[count++] = XmCreateSeparatorGadget (file_pane, "ExSp", al, ac);
|
|
|
|
/* -----> create "Close" (Exit) push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 29, "C")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 30, "Close")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget (file_pane, "close", al, ac);
|
|
pPad->ExitWid = WidgList[count-1];
|
|
pWidg->exitBtn = WidgList[count - 1];
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) FileExitCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> manage the all "File" menu buttons */
|
|
XtManageChildren(WidgList, count);
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* CreateEditMenu - Create the "Edit" pulldown menu
|
|
*
|
|
* Undo
|
|
* ----------
|
|
* Cut
|
|
* Copy
|
|
* Paste
|
|
* Clear
|
|
* Delete
|
|
* Select All
|
|
* ----------
|
|
* Find/Change...
|
|
* Check Spellilng...
|
|
*
|
|
************************************************************************/
|
|
static void
|
|
CreateEditMenu(
|
|
Editor *pPad)
|
|
{
|
|
Widget edit_pane, cascade, WidgList[12];
|
|
Arg al[10];
|
|
int ac, count = 0;
|
|
char *mnemonic;
|
|
XmString tmpStr;
|
|
EditWidgets *pWidg = &pPad->editStuff.widgets;
|
|
|
|
/* -----> create "Edit" PulldownMenu */
|
|
ac = 0;
|
|
edit_pane = XmCreatePulldownMenu (pPad->menu_bar, "editMenu", al, ac);
|
|
XtAddCallback(edit_pane, XmNhelpCallback,
|
|
(XtCallbackProc)HelpEditCB, pPad);
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 31, "E")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 32, "Edit")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNsubMenuId, edit_pane); ac++;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
cascade= XmCreateCascadeButtonGadget(pPad->menu_bar, "Edit", al, ac);
|
|
XtAddCallback(cascade, XmNhelpCallback,(XtCallbackProc)HelpEditCB, pPad);
|
|
XtManageChild(cascade);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Undo" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 33, "U")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 34, "Undo")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "undo", al, ac);
|
|
pWidg->undoBtn = WidgList[count - 1];
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) EditUndoCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create undo separator */
|
|
ac = 0;
|
|
WidgList[count++] = XmCreateSeparatorGadget(edit_pane, "CtSp", al, ac);
|
|
|
|
/* -----> create "Cut" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 35, "t")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 36, "Cut")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "cut", al, ac);
|
|
pWidg->cutBtn = WidgList[count - 1];
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) EditCutCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Copy" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 37, "C")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 38, "Copy")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "copy", al, ac);
|
|
pWidg->copyBtn = WidgList[count - 1];
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) EditCopyCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Paste" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 39, "P")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 40, "Paste")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "paste", al, ac);
|
|
pWidg->pasteBtn = WidgList[count - 1];
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) EditPasteCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Clear" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 41, "e")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 42, "Clear")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "clear", al, ac);
|
|
pWidg->clearBtn = WidgList[count - 1];
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) EditClearCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Delete" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 43, "D")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 44,"Delete")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget (edit_pane, "delete", al, ac);
|
|
pWidg->deleteBtn = WidgList[count - 1];
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) EditDeleteCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> XXX - create "Select All" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 101, "S")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 102, "Select All")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "selectAll", al, ac);
|
|
pWidg->selectAllBtn = WidgList[count - 1];
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) SelectAllCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create find/change separator */
|
|
ac = 0;
|
|
WidgList[count++] = XmCreateSeparatorGadget (edit_pane, "FSSp", al, ac);
|
|
|
|
/* -----> create "Find/Change" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 103, "F")));
|
|
tmpStr =XmStringCreateLocalized(((char *)GETMESSAGE(11, 104,"Find/Change...")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] =
|
|
XmCreatePushButtonGadget(edit_pane, "findChange", al, ac);
|
|
pWidg->findChangeBtn = WidgList[count - 1];
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) FindChangeCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Check Spelling" push button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 105, "k")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 106, "Check Spelling...")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget(edit_pane, "checkSpelling",
|
|
al, ac);
|
|
pWidg->checkSpellingBtn = WidgList[count - 1];
|
|
XtAddCallback(WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) CheckSpellingCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> manage all the "Edit" menu buttons */
|
|
XtManageChildren(WidgList, count);
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* CreateFormatMenu - Create the "Format" pulldown menu
|
|
*
|
|
* Settings...
|
|
* Paragraph
|
|
* All
|
|
*
|
|
************************************************************************/
|
|
static void
|
|
CreateFormatMenu(
|
|
Editor *pPad)
|
|
{
|
|
Widget format_pane, cascade, WidgList[12];
|
|
Arg al[10];
|
|
int ac, count = 0;
|
|
char *mnemonic;
|
|
XmString tmpStr;
|
|
|
|
/* -----> create "Format" PulldownMenu */
|
|
ac = 0;
|
|
format_pane = XmCreatePulldownMenu (pPad->menu_bar, "formatMenu", al, ac);
|
|
XtAddCallback(format_pane, XmNhelpCallback,
|
|
(XtCallbackProc)HelpFormatCB, pPad);
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 51, "r")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 52, "Format")));
|
|
ac = 0;
|
|
XtSetArg (al[ac], XmNsubMenuId, format_pane); ac++;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
cascade= XmCreateCascadeButtonGadget (pPad->menu_bar, "format", al, ac);
|
|
XtAddCallback(cascade, XmNhelpCallback,(XtCallbackProc)HelpFormatCB, pPad);
|
|
pPad->formatStuff.widgets.formatBtn = cascade;
|
|
XtManageChild (cascade);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Settings..." button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 53, "S")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 54, "Settings...")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] =
|
|
XmCreatePushButtonGadget (format_pane, "settings", al, ac);
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) FormatCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Paragraph" button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 55, "P")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 56, "Paragraph")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] =
|
|
XmCreatePushButtonGadget (format_pane, "paragraph", al, ac);
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) FormatParaCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "All" button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 57, "l")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 58, "All")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
WidgList[count++] = XmCreatePushButtonGadget (format_pane, "all", al, ac);
|
|
XtAddCallback (WidgList[count-1], XmNactivateCallback,
|
|
(XtCallbackProc) FormatAllCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> manage the all "Format" menu buttons */
|
|
XtManageChildren(WidgList, count);
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* CreateOptionsMenu - Create the "Options" pulldown menu
|
|
*
|
|
* Overstrike
|
|
* Wrap To Fit
|
|
* Status Line
|
|
*
|
|
************************************************************************/
|
|
static void
|
|
CreateOptionsMenu(
|
|
Editor *pPad)
|
|
{
|
|
Widget options_pane, cascade, WidgList[12];
|
|
Arg al[10];
|
|
int ac, count = 0;
|
|
char *mnemonic;
|
|
XmString tmpStr;
|
|
OptionsMenuWidgets *pWidg = &pPad->optionsStuff.widgets;
|
|
|
|
/* -----> create "Options" PulldownMenu */
|
|
ac = 0;
|
|
options_pane = XmCreatePulldownMenu (pPad->menu_bar, "optionsMenu", al, ac);
|
|
XtAddCallback(options_pane, XmNhelpCallback,
|
|
(XtCallbackProc)HelpOptionsCB, pPad);
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 59, "O")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 60, "Options")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNsubMenuId, options_pane); ac++;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
cascade= XmCreateCascadeButtonGadget (pPad->menu_bar, "options", al, ac);
|
|
XtAddCallback(cascade, XmNhelpCallback,(XtCallbackProc)HelpOptionsCB, pPad);
|
|
pPad->optionsStuff.widgets.optionsBtn = cascade;
|
|
XtManageChild (cascade);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Overstrike" toggle button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 61, "O")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 62, "Overstrike")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
XtSetArg(al[ac], XmNvisibleWhenOff, True); ac++;
|
|
XtSetArg(al[ac], XmNset, pPad->xrdb.overstrike); ac++;
|
|
WidgList[count++] = XmCreateToggleButton (options_pane, "overstrike", al, ac);
|
|
pWidg->overstrikeBtn = WidgList[count - 1];
|
|
XtAddCallback (WidgList[count-1], XmNvalueChangedCallback,
|
|
(XtCallbackProc) OverstrikeCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Wrap To Fit" toggle button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 111, "W")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 112, "Wrap To Fit")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
XtSetArg(al[ac], XmNvisibleWhenOff, True); ac++;
|
|
XtSetArg(al[ac], XmNset, pPad->xrdb.wordWrap); ac++;
|
|
WidgList[count++] = XmCreateToggleButton (options_pane, "wordWrap", al, ac);
|
|
pWidg->wordWrapBtn = WidgList[count - 1];
|
|
XtAddCallback (WidgList[count-1], XmNvalueChangedCallback,
|
|
(XtCallbackProc) WordWrapCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
/* -----> create "Status Line" toggle button */
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 65, "S")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 66, "Status Line")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic[0]); ac++;
|
|
XtSetArg(al[ac], XmNvisibleWhenOff, True); ac++;
|
|
XtSetArg(al[ac], XmNset, pPad->xrdb.statusLine); ac++;
|
|
WidgList[count++] = XmCreateToggleButton (options_pane, "statusLine", al, ac);
|
|
pWidg->statusLineBtn = WidgList[count - 1];
|
|
XtAddCallback (WidgList[count-1], XmNvalueChangedCallback,
|
|
(XtCallbackProc) StatusLineCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
XtManageChildren(WidgList, count);
|
|
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* CreateMenuBar - Create MenuBar in MainWindow
|
|
*
|
|
************************************************************************/
|
|
void
|
|
CreateMenuBar( Editor *pPad )
|
|
{
|
|
pPad->menu_bar = XmCreateMenuBar (pPad->mainWindow, "bar", NULL, 0);
|
|
XtAddCallback(pPad->menu_bar, XmNhelpCallback,
|
|
(XtCallbackProc)HelpMenubarCB, pPad);
|
|
|
|
CreateFileMenu(pPad);
|
|
CreateEditMenu(pPad);
|
|
CreateFormatMenu(pPad);
|
|
CreateOptionsMenu(pPad);
|
|
CreateHelpMenu(pPad);
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* CreateEditorWidget - creates the Dt Editor widget
|
|
************************************************************************/
|
|
void
|
|
CreateEditorWidget(
|
|
Editor *pPad)
|
|
{
|
|
Widget parent = pPad->mainWindow;
|
|
Arg al[10]; /* arg list */
|
|
int ac; /* arg count */
|
|
Pixel background, foreground, top_shadow, bottom_shadow, selectColor;
|
|
Colormap colormap;
|
|
XmString dialogTitleStr = XmStringCreateLocalized(DialogTitle(pPad));
|
|
|
|
/* create the DtEditor widget */
|
|
ac = 0;
|
|
XtSetArg(al[ac], DtNrows, DEFAULT_ROWS); ac++;
|
|
XtSetArg(al[ac], DtNcolumns, DEFAULT_COLS); ac++;
|
|
XtSetArg(al[ac], DtNdialogTitle, dialogTitleStr); ac++;
|
|
pPad->editor = DtCreateEditor(parent, "editor", al, ac);
|
|
XmStringFree(dialogTitleStr);
|
|
|
|
/* add the DtEditor callbacks */
|
|
XtAddCallback(pPad->editor, XmNhelpCallback,
|
|
(XtCallbackProc) HelpEditorWidgetCB,
|
|
(XtPointer) pPad);
|
|
XtAddCallback(pPad->editor, DtNtextSelectCallback,
|
|
(XtCallbackProc) TextSelectedCB,
|
|
(XtPointer) pPad);
|
|
XtAddCallback(pPad->editor, DtNtextDeselectCallback,
|
|
(XtCallbackProc) TextDeselectedCB,
|
|
(XtPointer) pPad);
|
|
|
|
/* get id of status line text field widget */
|
|
pPad->statusLineMsg = DtEditorGetMessageTextFieldID(pPad->editor);
|
|
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* FindOrCreatePad - finds an unused entry in the list of Editors or,
|
|
* if none can be found, creates a new entry with some defaults
|
|
* obtain from the last entry that was created.
|
|
*
|
|
* Returns True if an existing, unused entry is "reused" or False
|
|
* if a new entry is created. Also updates the current entry
|
|
* (whose address is passed as a parameter) to point to the
|
|
* found/created entry.
|
|
*
|
|
* Note: The first entry in the list of Editors is created by
|
|
* CreatedFirstPad(). This routine is used to create
|
|
* all subsequent entries.
|
|
*
|
|
************************************************************************/
|
|
Boolean
|
|
FindOrCreatePad(
|
|
Editor **ppPad)
|
|
{
|
|
Boolean foundPad = False;
|
|
Editor *pPad;
|
|
Arg al[10];
|
|
int ac;
|
|
|
|
/* -----> Reuse unused entries (corresponding to closed editor windows)
|
|
* before creating new ones. */
|
|
for (pPad = pPadList; pPad != (Editor *)NULL; pPad = pPad->pNextPad){
|
|
if (pPad->inUse == False) {
|
|
pPad->inUse = True;
|
|
foundPad = True;
|
|
numActivePads++;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* -----> Create a new entry if an unused one can not be found. */
|
|
if (foundPad == False) {
|
|
int argc_l, i;
|
|
char **argv_l, **c_argv_l;
|
|
char *pProgName;
|
|
Display *display;
|
|
unsigned short group_id,
|
|
user_id;
|
|
|
|
/* -----> Save some defaults from the last entry that was created. */
|
|
Boolean exitOnLastClose = pPadList->xrdb.exitOnLastClose;
|
|
pProgName = pPadList->progname;
|
|
group_id = pPadList->group_id;
|
|
user_id = pPadList->user_id;
|
|
display = pPadList->display;
|
|
|
|
/* -----> Create a new entry and point pPad and the global, pPadList
|
|
* to it. */
|
|
CreatePad(&pPad);
|
|
pPad->inUse = True;
|
|
|
|
/* -----> Set some defaults from the last entry that was created. */
|
|
pPad->display = display;
|
|
pPad->progname = pProgName;
|
|
pPad->group_id = group_id;
|
|
pPad->user_id = user_id;
|
|
pPad->xrdb.exitOnLastClose = exitOnLastClose;
|
|
|
|
/* -----> Create the application shell for the new Editor entry. */
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNargv, &argv_l); ac++;
|
|
XtSetArg(al[ac], XmNargc, &argc_l); ac++;
|
|
XtGetValues(topLevelWithWmCommand, al, ac);
|
|
|
|
c_argv_l = (char **) XtMalloc(argc_l * sizeof(char*));
|
|
for (i=0; i<argc_l; i++)
|
|
c_argv_l[i] = strdup(argv_l[i]);
|
|
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNargv, argv_l); ac++;
|
|
XtSetArg(al[ac], XmNargc, argc_l); ac++;
|
|
pPad->app_shell = XtAppCreateShell(pPad->progname, DTPAD_CLASS_NAME,
|
|
applicationShellWidgetClass,
|
|
pPad->display, al, ac);
|
|
pPad->app_context = XtWidgetToApplicationContext(pPad->app_shell);
|
|
|
|
/* -----> Set all resources to initial server values */
|
|
RestoreInitialServerResources(pPad);
|
|
|
|
}
|
|
|
|
/* -----> update the pointer to the current entry and return whether or
|
|
* not an existing entry was reused */
|
|
*ppPad = pPad;
|
|
return foundPad;
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* SetWorkSpaceHints -
|
|
*
|
|
************************************************************************/
|
|
void
|
|
SetWorkSpaceHints(
|
|
Widget shell,
|
|
char *workspaces )
|
|
{
|
|
char * ptr;
|
|
Atom * workspace_atoms = NULL;
|
|
int num_workspaces=0;
|
|
|
|
if (workspaces)
|
|
{
|
|
do
|
|
{
|
|
ptr = MbStrchr (workspaces, ' ');
|
|
|
|
if (ptr != NULL) *ptr = 0;
|
|
|
|
workspace_atoms = (Atom *) XtRealloc ((char *)workspace_atoms,
|
|
sizeof (Atom) * (num_workspaces + 1));
|
|
workspace_atoms[num_workspaces] =
|
|
XmInternAtom (XtDisplay(shell), workspaces, True);
|
|
|
|
num_workspaces++;
|
|
|
|
if (ptr != NULL)
|
|
{
|
|
*ptr = ' ';
|
|
workspaces = ptr + 1;
|
|
}
|
|
} while (ptr != NULL);
|
|
|
|
DtWsmSetWorkspacesOccupied(XtDisplay(shell), XtWindow (shell),
|
|
workspace_atoms, num_workspaces);
|
|
|
|
XtFree ((char *) workspace_atoms);
|
|
workspace_atoms = NULL;
|
|
}
|
|
else
|
|
{
|
|
Window rootWindow;
|
|
Atom pCurrent;
|
|
Screen *currentScreen;
|
|
int screen;
|
|
char *workspace_name;
|
|
|
|
screen = XDefaultScreen(XtDisplay(shell));
|
|
currentScreen = XScreenOfDisplay(XtDisplay(shell), screen);
|
|
rootWindow = RootWindowOfScreen(currentScreen);
|
|
|
|
if(DtWsmGetCurrentWorkspace(XtDisplay(shell), rootWindow,
|
|
&pCurrent) == Success)
|
|
{
|
|
DtWsmSetWorkspacesOccupied(XtDisplay(shell), XtWindow (shell),
|
|
&pCurrent, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* ClearStatusMessage - clears the message (XmTextField) portion of the
|
|
* DtEditor widget's status line.
|
|
************************************************************************/
|
|
/* ARGSUSED */
|
|
void
|
|
ClearStatusMessage(
|
|
Editor *pPad)
|
|
{
|
|
XmTextFieldSetString(pPad->statusLineMsg, "");
|
|
}
|
|
|
|
|
|
/************************************************************************
|
|
* SetStatusMessage - sets the message (XmTextField) portion of the
|
|
* DtEditor widget's status line to the specified string.
|
|
************************************************************************/
|
|
/* ARGSUSED */
|
|
void
|
|
SetStatusMessage(
|
|
Editor *pPad,
|
|
char *str)
|
|
{
|
|
XmTextFieldSetString(pPad->statusLineMsg, str);
|
|
}
|
|
|
|
|
|
#ifdef POPUP
|
|
/*
|
|
* CreatePopupMenu - Create popup menu in editor window
|
|
*/
|
|
|
|
void
|
|
CreatePopupMenu( Editor *pPad )
|
|
{
|
|
Arg al[5];
|
|
int ac;
|
|
Widget popupCascade, popupBtns[10];
|
|
Widget fileMenu, editMenu, optionMenu, helpMenu;
|
|
XmString tmpStr;
|
|
char *mnemonic;
|
|
int i = 0;
|
|
|
|
pPad->popup = XmCreatePopupMenu(pPad->editor, "popupMenu", NULL, 0);
|
|
XtAddEventHandler(parent, ButtonPressMask, False, PopupHandler,
|
|
(XtPointer)popupMenu);
|
|
|
|
/* Create text editor title */
|
|
popupBtns[i] =
|
|
(Widget)XmCreateLabelGadget(pPad->popup, "popupTitle", NULL, 0);
|
|
|
|
|
|
/* Create title separators */
|
|
popupBtns[i++] = XmCreateSeparatorGadget(pPad->popup, "sep2", NULL, 0);
|
|
|
|
fileMenu = XmCreatePulldownMenu (pPad->popup, "fileMenu", NULL, 0);
|
|
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 16, "File")));
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 15, "F")));
|
|
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNsubMenuId, fileMenu); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic); ac++;
|
|
popupBtns[i++] = XmCreateCascadeButtonGadget(pPad->popup, "File", al, ac);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
|
|
mnemonic = strdup(((char *)GETMESSAGE(11, 17, "N")));
|
|
tmpStr = XmStringCreateLocalized(((char *)GETMESSAGE(11, 18, "New")));
|
|
ac = 0;
|
|
XtSetArg(al[ac], XmNlabelString, tmpStr); ac++;
|
|
XtSetArg(al[ac], XmNmnemonic, mnemonic); ac++;
|
|
popupBtns[i] = XmCreatePushButtonGadget(pPad->popup, "New", al, ac);
|
|
XtAddCallback(button, XmNactivateCallback, callback, callData);
|
|
XtAddCallback (popupBtns[i], XmNactivateCallback,
|
|
(XtCallbackProc)FileNewCB, (XtPointer) pPad);
|
|
free(mnemonic);
|
|
XmStringFree(tmpStr);
|
|
i++;
|
|
|
|
CreateButton(fileMenu, "Open...", 'O', DisplayFsbCb, (XtPointer)LOAD_DATA);
|
|
CreateButton(fileMenu, "Include...", 'I', DisplayFsbCb,
|
|
(XtPointer)INSERT_DATA);
|
|
CreateButton(fileMenu, "Save As...", 'A', DisplayFsbCb, (XtPointer)SAVE_DATA
|
|
);
|
|
CreateButton(fileMenu, "New", 'N', ResetEditorCb, NULL);
|
|
|
|
editMenu = XmCreatePulldownMenu (popupMenu, "editMenu", NULL, 0);
|
|
CreateCascade(popupMenu, "Edit", 'E', editMenu);
|
|
CreateButton(editMenu, "Undo", 'U', UndoCb, (XtPointer)LOAD_DATA);
|
|
ad.cutPopupButton = CreateButton(editMenu, "Cut", 't', CutCb, NULL);
|
|
ad.copyPopupButton = CreateButton(editMenu, "Copy", 'C', CopyCb, NULL);
|
|
CreateButton(editMenu, "Paste", 'P', PasteCb, NULL);
|
|
|
|
CreateButton(popupMenu, "Find/Change...", 'F', FindCb, (XtPointer)ad.editor)
|
|
;
|
|
|
|
return (popupMenu);
|
|
}
|
|
|
|
static void PopupHandler(Widget w, XtPointer cd, XEvent *event, Boolean *ctd)
|
|
{
|
|
if (((XButtonEvent *)event)->button != Button3) return;
|
|
|
|
XmMenuPosition((Widget)cd, (XButtonEvent *)event);
|
|
XtManageChild ((Widget)cd);
|
|
}
|
|
#endif
|