diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aux/antiword/options.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aux/antiword/options.c')
-rwxr-xr-x | sys/src/cmd/aux/antiword/options.c | 950 |
1 files changed, 950 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/antiword/options.c b/sys/src/cmd/aux/antiword/options.c new file mode 100755 index 000000000..8379fef92 --- /dev/null +++ b/sys/src/cmd/aux/antiword/options.c @@ -0,0 +1,950 @@ +/* + * options.c + * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL + * + * Description: + * Read and write the options + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#if defined(__riscos) +#include "DeskLib:Error.h" +#include "DeskLib:Wimp.h" +#else +#include <stdlib.h> +#if defined(__dos) || defined(N_PLAT_NLM) +extern int getopt(int, char **, const char *); +#else +#include <unistd.h> +#endif /* __dos */ +#endif /* __riscos */ +#include "antiword.h" + +#if defined(__riscos) +#define PARAGRAPH_BREAK "set paragraph_break=%d" +#define AUTOFILETYPE "set autofiletype_allowed=%d" +#define USE_OUTLINEFONTS "set use_outlinefonts=%d" +#define SHOW_IMAGES "set show_images=%d" +#define HIDE_HIDDEN_TEXT "set hide_hidden_text=%d" +#define SCALE_FACTOR_START "set scale_factor_start=%d" +#else +#define LEAFNAME_SIZE (32+1) +#endif /* __riscos */ + +/* Current values for options */ +static options_type tOptionsCurr; +#if defined(__riscos) +/* Temporary values for options */ +static options_type tOptionsTemp; +#else +typedef struct papersize_tag { + char szName[16]; /* Papersize name */ + USHORT usWidth; /* In points */ + USHORT usHeight; /* In points */ +} papersize_type; + +static const papersize_type atPaperSizes[] = { + { "10x14", 720, 1008 }, + { "a3", 842, 1191 }, + { "a4", 595, 842 }, + { "a5", 420, 595 }, + { "b4", 729, 1032 }, + { "b5", 516, 729 }, + { "executive", 540, 720 }, + { "folio", 612, 936 }, + { "legal", 612, 1008 }, + { "letter", 612, 792 }, + { "note", 540, 720 }, + { "quarto", 610, 780 }, + { "statement", 396, 612 }, + { "tabloid", 792, 1224 }, + { "", 0, 0 }, +}; +#endif /* __riscos */ +/* Default values for options */ +static const options_type tOptionsDefault = { + DEFAULT_SCREEN_WIDTH, +#if defined(__riscos) + conversion_draw, +#else + conversion_text, +#endif /* __riscos */ + TRUE, + TRUE, + FALSE, + encoding_latin_1, + INT_MAX, + INT_MAX, + level_default, +#if defined(__riscos) + TRUE, + DEFAULT_SCALE_FACTOR, +#endif /* __riscos */ +}; + + +#if !defined(__riscos) +/* + * bCorrectPapersize - see if the papersize is correct + * + * TRUE if the papersize is correct, otherwise FALSE + */ +static BOOL +bCorrectPapersize(const char *szName, conversion_type eConversionType) +{ + const papersize_type *pPaperSize; + + for (pPaperSize = atPaperSizes; + pPaperSize->szName[0] != '\0'; + pPaperSize++) { + if (!STRCEQ(pPaperSize->szName, szName)) { + continue; + } + DBG_DEC(pPaperSize->usWidth); + DBG_DEC(pPaperSize->usHeight); + tOptionsCurr.eConversionType = eConversionType; + tOptionsCurr.iPageHeight = (int)pPaperSize->usHeight; + tOptionsCurr.iPageWidth = (int)pPaperSize->usWidth; + return TRUE; + } + return FALSE; +} /* end of bCorrectPapersize */ + +/* + * szCreateSuffix - create a suffix for the file + * + * Returns the suffix + */ +static const char * +szCreateSuffix(const char *szLeafname) +{ + const char *pcDot; + + pcDot = strrchr(szLeafname, '.'); + if (pcDot != NULL && STRCEQ(pcDot, ".txt")) { + /* There is already a .txt suffix, no need for another one */ + return ""; + } + return ".txt"; +} /* end of szCreateSuffix */ + +/* + * eMappingFile2Encoding - convert the mapping file to an encoding + */ +static encoding_type +eMappingFile2Encoding(const char *szLeafname) +{ + char szMappingFile[LEAFNAME_SIZE+4]; + + fail(szLeafname == NULL); + + if (strlen(szLeafname) + 4 >= sizeof(szMappingFile)) { + DBG_MSG(szLeafname); + return encoding_latin_1; + } + + sprintf(szMappingFile, "%s%s", szLeafname, szCreateSuffix(szLeafname)); + + DBG_MSG(szMappingFile); + + if (STRCEQ(szMappingFile, MAPPING_FILE_UTF_8)) { + return encoding_utf_8; + } + if (STRCEQ(szMappingFile, MAPPING_FILE_CP852) || + STRCEQ(szMappingFile, MAPPING_FILE_CP1250) || + STRCEQ(szMappingFile, MAPPING_FILE_8859_2)) { + return encoding_latin_2; + } + if (STRCEQ(szMappingFile, MAPPING_FILE_KOI8_R) || + STRCEQ(szMappingFile, MAPPING_FILE_KOI8_U) || + STRCEQ(szMappingFile, MAPPING_FILE_CP866) || + STRCEQ(szMappingFile, MAPPING_FILE_CP1251) || + STRCEQ(szMappingFile, MAPPING_FILE_8859_5)) { + return encoding_cyrillic; + } + return encoding_latin_1; +} /* end of eMappingFile2Encoding */ +#endif /* !__riscos */ + +/* + * pOpenCharacterMappingFile - open the mapping file + * + * Returns the file pointer or NULL + */ +static FILE * +pOpenCharacterMappingFile(const char *szLeafname) +{ +#if !defined(__riscos) + FILE *pFile; + const char *szHome, *szAntiword, *szSuffix; + size_t tFilenameLen; + char szMappingFile[PATH_MAX+1]; +#endif /* !__riscos */ + + if (szLeafname == NULL || szLeafname[0] == '\0') { + return NULL; + } + + DBG_MSG(szLeafname); + +#if defined(__riscos) + return fopen(szLeafname, "r"); +#else + /* Set the suffix */ + szSuffix = szCreateSuffix(szLeafname); + + /* Set length */ + tFilenameLen = strlen(szLeafname) + strlen(szSuffix); + + /* Try the environment version of the mapping file */ + szAntiword = szGetAntiwordDirectory(); + if (szAntiword != NULL && szAntiword[0] != '\0') { + if (strlen(szAntiword) + tFilenameLen < + sizeof(szMappingFile) - + sizeof(FILE_SEPARATOR)) { + sprintf(szMappingFile, + "%s" FILE_SEPARATOR "%s%s", + szAntiword, szLeafname, szSuffix); + DBG_MSG(szMappingFile); + pFile = fopen(szMappingFile, "r"); + if (pFile != NULL) { + return pFile; + } + } else { + werr(0, "Environment mappingfilename ignored"); + } + } + + /* Try the local version of the mapping file */ + szHome = szGetHomeDirectory(); + if (strlen(szHome) + tFilenameLen < + sizeof(szMappingFile) - + sizeof(ANTIWORD_DIR) - + 2 * sizeof(FILE_SEPARATOR)) { + sprintf(szMappingFile, + "%s" FILE_SEPARATOR ANTIWORD_DIR FILE_SEPARATOR "%s%s", + szHome, szLeafname, szSuffix); + DBG_MSG(szMappingFile); + pFile = fopen(szMappingFile, "r"); + if (pFile != NULL) { + return pFile; + } + } else { + werr(0, "Local mappingfilename too long, ignored"); + } + + /* Try the global version of the mapping file */ + if (tFilenameLen < + sizeof(szMappingFile) - + sizeof(GLOBAL_ANTIWORD_DIR) - + sizeof(FILE_SEPARATOR)) { + sprintf(szMappingFile, + GLOBAL_ANTIWORD_DIR FILE_SEPARATOR "%s%s", + szLeafname, szSuffix); + DBG_MSG(szMappingFile); + pFile = fopen(szMappingFile, "r"); + if (pFile != NULL) { + return pFile; + } + } else { + werr(0, "Global mappingfilename too long, ignored"); + } + werr(0, "I can't open your mapping file (%s%s)\n" + "It is not in '%s" FILE_SEPARATOR ANTIWORD_DIR "' nor in '" + GLOBAL_ANTIWORD_DIR "'.", szLeafname, szSuffix, szHome); + return NULL; +#endif /* __riscos */ +} /* end of pOpenCharacterMappingFile */ + +/* + * vCloseCharacterMappingFile - close the mapping file + */ +static void +vCloseCharacterMappingFile(FILE *pFile) +{ + (void)fclose(pFile); +} /* end of pCloseCharacterMappingFile */ + + +/* + * iReadOptions - read options + * + * returns: -1: error + * 0: help + * >0: index first file argument + */ +int +iReadOptions(int argc, char **argv) +{ +#if defined(__riscos) + FILE *pFile; + const char *szAlphabet; + int iAlphabet; + char szLine[81]; +#else + extern char *optarg; + extern int optind; + char *pcChar, *szTmp; + int iChar; + char szLeafname[LEAFNAME_SIZE]; +#endif /* __riscos */ + FILE *pCharacterMappingFile; + int iTmp; + BOOL bSuccess; + + DBG_MSG("iReadOptions"); + +/* Defaults */ + tOptionsCurr = tOptionsDefault; + +#if defined(__riscos) +/* Choices file */ + pFile = fopen("<AntiWord$ChoicesFile>", "r"); + DBG_MSG_C(pFile == NULL, "Choices file not found"); + DBG_HEX_C(pFile != NULL, pFile); + if (pFile != NULL) { + while (fgets(szLine, (int)sizeof(szLine), pFile) != NULL) { + DBG_MSG(szLine); + if (szLine[0] == '#' || + szLine[0] == '\r' || + szLine[0] == '\n') { + continue; + } + if (sscanf(szLine, PARAGRAPH_BREAK, &iTmp) == 1 && + (iTmp == 0 || + (iTmp >= MIN_SCREEN_WIDTH && + iTmp <= MAX_SCREEN_WIDTH))) { + tOptionsCurr.iParagraphBreak = iTmp; + DBG_DEC(tOptionsCurr.iParagraphBreak); + } else if (sscanf(szLine, AUTOFILETYPE, &iTmp) + == 1) { + tOptionsCurr.bAutofiletypeAllowed = + iTmp != 0; + DBG_DEC(tOptionsCurr.bAutofiletypeAllowed); + } else if (sscanf(szLine, USE_OUTLINEFONTS, &iTmp) + == 1) { + tOptionsCurr.eConversionType = + iTmp == 0 ? + conversion_text : conversion_draw; + DBG_DEC(tOptionsCurr.eConversionType); + } else if (sscanf(szLine, SHOW_IMAGES, &iTmp) + == 1) { + tOptionsCurr.eImageLevel = iTmp != 0 ? + level_default : level_no_images; + } else if (sscanf(szLine, HIDE_HIDDEN_TEXT, &iTmp) + == 1) { + tOptionsCurr.bHideHiddenText = iTmp != 0; + DBG_DEC(tOptionsCurr.bHideHiddenText); + } else if (sscanf(szLine, SCALE_FACTOR_START, &iTmp) + == 1) { + if (iTmp >= MIN_SCALE_FACTOR && + iTmp <= MAX_SCALE_FACTOR) { + tOptionsCurr.iScaleFactor = iTmp; + DBG_DEC(tOptionsCurr.iScaleFactor); + } + } + } + (void)fclose(pFile); + } + iAlphabet = iReadCurrentAlphabetNumber(); + switch (iAlphabet) { + case 101: /* ISO-8859-1 aka Latin1 */ + szAlphabet = "<AntiWord$Latin1>"; + break; + case 112: /* ISO-8859-15 aka Latin9 */ + szAlphabet = "<AntiWord$Latin9>"; + break; + default: + werr(0, "Alphabet '%d' is not supported", iAlphabet); + return -1; + } + pCharacterMappingFile = pOpenCharacterMappingFile(szAlphabet); + if (pCharacterMappingFile != NULL) { + bSuccess = bReadCharacterMappingTable(pCharacterMappingFile); + vCloseCharacterMappingFile(pCharacterMappingFile); + } else { + bSuccess = FALSE; + } + return bSuccess ? 1 : -1; +#else +/* Environment */ + szTmp = getenv("COLUMNS"); + if (szTmp != NULL) { + DBG_MSG(szTmp); + iTmp = (int)strtol(szTmp, &pcChar, 10); + if (*pcChar == '\0') { + iTmp -= 4; /* This is for the edge */ + if (iTmp < MIN_SCREEN_WIDTH) { + iTmp = MIN_SCREEN_WIDTH; + } else if (iTmp > MAX_SCREEN_WIDTH) { + iTmp = MAX_SCREEN_WIDTH; + } + tOptionsCurr.iParagraphBreak = iTmp; + DBG_DEC(tOptionsCurr.iParagraphBreak); + } + } + strncpy(szLeafname, szGetDefaultMappingFile(), sizeof(szLeafname) - 1); + szLeafname[sizeof(szLeafname) - 1] = '\0'; +/* Command line */ + while ((iChar = getopt(argc, argv, "La:fhi:m:p:rstw:x:")) != -1) { + switch (iChar) { + case 'L': + tOptionsCurr.bUseLandscape = TRUE; + break; + case 'a': + if (!bCorrectPapersize(optarg, conversion_pdf)) { + werr(0, "-a without a valid papersize"); + return -1; + } + break; + case 'f': + tOptionsCurr.eConversionType = conversion_fmt_text; + break; + case 'h': + return 0; + case 'i': + iTmp = (int)strtol(optarg, &pcChar, 10); + if (*pcChar != '\0') { + break; + } + switch (iTmp) { + case 0: + tOptionsCurr.eImageLevel = level_gs_special; + break; + case 1: + tOptionsCurr.eImageLevel = level_no_images; + break; + case 2: + tOptionsCurr.eImageLevel = level_ps_2; + break; + case 3: + tOptionsCurr.eImageLevel = level_ps_3; + break; + default: + tOptionsCurr.eImageLevel = level_default; + break; + } + DBG_DEC(tOptionsCurr.eImageLevel); + break; + case 'm': + if (tOptionsCurr.eConversionType == conversion_xml) { + werr(0, "XML doesn't need a mapping file"); + break; + } + strncpy(szLeafname, optarg, sizeof(szLeafname) - 1); + szLeafname[sizeof(szLeafname) - 1] = '\0'; + DBG_MSG(szLeafname); + break; + case 'p': + if (!bCorrectPapersize(optarg, conversion_ps)) { + werr(0, "-p without a valid papersize"); + return -1; + } + break; + case 'r': + tOptionsCurr.bRemoveRemovedText = FALSE; + break; + case 's': + tOptionsCurr.bHideHiddenText = FALSE; + break; + case 't': + tOptionsCurr.eConversionType = conversion_text; + break; + case 'w': + iTmp = (int)strtol(optarg, &pcChar, 10); + if (*pcChar == '\0') { + if (iTmp != 0 && iTmp < MIN_SCREEN_WIDTH) { + iTmp = MIN_SCREEN_WIDTH; + } else if (iTmp > MAX_SCREEN_WIDTH) { + iTmp = MAX_SCREEN_WIDTH; + } + tOptionsCurr.iParagraphBreak = iTmp; + DBG_DEC(tOptionsCurr.iParagraphBreak); + } + break; + case 'x': + if (STREQ(optarg, "db")) { + tOptionsCurr.iParagraphBreak = 0; + tOptionsCurr.eConversionType = conversion_xml; + strcpy(szLeafname, MAPPING_FILE_UTF_8); + } else { + werr(0, "-x %s is not supported", optarg); + return -1; + } + break; + default: + return -1; + } + } + + tOptionsCurr.eEncoding = eMappingFile2Encoding(szLeafname); + DBG_DEC(tOptionsCurr.eEncoding); + + if (tOptionsCurr.eConversionType == conversion_ps && + tOptionsCurr.eEncoding == encoding_utf_8) { + werr(0, + "The combination PostScript and UTF-8 is not supported"); + return -1; + } + + if (tOptionsCurr.eConversionType == conversion_pdf && + tOptionsCurr.eEncoding == encoding_utf_8) { + werr(0, + "The combination PDF and UTF-8 is not supported"); + return -1; + } + + if (tOptionsCurr.eConversionType == conversion_pdf && + tOptionsCurr.eEncoding == encoding_cyrillic) { + werr(0, + "The combination PDF and Cyrillic is not supported"); + return -1; + } + + if (tOptionsCurr.eConversionType == conversion_ps || + tOptionsCurr.eConversionType == conversion_pdf) { + /* PostScript or PDF mode */ + if (tOptionsCurr.bUseLandscape) { + /* Swap the page height and width */ + iTmp = tOptionsCurr.iPageHeight; + tOptionsCurr.iPageHeight = tOptionsCurr.iPageWidth; + tOptionsCurr.iPageWidth = iTmp; + } + /* The paragraph break depends on the width of the paper */ + tOptionsCurr.iParagraphBreak = iMilliPoints2Char( + (long)tOptionsCurr.iPageWidth * 1000 - + lDrawUnits2MilliPoints( + PS_LEFT_MARGIN + PS_RIGHT_MARGIN)); + DBG_DEC(tOptionsCurr.iParagraphBreak); + } + + pCharacterMappingFile = pOpenCharacterMappingFile(szLeafname); + if (pCharacterMappingFile != NULL) { + bSuccess = bReadCharacterMappingTable(pCharacterMappingFile); + vCloseCharacterMappingFile(pCharacterMappingFile); + } else { + bSuccess = FALSE; + } + return bSuccess ? optind : -1; +#endif /* __riscos */ +} /* end of iReadOptions */ + +/* + * vGetOptions - get a copy of the current option values + */ +void +vGetOptions(options_type *pOptions) +{ + fail(pOptions == NULL); + + *pOptions = tOptionsCurr; +} /* end of vGetOptions */ + +#if defined(__riscos) +/* + * vWriteOptions - write the current options to the Options file + */ +static void +vWriteOptions(void) +{ + FILE *pFile; + char *szOptionsFile; + + TRACE_MSG("vWriteOptions"); + + szOptionsFile = getenv("AntiWord$ChoicesSave"); + if (szOptionsFile == NULL) { + werr(0, "Warning: Name of the Choices file not found"); + return; + } + if (!bMakeDirectory(szOptionsFile)) { + werr(0, + "Warning: I can't make a directory for the Choices file"); + return; + } + pFile = fopen(szOptionsFile, "w"); + if (pFile == NULL) { + werr(0, "Warning: I can't write the Choices file"); + return; + } + (void)fprintf(pFile, PARAGRAPH_BREAK"\n", + tOptionsCurr.iParagraphBreak); + (void)fprintf(pFile, AUTOFILETYPE"\n", + tOptionsCurr.bAutofiletypeAllowed); + (void)fprintf(pFile, USE_OUTLINEFONTS"\n", + tOptionsCurr.eConversionType == conversion_text ? 0 : 1); + (void)fprintf(pFile, SHOW_IMAGES"\n", + tOptionsCurr.eImageLevel == level_no_images ? 0 : 1); + (void)fprintf(pFile, HIDE_HIDDEN_TEXT"\n", + tOptionsCurr.bHideHiddenText); + (void)fprintf(pFile, SCALE_FACTOR_START"\n", + tOptionsCurr.iScaleFactor); + (void)fclose(pFile); +} /* end of vWriteOptions */ + +/* + * vChoicesOpenAction - action to be taken when the Choices window opens + */ +void +vChoicesOpenAction(window_handle tWindow) +{ + TRACE_MSG("vChoicesOpenAction"); + + tOptionsTemp = tOptionsCurr; + if (tOptionsTemp.iParagraphBreak == 0) { + vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, FALSE); + vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, TRUE); + vUpdateWriteableNumber(tWindow, CHOICES_BREAK_WRITEABLE, + DEFAULT_SCREEN_WIDTH); + } else { + vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, TRUE); + vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, FALSE); + vUpdateWriteableNumber(tWindow, + CHOICES_BREAK_WRITEABLE, + tOptionsTemp.iParagraphBreak); + } + vUpdateRadioButton(tWindow, CHOICES_AUTOFILETYPE_BUTTON, + tOptionsTemp.bAutofiletypeAllowed); + vUpdateRadioButton(tWindow, CHOICES_HIDDEN_TEXT_BUTTON, + tOptionsTemp.bHideHiddenText); + if (tOptionsTemp.eConversionType == conversion_draw) { + vUpdateRadioButton(tWindow, + CHOICES_WITH_IMAGES_BUTTON, + tOptionsTemp.eImageLevel != level_no_images); + vUpdateRadioButton(tWindow, + CHOICES_NO_IMAGES_BUTTON, + tOptionsTemp.eImageLevel == level_no_images); + vUpdateRadioButton(tWindow, + CHOICES_TEXTONLY_BUTTON, FALSE); + } else { + vUpdateRadioButton(tWindow, + CHOICES_WITH_IMAGES_BUTTON, FALSE); + vUpdateRadioButton(tWindow, + CHOICES_NO_IMAGES_BUTTON, FALSE); + vUpdateRadioButton(tWindow, + CHOICES_TEXTONLY_BUTTON, TRUE); + } + vUpdateWriteableNumber(tWindow, + CHOICES_SCALE_WRITEABLE, tOptionsTemp.iScaleFactor); + TRACE_MSG("end of vChoicesOpenAction"); +} /* end of vChoicesOpenAction */ + +/* + * vDefaultButtonAction - action when the default button is clicked + */ +static void +vDefaultButtonAction(window_handle tWindow) +{ + TRACE_MSG("vDefaultButtonAction"); + + tOptionsTemp = tOptionsDefault; + vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, TRUE); + vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, FALSE); + vUpdateWriteableNumber(tWindow, CHOICES_BREAK_WRITEABLE, + tOptionsTemp.iParagraphBreak); + vUpdateRadioButton(tWindow, CHOICES_AUTOFILETYPE_BUTTON, + tOptionsTemp.bAutofiletypeAllowed); + vUpdateRadioButton(tWindow, CHOICES_HIDDEN_TEXT_BUTTON, + tOptionsTemp.bHideHiddenText); + vUpdateRadioButton(tWindow, CHOICES_WITH_IMAGES_BUTTON, + tOptionsTemp.eConversionType == conversion_draw && + tOptionsTemp.eImageLevel != level_no_images); + vUpdateRadioButton(tWindow, CHOICES_NO_IMAGES_BUTTON, + tOptionsTemp.eConversionType == conversion_draw && + tOptionsTemp.eImageLevel == level_no_images); + vUpdateRadioButton(tWindow, CHOICES_TEXTONLY_BUTTON, + tOptionsTemp.eConversionType == conversion_text); + vUpdateWriteableNumber(tWindow, CHOICES_SCALE_WRITEABLE, + tOptionsTemp.iScaleFactor); +} /* end of vDefaultButtonAction */ + +/* + * vApplyButtonAction - action to be taken when the OK button is clicked + */ +static void +vApplyButtonAction(void) +{ + TRACE_MSG("vApplyButtonAction"); + + tOptionsCurr = tOptionsTemp; +} /* end of vApplyButtonAction */ + +/* + * vSaveButtonAction - action to be taken when the save button is clicked + */ +static void +vSaveButtonAction(void) +{ + TRACE_MSG("vSaveButtonAction"); + + vApplyButtonAction(); + vWriteOptions(); +} /* end of vSaveButtonAction */ + +/* + * vSetParagraphBreak - set the paragraph break to the given number + */ +static void +vSetParagraphBreak(window_handle tWindow, int iNumber) +{ + tOptionsTemp.iParagraphBreak = iNumber; + if (tOptionsTemp.iParagraphBreak == 0) { + return; + } + vUpdateWriteableNumber(tWindow, + CHOICES_BREAK_WRITEABLE, + tOptionsTemp.iParagraphBreak); +} /* end of vSetParagraphBreak */ + +/* + * vChangeParagraphBreak - change the paragraph break with the given number + */ +static void +vChangeParagraphBreak(window_handle tWindow, int iNumber) +{ + int iTmp; + + iTmp = tOptionsTemp.iParagraphBreak + iNumber; + if (iTmp < MIN_SCREEN_WIDTH || iTmp > MAX_SCREEN_WIDTH) { + /* Ignore */ + return; + } + tOptionsTemp.iParagraphBreak = iTmp; + vUpdateWriteableNumber(tWindow, + CHOICES_BREAK_WRITEABLE, + tOptionsTemp.iParagraphBreak); +} /* end of vChangeParagraphBreak */ + +/* + * vChangeAutofiletype - invert the permission to autofiletype + */ +static void +vChangeAutofiletype(window_handle tWindow) +{ + tOptionsTemp.bAutofiletypeAllowed = + !tOptionsTemp.bAutofiletypeAllowed; + vUpdateRadioButton(tWindow, + CHOICES_AUTOFILETYPE_BUTTON, + tOptionsTemp.bAutofiletypeAllowed); +} /* end of vChangeAutofiletype */ + +/* + * vChangeHiddenText - invert the hide/show hidden text + */ +static void +vChangeHiddenText(window_handle tWindow) +{ + tOptionsTemp.bHideHiddenText = !tOptionsTemp.bHideHiddenText; + vUpdateRadioButton(tWindow, + CHOICES_HIDDEN_TEXT_BUTTON, + tOptionsTemp.bHideHiddenText); +} /* end of vChangeHiddenText */ + +/* + * vUseFontsImages - use outline fonts, show images + */ +static void +vUseFontsImages(BOOL bUseOutlineFonts, BOOL bShowImages) +{ + tOptionsTemp.eConversionType = + bUseOutlineFonts ? conversion_draw : conversion_text; + tOptionsTemp.eImageLevel = + bUseOutlineFonts && bShowImages ? + level_default : level_no_images; +} /* end of vUseFontsImages */ + +/* + * vSetScaleFactor - set the scale factor to the given number + */ +static void +vSetScaleFactor(window_handle tWindow, int iNumber) +{ + tOptionsTemp.iScaleFactor = iNumber; + vUpdateWriteableNumber(tWindow, + CHOICES_SCALE_WRITEABLE, + tOptionsTemp.iScaleFactor); +} /* end of vSetScaleFactor */ + +/* + * vChangeScaleFactor - change the scale factor with the given number + */ +static void +vChangeScaleFactor(window_handle tWindow, int iNumber) +{ + int iTmp; + + iTmp = tOptionsTemp.iScaleFactor + iNumber; + if (iTmp < MIN_SCALE_FACTOR || iTmp > MAX_SCALE_FACTOR) { + /* Ignore */ + return; + } + tOptionsTemp.iScaleFactor = iTmp; + vUpdateWriteableNumber(tWindow, + CHOICES_SCALE_WRITEABLE, + tOptionsTemp.iScaleFactor); +} /* end of vChangeScaleFactor */ + +/* + * bChoicesMouseClick - handle a mouse click in the Choices window + */ +BOOL +bChoicesMouseClick(event_pollblock *pEvent, void *pvReference) +{ + icon_handle tAction; + mouse_block *pMouse; + BOOL bCloseWindow; + + TRACE_MSG("bChoicesMouseClick"); + + fail(pEvent == NULL); + fail(pEvent->type != event_CLICK); + + pMouse = &pEvent->data.mouse; + if (!pMouse->button.data.select && !pMouse->button.data.adjust) { + /* Not handled here */ + DBG_HEX(pMouse->button.value); + return FALSE; + } + + /* Which action should be taken */ + tAction = pMouse->icon; + if (pMouse->button.data.adjust) { + /* The adjust button reverses the direction */ + switch (pMouse->icon) { + case CHOICES_BREAK_UP_BUTTON: + tAction = CHOICES_BREAK_DOWN_BUTTON; + break; + case CHOICES_BREAK_DOWN_BUTTON: + tAction = CHOICES_BREAK_UP_BUTTON; + break; + case CHOICES_SCALE_UP_BUTTON: + tAction = CHOICES_SCALE_DOWN_BUTTON; + break; + case CHOICES_SCALE_DOWN_BUTTON: + tAction = CHOICES_SCALE_UP_BUTTON; + break; + default: + break; + } + } + + /* Actions */ + bCloseWindow = FALSE; + switch (tAction) { + case CHOICES_DEFAULT_BUTTON: + vDefaultButtonAction(pMouse->window); + break; + case CHOICES_SAVE_BUTTON: + vSaveButtonAction(); + break; + case CHOICES_CANCEL_BUTTON: + bCloseWindow = TRUE; + break; + case CHOICES_APPLY_BUTTON: + vApplyButtonAction(); + bCloseWindow = TRUE; + break; + case CHOICES_BREAK_BUTTON: + vSetParagraphBreak(pMouse->window, DEFAULT_SCREEN_WIDTH); + break; + case CHOICES_BREAK_UP_BUTTON: + vChangeParagraphBreak(pMouse->window, 1); + break; + case CHOICES_BREAK_DOWN_BUTTON: + vChangeParagraphBreak(pMouse->window, -1); + break; + case CHOICES_NO_BREAK_BUTTON: + vSetParagraphBreak(pMouse->window, 0); + break; + case CHOICES_AUTOFILETYPE_BUTTON: + vChangeAutofiletype(pMouse->window); + break; + case CHOICES_HIDDEN_TEXT_BUTTON: + vChangeHiddenText(pMouse->window); + break; + case CHOICES_WITH_IMAGES_BUTTON: + vUseFontsImages(TRUE, TRUE); + break; + case CHOICES_NO_IMAGES_BUTTON: + vUseFontsImages(TRUE, FALSE); + break; + case CHOICES_TEXTONLY_BUTTON: + vUseFontsImages(FALSE, FALSE); + break; + case CHOICES_SCALE_UP_BUTTON: + vChangeScaleFactor(pMouse->window, 5); + break; + case CHOICES_SCALE_DOWN_BUTTON: + vChangeScaleFactor(pMouse->window, -5); + break; + default: + DBG_DEC(pMouse->icon); + break; + } + if (bCloseWindow) { + Error_CheckFatal(Wimp_CloseWindow(pMouse->window)); + } + return TRUE; +} /* end of bChoicesMouseClick */ + +/* + * bChoicesKeyPressed - handle a key in the Choices window + */ +BOOL +bChoicesKeyPressed(event_pollblock *pEvent, void *pvReference) +{ + icon_block tIcon; + caret_block *pCaret; + char *pcChar; + int iNumber; + + DBG_MSG("bChoicesKeyPressed"); + + fail(pEvent == NULL); + fail(pEvent->type != event_KEY); + + if (pEvent->data.key.code != '\r') { + Error_CheckFatal(Wimp_ProcessKey(pEvent->data.key.code)); + return TRUE; + } + + pCaret = &pEvent->data.key.caret; + + Error_CheckFatal(Wimp_GetIconState(pCaret->window, pCaret->icon, &tIcon)); + if (!tIcon.flags.data.text || !tIcon.flags.data.indirected) { + werr(1, "Icon %d must be indirected text", (int)pCaret->icon); + } + iNumber = (int)strtol(tIcon.data.indirecttext.buffer, &pcChar, 10); + + switch(pCaret->icon) { + case CHOICES_BREAK_WRITEABLE: + if (*pcChar != '\0' && *pcChar != '\r') { + DBG_DEC(*pcChar); + iNumber = DEFAULT_SCREEN_WIDTH; + } else if (iNumber < MIN_SCREEN_WIDTH) { + iNumber = MIN_SCREEN_WIDTH; + } else if (iNumber > MAX_SCREEN_WIDTH) { + iNumber = MAX_SCREEN_WIDTH; + } + vSetParagraphBreak(pCaret->window, iNumber); + break; + case CHOICES_SCALE_WRITEABLE: + if (*pcChar != '\0' && *pcChar != '\r') { + DBG_DEC(*pcChar); + iNumber = DEFAULT_SCALE_FACTOR; + } else if (iNumber < MIN_SCALE_FACTOR) { + iNumber = MIN_SCALE_FACTOR; + } else if (iNumber > MAX_SCALE_FACTOR) { + iNumber = MAX_SCALE_FACTOR; + } + vSetScaleFactor(pCaret->window, iNumber); + break; + default: + DBG_DEC(pCaret->icon); + break; + } + return TRUE; +} /* end of bChoicesKeyPressed */ +#endif /* __riscos */ |