home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / anwor032.zip / antiword.0.32 / options.c < prev    next >
C/C++ Source or Header  |  2001-07-23  |  19KB  |  748 lines

  1. /*
  2.  * options.c
  3.  * Copyright (C) 1998-2001 A.J. van Os; Released under GPL
  4.  *
  5.  * Description:
  6.  * Read and write the options
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #if defined(__riscos)
  13. #include "wimpt.h"
  14. #else
  15. #include <stdlib.h>
  16. #if defined(__dos)
  17. extern int getopt(int, char **, const char *);
  18. #else
  19. #include <unistd.h>
  20. #endif /* __dos */
  21. #endif /* __riscos */
  22. #include "antiword.h"
  23.  
  24. #if defined(__riscos)
  25. #define PARAGRAPH_BREAK        "set paragraph_break=%d"
  26. #define AUTOFILETYPE        "set autofiletype_allowed=%d"
  27. #define USE_OUTLINEFONTS    "set use_outlinefonts=%d"
  28. #define SHOW_IMAGES        "set show_images=%d"
  29. #define HIDE_HIDDEN_TEXT    "set hide_hidden_text=%d"
  30. #define SCALE_FACTOR_START    "set scale_factor_start=%d"
  31. #endif /* __riscos */
  32.  
  33. /* Current values for options */
  34. static options_type    tOptionsCurr;
  35. #if defined(__riscos)
  36. /* Temporary values for options */
  37. static options_type    tOptionsTemp;
  38. #else
  39. typedef struct papersize_tag {
  40.     char        szName[16];    /* Papersize name */
  41.     unsigned short    usWidth;    /* In points */
  42.     unsigned short    usHeight;    /* In points */
  43. } papersize_type;
  44.  
  45. static const papersize_type atPaperSizes[] = {
  46.     {    "10x14",     720,    1008    },
  47.     {    "a3",         842,    1191    },
  48.     {    "a4",         595,     842    },
  49.     {    "a5",         420,     595    },
  50.     {    "b4",         729,    1032    },
  51.     {    "b5",         516,     729    },
  52.     {    "executive",     540,     720    },
  53.     {    "folio",     612,     936    },
  54.     {    "legal",     612,    1008    },
  55.     {    "letter",     612,     792    },
  56.     {    "note",         540,     720    },
  57.     {    "quarto",     610,     780    },
  58.     {    "statement",     396,     612    },
  59.     {    "tabloid",     792,    1224    },
  60.     {    "",           0,       0    },
  61. };
  62. #endif /* __riscos */
  63. /* Default values for options */
  64. static const options_type    tOptionsDefault = {
  65.     DEFAULT_SCREEN_WIDTH,
  66. #if defined(__riscos)
  67.     TRUE,
  68. #else
  69.     FALSE,
  70. #endif /* __riscos */
  71.     TRUE,
  72.     FALSE,
  73.     encoding_iso_8859_1,
  74.     INT_MAX,
  75.     INT_MAX,
  76.     level_default,
  77. #if defined(__riscos)
  78.     TRUE,
  79.     DEFAULT_SCALE_FACTOR,
  80. #endif /* __riscos */
  81. };
  82.  
  83.  
  84. /*
  85.  * iReadOptions - read options
  86.  *
  87.  * returns:    -1: error
  88.  *         0: help
  89.  *        >0: index first file argument
  90.  */
  91. int
  92. iReadOptions(int argc, char **argv)
  93. {
  94. #if defined(__riscos)
  95.     FILE    *pFile;
  96.     char    szLine[81];
  97. #else
  98.     extern    char    *optarg;
  99.     extern int    optind;
  100.     const papersize_type    *pPaperSize;
  101.     const char    *szHome;
  102.     char    *pcChar, *szTmp;
  103.     int    iChar;
  104.     BOOL    bPostScript, bFound;
  105.     char    szLeafname[32+1];
  106.     char    szMappingFile[PATH_MAX+1];
  107. #endif /* __riscos */
  108.     int    iTmp;
  109.  
  110.     DBG_MSG("iReadOptions");
  111.  
  112. /* Defaults */
  113.     tOptionsCurr = tOptionsDefault;
  114.  
  115. #if defined(__riscos)
  116. /* Choices file */
  117.     pFile = fopen("<AntiWord$ChoicesFile>", "r");
  118.     DBG_MSG_C(pFile == NULL, "Choices file not found");
  119.     DBG_HEX_C(pFile != NULL, pFile);
  120.     if (pFile != NULL) {
  121.         while (fgets(szLine, (int)sizeof(szLine), pFile) != NULL) {
  122.             DBG_MSG(szLine);
  123.             if (szLine[0] == '#' ||
  124.                 szLine[0] == '\r' ||
  125.                 szLine[0] == '\n') {
  126.                 continue;
  127.             }
  128.             if (sscanf(szLine, PARAGRAPH_BREAK, &iTmp) == 1 &&
  129.                 (iTmp == 0 ||
  130.                 (iTmp >= MIN_SCREEN_WIDTH &&
  131.                  iTmp <= MAX_SCREEN_WIDTH))) {
  132.                 tOptionsCurr.iParagraphBreak = iTmp;
  133.                 DBG_DEC(tOptionsCurr.iParagraphBreak);
  134.             } else if (sscanf(szLine, AUTOFILETYPE, &iTmp)
  135.                                 == 1) {
  136.                 tOptionsCurr.bAutofiletypeAllowed =
  137.                                 iTmp != 0;
  138.                 DBG_DEC(tOptionsCurr.bAutofiletypeAllowed);
  139.             } else if (sscanf(szLine, USE_OUTLINEFONTS, &iTmp)
  140.                                 == 1) {
  141.                 tOptionsCurr.bUseOutlineFonts = iTmp != 0;
  142.                 DBG_DEC(tOptionsCurr.bUseOutlineFonts);
  143.             } else if (sscanf(szLine, SHOW_IMAGES, &iTmp)
  144.                                 == 1) {
  145.                 tOptionsCurr.eImageLevel = iTmp != 0 ?
  146.                     level_default : level_no_images;
  147.             } else if (sscanf(szLine, HIDE_HIDDEN_TEXT, &iTmp)
  148.                                 == 1) {
  149.                 tOptionsCurr.bHideHiddenText = iTmp != 0;
  150.                 DBG_DEC(tOptionsCurr.bHideHiddenText);
  151.             } else if (sscanf(szLine, SCALE_FACTOR_START, &iTmp)
  152.                                 == 1) {
  153.                 if (iTmp >= MIN_SCALE_FACTOR &&
  154.                     iTmp <= MAX_SCALE_FACTOR) {
  155.                     tOptionsCurr.iScaleFactor = iTmp;
  156.                 }
  157.             }
  158.         }
  159.         (void)fclose(pFile);
  160.     }
  161.     if (bReadCharacterMappingTable("<AntiWord$MappingFile>")) {
  162.         return 1;
  163.     }
  164.     return -1;
  165. #else
  166. /* Environment */
  167.     szTmp = getenv("COLUMNS");
  168.     if (szTmp != NULL) {
  169.         DBG_MSG(szTmp);
  170.         iTmp = (int)strtol(szTmp, &pcChar, 10);
  171.         if (*pcChar == '\0') {
  172.             iTmp -= 4;    /* This is for the edge */
  173.             if (iTmp < MIN_SCREEN_WIDTH) {
  174.                 iTmp = MIN_SCREEN_WIDTH;
  175.             } else if (iTmp > MAX_SCREEN_WIDTH) {
  176.                 iTmp = MAX_SCREEN_WIDTH;
  177.             }
  178.             tOptionsCurr.iParagraphBreak = iTmp;
  179.             DBG_DEC(tOptionsCurr.iParagraphBreak);
  180.         }
  181.     }
  182.     if (is_locale_utf8()) {
  183.         tOptionsCurr.eEncoding = encoding_utf8;
  184.         strcpy(szLeafname, MAPPING_FILE_DEFAULT_8);
  185.     } else {
  186.         tOptionsCurr.eEncoding = encoding_iso_8859_1;
  187.         strcpy(szLeafname, MAPPING_FILE_DEFAULT_1);
  188.     }
  189. /* Command line */
  190.     bPostScript = FALSE;
  191.     while ((iChar = getopt(argc, argv, "LX:hi:m:p:stw:")) != -1) {
  192.         switch (iChar) {
  193.         case 'L':
  194.             tOptionsCurr.bUseLandscape = TRUE;
  195.             break;
  196.         case 'X':
  197.             iTmp = (int)strtol(optarg, &pcChar, 10);
  198.             switch (iTmp) {
  199.             case 1:
  200.                 tOptionsCurr.eEncoding = encoding_iso_8859_1;
  201.                 strcpy(szLeafname, MAPPING_FILE_DEFAULT_1);
  202.                 break;
  203.             case 2:
  204.                 tOptionsCurr.eEncoding = encoding_iso_8859_2;
  205.                 strcpy(szLeafname, MAPPING_FILE_DEFAULT_2);
  206.                 break;
  207.             default:
  208.                 /* Ignore */
  209.                 break;
  210.             }
  211.             DBG_MSG(szLeafname);
  212.             break;
  213.         case 'h':
  214.             return 0;
  215.         case 'i':
  216.             iTmp = (int)strtol(optarg, &pcChar, 10);
  217.             if (*pcChar != '\0') {
  218.                 break;
  219.             }
  220.             switch (iTmp) {
  221.             case 0:
  222.                 tOptionsCurr.eImageLevel = level_gs_special;
  223.                 break;
  224.             case 1:
  225.                 tOptionsCurr.eImageLevel = level_no_images;
  226.                 break;
  227.             case 2:
  228.                 tOptionsCurr.eImageLevel = level_ps_2;
  229.                 break;
  230.             case 3:
  231.                 tOptionsCurr.eImageLevel = level_ps_3;
  232.                 break;
  233.             default:
  234.                 tOptionsCurr.eImageLevel = level_default;
  235.                 break;
  236.             }
  237.             DBG_DEC(tOptionsCurr.eImageLevel);
  238.             break;
  239.         case 'm':
  240.             strncpy(szLeafname, optarg, sizeof(szLeafname) - 1);
  241.             szLeafname[sizeof(szLeafname) - 1] = '\0';
  242.             DBG_MSG(szLeafname);
  243.             if (STREQ(szLeafname, MAPPING_FILE_DEFAULT_8)) {
  244.                 tOptionsCurr.eEncoding = encoding_utf8;
  245.             } else if (STREQ(szLeafname, MAPPING_FILE_DEFAULT_2)) {
  246.                 tOptionsCurr.eEncoding = encoding_iso_8859_2;
  247.             } else {
  248.                 tOptionsCurr.eEncoding = encoding_iso_8859_1;
  249.             }
  250.             DBG_DEC(tOptionsCurr.eEncoding);
  251.             break;
  252.         case 'p':
  253.             bPostScript = TRUE;
  254.             bFound = FALSE;
  255.             for (pPaperSize = atPaperSizes;
  256.                  pPaperSize->szName[0] != '\0';
  257.                  pPaperSize++) {
  258.                 if (!STREQ(pPaperSize->szName,  optarg)) {
  259.                     continue;
  260.                 }
  261.                 DBG_DEC(pPaperSize->usWidth);
  262.                 DBG_DEC(pPaperSize->usHeight);
  263.                 tOptionsCurr.bUseOutlineFonts = TRUE;
  264.                 tOptionsCurr.iPageHeight =
  265.                         (int)pPaperSize->usHeight;
  266.                 tOptionsCurr.iPageWidth =
  267.                         (int)pPaperSize->usWidth;
  268.                 bFound = TRUE;
  269.                 break;
  270.             }
  271.             if (!bFound) {
  272.                 werr(0, "-p without a valid papersize");
  273.                 return -1;
  274.             }
  275.             break;
  276.         case 's':
  277.             tOptionsCurr.bHideHiddenText = FALSE;
  278.             break;
  279.         case 't':
  280.             tOptionsCurr.bUseOutlineFonts = FALSE;
  281.             break;
  282.         case 'w':
  283.             iTmp = (int)strtol(optarg, &pcChar, 10);
  284.             if (*pcChar == '\0') {
  285.                 if (iTmp != 0 && iTmp < MIN_SCREEN_WIDTH) {
  286.                     iTmp = MIN_SCREEN_WIDTH;
  287.                 } else if (iTmp > MAX_SCREEN_WIDTH) {
  288.                     iTmp = MAX_SCREEN_WIDTH;
  289.                 }
  290.                 tOptionsCurr.iParagraphBreak = iTmp;
  291.                 DBG_DEC(tOptionsCurr.iParagraphBreak);
  292.             }
  293.             break;
  294.         default:
  295.             return -1;
  296.         }
  297.     }
  298.     if (bPostScript) {
  299.         if (tOptionsCurr.bUseLandscape) {
  300.             /* Swap the page height and width */
  301.             iTmp = tOptionsCurr.iPageHeight;
  302.             tOptionsCurr.iPageHeight = tOptionsCurr.iPageWidth;
  303.             tOptionsCurr.iPageWidth = iTmp;
  304.         }
  305.         /*
  306.          * In PostScript mode the paragraph break depends
  307.          * on the width of the paper
  308.          */
  309.         tOptionsCurr.iParagraphBreak = iMilliPoints2Char(
  310.             (long)tOptionsCurr.iPageWidth * 1000 -
  311.             lDrawUnits2MilliPoints(
  312.                 PS_LEFT_MARGIN + PS_RIGHT_MARGIN));
  313.         DBG_DEC(tOptionsCurr.iParagraphBreak);
  314.     }
  315.     /* Try the local version of the mapping file */
  316.     szHome = szGetHomeDirectory();
  317.     if (strlen(szHome) + strlen(szLeafname) <
  318.         sizeof(szMappingFile) -
  319.         sizeof(ANTIWORD_DIR) -
  320.         2 * sizeof(FILE_SEPARATOR)) {
  321.         sprintf(szMappingFile,
  322.             "%s" FILE_SEPARATOR ANTIWORD_DIR FILE_SEPARATOR "%s",
  323.             szHome, szLeafname);
  324.         DBG_MSG(szMappingFile);
  325.         if (bReadCharacterMappingTable(szMappingFile)) {
  326.             return optind;
  327.         }
  328.     } else {
  329.         werr(0, "Local mappingfilename too long, ignored");
  330.     }
  331.     /* Try the global version of the mapping file */
  332.     if (strlen(szLeafname) <
  333.         sizeof(szMappingFile) -
  334.         sizeof(GLOBAL_ANTIWORD_DIR) -
  335.         sizeof(FILE_SEPARATOR)) {
  336.         sprintf(szMappingFile,
  337.             GLOBAL_ANTIWORD_DIR FILE_SEPARATOR "%s",
  338.             szLeafname);
  339.         DBG_MSG(szMappingFile);
  340.         if (bReadCharacterMappingTable(szMappingFile)) {
  341.             return optind;
  342.         }
  343.     } else {
  344.         werr(0, "Global mappingfilename too long, ignored");
  345.     }
  346.     werr(0, "I can't open your mapping file (%s)", szLeafname);
  347.     return -1;
  348. #endif /* __riscos */
  349. } /* end of iReadOptions */
  350.  
  351. /*
  352.  * vGetOptions - get a copy of the current option values
  353.  */
  354. void
  355. vGetOptions(options_type *pOptions)
  356. {
  357.     fail(pOptions == NULL);
  358.  
  359.     *pOptions = tOptionsCurr;
  360. } /* end of vGetOptions */
  361.  
  362. #if defined(__riscos)
  363. /*
  364.  * vWriteOptions - write the current options to the Options file
  365.  */
  366. static void
  367. vWriteOptions(void)
  368. {
  369.     FILE    *pFile;
  370.     char    *szOptionsFile;
  371.  
  372.     DBG_MSG("vWriteOptions");
  373.  
  374.     szOptionsFile = getenv("AntiWord$ChoicesSave");
  375.     if (szOptionsFile == NULL) {
  376.         werr(0, "Warning: Name of the Choices file not found");
  377.         return;
  378.     }
  379.     if (!bMakeDirectory(szOptionsFile)) {
  380.         werr(0,
  381.         "Warning: I can't make a directory for the Choices file");
  382.         return;
  383.     }
  384.     pFile = fopen(szOptionsFile, "w");
  385.     if (pFile == NULL) {
  386.         werr(0, "Warning: I can't write the Choices file");
  387.         return;
  388.     }
  389.     (void)fprintf(pFile, PARAGRAPH_BREAK"\n",
  390.         tOptionsCurr.iParagraphBreak);
  391.     (void)fprintf(pFile, AUTOFILETYPE"\n",
  392.         tOptionsCurr.bAutofiletypeAllowed);
  393.     (void)fprintf(pFile, USE_OUTLINEFONTS"\n",
  394.         tOptionsCurr.bUseOutlineFonts);
  395.     (void)fprintf(pFile, SHOW_IMAGES"\n",
  396.         tOptionsCurr.eImageLevel == level_no_images ? 0 : 1);
  397.     (void)fprintf(pFile, HIDE_HIDDEN_TEXT"\n",
  398.         tOptionsCurr.bHideHiddenText);
  399.     (void)fprintf(pFile, SCALE_FACTOR_START"\n",
  400.         tOptionsCurr.iScaleFactor);
  401.     (void)fclose(pFile);
  402. } /* end of vWriteOptions */
  403.  
  404. /*
  405.  * vChoicesOpenAction - action to be taken when the Choices window opens
  406.  */
  407. void
  408. vChoicesOpenAction(wimp_w tWindow)
  409. {
  410.     DBG_MSG("vChoicesOpenAction");
  411.  
  412.     tOptionsTemp = tOptionsCurr;
  413.     if (tOptionsTemp.iParagraphBreak == 0) {
  414.         vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, FALSE);
  415.         vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, TRUE);
  416.         vUpdateWriteableNumber(tWindow, CHOICES_BREAK_WRITEABLE,
  417.                     DEFAULT_SCREEN_WIDTH);
  418.     } else {
  419.         vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, TRUE);
  420.         vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, FALSE);
  421.         vUpdateWriteableNumber(tWindow,
  422.             CHOICES_BREAK_WRITEABLE,
  423.             tOptionsTemp.iParagraphBreak);
  424.     }
  425.     vUpdateRadioButton(tWindow, CHOICES_AUTOFILETYPE_BUTTON,
  426.                     tOptionsTemp.bAutofiletypeAllowed);
  427.     vUpdateRadioButton(tWindow, CHOICES_HIDDEN_TEXT_BUTTON,
  428.                     tOptionsTemp.bHideHiddenText);
  429.     if (tOptionsTemp.bUseOutlineFonts) {
  430.         vUpdateRadioButton(tWindow,
  431.             CHOICES_WITH_IMAGES_BUTTON,
  432.             tOptionsTemp.eImageLevel != level_no_images);
  433.         vUpdateRadioButton(tWindow,
  434.             CHOICES_NO_IMAGES_BUTTON,
  435.             tOptionsTemp.eImageLevel == level_no_images);
  436.         vUpdateRadioButton(tWindow,
  437.             CHOICES_TEXTONLY_BUTTON, FALSE);
  438.     } else {
  439.         vUpdateRadioButton(tWindow,
  440.             CHOICES_WITH_IMAGES_BUTTON, FALSE);
  441.         vUpdateRadioButton(tWindow,
  442.             CHOICES_NO_IMAGES_BUTTON, FALSE);
  443.         vUpdateRadioButton(tWindow,
  444.             CHOICES_TEXTONLY_BUTTON, TRUE);
  445.     }
  446.     vUpdateWriteableNumber(tWindow,
  447.         CHOICES_SCALE_WRITEABLE, tOptionsTemp.iScaleFactor);
  448. } /* end of vChoicesOpenAction */
  449.  
  450. /*
  451.  * vDefaultButtonAction - action when the default button is clicked
  452.  */
  453. static void
  454. vDefaultButtonAction(wimp_w tWindow)
  455. {
  456.     DBG_MSG("vDefaultButtonAction");
  457.  
  458.     tOptionsTemp = tOptionsDefault;
  459.     vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, TRUE);
  460.     vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, FALSE);
  461.     vUpdateWriteableNumber(tWindow, CHOICES_BREAK_WRITEABLE,
  462.                 tOptionsTemp.iParagraphBreak);
  463.     vUpdateRadioButton(tWindow, CHOICES_AUTOFILETYPE_BUTTON,
  464.                 tOptionsTemp.bAutofiletypeAllowed);
  465.     vUpdateRadioButton(tWindow, CHOICES_HIDDEN_TEXT_BUTTON,
  466.                 tOptionsTemp.bHideHiddenText);
  467.     vUpdateRadioButton(tWindow, CHOICES_WITH_IMAGES_BUTTON,
  468.                 tOptionsTemp.bUseOutlineFonts &&
  469.                 tOptionsTemp.eImageLevel != level_no_images);
  470.     vUpdateRadioButton(tWindow, CHOICES_NO_IMAGES_BUTTON,
  471.                 tOptionsTemp.bUseOutlineFonts &&
  472.                 tOptionsTemp.eImageLevel == level_no_images);
  473.     vUpdateRadioButton(tWindow, CHOICES_TEXTONLY_BUTTON,
  474.                 !tOptionsTemp.bUseOutlineFonts);
  475.     vUpdateWriteableNumber(tWindow, CHOICES_SCALE_WRITEABLE,
  476.                 tOptionsTemp.iScaleFactor);
  477. } /* end of vDefaultButtonAction */
  478.  
  479. /*
  480.  * vApplyButtonAction - action to be taken when the OK button is clicked
  481.  */
  482. static void
  483. vApplyButtonAction(void)
  484. {
  485.     DBG_MSG("vApplyButtonAction");
  486.  
  487.     tOptionsCurr = tOptionsTemp;
  488. } /* end of vApplyButtonAction */
  489.  
  490. /*
  491.  * vSaveButtonAction - action to be taken when the save button is clicked
  492.  */
  493. static void
  494. vSaveButtonAction(void)
  495. {
  496.     DBG_MSG("vSaveButtonAction");
  497.  
  498.     vApplyButtonAction();
  499.     vWriteOptions();
  500. } /* end of vSaveButtonAction */
  501.  
  502. /*
  503.  * vSetParagraphBreak - set the paragraph break to the given number
  504.  */
  505. static void
  506. vSetParagraphBreak(wimp_w tWindow, int iNumber)
  507. {
  508.     tOptionsTemp.iParagraphBreak = iNumber;
  509.     if (tOptionsTemp.iParagraphBreak == 0) {
  510.         return;
  511.     }
  512.     vUpdateWriteableNumber(tWindow,
  513.             CHOICES_BREAK_WRITEABLE,
  514.             tOptionsTemp.iParagraphBreak);
  515. } /* end of vSetParagraphBreak */
  516.  
  517. /*
  518.  * vChangeParagraphBreak - change the paragraph break with the given number
  519.  */
  520. static void
  521. vChangeParagraphBreak(wimp_w tWindow, int iNumber)
  522. {
  523.     int    iTmp;
  524.  
  525.     iTmp = tOptionsTemp.iParagraphBreak + iNumber;
  526.     if (iTmp < MIN_SCREEN_WIDTH || iTmp > MAX_SCREEN_WIDTH) {
  527.           /* Ignore */
  528.         return;
  529.     }
  530.     tOptionsTemp.iParagraphBreak = iTmp;
  531.     vUpdateWriteableNumber(tWindow,
  532.             CHOICES_BREAK_WRITEABLE,
  533.             tOptionsTemp.iParagraphBreak);
  534. } /* end of vChangeParagraphBreak */
  535.  
  536. /*
  537.  * vChangeAutofiletype - invert the permission to autofiletype
  538.  */
  539. static void
  540. vChangeAutofiletype(wimp_w tWindow)
  541. {
  542.     tOptionsTemp.bAutofiletypeAllowed =
  543.                 !tOptionsTemp.bAutofiletypeAllowed;
  544.     vUpdateRadioButton(tWindow,
  545.             CHOICES_AUTOFILETYPE_BUTTON,
  546.             tOptionsTemp.bAutofiletypeAllowed);
  547. } /* end of vChangeAutofiletype */
  548.  
  549. /*
  550.  * vChangeHiddenText - invert the hide/show hidden text
  551.  */
  552. static void
  553. vChangeHiddenText(wimp_w tWindow)
  554. {
  555.     tOptionsTemp.bHideHiddenText = !tOptionsTemp.bHideHiddenText;
  556.     vUpdateRadioButton(tWindow,
  557.             CHOICES_HIDDEN_TEXT_BUTTON,
  558.             tOptionsTemp.bHideHiddenText);
  559. } /* end of vChangeHiddenText */
  560.  
  561. /*
  562.  * vUseFontsImages - use outline fonts, show images
  563.  */
  564. static void
  565. vUseFontsImages(BOOL bUseOutlineFonts, BOOL bShowImages)
  566. {
  567.     tOptionsTemp.bUseOutlineFonts = bUseOutlineFonts;
  568.     tOptionsTemp.eImageLevel =
  569.         bUseOutlineFonts && bShowImages ?
  570.         level_default : level_no_images;
  571. } /* end of vUseFontsImages */
  572.  
  573. /*
  574.  * vSetScaleFactor - set the scale factor to the given number
  575.  */
  576. static void
  577. vSetScaleFactor(wimp_w tWindow, int iNumber)
  578. {
  579.       tOptionsTemp.iScaleFactor = iNumber;
  580.     vUpdateWriteableNumber(tWindow,
  581.             CHOICES_SCALE_WRITEABLE,
  582.             tOptionsTemp.iScaleFactor);
  583. } /* end of vSetScaleFactor */
  584.  
  585. /*
  586.  * vChangeScaleFactor - change the scale factor with the given number
  587.  */
  588. static void
  589. vChangeScaleFactor(wimp_w tWindow, int iNumber)
  590. {
  591.     int    iTmp;
  592.  
  593.     iTmp = tOptionsTemp.iScaleFactor + iNumber;
  594.     if (iTmp < MIN_SCALE_FACTOR || iTmp > MAX_SCALE_FACTOR) {
  595.           /* Ignore */
  596.         return;
  597.     }
  598.     tOptionsTemp.iScaleFactor = iTmp;
  599.     vUpdateWriteableNumber(tWindow,
  600.             CHOICES_SCALE_WRITEABLE,
  601.             tOptionsTemp.iScaleFactor);
  602. } /* end of vChangeScaleFactor */
  603.  
  604. /*
  605.  * bChoicesMouseClick - handle a mouse click in the Choices window
  606.  */
  607. void
  608. vChoicesMouseClick(wimp_mousestr *m)
  609. {
  610.     wimp_i    tAction;
  611.     BOOL    bCloseWindow, bLeft, bRight;
  612.  
  613.     bLeft = (m->bbits & wimp_BLEFT) == wimp_BLEFT;
  614.     bRight = (m->bbits & wimp_BRIGHT) == wimp_BRIGHT;
  615.     if (!bLeft && !bRight) {
  616.         DBG_HEX(m->bbits);
  617.         return;
  618.     }
  619.  
  620.     /* Which action should be taken */
  621.     tAction = m->i;
  622.     if (bRight) {
  623.           /* The right button reverses the direction */
  624.         switch (m->i) {
  625.         case CHOICES_BREAK_UP_BUTTON:
  626.             tAction = CHOICES_BREAK_DOWN_BUTTON;
  627.             break;
  628.         case CHOICES_BREAK_DOWN_BUTTON:
  629.             tAction = CHOICES_BREAK_UP_BUTTON;
  630.             break;
  631.         case CHOICES_SCALE_UP_BUTTON:
  632.             tAction = CHOICES_SCALE_DOWN_BUTTON;
  633.             break;
  634.         case CHOICES_SCALE_DOWN_BUTTON:
  635.             tAction = CHOICES_SCALE_UP_BUTTON;
  636.             break;
  637.         default:
  638.             break;
  639.         }
  640.     }
  641.  
  642.     /* Actions */
  643.     bCloseWindow = FALSE;
  644.     switch (tAction) {
  645.     case CHOICES_DEFAULT_BUTTON:
  646.         vDefaultButtonAction(m->w);
  647.         break;
  648.     case CHOICES_SAVE_BUTTON:
  649.         vSaveButtonAction();
  650.         break;
  651.     case CHOICES_CANCEL_BUTTON:
  652.         bCloseWindow = TRUE;
  653.         break;
  654.     case CHOICES_APPLY_BUTTON:
  655.         vApplyButtonAction();
  656.         bCloseWindow = TRUE;
  657.         break;
  658.     case CHOICES_BREAK_BUTTON:
  659.         vSetParagraphBreak(m->w, DEFAULT_SCREEN_WIDTH);
  660.         break;
  661.     case CHOICES_BREAK_UP_BUTTON:
  662.         vChangeParagraphBreak(m->w, 1);
  663.         break;
  664.     case CHOICES_BREAK_DOWN_BUTTON:
  665.         vChangeParagraphBreak(m->w, -1);
  666.         break;
  667.     case CHOICES_NO_BREAK_BUTTON:
  668.         vSetParagraphBreak(m->w, 0);
  669.         break;
  670.     case CHOICES_AUTOFILETYPE_BUTTON:
  671.         vChangeAutofiletype(m->w);
  672.         break;
  673.     case CHOICES_HIDDEN_TEXT_BUTTON:
  674.         vChangeHiddenText(m->w);
  675.         break;
  676.     case CHOICES_WITH_IMAGES_BUTTON:
  677.         vUseFontsImages(TRUE, TRUE);
  678.         break;
  679.     case CHOICES_NO_IMAGES_BUTTON:
  680.         vUseFontsImages(TRUE, FALSE);
  681.         break;
  682.     case CHOICES_TEXTONLY_BUTTON:
  683.         vUseFontsImages(FALSE, FALSE);
  684.         break;
  685.     case CHOICES_SCALE_UP_BUTTON:
  686.         vChangeScaleFactor(m->w, 5);
  687.         break;
  688.     case CHOICES_SCALE_DOWN_BUTTON:
  689.         vChangeScaleFactor(m->w, -5);
  690.         break;
  691.     default:
  692.         DBG_DEC(m->i);
  693.         break;
  694.     }
  695.     if (bCloseWindow) {
  696.         wimpt_noerr(wimp_close_wind(m->w));
  697.     }
  698. } /* end of vChoicesMouseClick */
  699.  
  700. void
  701. vChoicesKeyPressed(wimp_caretstr *c)
  702. {
  703.     wimp_icon    tIcon;
  704.     char        *pcChar;
  705.     int        iNumber;
  706.  
  707.     DBG_MSG("vChoicesKeyPressed");
  708.  
  709.     fail(c == NULL);
  710.  
  711.     wimpt_noerr(wimp_get_icon_info(c->w, c->i, &tIcon));
  712.     if ((tIcon.flags & (wimp_ITEXT|wimp_INDIRECT)) !=
  713.         (wimp_ITEXT|wimp_INDIRECT)) {
  714.         werr(1, "Icon %d must be indirected text", (int)c->i);
  715.         return;
  716.     }
  717.     iNumber = (int)strtol(tIcon.data.indirecttext.buffer, &pcChar, 10);
  718.  
  719.     switch(c->i) {
  720.     case CHOICES_BREAK_WRITEABLE:
  721.         if (*pcChar != '\0' && *pcChar != '\r') {
  722.             DBG_DEC(*pcChar);
  723.             iNumber = DEFAULT_SCREEN_WIDTH;
  724.         } else if (iNumber < MIN_SCREEN_WIDTH) {
  725.             iNumber = MIN_SCREEN_WIDTH;
  726.         } else if (iNumber > MAX_SCREEN_WIDTH) {
  727.             iNumber = MAX_SCREEN_WIDTH;
  728.         }
  729.         vSetParagraphBreak(c->w, iNumber);
  730.         break;
  731.     case CHOICES_SCALE_WRITEABLE:
  732.         if (*pcChar != '\0' && *pcChar != '\r') {
  733.             DBG_DEC(*pcChar);
  734.             iNumber = DEFAULT_SCALE_FACTOR;
  735.         } else if (iNumber < MIN_SCALE_FACTOR) {
  736.             iNumber = MIN_SCALE_FACTOR;
  737.         } else if (iNumber > MAX_SCALE_FACTOR) {
  738.             iNumber = MAX_SCALE_FACTOR;
  739.         }
  740.         vSetScaleFactor(c->w, iNumber);
  741.         break;
  742.     default:
  743.         DBG_DEC(c->i);
  744.         break;
  745.     }
  746. } /* end of vChoicesKeyPressed */
  747. #endif /* __riscos */
  748.