123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047 |
- /*
- * 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: XUICreate.c /main/22 1997/06/18 17:33:46 samborn $ */
- /************************************<+>*************************************
- ****************************************************************************
- **
- ** File: XUICreate.c
- **
- ** Project: Cde Help System
- **
- ** Description: Builds a GUI containing a Drawn Button with scroll
- ** bars and wraps it around a canvas.
- **
- ****************************************************************************
- ************************************<+>*************************************/
- /*
- * (c) Copyright 1996 Digital Equipment Corporation.
- * (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992,
- 1993, 1994, 1996 Hewlett-Packard Company.
- * (c) Copyright 1993, 1994, 1996 International Business Machines Corp.
- * (c) Copyright 1993, 1994, 1996 Sun Microsystems, Inc.
- * (c) Copyright 1993, 1994, 1996 Novell, Inc.
- * (c) Copyright 1996 FUJITSU LIMITED.
- * (c) Copyright 1996 Hitachi.
- */
- /*
- * system includes
- */
- #include <stdlib.h>
- #include <string.h>
- #include <Xm/Xm.h>
- #include <Xm/XmP.h>
- #include <Xm/AtomMgr.h>
- #include <Xm/DrawnB.h>
- #include <Xm/Form.h>
- #include <Xm/ScrollBar.h>
- #include <Xm/XmPrivate.h>
- /*
- * Canvas Engine
- */
- #include "CanvasP.h"
- #include "CanvasSegP.h"
- /*
- * private includes
- */
- #include "bufioI.h"
- #include "Access.h"
- #include "DisplayAreaP.h"
- #include "CallbacksI.h"
- #include "XUICreateI.h"
- #include "FontI.h"
- #include "FontAttrI.h"
- #include "DestroyI.h"
- #include "FormatUtilI.h"
- #include "SetListI.h"
- #include "XInterfaceI.h"
- #include "Lock.h"
- #ifdef NLS16
- #endif
- /******** Private Function Declarations ********/
- static Boolean get_fontsetproperty(
- XFontSet fontset,
- Atom atom,
- unsigned long *value_return);
- /******** End Private Function Declarations ********/
- /******** Private Variables ********/
- static _DtCvVirtualInfo DefVirtFunctions =
- {
- _DtHelpDAGetCvsMetrics, /* void (*_DtCvGetMetrics)() */
- _DtHelpDARenderElem, /* void (*_DtCvRenderElem)() */
- _DtHelpDAGetStrWidth, /* _DtCvUnit (*_DtCvGetElemWidth)() */
- _DtHelpDAGetFontMetrics, /* void (*_DtCvGetFontMetrics)() */
- _DtHelpDABuildSelection, /* void (*_DtCvBuildSelection)() */
- NULL, /* _DtCvStatus (*_DtCvFilterExecCmd)()*/
- };
- /******** End Private Variables ********/
- /******** Semi-Private Variables ********/
- /******** End Semi-Private Variables ********/
- /******************************************************************************
- *
- * Here are the type and variable declarations for finding view subresources.
- *
- *****************************************************************************/
- /*
- * These are used to parse subresources for the text display areas.
- */
- typedef struct
- {
- int marginWidth;
- int marginHeight;
- int leading;
- int moveThreshold;
- int initialDelay;
- int repeatDelay;
- XmFontList userFont;
- Pixel search_color;
- }
- DAArgs, *DAArgsPtr;
- static XtResource Resources[] = {
- {
- "leading", "Leading", XmRInt, sizeof(int),
- XtOffset(DAArgsPtr, leading), XmRImmediate, (XtPointer) 1
- },
-
- {
- XmNmarginWidth, XmCMarginWidth, XmRInt, sizeof(int),
- XtOffset(DAArgsPtr, marginWidth), XmRImmediate, (XtPointer) 5
- },
-
- {
- XmNmarginHeight, XmCMarginHeight, XmRInt, sizeof(int),
- XtOffset(DAArgsPtr, marginHeight), XmRImmediate, (XtPointer) 5
- },
- {
- "moveThreshold", "MoveThreshold", XmRInt, sizeof(int),
- XtOffset(DAArgsPtr, moveThreshold), XmRImmediate, (XtPointer) 10
- },
-
- {
- XmNinitialDelay, XmCInitialDelay, XmRInt, sizeof(int),
- XtOffset(DAArgsPtr, initialDelay), XmRImmediate, (XtPointer) 250
- },
-
- {
- XmNrepeatDelay, XmCRepeatDelay, XmRInt, sizeof(int),
- XtOffset(DAArgsPtr, repeatDelay), XmRImmediate, (XtPointer) 50
- },
-
- {
- "userFont", XmCFontList, XmRFontList, sizeof (XmFontList),
- XtOffset(DAArgsPtr, userFont), XmRString, "Fixed"
- },
- {
- "searchColor", "SearchColor", XtRPixel, sizeof (Pixel),
- XtOffset(DAArgsPtr, search_color), XmRString, "blue"
- },
- };
- static String DrawnBTransTable = "\
- ~s ~m ~a <Key>Return: ActivateLink()\n\
- ~s c ~m ~a <Key>backslash: DeSelectAll()\n\
- ~s c ~m ~a <Key>slash: SelectAll()\n\
- ~s ~m ~a <Key>space: ActivateLink()\n\
- <Key>osfActivate: ActivateLink()\n\
- <Key>osfCopy: CopyToClipboard()\n\
- ~c <Key>osfDown: NextLink(1)\n\
- c <Key>osfDown: PageUpOrDown(1)\n\
- ~s c ~m ~a <Key>osfInsert: CopyToClipboard()\n\
- ~c <Key>osfLeft: NextLink(0)\n\
- c <Key>osfLeft: PageLeftOrRight(0)\n\
- ~c <Key>osfPageDown: PageUpOrDown(1)\n\
- c <Key>osfPageDown: PageLeftOrRight(1)\n\
- <Key>osfPageLeft: PageLeftOrRight(0)\n\
- <Key>osfPageRight: PageLeftOrRight(1)\n\
- ~c <Key>osfPageUp: PageUpOrDown(0)\n\
- c <Key>osfPageUp: PageLeftOrRight(0)\n\
- ~c <Key>osfRight: NextLink(1)\n\
- c <Key>osfRight: PageLeftOrRight(1)\n\
- ~s ~c <Key>osfSelect: ActivateLink()\n\
- ~c <Key>osfUp: NextLink(0)\n\
- c <Key>osfUp: PageUpOrDown(0)\n\
- c <Key>osfBeginLine: NextLink(2)\n\
- c <Key>osfEndLine: NextLink(3)\
- ";
- static XtTranslations DrawnBTrans = NULL;
- /*********************************************************************
- * Private Functions
- *********************************************************************/
- /* This function returns the max value of XGetFontProperty calls for each
- * font in the fontset.
- */
- static Boolean
- get_fontsetproperty(
- XFontSet fontset,
- Atom atom,
- unsigned long *value_return)
- {
- int numfont;
- XFontStruct **font_list;
- char **name_list;
- int i;
- Bool ret = FALSE;
- unsigned long value;
- numfont=XFontsOfFontSet(fontset,&font_list,&name_list);
- for(i = 0; i < numfont; i++) {
- if(XGetFontProperty(font_list[i], atom, &value) == TRUE) {
- if(ret == FALSE) {
- *value_return = value;
- ret = TRUE;
- }
- else {
- if(value > *value_return)
- *value_return = value;
- }
- }
- }
- return(ret);
- }
- /*
- * This function returns the underline distance and size for the base
- * font.
- */
- static void
- GetUnderLineInfo (
- Display *dpy,
- DtHelpDispAreaStruct *pDAS,
- int *ret_underThick )
- {
- int idx;
- XtPointer myFont;
- XFontSetExtents *extents;
- /*
- * cast the parameter as a pointer to a long though the value
- * returned is really a int.
- */
- idx = __DtHelpDefaultFontIndexGet(pDAS);
- if (idx < 0)
- {
- myFont = (XtPointer)__DtHelpFontSetGet(pDAS->font_info, idx);
- if (get_fontsetproperty((XFontSet)myFont, XA_UNDERLINE_POSITION,
- ((unsigned long *) &(pDAS->underLine))) == FALSE)
- {
- extents = XExtentsOfFontSet((XFontSet)myFont);
- pDAS->underLine = ((int)(extents->max_ink_extent.height +
- extents->max_ink_extent.y)) / 2;
- }
- }
- else
- {
- myFont = (XtPointer)__DtHelpFontStructGet(pDAS->font_info, idx);
- if (XGetFontProperty((XFontStruct *)myFont, XA_UNDERLINE_POSITION,
- ((unsigned long *) &(pDAS->underLine))) == FALSE)
- pDAS->underLine = ((XFontStruct *)myFont)->max_bounds.descent / 2;
- }
- /*
- * if we do not find an underline thickness for the font
- * use 15% of the font height.
- *
- * cast the parameter to a pointer to a long though the value
- * returned is really a unsigned int.
- */
- if (idx < 0)
- {
- if (get_fontsetproperty((XFontSet)myFont, XA_UNDERLINE_THICKNESS,
- ((unsigned long *) ret_underThick)) == FALSE)
- *ret_underThick = pDAS->lineHeight * 15 / 100;
- }
- else
- {
- if (XGetFontProperty((XFontStruct *)myFont, XA_UNDERLINE_THICKNESS,
- ((unsigned long *) ret_underThick)) == FALSE)
- *ret_underThick = pDAS->lineHeight * 15 / 100;
- }
- /*
- * now adjust the underline depth so that the when the underline is
- * drawn the top of the line is UNDERLINE_POSITION pixels below
- * the base line.
- */
- /*
- * SYSTEM - ifdef this for other architectures.
- * an example of Hewlett-Packard's implementation is given for reference.
- */
- /* On Hewlett-Packard machines lines are */
- /* drawn like this: */
- /* */
- /* line width 1: y-> **************** */
- /* */
- /* **************** */
- /* line width 2: y-> **************** */
- /* */
- /* **************** */
- /* line width 3: y-> **************** */
- /* **************** */
- /* */
- /* **************** */
- /* **************** */
- /* line width 4: y-> **************** */
- /* **************** */
- /* */
- /* **************** */
- /* **************** */
- /* line width 5: y-> **************** */
- /* **************** */
- /* **************** */
- /* etc...... */
- /* */
- pDAS->underLine = pDAS->underLine + (*ret_underThick) / 2;
- }
- /*********************************************************************
- * Public Functions
- *********************************************************************/
- /*********************************************************************
- * Function: CreateDA
- *
- * CreateDA creates a Text Graphic area with the appropriate scroll bars.
- *
- *********************************************************************/
- static XtPointer
- HelpCreateDA(
- Widget parent,
- char *name,
- short vert_flag,
- short horz_flag,
- Boolean traversal_flag,
- _DtCvValue honor_size,
- _DtCvRenderType render_type,
- int rows,
- int columns,
- unsigned short media_resolution,
- void (*hyperTextCB)(),
- void (*resizeCB)(),
- int (*exec_ok_routine)(),
- XtPointer client_data,
- XmFontList default_list )
- {
- DtHelpDispAreaStruct *pDAS;
- DAArgs DA_args;
- Arg args[20];
- int n;
- int maxFontAscent;
- int maxFontDescent;
- int maxFontCharWidth;
-
- short margin_width;
- short margin_height;
- short shadowThick, highThick;
- Dimension hBarHeight = 0;
- Dimension vBarWidth = 0;
- Dimension width;
- Boolean value;
- Widget form;
- Display *dpy = XtDisplay(parent);
- Screen *retScr = XtScreen(parent);
- int screen = XScreenNumberOfScreen(retScr);
- Colormap colormap;
- Pixmap tile;
- XGCValues gcValues;
- unsigned long gcMask;
- unsigned long char_width;
- Atom xa_ave_width;
- XFontStruct *tmpFont = NULL;
- XtPointer default_font = NULL;
- XRectangle rectangle[1];
- XmFontContext fontContext;
- XmFontListEntry fontEntry;
- XmFontType fontType;
- /* Allocate the Display Area. */
- pDAS = (DtHelpDispAreaStruct *) XtMalloc(sizeof(DtHelpDispAreaStruct));
- /*
- * get the resources
- */
- XtGetSubresources(parent, &DA_args, name, "XmDrawnButton",
- Resources, XtNumber(Resources), NULL, 0);
- if (rows <= 0)
- rows = 1;
- if (columns <= 0)
- columns = 1;
- /*
- * initialize the structure variables.
- */
- pDAS->text_selected = False;
- pDAS->primary = False;
- pDAS->select_state = _DtHelpNothingDoing;
- pDAS->toc_y = 0;
- pDAS->toc_base = 0;
- pDAS->toc_flag = 0;
- if (traversal_flag)
- pDAS->toc_flag = _DT_HELP_SHADOW_TRAVERSAL | _DT_HELP_NOT_INITIALIZED;
- pDAS->max_spc = 0;
- pDAS->cur_spc = 0;
- pDAS->maxX = 0;
- pDAS->virtualX = 0;
- pDAS->firstVisible = 0;
- pDAS->visibleCount = rows;
- pDAS->maxYpos = 0;
- pDAS->neededFlags = 0;
- pDAS->vert_init_scr = DA_args.initialDelay;
- pDAS->vert_rep_scr = DA_args.repeatDelay;
- pDAS->horz_init_scr = DA_args.initialDelay;
- pDAS->horz_rep_scr = DA_args.repeatDelay;
- pDAS->moveThreshold = DA_args.moveThreshold;
- pDAS->marginWidth = DA_args.marginWidth;
- pDAS->marginHeight = DA_args.marginHeight;
- pDAS->searchColor = DA_args.search_color;
- pDAS->depth = 0;
- pDAS->spc_chars = NULL;
- pDAS->scr_timer_id = 0;
- pDAS->def_pix = 0;
- pDAS->context = NULL;
- pDAS->vertIsMapped = False;
- pDAS->horzIsMapped = False;
- pDAS->lst_topic = NULL;
- pDAS->nextNonVisible = 0;
- pDAS->media_resolution = media_resolution;
- pDAS->honor_size = honor_size;
- pDAS->render_type = render_type;
- pDAS->dtinfo = 0;
- pDAS->stipple = None;
- /*
- * locale dependant information
- */
- pDAS->nl_to_space = 1;
- pDAS->cant_begin_chars = NULL;
- pDAS->cant_end_chars = NULL;
- if (1 < MB_CUR_MAX)
- _DtHelpLoadMultiInfo (&(pDAS->cant_begin_chars),
- &(pDAS->cant_end_chars), &(pDAS->nl_to_space));
- /*
- * initialize the hypertext callback pointer
- */
- pDAS->exec_filter = exec_ok_routine;
- pDAS->hyperCall = hyperTextCB;
- pDAS->resizeCall = resizeCB;
- pDAS->clientData = client_data;
- /*
- * zero out other callback fields
- */
- pDAS->vScrollNotify = NULL ;
- pDAS->armCallback = NULL ;
- /*
- * create the atoms needed
- */
- xa_ave_width = XmInternAtom(dpy, "AVERAGE_WIDTH" , False);
- /*
- * Malloc for the default font.
- */
- (void) XmeRenderTableGetDefaultFont(DA_args.userFont, &tmpFont);
- if (default_list != NULL &&
- XmFontListInitFontContext (&fontContext, default_list))
- {
- fontEntry = XmFontListNextEntry (fontContext);
- if (fontEntry != NULL)
- default_font = XmFontListEntryGetFont (fontEntry, &fontType);
- XmFontListFreeFontContext (fontContext);
- }
- /*
- * fake out the next call by using the parent as the display widget
- */
- pDAS->dispWid = parent;
- __DtHelpFontDatabaseInit (pDAS, default_font, fontType, tmpFont);
- /*
- * Get the base font meterics.
- */
- __DtHelpFontMetrics (pDAS->font_info, __DtHelpDefaultFontIndexGet(pDAS),
- &maxFontAscent, &maxFontDescent, &maxFontCharWidth,
- NULL, NULL);
- pDAS->leading = DA_args.leading;
- pDAS->fontAscent = maxFontAscent;
- pDAS->lineHeight = maxFontAscent + maxFontDescent + pDAS->leading + 1;
- n = __DtHelpDefaultFontIndexGet(pDAS);
- if (n < 0)
- value = get_fontsetproperty(__DtHelpFontSetGet(pDAS->font_info, n),
- xa_ave_width, ((unsigned long *) &(pDAS->charWidth)));
- else
- value = XGetFontProperty(__DtHelpFontStructGet(pDAS->font_info, n),
- xa_ave_width, ((unsigned long *) &(pDAS->charWidth)));
- if (False == value || 0 == pDAS->charWidth)
- {
- int len = maxFontCharWidth;
- if (n < 0)
- len += XmbTextEscapement(
- __DtHelpFontSetGet(pDAS->font_info,n),"1",1);
- else
- len += XTextWidth(__DtHelpFontStructGet(pDAS->font_info, n),"1",1);
- pDAS->charWidth = 10 * len / 2;
- }
- /*
- * Create the form to manage the window and scroll bars.
- */
- n = 0;
- XtSetArg(args[n], XmNresizePolicy , XmRESIZE_ANY); ++n;
- XtSetArg(args[n], XmNshadowType , XmSHADOW_OUT); ++n;
- form = XmCreateForm(parent, "DisplayAreaForm", args, n);
- XtManageChild(form);
- /*
- * force the shadowThickness to zero. The XmManager will try to set
- * this to one.
- */
- n = 0;
- XtSetArg(args[n], XmNshadowThickness , 0); ++n;
- XtSetArg(args[n], XmNhighlightThickness, 0); ++n;
- XtSetValues (form, args, n);
- /*
- * get the colors and margin widths and heights
- */
- n = 0;
- XtSetArg (args[n], XmNmarginWidth , &margin_width); ++n;
- XtSetArg (args[n], XmNmarginHeight, &margin_height); ++n;
- XtSetArg (args[n], XmNcolormap , &colormap); ++n;
- XtGetValues(form, args, n);
- /* Create the vertical scrollbar. */
- pDAS->vertScrollWid = NULL;
- if (vert_flag != _DtHelpNONE)
- {
- if (vert_flag == _DtHelpSTATIC)
- pDAS->vertIsMapped = True;
- n = 0;
- XtSetArg(args[n], XmNtopAttachment , XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNtopOffset , 0); ++n;
- XtSetArg(args[n], XmNbottomAttachment , XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomOffset , margin_height); ++n;
- XtSetArg(args[n], XmNrightAttachment , XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightOffset , 0); ++n;
- XtSetArg(args[n], XmNorientation , XmVERTICAL); ++n;
- XtSetArg(args[n], XmNtraversalOn , True); ++n;
- XtSetArg(args[n], XmNhighlightThickness, 1); ++n;
- XtSetArg(args[n], XmNshadowType , XmSHADOW_IN); ++n;
- XtSetArg(args[n], XmNvalue , 0); ++n;
- XtSetArg(args[n], XmNminimum , 0); ++n;
- /* fake out the scrollbar manager, who will init dims to 100 */
- XtSetArg(args[n], XmNheight , 1); ++n;
- XtSetArg(args[n], XmNmaximum , 1); ++n;
- XtSetArg(args[n], XmNincrement , 1); ++n;
- XtSetArg(args[n], XmNpageIncrement , 1); ++n;
- XtSetArg(args[n], XmNsliderSize , 1); ++n;
- XtSetArg(args[n], XtNmappedWhenManaged , pDAS->vertIsMapped); ++n;
- pDAS->vertScrollWid = XmCreateScrollBar(form,
- "DisplayDtHelpVertScrollBar", args, n);
- XtManageChild(pDAS->vertScrollWid);
- if (vert_flag != _DtHelpSTATIC)
- pDAS->neededFlags = _DtHelpSET_AS_NEEDED (pDAS->neededFlags,
- _DtHelpVERTICAL_SCROLLBAR);
-
- XtAddCallback(pDAS->vertScrollWid, XmNdragCallback,
- _DtHelpVertScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->vertScrollWid, XmNincrementCallback,
- _DtHelpVertScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->vertScrollWid, XmNdecrementCallback,
- _DtHelpVertScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->vertScrollWid, XmNpageIncrementCallback,
- _DtHelpVertScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->vertScrollWid, XmNpageDecrementCallback,
- _DtHelpVertScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->vertScrollWid, XmNtoBottomCallback,
- _DtHelpVertScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->vertScrollWid, XmNtoTopCallback,
- _DtHelpVertScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->vertScrollWid, XmNvalueChangedCallback,
- _DtHelpVertScrollCB, (XtPointer) pDAS);
- XtAddEventHandler (pDAS->vertScrollWid, ButtonPressMask, True,
- (XtEventHandler)_DtHelpMoveBtnFocusCB,(XtPointer) pDAS);
- }
- /* Create the horizontal scrollbar. */
- pDAS->horzScrollWid = NULL;
- if (horz_flag != _DtHelpNONE)
- {
- if (horz_flag == _DtHelpSTATIC)
- pDAS->horzIsMapped = True;
- n = 0;
- XtSetArg(args[n], XmNbottomAttachment , XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomOffset , 0); ++n;
- XtSetArg(args[n], XmNrightAttachment , XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightOffset , margin_width); ++n;
- XtSetArg(args[n], XmNleftAttachment , XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset , 0); ++n;
- XtSetArg(args[n], XmNorientation , XmHORIZONTAL); ++n;
- XtSetArg(args[n], XmNtraversalOn , True); ++n;
- XtSetArg(args[n], XmNhighlightThickness, 1); ++n;
- XtSetArg(args[n], XmNshadowType , XmSHADOW_IN); ++n;
- XtSetArg(args[n], XmNvalue , 0); ++n;
- XtSetArg(args[n], XmNminimum , 0); ++n;
- XtSetArg(args[n], XmNmaximum , (pDAS->charWidth/10)); ++n;
- /* fake out the scrollbar manager, who will init dims to 100 */
- XtSetArg(args[n], XmNwidth , 1); ++n;
- XtSetArg(args[n], XmNincrement , (pDAS->charWidth/10)); ++n;
- XtSetArg(args[n], XmNpageIncrement , (pDAS->charWidth/10)); ++n;
- XtSetArg(args[n], XmNsliderSize , (pDAS->charWidth/10)); ++n;
- XtSetArg(args[n], XtNmappedWhenManaged , pDAS->horzIsMapped); ++n;
- pDAS->horzScrollWid = XmCreateScrollBar(form,
- "DisplayHorzScrollBar", args, n);
- XtManageChild(pDAS->horzScrollWid);
- if (horz_flag != _DtHelpSTATIC)
- pDAS->neededFlags = _DtHelpSET_AS_NEEDED (pDAS->neededFlags,
- _DtHelpHORIZONTAL_SCROLLBAR);
-
- XtAddCallback(pDAS->horzScrollWid, XmNdragCallback,
- _DtHelpHorzScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->horzScrollWid, XmNincrementCallback,
- _DtHelpHorzScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->horzScrollWid, XmNdecrementCallback,
- _DtHelpHorzScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->horzScrollWid, XmNpageIncrementCallback,
- _DtHelpHorzScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->horzScrollWid, XmNpageDecrementCallback,
- _DtHelpHorzScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->horzScrollWid, XmNtoBottomCallback,
- _DtHelpHorzScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->horzScrollWid, XmNtoTopCallback,
- _DtHelpHorzScrollCB, (XtPointer) pDAS);
- XtAddCallback(pDAS->horzScrollWid, XmNvalueChangedCallback,
- _DtHelpHorzScrollCB, (XtPointer) pDAS);
- }
- /*
- * check for the horizontal attachments
- */
- n = 0;
- if (horz_flag == _DtHelpSTATIC)
- {
- XtSetArg(args[n], XmNbottomAttachment , XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNbottomWidget , pDAS->horzScrollWid); ++n;
- }
- else
- {
- XtSetArg(args[n], XmNbottomAttachment , XmATTACH_FORM); ++n;
- }
- /*
- * check for the vertical attachments
- */
- if (vert_flag == _DtHelpSTATIC)
- {
- XtSetArg(args[n], XmNrightAttachment , XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNrightWidget , pDAS->vertScrollWid); ++n;
- }
- else
- {
- XtSetArg(args[n], XmNrightAttachment , XmATTACH_FORM); ++n;
- }
- /*
- * do the rest of the arguments
- */
- XtSetArg(args[n], XmNbottomOffset , margin_height); ++n;
- XtSetArg(args[n], XmNrightOffset , margin_width); ++n;
- XtSetArg(args[n], XmNtopAttachment , XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNtopOffset , 0); ++n;
- XtSetArg(args[n], XmNleftAttachment , XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset , 0); ++n;
- XtSetArg(args[n], XmNrecomputeSize , False); ++n;
- XtSetArg(args[n], XmNpushButtonEnabled , False); ++n;
- XtSetArg(args[n], XmNtraversalOn , True); ++n;
- XtSetArg(args[n], XmNhighlightThickness, 1); ++n;
- XtSetArg(args[n], XmNshadowType , XmSHADOW_IN); ++n;
- XtSetArg(args[n], XmNmultiClick , XmMULTICLICK_DISCARD); ++n;
- XtSetArg(args[n], XmNuserData , pDAS); ++n;
- pDAS->dispWid = XmCreateDrawnButton(form, name, args, n);
- XtManageChild(pDAS->dispWid);
-
- XtAddCallback(pDAS->dispWid, XmNexposeCallback, _DtHelpExposeCB,
- (XtPointer) pDAS);
- XtAddCallback(pDAS->dispWid, XmNresizeCallback, _DtHelpResizeCB,
- (XtPointer) pDAS);
- XtAddCallback(pDAS->dispWid, XmNarmCallback, _DtHelpClickOrSelectCB,
- (XtPointer) pDAS);
- XtAddCallback(pDAS->dispWid, XmNdisarmCallback, _DtHelpEndSelectionCB,
- (XtPointer) pDAS);
- XtAddEventHandler (pDAS->dispWid, Button1MotionMask, True,
- (XtEventHandler)_DtHelpMouseMoveCB, (XtPointer) pDAS);
- /*
- * add my actions
- * parse the translations.
- */
- _DtHelpProcessLock();
- if (DrawnBTrans == NULL)
- DrawnBTrans = XtParseTranslationTable(DrawnBTransTable);
- /*
- * override the translations
- XtSetArg(args[n], XmNtranslations , DrawnBTrans); ++n;
- */
- if (DrawnBTrans != NULL)
- XtOverrideTranslations(pDAS->dispWid, DrawnBTrans);
- _DtHelpProcessUnlock();
-
- if (_XmGetFocusPolicy(parent) == XmPOINTER)
- {
- XtAddEventHandler (pDAS->dispWid, EnterWindowMask, True,
- (XtEventHandler)_DtHelpEnterLeaveCB, (XtPointer) pDAS);
- XtAddEventHandler (pDAS->dispWid, LeaveWindowMask, True,
- (XtEventHandler)_DtHelpEnterLeaveCB, (XtPointer) pDAS);
- }
- else
- XtAddEventHandler (pDAS->dispWid, FocusChangeMask, True,
- (XtEventHandler)_DtHelpFocusCB, (XtPointer) pDAS);
- XtAddEventHandler (pDAS->dispWid, VisibilityChangeMask, True,
- (XtEventHandler)_DtHelpVisibilityCB, (XtPointer) pDAS);
-
- /* Add a destroy callback so that the display area can clean up prior to
- * the help widget getting destroyed (e.g. display area's parent)
- */
- XtAddCallback(pDAS->dispWid, XmNdestroyCallback,
- _DtHelpDisplayAreaDestroyCB, (XtPointer) pDAS);
-
- n = 0;
- XtSetArg(args[n], XmNshadowThickness , &shadowThick); ++n;
- XtSetArg(args[n], XmNhighlightThickness, &highThick); ++n;
- XtSetArg(args[n], XmNforeground , &(pDAS->foregroundColor)); ++n;
- XtSetArg(args[n], XmNbackground , &(pDAS->backgroundColor)); ++n;
- XtSetArg(args[n], XmNhighlightColor, &(pDAS->traversalColor) ); ++n;
- XtSetArg(args[n], XmNdepth , &(pDAS->depth) ); ++n;
- XtGetValues(pDAS->dispWid, args, n);
- pDAS->decorThickness = shadowThick + highThick;
- /*
- * Get the underline information
- */
- GetUnderLineInfo (dpy, pDAS, &(pDAS->lineThickness));
- /*
- * get the tiling pattern.
- */
- tile = XmGetPixmap (XtScreen(pDAS->dispWid), "50_foreground",
- pDAS->foregroundColor, pDAS->backgroundColor);
- /*
- * Get the data for the graphics contexts and create the GC's.
- */
- gcMask = (GCFunction | GCPlaneMask | GCForeground |
- GCBackground | GCLineWidth | GCLineStyle |
- GCClipXOrigin | GCClipYOrigin | GCClipMask);
- gcValues.function = GXcopy;
- gcValues.plane_mask = AllPlanes;
- gcValues.foreground = pDAS->foregroundColor;
- gcValues.background = pDAS->backgroundColor;
- gcValues.line_style = LineSolid;
- gcValues.line_width = pDAS->lineThickness;
- gcValues.clip_x_origin = 0;
- gcValues.clip_y_origin = 0;
- gcValues.clip_mask = None;
- if (tile)
- {
- gcMask |= GCTile;
- gcValues.tile = tile;
- }
-
- pDAS->normalGC = XCreateGC(dpy,
- RootWindowOfScreen(XtScreen(pDAS->dispWid)), gcMask, &gcValues);
- gcMask &= (~GCTile);
- pDAS->pixmapGC = XCreateGC(dpy,
- RootWindowOfScreen(XtScreen(pDAS->dispWid)), gcMask, &gcValues);
-
- gcValues.foreground = pDAS->backgroundColor;
- gcValues.background = pDAS->foregroundColor;
- pDAS->invertGC = XCreateGC(dpy,
- RootWindowOfScreen(XtScreen(pDAS->dispWid)), gcMask, &gcValues);
-
- /*
- * Set the size of the text view area to the requested
- * number of columns and lines.
- */
- char_width = pDAS->charWidth * columns;
- /*
- * Make sure the margins include enough room for a traversal line
- */
- if (((int) pDAS->marginWidth) < pDAS->lineThickness)
- pDAS->marginWidth = pDAS->lineThickness;
- if (((int) pDAS->marginHeight) < pDAS->lineThickness)
- pDAS->marginHeight = pDAS->lineThickness;
- if (pDAS->leading < pDAS->lineThickness)
- pDAS->leading = pDAS->lineThickness;
- /*
- * get the scrollbar widths.
- */
- if (NULL != pDAS->horzScrollWid)
- {
- n = 0;
- XtSetArg(args[n], XmNheight , &hBarHeight); n++;
- XtSetArg(args[n], XmNinitialDelay, &(pDAS->horz_init_scr)); n++;
- XtSetArg(args[n], XmNrepeatDelay , &(pDAS->horz_rep_scr)); n++;
- XtGetValues(pDAS->horzScrollWid, args, n);
- }
- if (NULL != pDAS->vertScrollWid)
- {
- n = 0;
- XtSetArg(args[n], XmNwidth , &vBarWidth); n++;
- XtSetArg(args[n], XmNinitialDelay, &(pDAS->vert_init_scr)); n++;
- XtSetArg(args[n], XmNrepeatDelay , &(pDAS->vert_rep_scr)); n++;
- XtGetValues(pDAS->vertScrollWid, args, n);
- }
- /*
- * calculate the display area height/width
- */
- pDAS->dispUseWidth = ((int) (char_width / 10 + (char_width % 10 ? 1 : 0)))
- + 2 * pDAS->marginWidth;
- if (vert_flag != _DtHelpSTATIC && pDAS->dispUseWidth < vBarWidth)
- pDAS->dispUseWidth = vBarWidth;
- pDAS->dispWidth = pDAS->dispUseWidth + 2 * pDAS->decorThickness;
- pDAS->dispUseHeight = pDAS->lineHeight * rows;
- if (horz_flag != _DtHelpSTATIC && pDAS->dispUseHeight < hBarHeight)
- pDAS->dispUseHeight = hBarHeight;
- pDAS->dispHeight = pDAS->dispUseHeight + 2 * pDAS->decorThickness;
- /*
- * Truncate the width and height to the size of the display.
- * This will prevent an X protocal error when it is asked for
- * a too large size. Besides, any decent window manager will
- * force the overall size to the height and width of the display.
- * This simply refines the size down to a closer (but not perfect)
- * fit.
- */
- if (((int) pDAS->dispWidth) > XDisplayWidth (dpy, screen)) {
- pDAS->dispWidth = XDisplayWidth (dpy, screen);
- }
- if (((int) pDAS->dispHeight) > XDisplayHeight (dpy, screen)) {
- pDAS->dispHeight = XDisplayHeight (dpy, screen);
- }
- n = 0;
- pDAS->formWidth = 0;
- pDAS->formHeight = 0;
- XtSetArg(args[n], XmNwidth, pDAS->dispWidth); ++n;
- XtSetArg(args[n], XmNheight, pDAS->dispHeight); ++n;
- XtSetValues(pDAS->dispWid, args, n);
- /*
- * set the scroll bar values
- */
- if (pDAS->vertScrollWid != NULL)
- {
- n = 0;
- XtSetArg(args[n], XmNmaximum , pDAS->dispUseHeight); ++n;
- XtSetArg(args[n], XmNincrement , pDAS->lineHeight); ++n;
- XtSetArg(args[n], XmNpageIncrement , pDAS->lineHeight); ++n;
- XtSetArg(args[n], XmNsliderSize , pDAS->dispUseHeight); ++n;
- XtSetValues(pDAS->vertScrollWid, args, n);
- }
-
- if (pDAS->resizeCall)
- (*(pDAS->resizeCall)) (pDAS->clientData);
- /*
- * calculate the offset for the right edge of the
- * horizontal scrollbar.
- */
- if (vert_flag == _DtHelpSTATIC && pDAS->horzScrollWid)
- {
- width = vBarWidth + margin_width;
- XtSetArg(args[0], XmNrightOffset , width);
- XtSetValues(pDAS->horzScrollWid, args, 1);
- }
- /*
- * calculate the offset for the bottom end of the
- * vertical scrollbar.
- */
- if (horz_flag == _DtHelpSTATIC && pDAS->vertScrollWid)
- {
- width = hBarHeight + margin_height;
- XtSetArg(args[0], XmNbottomOffset , width);
- XtSetValues(pDAS->vertScrollWid, args, 1);
- }
- rectangle[0].x = pDAS->decorThickness;
- rectangle[0].y = pDAS->decorThickness;
- rectangle[0].width = pDAS->dispUseWidth;
- rectangle[0].height = pDAS->dispUseHeight;
- XSetClipRectangles(XtDisplay(pDAS->dispWid), pDAS->normalGC, 0, 0,
- rectangle, 1, Unsorted);
- XSetClipRectangles(XtDisplay(pDAS->dispWid), pDAS->invertGC, 0, 0,
- rectangle, 1, Unsorted);
- /*
- * get the colormap and the visual
- */
- if (!XtIsShell(parent) && XtParent(parent) != NULL)
- parent = XtParent(parent);
- pDAS->visual = NULL;
- n = 0;
- XtSetArg (args[n], XmNcolormap, &(pDAS->colormap)); n++;
- XtSetArg (args[n], XmNvisual , &(pDAS->visual )); n++;
- XtGetValues (parent, args, n);
- if (pDAS->visual == NULL)
- pDAS->visual = XDefaultVisualOfScreen(XtScreen(pDAS->dispWid));
- /*
- * set up the canvas
- */
- _DtHelpProcessLock();
- DefVirtFunctions.exec_cmd_filter = exec_ok_routine;
- pDAS->canvas = _DtCanvasCreate (DefVirtFunctions, (_DtCvPointer) pDAS);
- _DtHelpProcessUnlock();
- return (XtPointer) pDAS;
- } /* End _DtHelpCreateDA */
- /*********************************************************************
- * Function: CreateDisplayArea
- *
- * Creates a Text Graphic area with the appropriate scroll bars.
- * specifying the size with rows and columns
- *
- *********************************************************************/
- XtPointer
- _DtHelpCreateDisplayArea(
- Widget parent,
- char *name,
- short vert_flag,
- short horz_flag,
- Boolean traversal_flag,
- int rows,
- int columns,
- void (*hyperTextCB)(),
- void (*resizeCB)(),
- int (*exec_ok_routine)(),
- XtPointer client_data,
- XmFontList default_list )
- {
- return HelpCreateDA(parent, name,
- vert_flag, horz_flag,
- traversal_flag,
- _DtCvIGNORE_BOUNDARY, _DtCvRENDER_PARTIAL,
- rows, columns, 100,
- hyperTextCB, resizeCB, exec_ok_routine,
- client_data, default_list);
- }
- /*********************************************************************
- * Function: CreateOutputArea
- *
- * Creates a Text Graphic area with the appropriate scroll bars.
- * specifying the size with width and height
- *
- *********************************************************************/
- XtPointer
- _DtHelpCreateOutputArea(
- Widget parent,
- char *name,
- short vert_flag,
- short horz_flag,
- Boolean traversal_flag,
- _DtCvValue honor_size,
- _DtCvRenderType render_type,
- Dimension width,
- Dimension height,
- unsigned short media_resolution,
- void (*hyperTextCB)(),
- void (*resizeCB)(),
- int (*exec_ok_routine)(),
- XtPointer client_data,
- XmFontList default_list )
- {
- DtHelpDispAreaStruct *pDAS;
- pDAS = HelpCreateDA(parent, name,
- vert_flag, horz_flag,
- traversal_flag, honor_size, render_type,
- 1, 1, media_resolution,
- hyperTextCB, resizeCB, exec_ok_routine,
- client_data, default_list);
- /* if area created successfully, then resize it to the given size */
- if (pDAS)
- _DtHelpSetScrollBars(pDAS, width, height);
- return pDAS;
- }
|