diff options
Diffstat (limited to 'app/bin/dlayer.c')
-rw-r--r-- | app/bin/dlayer.c | 1538 |
1 files changed, 841 insertions, 697 deletions
diff --git a/app/bin/dlayer.c b/app/bin/dlayer.c index c79d783..71d151e 100644 --- a/app/bin/dlayer.c +++ b/app/bin/dlayer.c @@ -1,7 +1,5 @@ /** \file dlayer.c * Functions and dialogs for handling layers. - * - * $Header: /home/dmarkle/xtrkcad-fork-cvs/xtrkcad/app/bin/dlayer.c,v 1.9 2009-06-15 19:29:57 m_fischer Exp $ */ /* XTrkCad - Model Railroad CAD @@ -23,12 +21,17 @@ */ #include <assert.h> - -#include "track.h" -#include "i18n.h" - +#include <stdbool.h> #include <stdint.h> +#include <string.h> +#include "custom.h" +#include "dynstring.h" +#include "fileio.h" +#include "i18n.h" +#include "messages.h" +#include "param.h" +#include "track.h" /***************************************************************************** * @@ -45,195 +48,208 @@ #define LAYERPREF_COLOR "color" #define LAYERPREF_FLAGS "flags" -EXPORT LAYER_T curLayer; -EXPORT long layerCount = 10; +unsigned int curLayer; +long layerCount = 10; static long newLayerCount = 10; -static LAYER_T layerCurrent = NUM_LAYERS; +static unsigned int layerCurrent = NUM_LAYERS; static BOOL_T layoutLayerChanged = FALSE; -static wIcon_p show_layer_bmps[NUM_BUTTONS]; -/*static wIcon_p hide_layer_bmps[NUM_BUTTONS]; */ +static wIcon_p show_layer_bmps[NUM_BUTTONS]; static wButton_p layer_btns[NUM_BUTTONS]; /**< layer buttons on toolbar */ /** Layer selector on toolbar */ -static wList_p setLayerL; +static wList_p setLayerL; -/*static wMessage_p layerNumM;*/ /** Describe the properties of a layer */ typedef struct { - char name[STR_SHORT_SIZE]; /**< Layer name */ - wDrawColor color; /**< layer color, is an index into a color table */ - BOOL_T frozen; /**< Frozen flag */ - BOOL_T visible; /**< visible flag */ - BOOL_T onMap; /**< is layer shown map */ - long objCount; /**< number of objects on layer */ - } layer_t; - + char name[STR_SHORT_SIZE]; /**< Layer name */ + wDrawColor color; /**< layer color, is an index into a color table */ + BOOL_T frozen; /**< Frozen flag */ + BOOL_T visible; /**< visible flag */ + BOOL_T onMap; /**< is layer shown map */ + long objCount; /**< number of objects on layer */ +} layer_t; + static layer_t layers[NUM_LAYERS]; static layer_t *layers_save = NULL; static int oldColorMap[][3] = { - { 255, 255, 255 }, /* White */ - { 0, 0, 0 }, /* Black */ - { 255, 0, 0 }, /* Red */ - { 0, 255, 0 }, /* Green */ - { 0, 0, 255 }, /* Blue */ - { 255, 255, 0 }, /* Yellow */ - { 255, 0, 255 }, /* Purple */ - { 0, 255, 255 }, /* Aqua */ - { 128, 0, 0 }, /* Dk. Red */ - { 0, 128, 0 }, /* Dk. Green */ - { 0, 0, 128 }, /* Dk. Blue */ - { 128, 128, 0 }, /* Dk. Yellow */ - { 128, 0, 128 }, /* Dk. Purple */ - { 0, 128, 128 }, /* Dk. Aqua */ - { 65, 105, 225 }, /* Royal Blue */ - { 0, 191, 255 }, /* DeepSkyBlue */ - { 125, 206, 250 }, /* LightSkyBlue */ - { 70, 130, 180 }, /* Steel Blue */ - { 176, 224, 230 }, /* Powder Blue */ - { 127, 255, 212 }, /* Aquamarine */ - { 46, 139, 87 }, /* SeaGreen */ - { 152, 251, 152 }, /* PaleGreen */ - { 124, 252, 0 }, /* LawnGreen */ - { 50, 205, 50 }, /* LimeGreen */ - { 34, 139, 34 }, /* ForestGreen */ - { 255, 215, 0 }, /* Gold */ - { 188, 143, 143 }, /* RosyBrown */ - { 139, 69, 19 }, /* SaddleBrown */ - { 245, 245, 220 }, /* Beige */ - { 210, 180, 140 }, /* Tan */ - { 210, 105, 30 }, /* Chocolate */ - { 165, 42, 42 }, /* Brown */ - { 255, 165, 0 }, /* Orange */ - { 255, 127, 80 }, /* Coral */ - { 255, 99, 71 }, /* Tomato */ - { 255, 105, 180 }, /* HotPink */ - { 255, 192, 203 }, /* Pink */ - { 176, 48, 96 }, /* Maroon */ - { 238, 130, 238 }, /* Violet */ - { 160, 32, 240 }, /* Purple */ - { 16, 16, 16 }, /* Gray */ - { 32, 32, 32 }, /* Gray */ - { 48, 48, 48 }, /* Gray */ - { 64, 64, 64 }, /* Gray */ - { 80, 80, 80 }, /* Gray */ - { 96, 96, 96 }, /* Gray */ - { 112, 112, 122 }, /* Gray */ - { 128, 128, 128 }, /* Gray */ - { 144, 144, 144 }, /* Gray */ - { 160, 160, 160 }, /* Gray */ - { 176, 176, 176 }, /* Gray */ - { 192, 192, 192 }, /* Gray */ - { 208, 208, 208 }, /* Gray */ - { 224, 224, 224 }, /* Gray */ - { 240, 240, 240 }, /* Gray */ - { 0, 0, 0 } /* BlackPixel */ - }; - -static void DoLayerOp( void * data ); + { 255, 255, 255 }, /* White */ + { 0, 0, 0 }, /* Black */ + { 255, 0, 0 }, /* Red */ + { 0, 255, 0 }, /* Green */ + { 0, 0, 255 }, /* Blue */ + { 255, 255, 0 }, /* Yellow */ + { 255, 0, 255 }, /* Purple */ + { 0, 255, 255 }, /* Aqua */ + { 128, 0, 0 }, /* Dk. Red */ + { 0, 128, 0 }, /* Dk. Green */ + { 0, 0, 128 }, /* Dk. Blue */ + { 128, 128, 0 }, /* Dk. Yellow */ + { 128, 0, 128 }, /* Dk. Purple */ + { 0, 128, 128 }, /* Dk. Aqua */ + { 65, 105, 225 }, /* Royal Blue */ + { 0, 191, 255 }, /* DeepSkyBlue */ + { 125, 206, 250 }, /* LightSkyBlue */ + { 70, 130, 180 }, /* Steel Blue */ + { 176, 224, 230 }, /* Powder Blue */ + { 127, 255, 212 }, /* Aquamarine */ + { 46, 139, 87 }, /* SeaGreen */ + { 152, 251, 152 }, /* PaleGreen */ + { 124, 252, 0 }, /* LawnGreen */ + { 50, 205, 50 }, /* LimeGreen */ + { 34, 139, 34 }, /* ForestGreen */ + { 255, 215, 0 }, /* Gold */ + { 188, 143, 143 }, /* RosyBrown */ + { 139, 69, 19 }, /* SaddleBrown */ + { 245, 245, 220 }, /* Beige */ + { 210, 180, 140 }, /* Tan */ + { 210, 105, 30 }, /* Chocolate */ + { 165, 42, 42 }, /* Brown */ + { 255, 165, 0 }, /* Orange */ + { 255, 127, 80 }, /* Coral */ + { 255, 99, 71 }, /* Tomato */ + { 255, 105, 180 }, /* HotPink */ + { 255, 192, 203 }, /* Pink */ + { 176, 48, 96 }, /* Maroon */ + { 238, 130, 238 }, /* Violet */ + { 160, 32, 240 }, /* Purple */ + { 16, 16, 16 }, /* Gray */ + { 32, 32, 32 }, /* Gray */ + { 48, 48, 48 }, /* Gray */ + { 64, 64, 64 }, /* Gray */ + { 80, 80, 80 }, /* Gray */ + { 96, 96, 96 }, /* Gray */ + { 112, 112, 122 }, /* Gray */ + { 128, 128, 128 }, /* Gray */ + { 144, 144, 144 }, /* Gray */ + { 160, 160, 160 }, /* Gray */ + { 176, 176, 176 }, /* Gray */ + { 192, 192, 192 }, /* Gray */ + { 208, 208, 208 }, /* Gray */ + { 224, 224, 224 }, /* Gray */ + { 240, 240, 240 }, /* Gray */ + { 0, 0, 0 } /* BlackPixel */ +}; + +static void DoLayerOp(void * data); static void UpdateLayerDlg(void); -/* static void LoadLayerLists(); */ -static void LayerSetCounts(); -static void InitializeLayers( void LayerInitFunc( void ), int newCurrLayer ); -static void LayerPrefSave( void ); -static void LayerPrefLoad( void ); -EXPORT BOOL_T GetLayerVisible( LAYER_T layer ) +static void InitializeLayers(void LayerInitFunc(void), int newCurrLayer); +static void LayerPrefSave(void); +static void LayerPrefLoad(void); + +int IsLayerValid(unsigned int layer) { - if (layer < 0 || layer >= NUM_LAYERS) - return TRUE; - else - return layers[(int)layer].visible; + return (layer <= NUM_LAYERS); } - -EXPORT BOOL_T GetLayerFrozen( LAYER_T layer ) +BOOL_T GetLayerVisible(unsigned int layer) { - if (layer < 0 || layer >= NUM_LAYERS) - return TRUE; - else - return layers[(int)layer].frozen; + if (!IsLayerValid(layer)) { + return TRUE; + } else { + return layers[layer].visible; + } } -EXPORT BOOL_T GetLayerOnMap( LAYER_T layer ) +BOOL_T GetLayerFrozen(unsigned int layer) { - if (layer < 0 || layer >= NUM_LAYERS) - return TRUE; - else - return layers[(int)layer].onMap; + if (!IsLayerValid(layer)) { + return TRUE; + } else { + return layers[layer].frozen; + } } -EXPORT char * GetLayerName( LAYER_T layer ) +BOOL_T GetLayerOnMap(unsigned int layer) { - if (layer < 0 || layer >= NUM_LAYERS) - return NULL; - else - return layers[(int)layer].name; + if (!IsLayerValid(layer)) { + return TRUE; + } else { + return layers[layer].onMap; + } } -EXPORT void NewLayer( void ) +char * GetLayerName(unsigned int layer) { + if (!IsLayerValid(layer)) { + return NULL; + } else { + return layers[layer].name; + } } - -EXPORT wDrawColor GetLayerColor( LAYER_T layer ) +wDrawColor GetLayerColor(unsigned int layer) { - return layers[(int)layer].color; + return layers[layer].color; } -static void FlipLayer( void * arg ) +static void FlipLayer(unsigned int layer) { - LAYER_T l = (LAYER_T)(long)arg; - wBool_t visible; - if ( l < 0 || l >= NUM_LAYERS ) - return; - if ( l == curLayer && layers[(int)l].visible) { - wButtonSetBusy( layer_btns[(int)l], layers[(int)l].visible ); - NoticeMessage( MSG_LAYER_HIDE, _("Ok"), NULL ); - return; - } - RedrawLayer( l, FALSE ); - visible = !layers[(int)l].visible; - layers[(int)l].visible = visible; - if (l<NUM_BUTTONS) { - wButtonSetBusy( layer_btns[(int)l], visible != 0 ); - wButtonSetLabel( layer_btns[(int)l], (char *)show_layer_bmps[(int)l]); - } - RedrawLayer( l, TRUE ); + wBool_t visible; + + if (!IsLayerValid(layer)) { + return; + } + + if (layer == curLayer && layers[layer].visible) { + wButtonSetBusy(layer_btns[layer], layers[layer].visible); + NoticeMessage(MSG_LAYER_HIDE, _("Ok"), NULL); + return; + } + + RedrawLayer(layer, FALSE); + visible = !layers[layer].visible; + layers[layer].visible = visible; + + if (layer<NUM_BUTTONS) { + wButtonSetBusy(layer_btns[layer], visible != 0); + wButtonSetLabel(layer_btns[layer], (char *)show_layer_bmps[layer]); + } + + RedrawLayer(layer, TRUE); } -static void SetCurrLayer( wIndex_t inx, const char * name, wIndex_t op, void * listContext, void * arg ) +static void SetCurrLayer(wIndex_t inx, const char * name, wIndex_t op, + void * listContext, void * arg) { - LAYER_T newLayer = (LAYER_T)(long)inx; - if (layers[(int)newLayer].frozen) { - NoticeMessage( MSG_LAYER_SEL_FROZEN, _("Ok"), NULL ); - wListSetIndex( setLayerL, curLayer ); - return; - } - curLayer = newLayer; - - if ( curLayer < 0 || curLayer >= NUM_LAYERS ) - curLayer = 0; - if ( !layers[(int)curLayer].visible ) - FlipLayer( (void*)(intptr_t)inx ); - if ( recordF ) - fprintf( recordF, "SETCURRLAYER %d\n", inx ); + unsigned int newLayer = (unsigned int)inx; + + if (layers[newLayer].frozen) { + NoticeMessage(MSG_LAYER_SEL_FROZEN, _("Ok"), NULL); + wListSetIndex(setLayerL, curLayer); + return; + } + + curLayer = newLayer; + + if (!IsLayerValid(curLayer)) { + curLayer = 0; + } + + if (!layers[curLayer].visible) { + FlipLayer(inx); + } + + if (recordF) { + fprintf(recordF, "SETCURRLAYER %d\n", inx); + } } -static void PlaybackCurrLayer( char * line ) +static void PlaybackCurrLayer(char * line) { - wIndex_t layer; - layer = atoi(line); - wListSetIndex( setLayerL, layer ); - SetCurrLayer( layer, NULL, 0, NULL, NULL ); + wIndex_t layer; + layer = atoi(line); + wListSetIndex(setLayerL, layer); + SetCurrLayer(layer, NULL, 0, NULL, NULL); } /** @@ -243,19 +259,35 @@ static void PlaybackCurrLayer( char * line ) * \param color IN new color */ -static void SetLayerColor( int inx, wDrawColor color ) +static void SetLayerColor(unsigned int inx, wDrawColor color) +{ + if (color != layers[inx].color) { + if (inx < NUM_BUTTONS) { + wIconSetColor(show_layer_bmps[inx], color); + wButtonSetLabel(layer_btns[inx], (char*)show_layer_bmps[inx]); + } + + layers[inx].color = color; + layoutLayerChanged = TRUE; + } +} + +char * +FormatLayerName(unsigned int layerNumber) { - if ( color != layers[inx].color ) { - if (inx < NUM_BUTTONS) { - wIconSetColor( show_layer_bmps[inx], color ); - wButtonSetLabel( layer_btns[inx], (char*)show_layer_bmps[inx] ); - } - layers[inx].color = color; - layoutLayerChanged = TRUE; - } + DynString string;// = NaS; + char *result; + DynStringMalloc(&string, 0); + DynStringPrintf(&string, + "%2d %c %s", + layerNumber + 1, + (layers[layerNumber].objCount > 0 ? '+' : '-'), + layers[layerNumber].name); + result = strdup(DynStringToCStr(&string)); + DynStringFree(&string); + return result; } - #include "bitmaps/l1.xbm" #include "bitmaps/l2.xbm" @@ -359,31 +391,32 @@ static void SetLayerColor( int inx, wDrawColor color ) static char * show_layer_bits[NUM_BUTTONS] = { - l1_bits, l2_bits, l3_bits, l4_bits, l5_bits, l6_bits, l7_bits, l8_bits, l9_bits, l10_bits, - l11_bits, l12_bits, l13_bits, l14_bits, l15_bits, l16_bits, l17_bits, l18_bits, l19_bits, l20_bits, - l21_bits, l22_bits, l23_bits, l24_bits, l25_bits, l26_bits, l27_bits, l28_bits, l29_bits, l30_bits, - l31_bits, l32_bits, l33_bits, l34_bits, l35_bits, l36_bits, l37_bits, l38_bits, l39_bits, l40_bits, - l41_bits, l42_bits, l43_bits, l44_bits, l45_bits, l46_bits, l47_bits, l48_bits, l49_bits, l50_bits, - l51_bits, l52_bits, l53_bits, l54_bits, l55_bits, l56_bits, l57_bits, l58_bits, l59_bits, l60_bits, - l61_bits, l62_bits, l63_bits, l64_bits, l65_bits, l66_bits, l67_bits, l68_bits, l69_bits, l70_bits, - l71_bits, l72_bits, l73_bits, l74_bits, l75_bits, l76_bits, l77_bits, l78_bits, l79_bits, l80_bits, - l81_bits, l82_bits, l83_bits, l84_bits, l85_bits, l86_bits, l87_bits, l88_bits, l89_bits, l90_bits, - l91_bits, l92_bits, l93_bits, l94_bits, l95_bits, l96_bits, l97_bits, l98_bits, l99_bits, + l1_bits, l2_bits, l3_bits, l4_bits, l5_bits, l6_bits, l7_bits, l8_bits, l9_bits, l10_bits, + l11_bits, l12_bits, l13_bits, l14_bits, l15_bits, l16_bits, l17_bits, l18_bits, l19_bits, l20_bits, + l21_bits, l22_bits, l23_bits, l24_bits, l25_bits, l26_bits, l27_bits, l28_bits, l29_bits, l30_bits, + l31_bits, l32_bits, l33_bits, l34_bits, l35_bits, l36_bits, l37_bits, l38_bits, l39_bits, l40_bits, + l41_bits, l42_bits, l43_bits, l44_bits, l45_bits, l46_bits, l47_bits, l48_bits, l49_bits, l50_bits, + l51_bits, l52_bits, l53_bits, l54_bits, l55_bits, l56_bits, l57_bits, l58_bits, l59_bits, l60_bits, + l61_bits, l62_bits, l63_bits, l64_bits, l65_bits, l66_bits, l67_bits, l68_bits, l69_bits, l70_bits, + l71_bits, l72_bits, l73_bits, l74_bits, l75_bits, l76_bits, l77_bits, l78_bits, l79_bits, l80_bits, + l81_bits, l82_bits, l83_bits, l84_bits, l85_bits, l86_bits, l87_bits, l88_bits, l89_bits, l90_bits, + l91_bits, l92_bits, l93_bits, l94_bits, l95_bits, l96_bits, l97_bits, l98_bits, l99_bits, }; -static EXPORT long layerRawColorTab[] = { - wRGB( 0, 0,255), /* blue */ - wRGB( 0, 0,128), /* dk blue */ - wRGB( 0,128, 0), /* dk green */ - wRGB(255,255, 0), /* yellow */ - wRGB( 0,255, 0), /* green */ - wRGB( 0,255,255), /* lt cyan */ - wRGB(128, 0, 0), /* brown */ - wRGB(128, 0,128), /* purple */ - wRGB(128,128, 0), /* green-brown */ - wRGB(255, 0,255)}; /* lt-purple */ -static EXPORT wDrawColor layerColorTab[COUNT(layerRawColorTab)]; +static long layerRawColorTab[] = { + wRGB(0, 0,255), /* blue */ + wRGB(0, 0,128), /* dk blue */ + wRGB(0,128, 0), /* dk green */ + wRGB(255,255, 0), /* yellow */ + wRGB(0,255, 0), /* green */ + wRGB(0,255,255), /* lt cyan */ + wRGB(128, 0, 0), /* brown */ + wRGB(128, 0,128), /* purple */ + wRGB(128,128, 0), /* green-brown */ + wRGB(255, 0,255) +}; /* lt-purple */ +static wDrawColor layerColorTab[COUNT(layerRawColorTab)]; static wWin_p layerW; @@ -392,7 +425,7 @@ static wDrawColor layerColor; static long layerVisible = TRUE; static long layerFrozen = FALSE; static long layerOnMap = TRUE; -static void LayerOk( void * ); +static void LayerOk(void *); static BOOL_T layerRedrawMap = FALSE; #define ENUMLAYER_RELOAD (1) @@ -406,24 +439,24 @@ static paramIntegerRange_t i0_20 = { 0, NUM_BUTTONS }; static paramData_t layerPLs[] = { #define I_LIST (0) - { PD_DROPLIST, NULL, "layer", PDO_LISTINDEX|PDO_DLGNOLABELALIGN, (void*)250 }, + { PD_DROPLIST, NULL, "layer", PDO_LISTINDEX|PDO_DLGNOLABELALIGN, (void*)250 }, #define I_NAME (1) - { PD_STRING, layerName, "name", PDO_NOPREF, (void*)(250-54), N_("Name") }, + { PD_STRING, layerName, "name", PDO_NOPREF, (void*)(250-54), N_("Name") }, #define I_COLOR (2) - { PD_COLORLIST, &layerColor, "color", PDO_NOPREF, NULL, N_("Color") }, + { PD_COLORLIST, &layerColor, "color", PDO_NOPREF, NULL, N_("Color") }, #define I_VIS (3) - { PD_TOGGLE, &layerVisible, "visible", PDO_NOPREF, visibleLabels, N_("Visible"), BC_HORZ|BC_NOBORDER }, + { PD_TOGGLE, &layerVisible, "visible", PDO_NOPREF, visibleLabels, N_("Visible"), BC_HORZ|BC_NOBORDER }, #define I_FRZ (4) - { PD_TOGGLE, &layerFrozen, "frozen", PDO_NOPREF|PDO_DLGHORZ, frozenLabels, N_("Frozen"), BC_HORZ|BC_NOBORDER }, + { PD_TOGGLE, &layerFrozen, "frozen", PDO_NOPREF|PDO_DLGHORZ, frozenLabels, N_("Frozen"), BC_HORZ|BC_NOBORDER }, #define I_MAP (5) - { PD_TOGGLE, &layerOnMap, "onmap", PDO_NOPREF|PDO_DLGHORZ, onMapLabels, N_("On Map"), BC_HORZ|BC_NOBORDER }, + { PD_TOGGLE, &layerOnMap, "onmap", PDO_NOPREF|PDO_DLGHORZ, onMapLabels, N_("On Map"), BC_HORZ|BC_NOBORDER }, #define I_COUNT (6) - { PD_STRING, NULL, "object-count", PDO_NOPREF|PDO_DLGBOXEND, (void*)(80), N_("Count"), BO_READONLY }, - { PD_MESSAGE, N_("Personal Preferences"), NULL, PDO_DLGRESETMARGIN, (void *)180 }, - { PD_BUTTON, (void*)DoLayerOp, "reset", PDO_DLGRESETMARGIN, 0, N_("Load"), 0, (void *)ENUMLAYER_RELOAD }, - { PD_BUTTON, (void*)DoLayerOp, "save", PDO_DLGHORZ, 0, N_("Save"), 0, (void *)ENUMLAYER_SAVE }, - { PD_BUTTON, (void*)DoLayerOp, "clear", PDO_DLGHORZ | PDO_DLGBOXEND, 0, N_("Defaults"), 0, (void *)ENUMLAYER_CLEAR }, - { PD_LONG, &newLayerCount, "button-count", PDO_DLGBOXEND|PDO_DLGRESETMARGIN, &i0_20, N_("Number of Layer Buttons") }, + { PD_STRING, NULL, "object-count", PDO_NOPREF|PDO_DLGBOXEND, (void*)(80), N_("Count"), BO_READONLY }, + { PD_MESSAGE, N_("Personal Preferences"), NULL, PDO_DLGRESETMARGIN, (void *)180 }, + { PD_BUTTON, (void*)DoLayerOp, "reset", PDO_DLGRESETMARGIN, 0, N_("Load"), 0, (void *)ENUMLAYER_RELOAD }, + { PD_BUTTON, (void*)DoLayerOp, "save", PDO_DLGHORZ, 0, N_("Save"), 0, (void *)ENUMLAYER_SAVE }, + { PD_BUTTON, (void*)DoLayerOp, "clear", PDO_DLGHORZ | PDO_DLGBOXEND, 0, N_("Defaults"), 0, (void *)ENUMLAYER_CLEAR }, + { PD_LONG, &newLayerCount, "button-count", PDO_DLGBOXEND|PDO_DLGRESETMARGIN, &i0_20, N_("Number of Layer Buttons") }, }; static paramGroup_t layerPG = { "layer", 0, layerPLs, sizeof layerPLs/sizeof layerPLs[0] }; @@ -433,120 +466,125 @@ static paramGroup_t layerPG = { "layer", 0, layerPLs, sizeof layerPLs/sizeof lay /** * Load the layer settings to hard coded system defaults */ - + void -LayerSystemDefaults( void ) +LayerSystemDefaults(void) { - int inx; - - for ( inx=0;inx<NUM_LAYERS; inx++ ) { - strcpy( layers[inx].name, inx==0?_("Main"):"" ); - layers[inx].visible = TRUE; - layers[inx].frozen = FALSE; - layers[inx].onMap = TRUE; - layers[inx].objCount = 0; - SetLayerColor( inx, layerColorTab[inx%COUNT(layerColorTab)] ); - } + int inx; + + for (inx=0; inx<NUM_LAYERS; inx++) { + strcpy(layers[inx].name, inx==0?_("Main"):""); + layers[inx].visible = TRUE; + layers[inx].frozen = FALSE; + layers[inx].onMap = TRUE; + layers[inx].objCount = 0; + SetLayerColor(inx, layerColorTab[inx%COUNT(layerColorTab)]); + } } /** - * Load the layer listboxes in Manage Layers and the Toolbar with up-to-date information. + * Load the layer listboxes in Manage Layers and the Toolbar with up-to-date information. */ -EXPORT void LoadLayerLists( void ) +void LoadLayerLists(void) { - int inx; - - /* clear both lists */ - wListClear(setLayerL); - if ( layerL ) - wListClear(layerL); - - /* add all layers to both lists */ - for ( inx=0; inx<NUM_LAYERS; inx++ ) { - - if ( layerL ) { - sprintf( message, "%2d %c %s", inx+1, layers[inx].objCount>0?'+':'-', layers[inx].name ); - wListAddValue( layerL, message, NULL, NULL ); - } - - sprintf( message, "%2d : %s", inx+1, layers[inx].name ); - wListAddValue( setLayerL, message, NULL, NULL ); - } - - /* set current layer to selected */ - wListSetIndex( setLayerL, curLayer ); - if ( layerL ) - wListSetIndex( layerL, curLayer ); + int inx; + /* clear both lists */ + wListClear(setLayerL); + + if (layerL) { + wListClear(layerL); + } + + /* add all layers to both lists */ + for (inx=0; inx<NUM_LAYERS; inx++) { + char *layerLabel; + layerLabel = FormatLayerName(inx); + + if (layerL) { + wListAddValue(layerL, layerLabel, NULL, NULL); + } + + wListAddValue(setLayerL, layerLabel, NULL, NULL); + free(layerLabel); + } + + /* set current layer to selected */ + wListSetIndex(setLayerL, curLayer); + + if (layerL) { + wListSetIndex(layerL, curLayer); + } } /** * Handle button presses for the layer dialog. For all button presses in the layer * dialog, this function is called. The parameter identifies the button pressed and - * the operation is performed. + * the operation is performed. * * \param[IN] data identifier for the button prerssed - * \return + * \return */ -static void DoLayerOp( void * data ) +static void DoLayerOp(void * data) { - switch((long)data ) { - - case ENUMLAYER_CLEAR: - InitializeLayers( LayerSystemDefaults, -1 ); - break; - case ENUMLAYER_SAVE: - LayerPrefSave(); - break; - case ENUMLAYER_RELOAD: - LayerPrefLoad(); - break; - } - - UpdateLayerDlg(); - if( layoutLayerChanged ) { - MainProc( mainW, wResize_e, NULL ); - layoutLayerChanged = FALSE; - changed = TRUE; - SetWindowTitle(); - } + switch ((long)data) { + case ENUMLAYER_CLEAR: + InitializeLayers(LayerSystemDefaults, -1); + break; + + case ENUMLAYER_SAVE: + LayerPrefSave(); + break; + + case ENUMLAYER_RELOAD: + LayerPrefLoad(); + break; + } + + UpdateLayerDlg(); + + if (layoutLayerChanged) { + MainProc(mainW, wResize_e, NULL); + layoutLayerChanged = FALSE; + changed = TRUE; + SetWindowTitle(); + } } /** - * Update all dialogs and dialog elements after changing layers preferences. Once the global array containing + * Update all dialogs and dialog elements after changing layers preferences. Once the global array containing * the settings for the labels has been changed, this function needs to be called to update all the user interface * elements to the new settings. */ -static void +static void UpdateLayerDlg() { - int inx; - - /* update the globals for the layer dialog */ - layerVisible = layers[curLayer].visible; - layerFrozen = layers[curLayer].frozen; - layerOnMap = layers[curLayer].onMap; - layerColor = layers[curLayer].color; - strcpy( layerName, layers[curLayer].name ); - layerCurrent = curLayer; - - /* now re-load the layer list boxes */ - LoadLayerLists(); - - sprintf( message, "%ld", layers[curLayer].objCount ); - ParamLoadMessage( &layerPG, I_COUNT, message ); - - /* force update of the 'manage layers' dialogbox */ - if( layerL ) - ParamLoadControls( &layerPG ); - - /* finally show the layer buttons with ballon text */ - for( inx = 0; inx < NUM_BUTTONS; inx++ ) { - wButtonSetBusy( layer_btns[inx], layers[inx].visible != 0 ); - wControlSetBalloonText( (wControl_p)layer_btns[inx], (layers[inx].name[0] != '\0' ? layers[inx].name :_("Show/Hide Layer") )); - } + int inx; + /* update the globals for the layer dialog */ + layerVisible = layers[curLayer].visible; + layerFrozen = layers[curLayer].frozen; + layerOnMap = layers[curLayer].onMap; + layerColor = layers[curLayer].color; + strcpy(layerName, layers[curLayer].name); + layerCurrent = curLayer; + /* now re-load the layer list boxes */ + LoadLayerLists(); + sprintf(message, "%ld", layers[curLayer].objCount); + ParamLoadMessage(&layerPG, I_COUNT, message); + + /* force update of the 'manage layers' dialogbox */ + if (layerL) { + ParamLoadControls(&layerPG); + } + + /* finally show the layer buttons with ballon text */ + for (inx = 0; inx < NUM_BUTTONS; inx++) { + wButtonSetBusy(layer_btns[inx], layers[inx].visible != 0); + wControlSetBalloonText((wControl_p)layer_btns[inx], + (layers[inx].name[0] != '\0' ? layers[inx].name :_("Show/Hide Layer"))); + } } /** @@ -557,164 +595,170 @@ UpdateLayerDlg() */ static void -InitializeLayers( void LayerInitFunc( void ), int newCurrLayer ) +InitializeLayers(void LayerInitFunc(void), int newCurrLayer) { - /* reset the data structures to default valuses */ - LayerInitFunc(); - - /* count the objects on each layer */ - LayerSetCounts(); - - /* Switch the current layer when requested */ - if( newCurrLayer != -1 ) - { - curLayer = newCurrLayer; - } -} + /* reset the data structures to default valuses */ + LayerInitFunc(); + /* count the objects on each layer */ + LayerSetCounts(); + + /* Switch the current layer when requested */ + if (newCurrLayer != -1) { + curLayer = newCurrLayer; + } +} /** * Save the customized layer information to preferences. */ - -static void -LayerPrefSave( void ) + +static void +LayerPrefSave(void) { - int inx; - int flags; - char buffer[ 80 ]; - char layersSaved[ 3 * NUM_LAYERS ]; /* 0..99 plus separator */ - - /* FIXME: values for layers that are configured to default now should be overwritten in the settings */ - - layersSaved[ 0 ] = '\0'; - - for( inx = 0; inx < NUM_LAYERS; inx++ ) { - /* if a name is set that is not the default value or a color different from the default has been set, - information about the layer needs to be saved */ - if( (layers[inx].name[0] && inx != 0 ) || - layers[inx].frozen || (!layers[inx].onMap) || (!layers[inx].visible) || - layers[inx].color != layerColorTab[inx%COUNT(layerColorTab)]) - { - sprintf( buffer, LAYERPREF_NAME ".%0d", inx ); - wPrefSetString( LAYERPREF_SECTION, buffer, layers[inx].name ); - - sprintf( buffer, LAYERPREF_COLOR ".%0d", inx ); - wPrefSetInteger( LAYERPREF_SECTION, buffer, wDrawGetRGB(layers[inx].color)); - - flags = 0; - if( layers[inx].frozen ) - flags |= LAYERPREF_FROZEN; - if( layers[inx].onMap ) - flags |= LAYERPREF_ONMAP; - if( layers[inx].visible ) - flags |= LAYERPREF_VISIBLE; - - sprintf( buffer, LAYERPREF_FLAGS ".%0d", inx ); - wPrefSetInteger( LAYERPREF_SECTION, buffer, flags ); - - /* extend the list of layers that are set up via the preferences */ - if( layersSaved[ 0 ] ) - strcat( layersSaved, "," ); - - sprintf( layersSaved, "%s%d", layersSaved, inx ); - } - } - - wPrefSetString( LAYERPREF_SECTION, "layers", layersSaved ); + unsigned int inx; + int flags; + char buffer[ 80 ]; + char layersSaved[ 3 * NUM_LAYERS + 1 ]; /* 0..99 plus separator */ + /* FIXME: values for layers that are configured to default now should be overwritten in the settings */ + layersSaved[ 0 ] = '\0'; + + for (inx = 0; inx < NUM_LAYERS; inx++) { + /* if a name is set that is not the default value or a color different from the default has been set, + information about the layer needs to be saved */ + if ((layers[inx].name[0] && inx != 0) || + layers[inx].frozen || (!layers[inx].onMap) || (!layers[inx].visible) || + layers[inx].color != layerColorTab[inx%COUNT(layerColorTab)]) { + sprintf(buffer, LAYERPREF_NAME ".%0u", inx); + wPrefSetString(LAYERPREF_SECTION, buffer, layers[inx].name); + sprintf(buffer, LAYERPREF_COLOR ".%0u", inx); + wPrefSetInteger(LAYERPREF_SECTION, buffer, wDrawGetRGB(layers[inx].color)); + flags = 0; + + if (layers[inx].frozen) { + flags |= LAYERPREF_FROZEN; + } + + if (layers[inx].onMap) { + flags |= LAYERPREF_ONMAP; + } + + if (layers[inx].visible) { + flags |= LAYERPREF_VISIBLE; + } + + sprintf(buffer, LAYERPREF_FLAGS ".%0u", inx); + wPrefSetInteger(LAYERPREF_SECTION, buffer, flags); + + /* extend the list of layers that are set up via the preferences */ + if (layersSaved[ 0 ]) { + strcat(layersSaved, ","); + } + + sprintf(buffer, "%u", inx); + strcat(layersSaved, buffer); + } + } + + wPrefSetString(LAYERPREF_SECTION, "layers", layersSaved); } /** - * Load the settings for all layers from the preferences. + * Load the settings for all layers from the preferences. */ static void -LayerPrefLoad( void ) +LayerPrefLoad(void) { - - int inx; - char layersSaved[ 3 * NUM_LAYERS ]; - char layerOption[ 20 ]; - const char *layerValue; - const char *prefString; - long rgb; - int color; - long flags; - - /* reset layer preferences to system default */ - LayerSystemDefaults(); - - prefString = wPrefGetString( LAYERPREF_SECTION, "layers" ); - if( prefString && prefString[ 0 ] ) { - strncpy( layersSaved, prefString, sizeof( layersSaved )); - prefString = strtok( layersSaved, "," ); - while( prefString ) { - inx = atoi( prefString ); - sprintf( layerOption, LAYERPREF_NAME ".%d", inx ); - layerValue = wPrefGetString( LAYERPREF_SECTION, layerOption ); - if( layerValue ) - strcpy( layers[inx].name, layerValue ); - else - *(layers[inx].name) = '\0'; - - /* get and set the color, using the system default color in case color is not available from prefs */ - sprintf( layerOption, LAYERPREF_COLOR ".%d", inx ); - wPrefGetInteger( LAYERPREF_SECTION, layerOption, &rgb, layerColorTab[inx%COUNT(layerColorTab)] ); - color = wDrawFindColor(rgb); - SetLayerColor( inx, color ); - - /* get and set the flags */ - sprintf( layerOption, LAYERPREF_FLAGS ".%d", inx ); - wPrefGetInteger( LAYERPREF_SECTION, layerOption, &flags, LAYERPREF_ONMAP | LAYERPREF_VISIBLE ); - - layers[inx].frozen = ((flags & LAYERPREF_FROZEN) != 0 ); - layers[inx].onMap = ((flags & LAYERPREF_ONMAP) != 0 ); - layers[inx].visible = (( flags & LAYERPREF_VISIBLE ) != 0 ); - - prefString = strtok( NULL, ","); - } - } + const char *prefString; + long rgb; + long flags; + /* reset layer preferences to system default */ + LayerSystemDefaults(); + prefString = wPrefGetString(LAYERPREF_SECTION, "layers"); + + if (prefString && prefString[ 0 ]) { + char layersSaved[3 * NUM_LAYERS]; + strncpy(layersSaved, prefString, sizeof(layersSaved)); + prefString = strtok(layersSaved, ","); + + while (prefString) { + int inx; + char layerOption[20]; + const char *layerValue; + int color; + inx = atoi(prefString); + sprintf(layerOption, LAYERPREF_NAME ".%d", inx); + layerValue = wPrefGetString(LAYERPREF_SECTION, layerOption); + + if (layerValue) { + strcpy(layers[inx].name, layerValue); + } else { + *(layers[inx].name) = '\0'; + } + + /* get and set the color, using the system default color in case color is not available from prefs */ + sprintf(layerOption, LAYERPREF_COLOR ".%d", inx); + wPrefGetInteger(LAYERPREF_SECTION, layerOption, &rgb, + layerColorTab[inx%COUNT(layerColorTab)]); + color = wDrawFindColor(rgb); + SetLayerColor(inx, color); + /* get and set the flags */ + sprintf(layerOption, LAYERPREF_FLAGS ".%d", inx); + wPrefGetInteger(LAYERPREF_SECTION, layerOption, &flags, + LAYERPREF_ONMAP | LAYERPREF_VISIBLE); + layers[inx].frozen = ((flags & LAYERPREF_FROZEN) != 0); + layers[inx].onMap = ((flags & LAYERPREF_ONMAP) != 0); + layers[inx].visible = ((flags & LAYERPREF_VISIBLE) != 0); + prefString = strtok(NULL, ","); + } + } } /** - * Count the number of elements on a layer. - * NOTE: This function has been implemented but not actually been tested. As it might prove useful in the - * future I left it in place. So you have been warned! - * \param IN layer to count - * \return number of elements + * Increment the count of objects on a given layer. + * + * \param index IN the layer to change */ -/* -static int LayerCount( int layer ) + +void IncrementLayerObjects(unsigned int layer) { - track_p trk; - int inx; - int count = 0; - - for( trk = NULL; TrackIterate(&trk); ) { - inx = GetTrkLayer( trk ); - if( inx == layer ) - count++; - } - - return count; -} + assert(layer <= NUM_LAYERS); + layers[layer].objCount++; +} + +/** +* Decrement the count of objects on a given layer. +* +* \param index IN the layer to change */ +void DecrementLayerObjects(unsigned int layer) +{ + assert(layer <= NUM_LAYERS); + layers[layer].objCount--; +} + /** * Count the number of objects on each layer and store result in layers data structure. */ -EXPORT void LayerSetCounts( void ) +void LayerSetCounts(void) { - int inx; - track_p trk; - for ( inx=0; inx<NUM_LAYERS; inx++ ) - layers[inx].objCount = 0; - for ( trk=NULL; TrackIterate(&trk); ) { - inx = GetTrkLayer(trk); - if ( inx >= 0 && inx < NUM_LAYERS ) - layers[inx].objCount++; - } + int inx; + track_p trk; + + for (inx=0; inx<NUM_LAYERS; inx++) { + layers[inx].objCount = 0; + } + + for (trk=NULL; TrackIterate(&trk);) { + inx = GetTrkLayer(trk); + + if (inx >= 0 && inx < NUM_LAYERS) { + layers[inx].objCount++; + } + } } /** @@ -722,16 +766,16 @@ EXPORT void LayerSetCounts( void ) * from the preferences file. */ -EXPORT void +void DefaultLayerProperties(void) { - InitializeLayers( LayerPrefLoad, 0 ); + InitializeLayers(LayerPrefLoad, 0); + UpdateLayerDlg(); - UpdateLayerDlg(); - if( layoutLayerChanged ) { - MainProc( mainW, wResize_e, NULL ); - layoutLayerChanged = FALSE; - } + if (layoutLayerChanged) { + MainProc(mainW, wResize_e, NULL); + layoutLayerChanged = FALSE; + } } /** @@ -739,158 +783,190 @@ DefaultLayerProperties(void) * */ -static void LayerUpdate( void ) +static void LayerUpdate(void) { - BOOL_T redraw; - ParamLoadData( &layerPG ); - if (layerCurrent < 0 || layerCurrent >= NUM_LAYERS) - return; - if (layerCurrent == curLayer && layerFrozen) { - NoticeMessage( MSG_LAYER_FREEZE, _("Ok"), NULL ); - layerFrozen = FALSE; - ParamLoadControl( &layerPG, I_FRZ ); - } - if (layerCurrent == curLayer && !layerVisible) { - NoticeMessage( MSG_LAYER_HIDE, _("Ok"), NULL ); - layerVisible = TRUE; - ParamLoadControl( &layerPG, I_VIS ); - } - - if( strcmp( layers[(int)layerCurrent].name, layerName ) || - layerColor != layers[(int)layerCurrent].color || - layers[(int)layerCurrent].visible != (BOOL_T)layerVisible || - layers[(int)layerCurrent].frozen != (BOOL_T)layerFrozen || - layers[(int)layerCurrent].onMap != (BOOL_T)layerOnMap ) { - - changed = TRUE; - SetWindowTitle(); - } - - if ( layerL ) { - strncpy( layers[(int)layerCurrent].name, layerName, sizeof layers[(int)layerCurrent].name ); - sprintf( message, "%2d %c %s", (int)layerCurrent+1, layers[(int)layerCurrent].objCount>0?'+':'-', layers[(int)layerCurrent].name ); - wListSetValues( layerL, layerCurrent, message, NULL, NULL ); - } - - sprintf( message, "%2d : %s", (int)layerCurrent+1, layers[(int)layerCurrent].name ); - wListSetValues( setLayerL, layerCurrent, message, NULL, NULL ); - if (layerCurrent < NUM_BUTTONS) { - if (strlen(layers[(int)layerCurrent].name)>0) - wControlSetBalloonText( (wControl_p)layer_btns[(int)layerCurrent], layers[(int)layerCurrent].name ); - else - wControlSetBalloonText( (wControl_p)layer_btns[(int)layerCurrent], _("Show/Hide Layer") ); - } - redraw = ( layerColor != layers[(int)layerCurrent].color || - (BOOL_T)layerVisible != layers[(int)layerCurrent].visible ); - if ( (!layerRedrawMap) && redraw) - RedrawLayer( (LAYER_T)layerCurrent, FALSE ); - - SetLayerColor( layerCurrent, layerColor ); - - if (layerCurrent<NUM_BUTTONS && layers[(int)layerCurrent].visible!=(BOOL_T)layerVisible) { - wButtonSetBusy( layer_btns[(int)layerCurrent], layerVisible ); - } - layers[(int)layerCurrent].visible = (BOOL_T)layerVisible; - layers[(int)layerCurrent].frozen = (BOOL_T)layerFrozen; - layers[(int)layerCurrent].onMap = (BOOL_T)layerOnMap; - if ( layerRedrawMap ) - DoRedraw(); - else if (redraw) - RedrawLayer( (LAYER_T)layerCurrent, TRUE ); - layerRedrawMap = FALSE; + BOOL_T redraw; + char *layerFormattedName; + ParamLoadData(&layerPG); + + if (!IsLayerValid(layerCurrent)) { + return; + } + + if (layerCurrent == curLayer && layerFrozen) { + NoticeMessage(MSG_LAYER_FREEZE, _("Ok"), NULL); + layerFrozen = FALSE; + ParamLoadControl(&layerPG, I_FRZ); + } + + if (layerCurrent == curLayer && !layerVisible) { + NoticeMessage(MSG_LAYER_HIDE, _("Ok"), NULL); + layerVisible = TRUE; + ParamLoadControl(&layerPG, I_VIS); + } + + if (strcmp(layers[(int)layerCurrent].name, layerName) || + layerColor != layers[(int)layerCurrent].color || + layers[(int)layerCurrent].visible != (BOOL_T)layerVisible || + layers[(int)layerCurrent].frozen != (BOOL_T)layerFrozen || + layers[(int)layerCurrent].onMap != (BOOL_T)layerOnMap) { + changed = TRUE; + SetWindowTitle(); + } + + if (layerL) { + strncpy(layers[(int)layerCurrent].name, layerName, + sizeof layers[(int)layerCurrent].name); + layerFormattedName = FormatLayerName(layerCurrent); + wListSetValues(layerL, layerCurrent, layerFormattedName, NULL, NULL); + free(layerFormattedName); + } + + layerFormattedName = FormatLayerName(layerCurrent); + wListSetValues(setLayerL, layerCurrent, layerFormattedName, NULL, NULL); + free(layerFormattedName); + + if (layerCurrent < NUM_BUTTONS) { + if (strlen(layers[(int)layerCurrent].name)>0) { + wControlSetBalloonText((wControl_p)layer_btns[(int)layerCurrent], + layers[(int)layerCurrent].name); + } else { + wControlSetBalloonText((wControl_p)layer_btns[(int)layerCurrent], + _("Show/Hide Layer")); + } + } + + redraw = (layerColor != layers[(int)layerCurrent].color || + (BOOL_T)layerVisible != layers[(int)layerCurrent].visible); + + if ((!layerRedrawMap) && redraw) { + RedrawLayer((unsigned int)layerCurrent, FALSE); + } + + SetLayerColor(layerCurrent, layerColor); + + if (layerCurrent<NUM_BUTTONS && + layers[(int)layerCurrent].visible!=(BOOL_T)layerVisible) { + wButtonSetBusy(layer_btns[(int)layerCurrent], layerVisible); + } + + layers[(int)layerCurrent].visible = (BOOL_T)layerVisible; + layers[(int)layerCurrent].frozen = (BOOL_T)layerFrozen; + layers[(int)layerCurrent].onMap = (BOOL_T)layerOnMap; + + if (layerRedrawMap) { + DoRedraw(); + } else if (redraw) { + RedrawLayer((unsigned int)layerCurrent, TRUE); + } + + layerRedrawMap = FALSE; } -static void LayerSelect( - wIndex_t inx ) +static void LayerSelect( + wIndex_t inx) { - LayerUpdate(); - if (inx < 0 || inx >= NUM_LAYERS) - return; - layerCurrent = (LAYER_T)inx; - strcpy( layerName, layers[inx].name ); - layerVisible = layers[inx].visible; - layerFrozen = layers[inx].frozen; - layerOnMap = layers[inx].onMap; - layerColor = layers[inx].color; - sprintf( message, "%ld", layers[inx].objCount ); - - ParamLoadMessage( &layerPG, I_COUNT, message ); - ParamLoadControls( &layerPG ); + LayerUpdate(); + + if (inx < 0 || inx >= NUM_LAYERS) { + return; + } + + layerCurrent = (unsigned int)inx; + strcpy(layerName, layers[inx].name); + layerVisible = layers[inx].visible; + layerFrozen = layers[inx].frozen; + layerOnMap = layers[inx].onMap; + layerColor = layers[inx].color; + sprintf(message, "%ld", layers[inx].objCount); + ParamLoadMessage(&layerPG, I_COUNT, message); + ParamLoadControls(&layerPG); } -EXPORT void ResetLayers( void ) +void ResetLayers(void) { - int inx; - for ( inx=0;inx<NUM_LAYERS; inx++ ) { - strcpy( layers[inx].name, inx==0?_("Main"):"" ); - layers[inx].visible = TRUE; - layers[inx].frozen = FALSE; - layers[inx].onMap = TRUE; - layers[inx].objCount = 0; - SetLayerColor( inx, layerColorTab[inx%COUNT(layerColorTab)] ); - if ( inx<NUM_BUTTONS ) { - wButtonSetLabel( layer_btns[inx], (char*)show_layer_bmps[inx] ); - } - } - wControlSetBalloonText( (wControl_p)layer_btns[0], _("Main") ); - for ( inx=1; inx<NUM_BUTTONS; inx++ ) { - wControlSetBalloonText( (wControl_p)layer_btns[inx], _("Show/Hide Layer") ); - } - curLayer = 0; - layerVisible = TRUE; - layerFrozen = FALSE; - layerOnMap = TRUE; - layerColor = layers[0].color; - strcpy( layerName, layers[0].name ); - LoadLayerLists(); - - if (layerL) { - ParamLoadControls( &layerPG ); - ParamLoadMessage( &layerPG, I_COUNT, "0" ); - } + int inx; + + for (inx=0; inx<NUM_LAYERS; inx++) { + strcpy(layers[inx].name, inx==0?_("Main"):""); + layers[inx].visible = TRUE; + layers[inx].frozen = FALSE; + layers[inx].onMap = TRUE; + layers[inx].objCount = 0; + SetLayerColor(inx, layerColorTab[inx%COUNT(layerColorTab)]); + + if (inx<NUM_BUTTONS) { + wButtonSetLabel(layer_btns[inx], (char*)show_layer_bmps[inx]); + } + } + + wControlSetBalloonText((wControl_p)layer_btns[0], _("Main")); + + for (inx=1; inx<NUM_BUTTONS; inx++) { + wControlSetBalloonText((wControl_p)layer_btns[inx], _("Show/Hide Layer")); + } + + curLayer = 0; + layerVisible = TRUE; + layerFrozen = FALSE; + layerOnMap = TRUE; + layerColor = layers[0].color; + strcpy(layerName, layers[0].name); + LoadLayerLists(); + + if (layerL) { + ParamLoadControls(&layerPG); + ParamLoadMessage(&layerPG, I_COUNT, "0"); + } } -EXPORT void SaveLayers( void ) +void SaveLayers(void) { - layers_save = malloc( NUM_LAYERS * sizeof( layer_t )); - assert( layers_save != NULL ); - - memcpy( layers_save, layers, NUM_LAYERS * sizeof layers[0] ); - ResetLayers(); + layers_save = malloc(NUM_LAYERS * sizeof(layers[0])); + + if (layers_save == NULL) { + abort(); + } + + memcpy(layers_save, layers, NUM_LAYERS * sizeof layers[0]); + ResetLayers(); } -EXPORT void RestoreLayers( void ) +void RestoreLayers(void) { - int inx; - char * label; - wDrawColor color; - - assert( layers_save != NULL ); - memcpy( layers, layers_save, NUM_LAYERS * sizeof layers[0] ); - free( layers_save ); - - for ( inx=0; inx<NUM_BUTTONS; inx++ ) { - color = layers[inx].color; - layers[inx].color = -1; - SetLayerColor( inx, color ); - if ( layers[inx].name[0] == '\0' ) { - if ( inx == 0 ) { - label = _("Main"); - } else { - label = _("Show/Hide Layer"); - } - } else { - label = layers[inx].name; - } - wControlSetBalloonText( (wControl_p)layer_btns[inx], label ); - } - if (layerL) { - ParamLoadControls( &layerPG ); - ParamLoadMessage( &layerPG, I_COUNT, "0" ); - } - LoadLayerLists(); + int inx; + char * label; + wDrawColor color; + assert(layers_save != NULL); + memcpy(layers, layers_save, NUM_LAYERS * sizeof layers[0]); + free(layers_save); + + for (inx=0; inx<NUM_BUTTONS; inx++) { + color = layers[inx].color; + layers[inx].color = -1; + SetLayerColor(inx, color); + + if (layers[inx].name[0] == '\0') { + if (inx == 0) { + label = _("Main"); + } else { + label = _("Show/Hide Layer"); + } + } else { + label = layers[inx].name; + } + + wControlSetBalloonText((wControl_p)layer_btns[inx], label); + } + + if (layerL) { + ParamLoadControls(&layerPG); + ParamLoadMessage(&layerPG, I_COUNT, "0"); + } + + LoadLayerLists(); } /** @@ -900,172 +976,240 @@ EXPORT void RestoreLayers( void ) * \param IN ignored * */ - -static void LayerOk( void * junk ) + +static void LayerOk(void * junk) { - LayerSelect( layerCurrent ); - - if (newLayerCount != layerCount) { - layoutLayerChanged = TRUE; - if ( newLayerCount > NUM_BUTTONS ) - newLayerCount = NUM_BUTTONS; - layerCount = newLayerCount; - } - if (layoutLayerChanged) - MainProc( mainW, wResize_e, NULL ); - wHide( layerW ); + LayerSelect(layerCurrent); + + if (newLayerCount != layerCount) { + layoutLayerChanged = TRUE; + + if (newLayerCount > NUM_BUTTONS) { + newLayerCount = NUM_BUTTONS; + } + + layerCount = newLayerCount; + } + + if (layoutLayerChanged) { + MainProc(mainW, wResize_e, NULL); + } + + wHide(layerW); } static void LayerDlgUpdate( - paramGroup_p pg, - int inx, - void * valueP ) + paramGroup_p pg, + int inx, + void * valueP) { - switch (inx) { - case I_LIST: - LayerSelect( (wIndex_t)*(long*)valueP ); - break; - case I_NAME: - LayerUpdate(); - break; - case I_MAP: - layerRedrawMap = TRUE; - break; - } + switch (inx) { + case I_LIST: + LayerSelect((wIndex_t)*(long*)valueP); + break; + + case I_NAME: + LayerUpdate(); + break; + + case I_MAP: + layerRedrawMap = TRUE; + break; + } } -static void DoLayer( void * junk ) +static void DoLayer(void * junk) { - if (layerW == NULL) - layerW = ParamCreateDialog( &layerPG, MakeWindowTitle(_("Layers")), _("Done"), LayerOk, NULL, TRUE, NULL, 0, LayerDlgUpdate ); + if (layerW == NULL) { + layerW = ParamCreateDialog(&layerPG, MakeWindowTitle(_("Layers")), _("Done"), + LayerOk, NULL, TRUE, NULL, 0, LayerDlgUpdate); + } + + /* set the globals to the values for the current layer */ + UpdateLayerDlg(); + layerRedrawMap = FALSE; + wShow(layerW); + layoutLayerChanged = FALSE; +} - /* set the globals to the values for the current layer */ - UpdateLayerDlg(); - - layerRedrawMap = FALSE; - wShow( layerW ); - layoutLayerChanged = FALSE; +BOOL_T ReadLayers(char * line) +{ + char * name; + int inx, visible, frozen, color, onMap; + unsigned long rgb; + + /* older files didn't support layers */ + + if (paramVersion < 7) { + return TRUE; + } + + /* set the current layer */ + + if (strncmp(line, "CURRENT", 7) == 0) { + curLayer = atoi(line+7); + + if (!IsLayerValid(curLayer)) { + curLayer = 0; + } + + if (layerL) { + wListSetIndex(layerL, curLayer); + } + + if (setLayerL) { + wListSetIndex(setLayerL, curLayer); + } + + return TRUE; + } + + /* get the properties for a layer from the file and update the layer accordingly */ + + if (!GetArgs(line, "ddddu0000q", &inx, &visible, &frozen, &onMap, &rgb, + &name)) { + return FALSE; + } + + if (paramVersion < 9) { + if ((int)rgb < sizeof oldColorMap/sizeof oldColorMap[0]) { + rgb = wRGB(oldColorMap[(int)rgb][0], oldColorMap[(int)rgb][1], + oldColorMap[(int)rgb][2]); + } else { + rgb = 0; + } + } + + if (inx < 0 || inx >= NUM_LAYERS) { + return FALSE; + } + + color = wDrawFindColor(rgb); + SetLayerColor(inx, color); + strncpy(layers[inx].name, name, sizeof layers[inx].name); + layers[inx].visible = visible; + layers[inx].frozen = frozen; + layers[inx].onMap = onMap; + layers[inx].color = color; + + if (inx<NUM_BUTTONS) { + if (strlen(name) > 0) { + wControlSetBalloonText((wControl_p)layer_btns[(int)inx], layers[inx].name); + } + + wButtonSetBusy(layer_btns[(int)inx], visible); + } + MyFree(name); + + return TRUE; } +/** + * Find out whether layer information should be saved to the layout file. + * Usually only layers where settings are off from the default are written. + * NOTE: as a fix for a problem with XTrkCadReader a layer definition is + * written for each layer that is used. + * + * \param layerNumber IN index of the layer + * \return TRUE if configured, FALSE if not + */ -EXPORT BOOL_T ReadLayers( char * line ) +bool +IsLayerConfigured(unsigned int layerNumber) { - char * name; - int inx, visible, frozen, color, onMap; - unsigned long rgb; - - /* older files didn't support layers */ - - if (paramVersion < 7) - return TRUE; - - /* set the current layer */ - - if ( strncmp( line, "CURRENT", 7 ) == 0 ) { - curLayer = atoi( line+7 ); - if ( curLayer < 0 ) - curLayer = 0; - - if (layerL) - wListSetIndex( layerL, curLayer ); - if (setLayerL) - wListSetIndex( setLayerL, curLayer ); - - return TRUE; - } - - /* get the properties for a layer from the file and update the layer accordingly */ - - if (!GetArgs( line, "ddddu0000q", &inx, &visible, &frozen, &onMap, &rgb, &name )) - return FALSE; - if (paramVersion < 9) { - if ( rgb >= 0 && (int)rgb < sizeof oldColorMap/sizeof oldColorMap[0] ) - rgb = wRGB( oldColorMap[(int)rgb][0], oldColorMap[(int)rgb][1], oldColorMap[(int)rgb][2] ); - else - rgb = 0; - } - if (inx < 0 || inx >= NUM_LAYERS) - return FALSE; - color = wDrawFindColor(rgb); - SetLayerColor( inx, color ); - strncpy( layers[inx].name, name, sizeof layers[inx].name ); - layers[inx].visible = visible; - layers[inx].frozen = frozen; - layers[inx].onMap = onMap; - layers[inx].color = color; - if (inx<NUM_BUTTONS) { - if (strlen(name) > 0) { - wControlSetBalloonText( (wControl_p)layer_btns[(int)inx], layers[inx].name ); - } - wButtonSetBusy( layer_btns[(int)inx], visible ); - } - return TRUE; + return (!layers[layerNumber].visible || + layers[layerNumber].frozen || + !layers[layerNumber].onMap || + layers[layerNumber].color != + layerColorTab[layerNumber % (COUNT(layerColorTab))] || + layers[layerNumber].name[0] || + layers[layerNumber].objCount); } +/** + * Save the layer information to the file. + * + * \paran f IN open file handle + * \return always TRUE + */ -EXPORT BOOL_T WriteLayers( FILE * f ) +BOOL_T WriteLayers(FILE * f) { - int inx; - BOOL_T rc = TRUE; - for (inx=0; inx<NUM_LAYERS; inx++) - if ((!layers[inx].visible) || layers[inx].frozen || (!layers[inx].onMap) || - layers[inx].color!=layerColorTab[inx%(COUNT(layerColorTab))] || - layers[inx].name[0] ) - rc &= fprintf( f, "LAYERS %d %d %d %d %ld %d %d %d %d \"%s\"\n", inx, layers[inx].visible, layers[inx].frozen, layers[inx].onMap, wDrawGetRGB(layers[inx].color), 0, 0, 0, 0, PutTitle(layers[inx].name) )>0; - rc &= fprintf( f, "LAYERS CURRENT %d\n", curLayer )>0; - return TRUE; + unsigned int inx; + + for (inx = 0; inx < NUM_LAYERS; inx++) { + if (IsLayerConfigured(inx)) { + fprintf(f, "LAYERS %u %d %d %d %ld %d %d %d %d \"%s\"\n", + inx, + layers[inx].visible, + layers[inx].frozen, + layers[inx].onMap, + wDrawGetRGB(layers[inx].color), + 0, 0, 0, 0, + PutTitle(layers[inx].name)); + } + } + + fprintf(f, "LAYERS CURRENT %u\n", curLayer); + return TRUE; } -EXPORT void InitLayers( void ) +void InitLayers(void) { - int i; - - wPrefGetInteger( PREFSECT, "layer-button-count", &layerCount, layerCount ); - for ( i = 0; i<COUNT(layerRawColorTab); i++ ) - layerColorTab[i] = wDrawFindColor( layerRawColorTab[i] ); - - /* create the bitmaps for the layer buttons */ - /* all bitmaps have to have the same dimensions */ - for ( i = 0; i<NUM_BUTTONS; i++ ) { - show_layer_bmps[i] = wIconCreateBitMap( l1_width, l1_height, show_layer_bits[i], layerColorTab[i%(COUNT(layerColorTab))] ); - layers[i].color = layerColorTab[i%(COUNT(layerColorTab))]; - } - - /* layer list for toolbar */ - setLayerL = wDropListCreate( mainW, 0, 0, "cmdLayerSet", NULL, 0, 10, 200, NULL, SetCurrLayer, NULL ); - wControlSetBalloonText( (wControl_p)setLayerL, GetBalloonHelpStr("cmdLayerSet") ); - AddToolbarControl( (wControl_p)setLayerL, IC_MODETRAIN_TOO ); - - for ( i = 0; i<NUM_LAYERS; i++ ) { - if (i<NUM_BUTTONS) { - /* create the layer button */ - sprintf( message, "cmdLayerShow%d", i ); - layer_btns[i] = wButtonCreate( mainW, 0, 0, message, - (char*)(show_layer_bmps[i]), - BO_ICON, 0, (wButtonCallBack_p)FlipLayer, (void*)(intptr_t)i ); - - /* add the help text */ - wControlSetBalloonText( (wControl_p)layer_btns[i], _("Show/Hide Layer") ); - - /* put on toolbar */ - AddToolbarControl( (wControl_p)layer_btns[i], IC_MODETRAIN_TOO ); - - /* set state of button */ - wButtonSetBusy( layer_btns[i], 1 ); - } - sprintf( message, "%2d : %s", i+1, (i==0?_("Main"):"") ); - wListAddValue( setLayerL, message, NULL, (void*)(intptr_t)i ); - } - AddPlaybackProc( "SETCURRLAYER", PlaybackCurrLayer, NULL ); - AddPlaybackProc( "LAYERS", (playbackProc_p)ReadLayers, NULL ); + unsigned int i; + wPrefGetInteger(PREFSECT, "layer-button-count", &layerCount, layerCount); + + for (i = 0; i<COUNT(layerRawColorTab); i++) { + layerColorTab[i] = wDrawFindColor(layerRawColorTab[i]); + } + + /* create the bitmaps for the layer buttons */ + /* all bitmaps have to have the same dimensions */ + for (i = 0; i<NUM_BUTTONS; i++) { + show_layer_bmps[i] = wIconCreateBitMap(l1_width, l1_height, show_layer_bits[i], + layerColorTab[i%(COUNT(layerColorTab))]); + layers[i].color = layerColorTab[i%(COUNT(layerColorTab))]; + } + + /* layer list for toolbar */ + setLayerL = wDropListCreate(mainW, 0, 0, "cmdLayerSet", NULL, 0, 10, 200, NULL, + SetCurrLayer, NULL); + wControlSetBalloonText((wControl_p)setLayerL, GetBalloonHelpStr("cmdLayerSet")); + AddToolbarControl((wControl_p)setLayerL, IC_MODETRAIN_TOO); + + for (i = 0; i<NUM_LAYERS; i++) { + char *layerName; + + if (i<NUM_BUTTONS) { + /* create the layer button */ + sprintf(message, "cmdLayerShow%u", i); + layer_btns[i] = wButtonCreate(mainW, 0, 0, message, + (char*)(show_layer_bmps[i]), + BO_ICON, 0, (wButtonCallBack_p)FlipLayer, (void*)(intptr_t)i); + /* add the help text */ + wControlSetBalloonText((wControl_p)layer_btns[i], _("Show/Hide Layer")); + /* put on toolbar */ + AddToolbarControl((wControl_p)layer_btns[i], IC_MODETRAIN_TOO); + /* set state of button */ + wButtonSetBusy(layer_btns[i], 1); + } + + layerName = FormatLayerName(i); + wListAddValue(setLayerL, layerName, NULL, (void*)(long)i); + free(layerName); + } + + AddPlaybackProc("SETCURRLAYER", PlaybackCurrLayer, NULL); + AddPlaybackProc("LAYERS", (playbackProc_p)ReadLayers, NULL); } -EXPORT addButtonCallBack_t InitLayersDialog( void ) { - ParamRegister( &layerPG ); - return &DoLayer; +addButtonCallBack_t InitLayersDialog(void) +{ + ParamRegister(&layerPG); + return &DoLayer; } |