964 lines
27 KiB
C
964 lines
27 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 librararies 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"
|
|
|
|
#ifdef NLS16
|
|
#include <nl_types.h>
|
|
#endif
|
|
|
|
/******** 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);
|
|
}
|