mirror of
https://github.com/simon987/antiword.git
synced 2025-04-10 13:06:41 +00:00
951 lines
24 KiB
C
951 lines
24 KiB
C
/*
|
|
* 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 */
|