summaryrefslogtreecommitdiffstats
path: root/filters/kword/pdf/xpdf/xpdf/XPDFTree.cc
diff options
context:
space:
mode:
Diffstat (limited to 'filters/kword/pdf/xpdf/xpdf/XPDFTree.cc')
-rw-r--r--filters/kword/pdf/xpdf/xpdf/XPDFTree.cc929
1 files changed, 0 insertions, 929 deletions
diff --git a/filters/kword/pdf/xpdf/xpdf/XPDFTree.cc b/filters/kword/pdf/xpdf/xpdf/XPDFTree.cc
deleted file mode 100644
index 46e5466c5..000000000
--- a/filters/kword/pdf/xpdf/xpdf/XPDFTree.cc
+++ /dev/null
@@ -1,929 +0,0 @@
-//========================================================================
-//
-// XPDFTree.cc
-//
-//========================================================================
-
-#include <stdlib.h>
-#include "gmem.h"
-#include "XPDFTreeP.h"
-
-//------------------------------------------------------------------------
-
-#define xpdfTreeIndent 16
-
-//------------------------------------------------------------------------
-
-struct _XPDFTreeEntry {
- Widget widget;
- XPDFTreeEntry *children;
- XPDFTreeEntry *next;
-};
-
-//------------------------------------------------------------------------
-
-static void classPartInitialize(WidgetClass widgetClass);
-static void initialize(Widget requestWidget, Widget newWidget,
- ArgList args, Cardinal *numArgs);
-static void destroy(Widget widget);
-static void destroySubtree(XPDFTreeEntry *e);
-static void resize(Widget widget);
-static void redisplay(Widget widget, XEvent *event, Region region);
-static void redisplaySubtree(XPDFTreeWidget w, XPDFTreeEntry *e,
- XEvent *event, Region region);
-static void drawExpandedIcon(XPDFTreeWidget w, Position x, Position y);
-static void drawCollapsedIcon(XPDFTreeWidget w, Position x, Position y);
-static Boolean setValues(Widget oldWidget, Widget requestWidget,
- Widget newWidget, ArgList args, Cardinal *numArgs);
-static void setValuesAlmost(Widget oldWidget, Widget newWidget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply);
-static XtGeometryResult queryGeometry(Widget widget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply);
-static XtGeometryResult geometryManager(Widget widget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply);
-static void changeManaged(Widget widget);
-static void initConstraint(Widget requestWidget, Widget newWidget,
- ArgList args, Cardinal *numArgs);
-static void destroyConstraint(Widget widget);
-static void deleteSubtree(Widget widget);
-static Boolean constraintSetValues(Widget oldWidget, Widget requestWidget,
- Widget newWidget,
- ArgList args, Cardinal *numArgs);
-static void insertChildOnList(XPDFTreeEntry *e, XPDFTreeEntry **listHead);
-static void deleteChildFromList(XPDFTreeEntry *e, XPDFTreeEntry **listHead);
-static void createGC(Widget widget);
-static void destroyGC(Widget widget);
-static void layout(Widget widget, Widget instigator);
-static int layoutSubtree(XPDFTreeWidget w, Widget instigator,
- XPDFTreeEntry *e, Position x, Position y,
- Boolean visible);
-static void calcSize(Widget widget, Widget instigator,
- Dimension *totalWidth,
- Dimension *totalHeight);
-static void calcSubtreeSize(XPDFTreeWidget w, Widget instigator,
- XPDFTreeEntry *e,
- Dimension *width, Dimension *height);
-static Boolean needRelayout(Widget oldWidget, Widget newWidget);
-static void click(Widget widget, XEvent *event,
- String *params, Cardinal *numParams);
-static Boolean findPosition(XPDFTreeWidget w, int x, int y,
- XPDFTreeEntry **e, Boolean *onExpandIcon);
-static Boolean findPositionInSubtree(XPDFTreeWidget w, int x, int y,
- XPDFTreeEntry **e,
- Boolean *onExpandIcon);
-
-//------------------------------------------------------------------------
-
-static XtResource resources[] = {
- { XmNmarginWidth, XmCMarginWidth, XmRHorizontalDimension,
- sizeof(Dimension), XtOffsetOf(XPDFTreeRec, tree.marginWidth),
- XmRImmediate, (XtPointer)0 },
- { XmNmarginHeight, XmCMarginHeight, XmRVerticalDimension,
- sizeof(Dimension), XtOffsetOf(XPDFTreeRec, tree.marginHeight),
- XmRImmediate, (XtPointer)0 },
- { XPDFNselectionCallback, XmCCallback, XmRCallback,
- sizeof(XtCallbackList), XtOffsetOf(XPDFTreeRec, tree.selectCallback),
- XmRImmediate, (XtPointer)NULL }
-};
-
-static XmSyntheticResource synResources[] = {
- { XmNmarginWidth, sizeof(Dimension),
- XtOffsetOf(XPDFTreeRec, tree.marginWidth),
-#if XmVERSION > 1
- XmeFromHorizontalPixels, XmeToHorizontalPixels
-#else
- _XmFromHorizontalPixels, _XmToHorizontalPixels
-#endif
- },
- { XmNmarginHeight, sizeof(Dimension),
- XtOffsetOf(XPDFTreeRec, tree.marginHeight),
-#if XmVERSION > 1
- XmeFromVerticalPixels, XmeToVerticalPixels
-#else
- _XmFromVerticalPixels, _XmToVerticalPixels
-#endif
- }
-};
-
-static XtResource constraints[] = {
- { XPDFNentryParent, XPDFCentryParent, XmRWidget,
- sizeof(Widget), XtOffsetOf(XPDFTreeConstraintRec, tree.entryParent),
- XmRImmediate, (XtPointer)NULL },
- { XPDFNentryExpanded, XPDFCentryExpanded, XmRBoolean,
- sizeof(Boolean), XtOffsetOf(XPDFTreeConstraintRec, tree.entryExpanded),
- XmRImmediate, (XtPointer)False },
- { XPDFNentryPosition, XPDFCentryPosition, XmRInt,
- sizeof(int), XtOffsetOf(XPDFTreeConstraintRec, tree.entryPosition),
- XmRImmediate, (XtPointer)0 }
-};
-
-static char defaultTranslations[] =
- "<Btn1Down>: XPDFTreeClick()";
-
-static XtActionsRec actions[] = {
- { "XPDFTreeClick", click }
-};
-
-externaldef(xpdftreeclassrec) XPDFTreeClassRec xpdfTreeClassRec = {
- { // Core
- (WidgetClass)&xmManagerClassRec, // superclass
- "XPDFTree", // class_name
- sizeof(XPDFTreeRec), // widget_size
- NULL, // class_initialize
- &classPartInitialize, // class_part_initialize
- FALSE, // class_inited
- &initialize, // initialize
- NULL, // initialize_hook
- XtInheritRealize, // realize
- actions, // actions
- XtNumber(actions), // num_actions
- resources, // resources
- XtNumber(resources), // num_resources
- NULLQUARK, // xrm_class
- TRUE, // compress_motion
- XtExposeCompressMaximal, // compress_exposure
- TRUE, // compress_enterleave
- FALSE, // visible_interest
- &destroy, // destroy
- &resize, // resize
- &redisplay, // expose
- &setValues, // set_values
- NULL, // set_values_hook
- &setValuesAlmost, // set_values_almost
- NULL, // get_values_hook
- NULL, // accept_focus
- XtVersion, // version
- NULL, // callback_private
- defaultTranslations, // tm_table
- &queryGeometry, // query_geometry
- NULL, // display_accelerator
- NULL // extension
- },
- { // Composite
- &geometryManager, // geometry_manager
- &changeManaged, // change_managed
- XtInheritInsertChild, // insert_child
- XtInheritDeleteChild, // delete_child
- NULL // extension
- },
- { // Constraint
- constraints, // constraint_resources
- XtNumber(constraints), // constraint_num_resources
- sizeof(XPDFTreeConstraintRec), // constraint_size
- &initConstraint, // constraint_initialize
- &destroyConstraint, // constraint_destroy
- &constraintSetValues, // constraint_set_values
- NULL // extension
- },
- { // XmManager
- XtInheritTranslations, // translations
-#if XmVERSION > 1
- synResources, // syn_resources
- XtNumber(synResources), // num_syn_resources
-#else
- NULL, // syn_resources
- 0, // num_syn_resources
-#endif
- NULL, // syn_constraint_resources
- 0, // num_syn_constraint_res's
- XmInheritParentProcess, // parent_process
- NULL // extension
- },
- { // XPDFTree
- &createGC, // createGC
- &destroyGC, // destroyGC
- &layout, // layout
- &calcSize, // calcSize
- &needRelayout, // needRelayout
- NULL // extension
- }
-};
-
-externaldef(xpdftreewidgetclass) WidgetClass xpdfTreeWidgetClass =
- (WidgetClass)&xpdfTreeClassRec;
-
-//------------------------------------------------------------------------
-
-static void classPartInitialize(WidgetClass widgetCls) {
- XPDFTreeWidgetClass wc = (XPDFTreeWidgetClass)widgetCls;
- XPDFTreeWidgetClass sc = (XPDFTreeWidgetClass)wc->coreClass.superclass;
-
- // method inheritance
- if (wc->treeClass.createGC == XPDFInheritCreateGC) {
- wc->treeClass.createGC = sc->treeClass.createGC;
- }
- if (wc->treeClass.destroyGC == XPDFInheritDestroyGC) {
- wc->treeClass.destroyGC = sc->treeClass.destroyGC;
- }
- if (wc->treeClass.layout == XPDFInheritLayout) {
- wc->treeClass.layout = sc->treeClass.layout;
- }
- if (wc->treeClass.calcSize == XPDFInheritCalcSize) {
- wc->treeClass.calcSize = sc->treeClass.calcSize;
- }
- if (wc->treeClass.needRelayout == XPDFInheritNeedRelayout) {
- wc->treeClass.needRelayout = sc->treeClass.needRelayout;
- }
-}
-
-static void initialize(Widget requestWidget, Widget newWidget,
- ArgList args, Cardinal *numArgs) {
- XPDFTreeWidget nw = (XPDFTreeWidget)newWidget;
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(newWidget);
-
- nw->tree.root = NULL;
- nw->tree.redrawY = -1;
- if (cls->treeClass.createGC) {
- (*cls->treeClass.createGC)(newWidget);
- } else {
- createGC(newWidget);
- }
-}
-
-static void destroy(Widget widget) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(widget);
-
- if (w->tree.root) {
- destroySubtree(w->tree.root);
- w->tree.root = NULL;
- }
- if (cls->treeClass.destroyGC) {
- (*cls->treeClass.destroyGC)(widget);
- } else {
- destroyGC(widget);
- }
-}
-
-static void destroySubtree(XPDFTreeEntry *e) {
- if (e->children) {
- destroySubtree(e->children);
- }
- if (e->next) {
- destroySubtree(e->next);
- }
-}
-
-static void resize(Widget widget) {
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(widget);
-
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)(widget, NULL);
- } else {
- layout(widget, NULL);
- }
-}
-
-static void redisplay(Widget widget, XEvent *event, Region region) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XPDFTreeEntry *e;
-
- if (w->tree.redrawY >= 0) {
- XClearArea(XtDisplay((Widget)w), XtWindow((Widget)w),
- 0, w->tree.redrawY, w->core.width, w->core.height, False);
- w->tree.redrawY = -1;
- }
- for (e = w->tree.root; e; e = e->next) {
- redisplaySubtree(w, e, event, region);
- }
-}
-
-static void redisplaySubtree(XPDFTreeWidget w, XPDFTreeEntry *e,
- XEvent *event, Region region) {
- XPDFTreeConstraint c;
- Position x, y, y2;
- XPDFTreeEntry *child;
-
- (*XtClass(e->widget)->core_class.expose)(e->widget, event, region);
- c = XPDFTreeCPart(e->widget);
- x = e->widget->core.x;
- y = e->widget->core.y + e->widget->core.height / 2;
- if (e->children) {
- if (c->entryExpanded) {
- drawExpandedIcon(w, x - 8, y);
- y2 = y; // make gcc happy
- for (child = e->children; child; child = child->next) {
- y2 = child->widget->core.y + child->widget->core.height / 2;
- XDrawLine(XtDisplay((Widget)w), XtWindow((Widget)w), w->tree.dottedGC,
- x - 8, y2, x + 6, y2);
- redisplaySubtree(w, child, event, region);
- }
- XDrawLine(XtDisplay((Widget)w), XtWindow((Widget)w), w->tree.dottedGC,
- x - 8, y + 2, x - 8, y2);
- } else {
- drawCollapsedIcon(w, x - 8, y);
- }
- }
-}
-
-static void drawExpandedIcon(XPDFTreeWidget w, Position x, Position y) {
- XPoint pts[4];
-
- pts[0].x = x - 4; pts[0].y = y - 2;
- pts[1].x = x + 4; pts[1].y = y - 2;
- pts[2].x = x; pts[2].y = y + 2;
- pts[3].x = x - 4; pts[3].y = y - 2;
- XDrawLines(XtDisplay((Widget)w), XtWindow((Widget)w), w->tree.plainGC,
- pts, 4, CoordModeOrigin);
-}
-
-static void drawCollapsedIcon(XPDFTreeWidget w, Position x, Position y) {
- XPoint pts[4];
-
- pts[0].x = x - 2; pts[0].y = y - 4;
- pts[1].x = x - 2; pts[1].y = y + 4;
- pts[2].x = x + 2; pts[2].y = y;
- pts[3].x = x - 2; pts[3].y = y - 4;
- XDrawLines(XtDisplay((Widget)w), XtWindow((Widget)w), w->tree.plainGC,
- pts, 4, CoordModeOrigin);
-}
-
-static Boolean setValues(Widget oldWidget, Widget requestWidget,
- Widget newWidget, ArgList args, Cardinal *numArgs) {
- XPDFTreeWidget ow = (XPDFTreeWidget)oldWidget;
- XPDFTreeWidget nw = (XPDFTreeWidget)newWidget;
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(nw);
- Boolean relayout, redisp;
-
- // check to see if layout-affecting resources have changed
- if (cls->treeClass.needRelayout) {
- relayout = (*cls->treeClass.needRelayout)((Widget)ow, (Widget)nw);
- } else {
- relayout = needRelayout((Widget)ow, (Widget)nw);
- }
- redisp = False;
- if (relayout) {
-
- // calculate a new ideal size (reset the widget size first so
- // calcSize will compute a new one)
- if (nw->core.width == ow->core.width) {
- nw->core.width = 0;
- }
- if (nw->core.height == ow->core.height) {
- nw->core.height = 0;
- }
- if (cls->treeClass.calcSize) {
- (*cls->treeClass.calcSize)((Widget)nw, NULL,
- &nw->core.width, &nw->core.height);
- } else {
- calcSize((Widget)nw, NULL, &nw->core.width, &nw->core.height);
- }
-
- // if resources have changed but size hasn't, layout manually
- // (because Xt just looks at the size)
- if (nw->core.width == ow->core.width &&
- nw->core.height == ow->core.height) {
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)((Widget)nw, NULL);
- } else {
- layout((Widget)nw, NULL);
- }
- redisp = True;
- }
- }
-
- return redisp;
-}
-
-static void setValuesAlmost(Widget oldWidget, Widget newWidget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply) {
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(newWidget);
-
- // our parent rejected a geometry request, so accept the compromise
- // and relayout
- if (!reply->request_mode) {
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)(newWidget, NULL);
- } else {
- layout(newWidget, NULL);
- }
- }
- *request = *reply;
-}
-
-static XtGeometryResult queryGeometry(Widget widget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply) {
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(widget);
-
- if (!XtIsRealized(widget)) {
- reply->width = XtWidth(widget);
- reply->height = XtHeight(widget);
- } else {
- reply->width = 0;
- reply->height = 0;
- }
- if (cls->treeClass.calcSize) {
- (*cls->treeClass.calcSize)(widget, NULL, &reply->width, &reply->height);
- } else {
- calcSize(widget, NULL, &reply->width, &reply->height);
- }
-#if XmVERSION > 1
- return XmeReplyToQueryGeometry(widget, request, reply);
-#else
- if ((request->request_mode & CWWidth) &&
- (request->request_mode & CWHeight) &&
- request->width == reply->width &&
- request->height == reply->height) {
- return XtGeometryYes;
- }
- if (reply->width == XtWidth(widget) &&
- reply->height == XtHeight(widget)) {
- return XtGeometryNo;
- }
- reply->request_mode = CWWidth | CWHeight;
- return XtGeometryAlmost;
-#endif
-}
-
-static XtGeometryResult geometryManager(Widget widget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply) {
- XPDFTreeWidget w = (XPDFTreeWidget)XtParent(widget);
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(w);
- Dimension curWidth, curHeight, curBW;
- XtWidgetGeometry parentReq;
- XtGeometryResult result;
-
- // deny any requests for a new position
- if ((request->request_mode & CWX) || (request->request_mode & CWY)) {
- return XtGeometryNo;
- }
-
- // save the current geometry
- curWidth = w->core.width;
- curHeight = w->core.height;
- curBW = w->core.border_width;
-
- // make the requested changes
- if (request->request_mode & CWWidth) {
- w->core.width = request->width;
- }
- if (request->request_mode & CWHeight) {
- w->core.height = request->height;
- }
- if (request->request_mode & CWBorderWidth) {
- w->core.border_width = request->border_width;
- }
-
- // calculate the new ideal size
- parentReq.width = 0;
- parentReq.height = 0;
- if (cls->treeClass.calcSize) {
- (*cls->treeClass.calcSize)((Widget)w, widget,
- &parentReq.width, &reply->height);
- } else {
- calcSize((Widget)w, widget, &parentReq.width, &reply->height);
- }
-
- // send geometry request to our parent
- parentReq.request_mode = CWWidth | CWHeight;
- if (request->request_mode & XtCWQueryOnly) {
- parentReq.request_mode |= XtCWQueryOnly;
- }
- result = XtMakeGeometryRequest((Widget)w, &parentReq, NULL);
- if (result == XtGeometryAlmost) {
- result = XtGeometryNo;
- }
-
- if (result == XtGeometryNo || (request->request_mode & XtCWQueryOnly)) {
- // restore the original geometry
- w->core.width = curWidth;
- w->core.height = curHeight;
- w->core.border_width = curBW;
- } else {
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)((Widget)w, widget);
- } else {
- layout((Widget)w, widget);
- }
- }
-
- return result;
-}
-
-static void changeManaged(Widget widget) {
- Dimension width, height;
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(widget);
-
- // compute the ideal size
- if (!XtIsRealized(widget)) {
- width = XtWidth(widget);
- height = XtHeight(widget);
- } else {
- width = 0;
- height = 0;
- }
- if (cls->treeClass.calcSize) {
- (*cls->treeClass.calcSize)(widget, NULL, &width, &height);
- } else {
- calcSize(widget, NULL, &width, &height);
- }
-
- // make resize request to parent -- keep asking until we get a yes
- // or no
- while (XtMakeResizeRequest(widget, width, height, &width, &height)
- == XtGeometryAlmost) ;
-
- // relayout
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)(widget, NULL);
- } else {
- layout(widget, NULL);
- }
-
-#if XmVERSION > 1
- // update keyboard traversal
- XmeNavigChangeManaged(widget);
-#else
- _XmNavigChangeManaged(widget);
-#endif
-}
-
-static void initConstraint(Widget requestWidget, Widget newWidget,
- ArgList args, Cardinal *numArgs) {
- XPDFTreeWidget w = (XPDFTreeWidget)XtParent(newWidget);
- XPDFTreeConstraint c;
-
- c = XPDFTreeCPart(newWidget);
- c->e = (XPDFTreeEntry *)gmalloc(sizeof(XPDFTreeEntry));
- c->e->widget = newWidget;
- c->e->children = NULL;
- c->e->next = NULL;
- if (c->entryParent) {
- insertChildOnList(c->e, &XPDFTreeCPart(c->entryParent)->e->children);
- } else {
- insertChildOnList(c->e, &w->tree.root);
- }
-}
-
-static void destroyConstraint(Widget widget) {
- deleteSubtree(widget);
-}
-
-static void deleteSubtree(Widget widget) {
- XPDFTreeWidget w = (XPDFTreeWidget)XtParent(widget);
- XPDFTreeConstraint c;
-
- c = XPDFTreeCPart(widget);
- if (!c->e) {
- return;
- }
- while (c->e->children) {
- deleteSubtree(c->e->children->widget);
- }
- if (c->entryParent) {
- deleteChildFromList(c->e, &XPDFTreeCPart(c->entryParent)->e->children);
- } else {
- deleteChildFromList(c->e, &w->tree.root);
- }
- gfree(c->e);
- c->e = NULL;
-}
-
-static Boolean constraintSetValues(Widget oldWidget, Widget requestWidget,
- Widget newWidget,
- ArgList args, Cardinal *numArgs) {
- XPDFTreeWidget w = (XPDFTreeWidget)XtParent(newWidget);
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass((Widget)w);
- XPDFTreeConstraint oc, nc;
- Boolean relayout;
- Dimension width, height;
-
- if (!XtIsManaged(newWidget)) {
- return False;
- }
- oc = XPDFTreeCPart(oldWidget);
- nc = XPDFTreeCPart(newWidget);
- relayout = False;
- if (nc->entryParent != oc->entryParent ||
- nc->entryPosition != oc->entryPosition) {
- if (oc->entryParent) {
- deleteChildFromList(oc->e, &XPDFTreeCPart(oc->entryParent)->e->children);
- } else {
- deleteChildFromList(oc->e, &w->tree.root);
- }
- if (nc->entryParent) {
- insertChildOnList(nc->e, &XPDFTreeCPart(nc->entryParent)->e->children);
- } else {
- insertChildOnList(nc->e, &w->tree.root);
- }
- relayout = True;
- } else if (nc->entryExpanded != oc->entryExpanded) {
- relayout = True;
- }
-
- if (relayout) {
-
- // calculate a new ideal size (reset the widget size first so
- // calcSize will compute a new one)
- width = 0;
- height = 0;
- if (cls->treeClass.calcSize) {
- (*cls->treeClass.calcSize)((Widget)w, NULL, &width, &height);
- } else {
- calcSize((Widget)w, NULL, &width, &height);
- }
-
- // make resize request to parent -- keep asking until we get a yes
- // or no
- while (XtMakeResizeRequest((Widget)w, width, height, &width, &height)
- == XtGeometryAlmost) ;
-
- // relayout the widget
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)((Widget)w, NULL);
- } else {
- layout((Widget)w, NULL);
- }
- }
-
- return relayout;
-}
-
-static void insertChildOnList(XPDFTreeEntry *e, XPDFTreeEntry **listHead) {
- int pos;
- XPDFTreeEntry *e2;
-
- pos = XPDFTreeCPart(e->widget)->entryPosition;
- if (!*listHead || pos < XPDFTreeCPart((*listHead)->widget)->entryPosition) {
- e->next = *listHead;
- *listHead = e;
- } else {
- for (e2 = *listHead;
- e2->next && pos >= XPDFTreeCPart(e2->next->widget)->entryPosition;
- e2 = e2->next) ;
- e->next = e2->next;
- e2->next = e;
- }
-}
-
-static void deleteChildFromList(XPDFTreeEntry *e, XPDFTreeEntry **listHead) {
- XPDFTreeEntry **p;
-
- for (p = listHead; *p; p = &(*p)->next) {
- if (*p == e) {
- *p = e->next;
- e->next = NULL;
- return;
- }
- }
-}
-
-static void createGC(Widget widget) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XGCValues gcValues;
-
- gcValues.foreground = w->manager.foreground;
- gcValues.line_width = 0;
- gcValues.line_style = LineSolid;
- w->tree.plainGC = XtGetGC(widget,
- GCForeground | GCLineWidth | GCLineStyle,
- &gcValues);
-
- gcValues.line_style = LineOnOffDash;
- gcValues.dashes = 1;
- gcValues.dash_offset = 0;
- w->tree.dottedGC = XtGetGC(widget,
- GCForeground | GCLineWidth | GCLineStyle |
- GCDashList | GCDashOffset,
- &gcValues);
-}
-
-static void destroyGC(Widget widget) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
-
- XtReleaseGC(widget, w->tree.plainGC);
- XtReleaseGC(widget, w->tree.dottedGC);
-}
-
-static void layout(Widget widget, Widget instigator) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XPDFTreeEntry *e;
- Position x, y;
-
- x = w->tree.marginWidth + xpdfTreeIndent;
- y = w->tree.marginHeight;
- for (e = w->tree.root; e; e = e->next) {
- y = layoutSubtree(w, instigator, e, x, y, True);
- }
-}
-
-static int layoutSubtree(XPDFTreeWidget w, Widget instigator,
- XPDFTreeEntry *e, Position x, Position y,
- Boolean visible) {
- Widget ew;
- XPDFTreeEntry *child;
- XPDFTreeConstraint c;
-
- ew = e->widget;
- if (!XtIsManaged(ew)) {
- return y;
- }
- c = XPDFTreeCPart(ew);
-
- // place this entry
- if (ew) {
- if (visible) {
- if (ew == instigator) {
- ew->core.x = x;
- ew->core.y = y;
- } else {
-#if XmVERSION > 1
- XmeConfigureObject(ew, x, y, ew->core.width, ew->core.height,
- ew->core.border_width);
-#else
- _XmConfigureObject(ew, x, y, ew->core.width, ew->core.height,
- ew->core.border_width);
-#endif
- }
- y += ew->core.height + 2 * ew->core.border_width;
- }
- }
-
- // place this entry's children
- x += xpdfTreeIndent;
- for (child = e->children; child; child = child->next) {
- y = layoutSubtree(w, instigator, child, x, y,
- visible && (!c || c->entryExpanded));
- }
-
- return y;
-}
-
-static void calcSize(Widget widget, Widget instigator,
- Dimension *totalWidth,
- Dimension *totalHeight) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XPDFTreeEntry *e;
- Dimension w1, h1, w2, h2;
-
- w1 = h1 = 0;
- for (e = w->tree.root; e; e = e->next) {
- calcSubtreeSize(w, instigator, e, &w2, &h2);
- if (w2 > w1) {
- w1 = w2;
- }
- h1 += h2;
- }
- w1 += xpdfTreeIndent + 2 * w->tree.marginWidth;
- h1 += 2 * w->tree.marginHeight;
- if (h1 == 0) {
- h1 = 1;
- }
- if (!*totalWidth) {
- *totalWidth = w1;
- }
- if (!*totalHeight) {
- *totalHeight = h1;
- }
-}
-
-static void calcSubtreeSize(XPDFTreeWidget w, Widget instigator,
- XPDFTreeEntry *e,
- Dimension *width, Dimension *height) {
- Widget ew;
- XPDFTreeEntry *child;
- XPDFTreeConstraint c;
- XtWidgetGeometry geom;
- Dimension w1, h1, w2, h2;
-
- ew = e->widget;
- if (!XtIsManaged(ew)) {
- *width = *height = 0;
- return;
- }
- c = XPDFTreeCPart(ew);
-
- // get size of this entry
- if (ew) {
- if (!XtIsManaged(ew)) {
- *width = *height = 0;
- return;
- }
- if (ew == instigator) {
- w1 = ew->core.width;
- h1 = ew->core.height;
- } else {
- XtQueryGeometry(ew, NULL, &geom);
- w1 = (geom.request_mode & CWWidth) ? geom.width : ew->core.width;
- h1 = (geom.request_mode & CWHeight) ? geom.height : ew->core.height;
- }
- h1 += 2 * ew->core.border_width;
- } else {
- // root of tree
- w1 = 0;
- h1 = 0;
- }
-
- // if this entry is expanded, get size of all of its children
- if (c->entryExpanded) {
- for (child = e->children; child; child = child->next) {
- calcSubtreeSize(w, instigator, child, &w2, &h2);
- w2 += xpdfTreeIndent;
- if (w2 > w1) {
- w1 = w2;
- }
- h1 += h2;
- }
- }
-
- *width = w1;
- *height = h1;
-}
-
-static Boolean needRelayout(Widget oldWidget, Widget newWidget) {
- XPDFTreeWidget ow = (XPDFTreeWidget)oldWidget;
- XPDFTreeWidget nw = (XPDFTreeWidget)newWidget;
-
- if (nw->tree.marginWidth != ow->tree.marginWidth ||
- nw->tree.marginHeight != ow->tree.marginHeight) {
- return True;
- }
- return False;
-}
-
-static void click(Widget widget, XEvent *event,
- String *params, Cardinal *numParams) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XButtonPressedEvent *bpe;
- XPDFTreeEntry *e;
- Boolean onExpandIcon;
- XPDFTreeConstraint c;
- XPDFTreeSelectCallbackStruct cbs;
-
- if (event->type != ButtonPress) {
- return;
- }
- bpe = (XButtonPressedEvent *)event;
- if (findPosition(w, bpe->x, bpe->y, &e, &onExpandIcon)) {
- if (onExpandIcon) {
- c = XPDFTreeCPart(e->widget);
- w->tree.redrawY = e->widget->core.y;
- XtVaSetValues(e->widget, XPDFNentryExpanded, !c->entryExpanded, NULL);
- } else {
- XmProcessTraversal(e->widget, XmTRAVERSE_CURRENT);
- XtCallActionProc(widget, "ManagerGadgetActivate", event, NULL, 0);
- cbs.reason = XmCR_ACTIVATE;
- cbs.event = event;
- cbs.selectedItem = e->widget;
- XtCallCallbackList(widget, w->tree.selectCallback, &cbs);
- }
- }
-}
-
-static Boolean findPosition(XPDFTreeWidget w, int x, int y,
- XPDFTreeEntry **e, Boolean *onExpandIcon) {
- XPDFTreeEntry *e2;
-
- for (e2 = w->tree.root; e2; e2 = e2->next) {
- *e = e2;
- if (findPositionInSubtree(w, x, y, e, onExpandIcon)) {
- return True;
- }
- }
- return False;
-}
-
-// If (x,y) falls on either an expand/collapse icon or a label gadget,
-// set *<e> and *<onExpandIcon> and return true.
-static Boolean findPositionInSubtree(XPDFTreeWidget w, int x, int y,
- XPDFTreeEntry **e,
- Boolean *onExpandIcon) {
- Widget child;
- XPDFTreeConstraint c;
- XPDFTreeEntry *e2;
- int y1;
-
- child = (*e)->widget;
- y1 = child->core.y + child->core.height / 2;
- if (x >= child->core.x && x < child->core.x + child->core.width &&
- y >= child->core.y && y < child->core.y + child->core.height) {
- *onExpandIcon = False;
- return True;
- } else if (x >= child->core.x - 16 && x < child->core.x - 4 &&
- y >= y1 - 6 && y < y1 + 6 &&
- (*e)->children) {
- *onExpandIcon = True;
- return True;
- }
- c = XPDFTreeCPart(child);
- if (!c || c->entryExpanded) {
- for (e2 = (*e)->children; e2; e2 = e2->next) {
- *e = e2;
- if (findPositionInSubtree(w, x, y, e, onExpandIcon)) {
- return True;
- }
- }
- }
- return False;
-}
-
-Widget XPDFCreateTree(Widget parent, char *name,
- ArgList argList, Cardinal numArgs) {
- return XtCreateWidget(name, xpdfTreeWidgetClass, parent, argList, numArgs);
-}