00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <stdio.h>
00010 #include <stdlib.h>
00011 #include <string.h>
00012 #if defined(__riscos)
00013 #include "DeskLib:Error.h"
00014 #include "DeskLib:Wimp.h"
00015 #else
00016 #include <stdlib.h>
00017 #if defined(__dos) || defined(N_PLAT_NLM)
00018 extern int getopt(int, char **, const char *);
00019 #else
00020 #include <unistd.h>
00021 #endif
00022 #endif
00023 #include "antiword.h"
00024
00025 #if defined(__riscos)
00026 #define PARAGRAPH_BREAK "set paragraph_break=%d"
00027 #define AUTOFILETYPE "set autofiletype_allowed=%d"
00028 #define USE_OUTLINEFONTS "set use_outlinefonts=%d"
00029 #define SHOW_IMAGES "set show_images=%d"
00030 #define HIDE_HIDDEN_TEXT "set hide_hidden_text=%d"
00031 #define SCALE_FACTOR_START "set scale_factor_start=%d"
00032 #else
00033 #define LEAFNAME_SIZE (32+1)
00034 #endif
00035
00036
00037 static options_type tOptionsCurr;
00038 #if defined(__riscos)
00039
00040 static options_type tOptionsTemp;
00041 #else
00042 typedef struct papersize_tag {
00043 char szName[16];
00044 USHORT usWidth;
00045 USHORT usHeight;
00046 } papersize_type;
00047
00048 static const papersize_type atPaperSizes[] = {
00049 { "10x14", 720, 1008 },
00050 { "a3", 842, 1191 },
00051 { "a4", 595, 842 },
00052 { "a5", 420, 595 },
00053 { "b4", 729, 1032 },
00054 { "b5", 516, 729 },
00055 { "executive", 540, 720 },
00056 { "folio", 612, 936 },
00057 { "legal", 612, 1008 },
00058 { "letter", 612, 792 },
00059 { "note", 540, 720 },
00060 { "quarto", 610, 780 },
00061 { "statement", 396, 612 },
00062 { "tabloid", 792, 1224 },
00063 { "", 0, 0 },
00064 };
00065 #endif
00066
00067 static const options_type tOptionsDefault = {
00068 DEFAULT_SCREEN_WIDTH,
00069 #if defined(__riscos)
00070 conversion_draw,
00071 #else
00072 conversion_text,
00073 #endif
00074 TRUE,
00075 TRUE,
00076 FALSE,
00077 encoding_latin_1,
00078 INT_MAX,
00079 INT_MAX,
00080 level_default,
00081 #if defined(__riscos)
00082 TRUE,
00083 DEFAULT_SCALE_FACTOR,
00084 #endif
00085 };
00086
00087
00088 #if !defined(__riscos)
00089
00090
00091
00092
00093
00094 static BOOL
00095 bCorrectPapersize(const char *szName, conversion_type eConversionType)
00096 {
00097 const papersize_type *pPaperSize;
00098
00099 for (pPaperSize = atPaperSizes;
00100 pPaperSize->szName[0] != '\0';
00101 pPaperSize++) {
00102 if (!STRCEQ(pPaperSize->szName, szName)) {
00103 continue;
00104 }
00105 DBG_DEC(pPaperSize->usWidth);
00106 DBG_DEC(pPaperSize->usHeight);
00107 tOptionsCurr.eConversionType = eConversionType;
00108 tOptionsCurr.iPageHeight = (int)pPaperSize->usHeight;
00109 tOptionsCurr.iPageWidth = (int)pPaperSize->usWidth;
00110 return TRUE;
00111 }
00112 return FALSE;
00113 }
00114
00115
00116
00117
00118
00119
00120 static const char *
00121 szCreateSuffix(const char *szLeafname)
00122 {
00123 const char *pcDot;
00124
00125 pcDot = strrchr(szLeafname, '.');
00126 if (pcDot != NULL && STRCEQ(pcDot, ".txt")) {
00127
00128 return "";
00129 }
00130 return ".txt";
00131 }
00132
00133
00134
00135
00136 static encoding_type
00137 eMappingFile2Encoding(const char *szLeafname)
00138 {
00139 char szMappingFile[LEAFNAME_SIZE+4];
00140
00141 fail(szLeafname == NULL);
00142
00143 if (strlen(szLeafname) + 4 >= sizeof(szMappingFile)) {
00144 DBG_MSG(szLeafname);
00145 return encoding_latin_1;
00146 }
00147
00148 sprintf(szMappingFile, "%s%s", szLeafname, szCreateSuffix(szLeafname));
00149
00150 DBG_MSG(szMappingFile);
00151
00152 if (STRCEQ(szMappingFile, MAPPING_FILE_UTF_8)) {
00153 return encoding_utf_8;
00154 }
00155 if (STRCEQ(szMappingFile, MAPPING_FILE_CP852) ||
00156 STRCEQ(szMappingFile, MAPPING_FILE_CP1250) ||
00157 STRCEQ(szMappingFile, MAPPING_FILE_8859_2)) {
00158 return encoding_latin_2;
00159 }
00160 if (STRCEQ(szMappingFile, MAPPING_FILE_KOI8_R) ||
00161 STRCEQ(szMappingFile, MAPPING_FILE_KOI8_U) ||
00162 STRCEQ(szMappingFile, MAPPING_FILE_CP866) ||
00163 STRCEQ(szMappingFile, MAPPING_FILE_CP1251) ||
00164 STRCEQ(szMappingFile, MAPPING_FILE_8859_5)) {
00165 return encoding_cyrillic;
00166 }
00167 return encoding_latin_1;
00168 }
00169 #endif
00170
00171
00172
00173
00174
00175
00176 static FILE *
00177 pOpenCharacterMappingFile(const char *szLeafname)
00178 {
00179 #if !defined(__riscos)
00180 FILE *pFile;
00181 const char *szHome, *szAntiword, *szSuffix;
00182 size_t tFilenameLen;
00183 char szMappingFile[PATH_MAX+1];
00184 #endif
00185
00186 if (szLeafname == NULL || szLeafname[0] == '\0') {
00187 return NULL;
00188 }
00189
00190 DBG_MSG(szLeafname);
00191
00192 #if defined(__riscos)
00193 return fopen(szLeafname, "r");
00194 #else
00195
00196 szSuffix = szCreateSuffix(szLeafname);
00197
00198
00199 tFilenameLen = strlen(szLeafname) + strlen(szSuffix);
00200
00201
00202 szAntiword = szGetAntiwordDirectory();
00203 if (szAntiword != NULL && szAntiword[0] != '\0') {
00204 if (strlen(szAntiword) + tFilenameLen <
00205 sizeof(szMappingFile) -
00206 sizeof(FILE_SEPARATOR)) {
00207 sprintf(szMappingFile,
00208 "%s" FILE_SEPARATOR "%s%s",
00209 szAntiword, szLeafname, szSuffix);
00210 DBG_MSG(szMappingFile);
00211 pFile = fopen(szMappingFile, "r");
00212 if (pFile != NULL) {
00213 return pFile;
00214 }
00215 } else {
00216 werr(0, "Environment mappingfilename ignored");
00217 }
00218 }
00219
00220
00221 szHome = szGetHomeDirectory();
00222 if (strlen(szHome) + tFilenameLen <
00223 sizeof(szMappingFile) -
00224 sizeof(ANTIWORD_DIR) -
00225 2 * sizeof(FILE_SEPARATOR)) {
00226 #ifndef SYMBIAN
00227 sprintf(szMappingFile,
00228 "%s%s%s",
00229 szHome, szLeafname, szSuffix);
00230 #else
00231 sprintf(szMappingFile,
00232 "%s%s%s",
00233 szHome, szLeafname, szSuffix);
00234 #endif
00235 DBG_MSG(szMappingFile);
00236 pFile = fopen(szMappingFile, "r");
00237 if (pFile != NULL) {
00238 return pFile;
00239 }
00240 } else {
00241 werr(0, "Local mappingfilename too long, ignored");
00242 }
00243
00244
00245 if (tFilenameLen <
00246 sizeof(szMappingFile) -
00247 sizeof(GLOBAL_ANTIWORD_DIR) -
00248 sizeof(FILE_SEPARATOR)) {
00249 sprintf(szMappingFile,
00250 GLOBAL_ANTIWORD_DIR FILE_SEPARATOR "%s%s",
00251 szLeafname, szSuffix);
00252 DBG_MSG(szMappingFile);
00253 pFile = fopen(szMappingFile, "r");
00254 if (pFile != NULL) {
00255 return pFile;
00256 }
00257 } else {
00258 werr(0, "Global mappingfilename too long, ignored");
00259 }
00260 werr(0, "I can't open your mapping file (%s%s)\n"
00261 "It is not in '%s" FILE_SEPARATOR ANTIWORD_DIR "' nor in '"
00262 GLOBAL_ANTIWORD_DIR "'.", szLeafname, szSuffix, szHome);
00263 return NULL;
00264 #endif
00265 }
00266
00267
00268
00269
00270 static void
00271 vCloseCharacterMappingFile(FILE *pFile)
00272 {
00273 (void)fclose(pFile);
00274 }
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 int
00285 iReadOptions(int argc, char **argv)
00286 {
00287 #if defined(__riscos)
00288 FILE *pFile;
00289 const char *szAlphabet;
00290 int iAlphabet;
00291 char szLine[81];
00292 #else
00293 extern char *optarg;
00294 extern int optind;
00295 char *pcChar, *szTmp;
00296 int iChar;
00297 char szLeafname[LEAFNAME_SIZE];
00298 #endif
00299 FILE *pCharacterMappingFile;
00300 int iTmp;
00301 BOOL bSuccess;
00302
00303 DBG_MSG("iReadOptions");
00304
00305
00306 tOptionsCurr = tOptionsDefault;
00307
00308 #if defined(__riscos)
00309
00310 pFile = fopen("<AntiWord$ChoicesFile>", "r");
00311 DBG_MSG_C(pFile == NULL, "Choices file not found");
00312 DBG_HEX_C(pFile != NULL, pFile);
00313 if (pFile != NULL) {
00314 while (fgets(szLine, (int)sizeof(szLine), pFile) != NULL) {
00315 DBG_MSG(szLine);
00316 if (szLine[0] == '#' ||
00317 szLine[0] == '\r' ||
00318 szLine[0] == '\n') {
00319 continue;
00320 }
00321 if (sscanf(szLine, PARAGRAPH_BREAK, &iTmp) == 1 &&
00322 (iTmp == 0 ||
00323 (iTmp >= MIN_SCREEN_WIDTH &&
00324 iTmp <= MAX_SCREEN_WIDTH))) {
00325 tOptionsCurr.iParagraphBreak = iTmp;
00326 DBG_DEC(tOptionsCurr.iParagraphBreak);
00327 } else if (sscanf(szLine, AUTOFILETYPE, &iTmp)
00328 == 1) {
00329 tOptionsCurr.bAutofiletypeAllowed =
00330 iTmp != 0;
00331 DBG_DEC(tOptionsCurr.bAutofiletypeAllowed);
00332 } else if (sscanf(szLine, USE_OUTLINEFONTS, &iTmp)
00333 == 1) {
00334 tOptionsCurr.eConversionType =
00335 iTmp == 0 ?
00336 conversion_text : conversion_draw;
00337 DBG_DEC(tOptionsCurr.eConversionType);
00338 } else if (sscanf(szLine, SHOW_IMAGES, &iTmp)
00339 == 1) {
00340 tOptionsCurr.eImageLevel = iTmp != 0 ?
00341 level_default : level_no_images;
00342 } else if (sscanf(szLine, HIDE_HIDDEN_TEXT, &iTmp)
00343 == 1) {
00344 tOptionsCurr.bHideHiddenText = iTmp != 0;
00345 DBG_DEC(tOptionsCurr.bHideHiddenText);
00346 } else if (sscanf(szLine, SCALE_FACTOR_START, &iTmp)
00347 == 1) {
00348 if (iTmp >= MIN_SCALE_FACTOR &&
00349 iTmp <= MAX_SCALE_FACTOR) {
00350 tOptionsCurr.iScaleFactor = iTmp;
00351 DBG_DEC(tOptionsCurr.iScaleFactor);
00352 }
00353 }
00354 }
00355 (void)fclose(pFile);
00356 }
00357 iAlphabet = iReadCurrentAlphabetNumber();
00358 switch (iAlphabet) {
00359 case 101:
00360 szAlphabet = "<AntiWord$Latin1>";
00361 break;
00362 case 112:
00363 szAlphabet = "<AntiWord$Latin9>";
00364 break;
00365 default:
00366 werr(0, "Alphabet '%d' is not supported", iAlphabet);
00367 return -1;
00368 }
00369 pCharacterMappingFile = pOpenCharacterMappingFile(szAlphabet);
00370 if (pCharacterMappingFile != NULL) {
00371 bSuccess = bReadCharacterMappingTable(pCharacterMappingFile);
00372 vCloseCharacterMappingFile(pCharacterMappingFile);
00373 } else {
00374 bSuccess = FALSE;
00375 }
00376 return bSuccess ? 1 : -1;
00377 #else
00378
00379
00380 #ifdef SYMBIAN
00381
00382 if ( setenv("COLUMNS", "80", 1) == 0)
00383 #endif
00384 szTmp = getenv("COLUMNS");
00385
00386 if (szTmp != NULL) {
00387 DBG_MSG(szTmp);
00388 iTmp = (int)strtol(szTmp, &pcChar, 10);
00389 if (*pcChar == '\0') {
00390 iTmp -= 4;
00391 if (iTmp < MIN_SCREEN_WIDTH) {
00392 iTmp = MIN_SCREEN_WIDTH;
00393 } else if (iTmp > MAX_SCREEN_WIDTH) {
00394 iTmp = MAX_SCREEN_WIDTH;
00395 }
00396 tOptionsCurr.iParagraphBreak = iTmp;
00397 DBG_DEC(tOptionsCurr.iParagraphBreak);
00398 }
00399 }
00400 strncpy(szLeafname, szGetDefaultMappingFile(), sizeof(szLeafname) - 1);
00401 szLeafname[sizeof(szLeafname) - 1] = '\0';
00402
00403 while ((iChar = getopt(argc, argv, "La:fhi:m:p:rstw:x:")) != -1) {
00404 switch (iChar) {
00405 case 'L':
00406 tOptionsCurr.bUseLandscape = TRUE;
00407 break;
00408 case 'a':
00409 if (!bCorrectPapersize(optarg, conversion_pdf)) {
00410 werr(0, "-a without a valid papersize");
00411 return -1;
00412 }
00413 break;
00414 case 'f':
00415 tOptionsCurr.eConversionType = conversion_fmt_text;
00416 break;
00417 case 'h':
00418 return 0;
00419 case 'i':
00420 iTmp = (int)strtol(optarg, &pcChar, 10);
00421 if (*pcChar != '\0') {
00422 break;
00423 }
00424 switch (iTmp) {
00425 case 0:
00426 tOptionsCurr.eImageLevel = level_gs_special;
00427 break;
00428 case 1:
00429 tOptionsCurr.eImageLevel = level_no_images;
00430 break;
00431 case 2:
00432 tOptionsCurr.eImageLevel = level_ps_2;
00433 break;
00434 case 3:
00435 tOptionsCurr.eImageLevel = level_ps_3;
00436 break;
00437 default:
00438 tOptionsCurr.eImageLevel = level_default;
00439 break;
00440 }
00441 DBG_DEC(tOptionsCurr.eImageLevel);
00442 break;
00443 case 'm':
00444 if (tOptionsCurr.eConversionType == conversion_xml) {
00445 werr(0, "XML doesn't need a mapping file");
00446 break;
00447 }
00448 strncpy(szLeafname, optarg, sizeof(szLeafname) - 1);
00449 szLeafname[sizeof(szLeafname) - 1] = '\0';
00450 DBG_MSG(szLeafname);
00451 break;
00452 case 'p':
00453 if (!bCorrectPapersize(optarg, conversion_ps)) {
00454 werr(0, "-p without a valid papersize");
00455 return -1;
00456 }
00457 break;
00458 case 'r':
00459 tOptionsCurr.bRemoveRemovedText = FALSE;
00460 break;
00461 case 's':
00462 tOptionsCurr.bHideHiddenText = FALSE;
00463 break;
00464 case 't':
00465 tOptionsCurr.eConversionType = conversion_text;
00466 break;
00467 case 'w':
00468 iTmp = (int)strtol(optarg, &pcChar, 10);
00469 if (*pcChar == '\0') {
00470 if (iTmp != 0 && iTmp < MIN_SCREEN_WIDTH) {
00471 iTmp = MIN_SCREEN_WIDTH;
00472 } else if (iTmp > MAX_SCREEN_WIDTH) {
00473 iTmp = MAX_SCREEN_WIDTH;
00474 }
00475 tOptionsCurr.iParagraphBreak = iTmp;
00476 DBG_DEC(tOptionsCurr.iParagraphBreak);
00477 }
00478 break;
00479 case 'x':
00480 if (STREQ(optarg, "db")) {
00481 tOptionsCurr.iParagraphBreak = 0;
00482 tOptionsCurr.eConversionType = conversion_xml;
00483 strcpy(szLeafname, MAPPING_FILE_UTF_8);
00484 } else {
00485 werr(0, "-x %s is not supported", optarg);
00486 return -1;
00487 }
00488 break;
00489 default:
00490 return -1;
00491 }
00492 }
00493
00494 tOptionsCurr.eEncoding = eMappingFile2Encoding(szLeafname);
00495 DBG_DEC(tOptionsCurr.eEncoding);
00496
00497 if (tOptionsCurr.eConversionType == conversion_ps &&
00498 tOptionsCurr.eEncoding == encoding_utf_8) {
00499 werr(0,
00500 "The combination PostScript and UTF-8 is not supported");
00501 return -1;
00502 }
00503
00504 if (tOptionsCurr.eConversionType == conversion_pdf &&
00505 tOptionsCurr.eEncoding == encoding_utf_8) {
00506 werr(0,
00507 "The combination PDF and UTF-8 is not supported");
00508 return -1;
00509 }
00510
00511 if (tOptionsCurr.eConversionType == conversion_pdf &&
00512 tOptionsCurr.eEncoding == encoding_cyrillic) {
00513 werr(0,
00514 "The combination PDF and Cyrillic is not supported");
00515 return -1;
00516 }
00517
00518 if (tOptionsCurr.eConversionType == conversion_ps ||
00519 tOptionsCurr.eConversionType == conversion_pdf) {
00520
00521 if (tOptionsCurr.bUseLandscape) {
00522
00523 iTmp = tOptionsCurr.iPageHeight;
00524 tOptionsCurr.iPageHeight = tOptionsCurr.iPageWidth;
00525 tOptionsCurr.iPageWidth = iTmp;
00526 }
00527
00528 tOptionsCurr.iParagraphBreak = iMilliPoints2Char(
00529 (long)tOptionsCurr.iPageWidth * 1000 -
00530 lDrawUnits2MilliPoints(
00531 PS_LEFT_MARGIN + PS_RIGHT_MARGIN));
00532 DBG_DEC(tOptionsCurr.iParagraphBreak);
00533 }
00534
00535 pCharacterMappingFile = pOpenCharacterMappingFile(szLeafname);
00536 if (pCharacterMappingFile != NULL) {
00537 bSuccess = bReadCharacterMappingTable(pCharacterMappingFile);
00538 vCloseCharacterMappingFile(pCharacterMappingFile);
00539 } else {
00540 bSuccess = FALSE;
00541 }
00542 return bSuccess ? optind : -1;
00543 #endif
00544 }
00545
00546
00547
00548
00549 void
00550 vGetOptions(options_type *pOptions)
00551 {
00552 fail(pOptions == NULL);
00553
00554 *pOptions = tOptionsCurr;
00555 }
00556
00557 #if defined(__riscos)
00558
00559
00560
00561 static void
00562 vWriteOptions(void)
00563 {
00564 FILE *pFile;
00565 char *szOptionsFile;
00566
00567 TRACE_MSG("vWriteOptions");
00568
00569 szOptionsFile = getenv("AntiWord$ChoicesSave");
00570 if (szOptionsFile == NULL) {
00571 werr(0, "Warning: Name of the Choices file not found");
00572 return;
00573 }
00574 if (!bMakeDirectory(szOptionsFile)) {
00575 werr(0,
00576 "Warning: I can't make a directory for the Choices file");
00577 return;
00578 }
00579 pFile = fopen(szOptionsFile, "w");
00580 if (pFile == NULL) {
00581 werr(0, "Warning: I can't write the Choices file");
00582 return;
00583 }
00584 (void)fprintf(pFile, PARAGRAPH_BREAK"\n",
00585 tOptionsCurr.iParagraphBreak);
00586 (void)fprintf(pFile, AUTOFILETYPE"\n",
00587 tOptionsCurr.bAutofiletypeAllowed);
00588 (void)fprintf(pFile, USE_OUTLINEFONTS"\n",
00589 tOptionsCurr.eConversionType == conversion_text ? 0 : 1);
00590 (void)fprintf(pFile, SHOW_IMAGES"\n",
00591 tOptionsCurr.eImageLevel == level_no_images ? 0 : 1);
00592 (void)fprintf(pFile, HIDE_HIDDEN_TEXT"\n",
00593 tOptionsCurr.bHideHiddenText);
00594 (void)fprintf(pFile, SCALE_FACTOR_START"\n",
00595 tOptionsCurr.iScaleFactor);
00596 (void)fclose(pFile);
00597 }
00598
00599
00600
00601
00602 void
00603 vChoicesOpenAction(window_handle tWindow)
00604 {
00605 TRACE_MSG("vChoicesOpenAction");
00606
00607 tOptionsTemp = tOptionsCurr;
00608 if (tOptionsTemp.iParagraphBreak == 0) {
00609 vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, FALSE);
00610 vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, TRUE);
00611 vUpdateWriteableNumber(tWindow, CHOICES_BREAK_WRITEABLE,
00612 DEFAULT_SCREEN_WIDTH);
00613 } else {
00614 vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, TRUE);
00615 vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, FALSE);
00616 vUpdateWriteableNumber(tWindow,
00617 CHOICES_BREAK_WRITEABLE,
00618 tOptionsTemp.iParagraphBreak);
00619 }
00620 vUpdateRadioButton(tWindow, CHOICES_AUTOFILETYPE_BUTTON,
00621 tOptionsTemp.bAutofiletypeAllowed);
00622 vUpdateRadioButton(tWindow, CHOICES_HIDDEN_TEXT_BUTTON,
00623 tOptionsTemp.bHideHiddenText);
00624 if (tOptionsTemp.eConversionType == conversion_draw) {
00625 vUpdateRadioButton(tWindow,
00626 CHOICES_WITH_IMAGES_BUTTON,
00627 tOptionsTemp.eImageLevel != level_no_images);
00628 vUpdateRadioButton(tWindow,
00629 CHOICES_NO_IMAGES_BUTTON,
00630 tOptionsTemp.eImageLevel == level_no_images);
00631 vUpdateRadioButton(tWindow,
00632 CHOICES_TEXTONLY_BUTTON, FALSE);
00633 } else {
00634 vUpdateRadioButton(tWindow,
00635 CHOICES_WITH_IMAGES_BUTTON, FALSE);
00636 vUpdateRadioButton(tWindow,
00637 CHOICES_NO_IMAGES_BUTTON, FALSE);
00638 vUpdateRadioButton(tWindow,
00639 CHOICES_TEXTONLY_BUTTON, TRUE);
00640 }
00641 vUpdateWriteableNumber(tWindow,
00642 CHOICES_SCALE_WRITEABLE, tOptionsTemp.iScaleFactor);
00643 TRACE_MSG("end of vChoicesOpenAction");
00644 }
00645
00646
00647
00648
00649 static void
00650 vDefaultButtonAction(window_handle tWindow)
00651 {
00652 TRACE_MSG("vDefaultButtonAction");
00653
00654 tOptionsTemp = tOptionsDefault;
00655 vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, TRUE);
00656 vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, FALSE);
00657 vUpdateWriteableNumber(tWindow, CHOICES_BREAK_WRITEABLE,
00658 tOptionsTemp.iParagraphBreak);
00659 vUpdateRadioButton(tWindow, CHOICES_AUTOFILETYPE_BUTTON,
00660 tOptionsTemp.bAutofiletypeAllowed);
00661 vUpdateRadioButton(tWindow, CHOICES_HIDDEN_TEXT_BUTTON,
00662 tOptionsTemp.bHideHiddenText);
00663 vUpdateRadioButton(tWindow, CHOICES_WITH_IMAGES_BUTTON,
00664 tOptionsTemp.eConversionType == conversion_draw &&
00665 tOptionsTemp.eImageLevel != level_no_images);
00666 vUpdateRadioButton(tWindow, CHOICES_NO_IMAGES_BUTTON,
00667 tOptionsTemp.eConversionType == conversion_draw &&
00668 tOptionsTemp.eImageLevel == level_no_images);
00669 vUpdateRadioButton(tWindow, CHOICES_TEXTONLY_BUTTON,
00670 tOptionsTemp.eConversionType == conversion_text);
00671 vUpdateWriteableNumber(tWindow, CHOICES_SCALE_WRITEABLE,
00672 tOptionsTemp.iScaleFactor);
00673 }
00674
00675
00676
00677
00678 static void
00679 vApplyButtonAction(void)
00680 {
00681 TRACE_MSG("vApplyButtonAction");
00682
00683 tOptionsCurr = tOptionsTemp;
00684 }
00685
00686
00687
00688
00689 static void
00690 vSaveButtonAction(void)
00691 {
00692 TRACE_MSG("vSaveButtonAction");
00693
00694 vApplyButtonAction();
00695 vWriteOptions();
00696 }
00697
00698
00699
00700
00701 static void
00702 vSetParagraphBreak(window_handle tWindow, int iNumber)
00703 {
00704 tOptionsTemp.iParagraphBreak = iNumber;
00705 if (tOptionsTemp.iParagraphBreak == 0) {
00706 return;
00707 }
00708 vUpdateWriteableNumber(tWindow,
00709 CHOICES_BREAK_WRITEABLE,
00710 tOptionsTemp.iParagraphBreak);
00711 }
00712
00713
00714
00715
00716 static void
00717 vChangeParagraphBreak(window_handle tWindow, int iNumber)
00718 {
00719 int iTmp;
00720
00721 iTmp = tOptionsTemp.iParagraphBreak + iNumber;
00722 if (iTmp < MIN_SCREEN_WIDTH || iTmp > MAX_SCREEN_WIDTH) {
00723
00724 return;
00725 }
00726 tOptionsTemp.iParagraphBreak = iTmp;
00727 vUpdateWriteableNumber(tWindow,
00728 CHOICES_BREAK_WRITEABLE,
00729 tOptionsTemp.iParagraphBreak);
00730 }
00731
00732
00733
00734
00735 static void
00736 vChangeAutofiletype(window_handle tWindow)
00737 {
00738 tOptionsTemp.bAutofiletypeAllowed =
00739 !tOptionsTemp.bAutofiletypeAllowed;
00740 vUpdateRadioButton(tWindow,
00741 CHOICES_AUTOFILETYPE_BUTTON,
00742 tOptionsTemp.bAutofiletypeAllowed);
00743 }
00744
00745
00746
00747
00748 static void
00749 vChangeHiddenText(window_handle tWindow)
00750 {
00751 tOptionsTemp.bHideHiddenText = !tOptionsTemp.bHideHiddenText;
00752 vUpdateRadioButton(tWindow,
00753 CHOICES_HIDDEN_TEXT_BUTTON,
00754 tOptionsTemp.bHideHiddenText);
00755 }
00756
00757
00758
00759
00760 static void
00761 vUseFontsImages(BOOL bUseOutlineFonts, BOOL bShowImages)
00762 {
00763 tOptionsTemp.eConversionType =
00764 bUseOutlineFonts ? conversion_draw : conversion_text;
00765 tOptionsTemp.eImageLevel =
00766 bUseOutlineFonts && bShowImages ?
00767 level_default : level_no_images;
00768 }
00769
00770
00771
00772
00773 static void
00774 vSetScaleFactor(window_handle tWindow, int iNumber)
00775 {
00776 tOptionsTemp.iScaleFactor = iNumber;
00777 vUpdateWriteableNumber(tWindow,
00778 CHOICES_SCALE_WRITEABLE,
00779 tOptionsTemp.iScaleFactor);
00780 }
00781
00782
00783
00784
00785 static void
00786 vChangeScaleFactor(window_handle tWindow, int iNumber)
00787 {
00788 int iTmp;
00789
00790 iTmp = tOptionsTemp.iScaleFactor + iNumber;
00791 if (iTmp < MIN_SCALE_FACTOR || iTmp > MAX_SCALE_FACTOR) {
00792
00793 return;
00794 }
00795 tOptionsTemp.iScaleFactor = iTmp;
00796 vUpdateWriteableNumber(tWindow,
00797 CHOICES_SCALE_WRITEABLE,
00798 tOptionsTemp.iScaleFactor);
00799 }
00800
00801
00802
00803
00804 BOOL
00805 bChoicesMouseClick(event_pollblock *pEvent, void *pvReference)
00806 {
00807 icon_handle tAction;
00808 mouse_block *pMouse;
00809 BOOL bCloseWindow;
00810
00811 TRACE_MSG("bChoicesMouseClick");
00812
00813 fail(pEvent == NULL);
00814 fail(pEvent->type != event_CLICK);
00815
00816 pMouse = &pEvent->data.mouse;
00817 if (!pMouse->button.data.select && !pMouse->button.data.adjust) {
00818
00819 DBG_HEX(pMouse->button.value);
00820 return FALSE;
00821 }
00822
00823
00824 tAction = pMouse->icon;
00825 if (pMouse->button.data.adjust) {
00826
00827 switch (pMouse->icon) {
00828 case CHOICES_BREAK_UP_BUTTON:
00829 tAction = CHOICES_BREAK_DOWN_BUTTON;
00830 break;
00831 case CHOICES_BREAK_DOWN_BUTTON:
00832 tAction = CHOICES_BREAK_UP_BUTTON;
00833 break;
00834 case CHOICES_SCALE_UP_BUTTON:
00835 tAction = CHOICES_SCALE_DOWN_BUTTON;
00836 break;
00837 case CHOICES_SCALE_DOWN_BUTTON:
00838 tAction = CHOICES_SCALE_UP_BUTTON;
00839 break;
00840 default:
00841 break;
00842 }
00843 }
00844
00845
00846 bCloseWindow = FALSE;
00847 switch (tAction) {
00848 case CHOICES_DEFAULT_BUTTON:
00849 vDefaultButtonAction(pMouse->window);
00850 break;
00851 case CHOICES_SAVE_BUTTON:
00852 vSaveButtonAction();
00853 break;
00854 case CHOICES_CANCEL_BUTTON:
00855 bCloseWindow = TRUE;
00856 break;
00857 case CHOICES_APPLY_BUTTON:
00858 vApplyButtonAction();
00859 bCloseWindow = TRUE;
00860 break;
00861 case CHOICES_BREAK_BUTTON:
00862 vSetParagraphBreak(pMouse->window, DEFAULT_SCREEN_WIDTH);
00863 break;
00864 case CHOICES_BREAK_UP_BUTTON:
00865 vChangeParagraphBreak(pMouse->window, 1);
00866 break;
00867 case CHOICES_BREAK_DOWN_BUTTON:
00868 vChangeParagraphBreak(pMouse->window, -1);
00869 break;
00870 case CHOICES_NO_BREAK_BUTTON:
00871 vSetParagraphBreak(pMouse->window, 0);
00872 break;
00873 case CHOICES_AUTOFILETYPE_BUTTON:
00874 vChangeAutofiletype(pMouse->window);
00875 break;
00876 case CHOICES_HIDDEN_TEXT_BUTTON:
00877 vChangeHiddenText(pMouse->window);
00878 break;
00879 case CHOICES_WITH_IMAGES_BUTTON:
00880 vUseFontsImages(TRUE, TRUE);
00881 break;
00882 case CHOICES_NO_IMAGES_BUTTON:
00883 vUseFontsImages(TRUE, FALSE);
00884 break;
00885 case CHOICES_TEXTONLY_BUTTON:
00886 vUseFontsImages(FALSE, FALSE);
00887 break;
00888 case CHOICES_SCALE_UP_BUTTON:
00889 vChangeScaleFactor(pMouse->window, 5);
00890 break;
00891 case CHOICES_SCALE_DOWN_BUTTON:
00892 vChangeScaleFactor(pMouse->window, -5);
00893 break;
00894 default:
00895 DBG_DEC(pMouse->icon);
00896 break;
00897 }
00898 if (bCloseWindow) {
00899 Error_CheckFatal(Wimp_CloseWindow(pMouse->window));
00900 }
00901 return TRUE;
00902 }
00903
00904
00905
00906
00907 BOOL
00908 bChoicesKeyPressed(event_pollblock *pEvent, void *pvReference)
00909 {
00910 icon_block tIcon;
00911 caret_block *pCaret;
00912 char *pcChar;
00913 int iNumber;
00914
00915 DBG_MSG("bChoicesKeyPressed");
00916
00917 fail(pEvent == NULL);
00918 fail(pEvent->type != event_KEY);
00919
00920 if (pEvent->data.key.code != '\r') {
00921 Error_CheckFatal(Wimp_ProcessKey(pEvent->data.key.code));
00922 return TRUE;
00923 }
00924
00925 pCaret = &pEvent->data.key.caret;
00926
00927 Error_CheckFatal(Wimp_GetIconState(pCaret->window, pCaret->icon, &tIcon));
00928 if (!tIcon.flags.data.text || !tIcon.flags.data.indirected) {
00929 werr(1, "Icon %d must be indirected text", (int)pCaret->icon);
00930 }
00931 iNumber = (int)strtol(tIcon.data.indirecttext.buffer, &pcChar, 10);
00932
00933 switch(pCaret->icon) {
00934 case CHOICES_BREAK_WRITEABLE:
00935 if (*pcChar != '\0' && *pcChar != '\r') {
00936 DBG_DEC(*pcChar);
00937 iNumber = DEFAULT_SCREEN_WIDTH;
00938 } else if (iNumber < MIN_SCREEN_WIDTH) {
00939 iNumber = MIN_SCREEN_WIDTH;
00940 } else if (iNumber > MAX_SCREEN_WIDTH) {
00941 iNumber = MAX_SCREEN_WIDTH;
00942 }
00943 vSetParagraphBreak(pCaret->window, iNumber);
00944 break;
00945 case CHOICES_SCALE_WRITEABLE:
00946 if (*pcChar != '\0' && *pcChar != '\r') {
00947 DBG_DEC(*pcChar);
00948 iNumber = DEFAULT_SCALE_FACTOR;
00949 } else if (iNumber < MIN_SCALE_FACTOR) {
00950 iNumber = MIN_SCALE_FACTOR;
00951 } else if (iNumber > MAX_SCALE_FACTOR) {
00952 iNumber = MAX_SCALE_FACTOR;
00953 }
00954 vSetScaleFactor(pCaret->window, iNumber);
00955 break;
00956 default:
00957 DBG_DEC(pCaret->icon);
00958 break;
00959 }
00960 return TRUE;
00961 }
00962 #endif