/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community. If not, see .
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see
* or contact Peter Baumann via .
/
/**
* PURPOSE:
*
* Management of rView's preferences. This includes an object encapsulating
* the preferences and providing IO of these preferences (rviewPrefs) and a
* frame class that allows displaying / editing the current preferences
* (rviewPrefsWindow).
*
* COMMENTS:
* none
*/
// Standard wxWindows preamble.
#ifdef __GNUG__
#pragma implementation
#endif
// changed in wxWindows 2.4.2:
//#include "wx_prec.h"
#include
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include
#endif
#include
#include
#include
#include
#include
#ifdef EARLY_TEMPLATE
#define __EXECUTABLE__
#endif
#include "raslib/rmdebug.hh"
#include "compression/tilecompression.hh"
#include "rviewPrefs.hh"
#include "labelManager.hh"
rviewPrefs *prefs;
enum prefsVarId {
PVar_Void,
PVar_ServerName,
PVar_ServerPort,
PVar_DBName,
PVar_UserName,
PVar_LastColl,
PVar_LastScColl,
PVar_LastOrColl,
PVar_LastDisp,
PVar_FilePath,
PVar_QueryPath,
PVar_QueryFont,
PVar_MaxDWidth,
PVar_MaxDHeight,
PVar_VffParams,
PVar_ImgDither,
PVar_DitherBest,
PVar_RGBSpace,
PVar_MovieMode,
PVar_ImgMode,
PVar_ImgBBox,
PVar_ImgZpro,
PVar_ImgClipZ,
PVar_ImgScale,
PVar_ImgPTL,
PVar_ImgPTH,
PVar_ImgWT,
PVar_ImgWQ,
PVar_ImgRGBBr,
PVar_ImgVoxType,
PVar_ImgLight,
PVar_ImgLightAn,
PVar_ImgLightSc,
PVar_ImgLightAm,
PVar_ImgLightGn,
PVar_ImgKernSz,
PVar_ImgKernTp,
PVar_ImgUseVCol,
PVar_ImgVoxCol,
PVar_ImgLightDs,
PVar_ImgLightDr,
PVar_ImgHgtGrd,
PVar_ImgHgtScl,
PVar_ImgOrtBBox,
PVar_ImgOrtDrag,
PVar_ImgOrtThick,
PVar_ChartMode,
PVar_ChartCosys,
PVar_ChartStep,
PVar_ChartMarkX,
PVar_ChartMarkY,
PVar_TableMode,
PVar_TableCosys,
PVar_TableStepX,
PVar_TableStepY,
PVar_ThumbPDim,
PVar_ThumbPStep,
PVar_ThumbWidth,
PVar_ThumbCols,
PVar_SoundFrq,
PVar_SoundLat,
PVar_SoundLoop,
PVar_CMpeakR,
PVar_CMpeakG,
PVar_CMpeakB,
PVar_CMsigmR,
PVar_CMsigmG,
PVar_CMsigmB,
PVar_CMtype,
PVar_ComTrFmt,
PVar_ComTrParm,
PVar_ComStFmt,
PVar_ComStParm,
PVar_NUMBER
};
const keyword_to_ident_c rviewPrefs::prefsVarDesc[] = {
{PVar_ServerName, "serverName"},
{PVar_ServerPort, "serverPort"},
{PVar_DBName, "databaseName"},
{PVar_UserName, "userName"},
{PVar_LastColl, "lastCollection"},
{PVar_LastScColl, "lastScaledColl"},
{PVar_LastOrColl, "lastOrthoColl"},
{PVar_LastDisp, "lastDisplay"},
{PVar_FilePath, "filePath"},
{PVar_QueryPath, "queryPath"},
{PVar_QueryFont, "queryFont"},
{PVar_MaxDWidth, "maxDWidth"},
{PVar_MaxDHeight, "maxDHeight"},
{PVar_VffParams, "vffParams"},
{PVar_ImgDither, "imgDither"},
{PVar_DitherBest, "ditherBest"},
{PVar_RGBSpace, "rgbSpace"},
{PVar_MovieMode, "movieMode"},
{PVar_ImgMode, "imageMode"},
{PVar_ImgBBox, "imageBBox"},
{PVar_ImgZpro, "imageZpro"},
{PVar_ImgClipZ, "imageClipz"},
{PVar_ImgScale, "imageScale"},
{PVar_ImgPTL, "imagePixThreshLow"},
{PVar_ImgPTH, "imagePixThreshHigh"},
{PVar_ImgWT, "imageWgtThresh"},
{PVar_ImgWQ, "imageWgtQuant"},
{PVar_ImgRGBBr, "imageRgbBrightness"},
{PVar_ImgVoxType, "voxelSetupForType"},
{PVar_ImgLight, "imageLight"},
{PVar_ImgLightAn, "imageLightAngle"},
{PVar_ImgLightSc, "imageLightScintAng"},
{PVar_ImgLightAm, "imageLightAmbient"},
{PVar_ImgLightGn, "imageLightGain"},
{PVar_ImgKernSz, "imageKernelSize"},
{PVar_ImgKernTp, "imageKernelType"},
{PVar_ImgUseVCol, "imageUseVCol"},
{PVar_ImgVoxCol, "imageVoxColour"},
{PVar_ImgLightDr, "imageLightDir"},
{PVar_ImgLightDs, "imageLightDist"},
{PVar_ImgHgtGrd, "imageHeightGrid"},
{PVar_ImgHgtScl, "imageHeightScale"},
{PVar_ImgOrtBBox, "imageOrthoBBox"},
{PVar_ImgOrtDrag, "imageOrthoFireDragRel"},
{PVar_ImgOrtThick, "imageOrthoThickness"},
{PVar_ChartMode, "chartMode"},
{PVar_ChartCosys, "chartCosys"},
{PVar_ChartStep, "chartStep"},
{PVar_ChartMarkX, "chartMarkx"},
{PVar_ChartMarkY, "chartMarky"},
{PVar_TableMode, "tableMode"},
{PVar_TableCosys, "tableCosys"},
{PVar_TableStepX, "tableStepx"},
{PVar_TableStepY, "tableStepy"},
{PVar_ThumbPDim, "thumbProjdim"},
{PVar_ThumbPStep, "thumbProjstep"},
{PVar_ThumbWidth, "thumbWidth"},
{PVar_ThumbCols, "thumbCols"},
{PVar_SoundFrq, "soundFrequency"},
{PVar_SoundLat, "soundLatency"},
{PVar_SoundLoop, "soundLoop"},
{PVar_CMpeakR, "cspacePeakRed"},
{PVar_CMpeakG, "cspacePeakGreen"},
{PVar_CMpeakB, "cspacePeakBlue"},
{PVar_CMsigmR, "cspaceSigmaRed"},
{PVar_CMsigmG, "cspaceSigmaGreen"},
{PVar_CMsigmB, "cspaceSigmaBlue"},
{PVar_CMtype, "cspaceType"},
{PVar_ComTrFmt, "transferFormat"},
{PVar_ComTrParm, "transferParameters"},
{PVar_ComStFmt, "storageFormat"},
{PVar_ComStParm, "storageParameters"},
{PVar_Void, NULL}
};
/*
* rviewPrefs members
*/
const unsigned long rviewPrefs::buffExtendGranularity = 64;
rviewPrefs::rviewPrefs(void)
{
setupVariables();
}
// Load-constructor
rviewPrefs::rviewPrefs(const char *file)
{
setupVariables();
load(file);
}
// Copy-constructor
rviewPrefs::rviewPrefs(const rviewPrefs &srcPrefs)
{
setupVariables();
copyPrefs(srcPrefs, *this);
}
void rviewPrefs::copyPrefs(const rviewPrefs &src, rviewPrefs &dest)
{
dest.serverName = src.serverName;
dest.serverPort = src.serverPort;
dest.databaseName = src.databaseName;
dest.userName = src.userName;
dest.lastColl = src.lastColl;
dest.lastScColl = src.lastScColl;
dest.lastOrthoColl = src.lastOrthoColl;
dest.filePath = src.filePath;
dest.queryPath = src.queryPath;
dest.queryFont = src.queryFont;
dest.lastDisplay = src.lastDisplay;
dest.maxDWidth = src.maxDWidth;
dest.maxDHeight = src.maxDHeight;
dest.vffParams = src.vffParams;
dest.imgDither = src.imgDither;
dest.ditherBest = src.ditherBest;
dest.rgbSpace = src.rgbSpace;
dest.movieMode = src.movieMode;
dest.imgMode = src.imgMode;
dest.imgBBox = src.imgBBox;
dest.imgZpro = src.imgZpro;
dest.imgClipz = src.imgClipz;
dest.imgScale = src.imgScale;
dest.imgPixThreshLow = src.imgPixThreshLow;
dest.imgPixThreshHigh = src.imgPixThreshHigh;
dest.imgWgtThresh = src.imgWgtThresh;
dest.imgWgtQuant = src.imgWgtQuant;
dest.imgRgbBrightness = src.imgRgbBrightness;
dest.imgVoxForType = src.imgVoxForType;
dest.imgLight = src.imgLight;
dest.imgLightAngle = src.imgLightAngle;
dest.imgLightScintAngle = src.imgLightScintAngle;
dest.imgLightAmbient = src.imgLightAmbient;
dest.imgLightGain = src.imgLightGain;
dest.imgKernSize = src.imgKernSize;
dest.imgKernType = src.imgKernType;
dest.imgUseVCol = src.imgUseVCol;
dest.imgVoxColour = src.imgVoxColour;
dest.imgLightDir = src.imgLightDir;
dest.imgLightDist = src.imgLightDist;
dest.imgHeightGrid = src.imgHeightGrid;
dest.imgHeightScale = src.imgHeightScale;
dest.imgOrthoBBox = src.imgOrthoBBox;
dest.imgOrthoDragRel = src.imgOrthoDragRel;
dest.imgOrthoThick = src.imgOrthoThick;
dest.chartMode = src.chartMode;
dest.chartCosys = src.chartCosys;
dest.chartStep = src.chartStep;
dest.chartMarkx = src.chartMarkx;
dest.chartMarky = src.chartMarky;
dest.tableMode = src.tableMode;
dest.tableCosys = src.tableCosys;
dest.tableStepx = src.tableStepx;
dest.tableStepy = src.tableStepy;
dest.thumbProjdim = src.thumbProjdim;
dest.thumbProjstep = src.thumbProjstep;
dest.thumbWidth = src.thumbWidth;
dest.thumbCols = src.thumbCols;
dest.soundFreq = src.soundFreq;
dest.soundLatency = src.soundLatency;
dest.soundLoop = src.soundLoop;
dest.transferFmt = src.transferFmt;
dest.transferParm = src.transferParm;
dest.storageFmt = src.storageFmt;
dest.storageParm = src.storageParm;
memcpy(&(dest.csp), &(src.csp), sizeof(colourspace_params));
}
rviewPrefs::~rviewPrefs(void)
{
if (pwin != NULL) {pwin->unlinkParent(); pwin->Close(TRUE);}
if (inbuff != NULL) delete [] inbuff;
}
char *rviewPrefs::getValue(char *b)
{
char *d;
// This shouldn't happen.
while (*b != '=') {if (*b == '\0') return b; b++;}
b++;
while (isspace((unsigned int)(*b))) b++;
d = b;
// Allow only printable characters
while (isprint((unsigned int)(*d))) d++;
// Make sure it's terminated by 0.
*d = '\0';
return b;
}
// read a line of arbitrary length from a file
char *rviewPrefs::readLine(FILE *fp)
{
if (inbuff == NULL)
{
buffSize = buffExtendGranularity;
inbuff = new char[buffSize];
}
inbuff[0] = '\0';
inbuff[buffSize-2] = '\0';
fgets(inbuff, buffSize, fp);
unsigned long currentOff = 0;
char last = inbuff[buffSize-2];
while ((last != '\0') && (last != '\n') && (last != '\r'))
{
unsigned long newsize = buffSize + buffExtendGranularity;
char *newbuff;
if ((newbuff = new char[newsize]) == NULL)
return NULL;
memcpy(newbuff, inbuff, buffSize-1);
currentOff = buffSize-1;
delete [] inbuff;
inbuff = newbuff; buffSize = newsize;
inbuff[currentOff] = '\0';
fgets(inbuff + currentOff, buffSize - currentOff, fp);
last = inbuff[buffSize-2];
}
return inbuff;
}
int rviewPrefs::load(const char *file)
{
FILE *fp;
char *b, *val;
int number;
if ((fp = fopen(file, "r")) == NULL)
{
prefsModified = TRUE;
return 0;
}
while (!feof(fp))
{
b = readLine(fp);
while ((*b == ' ') || (*b == '\t')) b++;
if ((*b != '\n') && (*b != '#') && (*b != 0))
{
number = 0;
while (prefsVarDesc[number].keyword != NULL)
{
int len;
len = strlen(prefsVarDesc[number].keyword);
if ((strncmp(b, prefsVarDesc[number].keyword, len) == 0) && (!isalnum(b[len]))) break;
number++;
}
if (prefsVarDesc[number].keyword == NULL)
{
cerr << "Bad line in config file: " << b << endl;
}
else
{
val = getValue(b);
switch (prefsVarDesc[number].ident)
{
case PVar_ServerName: serverName = val; break;
case PVar_ServerPort: serverPort = atoi(val); break;
case PVar_DBName: databaseName = val; break;
case PVar_UserName: userName = val; break;
case PVar_LastColl: lastColl = val; break;
case PVar_LastScColl: lastScColl = val; break;
case PVar_LastOrColl: lastOrthoColl = val; break;
case PVar_LastDisp: lastDisplay = atoi(val); break;
case PVar_FilePath: filePath = val; break;
case PVar_QueryPath: queryPath = val; break;
case PVar_QueryFont: queryFont = val; break;
case PVar_MaxDWidth: maxDWidth = atoi(val); break;
case PVar_MaxDHeight: maxDHeight = atoi(val); break;
case PVar_VffParams: vffParams = val; break;
case PVar_ImgDither: imgDither = atoi(val); break;
case PVar_DitherBest: ditherBest = atoi(val); break;
case PVar_RGBSpace: rgbSpace = atoi(val); break;
case PVar_MovieMode: movieMode = atoi(val); break;
case PVar_ImgMode: imgMode = (rviewImageMode)atoi(val); break;
case PVar_ImgBBox: imgBBox = atoi(val); break;
case PVar_ImgZpro: imgZpro = atoi(val); break;
case PVar_ImgClipZ: imgClipz = atoi(val); break;
case PVar_ImgScale: imgScale = atof(val); break;
case PVar_ImgPTL: imgPixThreshLow = atof(val); break;
case PVar_ImgPTH: imgPixThreshHigh = atof(val); break;
case PVar_ImgWT: imgWgtThresh = atof(val); break;
case PVar_ImgWQ: imgWgtQuant = atoi(val); break;
case PVar_ImgVoxType: imgVoxForType = atoi(val); break;
case PVar_ImgRGBBr: imgRgbBrightness = atoi(val); break;
case PVar_ImgLight: imgLight = atoi(val); break;
case PVar_ImgLightAn: imgLightAngle = atof(val); break;
case PVar_ImgLightSc: imgLightScintAngle = atof(val); break;
case PVar_ImgLightAm: imgLightAmbient = atof(val); break;
case PVar_ImgLightGn: imgLightGain = atof(val); break;
case PVar_ImgKernSz: imgKernSize = atoi(val); break;
case PVar_ImgKernTp: imgKernType = atoi(val); break;
case PVar_ImgUseVCol: imgUseVCol = atoi(val); break;
case PVar_ImgVoxCol: imgVoxColour = atof(val); break;
case PVar_ImgLightDr: imgLightDir = val; break;
case PVar_ImgLightDs: imgLightDist = atoi(val); break;
case PVar_ImgHgtGrd: imgHeightGrid = atoi(val); break;
case PVar_ImgHgtScl: imgHeightScale = atof(val); break;
case PVar_ImgOrtBBox: imgOrthoBBox = atoi(val); break;
case PVar_ImgOrtDrag: imgOrthoDragRel = atoi(val); break;
case PVar_ImgOrtThick: imgOrthoThick = atoi(val); break;
case PVar_ChartMode: chartMode = (rviewChartMode)atoi(val); break;
case PVar_ChartCosys: chartCosys = atoi(val); break;
case PVar_ChartStep: chartStep = atoi(val); break;
case PVar_ChartMarkX: chartMarkx = atoi(val); break;
case PVar_ChartMarkY: chartMarky = atof(val); break;
case PVar_TableMode: tableMode = atoi(val); break;
case PVar_TableCosys: tableCosys = atoi(val); break;
case PVar_TableStepX: tableStepx = atoi(val); break;
case PVar_TableStepY: tableStepy = atoi(val); break;
case PVar_ThumbPDim: thumbProjdim = atoi(val); break;
case PVar_ThumbPStep: thumbProjstep = atoi(val); break;
case PVar_ThumbWidth: thumbWidth = atoi(val); break;
case PVar_ThumbCols: thumbCols = atoi(val); break;
case PVar_SoundFrq: soundFreq = atoi(val); break;
case PVar_SoundLat: soundLatency = atoi(val); break;
case PVar_SoundLoop: soundLoop = atoi(val); break;
case PVar_CMpeakR: csp.peak_red = atof(val); break;
case PVar_CMpeakG: csp.peak_green = atof(val); break;
case PVar_CMpeakB: csp.peak_blue = atof(val); break;
case PVar_CMsigmR: csp.sigm_red = atof(val); break;
case PVar_CMsigmG: csp.sigm_green = atof(val); break;
case PVar_CMsigmB: csp.sigm_blue = atof(val); break;
case PVar_CMtype: csp.type = (cspaceType)atoi(val); break;
case PVar_ComTrFmt: transferFmt = atoi(val); break;
case PVar_ComTrParm: fromExternal(val, transferParm); break;
case PVar_ComStFmt: storageFmt = atoi(val); break;
case PVar_ComStParm: fromExternal(val, storageParm); break;
default:
cout << "Bad prefs ID " << prefsVarDesc[number].ident << endl;
break;
}
}
}
}
fclose(fp);
return 1;
}
int rviewPrefs::save(const char *file)
{
char backname[STRINGSIZE];
FILE *fp;
int i;
if (!prefsModified) return 1;
// Make a backup copy of the old file
sprintf(backname, "%s~", file);
remove(backname); rename(file, backname);
if ((fp = fopen(file, "w")) == NULL)
return 0;
fprintf(fp, "# RasDaView preferences\n\n");
for (i=0; prefsVarDesc[i].keyword != NULL; i++)
{
const char *name = prefsVarDesc[i].keyword;
fprintf(fp, "%s\t=\t", name);
switch (prefsVarDesc[i].ident)
{
case PVar_ServerName: fprintf(fp, "%s", serverName.ptr()); break;
case PVar_ServerPort: fprintf(fp, "%d", serverPort); break;
case PVar_DBName: fprintf(fp, "%s", databaseName.ptr()); break;
case PVar_UserName: fprintf(fp, "%s", userName.ptr()); break;
case PVar_LastColl: fprintf(fp, "%s", lastColl.ptr()); break;
case PVar_LastScColl: fprintf(fp, "%s", lastScColl.ptr()); break;
case PVar_LastOrColl: fprintf(fp, "%s", lastOrthoColl.ptr()); break;
case PVar_LastDisp: fprintf(fp, "%d", lastDisplay); break;
case PVar_FilePath: fprintf(fp, "%s", filePath.ptr()); break;
case PVar_QueryPath: fprintf(fp, "%s", queryPath.ptr()); break;
case PVar_QueryFont: fprintf(fp, "%s", queryFont.ptr()); break;
case PVar_MaxDWidth: fprintf(fp, "%d", maxDWidth); break;
case PVar_MaxDHeight: fprintf(fp, "%d", maxDHeight); break;
case PVar_VffParams: fprintf(fp, "%s", vffParams.ptr()); break;
case PVar_ImgDither: fprintf(fp, "%d", imgDither); break;
case PVar_DitherBest: fprintf(fp, "%d", ditherBest); break;
case PVar_RGBSpace: fprintf(fp, "%d", rgbSpace); break;
case PVar_MovieMode: fprintf(fp, "%d", movieMode); break;
case PVar_ImgMode: fprintf(fp, "%d", imgMode); break;
case PVar_ImgBBox: fprintf(fp, "%d", imgBBox); break;
case PVar_ImgZpro: fprintf(fp, "%ld", imgZpro); break;
case PVar_ImgClipZ: fprintf(fp, "%ld", imgClipz); break;
case PVar_ImgScale: fprintf(fp, "%f", imgScale); break;
case PVar_ImgPTL: fprintf(fp, "%g", imgPixThreshLow); break;
case PVar_ImgPTH: fprintf(fp, "%g", imgPixThreshHigh); break;
case PVar_ImgWT: fprintf(fp, "%g", imgWgtThresh); break;
case PVar_ImgWQ: fprintf(fp, "%ld", imgWgtQuant); break;
case PVar_ImgRGBBr: fprintf(fp, "%d", imgRgbBrightness); break;
case PVar_ImgVoxType: fprintf(fp, "%d", imgVoxForType); break;
case PVar_ImgLight: fprintf(fp, "%d", imgLight); break;
case PVar_ImgLightAn: fprintf(fp, "%f", imgLightAngle); break;
case PVar_ImgLightSc: fprintf(fp, "%f", imgLightScintAngle); break;
case PVar_ImgLightAm: fprintf(fp, "%f", imgLightAmbient); break;
case PVar_ImgLightGn: fprintf(fp, "%f", imgLightGain); break;
case PVar_ImgKernSz: fprintf(fp, "%d", imgKernSize); break;
case PVar_ImgKernTp: fprintf(fp, "%d", imgKernType); break;
case PVar_ImgUseVCol: fprintf(fp, "%d", imgUseVCol); break;
case PVar_ImgVoxCol: fprintf(fp, "%f", imgVoxColour); break;
case PVar_ImgLightDr: fprintf(fp, "%s", imgLightDir.ptr()); break;
case PVar_ImgLightDs: fprintf(fp, "%d", imgLightDist); break;
case PVar_ImgHgtGrd: fprintf(fp, "%d", imgHeightGrid); break;
case PVar_ImgHgtScl: fprintf(fp, "%f", imgHeightScale); break;
case PVar_ImgOrtBBox: fprintf(fp, "%d", imgOrthoBBox); break;
case PVar_ImgOrtDrag: fprintf(fp, "%d", imgOrthoDragRel); break;
case PVar_ImgOrtThick: fprintf(fp, "%d", imgOrthoThick); break;
case PVar_ChartMode: fprintf(fp, "%d", chartMode); break;
case PVar_ChartCosys: fprintf(fp, "%d", chartCosys); break;
case PVar_ChartStep: fprintf(fp, "%d", chartStep); break;
case PVar_ChartMarkX: fprintf(fp, "%d", chartMarkx); break;
case PVar_ChartMarkY: fprintf(fp, "%f", chartMarky); break;
case PVar_TableMode: fprintf(fp, "%d", tableMode); break;
case PVar_TableCosys: fprintf(fp, "%d", tableCosys); break;
case PVar_TableStepX: fprintf(fp, "%d", tableStepx); break;
case PVar_TableStepY: fprintf(fp, "%d", tableStepy); break;
case PVar_ThumbPDim: fprintf(fp, "%d", thumbProjdim); break;
case PVar_ThumbPStep: fprintf(fp, "%d", thumbProjstep); break;
case PVar_ThumbWidth: fprintf(fp, "%d", thumbWidth); break;
case PVar_ThumbCols: fprintf(fp, "%d", thumbCols); break;
case PVar_SoundFrq: fprintf(fp, "%d", soundFreq); break;
case PVar_SoundLat: fprintf(fp, "%d", soundLatency); break;
case PVar_SoundLoop: fprintf(fp, "%d", soundLoop); break;
case PVar_CMpeakR: fprintf(fp, "%f", csp.peak_red); break;
case PVar_CMpeakG: fprintf(fp, "%f", csp.peak_green); break;
case PVar_CMpeakB: fprintf(fp, "%f", csp.peak_blue); break;
case PVar_CMsigmR: fprintf(fp, "%f", csp.sigm_red); break;
case PVar_CMsigmG: fprintf(fp, "%f", csp.sigm_green); break;
case PVar_CMsigmB: fprintf(fp, "%f", csp.sigm_blue); break;
case PVar_CMtype: fprintf(fp, "%d", csp.type); break;
case PVar_ComTrFmt: fprintf(fp, "%d", transferFmt); break;
case PVar_ComTrParm:
{
char *ext = toExternal(transferParm);
fwrite(ext, 1, strlen(ext), fp);
delete [] ext;
}
break;
case PVar_ComStFmt: fprintf(fp, "%d", storageFmt); break;
case PVar_ComStParm:
{
char *ext = toExternal(storageParm);
fwrite(ext, 1, strlen(ext), fp);
delete [] ext;
}
break;
default: break;
}
fprintf(fp, "\n");
}
fclose(fp);
prefsModified = FALSE;
return 1;
}
void rviewPrefs::setupVariables(void)
{
serverPort = 7001;
lastDisplay = 0;
maxDWidth = 1024; maxDHeight = 768;
imgDither = FALSE; ditherBest = FALSE; rgbSpace = 0; movieMode = 0;
imgMode = rim_surf; chartMode = rcm_bar; tableMode = 10;
imgBBox = TRUE;
imgZpro = 256; imgClipz = 128;
imgScale = 1.0;
imgPixThreshLow = 4.0; imgPixThreshHigh = 1e6;
imgWgtThresh = 64.0; imgWgtQuant = 4;
imgRgbBrightness = TRUE; imgVoxForType = TRUE;
imgLight = FALSE; imgLightAmbient = 0.5; imgLightGain = 1.0;
imgLightAngle = 90.0; imgLightScintAngle = 90.0;
imgKernSize = 2; imgKernType = 2;
imgUseVCol = FALSE; imgVoxColour = 255.0;
imgHeightGrid = 8; imgHeightScale = 1.0;
imgLightDir = "ru"; imgLightDist = 512;
imgOrthoBBox = TRUE; imgOrthoDragRel = TRUE;
imgOrthoThick = 1;
chartCosys = TRUE;
chartStep = 8; chartMarkx = 20; chartMarky = 20.0;
tableCosys = TRUE;
tableStepx = -1; tableStepy = -1;
thumbProjdim = 2; thumbProjstep = 1; thumbWidth = 100; thumbCols = 4;
soundFreq = 11025; soundLatency = 200; soundLoop = 0;
csp.peak_red = 1.0; csp.peak_green = 2.0/3; csp.peak_blue = 1.0/3;
csp.sigm_red = 1.0 / (6 * sqrt( log(2.0) / log( exp(1.0) ) ) );
csp.sigm_green = csp.sigm_red; csp.sigm_blue = csp.sigm_red;
csp.type = cst_gauss;
transferFmt = 0; storageFmt = 0;
pwin = NULL;
prefsModified = FALSE;
inbuff = NULL; buffSize = 0;
}
int rviewPrefs::edit(void)
{
// Only open one preferences editor!
if (pwin == NULL)
{
// The prefs window will work on a copy of these prefs.
pwin = new rviewPrefsWindow(this);
}
return 0;
}
void rviewPrefs::editorClosed(void)
{
pwin = NULL;
}
void rviewPrefs::updatePrefs(rviewPrefs *newPrefs)
{
copyPrefs(*newPrefs, *this);
prefsModified = TRUE;
}
void rviewPrefs::closeEditor(rviewPrefs *newPrefs)
{
RMDBGONCE(3, RMDebug::module_applications, "rviewPrefs", "closeEditor( " << newPrefs << " )");
// Did the user specify OK or Cancel? OK ==> set newPrefs
if (newPrefs != NULL)
{
updatePrefs(newPrefs);
delete newPrefs;
}
// Delete the editing window (implicitly closes it).
pwin->Close(TRUE);
pwin = NULL;
}
void rviewPrefs::markModified(void)
{
prefsModified = TRUE;
}
r_Data_Format rviewPrefs::getTransferFormat(void) const
{
r_Data_Format fmt;
r_Tile_Compression::get_format_info((unsigned int)transferFmt, fmt);
return fmt;
}
r_Data_Format rviewPrefs::getStorageFormat( void ) const
{
r_Data_Format fmt;
r_Tile_Compression::get_format_info((unsigned int)storageFmt, fmt);
return fmt;
}
char *rviewPrefs::toExternal(const DynamicString &str)
{
const char *d = str.ptr();
unsigned int numspecial = 0;
char *ext, *b;
while (*d != '\0')
{
if ((*d == '\n') || (*d == '\t') || (*d == '\\')) numspecial++;
d++;
}
ext = new char[strlen(str.ptr()) + numspecial + 1];
d = str.ptr(); b = ext;
while (*d != '\0')
{
switch (*d)
{
case '\n':
*b++ = '\\'; *b++ = 'n'; break;
case '\t':
*b++ = '\\'; *b++ = 't'; break;
case '\\':
*b++ = '\\'; *b++ = '\\'; break;
default:
*b++ = *d;
}
d++;
}
*b = '\0';
return ext;
}
void rviewPrefs::fromExternal(const char *ext, DynamicString &str)
{
const char *d;
char *intern, *b;
intern = new char[strlen(ext)+1];
d = ext; b = intern;
while (*d != '\0')
{
if (*d == '\\')
{
d++;
switch(*d)
{
case 'n':
*b++ = '\n'; break;
case 't':
*b++ = '\t'; break;
case '\\':
*b++ = '\\'; break;
default:
cerr << "Warning: parse error in long string " << str << endl;
}
}
else
*b++ = *d;
d++;
}
*b = '\0';
str = intern;
delete [] intern;
}
/*
* rviewPrefsWindow member functions
*/
const char *rviewPrefsWindow::soundLatencyChoices[] = {
"100ms",
"200ms",
"300ms",
"400ms",
"500ms"
};
const char *rviewPrefsWindow::soundFrequencyChoices[] = {
"8000Hz",
"11025Hz",
"22050Hz",
"44100Hz",
"48000Hz"
};
const int rviewPrefsWindow::prefs_width = 450;
const int rviewPrefsWindow::prefs_height = 300;
const int rviewPrefsWindow::prefs_border = 8;
const int rviewPrefsWindow::prefs_bottom = 40;
const int rviewPrefsWindow::prefs_bwidth = 80;
const int rviewPrefsWindow::prefs_bheight = 30;
const int rviewPrefsWindow::prefs_theight = 60;
const int rviewPrefsWindow::prefs_chkheight = 25;
const int rviewPrefsWindow::prefs_eheight = 50;
const int rviewPrefsWindow::prefs_scrwidth = 16;
const int rviewPrefsWindow::prefs_twheight = 80;
const int rviewPrefsWindow::prefs_mheight = 30;
const int rviewPrefsWindow::prefs_grpmsc_height = (11*rviewPrefsWindow::prefs_theight)/2;
const int rviewPrefsWindow::prefs_grpimg_height = (65*rviewPrefsWindow::prefs_theight)/4;
const int rviewPrefsWindow::prefs_grpren_height = (15*rviewPrefsWindow::prefs_theight)/2;
const int rviewPrefsWindow::prefs_grphgt_height = (3*rviewPrefsWindow::prefs_theight)/2;
const int rviewPrefsWindow::prefs_grport_height = (3*rviewPrefsWindow::prefs_theight)/2;
const int rviewPrefsWindow::prefs_grpthb_height = (5*rviewPrefsWindow::prefs_theight)/2;
const int rviewPrefsWindow::prefs_grpcht_height = (5*rviewPrefsWindow::prefs_theight)/2;
const int rviewPrefsWindow::prefs_grptab_height = (5*rviewPrefsWindow::prefs_theight)/2;
const int rviewPrefsWindow::prefs_grpsnd_height = (3*rviewPrefsWindow::prefs_theight)/2;
const int rviewPrefsWindow::prefs_grpcom_height = (7*rviewPrefsWindow::prefs_theight)/2;
const int rviewPrefsWindow::prefs_pheight = rviewPrefsWindow::prefs_grpmsc_height
+ rviewPrefsWindow::prefs_grpimg_height
+ rviewPrefsWindow::prefs_grpcht_height
+ rviewPrefsWindow::prefs_grptab_height
+ rviewPrefsWindow::prefs_grpsnd_height
+ rviewPrefsWindow::prefs_grpcom_height
+ 6*rviewPrefsWindow::prefs_border;
rviewPrefsWindow::rviewPrefsWindow(void): rviewFrame(NULL, "", 0, 0, prefs_width, prefs_height)
{
setupVariables();
}
rviewPrefsWindow::rviewPrefsWindow(rviewPrefs *Prefs): rviewFrame(NULL, "", 0, 0, prefs_width, prefs_height)
{
setupVariables();
setPrefs(Prefs);
}
rviewPrefsWindow::~rviewPrefsWindow(void)
{
if (csmap != NULL) delete csmap;
if (editPrefs != NULL) delete editPrefs;
if (myParent != NULL) myParent->editorClosed();
}
const char *rviewPrefsWindow::getFrameName(void) const
{
return "rviewPrefsWindow";
}
rviewFrameType rviewPrefsWindow::getFrameType(void) const
{
return rviewFrameTypePrefs;
}
void rviewPrefsWindow::unlinkParent(void)
{
myParent = NULL;
}
rviewChoice *rviewPrefsWindow::buildFormatMenu(wxPanel *parent, int fmtNum, const char *label)
{
rviewChoice *menu;
r_Data_Format fmt;
unsigned int i, numFormats;
char **formatNames;
for (numFormats=0; r_Tile_Compression::get_format_info(numFormats, fmt) != NULL; numFormats++) ;
formatNames = new char*[numFormats];
for (i=0; i<(int)numFormats; i++)
{
formatNames[i] = (char*)r_Tile_Compression::get_format_info((unsigned int)i, fmt);
}
menu = new rviewChoice(parent, numFormats, formatNames, lman->lookup(label));
delete [] formatNames;
menu->SetSelection(fmtNum);
return menu;
}
void rviewPrefsWindow::setPrefs(rviewPrefs *Prefs)
{
int x, y, i;
char *choices[4];
myParent = Prefs;
editPrefs = new rviewPrefs(*Prefs);
GetClientSize(&x, &y);
// Create control panel first; it will be superimposed by the scrolling panel
butPanel = new wxPanel((wxWindow*)this, 0, 300, x, prefs_bottom);
butOK = new rviewButton(butPanel);
butCancel = new rviewButton(butPanel);
butApply = new rviewButton(butPanel);
i = y - prefs_bottom; if (i > prefs_pheight) i = prefs_pheight;
scroll = new wxScrollBar(butPanel, (wxFunction)rviewEventHandler, x - prefs_scrwidth, 0, prefs_scrwidth, i, wxVERTICAL);
scroll->SetValue(0);
// Mis-documentation: you have to set the object length before the view length,
// not the other way around.
scroll->SetObjectLength(prefs_pheight);
scroll->SetViewLength(i);
scroll->SetPageLength((3*i)/4);
//cout << "view length = " << i << ", object length = " << prefs_pheight << ", page length = " << (3*i)/4 << endl;
panel = new wxPanel((wxWindow*)this, 0, 0, x, y - prefs_bottom);
// Put labels above the widgets rather than to the left.
panel->SetLabelPosition(wxVERTICAL);
// Just create everything here. Take care of positioning in OnSize(...)
// Misc
miscGroup = new wxGroupBox(panel, "", 0, 0, 100, 100);
filePath = new rviewText(panel, editPrefs->filePath);
queryPath = new rviewText(panel, editPrefs->queryPath);
queryFont = new rviewText(panel, editPrefs->queryFont);
maxDWidth = new rviewText(panel, editPrefs->maxDWidth);
maxDHeight = new rviewText(panel, editPrefs->maxDHeight);
vffParams = new rviewText(panel, editPrefs->vffParams);
// Image group
imgGroup = new wxGroupBox(panel, "", 0, 0, 100, 100);
imgDither = new rviewCheckBox(panel);
imgDither->SetValue(editPrefs->imgDither);
ditherBest = new rviewCheckBox(panel);
ditherBest->SetValue(editPrefs->ditherBest);
choices[0] = lman->lookup("textOff");
choices[1] = lman->lookup("prefsCspaceAct");
choices[2] = lman->lookup("prefsCspaceFull");
choices[3] = lman->lookup("prefsCspaceProj");
rgbSpace = new rviewChoice(panel, 4, choices, lman->lookup("prefsCspace"));
rgbSpace->SetSelection(editPrefs->rgbSpace);
cstrap = new rviewButton(panel);
choices[0] = lman->lookup("prefsMovieOnce");
choices[1] = lman->lookup("prefsMovieStart");
choices[2] = lman->lookup("prefsMovieSwitch");
movieMode = new rviewChoice(panel, 3, choices, lman->lookup("prefsMovieMode"));
movieMode->SetSelection(editPrefs->movieMode);
renderGroup = new wxGroupBox(panel, "", 0, 0, 100, 100);
choices[0] = lman->lookup("menImgModeSurf");
choices[1] = lman->lookup("menImgModeVoxel");
imgMode = new rviewChoice(panel, 2, choices, lman->lookup("textImageMode"));
imgScale = new rviewText(panel, editPrefs->imgScale, FALSE);
// Image renderer subgroup
imgZpro = new rviewText(panel, (long)(editPrefs->imgZpro));
imgClipz = new rviewText(panel, (long)(editPrefs->imgClipz));
imgBBox = new rviewCheckBox(panel);
imgBBox->SetValue(editPrefs->imgBBox);
imgPixThreshLow = new rviewText(panel, editPrefs->imgPixThreshLow, TRUE);
imgPixThreshHigh = new rviewText(panel, editPrefs->imgPixThreshHigh, TRUE);
imgRgbBrightness = new rviewCheckBox(panel);
imgRgbBrightness->SetValue(editPrefs->imgRgbBrightness);
imgVoxForType = new rviewCheckBox(panel);
imgVoxForType->SetValue(editPrefs->imgVoxForType);
imgWgtThresh = new rviewText(panel, editPrefs->imgWgtThresh, TRUE);
imgWgtQuant = new rviewText(panel, (long)(editPrefs->imgWgtQuant));
imgLight = new rviewCheckBox(panel);
imgLight->SetValue(editPrefs->imgLight);
choices[0] = "0";
choices[1] = "1";
choices[2] = "2";
choices[3] = "3";
imgKernSize = new rviewChoice(panel, 4, choices, lman->lookup("prefsKernSize"));
imgKernSize->SetSelection(editPrefs->imgKernSize);
choices[0] = lman->lookup("kernelTypeAvg");
choices[1] = lman->lookup("kernelTypeLin");
choices[2] = lman->lookup("kernelTypeGauss");
imgKernType = new rviewChoice(panel, 3, choices, lman->lookup("prefsKernType"));
imgKernType->SetSelection(editPrefs->imgKernType);
imgLightAngle = new rviewText(panel, editPrefs->imgLightAngle);
imgLightAmbient = new rviewText(panel, editPrefs->imgLightAmbient);
imgLightGain = new rviewText(panel, editPrefs->imgLightGain);
imgLightScintAngle = new rviewText(panel, editPrefs->imgLightScintAngle);
imgLightDir = new rviewText(panel, editPrefs->imgLightDir);
imgLightDist = new rviewText(panel, editPrefs->imgLightDist);
imgUseVCol = new rviewCheckBox(panel);
imgUseVCol->SetValue(editPrefs->imgUseVCol);
imgVoxColour = new rviewText(panel, editPrefs->imgVoxColour);
// Image heightfield subgroup
heightGroup = new wxWidowBase(panel, "", 0, 0, 100, 100);
imgHeightGrid = new rviewText(panel, editPrefs->imgHeightGrid);
imgHeightScale = new rviewText(panel, editPrefs->imgHeightScale);
// Image orthosection subgroup
orthoGroup = new wxGroupBox(panel, "", 0, 0, 100, 100);
imgOrthoBBox = new rviewCheckBox(panel);
imgOrthoBBox->SetValue(editPrefs->imgOrthoBBox);
imgOrthoDragRel = new rviewCheckBox(panel);
imgOrthoDragRel->SetValue(editPrefs->imgOrthoDragRel);
imgOrthoThick = new rviewText(panel, editPrefs->imgOrthoThick);
// Image thumbnails subgroup
thumbGroup = new wxGroupBox(panel, "", 0, 0, 100, 100);
thumbProjdim = new rviewText(panel, editPrefs->thumbProjdim);
thumbProjstep = new rviewText(panel, editPrefs->thumbProjstep);
thumbWidth = new rviewText(panel, editPrefs->thumbWidth);
thumbCols = new rviewText(panel, editPrefs->thumbCols);
// Chart group
chartGroup = new wxGroupBox(panel, "", 0, 0, 100, 100);
choices[0] = lman->lookup("menChartModeBar");
choices[1] = lman->lookup("menChartModeLine");
choices[2] = lman->lookup("menChartModeSpline");
chartMode = new rviewChoice(panel, 3, choices, lman->lookup("textChartMode"));
chartCosys = new rviewCheckBox(panel);
chartCosys->SetValue(editPrefs->chartCosys);
chartStep = new rviewText(panel, editPrefs->chartStep);
chartMarkx = new rviewText(panel, editPrefs->chartMarkx);
chartMarky = new rviewText(panel, editPrefs->chartMarky);
// Table group
tableGroup = new wxGroupBox(panel, "", 0, 0, 100, 100);
choices[0] = lman->lookup("menTabModeDec");
choices[1] = lman->lookup("menTabModeOct");
choices[2] = lman->lookup("menTabModeHex");
tableMode = new rviewChoice(panel, 3, choices, lman->lookup("textTableMode"));
tableCosys = new rviewCheckBox(panel);
tableCosys->SetValue(editPrefs->tableCosys);
tableStepx = new rviewText(panel, editPrefs->tableStepx);
tableStepy = new rviewText(panel, editPrefs->tableStepy);
// Sound group
soundGroup = new wxGroupBox(panel, "", 0, 0, 100, 100);
i = sizeof(soundFrequencyChoices) / sizeof(char*);
soundFreq = new rviewChoice(panel, i, soundFrequencyChoices, lman->lookup("soundFrequency"));
soundFreq->SetSelection(findInChoices(editPrefs->soundFreq, (const char**)soundFrequencyChoices, i));
i = sizeof(soundLatencyChoices) / sizeof(char*);
soundLatency = new rviewChoice(panel, i, soundLatencyChoices, lman->lookup("soundLatency"));
soundLatency->SetSelection(findInChoices(editPrefs->soundLatency, (const char**)soundLatencyChoices, i));
soundLoop = new rviewCheckBox(panel);
soundLoop->SetValue(editPrefs->soundLoop);
// Communication group
commGroup = new wxGroupBox(panel, "", 0, 0, 100, 100);
transferFmt = buildFormatMenu(panel, editPrefs->transferFmt, "textTransferFormats");
transferMsg = new wxMessage(panel, lman->lookup("textTransferParams"));
transferParm = new wxTextWindow(panel, 0, 0, 100, 100);
transferParm->WriteText((char*)(editPrefs->transferParm.ptr()));
storageFmt = buildFormatMenu(panel, editPrefs->storageFmt, "textStorageFormats");
storageMsg = new wxMessage(panel, lman->lookup("textStorageParams"));
storageParm = new wxTextWindow(panel, 0, 0, 100, 100);
storageParm->WriteText((char*)(editPrefs->storageParm.ptr()));
switch (editPrefs->imgMode)
{
case rim_voxel: imgMode->SetSelection(1); break;
default: imgMode->SetSelection(0); break;
}
switch (editPrefs->chartMode)
{
case rcm_line: chartMode->SetSelection(1); break;
case rcm_spline: chartMode->SetSelection(2); break;
default: chartMode->SetSelection(0); break;
}
switch (editPrefs->tableMode)
{
case 8: tableMode->SetSelection(1); break;
case 16: tableMode->SetSelection(2); break;
default: tableMode->SetSelection(0); break;
}
#ifdef wx_msw
// Windows -- you just gotta love it. Obviously there are huge problems when
// creating two panels in one window. Thus make sure the button panel is _below_
// the configuration panel. That's only possible by directly using Windows calls.
SetWindowPos(panel->GetHWND(), HWND_BOTTOM, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(butPanel->GetHWND(), HWND_BOTTOM, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
#endif
label();
frameWidth = -1; frameHeight = -1;
OnSize(x, y);
OnSize(x, y);
Show(TRUE);
}
void rviewPrefsWindow::label(void)
{
SetTitle(lman->lookup("titlePrefs"));
miscGroup->SetLabel(lman->lookup("textMiscPrefs"));
butOK->SetLabel(lman->lookup("textOK"));
butCancel->SetLabel(lman->lookup("textCancel"));
butApply->SetLabel(lman->lookup("textApply"));
filePath->SetLabel(lman->lookup("prefsFilePath"));
queryPath->SetLabel(lman->lookup("prefsQueryPath"));
queryFont->SetLabel(lman->lookup("prefsQueryFont"));
maxDWidth->SetLabel(lman->lookup("prefsMaxDWidth"));
maxDHeight->SetLabel(lman->lookup("prefsMaxDHeight"));
vffParams->SetLabel(lman->lookup("prefsVffParams"));
imgGroup->SetLabel(lman->lookup("textImages"));
imgDither->SetLabel(lman->lookup("prefsImgDither"));
ditherBest->SetLabel(lman->lookup("prefsDitherBest"));
rgbSpace->SetLabel(lman->lookup("prefsCspace"));
cstrap->SetLabel(lman->lookup("prefsCspaceEdit"));
movieMode->SetLabel(lman->lookup("prefsMovieMode"));
imgMode->SetLabel(lman->lookup("textImageMode"));
renderGroup->SetLabel(lman->lookup("menImgSetupRender"));
imgBBox->SetLabel(lman->lookup("textBBox"));
imgZpro->SetLabel(lman->lookup("imgSetRenZpro"));
imgClipz->SetLabel(lman->lookup("imgSetRenClipz"));
imgScale->SetLabel(lman->lookup("textScaleFactor"));
imgPixThreshLow->SetLabel(lman->lookup("imgSetVoxPixThreshLow"));
imgPixThreshHigh->SetLabel(lman->lookup("imgSetVoxPixThreshHigh"));
imgWgtThresh->SetLabel(lman->lookup("imgSetVoxWgtThresh"));
imgWgtQuant->SetLabel(lman->lookup("imgSetVoxWgtQuant"));
imgRgbBrightness->SetLabel(lman->lookup("imgSetVoxRgbBright"));
imgVoxForType->SetLabel(lman->lookup("imgSetVoxForType"));
imgLight->SetLabel(lman->lookup("prefsLight"));
imgLightAngle->SetLabel(lman->lookup("prefsLightAngle"));
imgLightAmbient->SetLabel(lman->lookup("prefsLightAmbient"));
imgLightGain->SetLabel(lman->lookup("prefsLightGain"));
imgKernSize->SetLabel(lman->lookup("prefsKernSize"));
imgKernType->SetLabel(lman->lookup("prefsKernType"));
imgLightScintAngle->SetLabel(lman->lookup("prefsLightScAngle"));
imgLightDir->SetLabel(lman->lookup("prefsLightDir"));
imgLightDist->SetLabel(lman->lookup("prefsLightDist"));
imgUseVCol->SetLabel(lman->lookup("prefsUseVCol"));
imgVoxColour->SetLabel(lman->lookup("prefsVoxColour"));
heightGroup->SetLabel(lman->lookup("prefsHeightGroup"));
imgHeightGrid->SetLabel(lman->lookup("prefsHgtGrid"));
imgHeightScale->SetLabel(lman->lookup("prefsHgtScale"));
orthoGroup->SetLabel(lman->lookup("prefsOrthoGroup"));
imgOrthoBBox->SetLabel(lman->lookup("textBBox"));
imgOrthoDragRel->SetLabel(lman->lookup("prefsOrthoDragRel"));
imgOrthoThick->SetLabel(lman->lookup("prefsOrthoThick"));
thumbGroup->SetLabel(lman->lookup("textThumb"));
thumbProjdim->SetLabel(lman->lookup("textThumbProjDim"));
thumbProjstep->SetLabel(lman->lookup("textThumbProjStep"));
thumbWidth->SetLabel(lman->lookup("textThumbWidth"));
thumbCols->SetLabel(lman->lookup("textThumbColumns"));
chartGroup->SetLabel(lman->lookup("textCharts"));
chartMode->SetLabel(lman->lookup("textChartMode"));
chartCosys->SetLabel(lman->lookup("textCosys"));
chartStep->SetLabel(lman->lookup("textStepC"));
chartMarkx->SetLabel(lman->lookup("textDataStep"));
chartMarky->SetLabel(lman->lookup("textCoStep"));
tableGroup->SetLabel(lman->lookup("textTables"));
tableMode->SetLabel(lman->lookup("textTableMode"));
tableCosys->SetLabel(lman->lookup("textCosys"));
tableStepx->SetLabel(lman->lookup("textStepx"));
tableStepy->SetLabel(lman->lookup("textStepy"));
soundGroup->SetLabel(lman->lookup("prefsSound"));
soundFreq->SetLabel(lman->lookup("soundFrequency"));
soundLatency->SetLabel(lman->lookup("soundLatency"));
soundLoop->SetLabel(lman->lookup("prefsSndLoop"));
commGroup->SetLabel(lman->lookup("textCommunication"));
transferFmt->SetLabel(lman->lookup("textTransferFormats"));
transferMsg->SetLabel(lman->lookup("textTransferParams"));
storageFmt->SetLabel(lman->lookup("textStorageFormats"));
storageMsg->SetLabel(lman->lookup("textStorageParams"));
}
void rviewPrefsWindow::OnSize(int w, int h)
{
if (panel != NULL)
{
int x, y, posx, posy, h, gbox, i, width;
GetClientSize(&x, &y);
//need to resize?
if (( prefs_width != x) || ( prefs_height != y))
{
frameWidth = prefs_width;
frameHeight = prefs_height;
x = prefs_width;
y = prefs_height;
SetClientSize(x, y);
return;
}
butPanel->SetSize(0, 0, x, y);
i = y - (prefs_bottom + prefs_bheight) / 2 - prefs_border;
h = (x - 3*prefs_bwidth)/3;
butOK->SetSize(h/2, i, prefs_bwidth, prefs_bheight);
butApply->SetSize(prefs_bwidth + (3*h)/2, i, prefs_bwidth, prefs_bheight);
butCancel->SetSize(2*prefs_bwidth + (5*h)/2, i, prefs_bwidth, prefs_bheight);
y -= prefs_bottom + prefs_border;
if (y > prefs_pheight) y = prefs_pheight;
posy = scroll->GetValue();
// If the window has grown the scrollbar value might be too big
if (posy + y > prefs_pheight + prefs_border)
{
posy = prefs_pheight + prefs_border - y;
if (posy < 0) posy = 0;
scroll->SetValue(posy);
}
posx = x - prefs_border - prefs_scrwidth;
panel->SetSize(0, -posy, posx, y + posy, wxSIZE_ALLOW_MINUS_ONE);
// It's very important to make the style wxSIZE_ALLOW_MINUS_ONE to keep wxWindows
// from interpreting negative values as defaults. Negative positioning values
// can happen due to scrolling.
h = y - prefs_border;
scroll->SetSize(posx, prefs_border, prefs_scrwidth, h);
if (h > prefs_pheight) h = prefs_pheight;
scroll->SetViewLength(h);
// Object length hasn't changed.
//scroll->SetObjectLength(prefs_pheight);
scroll->SetPageLength((3*h)/4);
x -= 3*prefs_border + prefs_scrwidth;
//y += prefs_bottom - prefs_border;
// Group boxes
posx = prefs_border;
gbox = prefs_border;
miscGroup->SetSize(posx, gbox, x, prefs_grpmsc_height);
gbox += prefs_grpmsc_height + prefs_border;
imgGroup->SetSize(posx, gbox, x, prefs_grpimg_height);
gbox += prefs_grpimg_height + prefs_border;
chartGroup->SetSize(posx, gbox, x, prefs_grpcht_height);
gbox += prefs_grpcht_height + prefs_border;
tableGroup->SetSize(posx, gbox, x, prefs_grptab_height);
gbox += prefs_grptab_height + prefs_border;
soundGroup->SetSize(posx, gbox, x, prefs_grpsnd_height);
gbox += prefs_grpsnd_height + prefs_border;
commGroup->SetSize(posx, gbox, x, prefs_grpcom_height);
// Misc group
posx = 2*prefs_border; x -= 2*prefs_border;
gbox = prefs_border;
filePath->SetSize(posx, gbox + prefs_theight/2, x, prefs_eheight);
queryPath->SetSize(posx, gbox + (3*prefs_theight)/2, x, prefs_eheight);
queryFont->SetSize(posx, gbox + (5*prefs_theight)/2, x, prefs_eheight);
maxDWidth->SetSize(posx, gbox + (7*prefs_theight)/2, x/2, prefs_eheight);
maxDHeight->SetSize(posx + x/2, gbox + (7*prefs_theight)/2, x/2, prefs_eheight);
vffParams->SetSize(posx, gbox + (9*prefs_theight)/2, x, prefs_eheight);
// Image group
gbox += prefs_grpmsc_height + prefs_border;
i = gbox + prefs_theight/2;
imgDither->SetSize(posx, i, x/3, prefs_chkheight);
ditherBest->SetSize(posx, i + prefs_chkheight, x/3, prefs_chkheight);
rgbSpace->SetSize(posx + x/3, i, prefs_bwidth, prefs_bheight);
cstrap->SetSize(posx + (2*x)/3 + prefs_border, i, prefs_bwidth, prefs_bheight);
i += prefs_theight;
imgMode->SetSize(posx, i, prefs_bwidth, prefs_bheight);
movieMode->SetSize(posx + x/3, i, prefs_bwidth, prefs_bheight);
imgScale->SetSize(posx + (2*x)/3 + x/30, i, x/3 -x/30, prefs_eheight);
i = gbox + (5*prefs_theight)/2 + prefs_border;
renderGroup->SetSize(posx, i, x, prefs_grpren_height);
heightGroup->SetSize(posx, i + prefs_grpren_height + prefs_border, x, prefs_grphgt_height);
orthoGroup->SetSize(posx, i + prefs_grpren_height + prefs_grphgt_height + 2*prefs_border, x, prefs_grport_height);
thumbGroup->SetSize(posx, i + prefs_grpren_height + prefs_grphgt_height + prefs_grport_height + 3*prefs_border, x, prefs_grpthb_height);
// Image renderer subgroup
posx += prefs_border; x -= 2*prefs_border;
i += prefs_theight/2;
imgZpro->SetSize(posx, i, x/3, prefs_eheight);
imgClipz->SetSize(posx + x/3, i, x/3, prefs_eheight);
imgBBox->SetSize(posx + (2*x)/3 + x/40, i, x/3 - x/40, prefs_chkheight);
imgRgbBrightness->SetSize(posx + (2*x)/3 + x/40, i + (2*prefs_theight)/3, x/3 - x/40, prefs_chkheight);
imgVoxForType->SetSize(posx + (2*x)/3 + x/40, i + (4*prefs_theight)/3, x/3 - x/40, prefs_chkheight);
i += prefs_theight;
imgPixThreshLow->SetSize(posx, i, x/3, prefs_eheight);
imgPixThreshHigh->SetSize(posx + x/3, i, x/3, prefs_eheight);
i += prefs_theight;
imgWgtThresh->SetSize(posx, i, x/2, prefs_eheight);
imgWgtQuant->SetSize(posx + x/2, i, x/2, prefs_eheight);
i += prefs_theight;
imgLight->SetSize(posx, i, x/4, prefs_bheight); // must reduce width to x/4!
imgKernSize->SetSize(posx + x/4, i, x/5, prefs_bheight);
imgKernType->SetSize(posx + 2*x/3, i, x/5, prefs_bheight);
i += prefs_theight;
imgLightAngle->SetSize(posx, i, x/3, prefs_eheight);
imgLightAmbient->SetSize(posx + x/3, i, x/3, prefs_eheight);
imgLightGain->SetSize(posx + (2*x)/3, i, x/3, prefs_eheight);
i += prefs_theight;
imgLightScintAngle->SetSize(posx, i, x/3, prefs_eheight);
imgLightDir->SetSize(posx + x/3, i, x/3, prefs_eheight);
imgLightDist->SetSize(posx + (2*x)/3, i, x/3, prefs_eheight);
i += prefs_theight;
imgUseVCol->SetSize(posx, i, x/2, prefs_eheight);
imgVoxColour->SetSize(posx + x/2, i, x/2, prefs_eheight);
// Image heightfield subgroup
i = gbox + 3*prefs_theight + prefs_grpren_height + 2*prefs_border;
imgHeightGrid->SetSize(posx, i, x/2, prefs_eheight);
imgHeightScale->SetSize(posx + x/2, i, x/2, prefs_eheight);
// Orthosection subgroup
i = gbox + 3*prefs_theight + prefs_grpren_height + prefs_grphgt_height + 2*prefs_border;
imgOrthoBBox->SetSize(posx, i, x/3, prefs_eheight);
imgOrthoDragRel->SetSize(posx + x/3, i, x/3, prefs_eheight);
imgOrthoThick->SetSize(posx + (2*x)/3, i, x/3, prefs_eheight);
// Image thumbnail subgroup
i = gbox + 3*prefs_theight + prefs_grpren_height + prefs_grphgt_height + prefs_grport_height + 3*prefs_border;
thumbProjdim->SetSize(posx, i, x/2, prefs_eheight);
thumbProjstep->SetSize(posx + x/2, i, x/2, prefs_eheight);
i += prefs_theight;
thumbWidth->SetSize(posx, i, x/2, prefs_eheight);
thumbCols->SetSize(posx + x/2, i, x/2, prefs_eheight);
posx -= prefs_border; x += 2*prefs_border;
// Chart group
gbox += prefs_grpimg_height + prefs_border;
i = gbox + prefs_theight/2;
chartMode->SetSize(posx, i, prefs_bwidth, prefs_bheight);
chartCosys->SetSize(posx + x/2, i, x/2, prefs_eheight);
i += prefs_theight;
chartStep->SetSize(posx, i, x/3, prefs_eheight);
chartMarkx->SetSize(posx + x/3, i, x/3, prefs_eheight);
chartMarky->SetSize(posx + (2*x)/3, i, x/3, prefs_eheight);
// Table group
gbox += prefs_grpcht_height + prefs_border;
i = gbox + prefs_theight/2;
tableMode->SetSize(posx, i, prefs_bwidth, prefs_bheight);
tableCosys->SetSize(posx + x/2, i, x/2, prefs_eheight);
i += prefs_theight;
tableStepx->SetSize(posx, i, x/2, prefs_eheight);
tableStepy->SetSize(posx + x/2, i, x/2, prefs_eheight);
// Sound group
gbox += prefs_grptab_height + prefs_border;
i = gbox + prefs_theight/2;
h = (x - 2*prefs_border) / 3;
soundFreq->SetSize(posx, i, prefs_bwidth, prefs_bheight);
soundLatency->SetSize(posx + h + prefs_border, i, prefs_bwidth, prefs_bheight);
soundLoop->SetSize(posx + 2*(h + prefs_border), i, h, prefs_bheight);
// Communications box
gbox += prefs_grpsnd_height + prefs_border;
i = gbox + prefs_theight/2;
h = (x - prefs_border) / 2;
width = (prefs_bwidth > h) ? h : prefs_bwidth;
width -= prefs_border;
transferFmt->SetSize(posx, i, width, prefs_bheight);
storageFmt->SetSize(posx + h + prefs_border, i, width, prefs_bheight);
i += prefs_bheight + 3*prefs_border;
transferMsg->SetSize(posx, i, h, prefs_mheight);
storageMsg->SetSize(posx + h + prefs_border, i, h, prefs_mheight);
i += prefs_mheight;
transferParm->SetSize(posx, i, h, prefs_twheight);
storageParm->SetSize(posx + h + prefs_border, i, h, prefs_twheight);
}
}
void rviewPrefsWindow::textWindowToString(DynamicString &str, wxTextWindow *twin)
{
char *text = twin->GetContents();
str = text;
delete [] text;
}
void rviewPrefsWindow::updatePrefs(void)
{
editPrefs->filePath = filePath->GetValue();
editPrefs->queryPath = queryPath->GetValue();
editPrefs->queryFont = queryFont->GetValue();
editPrefs->maxDWidth = asctoi(maxDWidth->GetValue());
editPrefs->maxDHeight = asctoi(maxDHeight->GetValue());
editPrefs->vffParams = vffParams->GetValue();
editPrefs->imgDither = imgDither->GetValue();
editPrefs->ditherBest = ditherBest->GetValue();
editPrefs->rgbSpace = rgbSpace->GetSelection();
editPrefs->movieMode = movieMode->GetSelection();
editPrefs->imgBBox = imgBBox->GetValue();
editPrefs->imgZpro = asctoi(imgZpro->GetValue());
editPrefs->imgClipz = asctoi(imgClipz->GetValue());
editPrefs->imgScale = asctof(imgScale->GetValue());
editPrefs->imgPixThreshLow = asctof(imgPixThreshLow->GetValue());
editPrefs->imgPixThreshHigh = asctof(imgPixThreshHigh->GetValue());
editPrefs->imgWgtThresh = asctof(imgWgtThresh->GetValue());
editPrefs->imgWgtQuant = asctoi(imgWgtQuant->GetValue());
editPrefs->imgRgbBrightness = imgRgbBrightness->GetValue();
editPrefs->imgVoxForType = imgVoxForType->GetValue();
editPrefs->imgLight = imgLight->GetValue();
editPrefs->imgLightAngle = atof(imgLightAngle->GetValue());
editPrefs->imgLightAmbient = atof(imgLightAmbient->GetValue());
editPrefs->imgLightGain = atof(imgLightGain->GetValue());
editPrefs->imgKernSize = imgKernSize->GetSelection();
editPrefs->imgKernType = imgKernType->GetSelection();
editPrefs->imgLightScintAngle = atof(imgLightScintAngle->GetValue());
editPrefs->imgLightDir = imgLightDir->GetValue();
editPrefs->imgLightDist = asctoi(imgLightDist->GetValue());
editPrefs->imgUseVCol = imgUseVCol->GetValue();
editPrefs->imgVoxColour = asctof(imgVoxColour->GetValue());
editPrefs->imgHeightGrid = atoi(imgHeightGrid->GetValue());
editPrefs->imgHeightScale = atof(imgHeightScale->GetValue());
editPrefs->imgOrthoBBox = imgOrthoBBox->GetValue();
editPrefs->imgOrthoDragRel = imgOrthoDragRel->GetValue();
editPrefs->imgOrthoThick = atoi(imgOrthoThick->GetValue());
editPrefs->chartCosys = chartCosys->GetValue();
editPrefs->chartStep = atoi(chartStep->GetValue());
editPrefs->chartMarkx = atoi(chartMarkx->GetValue());
editPrefs->chartMarky = atof(chartMarky->GetValue());
editPrefs->tableCosys = tableCosys->GetValue();
editPrefs->tableStepx = atoi(tableStepx->GetValue());
editPrefs->tableStepy = atoi(tableStepy->GetValue());
editPrefs->thumbProjdim = atoi(thumbProjdim->GetValue());
editPrefs->thumbProjstep = atoi(thumbProjstep->GetValue());
editPrefs->thumbWidth = atoi(thumbWidth->GetValue());
editPrefs->thumbCols = atoi(thumbCols->GetValue());
editPrefs->soundFreq = atoi(soundFrequencyChoices[soundFreq->GetSelection()]);
editPrefs->soundLatency = atoi(soundLatencyChoices[soundLatency->GetSelection()]);
editPrefs->soundLoop = soundLoop->GetValue();
editPrefs->transferFmt = transferFmt->GetSelection();
textWindowToString(editPrefs->transferParm, transferParm);
editPrefs->storageFmt = storageFmt->GetSelection();
textWindowToString(editPrefs->storageParm, storageParm);
switch (imgMode->GetSelection())
{
case 1: editPrefs->imgMode = rim_voxel; break;
default: editPrefs->imgMode = rim_surf; break;
}
switch (chartMode->GetSelection())
{
case 1: editPrefs->chartMode = rcm_line; break;
case 2: editPrefs->chartMode = rcm_spline; break;
default: editPrefs->chartMode = rcm_bar; break;
}
switch (tableMode->GetSelection())
{
case 1: editPrefs->tableMode = 8; break;
case 2: editPrefs->tableMode = 16; break;
default: editPrefs->tableMode = 10; break;
}
if (csmap != NULL)
{
csmap->getParameters(&(editPrefs->csp));
}
}
void rviewPrefsWindow::updateAndDie(void)
{
updatePrefs();
if (myParent != NULL) myParent->closeEditor(editPrefs);
editPrefs = NULL;
}
int rviewPrefsWindow::process(wxObject &obj, wxEvent &evt)
{
int type = evt.GetEventType();
if (type == wxEVENT_TYPE_BUTTON_COMMAND)
{
if (&obj == (wxObject*)butOK)
{
updateAndDie();
return 1;
}
else if (&obj == (wxObject*)butApply)
{
updatePrefs();
if (myParent != NULL) myParent->updatePrefs(editPrefs);
return 1;
}
else if (&obj == (wxObject*)butCancel)
{
delete editPrefs; editPrefs = NULL;
if (myParent != NULL) myParent->closeEditor(NULL);
return 1;
}
else if (&obj == (wxObject*)cstrap)
{
if (csmap == NULL)
{
r_Ref dummyMdd;
csmap = new colourspaceMapper(dummyMdd, rbt_none, &(editPrefs->csp), TRUE, NULL);
}
csmap->openEditor();
}
}
else if (type == wxEVENT_TYPE_TEXT_ENTER_COMMAND)
{
updateAndDie();
}
else if ((type == wxEVENT_TYPE_SCROLLBAR_COMMAND) && (&obj == (wxObject*)scroll))
{
int x, y, posy;
GetClientSize(&x, &y);
posy = scroll->GetValue();
panel->SetSize(0, -posy, x - prefs_border - prefs_scrwidth, y + posy - prefs_bottom - prefs_border, wxSIZE_ALLOW_MINUS_ONE);
}
return 0;
}
void rviewPrefsWindow::setupVariables(void)
{
editPrefs = NULL; myParent = NULL;
panel = NULL; csmap = NULL;
}
int rviewPrefsWindow::findInChoices(int value, const char **choices, int number)
{
int i;
int lastval, newval;
lastval = atoi(choices[0]);
for (i=1; igetParameters(&(editPrefs->csp));
return 1;
}
return 0;
}