123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959 |
- /*
- * 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: SetList.c /main/16 1996/11/18 16:35:22 cde-hp $ */
- /************************************<+>*************************************
- ****************************************************************************
- **
- ** File: SetList.c
- **
- ** Project: Text Graphic Display Library
- **
- ** Description: This body of code creates the Line and Graphic Tables for
- ** a Display Area.
- **
- **
- ****************************************************************************
- ************************************<+>*************************************/
- /*
- * (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 <string.h>
- #include <stdlib.h>
- #include <X11/Xlib.h>
- /*
- * Canvas Engine
- */
- #include "CanvasP.h"
- #include "CanvasSegP.h"
- /*
- * private includes
- */
- #include "Access.h"
- #include "CleanUpI.h"
- #include "DisplayAreaP.h"
- #include "CallbacksI.h"
- #include "FontAttrI.h"
- #include "FormatI.h"
- #include "SetListI.h"
- #include "XInterfaceI.h"
- #include "XUICreateI.h"
- /******** Private Function Declarations ********/
- /******** End Public Function Declarations ********/
- /******************************************************************************
- *
- * Private defines and variables
- *
- *****************************************************************************/
- #define GROW_SIZE 10
- #define ALL_LINES -1
- /******************************************************************************
- *
- * Private Macros
- *
- *****************************************************************************/
- #define NeedVertScrollbar(x) \
- _DtHelpIS_AS_NEEDED((x)->neededFlags,_DtHelpVERTICAL_SCROLLBAR)
- #define NeedHorzScrollbar(x) \
- _DtHelpIS_AS_NEEDED((x)->neededFlags,_DtHelpHORIZONTAL_SCROLLBAR)
- /******************************************************************************
- *
- * Private Functions
- *
- *****************************************************************************/
- static void
- SetMaxPositions (
- DtHelpDispAreaStruct *pDAS,
- _DtCvUnit max_x,
- _DtCvUnit max_y)
- {
- pDAS->maxX = max_x;
- pDAS->maxYpos = max_y + pDAS->marginHeight;
- }
- /******************************************************************************
- *
- * Semi Public Functions - these routines called by other modules within
- * the library.
- *
- *****************************************************************************/
- /******************************************************************************
- * Function: _DtHelpSetScrollBars
- *
- * Sets/Resets the vertical scroll bar values.
- *****************************************************************************/
- enum DoSomething { DoNothing, DoManage, DoUnmanage };
- Boolean
- _DtHelpSetScrollBars (
- XtPointer client_data,
- Dimension new_width,
- Dimension new_height)
- {
- int n = 0;
- int dispN = 0;
- int changeWidth = 0;
- int changeHeight = 0;
- int oldMaxYpos;
- int slideSize;
- int maximum;
- int pageInc;
- int oldScrollPercent = 10000;
- _DtCvUnit ret_width;
- _DtCvUnit ret_height;
- Arg dispArgs[10];
- Arg args[10];
- Dimension marginWidth;
- Dimension marginHeight;
- Dimension horzHeight;
- Dimension vertWidth;
- Dimension oldHeight;
- Dimension oldWidth;
- XRectangle rectangle[1];
- enum DoSomething doVert = DoNothing;
- enum DoSomething doHorz = DoNothing;
- DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
- /*
- * remember the old first line.
- */
- oldMaxYpos = pDAS->maxYpos;
- if (pDAS->firstVisible && pDAS->maxYpos)
- oldScrollPercent = pDAS->firstVisible * 10000 / pDAS->maxYpos;
- /*
- * get the width and height of the scroll bars.
- */
- if (pDAS->vertScrollWid)
- {
- XtSetArg (args[0], XmNwidth , &vertWidth);
- XtGetValues (pDAS->vertScrollWid, args, 1);
- }
- if (pDAS->horzScrollWid)
- {
- XtSetArg (args[0], XmNheight , &horzHeight);
- XtGetValues (pDAS->horzScrollWid, args, 1);
- }
- /*
- * remember our old width and height
- */
- oldWidth = pDAS->dispWidth;
- oldHeight = pDAS->dispHeight;
- /*
- * Settle the sizing issue before we remap the scroll bars.
- */
- do
- {
- /*
- * set the height.
- */
- if (new_height != pDAS->dispHeight)
- {
- pDAS->dispHeight = new_height;
- pDAS->dispUseHeight = new_height - 2 * pDAS->decorThickness;
- if (((int) new_height) < 2 * ((int) pDAS->decorThickness))
- pDAS->dispUseHeight = 0;
- pDAS->visibleCount = ((int) pDAS->dispUseHeight) /
- pDAS->lineHeight;
- if (pDAS->visibleCount < 0)
- pDAS->visibleCount = 0;
- }
- /*
- * check to see if we've changed width
- */
- if (new_width != pDAS->dispWidth)
- {
- /*
- * set the new width
- */
- pDAS->dispWidth = new_width;
- pDAS->dispUseWidth = new_width - 2 * pDAS->decorThickness;
- if (((int)new_width) < 2 * ((int) pDAS->decorThickness))
- pDAS->dispUseWidth = 0;
- /*
- * re-layout the information.
- */
- if (_DtCvSTATUS_OK ==
- _DtCanvasResize(pDAS->canvas, _DtCvFALSE,
- &ret_width, &ret_height))
- SetMaxPositions (pDAS, ret_width, ret_height);
- }
- /*
- * Check to see if we have a vertical scrollbar and whether it
- * is as_needed. If static, it is always mapped.
- */
- if (NULL != pDAS->vertScrollWid && NeedVertScrollbar(pDAS))
- {
- /*
- * will the information fit on one page?
- */
- if (pDAS->maxYpos <= ((int) pDAS->dispUseHeight))
- {
- /*
- * If the window has not already been 'stretched' by
- * the width of the scrollbar and if the scrollbar is
- * mapped, grow the window width.
- */
- if (0 == changeWidth && pDAS->vertIsMapped)
- {
- /*
- * set the flag to indicate that the window width
- * has grown. This can occur only if the window
- * has its vertical scrollbar already mapped.
- */
- changeWidth = 1;
- new_width += vertWidth;
- }
- /*
- * Else check to see if the window has been shrunk.
- * If so, then stretch it back out to its original
- * width.
- *
- * This can occur only if
- * a) The vertical scrollbar is not mapped.
- * b) The previous pass through this code indicates
- * that the window could not hold the length of
- * the information, and therefore calculations and
- * flags were set to map the vertical scrollbar.
- * But a _DtCanvasResize() now indicates that a
- * vertical scrollbar is not needed. So we don't
- * need the vertical scrollbar and have to nuliify
- * the calculation to include it.
- */
- else if (-1 == changeWidth)
- {
- changeWidth = 0;
- new_width += vertWidth;
- }
- }
- /*
- * The information will not fit on one page.
- */
- else
- {
- /*
- * If the window has not already been shrunk to
- * accomidate the vertical scrollbar (and the scrollbar
- * is not already mapped) then set the flags and
- * shrink the width.
- */
- if (False == pDAS->vertIsMapped && 0 == changeWidth)
- {
- /*
- * set the flag to indicate that the window width
- * has shrunk (and that consequently, the vertical
- * scrollbar is not mapped).
- */
- changeWidth = -1;
- if (new_width > vertWidth)
- new_width -= vertWidth;
- else
- new_width = 0;
- }
- /*
- * Else check to see if the window has been streched.
- * If so, then shrink it back out to its original
- * width.
- *
- * This can occur only if
- * a) The vertical scrollbar is mapped.
- * b) The previous pass through this code indicates
- * that the window could hold the length of
- * the information, and therefore calculations and
- * flags were set to unmap the vertical scrollbar.
- * But a _DtCanvasResize() now indicates that a
- * vertical scrollbar is needed. So we need
- * the vertical scrollbar and have to nuliify
- * the calculation to eliminate it.
- */
- else if (1 == changeWidth)
- {
- changeWidth = 0;
- new_width -= vertWidth;
- }
- }
- }
- /*
- * Check to see if we have a horizontal scrollbar and whether it
- * is as_needed. If static, it is always mapped.
- */
- if (NULL != pDAS->horzScrollWid && NeedHorzScrollbar(pDAS))
- {
- /*
- * will the information fit within the right border?
- */
- if (pDAS->maxX <= ((int) pDAS->dispUseWidth))
- {
- /*
- * If the window has not already been 'stretched' by
- * the height of the scrollbar and if the scrollbar is
- * mapped, grow the window.
- */
- if (0 == changeHeight && pDAS->horzIsMapped)
- {
- /*
- * set the flag to indicate that the window has
- * grown. This can occur only if the window has
- * its horizontal scrollbar already mapped.
- */
- changeHeight = 1;
- new_height += horzHeight;
- }
- /*
- * Else check to see if the window has been shrunk.
- * If so, stretch it back to its original height.
- *
- * This can occur only if
- * a) The horizontal scrollbar is not mapped.
- * b) The previous pass through the code indicated
- * that the information exceeded the right border
- * and therefore calculations and flags were set
- * to map the horizontal scrollbar. But a
- * _DtCanvasResize() now indicates that the
- * horizontal scrollbar is not needed. So we
- * have to nullify the calculations and flags
- * set to include it.
- */
- else if (-1 == changeHeight)
- {
- changeHeight = 0;
- new_height += horzHeight;
- }
- }
- /*
- * The information exceeds the right border of the window.
- */
- else
- {
- /*
- * If the window has no already been shrunk to
- * accomidate the horizontal scrollbar (and the
- * scrollbar is not already mapped), then set the
- * flags and shrink the height.
- */
- if (False == pDAS->horzIsMapped && 0 == changeHeight)
- {
- /*
- * set the flag to indicate that the window height
- * has shrunk (and that the scrollbar needs mapping).
- */
- changeHeight = -1;
- if (new_height > horzHeight)
- new_height -= horzHeight;
- else
- new_height = 0;
- }
- /*
- * Else check to see if the window has been streched.
- * If so, then shrink it back out to its original
- * height.
- *
- * This can occur only if
- * a) The horizontal scrollbar is mapped.
- * b) The previous pass through the code indicated
- * that the information did not exceeded the right
- * border and therefore calculations and flags were
- * set to unmap the horizontal scrollbar. But a
- * _DtCanvasResize() now indicates that the
- * horizontal scrollbar is needed. So we
- * have to nullify the calculations and flags
- * set to exclude it.
- */
- else if (1 == changeHeight)
- {
- changeHeight = 0;
- new_height -= horzHeight;
- }
- }
- }
- } while (new_height != pDAS->dispHeight || new_width != pDAS->dispWidth);
- /*
- * reset the first visible line, if needed.
- */
- if (oldScrollPercent != 10000 && pDAS->maxYpos != oldMaxYpos)
- pDAS->firstVisible = pDAS->maxYpos * oldScrollPercent / 10000;
- if (pDAS->firstVisible + ((int)pDAS->dispUseHeight) > pDAS->maxYpos)
- pDAS->firstVisible = pDAS->maxYpos - pDAS->dispUseHeight;
- if (pDAS->firstVisible < 0)
- pDAS->firstVisible = 0;
- /*
- * Reset the virtual X value, if needed
- */
- if (pDAS->virtualX &&
- (pDAS->maxX - pDAS->virtualX < ((int) pDAS->dispUseWidth)))
- {
- pDAS->virtualX = pDAS->maxX - pDAS->dispUseWidth;
- if (pDAS->virtualX < 0)
- pDAS->virtualX = 0;
- }
- /*
- * If I've changed my size, I've got to change my clip masks.
- */
- if (oldWidth != pDAS->dispWidth || oldHeight != pDAS->dispHeight)
- {
- /*
- * If the display area hasn't been realized, the resetting of
- * the bottom right corner offsets will not cause a resize
- * event to occur. Rather the overall window will grow by
- * the width or height of the scroll bar and not cause the
- * display area to shrink. Therefore when the exposure event
- * is called the width or height will be not be equal to what
- * I think it should be causing the code to believe a resize
- * is in process. The short of the matter is that the exposure
- * will not happen and we end up with a blank window.
- *
- * So for this case, resize the display area to what we think it
- * should be and the exposure event will then happen.
- if (!XtIsRealized (pDAS->dispWid))
- */
- {
- XtSetArg(dispArgs[dispN], XmNwidth, pDAS->dispWidth); ++dispN;
- XtSetArg(dispArgs[dispN], XmNheight, pDAS->dispHeight); ++dispN;
- }
- 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);
- if (pDAS->resizeCall)
- (*(pDAS->resizeCall)) (pDAS->clientData);
- }
- /*
- * Has the width changed? If so, then we are mapping or unmapping
- * the vertical scrollbar.
- */
- if (-1 == changeWidth)
- {
- /*
- * manage the scrollbar, the window has shrunk.
- */
- doVert = DoManage;
- XtSetArg(dispArgs[dispN], XmNrightAttachment, XmATTACH_WIDGET);
- ++dispN;
- XtSetArg(dispArgs[dispN], XmNrightWidget, pDAS->vertScrollWid);
- ++dispN;
- }
- else if (1 == changeWidth)
- {
- /*
- * unmanage the scrollbar, the window has grown.
- */
- doVert = DoUnmanage;
- XtSetArg(dispArgs[dispN], XmNrightAttachment, XmATTACH_FORM);
- ++dispN;
- }
- /*
- * Has the height changed? If so, then we are mapping or unmapping
- * the horizontal scrollbar.
- */
- if (-1 == changeHeight)
- {
- /*
- * manage the scrollbar, the window has shrunk.
- */
- doHorz = DoManage;
- XtSetArg(dispArgs[dispN], XmNbottomAttachment,XmATTACH_WIDGET);
- ++dispN;
- XtSetArg(dispArgs[dispN], XmNbottomWidget,pDAS->horzScrollWid);
- ++dispN;
- }
- else if (1 == changeHeight)
- {
- /*
- * unmanage the scrollbar, the window has grown.
- */
- doHorz = DoUnmanage;
- XtSetArg(dispArgs[dispN], XmNbottomAttachment, XmATTACH_FORM);
- ++dispN;
- }
- /*
- * get the margins, widths and height.
- */
- XtSetArg (args[0], XmNmarginWidth , &marginWidth);
- XtSetArg (args[1], XmNmarginHeight, &marginHeight);
- XtGetValues (XtParent (pDAS->dispWid), args, 2);
- /*
- * have to map the scroll bars before the drawn button can be
- * attached to them and can't unmap the scroll bars until
- * the drawn button has been unattached from them. But we
- * want to do the re-attachments all at once to minimize the
- * resizing.
- */
- if (doHorz == DoManage)
- {
- if (!XtIsRealized(pDAS->horzScrollWid))
- XtSetMappedWhenManaged (pDAS->horzScrollWid, True);
- else
- XtMapWidget (pDAS->horzScrollWid);
- pDAS->horzIsMapped = True;
- }
- if (doVert == DoManage)
- {
- if (!XtIsRealized(pDAS->vertScrollWid))
- XtSetMappedWhenManaged (pDAS->vertScrollWid, True);
- else
- XtMapWidget (pDAS->vertScrollWid);
- pDAS->vertIsMapped = True;
- }
- if (pDAS->vertScrollWid && pDAS->vertIsMapped && doVert != DoUnmanage)
- {
- if (pDAS->horzScrollWid && pDAS->horzIsMapped && doHorz != DoUnmanage)
- XtSetArg(args[0], XmNbottomOffset, (marginHeight + horzHeight));
- else
- XtSetArg(args[0], XmNbottomOffset, marginHeight);
- n = 1;
- /*
- * set the slider size.
- */
- slideSize = pDAS->dispUseHeight;
- if (slideSize < 1)
- slideSize = 1;
-
- /*
- * determine the maximum size
- */
- maximum = pDAS->maxYpos;
- if (maximum < slideSize)
- maximum = slideSize;
- if (maximum < 1)
- maximum = 1;
-
- /*
- * determine the page increment.
- */
- pageInc = 1;
- if (((int)pDAS->dispUseHeight) - pDAS->lineHeight > 2)
- pageInc = pDAS->dispUseHeight - pDAS->lineHeight;
- XtSetArg (args[n], XmNvalue , pDAS->firstVisible); ++n;
- XtSetArg (args[n], XmNsliderSize , slideSize); ++n;
- XtSetArg (args[n], XmNmaximum , maximum); ++n;
- XtSetArg (args[n], XmNpageIncrement, pageInc); ++n;
- XtSetValues (pDAS->vertScrollWid, args, n);
- }
- if (pDAS->horzScrollWid && pDAS->horzIsMapped && doHorz != DoUnmanage)
- {
- if (pDAS->vertScrollWid && pDAS->vertIsMapped && doVert != DoUnmanage)
- XtSetArg(args[0], XmNrightOffset, (marginWidth + vertWidth));
- else
- XtSetArg(args[0], XmNrightOffset, marginWidth);
- n = 1;
- /*
- * determine the slider size.
- */
- slideSize = pDAS->dispUseWidth - 1;
- if (slideSize < 1)
- slideSize = 1;
- /*
- * determine the maximum size
- */
- maximum = slideSize;
- if (maximum < pDAS->maxX)
- maximum = pDAS->maxX - 1;
- if (maximum < 1)
- maximum = 1;
- /*
- * determine the page increment.
- */
- pageInc = 1;
- if (((int) pDAS->dispUseWidth) > 2)
- pageInc = pDAS->dispUseWidth - 1;
- XtSetArg (args[n], XmNvalue , pDAS->virtualX); n++;
- XtSetArg (args[n], XmNsliderSize , slideSize); n++;
- XtSetArg (args[n], XmNmaximum , maximum); n++;
- XtSetArg (args[n], XmNpageIncrement, pageInc); ++n;
- XtSetValues (pDAS->horzScrollWid, args, n);
- }
- /*
- * set the display area args
- */
- if (dispN)
- XtSetValues (pDAS->dispWid, dispArgs, dispN);
- /*
- * unmap those we don't want.
- */
- if (doHorz == DoUnmanage)
- {
- if (!XtIsRealized(pDAS->horzScrollWid))
- XtSetMappedWhenManaged (pDAS->horzScrollWid, False);
- else
- XtUnmapWidget (pDAS->horzScrollWid);
- pDAS->horzIsMapped = False;
- }
- if (doVert == DoUnmanage)
- {
- if (!XtIsRealized(pDAS->vertScrollWid))
- XtSetMappedWhenManaged (pDAS->vertScrollWid, False);
- else
- XtUnmapWidget (pDAS->vertScrollWid);
- pDAS->vertIsMapped = False;
- }
- /*
- * return whether or not we generated a resize (and hence an expose
- * event) by resizing the display area.
- */
- return (dispN ? True : False);
- } /* End _DtHelpSetScrollBars */
- /******************************************************************************
- *
- * Public Functions - those an application developer can call.
- *
- *****************************************************************************/
- /*********************************************************************
- * Function: SetList
- *
- * SetList creates a Text Graphic area with the appropriate scroll bars.
- *
- *********************************************************************/
- void
- _DtHelpDisplayAreaSetList (
- XtPointer client_data,
- XtPointer topic_handle,
- Boolean append_flag,
- int scroll_percent)
- {
- _DtCvUnit width;
- _DtCvUnit height;
- _DtCvUnit scrollY;
- DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
- /*
- * clear the selection
- */
- _DtHelpClearSelection (client_data);
- /*
- * If there is anything to do
- */
- _DtCanvasSetTopic (pDAS->canvas, (_DtCvTopicPtr) topic_handle,
- pDAS->honor_size,
- &width, &height, &scrollY);
- /*
- * free the old topic and remember the new
- */
- _DtHelpDestroyTopicData(pDAS->lst_topic, _DtHelpDADestroyRegion,
- (_DtCvPointer) pDAS);
- pDAS->lst_topic = (_DtCvTopicPtr) topic_handle;
- /*
- * do we want to scroll?
- */
- if (scroll_percent != -1)
- scrollY = scroll_percent * height / 1000;
- /*
- * Reset the scroll bars and perhaps do an expose.
- */
- SetMaxPositions (pDAS, width, height);
- pDAS->firstVisible = scrollY;
- if (pDAS->firstVisible + ((int)pDAS->dispUseHeight) > pDAS->maxYpos)
- pDAS->firstVisible = pDAS->maxYpos - pDAS->dispUseHeight;
- if (pDAS->firstVisible < 0)
- pDAS->firstVisible = 0;
- (void) _DtHelpSetScrollBars (client_data, pDAS->dispWidth, pDAS->dispHeight);
- if (XtIsRealized (pDAS->dispWid))
- _DtHelpCleanAndDrawWholeCanvas(client_data);
- } /* End _DtHelpDisplayAreaSetList */
- /*****************************************************************************
- * Function: void _DtHelpDisplayAreaDimensionsReturn (DtHelpDispAreaStruct *pDAS,
- * int *ret_width, int *ret_height)
- *
- * Parameters pDAS Specifies the Display Area.
- * ret_rows Returns the number of rows in
- * the Display Area.
- * ret_columns Returns the number of columns in
- * the Display Area.
- *
- * Returns: nothing
- *
- * Purpose: Allows access to the height and width of a Display Area.
- *
- *****************************************************************************/
- void
- _DtHelpDisplayAreaDimensionsReturn (
- XtPointer client_data,
- short *ret_rows,
- short *ret_columns )
- {
- DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
- *ret_rows = ((int)pDAS->dispUseHeight) / pDAS->lineHeight;
- *ret_columns = ((int) pDAS->dispUseWidth) / (pDAS->charWidth / 10);
- } /* End _DtHelpDisplayAreaDimensionsReturn */
- /*****************************************************************************
- * Function: int _DtHelpGetScrollbarValue (DtHelpDispAreaStruct *pDAS)
- *
- * Parameters pDAS Specifies the Display Area.
- *
- * Returns: a value from -1 to 100.
- * -1 means the vertical scrollbar was not created when
- * the display area was created.
- * 0 to 100 is the percentage the vertical scroll bar is
- * scrolled displaying the current topic.
- *
- * Purpose: Allows the system to query the location of the scrollbar
- * and remember for smart-backtracking.
- *
- *****************************************************************************/
- int
- _DtHelpGetScrollbarValue (XtPointer client_data)
- {
- DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
- int percent = -1;
- if (pDAS->vertScrollWid != NULL)
- {
- percent = 0;
- if (pDAS->firstVisible && pDAS->maxYpos)
- percent = (pDAS->firstVisible * 1000) / pDAS->maxYpos;
- }
- return percent;
- } /* End _DtHelpGetScrollbarValue */
- /*****************************************************************************
- * Function: int _DtHelpUpdatePath (DtHelpDispAreaStruct *pDAS,
- *
- * Parameters pDAS Specifies the Display Area.
- *
- * Returns: a value from -1 to 100.
- * -1 means the vertical scrollbar was not created when
- * the display area was created.
- * 0 to 100 is the percentage the vertical scroll bar is
- * scrolled displaying the current topic.
- *
- * Purpose: Allows the system to query the location of the scrollbar
- * and remember for smart-backtracking.
- *
- *****************************************************************************/
- int
- _DtHelpUpdatePath (
- DtHelpDispAreaStruct *pDAS,
- _DtHelpVolumeHdl volume_handle,
- char *loc_id)
- {
- int result;
- char *realId;
- _DtCvUnit width;
- _DtCvUnit height;
- _DtCvUnit tocY;
- _DtCvUnit tocHeight;
- XtPointer topic_handle;
- /*
- * turn off the toc marker
- */
- _DtHelpDATocMarker(pDAS, False);
- (void) _DtCanvasMoveTraversal(pDAS->canvas, _DtCvTRAVERSAL_OFF, False,
- ((_DtCvValue) XtIsRealized(pDAS->dispWid)),
- NULL, NULL, NULL, NULL, NULL);
- /*
- * now create and set the topic
- */
- result = _DtHelpFormatToc(pDAS,volume_handle,loc_id,&realId,&topic_handle);
- if (-1 == result)
- return -1;
- _DtCanvasSetTopic (pDAS->canvas, (_DtCvTopicPtr) topic_handle,
- pDAS->honor_size,
- &width, &height, NULL);
- /*
- * free the old topic and remember the new
- */
- _DtHelpDestroyTopicData(pDAS->lst_topic, _DtHelpDADestroyRegion,
- (_DtCvPointer) pDAS);
- pDAS->lst_topic = (_DtCvTopicPtr) topic_handle;
- /*
- * Reset the scroll bars and perhaps do an expose.
- */
- SetMaxPositions (pDAS, width, height);
- /*
- * now turn the traversal on - but only if there is a path in
- * the TOC.
- */
- if (1 != result)
- {
- (void) _DtCanvasMoveTraversal(pDAS->canvas, _DtCvTRAVERSAL_ID, False,
- ((_DtCvStatus) XtIsRealized(pDAS->dispWid)), realId,
- NULL, &(pDAS->toc_y), &(pDAS->toc_base), &(pDAS->toc_height));
- /*
- * figure out where the first line should be...
- */
- tocY = pDAS->toc_y - pDAS->lineThickness;
- tocHeight = pDAS->toc_height + (2 * pDAS->lineThickness);
- if (tocY < pDAS->firstVisible ||
- tocY + tocHeight > pDAS->firstVisible + ((int)pDAS->dispUseHeight))
- {
- pDAS->firstVisible = tocY;
- if (pDAS->firstVisible + ((int)pDAS->dispUseHeight) > pDAS->maxYpos)
- pDAS->firstVisible = pDAS->maxYpos - pDAS->dispUseHeight;
- if (pDAS->firstVisible < 0)
- pDAS->firstVisible = 0;
- }
- }
- /*
- * Reset the scroll bars and perhaps do an expose.
- */
- (void) _DtHelpSetScrollBars((XtPointer) pDAS, pDAS->dispWidth, pDAS->dispHeight);
- if (XtIsRealized (pDAS->dispWid))
- _DtHelpCleanAndDrawWholeCanvas((XtPointer) pDAS);
- if (1 != result)
- _DtHelpDATocMarker((XtPointer) pDAS, True);
- return 0;
- } /* End _DtHelpUpdatePath */
- /*****************************************************************************
- * Function: Widget _DtHelpDisplayAreaWidget ();
- *
- * Parameters:
- * client_data Specifies the display area pointer.
- *
- * Returns: the widget associated with the display area.
- *
- * Purpose:
- *
- *****************************************************************************/
- Widget
- _DtHelpDisplayAreaWidget (
- XtPointer client_data)
- {
- DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
- return (pDAS->dispWid);
- }
- /*****************************************************************************
- * Function: XtPointer _DtHelpDisplayAreaData ();
- *
- * Parameters:
- * client_data Specifies the display area pointer.
- *
- * Returns: the client data associated with the display area.
- *
- * Purpose:
- *
- *****************************************************************************/
- XtPointer
- _DtHelpDisplayAreaData (
- XtPointer client_data)
- {
- DtHelpDispAreaStruct *pDAS = (DtHelpDispAreaStruct *) client_data;
- return (pDAS->clientData);
- }
|