diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/options_8c_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/options_8c_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,978 @@ + + +
+ +00001 /* +00002 * options.c +00003 * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL +00004 * +00005 * Description: +00006 * Read and write the options +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 /* __dos */ +00022 #endif /* __riscos */ +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 /* __riscos */ +00035 +00036 /* Current values for options */ +00037 static options_type tOptionsCurr; +00038 #if defined(__riscos) +00039 /* Temporary values for options */ +00040 static options_type tOptionsTemp; +00041 #else +00042 typedef struct papersize_tag { +00043 char szName[16]; /* Papersize name */ +00044 USHORT usWidth; /* In points */ +00045 USHORT usHeight; /* In points */ +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 /* __riscos */ +00066 /* Default values for options */ +00067 static const options_type tOptionsDefault = { +00068 DEFAULT_SCREEN_WIDTH, +00069 #if defined(__riscos) +00070 conversion_draw, +00071 #else +00072 conversion_text, +00073 #endif /* __riscos */ +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 /* __riscos */ +00085 }; +00086 +00087 +00088 #if !defined(__riscos) +00089 /* +00090 * bCorrectPapersize - see if the papersize is correct +00091 * +00092 * TRUE if the papersize is correct, otherwise FALSE +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 } /* end of bCorrectPapersize */ +00114 +00115 /* +00116 * szCreateSuffix - create a suffix for the file +00117 * +00118 * Returns the suffix +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 /* There is already a .txt suffix, no need for another one */ +00128 return ""; +00129 } +00130 return ".txt"; +00131 } /* end of szCreateSuffix */ +00132 +00133 /* +00134 * eMappingFile2Encoding - convert the mapping file to an encoding +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 } /* end of eMappingFile2Encoding */ +00169 #endif /* !__riscos */ +00170 +00171 /* +00172 * pOpenCharacterMappingFile - open the mapping file +00173 * +00174 * Returns the file pointer or NULL +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 /* !__riscos */ +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 /* Set the suffix */ +00196 szSuffix = szCreateSuffix(szLeafname); +00197 +00198 /* Set length */ +00199 tFilenameLen = strlen(szLeafname) + strlen(szSuffix); +00200 +00201 /* Try the environment version of the mapping file */ +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 /* Try the local version of the mapping file */ +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 /*SYMBIAN*/ +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 /* Try the global version of the mapping file */ +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 /* __riscos */ +00265 } /* end of pOpenCharacterMappingFile */ +00266 +00267 /* +00268 * vCloseCharacterMappingFile - close the mapping file +00269 */ +00270 static void +00271 vCloseCharacterMappingFile(FILE *pFile) +00272 { +00273 (void)fclose(pFile); +00274 } /* end of pCloseCharacterMappingFile */ +00275 +00276 +00277 /* +00278 * iReadOptions - read options +00279 * +00280 * returns: -1: error +00281 * 0: help +00282 * >0: index first file argument +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 /* __riscos */ +00299 FILE *pCharacterMappingFile; +00300 int iTmp; +00301 BOOL bSuccess; +00302 +00303 DBG_MSG("iReadOptions"); +00304 +00305 /* Defaults */ +00306 tOptionsCurr = tOptionsDefault; +00307 +00308 #if defined(__riscos) +00309 /* Choices file */ +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: /* ISO-8859-1 aka Latin1 */ +00360 szAlphabet = "<AntiWord$Latin1>"; +00361 break; +00362 case 112: /* ISO-8859-15 aka Latin9 */ +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 /* Environment */ +00379 +00380 #ifdef SYMBIAN +00381 //Adding Some environment Variable explicitly +00382 if ( setenv("COLUMNS", "80", 1) == 0) +00383 #endif /*SYMBIAN*/ +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; /* This is for the edge */ +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 /* Command line */ +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 /* PostScript or PDF mode */ +00521 if (tOptionsCurr.bUseLandscape) { +00522 /* Swap the page height and width */ +00523 iTmp = tOptionsCurr.iPageHeight; +00524 tOptionsCurr.iPageHeight = tOptionsCurr.iPageWidth; +00525 tOptionsCurr.iPageWidth = iTmp; +00526 } +00527 /* The paragraph break depends on the width of the paper */ +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 /* __riscos */ +00544 } /* end of iReadOptions */ +00545 +00546 /* +00547 * vGetOptions - get a copy of the current option values +00548 */ +00549 void +00550 vGetOptions(options_type *pOptions) +00551 { +00552 fail(pOptions == NULL); +00553 +00554 *pOptions = tOptionsCurr; +00555 } /* end of vGetOptions */ +00556 +00557 #if defined(__riscos) +00558 /* +00559 * vWriteOptions - write the current options to the Options file +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 } /* end of vWriteOptions */ +00598 +00599 /* +00600 * vChoicesOpenAction - action to be taken when the Choices window opens +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 } /* end of vChoicesOpenAction */ +00645 +00646 /* +00647 * vDefaultButtonAction - action when the default button is clicked +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 } /* end of vDefaultButtonAction */ +00674 +00675 /* +00676 * vApplyButtonAction - action to be taken when the OK button is clicked +00677 */ +00678 static void +00679 vApplyButtonAction(void) +00680 { +00681 TRACE_MSG("vApplyButtonAction"); +00682 +00683 tOptionsCurr = tOptionsTemp; +00684 } /* end of vApplyButtonAction */ +00685 +00686 /* +00687 * vSaveButtonAction - action to be taken when the save button is clicked +00688 */ +00689 static void +00690 vSaveButtonAction(void) +00691 { +00692 TRACE_MSG("vSaveButtonAction"); +00693 +00694 vApplyButtonAction(); +00695 vWriteOptions(); +00696 } /* end of vSaveButtonAction */ +00697 +00698 /* +00699 * vSetParagraphBreak - set the paragraph break to the given number +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 } /* end of vSetParagraphBreak */ +00712 +00713 /* +00714 * vChangeParagraphBreak - change the paragraph break with the given number +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 /* Ignore */ +00724 return; +00725 } +00726 tOptionsTemp.iParagraphBreak = iTmp; +00727 vUpdateWriteableNumber(tWindow, +00728 CHOICES_BREAK_WRITEABLE, +00729 tOptionsTemp.iParagraphBreak); +00730 } /* end of vChangeParagraphBreak */ +00731 +00732 /* +00733 * vChangeAutofiletype - invert the permission to autofiletype +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 } /* end of vChangeAutofiletype */ +00744 +00745 /* +00746 * vChangeHiddenText - invert the hide/show hidden text +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 } /* end of vChangeHiddenText */ +00756 +00757 /* +00758 * vUseFontsImages - use outline fonts, show images +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 } /* end of vUseFontsImages */ +00769 +00770 /* +00771 * vSetScaleFactor - set the scale factor to the given number +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 } /* end of vSetScaleFactor */ +00781 +00782 /* +00783 * vChangeScaleFactor - change the scale factor with the given number +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 /* Ignore */ +00793 return; +00794 } +00795 tOptionsTemp.iScaleFactor = iTmp; +00796 vUpdateWriteableNumber(tWindow, +00797 CHOICES_SCALE_WRITEABLE, +00798 tOptionsTemp.iScaleFactor); +00799 } /* end of vChangeScaleFactor */ +00800 +00801 /* +00802 * bChoicesMouseClick - handle a mouse click in the Choices window +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 /* Not handled here */ +00819 DBG_HEX(pMouse->button.value); +00820 return FALSE; +00821 } +00822 +00823 /* Which action should be taken */ +00824 tAction = pMouse->icon; +00825 if (pMouse->button.data.adjust) { +00826 /* The adjust button reverses the direction */ +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 /* Actions */ +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 } /* end of bChoicesMouseClick */ +00903 +00904 /* +00905 * bChoicesKeyPressed - handle a key in the Choices window +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 } /* end of bChoicesKeyPressed */ +00962 #endif /* __riscos */ +