00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <stdlib.h>
00010 #include <ctype.h>
00011 #include <string.h>
00012 #include "DeskLib:KeyCodes.h"
00013 #include "DeskLib:Error.h"
00014 #include "DeskLib:Menu.h"
00015 #include "DeskLib:Template.h"
00016 #include "DeskLib:Window.h"
00017 #include "DeskLib:EventMsg.h"
00018 #include "flexlib:flex.h"
00019 #include "drawfile.h"
00020 #include "antiword.h"
00021
00022
00023 #define WORKAREA_EXTENSION 5
00024
00025 #define INITIAL_SIZE 32768
00026 #define EXTENSION_SIZE 4096
00027
00028 #define WINDOW_TITLE_LEN 28
00029 #define FILENAME_TITLE_LEN (WINDOW_TITLE_LEN - 10)
00030
00031
00032 #if !defined(__GNUC__)
00033 int
00034 flex_alloc(flex_ptr anchor, int n)
00035 {
00036 void *pvTmp;
00037
00038 TRACE_MSG("flex_alloc");
00039
00040 if (anchor == NULL || n < 0) {
00041 return 0;
00042 }
00043 if (n == 0) {
00044 n = 1;
00045 }
00046 pvTmp = malloc(n);
00047 if (pvTmp == NULL) {
00048 return 0;
00049 }
00050 *anchor = pvTmp;
00051 return 1;
00052 }
00053
00054 void
00055 flex_free(flex_ptr anchor)
00056 {
00057 TRACE_MSG("flex_free");
00058
00059 if (anchor == NULL || *anchor == NULL) {
00060 return;
00061 }
00062 free(*anchor);
00063 *anchor = NULL;
00064 }
00065
00066 int
00067 flex_extend(flex_ptr anchor, int newsize)
00068 {
00069 void *pvTmp;
00070
00071 TRACE_MSG("flex_extend");
00072
00073 if (anchor == NULL || newsize < 0) {
00074 return 0;
00075 }
00076 if (newsize == 0) {
00077 newsize = 1;
00078 }
00079 pvTmp = realloc(*anchor, newsize);
00080 if (pvTmp == NULL) {
00081 return 0;
00082 }
00083 *anchor = pvTmp;
00084 return 1;
00085 }
00086 #endif
00087
00088
00089
00090
00091
00092
00093 static window_handle
00094 tCreateMainWindow(void)
00095 {
00096 window_handle tMainWindow;
00097
00098 TRACE_MSG("tCreateMainWindow");
00099
00100 tMainWindow = Window_Create("MainWindow", template_TITLEMIN);
00101 if (tMainWindow == 0) {
00102 werr(1, "I can't find the 'MainWindow' template");
00103 }
00104 return tMainWindow;
00105 }
00106
00107
00108
00109
00110
00111
00112 static window_handle
00113 tCreateScaleWindow(void)
00114 {
00115 window_handle tScaleWindow;
00116
00117 TRACE_MSG("tCreateScaleWindow");
00118
00119 tScaleWindow = Window_Create("ScaleView", template_TITLEMIN);
00120 if (tScaleWindow == 0) {
00121 werr(1, "I can't find the 'ScaleView' template");
00122 }
00123 return tScaleWindow;
00124 }
00125
00126
00127
00128
00129
00130
00131 diagram_type *
00132 pCreateDiagram(const char *szTask, const char *szFilename)
00133 {
00134 diagram_type *pDiag;
00135 options_type tOptions;
00136 window_handle tMainWindow, tScaleWindow;
00137 wimp_box tBox;
00138
00139 TRACE_MSG("pCreateDiagram");
00140
00141 fail(szTask == NULL || szTask[0] == '\0');
00142
00143
00144 tMainWindow = tCreateMainWindow();
00145
00146
00147 tScaleWindow = tCreateScaleWindow();
00148
00149
00150 pDiag = xmalloc(sizeof(diagram_type));
00151 if (flex_alloc((flex_ptr)&pDiag->tInfo.data, INITIAL_SIZE) != 1) {
00152 werr(1, "Memory allocation failed, unable to continue");
00153 }
00154
00155
00156 vGetOptions(&tOptions);
00157 pDiag->tMainWindow = tMainWindow;
00158 pDiag->tScaleWindow = tScaleWindow;
00159 pDiag->iScaleFactorCurr = tOptions.iScaleFactor;
00160 pDiag->iScaleFactorTemp = tOptions.iScaleFactor;
00161 pDiag->tMemorySize = INITIAL_SIZE;
00162 tBox.min.x = 0;
00163 tBox.min.y = -(Drawfile_ScreenToDraw(32 + 3) * 8 + 1);
00164 tBox.max.x = Drawfile_ScreenToDraw(16) * MIN_SCREEN_WIDTH + 1;
00165 tBox.max.y = 0;
00166 Error_CheckFatal(Drawfile_CreateDiagram(&pDiag->tInfo,
00167 pDiag->tMemorySize, szTask, tBox));
00168 DBG_DEC(pDiag->tInfo.length);
00169 pDiag->lXleft = 0;
00170 pDiag->lYtop = 0;
00171 strncpy(pDiag->szFilename,
00172 szBasename(szFilename), sizeof(pDiag->szFilename) - 1);
00173 pDiag->szFilename[sizeof(pDiag->szFilename) - 1] = '\0';
00174
00175 return pDiag;
00176 }
00177
00178
00179
00180
00181 BOOL
00182 bDestroyDiagram(event_pollblock *pEvent, void *pvReference)
00183 {
00184 diagram_type *pDiag;
00185 window_handle tWindow;
00186
00187 TRACE_MSG("bDestroyDiagram");
00188
00189 fail(pEvent == NULL);
00190 fail(pvReference == NULL);
00191
00192 if (pEvent == NULL || pvReference == NULL) {
00193 return FALSE;
00194 }
00195
00196 pDiag = (diagram_type *)pvReference;
00197
00198 switch (pEvent->type) {
00199 case event_CLOSE:
00200 tWindow = pEvent->data.openblock.window;
00201 break;
00202 case event_KEY:
00203 tWindow = pEvent->data.key.caret.window;
00204 break;
00205 default:
00206 DBG_DEC(pEvent->type);
00207 return FALSE;
00208 }
00209 if (tWindow != pDiag->tMainWindow) {
00210 return FALSE;
00211 }
00212
00213
00214 Window_Delete(pDiag->tMainWindow);
00215 pDiag->tMainWindow = 0;
00216
00217
00218 Window_Delete(pDiag->tScaleWindow);
00219 pDiag->tScaleWindow = 0;
00220
00221 #if defined(__GNUC__)
00222
00223
00224
00225
00226 while (EventMsg_ReleaseSpecific(message_MENUWARNING, window_ANY,
00227 bSaveTextfile, pDiag))
00228 ;
00229 while (EventMsg_ReleaseSpecific(message_MENUWARNING, window_ANY,
00230 bSaveDrawfile, pDiag))
00231 ;
00232 while (EventMsg_ReleaseSpecific(message_MENUWARNING, window_ANY,
00233 bScaleOpenAction, pDiag))
00234 ;
00235 #endif
00236
00237
00238 if (pDiag->tInfo.data != NULL && pDiag->tMemorySize != 0) {
00239 flex_free((flex_ptr)&pDiag->tInfo.data);
00240 }
00241
00242 pDiag->tInfo.data = NULL;
00243 pDiag->tInfo.length = 0;
00244 pDiag->tMemorySize = 0;
00245
00246
00247 pDiag = xfree(pDiag);
00248 return TRUE;
00249 }
00250
00251
00252
00253
00254 static void
00255 vExtendDiagramSize(diagram_type *pDiag, size_t tSize)
00256 {
00257 TRACE_MSG("vExtendDiagramSize");
00258
00259 fail(pDiag == NULL || tSize % 4 != 0);
00260
00261 while (pDiag->tInfo.length + tSize > pDiag->tMemorySize) {
00262 if (flex_extend((flex_ptr)&pDiag->tInfo.data,
00263 pDiag->tMemorySize + EXTENSION_SIZE) != 1) {
00264 werr(1, "Memory extend failed, unable to continue");
00265 }
00266 pDiag->tMemorySize += EXTENSION_SIZE;
00267 NO_DBG_DEC(pDiag->tMemorySize);
00268 }
00269 TRACE_MSG("end of vExtendDiagramSize");
00270 }
00271
00272
00273
00274
00275 void
00276 vPrologue2(diagram_type *pDiag, int iWordVersion)
00277 {
00278 drawfile_object *pNew;
00279 const font_table_type *pTmp;
00280 char *pcTmp;
00281 size_t tRealSize, tSize;
00282 int iCount;
00283
00284 TRACE_MSG("vPrologue2");
00285
00286 fail(pDiag == NULL);
00287
00288 if (tGetFontTableLength() == 0) {
00289 return;
00290 }
00291 tRealSize = offsetof(drawfile_object, data);
00292 pTmp = NULL;
00293 while ((pTmp = pGetNextFontTableRecord(pTmp)) != NULL) {
00294 tRealSize += 2 + strlen(pTmp->szOurFontname);
00295 }
00296 DBG_DEC(tRealSize);
00297 tSize = ROUND4(tRealSize);
00298 vExtendDiagramSize(pDiag, tSize);
00299 pNew = xmalloc(tSize);
00300 memset(pNew, 0, tSize);
00301 pNew->type = drawfile_TYPE_FONT_TABLE;
00302 pNew->size = tSize;
00303 pcTmp = (char *)&pNew->data.font_table.font_def[0].font_ref;
00304 iCount = 0;
00305 pTmp = NULL;
00306 while ((pTmp = pGetNextFontTableRecord(pTmp)) != NULL) {
00307 *pcTmp = ++iCount;
00308 pcTmp++;
00309 strcpy(pcTmp, pTmp->szOurFontname);
00310 pcTmp += 1 + strlen(pTmp->szOurFontname);
00311 }
00312 Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo,
00313 pDiag->tMemorySize, pNew, TRUE));
00314 pNew = xfree(pNew);
00315 }
00316
00317
00318
00319
00320 void
00321 vSubstring2Diagram(diagram_type *pDiag,
00322 char *szString, size_t tStringLength, long lStringWidth,
00323 UCHAR ucFontColor, USHORT usFontstyle, drawfile_fontref tFontRef,
00324 USHORT usFontSize, USHORT usMaxFontSize)
00325 {
00326 drawfile_object *pNew;
00327 long lSizeX, lSizeY, lOffset, l20, lYMove;
00328 size_t tRealSize, tSize;
00329
00330 TRACE_MSG("vSubstring2Diagram");
00331
00332 fail(pDiag == NULL || szString == NULL);
00333 fail(pDiag->lXleft < 0);
00334 fail(tStringLength != strlen(szString));
00335 fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
00336 fail(usMaxFontSize < MIN_FONT_SIZE || usMaxFontSize > MAX_FONT_SIZE);
00337 fail(usFontSize > usMaxFontSize);
00338
00339 if (szString[0] == '\0' || tStringLength == 0) {
00340 return;
00341 }
00342
00343 if (tFontRef == 0) {
00344 lOffset = Drawfile_ScreenToDraw(2);
00345 l20 = Drawfile_ScreenToDraw(32 + 3);
00346 lSizeX = Drawfile_ScreenToDraw(16);
00347 lSizeY = Drawfile_ScreenToDraw(32);
00348 } else {
00349 lOffset = lToBaseLine(usMaxFontSize);
00350 l20 = lWord2DrawUnits20(usMaxFontSize);
00351 lSizeX = lWord2DrawUnits00(usFontSize);
00352 lSizeY = lWord2DrawUnits00(usFontSize);
00353 }
00354
00355 lYMove = 0;
00356
00357
00358 if (bIsSuperscript(usFontstyle)) {
00359 lYMove = lMilliPoints2DrawUnits((((long)usFontSize + 1) / 2) * 375);
00360 }
00361
00362 if (bIsSubscript(usFontstyle)) {
00363 lYMove = -lMilliPoints2DrawUnits((long)usFontSize * 125);
00364 }
00365
00366 tRealSize = offsetof(drawfile_object, data);
00367 tRealSize += sizeof(drawfile_text) + tStringLength;
00368 tSize = ROUND4(tRealSize);
00369 vExtendDiagramSize(pDiag, tSize);
00370 pNew = xmalloc(tSize);
00371 memset(pNew, 0, tSize);
00372 pNew->type = drawfile_TYPE_TEXT;
00373 pNew->size = tSize;
00374 pNew->data.text.bbox.min.x = (int)pDiag->lXleft;
00375 pNew->data.text.bbox.min.y = (int)(pDiag->lYtop + lYMove);
00376 pNew->data.text.bbox.max.x = (int)(pDiag->lXleft + lStringWidth);
00377 pNew->data.text.bbox.max.y = (int)(pDiag->lYtop + l20 + lYMove);
00378 pNew->data.text.fill.value = (int)ulColor2Color(ucFontColor);
00379 pNew->data.text.bg_hint.value = 0xffffff00;
00380 pNew->data.text.style.font_ref = tFontRef;
00381 pNew->data.text.style.reserved[0] = 0;
00382 pNew->data.text.style.reserved[1] = 0;
00383 pNew->data.text.style.reserved[2] = 0;
00384 pNew->data.text.xsize = (int)lSizeX;
00385 pNew->data.text.ysize = (int)lSizeY;
00386 pNew->data.text.base.x = (int)pDiag->lXleft;
00387 pNew->data.text.base.y = (int)(pDiag->lYtop + lOffset + lYMove);
00388 strncpy(pNew->data.text.text, szString, tStringLength);
00389 pNew->data.text.text[tStringLength] = '\0';
00390 Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo,
00391 pDiag->tMemorySize, pNew, TRUE));
00392 pNew = xfree(pNew);
00393
00394 pDiag->lXleft += lStringWidth;
00395 TRACE_MSG("leaving vSubstring2Diagram");
00396 }
00397
00398
00399
00400
00401 void
00402 vImage2Diagram(diagram_type *pDiag, const imagedata_type *pImg,
00403 UCHAR *pucImage, size_t tImageSize)
00404 {
00405 drawfile_object *pNew;
00406 long lWidth, lHeight;
00407 size_t tRealSize, tSize;
00408
00409 TRACE_MSG("vImage2Diagram");
00410
00411 fail(pDiag == NULL);
00412 fail(pImg == NULL);
00413 fail(pDiag->lXleft < 0);
00414 fail(pImg->eImageType != imagetype_is_dib &&
00415 pImg->eImageType != imagetype_is_jpeg);
00416
00417 DBG_DEC_C(pDiag->lXleft != 0, pDiag->lXleft);
00418
00419 lWidth = lPoints2DrawUnits(pImg->iHorSizeScaled);
00420 lHeight = lPoints2DrawUnits(pImg->iVerSizeScaled);
00421 DBG_DEC(lWidth);
00422 DBG_DEC(lHeight);
00423
00424 pDiag->lYtop -= lHeight;
00425
00426 tRealSize = offsetof(drawfile_object, data);
00427 switch (pImg->eImageType) {
00428 case imagetype_is_dib:
00429 tRealSize += sizeof(drawfile_sprite) + tImageSize;
00430 tSize = ROUND4(tRealSize);
00431 vExtendDiagramSize(pDiag, tSize);
00432 pNew = xmalloc(tSize);
00433 memset(pNew, 0, tSize);
00434 pNew->type = drawfile_TYPE_SPRITE;
00435 pNew->size = tSize;
00436 pNew->data.sprite.bbox.min.x = (int)pDiag->lXleft;
00437 pNew->data.sprite.bbox.min.y = (int)pDiag->lYtop;
00438 pNew->data.sprite.bbox.max.x = (int)(pDiag->lXleft + lWidth);
00439 pNew->data.sprite.bbox.max.y = (int)(pDiag->lYtop + lHeight);
00440 memcpy(&pNew->data.sprite.header, pucImage, tImageSize);
00441 break;
00442 case imagetype_is_jpeg:
00443 #if defined(DEBUG)
00444 (void)bGetJpegInfo(pucImage, tImageSize);
00445 #endif
00446 tRealSize += sizeof(drawfile_jpeg) + tImageSize;
00447 tSize = ROUND4(tRealSize);
00448 vExtendDiagramSize(pDiag, tSize);
00449 pNew = xmalloc(tSize);
00450 memset(pNew, 0, tSize);
00451 pNew->type = drawfile_TYPE_JPEG;
00452 pNew->size = tSize;
00453 pNew->data.jpeg.bbox.min.x = (int)pDiag->lXleft;
00454 pNew->data.jpeg.bbox.min.y = (int)pDiag->lYtop;
00455 pNew->data.jpeg.bbox.max.x = (int)(pDiag->lXleft + lWidth);
00456 pNew->data.jpeg.bbox.max.y = (int)(pDiag->lYtop + lHeight);
00457 pNew->data.jpeg.width = (int)lWidth;
00458 pNew->data.jpeg.height = (int)lHeight;
00459 pNew->data.jpeg.xdpi = 90;
00460 pNew->data.jpeg.ydpi = 90;
00461 pNew->data.jpeg.trfm.entries[0][0] = 0x10000;
00462 pNew->data.jpeg.trfm.entries[0][1] = 0;
00463 pNew->data.jpeg.trfm.entries[1][0] = 0;
00464 pNew->data.jpeg.trfm.entries[1][1] = 0x10000;
00465 pNew->data.jpeg.trfm.entries[2][0] = (int)pDiag->lXleft;
00466 pNew->data.jpeg.trfm.entries[2][1] = (int)pDiag->lYtop;
00467 pNew->data.jpeg.len = tImageSize;
00468 memcpy(pNew->data.jpeg.data, pucImage, tImageSize);
00469 break;
00470 default:
00471 DBG_DEC(pImg->eImageType);
00472 pNew = NULL;
00473 break;
00474 }
00475
00476 Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo,
00477 pDiag->tMemorySize, pNew, TRUE));
00478 pNew = xfree(pNew);
00479 pDiag->lXleft = 0;
00480 }
00481
00482
00483
00484
00485
00486
00487 BOOL
00488 bAddDummyImage(diagram_type *pDiag, const imagedata_type *pImg)
00489 {
00490 drawfile_object *pNew;
00491 int *piTmp;
00492 long lWidth, lHeight;
00493 size_t tRealSize, tSize;
00494
00495 TRACE_MSG("bAddDummyImage");
00496
00497 fail(pDiag == NULL);
00498 fail(pImg == NULL);
00499 fail(pDiag->lXleft < 0);
00500
00501 if (pImg->iVerSizeScaled <= 0 || pImg->iHorSizeScaled <= 0) {
00502 return FALSE;
00503 }
00504
00505 DBG_DEC_C(pDiag->lXleft != 0, pDiag->lXleft);
00506
00507 lWidth = lPoints2DrawUnits(pImg->iHorSizeScaled);
00508 lHeight = lPoints2DrawUnits(pImg->iVerSizeScaled);
00509
00510 pDiag->lYtop -= lHeight;
00511
00512 tRealSize = offsetof(drawfile_object, data);
00513 tRealSize += sizeof(drawfile_path) + (14 - 1) * sizeof(int);
00514 tSize = ROUND4(tRealSize);
00515 vExtendDiagramSize(pDiag, tSize);
00516 pNew = xmalloc(tSize);
00517 memset(pNew, 0, tSize);
00518 pNew->type = drawfile_TYPE_PATH;
00519 pNew->size = tSize;
00520 pNew->data.path.bbox.min.x = (int)pDiag->lXleft;
00521 pNew->data.path.bbox.min.y = (int)pDiag->lYtop;
00522 pNew->data.path.bbox.max.x = (int)(pDiag->lXleft + lWidth);
00523 pNew->data.path.bbox.max.y = (int)(pDiag->lYtop + lHeight);
00524 pNew->data.path.fill.value = -1;
00525 pNew->data.path.outline.value = 0x4d4d4d00;
00526 pNew->data.path.width = (int)lMilliPoints2DrawUnits(500);
00527 pNew->data.path.style.flags = 0;
00528 pNew->data.path.style.reserved = 0;
00529 pNew->data.path.style.cap_width = 0;
00530 pNew->data.path.style.cap_length = 0;
00531 piTmp = pNew->data.path.path;
00532 *piTmp++ = drawfile_PATH_MOVE_TO;
00533 *piTmp++ = pNew->data.path.bbox.min.x;
00534 *piTmp++ = pNew->data.path.bbox.min.y;
00535 *piTmp++ = drawfile_PATH_LINE_TO;
00536 *piTmp++ = pNew->data.path.bbox.min.x;
00537 *piTmp++ = pNew->data.path.bbox.max.y;
00538 *piTmp++ = drawfile_PATH_LINE_TO;
00539 *piTmp++ = pNew->data.path.bbox.max.x;
00540 *piTmp++ = pNew->data.path.bbox.max.y;
00541 *piTmp++ = drawfile_PATH_LINE_TO;
00542 *piTmp++ = pNew->data.path.bbox.max.x;
00543 *piTmp++ = pNew->data.path.bbox.min.y;
00544 *piTmp++ = drawfile_PATH_CLOSE_LINE;
00545 *piTmp++ = drawfile_PATH_END_PATH;
00546
00547 Error_CheckFatal(Drawfile_AppendObject(&pDiag->tInfo,
00548 pDiag->tMemorySize, pNew, TRUE));
00549 pNew = xfree(pNew);
00550 pDiag->lXleft = 0;
00551 return TRUE;
00552 }
00553
00554
00555
00556
00557 void
00558 vMove2NextLine(diagram_type *pDiag, drawfile_fontref tFontRef,
00559 USHORT usFontSize)
00560 {
00561 long l20;
00562
00563 TRACE_MSG("vMove2NextLine");
00564
00565 fail(pDiag == NULL);
00566 fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
00567
00568 if (tFontRef == 0) {
00569 l20 = Drawfile_ScreenToDraw(32 + 3);
00570 } else {
00571 l20 = lWord2DrawUnits20(usFontSize);
00572 }
00573 pDiag->lYtop -= l20;
00574 }
00575
00576
00577
00578
00579 void
00580 vStartOfParagraph1(diagram_type *pDiag, long lBeforeIndentation)
00581 {
00582 TRACE_MSG("vStartOfParagraph1");
00583
00584 fail(pDiag == NULL);
00585 fail(lBeforeIndentation < 0);
00586
00587 pDiag->lXleft = 0;
00588 pDiag->lYtop -= lMilliPoints2DrawUnits(lBeforeIndentation);
00589 }
00590
00591
00592
00593
00594
00595 void
00596 vStartOfParagraph2(diagram_type *pDiag)
00597 {
00598 TRACE_MSG("vStartOfParagraph2");
00599 }
00600
00601
00602
00603
00604 void
00605 vEndOfParagraph(diagram_type *pDiag,
00606 drawfile_fontref tFontRef, USHORT usFontSize, long lAfterIndentation)
00607 {
00608 TRACE_MSG("vEndOfParagraph");
00609
00610 fail(pDiag == NULL);
00611 fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
00612 fail(lAfterIndentation < 0);
00613
00614 pDiag->lXleft = 0;
00615 pDiag->lYtop -= lMilliPoints2DrawUnits(lAfterIndentation);
00616 }
00617
00618
00619
00620
00621 void
00622 vEndOfPage(diagram_type *pDiag, long lAfterIndentation, BOOL bNewSection)
00623 {
00624 TRACE_MSG("vEndOfPage");
00625
00626 fail(pDiag == NULL);
00627 fail(lAfterIndentation < 0);
00628
00629 pDiag->lXleft = 0;
00630 pDiag->lYtop -= lMilliPoints2DrawUnits(lAfterIndentation);
00631 }
00632
00633
00634
00635
00636
00637 void
00638 vSetHeaders(diagram_type *pDiag, USHORT usIstd)
00639 {
00640 TRACE_MSG("vSetHeaders");
00641 }
00642
00643
00644
00645
00646
00647 void
00648 vStartOfList(diagram_type *pDiag, UCHAR ucNFC, BOOL bIsEndOfTable)
00649 {
00650 TRACE_MSG("vStartOfList");
00651 }
00652
00653
00654
00655
00656
00657 void
00658 vEndOfList(diagram_type *pDiag)
00659 {
00660 TRACE_MSG("vEndOfList");
00661 }
00662
00663
00664
00665
00666
00667 void
00668 vStartOfListItem(diagram_type *pDiag, BOOL bNoMarks)
00669 {
00670 TRACE_MSG("vStartOfListItem");
00671 }
00672
00673
00674
00675
00676
00677 void
00678 vEndOfTable(diagram_type *pDiag)
00679 {
00680 TRACE_MSG("vEndOfTable");
00681 }
00682
00683
00684
00685
00686
00687
00688
00689 BOOL
00690 bAddTableRow(diagram_type *pDiag, char **aszColTxt,
00691 int iNbrOfColumns, const short *asColumnWidth, UCHAR ucBorderInfo)
00692 {
00693 TRACE_MSG("bAddTableRow");
00694
00695 return FALSE;
00696 }
00697
00698
00699
00700
00701 static void
00702 vForceRedraw(diagram_type *pDiag)
00703 {
00704 window_state tWindowState;
00705 window_redrawblock tRedraw;
00706 int x0, y0, x1, y1;
00707
00708 TRACE_MSG("vForceRedraw");
00709
00710 fail(pDiag == NULL);
00711
00712 DBG_DEC(pDiag->iScaleFactorCurr);
00713
00714
00715 Drawfile_QueryBox(&pDiag->tInfo, &tRedraw.rect, TRUE);
00716
00717 x0 = tRedraw.rect.min.x * pDiag->iScaleFactorCurr / 100 - 1;
00718 y0 = tRedraw.rect.min.y * pDiag->iScaleFactorCurr / 100 - 1;
00719 x1 = tRedraw.rect.max.x * pDiag->iScaleFactorCurr / 100 + 1;
00720 y1 = tRedraw.rect.max.y * pDiag->iScaleFactorCurr / 100 + 1;
00721
00722 x0 -= WORKAREA_EXTENSION;
00723 y0 -= WORKAREA_EXTENSION;
00724 x1 += WORKAREA_EXTENSION;
00725 y1 += WORKAREA_EXTENSION;
00726 Window_SetExtent(pDiag->tMainWindow, x0, y0, x1, y1);
00727
00728 x0 -= 5;
00729 y0 -= 5;
00730 x1 += 5;
00731 y1 += 5;
00732
00733 Window_ForceRedraw(pDiag->tMainWindow, x0, y0, x1, y1);
00734
00735 Error_CheckFatal(Wimp_GetWindowState(pDiag->tMainWindow, &tWindowState));
00736 tWindowState.openblock.behind = -1;
00737 Error_CheckFatal(Wimp_OpenWindow(&tWindowState.openblock));
00738 }
00739
00740
00741
00742
00743 void
00744 vShowDiagram(diagram_type *pDiag)
00745 {
00746 wimp_box tRect;
00747 int x0, y0, x1, y1;
00748
00749 TRACE_MSG("vShowDiagram");
00750
00751 fail(pDiag == NULL);
00752
00753 Window_Show(pDiag->tMainWindow, open_NEARLAST);
00754 Drawfile_QueryBox(&pDiag->tInfo, &tRect, TRUE);
00755
00756 x0 = tRect.min.x - WORKAREA_EXTENSION;
00757 y0 = tRect.min.y - WORKAREA_EXTENSION;
00758 x1 = tRect.max.x + WORKAREA_EXTENSION;
00759 y1 = tRect.max.y + WORKAREA_EXTENSION;
00760 Window_SetExtent(pDiag->tMainWindow, x0, y0, x1, y1);
00761 vForceRedraw(pDiag);
00762 }
00763
00764
00765
00766
00767 void
00768 vMainButtonClick(mouse_block *pMouse)
00769 {
00770 caret_block tCaret;
00771 window_state ws;
00772
00773 TRACE_MSG("vMainButtonClick");
00774
00775 fail(pMouse == NULL);
00776
00777 DBG_DEC(pMouse->button.data.select);
00778 DBG_DEC(pMouse->button.data.adjust);
00779 DBG_DEC(pMouse->window);
00780 DBG_DEC(pMouse->icon);
00781
00782 if (pMouse->window >= 0 &&
00783 pMouse->icon == -1 &&
00784 (pMouse->button.data.select || pMouse->button.data.adjust)) {
00785
00786 Error_CheckFatal(Wimp_GetWindowState(pMouse->window, &ws));
00787 tCaret.window = pMouse->window;
00788 tCaret.icon = -1;
00789 tCaret.offset.x = pMouse->pos.x - ws.openblock.screenrect.min.x;
00790 tCaret.offset.y = pMouse->pos.y - ws.openblock.screenrect.max.y;
00791 tCaret.height = (int)BIT(25);
00792 tCaret.index = 0;
00793 Error_CheckFatal(Wimp_SetCaretPosition(&tCaret));
00794 }
00795 }
00796
00797
00798
00799
00800 BOOL
00801 bMainKeyPressed(event_pollblock *pEvent, void *pvReference)
00802 {
00803 diagram_type *pDiag;
00804
00805 TRACE_MSG("bMainKeyPressed");
00806
00807 fail(pEvent == NULL);
00808 fail(pEvent->type != event_KEY);
00809 fail(pvReference == NULL);
00810
00811 pDiag = (diagram_type *)pvReference;
00812
00813 fail(pEvent->data.key.caret.window != pDiag->tMainWindow);
00814
00815
00816 switch (pEvent->data.key.code) {
00817 case keycode_CTRL_F2:
00818 bDestroyDiagram(pEvent, pvReference);
00819 break;
00820 case keycode_F3:
00821 bSaveDrawfile(pEvent, pvReference);
00822 break;
00823 case keycode_SHIFT_F3:
00824 bSaveTextfile(pEvent, pvReference);
00825 break;
00826 default:
00827 DBG_DEC(pEvent->data.key.code);
00828 Error_CheckFatal(Wimp_ProcessKey(pEvent->data.key.code));
00829 }
00830 return TRUE;
00831 }
00832
00833
00834
00835
00836 BOOL
00837 bRedrawMainWindow(event_pollblock *pEvent, void *pvReference)
00838 {
00839 window_redrawblock tBlock;
00840 diagram_type *pDiag;
00841 drawfile_info *pInfo;
00842 double dScaleFactor;
00843 BOOL bMore;
00844
00845 TRACE_MSG("bRedrawMainWindow");
00846
00847 fail(pEvent == NULL);
00848 fail(pEvent->type != event_REDRAW);
00849 fail(pvReference == NULL);
00850
00851 pDiag = (diagram_type *)pvReference;
00852
00853 fail(pDiag->tMainWindow != pEvent->data.openblock.window);
00854 fail(pDiag->iScaleFactorCurr < MIN_SCALE_FACTOR);
00855 fail(pDiag->iScaleFactorCurr > MAX_SCALE_FACTOR);
00856
00857 dScaleFactor = (double)pDiag->iScaleFactorCurr / 100.0;
00858 pInfo = &pDiag->tInfo;
00859
00860 tBlock.window = pEvent->data.openblock.window;
00861 Error_CheckFatal(Wimp_RedrawWindow(&tBlock, &bMore));
00862
00863
00864 while (bMore) {
00865 if (pInfo->data != NULL && pInfo->length != 0) {
00866 Error_CheckFatal(Drawfile_RenderDiagram(pInfo,
00867 &tBlock, dScaleFactor));
00868 }
00869 Error_CheckFatal(Wimp_GetRectangle(&tBlock, &bMore));
00870 }
00871 return TRUE;
00872 }
00873
00874
00875
00876
00877 BOOL
00878 bScaleOpenAction(event_pollblock *pEvent, void *pvReference)
00879 {
00880 window_state tWindowState;
00881 diagram_type *pDiag;
00882
00883 TRACE_MSG("bScaleOpenAction");
00884
00885 fail(pEvent == NULL);
00886 fail(pEvent->type != event_SEND);
00887 fail(pEvent->data.message.header.action != message_MENUWARN);
00888 fail(pvReference == NULL);
00889
00890 pDiag = (diagram_type *)pvReference;
00891
00892 if (menu_currentopen != pDiag->pSaveMenu ||
00893 pEvent->data.message.data.menuwarn.selection[0] != SAVEMENU_SCALEVIEW) {
00894 return FALSE;
00895 }
00896
00897 Error_CheckFatal(Wimp_GetWindowState(pDiag->tScaleWindow,
00898 &tWindowState));
00899 if (tWindowState.flags.data.open) {
00900
00901 return TRUE;
00902 }
00903
00904 DBG_MSG("vScaleOpenAction for real");
00905
00906 pDiag->iScaleFactorTemp = pDiag->iScaleFactorCurr;
00907 vUpdateWriteableNumber(pDiag->tScaleWindow,
00908 SCALE_SCALE_WRITEABLE, pDiag->iScaleFactorTemp);
00909 Window_Show(pDiag->tScaleWindow, open_UNDERPOINTER);
00910 return TRUE;
00911 }
00912
00913
00914
00915
00916 void
00917 vSetTitle(diagram_type *pDiag)
00918 {
00919 char szTitle[WINDOW_TITLE_LEN];
00920
00921 TRACE_MSG("vSetTitle");
00922
00923 fail(pDiag == NULL);
00924 fail(pDiag->szFilename[0] == '\0');
00925
00926 (void)sprintf(szTitle, "%.*s at %d%%",
00927 FILENAME_TITLE_LEN,
00928 pDiag->szFilename,
00929 pDiag->iScaleFactorCurr % 1000);
00930 if (strlen(pDiag->szFilename) > FILENAME_TITLE_LEN) {
00931 szTitle[FILENAME_TITLE_LEN - 1] = OUR_ELLIPSIS;
00932 }
00933
00934 Window_SetTitle(pDiag->tMainWindow, szTitle);
00935 }
00936
00937
00938
00939
00940 void
00941 vScaleButtonClick(mouse_block *pMouse, diagram_type *pDiag)
00942 {
00943 BOOL bCloseWindow, bRedraw;
00944
00945 TRACE_MSG("vScaleButtonClick");
00946
00947 fail(pMouse == NULL || pDiag == NULL);
00948 fail(pMouse->window != pDiag->tScaleWindow);
00949
00950 bCloseWindow = FALSE;
00951 bRedraw = FALSE;
00952 switch (pMouse->icon) {
00953 case SCALE_CANCEL_BUTTON:
00954 bCloseWindow = TRUE;
00955 pDiag->iScaleFactorTemp = pDiag->iScaleFactorCurr;
00956 break;
00957 case SCALE_SCALE_BUTTON:
00958 bCloseWindow = TRUE;
00959 bRedraw = pDiag->iScaleFactorCurr != pDiag->iScaleFactorTemp;
00960 pDiag->iScaleFactorCurr = pDiag->iScaleFactorTemp;
00961 break;
00962 case SCALE_50_PCT:
00963 pDiag->iScaleFactorTemp = 50;
00964 break;
00965 case SCALE_75_PCT:
00966 pDiag->iScaleFactorTemp = 75;
00967 break;
00968 case SCALE_100_PCT:
00969 pDiag->iScaleFactorTemp = 100;
00970 break;
00971 case SCALE_150_PCT:
00972 pDiag->iScaleFactorTemp = 150;
00973 break;
00974 default:
00975 DBG_DEC(pMouse->icon);
00976 break;
00977 }
00978 if (bCloseWindow) {
00979
00980 Error_CheckFatal(Wimp_CloseWindow(pMouse->window));
00981 if (bRedraw) {
00982
00983 vSetTitle(pDiag);
00984 vForceRedraw(pDiag);
00985 }
00986 } else {
00987 vUpdateWriteableNumber(pMouse->window,
00988 SCALE_SCALE_WRITEABLE,
00989 pDiag->iScaleFactorTemp);
00990 }
00991 }
00992
00993
00994
00995
00996 BOOL
00997 bScaleKeyPressed(event_pollblock *pEvent, void *pvReference)
00998 {
00999 icon_block tIcon;
01000 diagram_type *pDiag;
01001 caret_block *pCaret;
01002 char *pcChar;
01003 int iTmp;
01004
01005 TRACE_MSG("bScaleKeyPressed");
01006
01007 fail(pEvent == NULL);
01008 fail(pEvent->type != event_KEY);
01009 fail(pvReference == NULL);
01010
01011 pCaret = &pEvent->data.key.caret;
01012 pDiag = (diagram_type *)pvReference;
01013
01014 fail(pEvent->data.key.caret.window != pDiag->tScaleWindow);
01015
01016 DBG_DEC_C(pCaret->icon != SCALE_SCALE_WRITEABLE, pCaret->icon);
01017 DBG_DEC_C(pCaret->icon == SCALE_SCALE_WRITEABLE, pEvent->data.key.code);
01018
01019 if (pEvent->data.key.code != '\r' ||
01020 pCaret->icon != SCALE_SCALE_WRITEABLE) {
01021 Error_CheckFatal(Wimp_ProcessKey(pEvent->data.key.code));
01022 return TRUE;
01023 }
01024
01025 Error_CheckFatal(Wimp_GetIconState(pCaret->window, pCaret->icon, &tIcon));
01026 if (!tIcon.flags.data.text || !tIcon.flags.data.indirected) {
01027 werr(1, "Icon %d must be indirected text", (int)pCaret->icon);
01028 }
01029 iTmp = (int)strtol(tIcon.data.indirecttext.buffer, &pcChar, 10);
01030 if (*pcChar != '\0' && *pcChar != '\r') {
01031 DBG_DEC(*pcChar);
01032 } else if (iTmp < MIN_SCALE_FACTOR) {
01033 pDiag->iScaleFactorTemp = MIN_SCALE_FACTOR;
01034 } else if (iTmp > MAX_SCALE_FACTOR) {
01035 pDiag->iScaleFactorTemp = MAX_SCALE_FACTOR;
01036 } else {
01037 pDiag->iScaleFactorTemp = iTmp;
01038 }
01039 pDiag->iScaleFactorCurr = pDiag->iScaleFactorTemp;
01040
01041 Error_CheckFatal(Wimp_CloseWindow(pCaret->window));
01042
01043 vSetTitle(pDiag);
01044 vForceRedraw(pDiag);
01045 return TRUE;
01046 }
01047