1f5736e95SDavid du Colombier /*
2f5736e95SDavid du Colombier * draw.c
3*25b329d5SDavid du Colombier * Copyright (C) 1998-2005 A.J. van Os; Released under GPL
4f5736e95SDavid du Colombier *
5f5736e95SDavid du Colombier * Description:
6f5736e95SDavid du Colombier * Functions to deal with the Draw format
7f5736e95SDavid du Colombier */
8f5736e95SDavid du Colombier
9f5736e95SDavid du Colombier #include <stdlib.h>
10f5736e95SDavid du Colombier #include <ctype.h>
11f5736e95SDavid du Colombier #include <string.h>
12*25b329d5SDavid du Colombier #include "DeskLib:KeyCodes.h"
13*25b329d5SDavid du Colombier #include "DeskLib:Error.h"
14*25b329d5SDavid du Colombier #include "DeskLib:Menu.h"
15*25b329d5SDavid du Colombier #include "DeskLib:Template.h"
16*25b329d5SDavid du Colombier #include "DeskLib:Window.h"
17*25b329d5SDavid du Colombier #include "DeskLib:EventMsg.h"
18*25b329d5SDavid du Colombier #include "flexlib:flex.h"
19*25b329d5SDavid du Colombier #include "drawfile.h"
20f5736e95SDavid du Colombier #include "antiword.h"
21f5736e95SDavid du Colombier
22f5736e95SDavid du Colombier /* The work area must be a little bit larger than the diagram */
23f5736e95SDavid du Colombier #define WORKAREA_EXTENSION 5
24f5736e95SDavid du Colombier /* Diagram memory */
25f5736e95SDavid du Colombier #define INITIAL_SIZE 32768 /* 32k */
26f5736e95SDavid du Colombier #define EXTENSION_SIZE 4096 /* 4k */
27f5736e95SDavid du Colombier /* Main window title */
28f5736e95SDavid du Colombier #define WINDOW_TITLE_LEN 28
29f5736e95SDavid du Colombier #define FILENAME_TITLE_LEN (WINDOW_TITLE_LEN - 10)
30f5736e95SDavid du Colombier
31*25b329d5SDavid du Colombier
32*25b329d5SDavid du Colombier #if !defined(__GNUC__)
33*25b329d5SDavid du Colombier int
flex_alloc(flex_ptr anchor,int n)34*25b329d5SDavid du Colombier flex_alloc(flex_ptr anchor, int n)
35*25b329d5SDavid du Colombier {
36*25b329d5SDavid du Colombier void *pvTmp;
37*25b329d5SDavid du Colombier
38*25b329d5SDavid du Colombier TRACE_MSG("flex_alloc");
39*25b329d5SDavid du Colombier
40*25b329d5SDavid du Colombier if (anchor == NULL || n < 0) {
41*25b329d5SDavid du Colombier return 0;
42*25b329d5SDavid du Colombier }
43*25b329d5SDavid du Colombier if (n == 0) {
44*25b329d5SDavid du Colombier n = 1;
45*25b329d5SDavid du Colombier }
46*25b329d5SDavid du Colombier pvTmp = malloc(n);
47*25b329d5SDavid du Colombier if (pvTmp == NULL) {
48*25b329d5SDavid du Colombier return 0;
49*25b329d5SDavid du Colombier }
50*25b329d5SDavid du Colombier *anchor = pvTmp;
51*25b329d5SDavid du Colombier return 1;
52*25b329d5SDavid du Colombier } /* end of flex_alloc */
53*25b329d5SDavid du Colombier
54*25b329d5SDavid du Colombier void
flex_free(flex_ptr anchor)55*25b329d5SDavid du Colombier flex_free(flex_ptr anchor)
56*25b329d5SDavid du Colombier {
57*25b329d5SDavid du Colombier TRACE_MSG("flex_free");
58*25b329d5SDavid du Colombier
59*25b329d5SDavid du Colombier if (anchor == NULL || *anchor == NULL) {
60*25b329d5SDavid du Colombier return;
61*25b329d5SDavid du Colombier }
62*25b329d5SDavid du Colombier free(*anchor);
63*25b329d5SDavid du Colombier *anchor = NULL;
64*25b329d5SDavid du Colombier } /* end of flex_free */
65*25b329d5SDavid du Colombier
66*25b329d5SDavid du Colombier int
flex_extend(flex_ptr anchor,int newsize)67*25b329d5SDavid du Colombier flex_extend(flex_ptr anchor, int newsize)
68*25b329d5SDavid du Colombier {
69*25b329d5SDavid du Colombier void *pvTmp;
70*25b329d5SDavid du Colombier
71*25b329d5SDavid du Colombier TRACE_MSG("flex_extend");
72*25b329d5SDavid du Colombier
73*25b329d5SDavid du Colombier if (anchor == NULL || newsize < 0) {
74*25b329d5SDavid du Colombier return 0;
75*25b329d5SDavid du Colombier }
76*25b329d5SDavid du Colombier if (newsize == 0) {
77*25b329d5SDavid du Colombier newsize = 1;
78*25b329d5SDavid du Colombier }
79*25b329d5SDavid du Colombier pvTmp = realloc(*anchor, newsize);
80*25b329d5SDavid du Colombier if (pvTmp == NULL) {
81*25b329d5SDavid du Colombier return 0;
82*25b329d5SDavid du Colombier }
83*25b329d5SDavid du Colombier *anchor = pvTmp;
84*25b329d5SDavid du Colombier return 1;
85*25b329d5SDavid du Colombier } /* end of flex_extend */
86*25b329d5SDavid du Colombier #endif /* !__GNUC__ */
87f5736e95SDavid du Colombier
88f5736e95SDavid du Colombier /*
89*25b329d5SDavid du Colombier * vCreateMainWindow - create the Main window
90f5736e95SDavid du Colombier *
91*25b329d5SDavid du Colombier * remark: does not return if the Main window can't be created
92f5736e95SDavid du Colombier */
93*25b329d5SDavid du Colombier static window_handle
tCreateMainWindow(void)94f5736e95SDavid du Colombier tCreateMainWindow(void)
95f5736e95SDavid du Colombier {
96*25b329d5SDavid du Colombier window_handle tMainWindow;
97f5736e95SDavid du Colombier
98*25b329d5SDavid du Colombier TRACE_MSG("tCreateMainWindow");
99f5736e95SDavid du Colombier
100*25b329d5SDavid du Colombier tMainWindow = Window_Create("MainWindow", template_TITLEMIN);
101*25b329d5SDavid du Colombier if (tMainWindow == 0) {
102*25b329d5SDavid du Colombier werr(1, "I can't find the 'MainWindow' template");
103f5736e95SDavid du Colombier }
104f5736e95SDavid du Colombier return tMainWindow;
105f5736e95SDavid du Colombier } /* end of tCreateMainWindow */
106f5736e95SDavid du Colombier
107f5736e95SDavid du Colombier /*
108*25b329d5SDavid du Colombier * vCreateScaleWindow - create the Scale view window
109f5736e95SDavid du Colombier *
110*25b329d5SDavid du Colombier * remark: does not return if the Scale view window can't be created
111f5736e95SDavid du Colombier */
112*25b329d5SDavid du Colombier static window_handle
tCreateScaleWindow(void)113f5736e95SDavid du Colombier tCreateScaleWindow(void)
114f5736e95SDavid du Colombier {
115*25b329d5SDavid du Colombier window_handle tScaleWindow;
116f5736e95SDavid du Colombier
117*25b329d5SDavid du Colombier TRACE_MSG("tCreateScaleWindow");
118*25b329d5SDavid du Colombier
119*25b329d5SDavid du Colombier tScaleWindow = Window_Create("ScaleView", template_TITLEMIN);
120*25b329d5SDavid du Colombier if (tScaleWindow == 0) {
121*25b329d5SDavid du Colombier werr(1, "I can't find the 'ScaleView' template");
122f5736e95SDavid du Colombier }
123f5736e95SDavid du Colombier return tScaleWindow;
124f5736e95SDavid du Colombier } /* end of tCreateScaleWindow */
125f5736e95SDavid du Colombier
126f5736e95SDavid du Colombier /*
127f5736e95SDavid du Colombier * pCreateDiagram - create and initialize a diagram
128f5736e95SDavid du Colombier *
129f5736e95SDavid du Colombier * remark: does not return if the diagram can't be created
130f5736e95SDavid du Colombier */
131f5736e95SDavid du Colombier diagram_type *
pCreateDiagram(const char * szTask,const char * szFilename)132f5736e95SDavid du Colombier pCreateDiagram(const char *szTask, const char *szFilename)
133f5736e95SDavid du Colombier {
134f5736e95SDavid du Colombier diagram_type *pDiag;
135f5736e95SDavid du Colombier options_type tOptions;
136*25b329d5SDavid du Colombier window_handle tMainWindow, tScaleWindow;
137*25b329d5SDavid du Colombier wimp_box tBox;
138f5736e95SDavid du Colombier
139*25b329d5SDavid du Colombier TRACE_MSG("pCreateDiagram");
140f5736e95SDavid du Colombier
141f5736e95SDavid du Colombier fail(szTask == NULL || szTask[0] == '\0');
142f5736e95SDavid du Colombier
143f5736e95SDavid du Colombier /* Create the main window */
144f5736e95SDavid du Colombier tMainWindow = tCreateMainWindow();
145*25b329d5SDavid du Colombier
146f5736e95SDavid du Colombier /* Create the scale view window */
147f5736e95SDavid du Colombier tScaleWindow = tCreateScaleWindow();
148f5736e95SDavid du Colombier
149f5736e95SDavid du Colombier /* Get the necessary memory */
150f5736e95SDavid du Colombier pDiag = xmalloc(sizeof(diagram_type));
151f5736e95SDavid du Colombier if (flex_alloc((flex_ptr)&pDiag->tInfo.data, INITIAL_SIZE) != 1) {
152f5736e95SDavid du Colombier werr(1, "Memory allocation failed, unable to continue");
153f5736e95SDavid du Colombier }
154f5736e95SDavid du Colombier
155f5736e95SDavid du Colombier /* Initialize the diagram */
156f5736e95SDavid du Colombier vGetOptions(&tOptions);
157f5736e95SDavid du Colombier pDiag->tMainWindow = tMainWindow;
158f5736e95SDavid du Colombier pDiag->tScaleWindow = tScaleWindow;
159f5736e95SDavid du Colombier pDiag->iScaleFactorCurr = tOptions.iScaleFactor;
160f5736e95SDavid du Colombier pDiag->iScaleFactorTemp = tOptions.iScaleFactor;
161f5736e95SDavid du Colombier pDiag->tMemorySize = INITIAL_SIZE;
162*25b329d5SDavid du Colombier tBox.min.x = 0;
163*25b329d5SDavid du Colombier tBox.min.y = -(Drawfile_ScreenToDraw(32 + 3) * 8 + 1);
164*25b329d5SDavid du Colombier tBox.max.x = Drawfile_ScreenToDraw(16) * MIN_SCREEN_WIDTH + 1;
165*25b329d5SDavid du Colombier tBox.max.y = 0;
166*25b329d5SDavid du Colombier Error_CheckFatal(Drawfile_CreateDiagram(&pDiag->tInfo,
167*25b329d5SDavid du Colombier pDiag->tMemorySize, szTask, tBox));
168f5736e95SDavid du Colombier DBG_DEC(pDiag->tInfo.length);
169f5736e95SDavid du Colombier pDiag->lXleft = 0;
170f5736e95SDavid du Colombier pDiag->lYtop = 0;
171f5736e95SDavid du Colombier strncpy(pDiag->szFilename,
172f5736e95SDavid du Colombier szBasename(szFilename), sizeof(pDiag->szFilename) - 1);
173f5736e95SDavid du Colombier pDiag->szFilename[sizeof(pDiag->szFilename) - 1] = '\0';
174f5736e95SDavid du Colombier /* Return success */
175f5736e95SDavid du Colombier return pDiag;
176f5736e95SDavid du Colombier } /* end of pCreateDiagram */
177f5736e95SDavid du Colombier
178f5736e95SDavid du Colombier /*
179*25b329d5SDavid du Colombier * bDestroyDiagram - remove a diagram by freeing the memory it uses
180f5736e95SDavid du Colombier */
181*25b329d5SDavid du Colombier BOOL
bDestroyDiagram(event_pollblock * pEvent,void * pvReference)182*25b329d5SDavid du Colombier bDestroyDiagram(event_pollblock *pEvent, void *pvReference)
183f5736e95SDavid du Colombier {
184*25b329d5SDavid du Colombier diagram_type *pDiag;
185*25b329d5SDavid du Colombier window_handle tWindow;
186f5736e95SDavid du Colombier
187*25b329d5SDavid du Colombier TRACE_MSG("bDestroyDiagram");
188f5736e95SDavid du Colombier
189*25b329d5SDavid du Colombier fail(pEvent == NULL);
190*25b329d5SDavid du Colombier fail(pvReference == NULL);
191*25b329d5SDavid du Colombier
192*25b329d5SDavid du Colombier if (pEvent == NULL || pvReference == NULL) {
193*25b329d5SDavid du Colombier return FALSE;
194f5736e95SDavid du Colombier }
195*25b329d5SDavid du Colombier
196*25b329d5SDavid du Colombier pDiag = (diagram_type *)pvReference;
197*25b329d5SDavid du Colombier
198*25b329d5SDavid du Colombier switch (pEvent->type) {
199*25b329d5SDavid du Colombier case event_CLOSE:
200*25b329d5SDavid du Colombier tWindow = pEvent->data.openblock.window;
201*25b329d5SDavid du Colombier break;
202*25b329d5SDavid du Colombier case event_KEY:
203*25b329d5SDavid du Colombier tWindow = pEvent->data.key.caret.window;
204*25b329d5SDavid du Colombier break;
205*25b329d5SDavid du Colombier default:
206*25b329d5SDavid du Colombier DBG_DEC(pEvent->type);
207*25b329d5SDavid du Colombier return FALSE;
208*25b329d5SDavid du Colombier }
209*25b329d5SDavid du Colombier if (tWindow != pDiag->tMainWindow) {
210*25b329d5SDavid du Colombier return FALSE;
211*25b329d5SDavid du Colombier }
212*25b329d5SDavid du Colombier
213*25b329d5SDavid du Colombier /* Delete the main window */
214*25b329d5SDavid du Colombier Window_Delete(pDiag->tMainWindow);
215*25b329d5SDavid du Colombier pDiag->tMainWindow = 0;
216*25b329d5SDavid du Colombier
217*25b329d5SDavid du Colombier /* Delete the scale window */
218*25b329d5SDavid du Colombier Window_Delete(pDiag->tScaleWindow);
219*25b329d5SDavid du Colombier pDiag->tScaleWindow = 0;
220*25b329d5SDavid du Colombier
221*25b329d5SDavid du Colombier #if defined(__GNUC__)
222*25b329d5SDavid du Colombier /*
223*25b329d5SDavid du Colombier * Remove all references to the diagram that will be free-ed
224*25b329d5SDavid du Colombier * by undoing the EventMsg_Claim's from within the Menu_Warn's
225*25b329d5SDavid du Colombier */
226*25b329d5SDavid du Colombier while (EventMsg_ReleaseSpecific(message_MENUWARNING, window_ANY,
227*25b329d5SDavid du Colombier bSaveTextfile, pDiag))
228*25b329d5SDavid du Colombier ; /* EMPTY */
229*25b329d5SDavid du Colombier while (EventMsg_ReleaseSpecific(message_MENUWARNING, window_ANY,
230*25b329d5SDavid du Colombier bSaveDrawfile, pDiag))
231*25b329d5SDavid du Colombier ; /* EMPTY */
232*25b329d5SDavid du Colombier while (EventMsg_ReleaseSpecific(message_MENUWARNING, window_ANY,
233*25b329d5SDavid du Colombier bScaleOpenAction, pDiag))
234*25b329d5SDavid du Colombier ; /* EMPTY */
235*25b329d5SDavid du Colombier #endif /* __GNUC__ */
236*25b329d5SDavid du Colombier
237*25b329d5SDavid du Colombier /* Free the memory */
238f5736e95SDavid du Colombier if (pDiag->tInfo.data != NULL && pDiag->tMemorySize != 0) {
239f5736e95SDavid du Colombier flex_free((flex_ptr)&pDiag->tInfo.data);
240f5736e95SDavid du Colombier }
241*25b329d5SDavid du Colombier /* Just to be on the save side */
242*25b329d5SDavid du Colombier pDiag->tInfo.data = NULL;
243*25b329d5SDavid du Colombier pDiag->tInfo.length = 0;
244*25b329d5SDavid du Colombier pDiag->tMemorySize = 0;
245*25b329d5SDavid du Colombier
246*25b329d5SDavid du Colombier /* Destroy the diagram itself */
247f5736e95SDavid du Colombier pDiag = xfree(pDiag);
248*25b329d5SDavid du Colombier return TRUE;
249*25b329d5SDavid du Colombier } /* end of bDestroyDiagram */
250f5736e95SDavid du Colombier
251f5736e95SDavid du Colombier /*
252f5736e95SDavid du Colombier * vExtendDiagramSize - make sure the diagram is big enough
253f5736e95SDavid du Colombier */
254f5736e95SDavid du Colombier static void
vExtendDiagramSize(diagram_type * pDiag,size_t tSize)255f5736e95SDavid du Colombier vExtendDiagramSize(diagram_type *pDiag, size_t tSize)
256f5736e95SDavid du Colombier {
257*25b329d5SDavid du Colombier TRACE_MSG("vExtendDiagramSize");
258*25b329d5SDavid du Colombier
259f5736e95SDavid du Colombier fail(pDiag == NULL || tSize % 4 != 0);
260f5736e95SDavid du Colombier
261f5736e95SDavid du Colombier while (pDiag->tInfo.length + tSize > pDiag->tMemorySize) {
262f5736e95SDavid du Colombier if (flex_extend((flex_ptr)&pDiag->tInfo.data,
263f5736e95SDavid du Colombier pDiag->tMemorySize + EXTENSION_SIZE) != 1) {
264f5736e95SDavid du Colombier werr(1, "Memory extend failed, unable to continue");
265f5736e95SDavid du Colombier }
266f5736e95SDavid du Colombier pDiag->tMemorySize += EXTENSION_SIZE;
267f5736e95SDavid du Colombier NO_DBG_DEC(pDiag->tMemorySize);
268f5736e95SDavid du Colombier }
269*25b329d5SDavid du Colombier TRACE_MSG("end of vExtendDiagramSize");
270f5736e95SDavid du Colombier } /* end of vExtendDiagramSize */
271f5736e95SDavid du Colombier
272f5736e95SDavid du Colombier /*
273f5736e95SDavid du Colombier * vPrologue2 - prologue part 2; add a font list to a diagram
274f5736e95SDavid du Colombier */
275f5736e95SDavid du Colombier void
vPrologue2(diagram_type * pDiag,int iWordVersion)276f5736e95SDavid du Colombier vPrologue2(diagram_type *pDiag, int iWordVersion)
277f5736e95SDavid du Colombier {
278*25b329d5SDavid du Colombier drawfile_object *pNew;
279f5736e95SDavid du Colombier const font_table_type *pTmp;
280f5736e95SDavid du Colombier char *pcTmp;
281f5736e95SDavid du Colombier size_t tRealSize, tSize;
282f5736e95SDavid du Colombier int iCount;
283f5736e95SDavid du Colombier
284*25b329d5SDavid du Colombier TRACE_MSG("vPrologue2");
285*25b329d5SDavid du Colombier
286f5736e95SDavid du Colombier fail(pDiag == NULL);
287f5736e95SDavid du Colombier
288f5736e95SDavid du Colombier if (tGetFontTableLength() == 0) {
289f5736e95SDavid du Colombier return;
290f5736e95SDavid du Colombier }
291*25b329d5SDavid du Colombier tRealSize = offsetof(drawfile_object, data);
292f5736e95SDavid du Colombier pTmp = NULL;
293f5736e95SDavid du Colombier while ((pTmp = pGetNextFontTableRecord(pTmp)) != NULL) {
294f5736e95SDavid du Colombier tRealSize += 2 + strlen(pTmp->szOurFontname);
295f5736e95SDavid du Colombier }
296*25b329d5SDavid du Colombier DBG_DEC(tRealSize);
297f5736e95SDavid du Colombier tSize = ROUND4(tRealSize);
298f5736e95SDavid du Colombier vExtendDiagramSize(pDiag, tSize);
299*25b329d5SDavid du Colombier pNew = xmalloc(tSize);
300*25b329d5SDavid du Colombier memset(pNew, 0, tSize);
301*25b329d5SDavid du Colombier pNew->type = drawfile_TYPE_FONT_TABLE;
302*25b329d5SDavid du Colombier pNew->size = tSize;
303*25b329d5SDavid du Colombier pcTmp = (char *)&pNew->data.font_table.font_def[0].font_ref;
304f5736e95SDavid du Colombier iCount = 0;
305f5736e95SDavid du Colombier pTmp = NULL;
306f5736e95SDavid du Colombier while ((pTmp = pGetNextFontTableRecord(pTmp)) != NULL) {
307f5736e95SDavid du Colombier *pcTmp = ++iCount;
308f5736e95SDavid du Colombier pcTmp++;
309f5736e95SDavid du Colombier strcpy(pcTmp, pTmp->szOurFontname);
310f5736e95SDavid du Colombier pcTmp += 1 + strlen(pTmp->szOurFontname);
311f5736e95SDavid du Colombier }
312*25b329d5SDavid du Colombier Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo,
313*25b329d5SDavid du Colombier pDiag->tMemorySize, pNew, TRUE));
314*25b329d5SDavid du Colombier pNew = xfree(pNew);
315f5736e95SDavid du Colombier } /* end of vPrologue2 */
316f5736e95SDavid du Colombier
317f5736e95SDavid du Colombier /*
318f5736e95SDavid du Colombier * vSubstring2Diagram - put a sub string into a diagram
319f5736e95SDavid du Colombier */
320f5736e95SDavid du Colombier void
vSubstring2Diagram(diagram_type * pDiag,char * szString,size_t tStringLength,long lStringWidth,UCHAR ucFontColor,USHORT usFontstyle,drawfile_fontref tFontRef,USHORT usFontSize,USHORT usMaxFontSize)321f5736e95SDavid du Colombier vSubstring2Diagram(diagram_type *pDiag,
322f5736e95SDavid du Colombier char *szString, size_t tStringLength, long lStringWidth,
323*25b329d5SDavid du Colombier UCHAR ucFontColor, USHORT usFontstyle, drawfile_fontref tFontRef,
324f5736e95SDavid du Colombier USHORT usFontSize, USHORT usMaxFontSize)
325f5736e95SDavid du Colombier {
326*25b329d5SDavid du Colombier drawfile_object *pNew;
327f5736e95SDavid du Colombier long lSizeX, lSizeY, lOffset, l20, lYMove;
328f5736e95SDavid du Colombier size_t tRealSize, tSize;
329f5736e95SDavid du Colombier
330*25b329d5SDavid du Colombier TRACE_MSG("vSubstring2Diagram");
331*25b329d5SDavid du Colombier
332f5736e95SDavid du Colombier fail(pDiag == NULL || szString == NULL);
333f5736e95SDavid du Colombier fail(pDiag->lXleft < 0);
334f5736e95SDavid du Colombier fail(tStringLength != strlen(szString));
335f5736e95SDavid du Colombier fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
336f5736e95SDavid du Colombier fail(usMaxFontSize < MIN_FONT_SIZE || usMaxFontSize > MAX_FONT_SIZE);
337f5736e95SDavid du Colombier fail(usFontSize > usMaxFontSize);
338f5736e95SDavid du Colombier
339f5736e95SDavid du Colombier if (szString[0] == '\0' || tStringLength == 0) {
340f5736e95SDavid du Colombier return;
341f5736e95SDavid du Colombier }
342f5736e95SDavid du Colombier
343f5736e95SDavid du Colombier if (tFontRef == 0) {
344*25b329d5SDavid du Colombier lOffset = Drawfile_ScreenToDraw(2);
345*25b329d5SDavid du Colombier l20 = Drawfile_ScreenToDraw(32 + 3);
346*25b329d5SDavid du Colombier lSizeX = Drawfile_ScreenToDraw(16);
347*25b329d5SDavid du Colombier lSizeY = Drawfile_ScreenToDraw(32);
348f5736e95SDavid du Colombier } else {
349f5736e95SDavid du Colombier lOffset = lToBaseLine(usMaxFontSize);
350f5736e95SDavid du Colombier l20 = lWord2DrawUnits20(usMaxFontSize);
351f5736e95SDavid du Colombier lSizeX = lWord2DrawUnits00(usFontSize);
352f5736e95SDavid du Colombier lSizeY = lWord2DrawUnits00(usFontSize);
353f5736e95SDavid du Colombier }
354f5736e95SDavid du Colombier
355f5736e95SDavid du Colombier lYMove = 0;
356f5736e95SDavid du Colombier
357f5736e95SDavid du Colombier /* Up for superscript */
358f5736e95SDavid du Colombier if (bIsSuperscript(usFontstyle)) {
359f5736e95SDavid du Colombier lYMove = lMilliPoints2DrawUnits((((long)usFontSize + 1) / 2) * 375);
360f5736e95SDavid du Colombier }
361f5736e95SDavid du Colombier /* Down for subscript */
362f5736e95SDavid du Colombier if (bIsSubscript(usFontstyle)) {
363f5736e95SDavid du Colombier lYMove = -lMilliPoints2DrawUnits((long)usFontSize * 125);
364f5736e95SDavid du Colombier }
365f5736e95SDavid du Colombier
366*25b329d5SDavid du Colombier tRealSize = offsetof(drawfile_object, data);
367*25b329d5SDavid du Colombier tRealSize += sizeof(drawfile_text) + tStringLength;
368f5736e95SDavid du Colombier tSize = ROUND4(tRealSize);
369f5736e95SDavid du Colombier vExtendDiagramSize(pDiag, tSize);
370*25b329d5SDavid du Colombier pNew = xmalloc(tSize);
371*25b329d5SDavid du Colombier memset(pNew, 0, tSize);
372*25b329d5SDavid du Colombier pNew->type = drawfile_TYPE_TEXT;
373*25b329d5SDavid du Colombier pNew->size = tSize;
374*25b329d5SDavid du Colombier pNew->data.text.bbox.min.x = (int)pDiag->lXleft;
375*25b329d5SDavid du Colombier pNew->data.text.bbox.min.y = (int)(pDiag->lYtop + lYMove);
376*25b329d5SDavid du Colombier pNew->data.text.bbox.max.x = (int)(pDiag->lXleft + lStringWidth);
377*25b329d5SDavid du Colombier pNew->data.text.bbox.max.y = (int)(pDiag->lYtop + l20 + lYMove);
378*25b329d5SDavid du Colombier pNew->data.text.fill.value = (int)ulColor2Color(ucFontColor);
379*25b329d5SDavid du Colombier pNew->data.text.bg_hint.value = 0xffffff00; /* White */
380*25b329d5SDavid du Colombier pNew->data.text.style.font_ref = tFontRef;
381*25b329d5SDavid du Colombier pNew->data.text.style.reserved[0] = 0;
382*25b329d5SDavid du Colombier pNew->data.text.style.reserved[1] = 0;
383*25b329d5SDavid du Colombier pNew->data.text.style.reserved[2] = 0;
384*25b329d5SDavid du Colombier pNew->data.text.xsize = (int)lSizeX;
385*25b329d5SDavid du Colombier pNew->data.text.ysize = (int)lSizeY;
386*25b329d5SDavid du Colombier pNew->data.text.base.x = (int)pDiag->lXleft;
387*25b329d5SDavid du Colombier pNew->data.text.base.y = (int)(pDiag->lYtop + lOffset + lYMove);
388*25b329d5SDavid du Colombier strncpy(pNew->data.text.text, szString, tStringLength);
389*25b329d5SDavid du Colombier pNew->data.text.text[tStringLength] = '\0';
390*25b329d5SDavid du Colombier Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo,
391*25b329d5SDavid du Colombier pDiag->tMemorySize, pNew, TRUE));
392*25b329d5SDavid du Colombier pNew = xfree(pNew);
393*25b329d5SDavid du Colombier /*draw_translateText(&pDiag->tInfo);*/
394f5736e95SDavid du Colombier pDiag->lXleft += lStringWidth;
395*25b329d5SDavid du Colombier TRACE_MSG("leaving vSubstring2Diagram");
396f5736e95SDavid du Colombier } /* end of vSubstring2Diagram */
397f5736e95SDavid du Colombier
398f5736e95SDavid du Colombier /*
399f5736e95SDavid du Colombier * vImage2Diagram - put an image into a diagram
400f5736e95SDavid du Colombier */
401f5736e95SDavid du Colombier void
vImage2Diagram(diagram_type * pDiag,const imagedata_type * pImg,UCHAR * pucImage,size_t tImageSize)402f5736e95SDavid du Colombier vImage2Diagram(diagram_type *pDiag, const imagedata_type *pImg,
403f5736e95SDavid du Colombier UCHAR *pucImage, size_t tImageSize)
404f5736e95SDavid du Colombier {
405*25b329d5SDavid du Colombier drawfile_object *pNew;
406f5736e95SDavid du Colombier long lWidth, lHeight;
407f5736e95SDavid du Colombier size_t tRealSize, tSize;
408f5736e95SDavid du Colombier
409*25b329d5SDavid du Colombier TRACE_MSG("vImage2Diagram");
410f5736e95SDavid du Colombier
411f5736e95SDavid du Colombier fail(pDiag == NULL);
412f5736e95SDavid du Colombier fail(pImg == NULL);
413f5736e95SDavid du Colombier fail(pDiag->lXleft < 0);
414f5736e95SDavid du Colombier fail(pImg->eImageType != imagetype_is_dib &&
415f5736e95SDavid du Colombier pImg->eImageType != imagetype_is_jpeg);
416f5736e95SDavid du Colombier
417f5736e95SDavid du Colombier DBG_DEC_C(pDiag->lXleft != 0, pDiag->lXleft);
418f5736e95SDavid du Colombier
419f5736e95SDavid du Colombier lWidth = lPoints2DrawUnits(pImg->iHorSizeScaled);
420f5736e95SDavid du Colombier lHeight = lPoints2DrawUnits(pImg->iVerSizeScaled);
421f5736e95SDavid du Colombier DBG_DEC(lWidth);
422f5736e95SDavid du Colombier DBG_DEC(lHeight);
423f5736e95SDavid du Colombier
424f5736e95SDavid du Colombier pDiag->lYtop -= lHeight;
425f5736e95SDavid du Colombier
426*25b329d5SDavid du Colombier tRealSize = offsetof(drawfile_object, data);
427f5736e95SDavid du Colombier switch (pImg->eImageType) {
428f5736e95SDavid du Colombier case imagetype_is_dib:
429*25b329d5SDavid du Colombier tRealSize += sizeof(drawfile_sprite) + tImageSize;
430f5736e95SDavid du Colombier tSize = ROUND4(tRealSize);
431f5736e95SDavid du Colombier vExtendDiagramSize(pDiag, tSize);
432*25b329d5SDavid du Colombier pNew = xmalloc(tSize);
433*25b329d5SDavid du Colombier memset(pNew, 0, tSize);
434*25b329d5SDavid du Colombier pNew->type = drawfile_TYPE_SPRITE;
435*25b329d5SDavid du Colombier pNew->size = tSize;
436*25b329d5SDavid du Colombier pNew->data.sprite.bbox.min.x = (int)pDiag->lXleft;
437*25b329d5SDavid du Colombier pNew->data.sprite.bbox.min.y = (int)pDiag->lYtop;
438*25b329d5SDavid du Colombier pNew->data.sprite.bbox.max.x = (int)(pDiag->lXleft + lWidth);
439*25b329d5SDavid du Colombier pNew->data.sprite.bbox.max.y = (int)(pDiag->lYtop + lHeight);
440*25b329d5SDavid du Colombier memcpy(&pNew->data.sprite.header, pucImage, tImageSize);
441f5736e95SDavid du Colombier break;
442f5736e95SDavid du Colombier case imagetype_is_jpeg:
443f5736e95SDavid du Colombier #if defined(DEBUG)
444f5736e95SDavid du Colombier (void)bGetJpegInfo(pucImage, tImageSize);
445f5736e95SDavid du Colombier #endif /* DEBUG */
446*25b329d5SDavid du Colombier tRealSize += sizeof(drawfile_jpeg) + tImageSize;
447f5736e95SDavid du Colombier tSize = ROUND4(tRealSize);
448f5736e95SDavid du Colombier vExtendDiagramSize(pDiag, tSize);
449*25b329d5SDavid du Colombier pNew = xmalloc(tSize);
450*25b329d5SDavid du Colombier memset(pNew, 0, tSize);
451*25b329d5SDavid du Colombier pNew->type = drawfile_TYPE_JPEG;
452*25b329d5SDavid du Colombier pNew->size = tSize;
453*25b329d5SDavid du Colombier pNew->data.jpeg.bbox.min.x = (int)pDiag->lXleft;
454*25b329d5SDavid du Colombier pNew->data.jpeg.bbox.min.y = (int)pDiag->lYtop;
455*25b329d5SDavid du Colombier pNew->data.jpeg.bbox.max.x = (int)(pDiag->lXleft + lWidth);
456*25b329d5SDavid du Colombier pNew->data.jpeg.bbox.max.y = (int)(pDiag->lYtop + lHeight);
457*25b329d5SDavid du Colombier pNew->data.jpeg.width = (int)lWidth;
458*25b329d5SDavid du Colombier pNew->data.jpeg.height = (int)lHeight;
459*25b329d5SDavid du Colombier pNew->data.jpeg.xdpi = 90;
460*25b329d5SDavid du Colombier pNew->data.jpeg.ydpi = 90;
461*25b329d5SDavid du Colombier pNew->data.jpeg.trfm.entries[0][0] = 0x10000;
462*25b329d5SDavid du Colombier pNew->data.jpeg.trfm.entries[0][1] = 0;
463*25b329d5SDavid du Colombier pNew->data.jpeg.trfm.entries[1][0] = 0;
464*25b329d5SDavid du Colombier pNew->data.jpeg.trfm.entries[1][1] = 0x10000;
465*25b329d5SDavid du Colombier pNew->data.jpeg.trfm.entries[2][0] = (int)pDiag->lXleft;
466*25b329d5SDavid du Colombier pNew->data.jpeg.trfm.entries[2][1] = (int)pDiag->lYtop;
467*25b329d5SDavid du Colombier pNew->data.jpeg.len = tImageSize;
468*25b329d5SDavid du Colombier memcpy(pNew->data.jpeg.data, pucImage, tImageSize);
469f5736e95SDavid du Colombier break;
470f5736e95SDavid du Colombier default:
471f5736e95SDavid du Colombier DBG_DEC(pImg->eImageType);
472*25b329d5SDavid du Colombier pNew = NULL;
473f5736e95SDavid du Colombier break;
474f5736e95SDavid du Colombier }
475f5736e95SDavid du Colombier
476*25b329d5SDavid du Colombier Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo,
477*25b329d5SDavid du Colombier pDiag->tMemorySize, pNew, TRUE));
478*25b329d5SDavid du Colombier pNew = xfree(pNew);
479f5736e95SDavid du Colombier pDiag->lXleft = 0;
480f5736e95SDavid du Colombier } /* end of vImage2Diagram */
481f5736e95SDavid du Colombier
482f5736e95SDavid du Colombier /*
483f5736e95SDavid du Colombier * bAddDummyImage - add a dummy image
484f5736e95SDavid du Colombier *
485f5736e95SDavid du Colombier * return TRUE when successful, otherwise FALSE
486f5736e95SDavid du Colombier */
487f5736e95SDavid du Colombier BOOL
bAddDummyImage(diagram_type * pDiag,const imagedata_type * pImg)488f5736e95SDavid du Colombier bAddDummyImage(diagram_type *pDiag, const imagedata_type *pImg)
489f5736e95SDavid du Colombier {
490*25b329d5SDavid du Colombier drawfile_object *pNew;
491f5736e95SDavid du Colombier int *piTmp;
492f5736e95SDavid du Colombier long lWidth, lHeight;
493f5736e95SDavid du Colombier size_t tRealSize, tSize;
494f5736e95SDavid du Colombier
495*25b329d5SDavid du Colombier TRACE_MSG("bAddDummyImage");
496f5736e95SDavid du Colombier
497f5736e95SDavid du Colombier fail(pDiag == NULL);
498f5736e95SDavid du Colombier fail(pImg == NULL);
499f5736e95SDavid du Colombier fail(pDiag->lXleft < 0);
500f5736e95SDavid du Colombier
501f5736e95SDavid du Colombier if (pImg->iVerSizeScaled <= 0 || pImg->iHorSizeScaled <= 0) {
502f5736e95SDavid du Colombier return FALSE;
503f5736e95SDavid du Colombier }
504f5736e95SDavid du Colombier
505f5736e95SDavid du Colombier DBG_DEC_C(pDiag->lXleft != 0, pDiag->lXleft);
506f5736e95SDavid du Colombier
507f5736e95SDavid du Colombier lWidth = lPoints2DrawUnits(pImg->iHorSizeScaled);
508f5736e95SDavid du Colombier lHeight = lPoints2DrawUnits(pImg->iVerSizeScaled);
509f5736e95SDavid du Colombier
510f5736e95SDavid du Colombier pDiag->lYtop -= lHeight;
511f5736e95SDavid du Colombier
512*25b329d5SDavid du Colombier tRealSize = offsetof(drawfile_object, data);
513*25b329d5SDavid du Colombier tRealSize += sizeof(drawfile_path) + (14 - 1) * sizeof(int);
514f5736e95SDavid du Colombier tSize = ROUND4(tRealSize);
515f5736e95SDavid du Colombier vExtendDiagramSize(pDiag, tSize);
516*25b329d5SDavid du Colombier pNew = xmalloc(tSize);
517*25b329d5SDavid du Colombier memset(pNew, 0, tSize);
518*25b329d5SDavid du Colombier pNew->type = drawfile_TYPE_PATH;
519*25b329d5SDavid du Colombier pNew->size = tSize;
520*25b329d5SDavid du Colombier pNew->data.path.bbox.min.x = (int)pDiag->lXleft;
521*25b329d5SDavid du Colombier pNew->data.path.bbox.min.y = (int)pDiag->lYtop;
522*25b329d5SDavid du Colombier pNew->data.path.bbox.max.x = (int)(pDiag->lXleft + lWidth);
523*25b329d5SDavid du Colombier pNew->data.path.bbox.max.y = (int)(pDiag->lYtop + lHeight);
524*25b329d5SDavid du Colombier pNew->data.path.fill.value = -1;
525*25b329d5SDavid du Colombier pNew->data.path.outline.value = 0x4d4d4d00; /* Gray 70 percent */
526*25b329d5SDavid du Colombier pNew->data.path.width = (int)lMilliPoints2DrawUnits(500);
527*25b329d5SDavid du Colombier pNew->data.path.style.flags = 0;
528*25b329d5SDavid du Colombier pNew->data.path.style.reserved = 0;
529*25b329d5SDavid du Colombier pNew->data.path.style.cap_width = 0;
530*25b329d5SDavid du Colombier pNew->data.path.style.cap_length = 0;
531*25b329d5SDavid du Colombier piTmp = pNew->data.path.path;
532*25b329d5SDavid du Colombier *piTmp++ = drawfile_PATH_MOVE_TO;
533*25b329d5SDavid du Colombier *piTmp++ = pNew->data.path.bbox.min.x;
534*25b329d5SDavid du Colombier *piTmp++ = pNew->data.path.bbox.min.y;
535*25b329d5SDavid du Colombier *piTmp++ = drawfile_PATH_LINE_TO;
536*25b329d5SDavid du Colombier *piTmp++ = pNew->data.path.bbox.min.x;
537*25b329d5SDavid du Colombier *piTmp++ = pNew->data.path.bbox.max.y;
538*25b329d5SDavid du Colombier *piTmp++ = drawfile_PATH_LINE_TO;
539*25b329d5SDavid du Colombier *piTmp++ = pNew->data.path.bbox.max.x;
540*25b329d5SDavid du Colombier *piTmp++ = pNew->data.path.bbox.max.y;
541*25b329d5SDavid du Colombier *piTmp++ = drawfile_PATH_LINE_TO;
542*25b329d5SDavid du Colombier *piTmp++ = pNew->data.path.bbox.max.x;
543*25b329d5SDavid du Colombier *piTmp++ = pNew->data.path.bbox.min.y;
544*25b329d5SDavid du Colombier *piTmp++ = drawfile_PATH_CLOSE_LINE;
545*25b329d5SDavid du Colombier *piTmp++ = drawfile_PATH_END_PATH;
546*25b329d5SDavid du Colombier
547*25b329d5SDavid du Colombier Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo,
548*25b329d5SDavid du Colombier pDiag->tMemorySize, pNew, TRUE));
549*25b329d5SDavid du Colombier pNew = xfree(pNew);
550f5736e95SDavid du Colombier pDiag->lXleft = 0;
551f5736e95SDavid du Colombier return TRUE;
552f5736e95SDavid du Colombier } /* end of bAddDummyImage */
553f5736e95SDavid du Colombier
554f5736e95SDavid du Colombier /*
555f5736e95SDavid du Colombier * vMove2NextLine - move to the next line
556f5736e95SDavid du Colombier */
557f5736e95SDavid du Colombier void
vMove2NextLine(diagram_type * pDiag,drawfile_fontref tFontRef,USHORT usFontSize)558*25b329d5SDavid du Colombier vMove2NextLine(diagram_type *pDiag, drawfile_fontref tFontRef,
559*25b329d5SDavid du Colombier USHORT usFontSize)
560f5736e95SDavid du Colombier {
561f5736e95SDavid du Colombier long l20;
562f5736e95SDavid du Colombier
563*25b329d5SDavid du Colombier TRACE_MSG("vMove2NextLine");
564*25b329d5SDavid du Colombier
565f5736e95SDavid du Colombier fail(pDiag == NULL);
566f5736e95SDavid du Colombier fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
567f5736e95SDavid du Colombier
568f5736e95SDavid du Colombier if (tFontRef == 0) {
569*25b329d5SDavid du Colombier l20 = Drawfile_ScreenToDraw(32 + 3);
570f5736e95SDavid du Colombier } else {
571f5736e95SDavid du Colombier l20 = lWord2DrawUnits20(usFontSize);
572f5736e95SDavid du Colombier }
573f5736e95SDavid du Colombier pDiag->lYtop -= l20;
574f5736e95SDavid du Colombier } /* end of vMove2NextLine */
575f5736e95SDavid du Colombier
576f5736e95SDavid du Colombier /*
577f5736e95SDavid du Colombier * Create an start of paragraph (Phase 1)
578f5736e95SDavid du Colombier */
579f5736e95SDavid du Colombier void
vStartOfParagraph1(diagram_type * pDiag,long lBeforeIndentation)580f5736e95SDavid du Colombier vStartOfParagraph1(diagram_type *pDiag, long lBeforeIndentation)
581f5736e95SDavid du Colombier {
582*25b329d5SDavid du Colombier TRACE_MSG("vStartOfParagraph1");
583*25b329d5SDavid du Colombier
584f5736e95SDavid du Colombier fail(pDiag == NULL);
585f5736e95SDavid du Colombier fail(lBeforeIndentation < 0);
586f5736e95SDavid du Colombier
587f5736e95SDavid du Colombier pDiag->lXleft = 0;
588f5736e95SDavid du Colombier pDiag->lYtop -= lMilliPoints2DrawUnits(lBeforeIndentation);
589f5736e95SDavid du Colombier } /* end of vStartOfParagraph1 */
590f5736e95SDavid du Colombier
591f5736e95SDavid du Colombier /*
592f5736e95SDavid du Colombier * Create an start of paragraph (Phase 2)
593*25b329d5SDavid du Colombier * DUMMY function
594f5736e95SDavid du Colombier */
595f5736e95SDavid du Colombier void
vStartOfParagraph2(diagram_type * pDiag)596f5736e95SDavid du Colombier vStartOfParagraph2(diagram_type *pDiag)
597f5736e95SDavid du Colombier {
598*25b329d5SDavid du Colombier TRACE_MSG("vStartOfParagraph2");
599f5736e95SDavid du Colombier } /* end of vStartOfParagraph2 */
600f5736e95SDavid du Colombier
601f5736e95SDavid du Colombier /*
602f5736e95SDavid du Colombier * Create an end of paragraph
603f5736e95SDavid du Colombier */
604f5736e95SDavid du Colombier void
vEndOfParagraph(diagram_type * pDiag,drawfile_fontref tFontRef,USHORT usFontSize,long lAfterIndentation)605f5736e95SDavid du Colombier vEndOfParagraph(diagram_type *pDiag,
606*25b329d5SDavid du Colombier drawfile_fontref tFontRef, USHORT usFontSize, long lAfterIndentation)
607f5736e95SDavid du Colombier {
608*25b329d5SDavid du Colombier TRACE_MSG("vEndOfParagraph");
609*25b329d5SDavid du Colombier
610f5736e95SDavid du Colombier fail(pDiag == NULL);
611f5736e95SDavid du Colombier fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
612f5736e95SDavid du Colombier fail(lAfterIndentation < 0);
613f5736e95SDavid du Colombier
614f5736e95SDavid du Colombier pDiag->lXleft = 0;
615f5736e95SDavid du Colombier pDiag->lYtop -= lMilliPoints2DrawUnits(lAfterIndentation);
616f5736e95SDavid du Colombier } /* end of vEndOfParagraph */
617f5736e95SDavid du Colombier
618f5736e95SDavid du Colombier /*
619f5736e95SDavid du Colombier * Create an end of page
620f5736e95SDavid du Colombier */
621f5736e95SDavid du Colombier void
vEndOfPage(diagram_type * pDiag,long lAfterIndentation,BOOL bNewSection)622*25b329d5SDavid du Colombier vEndOfPage(diagram_type *pDiag, long lAfterIndentation, BOOL bNewSection)
623f5736e95SDavid du Colombier {
624*25b329d5SDavid du Colombier TRACE_MSG("vEndOfPage");
625*25b329d5SDavid du Colombier
626f5736e95SDavid du Colombier fail(pDiag == NULL);
627f5736e95SDavid du Colombier fail(lAfterIndentation < 0);
628f5736e95SDavid du Colombier
629f5736e95SDavid du Colombier pDiag->lXleft = 0;
630f5736e95SDavid du Colombier pDiag->lYtop -= lMilliPoints2DrawUnits(lAfterIndentation);
631f5736e95SDavid du Colombier } /* end of vEndOfPage */
632f5736e95SDavid du Colombier
633f5736e95SDavid du Colombier /*
634f5736e95SDavid du Colombier * vSetHeaders - set the headers
635*25b329d5SDavid du Colombier * DUMMY function
636f5736e95SDavid du Colombier */
637f5736e95SDavid du Colombier void
vSetHeaders(diagram_type * pDiag,USHORT usIstd)638f5736e95SDavid du Colombier vSetHeaders(diagram_type *pDiag, USHORT usIstd)
639f5736e95SDavid du Colombier {
640*25b329d5SDavid du Colombier TRACE_MSG("vSetHeaders");
641f5736e95SDavid du Colombier } /* end of vSetHeaders */
642f5736e95SDavid du Colombier
643f5736e95SDavid du Colombier /*
644f5736e95SDavid du Colombier * Create a start of list
645*25b329d5SDavid du Colombier * DUMMY function
646f5736e95SDavid du Colombier */
647f5736e95SDavid du Colombier void
vStartOfList(diagram_type * pDiag,UCHAR ucNFC,BOOL bIsEndOfTable)648f5736e95SDavid du Colombier vStartOfList(diagram_type *pDiag, UCHAR ucNFC, BOOL bIsEndOfTable)
649f5736e95SDavid du Colombier {
650*25b329d5SDavid du Colombier TRACE_MSG("vStartOfList");
651f5736e95SDavid du Colombier } /* end of vStartOfList */
652f5736e95SDavid du Colombier
653f5736e95SDavid du Colombier /*
654f5736e95SDavid du Colombier * Create an end of list
655*25b329d5SDavid du Colombier * DUMMY function
656f5736e95SDavid du Colombier */
657f5736e95SDavid du Colombier void
vEndOfList(diagram_type * pDiag)658f5736e95SDavid du Colombier vEndOfList(diagram_type *pDiag)
659f5736e95SDavid du Colombier {
660*25b329d5SDavid du Colombier TRACE_MSG("vEndOfList");
661f5736e95SDavid du Colombier } /* end of vEndOfList */
662f5736e95SDavid du Colombier
663f5736e95SDavid du Colombier /*
664f5736e95SDavid du Colombier * Create a start of a list item
665*25b329d5SDavid du Colombier * DUMMY function
666f5736e95SDavid du Colombier */
667f5736e95SDavid du Colombier void
vStartOfListItem(diagram_type * pDiag,BOOL bNoMarks)668f5736e95SDavid du Colombier vStartOfListItem(diagram_type *pDiag, BOOL bNoMarks)
669f5736e95SDavid du Colombier {
670*25b329d5SDavid du Colombier TRACE_MSG("vStartOfListItem");
671f5736e95SDavid du Colombier } /* end of vStartOfListItem */
672f5736e95SDavid du Colombier
673f5736e95SDavid du Colombier /*
674f5736e95SDavid du Colombier * Create an end of a table
675*25b329d5SDavid du Colombier * DUMMY function
676f5736e95SDavid du Colombier */
677f5736e95SDavid du Colombier void
vEndOfTable(diagram_type * pDiag)678f5736e95SDavid du Colombier vEndOfTable(diagram_type *pDiag)
679f5736e95SDavid du Colombier {
680*25b329d5SDavid du Colombier TRACE_MSG("vEndOfTable");
681f5736e95SDavid du Colombier } /* end of vEndTable */
682f5736e95SDavid du Colombier
683f5736e95SDavid du Colombier /*
684f5736e95SDavid du Colombier * Add a table row
685*25b329d5SDavid du Colombier * DUMMY function
686f5736e95SDavid du Colombier *
687f5736e95SDavid du Colombier * Returns TRUE when conversion type is XML
688f5736e95SDavid du Colombier */
689f5736e95SDavid du Colombier BOOL
bAddTableRow(diagram_type * pDiag,char ** aszColTxt,int iNbrOfColumns,const short * asColumnWidth,UCHAR ucBorderInfo)690f5736e95SDavid du Colombier bAddTableRow(diagram_type *pDiag, char **aszColTxt,
691f5736e95SDavid du Colombier int iNbrOfColumns, const short *asColumnWidth, UCHAR ucBorderInfo)
692f5736e95SDavid du Colombier {
693*25b329d5SDavid du Colombier TRACE_MSG("bAddTableRow");
694*25b329d5SDavid du Colombier
695f5736e95SDavid du Colombier return FALSE;
696f5736e95SDavid du Colombier } /* end of bAddTableRow */
697f5736e95SDavid du Colombier
698f5736e95SDavid du Colombier /*
699f5736e95SDavid du Colombier * vForceRedraw - force a redraw of the main window
700f5736e95SDavid du Colombier */
701f5736e95SDavid du Colombier static void
vForceRedraw(diagram_type * pDiag)702f5736e95SDavid du Colombier vForceRedraw(diagram_type *pDiag)
703f5736e95SDavid du Colombier {
704*25b329d5SDavid du Colombier window_state tWindowState;
705*25b329d5SDavid du Colombier window_redrawblock tRedraw;
706*25b329d5SDavid du Colombier int x0, y0, x1, y1;
707f5736e95SDavid du Colombier
708*25b329d5SDavid du Colombier TRACE_MSG("vForceRedraw");
709f5736e95SDavid du Colombier
710f5736e95SDavid du Colombier fail(pDiag == NULL);
711f5736e95SDavid du Colombier
712f5736e95SDavid du Colombier DBG_DEC(pDiag->iScaleFactorCurr);
713f5736e95SDavid du Colombier
714f5736e95SDavid du Colombier /* Read the size of the current diagram */
715*25b329d5SDavid du Colombier Drawfile_QueryBox(&pDiag->tInfo, &tRedraw.rect, TRUE);
716f5736e95SDavid du Colombier /* Adjust the size of the work area */
717*25b329d5SDavid du Colombier x0 = tRedraw.rect.min.x * pDiag->iScaleFactorCurr / 100 - 1;
718*25b329d5SDavid du Colombier y0 = tRedraw.rect.min.y * pDiag->iScaleFactorCurr / 100 - 1;
719*25b329d5SDavid du Colombier x1 = tRedraw.rect.max.x * pDiag->iScaleFactorCurr / 100 + 1;
720*25b329d5SDavid du Colombier y1 = tRedraw.rect.max.y * pDiag->iScaleFactorCurr / 100 + 1;
721f5736e95SDavid du Colombier /* Work area extension */
722*25b329d5SDavid du Colombier x0 -= WORKAREA_EXTENSION;
723*25b329d5SDavid du Colombier y0 -= WORKAREA_EXTENSION;
724*25b329d5SDavid du Colombier x1 += WORKAREA_EXTENSION;
725*25b329d5SDavid du Colombier y1 += WORKAREA_EXTENSION;
726*25b329d5SDavid du Colombier Window_SetExtent(pDiag->tMainWindow, x0, y0, x1, y1);
727f5736e95SDavid du Colombier /* Widen the box slightly to be sure all the edges are drawn */
728*25b329d5SDavid du Colombier x0 -= 5;
729*25b329d5SDavid du Colombier y0 -= 5;
730*25b329d5SDavid du Colombier x1 += 5;
731*25b329d5SDavid du Colombier y1 += 5;
732f5736e95SDavid du Colombier /* Force the redraw */
733*25b329d5SDavid du Colombier Window_ForceRedraw(pDiag->tMainWindow, x0, y0, x1, y1);
734f5736e95SDavid du Colombier /* Reopen the window to show the correct size */
735*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_GetWindowState(pDiag->tMainWindow, &tWindowState));
736*25b329d5SDavid du Colombier tWindowState.openblock.behind = -1;
737*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_OpenWindow(&tWindowState.openblock));
738f5736e95SDavid du Colombier } /* end of vForceRedraw */
739f5736e95SDavid du Colombier
740f5736e95SDavid du Colombier /*
741f5736e95SDavid du Colombier * vShowDiagram - put the diagram on the screen
742f5736e95SDavid du Colombier */
743f5736e95SDavid du Colombier void
vShowDiagram(diagram_type * pDiag)744f5736e95SDavid du Colombier vShowDiagram(diagram_type *pDiag)
745f5736e95SDavid du Colombier {
746*25b329d5SDavid du Colombier wimp_box tRect;
747*25b329d5SDavid du Colombier int x0, y0, x1, y1;
748*25b329d5SDavid du Colombier
749*25b329d5SDavid du Colombier TRACE_MSG("vShowDiagram");
750f5736e95SDavid du Colombier
751f5736e95SDavid du Colombier fail(pDiag == NULL);
752f5736e95SDavid du Colombier
753*25b329d5SDavid du Colombier Window_Show(pDiag->tMainWindow, open_NEARLAST);
754*25b329d5SDavid du Colombier Drawfile_QueryBox(&pDiag->tInfo, &tRect, TRUE);
755f5736e95SDavid du Colombier /* Work area extension */
756*25b329d5SDavid du Colombier x0 = tRect.min.x - WORKAREA_EXTENSION;
757*25b329d5SDavid du Colombier y0 = tRect.min.y - WORKAREA_EXTENSION;
758*25b329d5SDavid du Colombier x1 = tRect.max.x + WORKAREA_EXTENSION;
759*25b329d5SDavid du Colombier y1 = tRect.max.y + WORKAREA_EXTENSION;
760*25b329d5SDavid du Colombier Window_SetExtent(pDiag->tMainWindow, x0, y0, x1, y1);
761f5736e95SDavid du Colombier vForceRedraw(pDiag);
762f5736e95SDavid du Colombier } /* end of vShowDiagram */
763f5736e95SDavid du Colombier
764f5736e95SDavid du Colombier /*
765f5736e95SDavid du Colombier * vMainButtonClick - handle mouse buttons clicks for the main screen
766f5736e95SDavid du Colombier */
767*25b329d5SDavid du Colombier void
vMainButtonClick(mouse_block * pMouse)768*25b329d5SDavid du Colombier vMainButtonClick(mouse_block *pMouse)
769f5736e95SDavid du Colombier {
770*25b329d5SDavid du Colombier caret_block tCaret;
771*25b329d5SDavid du Colombier window_state ws;
772f5736e95SDavid du Colombier
773*25b329d5SDavid du Colombier TRACE_MSG("vMainButtonClick");
774f5736e95SDavid du Colombier
775*25b329d5SDavid du Colombier fail(pMouse == NULL);
776f5736e95SDavid du Colombier
777*25b329d5SDavid du Colombier DBG_DEC(pMouse->button.data.select);
778*25b329d5SDavid du Colombier DBG_DEC(pMouse->button.data.adjust);
779*25b329d5SDavid du Colombier DBG_DEC(pMouse->window);
780*25b329d5SDavid du Colombier DBG_DEC(pMouse->icon);
781*25b329d5SDavid du Colombier
782*25b329d5SDavid du Colombier if (pMouse->window >= 0 &&
783*25b329d5SDavid du Colombier pMouse->icon == -1 &&
784*25b329d5SDavid du Colombier (pMouse->button.data.select || pMouse->button.data.adjust)) {
785f5736e95SDavid du Colombier /* Get the input focus */
786*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_GetWindowState(pMouse->window, &ws));
787*25b329d5SDavid du Colombier tCaret.window = pMouse->window;
788*25b329d5SDavid du Colombier tCaret.icon = -1;
789*25b329d5SDavid du Colombier tCaret.offset.x = pMouse->pos.x - ws.openblock.screenrect.min.x;
790*25b329d5SDavid du Colombier tCaret.offset.y = pMouse->pos.y - ws.openblock.screenrect.max.y;
791*25b329d5SDavid du Colombier tCaret.height = (int)BIT(25);
792*25b329d5SDavid du Colombier tCaret.index = 0;
793*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_SetCaretPosition(&tCaret));
794f5736e95SDavid du Colombier }
795f5736e95SDavid du Colombier } /* end of vMainButtonClick */
796f5736e95SDavid du Colombier
797f5736e95SDavid du Colombier /*
798*25b329d5SDavid du Colombier * bMainKeyPressed - handle pressed keys for the main window
799f5736e95SDavid du Colombier */
800*25b329d5SDavid du Colombier BOOL
bMainKeyPressed(event_pollblock * pEvent,void * pvReference)801*25b329d5SDavid du Colombier bMainKeyPressed(event_pollblock *pEvent, void *pvReference)
802f5736e95SDavid du Colombier {
803*25b329d5SDavid du Colombier diagram_type *pDiag;
804f5736e95SDavid du Colombier
805*25b329d5SDavid du Colombier TRACE_MSG("bMainKeyPressed");
806*25b329d5SDavid du Colombier
807*25b329d5SDavid du Colombier fail(pEvent == NULL);
808*25b329d5SDavid du Colombier fail(pEvent->type != event_KEY);
809*25b329d5SDavid du Colombier fail(pvReference == NULL);
810*25b329d5SDavid du Colombier
811*25b329d5SDavid du Colombier pDiag = (diagram_type *)pvReference;
812*25b329d5SDavid du Colombier
813*25b329d5SDavid du Colombier fail(pEvent->data.key.caret.window != pDiag->tMainWindow);
814*25b329d5SDavid du Colombier
815*25b329d5SDavid du Colombier
816*25b329d5SDavid du Colombier switch (pEvent->data.key.code) {
817*25b329d5SDavid du Colombier case keycode_CTRL_F2: /* Ctrl F2 */
818*25b329d5SDavid du Colombier bDestroyDiagram(pEvent, pvReference);
819f5736e95SDavid du Colombier break;
820*25b329d5SDavid du Colombier case keycode_F3: /* F3 */
821*25b329d5SDavid du Colombier bSaveDrawfile(pEvent, pvReference);
822f5736e95SDavid du Colombier break;
823*25b329d5SDavid du Colombier case keycode_SHIFT_F3: /* Shift F3 */
824*25b329d5SDavid du Colombier bSaveTextfile(pEvent, pvReference);
825f5736e95SDavid du Colombier break;
826f5736e95SDavid du Colombier default:
827*25b329d5SDavid du Colombier DBG_DEC(pEvent->data.key.code);
828*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_ProcessKey(pEvent->data.key.code));
829f5736e95SDavid du Colombier }
830*25b329d5SDavid du Colombier return TRUE;
831*25b329d5SDavid du Colombier } /* end of bMainKeyPressed */
832f5736e95SDavid du Colombier
833f5736e95SDavid du Colombier /*
834*25b329d5SDavid du Colombier * bRedrawMainWindow - redraw the main window
835f5736e95SDavid du Colombier */
836*25b329d5SDavid du Colombier BOOL
bRedrawMainWindow(event_pollblock * pEvent,void * pvReference)837*25b329d5SDavid du Colombier bRedrawMainWindow(event_pollblock *pEvent, void *pvReference)
838f5736e95SDavid du Colombier {
839*25b329d5SDavid du Colombier window_redrawblock tBlock;
840*25b329d5SDavid du Colombier diagram_type *pDiag;
841*25b329d5SDavid du Colombier drawfile_info *pInfo;
842f5736e95SDavid du Colombier double dScaleFactor;
843f5736e95SDavid du Colombier BOOL bMore;
844f5736e95SDavid du Colombier
845*25b329d5SDavid du Colombier TRACE_MSG("bRedrawMainWindow");
846*25b329d5SDavid du Colombier
847*25b329d5SDavid du Colombier fail(pEvent == NULL);
848*25b329d5SDavid du Colombier fail(pEvent->type != event_REDRAW);
849*25b329d5SDavid du Colombier fail(pvReference == NULL);
850*25b329d5SDavid du Colombier
851*25b329d5SDavid du Colombier pDiag = (diagram_type *)pvReference;
852*25b329d5SDavid du Colombier
853*25b329d5SDavid du Colombier fail(pDiag->tMainWindow != pEvent->data.openblock.window);
854f5736e95SDavid du Colombier fail(pDiag->iScaleFactorCurr < MIN_SCALE_FACTOR);
855f5736e95SDavid du Colombier fail(pDiag->iScaleFactorCurr > MAX_SCALE_FACTOR);
856f5736e95SDavid du Colombier
857f5736e95SDavid du Colombier dScaleFactor = (double)pDiag->iScaleFactorCurr / 100.0;
858f5736e95SDavid du Colombier pInfo = &pDiag->tInfo;
859f5736e95SDavid du Colombier
860*25b329d5SDavid du Colombier tBlock.window = pEvent->data.openblock.window;
861*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_RedrawWindow(&tBlock, &bMore));
862f5736e95SDavid du Colombier
863*25b329d5SDavid du Colombier /* If there is no real diagram just go thru the motions */
864f5736e95SDavid du Colombier while (bMore) {
865*25b329d5SDavid du Colombier if (pInfo->data != NULL && pInfo->length != 0) {
866*25b329d5SDavid du Colombier Error_CheckFatal(Drawfile_RenderDiagram(pInfo,
867*25b329d5SDavid du Colombier &tBlock, dScaleFactor));
868f5736e95SDavid du Colombier }
869*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_GetRectangle(&tBlock, &bMore));
870f5736e95SDavid du Colombier }
871*25b329d5SDavid du Colombier return TRUE;
872*25b329d5SDavid du Colombier } /* end of bRedrawMainWindow */
873f5736e95SDavid du Colombier
874f5736e95SDavid du Colombier /*
875*25b329d5SDavid du Colombier * bScaleOpenAction - action to be taken when the Scale view window opens
876f5736e95SDavid du Colombier */
877*25b329d5SDavid du Colombier BOOL
bScaleOpenAction(event_pollblock * pEvent,void * pvReference)878*25b329d5SDavid du Colombier bScaleOpenAction(event_pollblock *pEvent, void *pvReference)
879f5736e95SDavid du Colombier {
880*25b329d5SDavid du Colombier window_state tWindowState;
881f5736e95SDavid du Colombier diagram_type *pDiag;
882f5736e95SDavid du Colombier
883*25b329d5SDavid du Colombier TRACE_MSG("bScaleOpenAction");
884*25b329d5SDavid du Colombier
885f5736e95SDavid du Colombier fail(pEvent == NULL);
886*25b329d5SDavid du Colombier fail(pEvent->type != event_SEND);
887*25b329d5SDavid du Colombier fail(pEvent->data.message.header.action != message_MENUWARN);
888*25b329d5SDavid du Colombier fail(pvReference == NULL);
889f5736e95SDavid du Colombier
890*25b329d5SDavid du Colombier pDiag = (diagram_type *)pvReference;
891f5736e95SDavid du Colombier
892*25b329d5SDavid du Colombier if (menu_currentopen != pDiag->pSaveMenu ||
893*25b329d5SDavid du Colombier pEvent->data.message.data.menuwarn.selection[0] != SAVEMENU_SCALEVIEW) {
894*25b329d5SDavid du Colombier return FALSE;
895f5736e95SDavid du Colombier }
896f5736e95SDavid du Colombier
897*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_GetWindowState(pDiag->tScaleWindow,
898*25b329d5SDavid du Colombier &tWindowState));
899*25b329d5SDavid du Colombier if (tWindowState.flags.data.open) {
900f5736e95SDavid du Colombier /* The window is already open */
901*25b329d5SDavid du Colombier return TRUE;
902f5736e95SDavid du Colombier }
903f5736e95SDavid du Colombier
904*25b329d5SDavid du Colombier DBG_MSG("vScaleOpenAction for real");
905f5736e95SDavid du Colombier
906f5736e95SDavid du Colombier pDiag->iScaleFactorTemp = pDiag->iScaleFactorCurr;
907f5736e95SDavid du Colombier vUpdateWriteableNumber(pDiag->tScaleWindow,
908f5736e95SDavid du Colombier SCALE_SCALE_WRITEABLE, pDiag->iScaleFactorTemp);
909*25b329d5SDavid du Colombier Window_Show(pDiag->tScaleWindow, open_UNDERPOINTER);
910*25b329d5SDavid du Colombier return TRUE;
911*25b329d5SDavid du Colombier } /* end of bScaleOpenAction */
912f5736e95SDavid du Colombier
913f5736e95SDavid du Colombier /*
914f5736e95SDavid du Colombier * vSetTitle - set the title of a window
915f5736e95SDavid du Colombier */
916f5736e95SDavid du Colombier void
vSetTitle(diagram_type * pDiag)917f5736e95SDavid du Colombier vSetTitle(diagram_type *pDiag)
918f5736e95SDavid du Colombier {
919f5736e95SDavid du Colombier char szTitle[WINDOW_TITLE_LEN];
920f5736e95SDavid du Colombier
921*25b329d5SDavid du Colombier TRACE_MSG("vSetTitle");
922*25b329d5SDavid du Colombier
923f5736e95SDavid du Colombier fail(pDiag == NULL);
924f5736e95SDavid du Colombier fail(pDiag->szFilename[0] == '\0');
925f5736e95SDavid du Colombier
926f5736e95SDavid du Colombier (void)sprintf(szTitle, "%.*s at %d%%",
927f5736e95SDavid du Colombier FILENAME_TITLE_LEN,
928f5736e95SDavid du Colombier pDiag->szFilename,
929f5736e95SDavid du Colombier pDiag->iScaleFactorCurr % 1000);
930f5736e95SDavid du Colombier if (strlen(pDiag->szFilename) > FILENAME_TITLE_LEN) {
931f5736e95SDavid du Colombier szTitle[FILENAME_TITLE_LEN - 1] = OUR_ELLIPSIS;
932f5736e95SDavid du Colombier }
933f5736e95SDavid du Colombier
934*25b329d5SDavid du Colombier Window_SetTitle(pDiag->tMainWindow, szTitle);
935f5736e95SDavid du Colombier } /* end of vSetTitle */
936f5736e95SDavid du Colombier
937f5736e95SDavid du Colombier /*
938f5736e95SDavid du Colombier * vScaleButtonClick - handle a mouse button click in the Scale view window
939f5736e95SDavid du Colombier */
940*25b329d5SDavid du Colombier void
vScaleButtonClick(mouse_block * pMouse,diagram_type * pDiag)941*25b329d5SDavid du Colombier vScaleButtonClick(mouse_block *pMouse, diagram_type *pDiag)
942f5736e95SDavid du Colombier {
943f5736e95SDavid du Colombier BOOL bCloseWindow, bRedraw;
944f5736e95SDavid du Colombier
945*25b329d5SDavid du Colombier TRACE_MSG("vScaleButtonClick");
946*25b329d5SDavid du Colombier
947*25b329d5SDavid du Colombier fail(pMouse == NULL || pDiag == NULL);
948*25b329d5SDavid du Colombier fail(pMouse->window != pDiag->tScaleWindow);
949f5736e95SDavid du Colombier
950f5736e95SDavid du Colombier bCloseWindow = FALSE;
951f5736e95SDavid du Colombier bRedraw = FALSE;
952*25b329d5SDavid du Colombier switch (pMouse->icon) {
953f5736e95SDavid du Colombier case SCALE_CANCEL_BUTTON:
954f5736e95SDavid du Colombier bCloseWindow = TRUE;
955f5736e95SDavid du Colombier pDiag->iScaleFactorTemp = pDiag->iScaleFactorCurr;
956f5736e95SDavid du Colombier break;
957f5736e95SDavid du Colombier case SCALE_SCALE_BUTTON:
958f5736e95SDavid du Colombier bCloseWindow = TRUE;
959f5736e95SDavid du Colombier bRedraw = pDiag->iScaleFactorCurr != pDiag->iScaleFactorTemp;
960f5736e95SDavid du Colombier pDiag->iScaleFactorCurr = pDiag->iScaleFactorTemp;
961f5736e95SDavid du Colombier break;
962f5736e95SDavid du Colombier case SCALE_50_PCT:
963f5736e95SDavid du Colombier pDiag->iScaleFactorTemp = 50;
964f5736e95SDavid du Colombier break;
965f5736e95SDavid du Colombier case SCALE_75_PCT:
966f5736e95SDavid du Colombier pDiag->iScaleFactorTemp = 75;
967f5736e95SDavid du Colombier break;
968f5736e95SDavid du Colombier case SCALE_100_PCT:
969f5736e95SDavid du Colombier pDiag->iScaleFactorTemp = 100;
970f5736e95SDavid du Colombier break;
971f5736e95SDavid du Colombier case SCALE_150_PCT:
972f5736e95SDavid du Colombier pDiag->iScaleFactorTemp = 150;
973f5736e95SDavid du Colombier break;
974f5736e95SDavid du Colombier default:
975*25b329d5SDavid du Colombier DBG_DEC(pMouse->icon);
976f5736e95SDavid du Colombier break;
977f5736e95SDavid du Colombier }
978f5736e95SDavid du Colombier if (bCloseWindow) {
979f5736e95SDavid du Colombier /* Close the scale window */
980*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_CloseWindow(pMouse->window));
981f5736e95SDavid du Colombier if (bRedraw) {
982f5736e95SDavid du Colombier /* Redraw the main window */
983f5736e95SDavid du Colombier vSetTitle(pDiag);
984f5736e95SDavid du Colombier vForceRedraw(pDiag);
985f5736e95SDavid du Colombier }
986f5736e95SDavid du Colombier } else {
987*25b329d5SDavid du Colombier vUpdateWriteableNumber(pMouse->window,
988f5736e95SDavid du Colombier SCALE_SCALE_WRITEABLE,
989f5736e95SDavid du Colombier pDiag->iScaleFactorTemp);
990f5736e95SDavid du Colombier }
991f5736e95SDavid du Colombier } /* end of vScaleButtonClick */
992f5736e95SDavid du Colombier
993*25b329d5SDavid du Colombier /*
994*25b329d5SDavid du Colombier * bScaleKeyPressed - handle pressed keys for the scale window
995*25b329d5SDavid du Colombier */
996*25b329d5SDavid du Colombier BOOL
bScaleKeyPressed(event_pollblock * pEvent,void * pvReference)997*25b329d5SDavid du Colombier bScaleKeyPressed(event_pollblock *pEvent, void *pvReference)
998f5736e95SDavid du Colombier {
999*25b329d5SDavid du Colombier icon_block tIcon;
1000*25b329d5SDavid du Colombier diagram_type *pDiag;
1001*25b329d5SDavid du Colombier caret_block *pCaret;
1002f5736e95SDavid du Colombier char *pcChar;
1003f5736e95SDavid du Colombier int iTmp;
1004f5736e95SDavid du Colombier
1005*25b329d5SDavid du Colombier TRACE_MSG("bScaleKeyPressed");
1006f5736e95SDavid du Colombier
1007*25b329d5SDavid du Colombier fail(pEvent == NULL);
1008*25b329d5SDavid du Colombier fail(pEvent->type != event_KEY);
1009*25b329d5SDavid du Colombier fail(pvReference == NULL);
1010f5736e95SDavid du Colombier
1011*25b329d5SDavid du Colombier pCaret = &pEvent->data.key.caret;
1012*25b329d5SDavid du Colombier pDiag = (diagram_type *)pvReference;
1013f5736e95SDavid du Colombier
1014*25b329d5SDavid du Colombier fail(pEvent->data.key.caret.window != pDiag->tScaleWindow);
1015*25b329d5SDavid du Colombier
1016*25b329d5SDavid du Colombier DBG_DEC_C(pCaret->icon != SCALE_SCALE_WRITEABLE, pCaret->icon);
1017*25b329d5SDavid du Colombier DBG_DEC_C(pCaret->icon == SCALE_SCALE_WRITEABLE, pEvent->data.key.code);
1018*25b329d5SDavid du Colombier
1019*25b329d5SDavid du Colombier if (pEvent->data.key.code != '\r' ||
1020*25b329d5SDavid du Colombier pCaret->icon != SCALE_SCALE_WRITEABLE) {
1021*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_ProcessKey(pEvent->data.key.code));
1022*25b329d5SDavid du Colombier return TRUE;
1023f5736e95SDavid du Colombier }
1024f5736e95SDavid du Colombier
1025*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_GetIconState(pCaret->window, pCaret->icon, &tIcon));
1026*25b329d5SDavid du Colombier if (!tIcon.flags.data.text || !tIcon.flags.data.indirected) {
1027*25b329d5SDavid du Colombier werr(1, "Icon %d must be indirected text", (int)pCaret->icon);
1028f5736e95SDavid du Colombier }
1029f5736e95SDavid du Colombier iTmp = (int)strtol(tIcon.data.indirecttext.buffer, &pcChar, 10);
1030f5736e95SDavid du Colombier if (*pcChar != '\0' && *pcChar != '\r') {
1031f5736e95SDavid du Colombier DBG_DEC(*pcChar);
1032f5736e95SDavid du Colombier } else if (iTmp < MIN_SCALE_FACTOR) {
1033f5736e95SDavid du Colombier pDiag->iScaleFactorTemp = MIN_SCALE_FACTOR;
1034f5736e95SDavid du Colombier } else if (iTmp > MAX_SCALE_FACTOR) {
1035f5736e95SDavid du Colombier pDiag->iScaleFactorTemp = MAX_SCALE_FACTOR;
1036f5736e95SDavid du Colombier } else {
1037f5736e95SDavid du Colombier pDiag->iScaleFactorTemp = iTmp;
1038f5736e95SDavid du Colombier }
1039f5736e95SDavid du Colombier pDiag->iScaleFactorCurr = pDiag->iScaleFactorTemp;
1040f5736e95SDavid du Colombier /* Close the scale window */
1041*25b329d5SDavid du Colombier Error_CheckFatal(Wimp_CloseWindow(pCaret->window));
1042f5736e95SDavid du Colombier /* Redraw the main window */
1043f5736e95SDavid du Colombier vSetTitle(pDiag);
1044f5736e95SDavid du Colombier vForceRedraw(pDiag);
1045*25b329d5SDavid du Colombier return TRUE;
1046*25b329d5SDavid du Colombier } /* end of bScaleKeyPressed */
1047f5736e95SDavid du Colombier
1048