xref: /plan9/sys/src/cmd/aux/antiword/draw.c (revision 25b329d522281a8cdd35da0dcc08c3fc621059a9)
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