earlybrowserreborn - Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 roytam 1 /*==================================================================*/
2 /*                                                                  */
3 /* SGMLContainerTextObject                                          */
4 /*                                                                  */
5 /* T.Johnson - (TonyJ@Slacvx.Slac.Stanford.Edu)           June.92   */
6 /*                                                                  */
7 /* Defines a container text segment for the SGMLHyper widget        */
8 /*                                                                  */
9 /*==================================================================*/
10  
11 #include <X11/IntrinsicP.h>
12 #include <X11/StringDefs.h>
13 #include <X11/CoreP.h>
14 #include "SGMLContainerTextP.h"
15 #include "SGMLCompositeTextP.h"
16  
17  
18 /*
19   Private functions
20 */
21  
22  
23 /*
24   Widget class methods
25 */
26  
27 static void    ClassPartInitialize();
28 static void    ComputeSize();
29 static Boolean AdjustSize();
30 static void    Redisplay();
31 static void    CallMapCallback();
32 static XtGeometryResult GeometryManager();
33  
34 #define Offset(field) XtOffsetOf(SGMLContainerTextRec,sgml_container_text.field)
35  
36 static XtResource resources[] = {
37  
38     {SGMLNchild,SGMLCChild,SGMLRWidget,sizeof(Widget),
39     Offset (child),XtRImmediate,(XtPointer)0},
40  
41     {SGMLNverticalOffset,SGMLCVerticalOffset,XtRPosition,sizeof(Position),
42     Offset (vertical_offset),XtRImmediate,(XtPointer)0},
43  
44 };
45 #undef Offset
46  
47 /*---------------------------------------------------------------*/
48 /* Static initialisation of the class record                     */
49 /*---------------------------------------------------------------*/
50  
51 SGMLContainerTextClassRec  sGMLContainerTextClassRec = {
52     {
53     (WidgetClass) &sGMLTextClassRec,     /* superclass            */
54     "SGMLContainerText",                 /* class_name            */
55     sizeof(SGMLContainerTextRec),        /* widget_size           */
56     NULL,                                /* class_initialize      */
57     ClassPartInitialize,                 /* class_part_initialize */
58     FALSE,                               /* class_inited          */
59     NULL,                                /* initialize            */
60     NULL,                                /* initialize_hook       */
61     NULL,                                /* obj1                  */
62     NULL,                                /* obj2                  */
63     0,                                   /* obj3                  */
64     resources,                           /* resources             */
65     XtNumber(resources),                 /* num_resources         */
66     NULLQUARK,                           /* xrm_class             */
67     0,                                   /* obj4                  */
68     0,                                   /* obj5                  */
69     0,                                   /* obj6                  */
70     0,                                   /* obj7                  */
71     NULL,                                /* destroy               */
72     NULL,                                /* obj8                  */
73     NULL,                                /* obj9                  */
74     NULL,                                /* set_values            */
75     NULL,                                /* set_values_hook       */
76     NULL,                                /* obj10                 */
77     NULL,                                /* get_values_hook       */
78     NULL,                                /* obj11                 */
79     XtVersion,                           /* version               */
80     NULL,                                /* callback private      */
81     NULL,                                /* obj12                 */
82     NULL,                                /* obj13                 */
83     NULL,                                /* obj14                 */
84     NULL,                                /* extension             */
85     },
86     {
87     ComputeSize,                         /* compute_size          */
88     AdjustSize,                          /* adjust_size           */
89     SGMLInheritAdjustPosition,           /* adjust_position       */
90     Redisplay,                           /* expose                */
91     SGMLInheritActivate,                 /* activate              */
92     SGMLInheritHilite,                   /* hilite                */
93     SGMLInheritContains,                 /* contains              */
94     SGMLInheritCallCreateCallback,       /* call_create_callback  */
95     CallMapCallback,                     /* call_map_callback     */
96     SGMLInheritMakeVisible,              /* make_visible          */
97     NULL,                                /* sgml_set_values       */
98     NULL,                                /* inherit_changes       */
99     SGMLInheritComputeChangeMask,        /* compute_change_mask   */
100     SGMLInheritSearch,                   /* search                */
101     SGMLInheritClearSelect,              /* clear_select          */
102     SGMLInheritHiliteSelection,          /* hilite_selection      */
103     SGMLInheritXYToPos,                  /* xy_to_pos             */
104     SGMLInheritPosToXY,                  /* pos_to_xy             */
105     SGMLInheritDumpText,                 /* dump_text             */
106     NULL,                                /* extension             */
107     },
108     {
109     GeometryManager,                     /* geometry_manager      */
110     NULL,                                /* extension             */
111     }
112 };
113  
114  
115 WidgetClass sGMLContainerTextObjectClass = (WidgetClass) &sGMLContainerTextClassRec;
116  
117 /*--------------------------------------------------------------*/
118 /* ClassPartInitialize:                                         */
119 /*--------------------------------------------------------------*/
120  
121 static void ClassPartInitialize (class)
122 SGMLContainerTextObjectClass class;
123 {
124    SGMLContainerTextObjectClass superclass = (SGMLContainerTextObjectClass) class->object_class.superclass;
125  
126 #define inherit(field,defval) if (class->sgml_container_text_class.field == defval) \
127                                   class->sgml_container_text_class.field = superclass->sgml_container_text_class.field
128  
129    inherit(geometry_manager,SGMLInheritGeometryManager);
130 #undef inherit
131 }
132 /*--------------------------------------------------------------*/
133 /* Redisplay                                                    */
134 /*--------------------------------------------------------------*/
135  
136 static void Redisplay(t,event,region)
137 SGMLContainerTextObject t;
138 XEvent *event;
139 Region region;
140 {
141 }
142 /*--------------------------------------------------------------*/
143 /* Compute Size:                                                */
144 /*--------------------------------------------------------------*/
145 static void ComputeSize(w,geom,Adjust,Closure)
146 SGMLContainerTextObject w;
147 SGMLGeometry *geom;
148 AdjustSizeProc Adjust;
149 Opaque Closure;
150 {
151    Dimension left_clearance  = w->sgml_text.left_margin + w->sgml_text.left_indent;
152    Dimension right_clearance = w->sgml_text.right_margin + w->sgml_text.right_indent;
153    Widget child = w->sgml_container_text.child;
154  
155    if (w->sgml_text.break_before == SGMLBREAK_ALWAYS) _SGMLBreak(geom,w->sgml_text.space_before);
156  
157    if (left_clearance > geom->coord.x ) geom->coord.x = left_clearance;
158  
159    w->sgml_text.begin  = geom->coord;
160  
161    if (child)
162      {
163       Dimension width  = child->core.width;
164       Dimension height = child->core.height;
165       int offset =  w->sgml_container_text.vertical_offset;
166       Dimension ascent  = (height + offset > 0) ? height + offset : 0;
167       Dimension descent = (offset < 0) ? -offset : 0;  
168  
169       if (geom->coord.x + w->sgml_text.spacing + width + right_clearance > geom->natural_width &&
170           w->sgml_text.break_before != SGMLBREAK_NEVER)
171         {
172           geom->coord.x = left_clearance;
173           geom->coord.y += geom->coord.descent + geom->coord.ascent;
174           geom->coord.descent = w->sgml_text.descent;
175           geom->coord.ascent = w->sgml_text.ascent;
176        }
177       else if (geom->leave_space) geom->coord.x += w->sgml_text.spacing;  
178  
179       if (ascent > geom->coord.ascent || descent > geom->coord.descent)
180         {
181           if (ascent  > geom->coord.ascent)  geom->coord.ascent  = ascent;
182           if (descent > geom->coord.descent) geom->coord.descent = descent;
183  
184           Adjust(Closure, geom->coord.y, geom->coord.ascent, geom->coord.descent);
185         }
186  
187       if (left_clearance > geom->coord.x && geom->broken) geom->coord.x = left_clearance;
188  
189       w->sgml_text.begin  = geom->coord;
190       w->sgml_text.margin = geom->coord.x;
191  
192       XtMoveWidget(child,geom->coord.x,geom->coord.y + geom->coord.ascent - ascent);
193  
194       geom->coord.x += width;
195       geom->leave_space = TRUE;
196       geom->broken = FALSE;
197  
198       if (geom->actual_width < geom->coord.x)
199          geom->actual_width = geom->coord.x;
200  
201       w->sgml_text.height = height;  
202       w->sgml_text.width  = width;
203     }
204   else
205     {
206       w->sgml_text.height = 0;  
207       w->sgml_text.width  = 0;
208     }
209  
210   w->sgml_text.margin = geom->coord.x - w->sgml_text.width;
211   w->sgml_text.end = geom->coord;
212  
213   if (w->sgml_text.break_after == SGMLBREAK_ALWAYS) _SGMLBreak(geom,w->sgml_text.space_after);
214   w->sgml_text.size_valid = TRUE;  
215 }
216 /*--------------------------------------------------------------*/
217 /* Adjust Size:                                                 */
218 /*--------------------------------------------------------------*/
219  
220 static Boolean AdjustSize(w,y,ascent,descent)
221 SGMLContainerTextObject w;
222 Position y;
223 Dimension ascent, descent;
224 {
225    Widget child = w->sgml_container_text.child;
226    if (w->sgml_text.end.y != y) return FALSE;
227  
228    if (child && ascent > w->sgml_text.end.ascent)
229      {
230        XtMoveWidget(child,w->sgml_text.begin.x,w->sgml_text.begin.y + ascent - w->sgml_text.end.ascent);
231      }
232  
233    w->sgml_text.height += descent - w->sgml_text.end.descent + ascent - w->sgml_text.end.ascent;
234    w->sgml_text.end.ascent = ascent;
235    w->sgml_text.end.descent = descent;
236  
237    if (w->sgml_text.begin.y == y)
238      {
239        w->sgml_text.begin.ascent = ascent;
240        w->sgml_text.begin.descent = descent;
241        return TRUE;
242      }
243  
244    return FALSE;
245 }
246 /*--------------------------------------------------------------*/
247 /* Call the map Callback:                                       */
248 /*--------------------------------------------------------------*/
249  
250 static void CallMapCallback(w,event,map)
251 SGMLContainerTextObject w;
252 XEvent         *event;
253 Boolean        map;
254 {
255     Widget child = w->sgml_container_text.child;
256     SGMLTextCallbackStruct cb;
257  
258     cb.reason = SGMLTEXT_MAP;
259     cb.event = event;
260     cb.text   = w->sgml_text.text;
261     cb.length = w->sgml_text.length;
262     cb.param  = w->sgml_text.param;
263     cb.param_length = w->sgml_text.param_length;
264  
265     if (child)
266       {
267         if (map)  XtManageChild(child);
268         else      XtUnmanageChild(child);
269       }  
270  
271     if (map) XtCallCallbacks((Widget) w,SGMLNmapCallback  ,(XtPointer) &cb);
272     else     XtCallCallbacks((Widget) w,SGMLNunmapCallback,(XtPointer) &cb);
273 }
274 /*--------------------------------------------------------------*/
275 /* GeometryManager:                                             */
276 /*--------------------------------------------------------------*/
277  
278 static XtGeometryResult GeometryManager(w,desired,allowed)
279 SGMLContainerTextObject w;
280 XtWidgetGeometry *desired, *allowed;
281 {
282   Widget child = w->sgml_container_text.child;
283   Widget parent = XtParent((Widget) w);
284   SGMLCompositeTextObjectClass parentClass = (SGMLCompositeTextObjectClass) XtClass(parent);
285  
286 #define Wants(flag) (desired->request_mode & flag)  
287  
288   if (Wants(XtCWQueryOnly)) return XtGeometryYes;
289   if (Wants(CWWidth))  child->core.width  = desired->width;
290   if (Wants(CWHeight)) child->core.height = desired->height;
291  
292   return (*parentClass->sgml_composite_text_class.geometry_manager)(parent,desired,allowed);
293  
294 #undef Wants
295 }
296 /*-----------------------------------------------------------------------*/
297 /* Create a new SGMLContainerTextObject                                  */
298 /*-----------------------------------------------------------------------*/
299  
300 Widget SGMLCreateContainerText(parent,name,al,ac)
301 Widget parent;
302 char   *name;
303 ArgList al;
304 int     ac;
305 {
306     return XtCreateWidget(name,sGMLContainerTextObjectClass,parent,al,ac);
307 }