summaryrefslogtreecommitdiff
path: root/app/bin/menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/menu.c')
-rw-r--r--app/bin/menu.c1486
1 files changed, 1486 insertions, 0 deletions
diff --git a/app/bin/menu.c b/app/bin/menu.c
new file mode 100644
index 0000000..ae2cfe2
--- /dev/null
+++ b/app/bin/menu.c
@@ -0,0 +1,1486 @@
+/* file misc.c
+ * Main routine and initialization for the application
+ */
+
+/* XTrkCad - Model Railroad CAD
+ * Copyright (C) 2005 Dave Bullis
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+
+#include "menu.h"
+#include "common.h"
+#include "compound.h"
+#include "cselect.h"
+#include "cundo.h"
+#include "custom.h"
+#include "fileio.h"
+#include "layout.h"
+#include "param.h"
+#include "include/problemrep.h"
+#include "smalldlg.h"
+#include "common-ui.h"
+#include "ctrain.h"
+
+static paramData_t menuPLs[101] = { { PD_LONG, &toolbarSet, "toolbarset" }, {
+ PD_LONG, &curTurnoutEp, "cur-turnout-ep"
+ }
+};
+static paramGroup_t menuPG = { "misc", PGO_RECORD, menuPLs, 2 };
+
+static void InitCmdExport( void );
+
+EXPORT wMenu_p demoM;
+EXPORT wMenu_p popup1M, popup2M;
+static wMenu_p popup1aM, popup2aM;
+static wMenu_p popup1mM, popup2mM;
+EXPORT wButton_p undoB;
+EXPORT wButton_p redoB;
+EXPORT wButton_p zoomUpB;
+EXPORT wButton_p zoomDownB;
+EXPORT wButton_p zoomExtentsB;
+EXPORT wButton_p mapShowB;
+static wButton_p magnetsB;
+EXPORT wMenuToggle_p mapShowMI;
+static wMenuToggle_p magnetsMI;
+EXPORT wMenuList_p winList_mi;
+EXPORT wMenuList_p fileList_ml;
+EXPORT wMenuToggle_p snapGridEnableMI;
+EXPORT wMenuToggle_p snapGridShowMI;
+
+
+/*--------------------------------------------------------------------*/
+typedef struct {
+ char * label;
+ wMenu_p menu;
+} menuTrace_t, *menuTrace_p;
+static dynArr_t menuTrace_da;
+#define menuTrace(N) DYNARR_N( menuTrace_t, menuTrace_da, N )
+
+static void DoMenuTrace(wMenu_p menu, const char * label, void * data)
+{
+ /*printf( "MENUTRACE: %s/%s\n", (char*)data, label );*/
+ if (recordF) {
+ fprintf(recordF, "MOUSE 1 %0.3f %0.3f\n", oldMarker.x, oldMarker.y);
+ fprintf(recordF, "MENU %0.3f %0.3f \"%s\" \"%s\"\n", oldMarker.x,
+ oldMarker.y, (char*) data, label);
+ }
+}
+
+EXPORT wMenu_p MenuRegister(const char * label)
+{
+ wMenu_p m;
+ menuTrace_p mt;
+ m = wMenuPopupCreate(mainW, label);
+ DYNARR_APPEND(menuTrace_t, menuTrace_da, 10);
+ mt = &menuTrace(menuTrace_da.cnt - 1);
+ mt->label = strdup(label);
+ mt->menu = m;
+ wMenuSetTraceCallBack(m, DoMenuTrace, mt->label);
+ return m;
+}
+
+static void MenuPlayback(char * line)
+{
+ char * menuName, *itemName;
+ coOrd pos;
+ menuTrace_p mt;
+
+ if (!GetArgs(line, "pqq", &pos, &menuName, &itemName)) {
+ return;
+ }
+ for (mt = &menuTrace(0); mt < &menuTrace(menuTrace_da.cnt); mt++) {
+ if (strcmp(mt->label, menuName) == 0) {
+ MovePlaybackCursor(&mainD, pos, FALSE, NULL);
+ oldMarker = cmdMenuPos = pos;
+ wMenuAction(mt->menu, _(itemName));
+ return;
+ }
+ }
+ CHECKMSG( FALSE, ("menuPlayback: %s not found", menuName) );
+}
+
+
+/*****************************************************************************
+ *
+ * TOOLBAR
+ *
+ */
+
+
+/*
+ * These array control the choices available in the Toolbar setup.
+ * For each choice, the text is given and the respective mask is
+ * specified in the following array.
+ * Note: text and choices must be given in the same order.
+ */
+static char *AllToolbarLabels[] = { N_("File Buttons"), N_("Print Buttons"), N_("Import/Export Buttons"),
+ N_("Zoom Buttons"), N_("Undo Buttons"), N_("Easement Button"), N_("SnapGrid Buttons"),
+ N_("Create Track Buttons"), N_("Layout Control Elements"),
+ N_("Modify Track Buttons"), N_("Properties/Select"),
+ N_("Track Group Buttons"), N_("Train Group Buttons"),
+ N_("Create Misc Buttons"), N_("Ruler Button"),
+ N_("Layer Buttons"), N_("Hot Bar"),
+ NULL
+ };
+static long AllToolbarMasks[] = { 1 << BG_FILE, 1<< BG_PRINT, 1<< BG_EXPORTIMPORT,
+ 1<< BG_ZOOM, 1<< BG_UNDO, 1<< BG_EASE, 1 << BG_SNAP, 1 << BG_TRKCRT,
+ 1<< BG_CONTROL, 1<< BG_TRKMOD, 1 << BG_SELECT, 1 << BG_TRKGRP, 1 << BG_TRAIN,
+ 1<< BG_MISCCRT, 1<< BG_RULER, 1 << BG_LAYER, 1 << BG_HOTBAR
+ };
+
+static wMenuToggle_p AllToolbarMI[ COUNT( AllToolbarMasks ) ];
+
+static void ToolbarAction(void * data)
+{
+ int inx = (int)VP2L(data);
+ CHECK( inx >=0 && inx < COUNT( AllToolbarMasks ) );
+ wBool_t set = wMenuToggleGet( AllToolbarMI[inx] );
+ long mask = AllToolbarMasks[inx];
+ if (set) {
+ toolbarSet |= mask;
+ } else {
+ toolbarSet &= ~mask;
+ }
+ wPrefSetInteger( "misc", "toolbarset", toolbarSet );
+ MainProc( mainW, wResize_e, NULL, NULL );
+ if (recordF)
+ fprintf(recordF, "PARAMETER %s %s %ld", "misc", "toolbarset",
+ toolbarSet);
+}
+
+/**
+ * Create the Toolbar configuration submenu. Based on two arrays of descriptions and
+ * masks, the toolbar submenu is created dynamically.
+ *
+ * \param toolbarM IN menu to which the toogles will be added
+ */
+
+static void CreateToolbarM(wMenu_p toolbarM)
+{
+ int inx, cnt;
+ long *masks;
+ char **labels;
+ wBool_t set;
+
+ cnt = COUNT(AllToolbarMasks);
+ masks = AllToolbarMasks;
+ labels = AllToolbarLabels;
+ for (inx = 0; inx < cnt; inx++, masks++, labels++) {
+ set = (toolbarSet & *masks) != 0;
+ AllToolbarMI[inx] = wMenuToggleCreate(toolbarM, "toolbarM", _(*labels), 0, set,
+ ToolbarAction, I2VP(inx));
+ }
+}
+
+
+/*****************************************************************************
+ *
+ * ELEVATION HELPERS
+ *
+ */
+
+
+static wWin_p addElevW;
+#define addElevF (wFloat_p)addElevPD.control
+static DIST_T addElevValueV;
+static void DoAddElev(void * unused);
+
+static paramFloatRange_t rn1000_1000 = { -1000.0, 1000.0 };
+static paramData_t addElevPLs[] = { {
+ PD_FLOAT, &addElevValueV, "value",
+ PDO_NOPREF|PDO_DIM, &rn1000_1000, NULL, 0
+ }
+};
+static paramGroup_t addElevPG = { "addElev", 0, addElevPLs, COUNT( addElevPLs ) };
+
+static void DoAddElev(void * unused)
+{
+ ParamLoadData(&addElevPG);
+ AddElevations(addElevValueV);
+ wHide(addElevW);
+}
+
+static void ShowAddElevations(void * unused)
+{
+ if (selectedTrackCount <= 0) {
+ ErrorMessage(MSG_NO_SELECTED_TRK);
+ return;
+ }
+ if (addElevW == NULL)
+ addElevW = ParamCreateDialog(&addElevPG,
+ MakeWindowTitle(_("Change Elevations")), _("Change"), DoAddElev,
+ wHide, FALSE, NULL, 0, NULL);
+ wShow(addElevW);
+}
+
+/*****************************************************************************
+ *
+ * MOVE/ROTATE/INDEX HELPERS
+ *
+ */
+
+
+static wWin_p rotateW;
+static wWin_p indexW;
+static wWin_p moveW;
+static double rotateValue;
+static char trackIndex[STR_LONG_SIZE];
+static coOrd moveValue;
+static rotateDialogCallBack_t rotateDialogCallBack;
+static indexDialogCallBack_t indexDialogCallBack;
+static moveDialogCallBack_t moveDialogCallBack;
+
+static void RotateEnterOk(void * unused);
+
+static paramFloatRange_t rn360_360 = { -360.0, 360.0, 80 };
+static paramData_t rotatePLs[] = { { PD_FLOAT, &rotateValue, "rotate", PDO_NOPREF|PDO_ANGLE|PDO_NORECORD, &rn360_360, N_("Angle:") } };
+static paramGroup_t rotatePG = { "rotate", 0, rotatePLs, COUNT( rotatePLs ) };
+
+static void IndexEnterOk(void * unused);
+static paramData_t indexPLs[] = {
+ { PD_STRING, &trackIndex, "select", PDO_NOPREF|PDO_NORECORD|PDO_STRINGLIMITLENGTH, I2VP(STR_SIZE-1), N_("Indexes:"), 0, 0, sizeof(trackIndex) }
+};
+static paramGroup_t indexPG = { "index", 0, indexPLs, COUNT( indexPLs ) };
+
+static paramFloatRange_t r_1000_1000 = { -1000.0, 1000.0, 80 };
+static void MoveEnterOk(void * unused);
+static paramData_t movePLs[] = {
+ { PD_FLOAT, &moveValue.x, "moveX", PDO_NOPREF|PDO_DIM|PDO_NORECORD, &r_1000_1000, N_("Move X:") },
+ { PD_FLOAT, &moveValue.y, "moveY", PDO_NOPREF|PDO_DIM|PDO_NORECORD, &r_1000_1000, N_("Move Y:") }
+};
+static paramGroup_t movePG = { "move", 0, movePLs, COUNT( movePLs ) };
+
+static void StartRotateDialog(void * funcVP)
+{
+ rotateDialogCallBack_t func = funcVP;
+ if (rotateW == NULL)
+ rotateW = ParamCreateDialog(&rotatePG, MakeWindowTitle(_("Rotate")),
+ _("Ok"), RotateEnterOk, wHide, FALSE, NULL, 0, NULL);
+ ParamLoadControls(&rotatePG);
+ rotateDialogCallBack = func;
+ wShow(rotateW);
+}
+
+static void StartIndexDialog(void * funcVP)
+{
+ indexDialogCallBack_t func = funcVP;
+ if (indexW == NULL)
+ indexW = ParamCreateDialog(&indexPG, MakeWindowTitle(_("Select Index")),
+ _("Ok"), IndexEnterOk, wHide, FALSE, NULL, 0, NULL);
+ ParamLoadControls(&indexPG);
+ indexDialogCallBack = func;
+ trackIndex[0] = '\0';
+ wShow(indexW);
+}
+
+static void StartMoveDialog(void * funcVP)
+{
+ moveDialogCallBack_t func = funcVP;
+ if (moveW == NULL)
+ moveW = ParamCreateDialog(&movePG, MakeWindowTitle(_("Move")), _("Ok"),
+ MoveEnterOk, wHide, FALSE, NULL, 0, NULL);
+ ParamLoadControls(&movePG);
+ moveDialogCallBack = func;
+ moveValue = zero;
+ wShow(moveW);
+}
+
+static void MoveEnterOk(void * unused)
+{
+ ParamLoadData(&movePG);
+ moveDialogCallBack(&moveValue);
+ wHide(moveW);
+}
+
+static void IndexEnterOk(void * unused)
+{
+ ParamLoadData(&indexPG);
+ indexDialogCallBack(trackIndex);
+ wHide(indexW);
+}
+
+static void RotateEnterOk(void * unused)
+{
+ ParamLoadData(&rotatePG);
+ if (angleSystem == ANGLE_POLAR) {
+ rotateDialogCallBack(I2VP(rotateValue * 1000));
+ } else {
+ rotateDialogCallBack(I2VP(rotateValue * 1000));
+ }
+ wHide(rotateW);
+}
+
+
+EXPORT void AddMoveMenu(wMenu_p m, moveDialogCallBack_t func)
+{
+ wMenuPushCreate(m, "", _("Enter Move ..."), 0,
+ StartMoveDialog, func);
+}
+
+EXPORT void AddIndexMenu(wMenu_p m, indexDialogCallBack_t func)
+{
+ wMenuPushCreate(m, "cmdSelectIndex", _("Select Track Index ..."), 0,
+ StartIndexDialog, func);
+}
+
+//All values multipled by 100 to support decimal points from PD_FLOAT
+EXPORT void AddRotateMenu(wMenu_p m, rotateDialogCallBack_t func)
+{
+ wMenuPushCreate(m, "", _("180 "), 0, func, I2VP(180000));
+ wMenuPushCreate(m, "", _("90 CW"), 0, func, I2VP(90000));
+ wMenuPushCreate(m, "", _("45 CW"), 0, func, I2VP(45000));
+ wMenuPushCreate(m, "", _("30 CW"), 0, func, I2VP(30000));
+ wMenuPushCreate(m, "", _("15 CW"), 0, func, I2VP(15000));
+ wMenuPushCreate(m, "", _("15 CCW"), 0, func, I2VP(360000 - 15000));
+ wMenuPushCreate(m, "", _("30 CCW"), 0, func, I2VP(360000 - 30000));
+ wMenuPushCreate(m, "", _("45 CCW"), 0, func, I2VP(360000 - 45000));
+ wMenuPushCreate(m, "", _("90 CCW"), 0, func, I2VP(360000 - 90000));
+ wMenuPushCreate(m, "", _("Enter Angle ..."), 0,
+ StartRotateDialog, func);
+}
+
+/*****************************************************************************
+ *
+ * MISC HELPERS
+ *
+ */
+
+static void ChkLoad(void * unused)
+{
+ Confirm(_("Load"), DoLoad);
+}
+
+static void ChkExamples( void * unused )
+{
+ Confirm(_("examples"), DoExamples);
+}
+
+static void ChkRevert(void * unused)
+{
+ int rc;
+
+ if (changed) {
+ rc = wNoticeEx(NT_WARNING,
+ _("Do you want to return to the last saved state?\n\n"
+ "Revert will cause all changes done since last save to be lost."),
+ _("&Revert"), _("&Cancel"));
+ if (rc) {
+ /* load the file */
+ char *filename = GetLayoutFullPath();
+ LoadTracks(1, &filename, I2VP(1)); //Keep background
+ }
+ }
+}
+
+static char * fileListPathName;
+static void AfterFileList(void)
+{
+ DoFileList(0, NULL, fileListPathName);
+}
+
+static void ChkFileList(int index, const char * label, void * data)
+{
+ fileListPathName = (char*) data;
+ Confirm(_("Load"), AfterFileList);
+}
+
+
+static void DoCommandBIndirect(void * cmdInxP)
+{
+ wIndex_t cmdInx;
+ cmdInx = *(wIndex_t*) cmdInxP;
+ DoCommandB(I2VP(cmdInx));
+}
+
+/**
+ * Set magnets state
+ */
+EXPORT int MagneticSnap(int state)
+{
+ int oldState = magneticSnap;
+ magneticSnap = state;
+ wPrefSetInteger("misc", "magnets", magneticSnap);
+ wMenuToggleSet(magnetsMI, magneticSnap);
+ wButtonSetBusy(magnetsB, (wBool_t) magneticSnap);
+ return oldState;
+}
+
+/**
+ * Toggle magnets on/off
+ */
+static void MagneticSnapToggle(void * unused)
+{
+ MagneticSnap(!magneticSnap);
+}
+
+
+EXPORT void SelectFont(void * unused)
+{
+ wSelectFont(_("XTrackCAD Font"));
+}
+
+
+EXPORT long stickySet = 0;
+static wWin_p stickyW;
+static const char * stickyLabels[33];
+static paramData_t stickyPLs[] = { {
+ PD_TOGGLE, &stickySet, "set", 0,
+ stickyLabels
+ }
+};
+static paramGroup_t stickyPG = { "sticky", PGO_RECORD, stickyPLs,
+ COUNT( stickyPLs )
+ };
+
+static void StickyOk(void * unused)
+{
+ wHide(stickyW);
+}
+
+
+EXPORT void DoSticky(void * unused)
+{
+ if (!stickyW)
+ stickyW = ParamCreateDialog(&stickyPG,
+ MakeWindowTitle(_("Sticky Commands")), _("Ok"), StickyOk, wHide,
+ TRUE, NULL, 0, NULL);
+ ParamLoadControls(&stickyPG);
+ wShow(stickyW);
+}
+
+/*****************************************************************************
+ *
+ * DEBUG DIALOG
+ *
+ */
+
+static wWin_p debugW;
+
+static int debugCnt = 0;
+static paramIntegerRange_t r0_100 = { 0, 100, 80 };
+static void DebugOk(void * unused);
+static paramData_t debugPLs[30];
+static paramData_t p0[] = {
+ { PD_BUTTON, TestMallocs, "test", PDO_DLGHORZ, NULL, N_("Test Mallocs") }
+};
+static long debug_values[30];
+static int debug_index[30];
+
+static paramGroup_t debugPG = { "debug", 0, debugPLs, 0 };
+
+static void DebugOk(void * unused)
+{
+ for (int i = 0; i<debugCnt; i++) {
+ logTable(debug_index[i]).level = debug_values[i];
+ }
+ wHide(debugW);
+}
+
+static void CreateDebugW(void)
+{
+ debugPG.paramCnt = debugCnt+1;
+ ParamRegister(&debugPG);
+ debugW = ParamCreateDialog(&debugPG, MakeWindowTitle(_("Debug")), _("Ok"),
+ DebugOk, wHide, FALSE, NULL, 0, NULL);
+ wHide(debugW);
+}
+
+static void InitDebug(const char * label, long * valueP)
+{
+ CHECK( debugCnt+1 < COUNT( debugPLs ) );
+ memset(&debugPLs[debugCnt+1], 0, sizeof debugPLs[debugCnt]);
+ debugPLs[debugCnt+1].type = PD_LONG;
+ debugPLs[debugCnt+1].valueP = valueP;
+ debugPLs[debugCnt+1].nameStr = label;
+ debugPLs[debugCnt+1].winData = &r0_100;
+ debugPLs[debugCnt+1].winLabel = label;
+ debugCnt++;
+}
+
+static void DebugInit(void * unused)
+{
+
+ if (!debugW) {
+ debugPLs[0] = p0[0];
+ BOOL_T default_line = FALSE;
+ debugCnt = 0; //Reset to start building the dynamic dialog over again
+ int i = 0;
+ for ( int inx=0; inx<logTable_da.cnt; inx++ ) {
+ if (logTable(inx).name[0]) {
+ debug_values[i] = logTable(inx).level;
+ debug_index[i] = inx;
+ InitDebug(logTable(inx).name,&debug_values[i]);
+ i++;
+ } else {
+ if (!default_line) {
+ debug_values[i] = logTable(inx).level;
+ debug_index[i] = inx;
+ InitDebug("Default Trace",&debug_values[i]);
+ i++;
+ default_line = TRUE;
+ }
+ }
+ }
+
+ //ParamCreateControls( &debugPG, NULL );
+ CreateDebugW();
+ }
+ ParamLoadControls( &debugPG );
+ wShow(debugW);
+}
+
+
+/*****************************************************************************
+ *
+ * ENABLE MENUS
+ *
+ */
+
+EXPORT void EnableMenus( void )
+{
+ int inx;
+ BOOL_T enable;
+ for (inx = 0; inx < menuPG.paramCnt; inx++) {
+ if (menuPG.paramPtr[inx].control == NULL) {
+ continue;
+ }
+ if ((menuPG.paramPtr[inx].option & IC_SELECTED) && selectedTrackCount <= 0) {
+ enable = FALSE;
+ } else if ((programMode == MODE_TRAIN
+ && (menuPG.paramPtr[inx].option & (IC_MODETRAIN_TOO | IC_MODETRAIN_ONLY))
+ == 0)
+ || (programMode != MODE_TRAIN
+ && (menuPG.paramPtr[inx].option & IC_MODETRAIN_ONLY) != 0)) {
+ enable = FALSE;
+ } else {
+ enable = TRUE;
+ }
+ wMenuPushEnable((wMenuPush_p) menuPG.paramPtr[inx].control, enable);
+ }
+}
+/*****************************************************************************
+ *
+ * RECENT MESSAGES LIST
+ *
+ */
+
+static wMenuList_p messageList_ml;
+#define MESSAGE_LIST_EMPTY N_("No Messages")
+
+EXPORT void MessageListAppend(
+ char * cp1,
+ const char * msgSrc )
+{
+ static wBool_t messageListIsEmpty = TRUE;
+ if ( messageListIsEmpty ) {
+ wMenuListDelete(messageList_ml, _(MESSAGE_LIST_EMPTY));
+ messageListIsEmpty = FALSE;
+ }
+ wMenuListAdd(messageList_ml, 0, cp1, _(msgSrc));
+}
+
+
+static void ShowMessageHelp(int index, const char * label, void * data)
+{
+ char msgKey[STR_SIZE], *cp, *msgSrc;
+ msgSrc = (char*) data;
+ if (!msgSrc) {
+ return;
+ }
+ cp = strchr(msgSrc, '\t');
+ if (cp == NULL) {
+ sprintf(msgKey, _("No help for %s"), msgSrc);
+ wNoticeEx( NT_INFORMATION, msgKey, _("Ok"), NULL);
+ return;
+ }
+ memcpy(msgKey, msgSrc, cp - msgSrc);
+ msgKey[cp - msgSrc] = 0;
+ wHelp(msgKey);
+}
+
+/*****************************************************************************
+ *
+ * Balloon Help
+ *
+ */
+
+// defined in ${BUILDIR}/app/bin/bllnhlp.c
+extern wBalloonHelp_t balloonHelp[];
+
+#ifdef DEBUG
+#define CHECK_BALLOONHELP
+/*#define CHECK_UNUSED_BALLOONHELP*/
+#endif
+#ifdef CHECK_UNUSED_BALLOONHELP
+static void ShowUnusedBalloonHelp(void);
+#endif
+
+
+#ifdef CHECK_UNUSED_BALLOONHELP
+int * balloonHelpCnts;
+#endif
+
+EXPORT const char * GetBalloonHelpStr(const char * helpKey)
+{
+ wBalloonHelp_t * bh;
+#ifdef CHECK_UNUSED_BALLOONHELP
+ if ( balloonHelpCnts == NULL ) {
+ for ( bh=balloonHelp; bh->name; bh++ );
+ balloonHelpCnts = (int*)malloc( (sizeof *(int*)0) * (bh-balloonHelp) );
+ memset( balloonHelpCnts, 0, (sizeof *(int*)0) * (bh-balloonHelp) );
+ }
+#endif
+ for (bh = balloonHelp; bh->name; bh++) {
+ if (strcmp(bh->name, helpKey) == 0) {
+#ifdef CHECK_UNUSED_BALLOONHELP
+ balloonHelpCnts[(bh-balloonHelp)]++;
+#endif
+ return _(bh->value);
+ }
+ }
+#ifdef CHECK_BALLOONHELP
+ fprintf( stderr, _("No balloon help for %s\n"), helpKey );
+#endif
+ return _("No Help");
+}
+
+#ifdef CHECK_UNUSED_BALLOONHELP
+static void ShowUnusedBalloonHelp( void )
+{
+ int cnt;
+ for ( cnt=0; balloonHelp[cnt].name; cnt++ )
+ if ( balloonHelpCnts[cnt] == 0 ) {
+ fprintf( stderr, "unused BH %s\n", balloonHelp[cnt].name );
+ }
+}
+#endif
+
+/*****************************************************************************
+ *
+ * CREATE MENUS
+ *
+ */
+
+
+EXPORT wButton_p AddToolbarButton(const char * helpStr, wIcon_p icon,
+ long options,
+ wButtonCallBack_p action, void * context)
+{
+ wButton_p bb;
+ wIndex_t inx;
+
+ GetBalloonHelpStr(helpStr);
+ if (context == NULL) {
+ for (inx = 0; inx < menuPG.paramCnt; inx++) {
+ if (action != DoCommandB && menuPG.paramPtr[inx].valueP == I2VP(action)) {
+ context = &menuPG.paramPtr[inx];
+ action = ParamMenuPush;
+ menuPG.paramPtr[inx].context = I2VP(buttonCnt);
+ menuPG.paramPtr[inx].option |= IC_PLAYBACK_PUSH;
+ break;
+ }
+ }
+ }
+ bb = wButtonCreate(mainW, 0, 0, helpStr, (char*) icon,
+ BO_ICON/*|((options&IC_CANCEL)?BB_CANCEL:0)*/, 0, action, context);
+ AddToolbarControl((wControl_p) bb, options);
+ return bb;
+}
+
+#include "bitmaps/down.xpm3"
+static const char * buttonGroupMenuTitle;
+static const char * buttonGroupHelpKey;
+static const char * buttonGroupStickyLabel;
+static wMenu_p buttonGroupPopupM;
+static int stickyCnt = 0;
+
+EXPORT void ButtonGroupBegin(const char * menuTitle, const char * helpKey,
+ const char * stickyLabel)
+{
+ buttonGroupMenuTitle = menuTitle;
+ buttonGroupHelpKey = helpKey;
+ buttonGroupStickyLabel = stickyLabel;
+ buttonGroupPopupM = NULL;
+}
+
+EXPORT void ButtonGroupEnd(void)
+{
+ buttonGroupMenuTitle = NULL;
+ buttonGroupHelpKey = NULL;
+ buttonGroupPopupM = NULL;
+}
+
+EXPORT wIndex_t AddMenuButton(wMenu_p menu, procCommand_t command,
+ const char * helpKey, const char * nameStr, wIcon_p icon, int reqLevel,
+ long options, long acclKey, void * context)
+{
+ wIndex_t buttInx = -1;
+ wIndex_t cmdInx;
+ wBool_t newButtonGroup = FALSE;
+ wMenu_p tm, p1m, p2m;
+ static wIcon_p openbuttIcon = NULL;
+ static wMenu_p commandsSubmenu;
+ static wMenu_p popup1Submenu;
+ static wMenu_p popup2Submenu;
+
+ if (icon) {
+ if (buttonGroupPopupM != NULL) {
+ buttInx = buttonCnt - 2;
+ } else {
+ buttInx = buttonCnt;
+ AddToolbarButton(helpKey, icon, options,
+ DoCommandB,
+ I2VP(commandCnt));
+ }
+ if (buttonGroupMenuTitle != NULL && buttonGroupPopupM == NULL) {
+ if (openbuttIcon == NULL) {
+ openbuttIcon = wIconCreatePixMap(down_xpm3[iconSize]);
+ }
+ buttonGroupPopupM = wMenuPopupCreate(mainW, buttonGroupMenuTitle);
+ AddToolbarButton(buttonGroupHelpKey, openbuttIcon, IC_ABUT,
+ (wButtonCallBack_p) wMenuPopupShow,
+ buttonGroupPopupM);
+ newButtonGroup = TRUE;
+ commandsSubmenu = wMenuMenuCreate(menu, "", buttonGroupMenuTitle);
+ if (options & IC_POPUP2) {
+ popup1Submenu = wMenuMenuCreate(popup1aM, "", buttonGroupMenuTitle);
+ popup2Submenu = wMenuMenuCreate(popup2aM, "", buttonGroupMenuTitle);
+ } else if (options & IC_POPUP3) {
+ popup1Submenu= wMenuMenuCreate(popup1mM, "", buttonGroupMenuTitle);
+ popup2Submenu = wMenuMenuCreate(popup2mM, "", buttonGroupMenuTitle);
+
+ } else {
+ popup1Submenu = wMenuMenuCreate(popup1M, "", buttonGroupMenuTitle);
+ popup2Submenu = wMenuMenuCreate(popup2M, "", buttonGroupMenuTitle);
+ }
+ }
+ }
+ long stickyMask = 0;
+ wMenuPush_p cmdMenus[NUM_CMDMENUS] = { NULL, NULL, NULL, NULL };
+ if (nameStr[0] != '\0') {
+ if (options & IC_STICKY) {
+ if (buttonGroupPopupM == NULL || newButtonGroup) {
+ CHECK( stickyCnt <= 32 );
+ stickyCnt++;
+ }
+ if (buttonGroupPopupM == NULL) {
+ stickyLabels[stickyCnt - 1] = nameStr;
+ } else {
+ stickyLabels[stickyCnt - 1] = buttonGroupStickyLabel;
+ }
+ stickyLabels[stickyCnt] = NULL;
+ stickyMask = 1L<<(stickyCnt-1);
+ if ( ( options & IC_INITNOTSTICKY ) == 0 ) {
+ stickySet |= stickyMask;
+ }
+ }
+ if (buttonGroupPopupM) {
+ cmdMenus[0] = wMenuPushCreate(buttonGroupPopupM,
+ helpKey, GetBalloonHelpStr(helpKey), 0, DoCommandB,
+ I2VP(commandCnt));
+ tm = commandsSubmenu;
+ p1m = popup1Submenu;
+ p2m = popup2Submenu;
+ } else {
+ tm = menu;
+ p1m = (options & IC_POPUP2) ? popup1aM : (options & IC_POPUP3) ? popup1mM :
+ popup1M;
+ p2m = (options & IC_POPUP2) ? popup2aM : (options & IC_POPUP3) ? popup2mM :
+ popup2M;
+ }
+ cmdMenus[1] = wMenuPushCreate(tm, helpKey, nameStr, acclKey,
+ DoCommandB, I2VP(commandCnt));
+ if ((options & (IC_POPUP | IC_POPUP2 | IC_POPUP3))) {
+ if (!(options & IC_SELECTED)) {
+ cmdMenus[2] = wMenuPushCreate(p1m, helpKey, nameStr,
+ 0, DoCommandB, I2VP(commandCnt));
+ }
+ cmdMenus[3] = wMenuPushCreate(p2m, helpKey, nameStr, 0,
+ DoCommandB, I2VP(commandCnt));
+ }
+ }
+
+ cmdInx = AddCommand(command, helpKey, nameStr, icon, reqLevel, options,
+ acclKey, buttInx, stickyMask, cmdMenus, context);
+ return cmdInx;
+}
+
+
+static void MiscMenuItemCreate(wMenu_p m1, wMenu_p m2, const char * name,
+ const char * label, long acclKey, void * func, long option, void * context)
+{
+ wMenuPush_p mp;
+ mp = wMenuPushCreate(m1, name, label, acclKey, ParamMenuPush,
+ &menuPLs[menuPG.paramCnt]);
+ if (m2)
+ wMenuPushCreate(m2, name, label, acclKey, ParamMenuPush,
+ &menuPLs[menuPG.paramCnt]);
+ menuPLs[menuPG.paramCnt].control = (wControl_p) mp;
+ menuPLs[menuPG.paramCnt].type = PD_MENUITEM;
+ menuPLs[menuPG.paramCnt].valueP = func;
+ menuPLs[menuPG.paramCnt].nameStr = name;
+ menuPLs[menuPG.paramCnt].option = option;
+ menuPLs[menuPG.paramCnt].context = context;
+
+ if (name) {
+ GetBalloonHelpStr(name);
+ }
+ menuPG.paramCnt++;
+}
+
+
+#include "bitmaps/zoom-in.xpm3"
+#include "bitmaps/zoom-choose.xpm3"
+#include "bitmaps/zoom-out.xpm3"
+#include "bitmaps/zoom-extent.xpm3"
+#include "bitmaps/undo.xpm3"
+#include "bitmaps/redo.xpm3"
+// #include "bitmaps/partlist.xpm" // unused
+#include "bitmaps/doc-export.xpm3"
+#include "bitmaps/doc-export-bmap.xpm3"
+#include "bitmaps/doc-export-dxf.xpm3"
+#if XTRKCAD_CREATE_SVG
+#include "bitmaps/doc-export-svg.xpm3"
+#endif
+#include "bitmaps/doc-import.xpm3"
+#include "bitmaps/doc-import-mod.xpm3"
+#include "bitmaps/doc-new.xpm3"
+#include "bitmaps/doc-save.xpm3"
+#include "bitmaps/doc-open.xpm3"
+// #include "bitmaps/doc-print.xpm"
+#include "bitmaps/doc-setup.xpm3"
+#include "bitmaps/parameter.xpm3"
+#include "bitmaps/map.xpm3"
+#include "bitmaps/magnet.xpm3"
+
+//static wMenu_p toolbarM;
+static addButtonCallBack_t paramFilesCallback;
+
+EXPORT void CreateMenus(void)
+{
+ wMenu_p fileM, editM, viewM, optionM, windowM, macroM, helpM, toolbarM,
+ manageM, addM, changeM, drawM;
+ wMenu_p zoomM, zoomSubM;
+
+ wMenuPush_p zoomInM, zoomOutM, zoomExtentsM;
+
+ wPrefGetInteger("DialogItem", "pref-iconsize", (long *) &iconSize, 0);
+
+ wSetBalloonHelp( balloonHelp );
+ fileM = wMenuBarAdd(mainW, "menuFile", _("&File"));
+ editM = wMenuBarAdd(mainW, "menuEdit", _("&Edit"));
+ viewM = wMenuBarAdd(mainW, "menuView", _("&View"));
+ addM = wMenuBarAdd(mainW, "menuAdd", _("&Add"));
+ changeM = wMenuBarAdd(mainW, "menuChange", _("&Change"));
+ drawM = wMenuBarAdd(mainW, "menuDraw", _("&Draw"));
+ manageM = wMenuBarAdd(mainW, "menuManage", _("&Manage"));
+ optionM = wMenuBarAdd(mainW, "menuOption", _("&Options"));
+ macroM = wMenuBarAdd(mainW, "menuMacro", _("&Macro"));
+ windowM = wMenuBarAdd(mainW, "menuWindow", _("&Window"));
+ helpM = wMenuBarAdd(mainW, "menuHelp", _("&Help"));
+
+ /*
+ * POPUP MENUS
+ */
+ /* Select Commands */
+ /* Select All */
+ /* Select All Current */
+
+ /* Common View Commands Menu */
+ /* Zoom In/Out */
+ /* Snap Grid Menu */
+ /* Show/Hide Map */
+ /* Show/Hide Background */
+
+ /* Selected Commands */
+ /*--------------*/
+ /* DeSelect All */
+ /* Select All */
+ /* Select All Current */
+ /*--------------*/
+ /* Quick Move */
+ /* Quick Rotate */
+ /* Quick Align */
+ /*--------------*/
+ /* Move To Current Layer */
+ /* Move/Rotate Cmds */
+ /* Cut/Paste/Delete */
+ /* Group/Un-group Selected */
+ /*----------*/
+ /* Thick/Thin */
+ /* Bridge/Roadbed/Tunnel */
+ /* Ties/NoTies */
+ /*-----------*/
+ /* More Commands */
+
+ popup1M = wMenuPopupCreate(mainW, _("Context Commands"));
+ popup2M = wMenuPopupCreate(mainW, _("Shift Context Commands"));
+ MiscMenuItemCreate(popup1M, popup2M, "cmdUndo", _("Undo"), 0,
+ UndoUndo, 0, NULL);
+ MiscMenuItemCreate(popup1M, popup2M, "cmdRedo", _("Redo"), 0,
+ UndoRedo, 0, NULL);
+ /* Zoom */
+ wMenuPushCreate(popup1M, "cmdZoomIn", _("Zoom In"), 0,
+ DoZoomUp, I2VP(1));
+ wMenuPushCreate(popup2M, "cmdZoomIn", _("Zoom In"), 0,
+ DoZoomUp, I2VP(1));
+ wMenuPushCreate(popup1M, "cmdZoomOut", _("Zoom Out"), 0,
+ DoZoomDown, I2VP(1));
+ wMenuPushCreate(popup2M, "cmdZoomOut", _("Zoom Out"), 0,
+ DoZoomDown, I2VP(1));
+ wMenuPushCreate(popup1M, "cmdZoomExtents", _("Zoom Extents"), 0,
+ DoZoomExtents, I2VP(1));
+ wMenuPushCreate(popup2M, "cmdZoomExtents", _("Zoom Extents"), 0,
+ DoZoomExtents, I2VP(1));
+ /* Display */
+ MiscMenuItemCreate(popup1M, popup2M, "cmdGridEnable", _("Enable SnapGrid"),
+ 0, SnapGridEnable, 0, NULL);
+ MiscMenuItemCreate(popup1M, popup2M, "cmdGridShow", _("SnapGrid Show"), 0,
+ SnapGridShow, 0, NULL);
+ MiscMenuItemCreate(popup1M, popup2M, "cmdMagneticSnap",
+ _(" Enable Magnetic Snap"), 0,
+ MagneticSnapToggle, 0, NULL);
+ MiscMenuItemCreate(popup1M, popup2M, "cmdMapShow", _("Show/Hide Map"), 0,
+ MapWindowToggleShow, 0, NULL);
+ MiscMenuItemCreate(popup1M, popup2M, "cmdBackgroundShow",
+ _("Show/Hide Background"), 0,
+ BackgroundToggleShow, 0, NULL);
+ wMenuSeparatorCreate(popup1M);
+ wMenuSeparatorCreate(popup2M);
+ /* Copy/Paste */
+ MiscMenuItemCreate(popup2M, NULL, "cmdCut", _("Cut"), 0,
+ EditCut, 0, NULL);
+ MiscMenuItemCreate(popup2M, NULL, "cmdCopy", _("Copy"), 0,
+ EditCopy, 0, NULL);
+ MiscMenuItemCreate(popup1M, popup2M, "cmdPaste", _("Paste"), 0,
+ EditPaste, 0, NULL);
+ MiscMenuItemCreate(popup2M, NULL, "cmdClone", _("Clone"), 0,
+ EditClone, 0, NULL);
+ /*Select*/
+ MiscMenuItemCreate(popup1M, popup2M, "cmdSelectAll", _("Select All"), 0,
+ (wMenuCallBack_p) SetAllTrackSelect, 0, I2VP(1));
+ MiscMenuItemCreate(popup1M, popup2M, "cmdSelectCurrentLayer",
+ _("Select Current Layer"), 0,
+ SelectCurrentLayer, 0, NULL);
+ MiscMenuItemCreate(popup2M, NULL, "cmdDeselectAll", _("Deselect All"), 0,
+ (wMenuCallBack_p) SetAllTrackSelect, 0, I2VP(FALSE));
+ wMenuPushCreate(popup1M, "cmdSelectIndex", _("Select Track Index..."), 0,
+ StartIndexDialog, &SelectByIndex);
+ wMenuPushCreate(popup2M, "cmdSelectIndex", _("Select Track Index..."), 0,
+ StartIndexDialog, &SelectByIndex);
+ /* Modify */
+ wMenuPushCreate(popup2M, "cmdMove", _("Move"), 0,
+ DoCommandBIndirect, &moveCmdInx);
+ wMenuPushCreate(popup2M, "cmdRotate", _("Rotate"), 0,
+ DoCommandBIndirect, &rotateCmdInx);
+ wMenuSeparatorCreate(popup1M);
+ wMenuSeparatorCreate(popup2M);
+ MiscMenuItemCreate(popup2M, NULL, "cmdDelete", _("Delete"), 0,
+ (wMenuCallBack_p) SelectDelete, 0, NULL);
+ wMenuSeparatorCreate(popup2M);
+ popup1aM = wMenuMenuCreate(popup1M, "", _("Add..."));
+ popup2aM = wMenuMenuCreate(popup2M, "", _("Add..."));
+ wMenuSeparatorCreate(popup2M);
+ wMenuSeparatorCreate(popup1M);
+ popup1mM = wMenuMenuCreate(popup1M, "", _("More..."));
+ popup2mM = wMenuMenuCreate(popup2M, "", _("More..."));
+
+ /*
+ * FILE MENU
+ */
+ MiscMenuItemCreate(fileM, NULL, "menuFile-clear", _("&New ..."), ACCL_NEW,
+ DoClear, 0, NULL);
+ wMenuPushCreate(fileM, "menuFile-load", _("&Open ..."), ACCL_OPEN,
+ ChkLoad, NULL);
+ wMenuSeparatorCreate(fileM);
+
+ wMenuPushCreate(fileM, "menuFile-save", _("&Save"), ACCL_SAVE,
+ DoSave, NULL);
+ wMenuPushCreate(fileM, "menuFile-saveAs", _("Save &As ..."), ACCL_SAVEAS,
+ DoSaveAs, NULL);
+ wMenuPushCreate(fileM, "menuFile-revert", _("Revert"), ACCL_REVERT,
+ ChkRevert, NULL);
+ wMenuSeparatorCreate(fileM);
+
+ cmdGroup = BG_FILE;
+ AddToolbarButton("menuFile-clear", wIconCreatePixMap(doc_new_xpm3[iconSize]),
+ IC_MODETRAIN_TOO, DoClear, NULL);
+ AddToolbarButton("menuFile-load", wIconCreatePixMap(doc_open_xpm3[iconSize]),
+ IC_MODETRAIN_TOO, ChkLoad, NULL);
+ AddToolbarButton("menuFile-save", wIconCreatePixMap(doc_save_xpm3[iconSize]),
+ IC_MODETRAIN_TOO, DoSave, NULL);
+
+ cmdGroup = BG_PRINT;
+ MiscMenuItemCreate(fileM, NULL, "printSetup", _("P&rint Setup ..."),
+ ACCL_PRINTSETUP, (wMenuCallBack_p) wPrintSetup, 0,
+ I2VP(0));
+ InitCmdPrint(fileM);
+ AddToolbarButton("menuFile-setup", wIconCreatePixMap(doc_setup_xpm3[iconSize]),
+ IC_MODETRAIN_TOO, (wMenuCallBack_p) wPrintSetup, I2VP(0));
+
+ wMenuSeparatorCreate(fileM);
+ MiscMenuItemCreate(fileM, NULL, "cmdImport", _("&Import"), ACCL_IMPORT,
+ DoImport, 0, I2VP(0));
+ MiscMenuItemCreate(fileM, NULL, "cmdImportModule", _("Import &Module"),
+ ACCL_IMPORT_MOD,
+ DoImport, 0, I2VP(1));
+ MiscMenuItemCreate(fileM, NULL, "cmdOutputbitmap", _("Export to &Bitmap"),
+ ACCL_PRINTBM, OutputBitMapInit(), 0,
+ NULL);
+ MiscMenuItemCreate(fileM, NULL, "cmdExport", _("E&xport"), ACCL_EXPORT,
+ DoExport, IC_SELECTED, NULL);
+ MiscMenuItemCreate(fileM, NULL, "cmdExportDXF", _("Export D&XF"),
+ ACCL_EXPORTDXF, DoExportDXF, IC_SELECTED,
+ NULL);
+#if XTRKCAD_CREATE_SVG
+ MiscMenuItemCreate( fileM, NULL, "cmdExportSVG", _("Export S&VG"),
+ ACCL_EXPORTSVG, DoExportSVG, IC_SELECTED, NULL);
+#endif
+ wMenuSeparatorCreate(fileM);
+
+ paramFilesCallback = ParamFilesInit();
+ MiscMenuItemCreate(fileM, NULL, "cmdPrmfile", _("Parameter &Files ..."),
+ ACCL_PARAMFILES, paramFilesCallback, 0, NULL);
+ MiscMenuItemCreate(fileM, NULL, "cmdFileNote", _("No&tes ..."), ACCL_NOTES,
+ DoNote, 0, NULL);
+
+ wMenuSeparatorCreate(fileM);
+ fileList_ml = wMenuListCreate(fileM, "menuFileList", NUM_FILELIST,
+ ChkFileList);
+ wMenuSeparatorCreate(fileM);
+ wMenuPushCreate(fileM, "menuFile-quit", _("E&xit"), 0,
+ DoQuit, NULL);
+
+ InitCmdExport();
+
+ AddToolbarButton("menuFile-parameter",
+ wIconCreatePixMap(parameter_xpm3[iconSize]),
+ IC_MODETRAIN_TOO, paramFilesCallback, NULL);
+
+ cmdGroup = BG_ZOOM;
+ zoomUpB = AddToolbarButton("cmdZoomIn",
+ wIconCreatePixMap(zoom_in_xpm3[iconSize]),
+ IC_MODETRAIN_TOO, DoZoomUp, NULL);
+ zoomM = wMenuPopupCreate(mainW, "");
+ AddToolbarButton("cmdZoom", wIconCreatePixMap(zoom_choose_xpm3[iconSize]),
+ IC_MODETRAIN_TOO,
+ (wButtonCallBack_p) wMenuPopupShow, zoomM);
+ zoomDownB = AddToolbarButton("cmdZoomOut",
+ wIconCreatePixMap(zoom_out_xpm3[iconSize]),
+ IC_MODETRAIN_TOO, DoZoomDown, NULL);
+ zoomExtentsB = AddToolbarButton("cmdZoomExtent",
+ wIconCreatePixMap(zoom_extent_xpm3[iconSize]),
+ IC_MODETRAIN_TOO, DoZoomExtents, NULL);
+
+ cmdGroup = BG_UNDO;
+ undoB = AddToolbarButton("cmdUndo", wIconCreatePixMap(undo_xpm3[iconSize]), 0,
+ UndoUndo, NULL);
+ redoB = AddToolbarButton("cmdRedo", wIconCreatePixMap(redo_xpm3[iconSize]), 0,
+ UndoRedo, NULL);
+
+ wControlActive((wControl_p) undoB, FALSE);
+ wControlActive((wControl_p) redoB, FALSE);
+ InitCmdUndo();
+
+ /*
+ * EDIT MENU
+ */
+ MiscMenuItemCreate(editM, NULL, "cmdUndo", _("&Undo"), ACCL_UNDO,
+ UndoUndo, 0, NULL);
+ MiscMenuItemCreate(editM, NULL, "cmdRedo", _("R&edo"), ACCL_REDO,
+ UndoRedo, 0, NULL);
+ wMenuSeparatorCreate(editM);
+ MiscMenuItemCreate(editM, NULL, "cmdCut", _("Cu&t"), ACCL_CUT,
+ EditCut, IC_SELECTED, NULL);
+ MiscMenuItemCreate(editM, NULL, "cmdCopy", _("&Copy"), ACCL_COPY,
+ EditCopy, IC_SELECTED, NULL);
+ MiscMenuItemCreate(editM, NULL, "cmdPaste", _("&Paste"), ACCL_PASTE,
+ EditPaste, 0, NULL);
+ MiscMenuItemCreate(editM, NULL, "cmdClone", _("C&lone"), ACCL_CLONE,
+ EditClone, 0, NULL);
+ MiscMenuItemCreate(editM, NULL, "cmdDelete", _("De&lete"), ACCL_DELETE,
+ (wMenuCallBack_p) SelectDelete, IC_SELECTED, NULL);
+ MiscMenuItemCreate(editM, NULL, "cmdMoveToCurrentLayer",
+ _("Move To Current Layer"), ACCL_MOVCURLAYER,
+ MoveSelectedTracksToCurrentLayer,
+ IC_SELECTED, NULL);
+ wMenuSeparatorCreate( editM );
+ menuPLs[menuPG.paramCnt].context = I2VP(1);
+ MiscMenuItemCreate( editM, NULL, "cmdSelectAll", _("Select &All"),
+ ACCL_SELECTALL, (wMenuCallBack_p)SetAllTrackSelect, 0, I2VP(TRUE) );
+ MiscMenuItemCreate( editM, NULL, "cmdSelectCurrentLayer",
+ _("Select Current Layer"), ACCL_SETCURLAYER, SelectCurrentLayer, 0, NULL);
+ MiscMenuItemCreate( editM, NULL, "cmdSelectByIndex", _("Select By Index"), 0L,
+ StartIndexDialog, 0, &SelectByIndex );
+ MiscMenuItemCreate( editM, NULL, "cmdDeselectAll", _("&Deselect All"),
+ ACCL_DESELECTALL, (wMenuCallBack_p)SetAllTrackSelect, 0, I2VP(FALSE) );
+ MiscMenuItemCreate( editM, NULL, "cmdSelectInvert", _("&Invert Selection"), 0L,
+ InvertTrackSelect, 0, NULL);
+ MiscMenuItemCreate( editM, NULL, "cmdSelectOrphaned",
+ _("Select Stranded Track"), 0L, OrphanedTrackSelect, 0, NULL);
+ wMenuSeparatorCreate( editM );
+ MiscMenuItemCreate( editM, NULL, "cmdTunnel", _("Tu&nnel"), ACCL_TUNNEL,
+ SelectTunnel, IC_SELECTED, NULL);
+ MiscMenuItemCreate( editM, NULL, "cmdBridge", _("B&ridge"), ACCL_BRIDGE,
+ SelectBridge, IC_SELECTED, NULL);
+ MiscMenuItemCreate( editM, NULL, "cmdRoadbed", _("&Roadbed"), ACCL_ROADBED,
+ SelectRoadbed, IC_SELECTED, NULL);
+ MiscMenuItemCreate( editM, NULL, "cmdTies", _("Ties/NoTies"), ACCL_TIES,
+ SelectTies, IC_SELECTED, NULL);
+ MiscMenuItemCreate( editM, NULL, "cmdAbove", _("Move to &Front"), ACCL_ABOVE,
+ SelectAbove, IC_SELECTED, NULL);
+ MiscMenuItemCreate( editM, NULL, "cmdBelow", _("Move to &Back"), ACCL_BELOW,
+ SelectBelow, IC_SELECTED, NULL);
+
+ wMenuSeparatorCreate( editM );
+ MiscMenuItemCreate( editM, NULL, "cmdWidth0", _("Thin Tracks"), ACCL_THIN,
+ SelectTrackWidth, IC_SELECTED, I2VP(0) );
+ MiscMenuItemCreate( editM, NULL, "cmdWidth2", _("Medium Tracks"), ACCL_MEDIUM,
+ SelectTrackWidth, IC_SELECTED, I2VP(2) );
+ MiscMenuItemCreate( editM, NULL, "cmdWidth3", _("Thick Tracks"), ACCL_THICK,
+ SelectTrackWidth, IC_SELECTED, I2VP(3) );
+
+ /*
+ * VIEW MENU
+ */
+
+ zoomInM = wMenuPushCreate(viewM, "menuEdit-zoomIn", _("Zoom &In"),
+ ACCL_ZOOMIN, DoZoomUp, I2VP(1));
+ zoomSubM = wMenuMenuCreate(viewM, "menuEdit-zoomTo", _("&Zoom"));
+ zoomOutM = wMenuPushCreate(viewM, "menuEdit-zoomOut", _("Zoom &Out"),
+ ACCL_ZOOMOUT, DoZoomDown, I2VP(1));
+ zoomExtentsM = wMenuPushCreate(viewM, "menuEdit-zoomExtents",
+ _("Zoom &Extents"),
+ 0, DoZoomExtents, I2VP(0));
+ wMenuSeparatorCreate(viewM);
+
+ InitCmdZoom(zoomM, zoomSubM, NULL, NULL);
+
+ /* these menu choices and toolbar buttons are synonymous and should be treated as such */
+ wControlLinkedSet((wControl_p) zoomInM, (wControl_p) zoomUpB);
+ wControlLinkedSet((wControl_p) zoomOutM, (wControl_p) zoomDownB);
+ wControlLinkedSet((wControl_p) zoomExtentsM, (wControl_p) zoomExtentsB);
+
+ wMenuPushCreate(viewM, "menuEdit-redraw", _("&Redraw"), ACCL_REDRAW,
+ (wMenuCallBack_p) MainRedraw, NULL);
+ wMenuPushCreate(viewM, "menuEdit-redraw", _("Redraw All"), ACCL_REDRAWALL,
+ (wMenuCallBack_p) DoRedraw, NULL);
+ wMenuSeparatorCreate(viewM);
+
+ snapGridEnableMI = wMenuToggleCreate(viewM, "cmdGridEnable",
+ _("Enable SnapGrid"), ACCL_SNAPENABLE, 0,
+ SnapGridEnable, NULL);
+ snapGridShowMI = wMenuToggleCreate(viewM, "cmdGridShow", _("Show SnapGrid"),
+ ACCL_SNAPSHOW,
+ FALSE, SnapGridShow, NULL);
+ InitGrid(viewM);
+
+ // visibility toggle for anchors
+ // get the start value
+ long anchors_long;
+ wPrefGetInteger("misc", "anchors", &anchors_long, 1);
+ magneticSnap = anchors_long ? TRUE : FALSE;
+ magnetsMI = wMenuToggleCreate(viewM, "cmdMagneticSnap",
+ _("Enable Magnetic Snap"),
+ 0, magneticSnap,
+ MagneticSnapToggle, NULL);
+
+ // visibility toggle for map window
+ // get the start value
+ long mapVisible_long;
+ wPrefGetInteger("misc", "mapVisible", (long *) &mapVisible_long, 1);
+ mapVisible = mapVisible_long ? TRUE : FALSE;
+ mapShowMI = wMenuToggleCreate(viewM, "cmdMapShow", _("Show/Hide Map"),
+ ACCL_MAPSHOW, mapVisible,
+ MapWindowToggleShow, NULL);
+
+ wMenuSeparatorCreate(viewM);
+
+ toolbarM = wMenuMenuCreate(viewM, "toolbarM", _("&Tool Bar"));
+ CreateToolbarM(toolbarM);
+
+ cmdGroup = BG_EASE;
+ InitCmdEasement();
+
+ cmdGroup = BG_SNAP;
+ InitSnapGridButtons();
+ magnetsB = AddToolbarButton("cmdMagneticSnap",
+ wIconCreatePixMap(magnet_xpm3[iconSize]),
+ IC_MODETRAIN_TOO, MagneticSnapToggle, NULL);
+ wControlLinkedSet((wControl_p) magnetsMI, (wControl_p) magnetsB);
+ wButtonSetBusy(magnetsB, (wBool_t) magneticSnap);
+
+ mapShowB = AddToolbarButton("cmdMapShow", wIconCreatePixMap(map_xpm3[iconSize]),
+ IC_MODETRAIN_TOO, MapWindowToggleShow, NULL);
+ wControlLinkedSet((wControl_p) mapShowMI, (wControl_p) mapShowB);
+ wButtonSetBusy(mapShowB, (wBool_t) mapVisible);
+
+ /*
+ * ADD MENU
+ */
+
+ cmdGroup = BG_TRKCRT | BG_BIGGAP;
+ InitCmdStraight(addM);
+ InitCmdCurve(addM);
+ InitCmdParallel(addM);
+ InitCmdTurnout(addM);
+ InitCmdHandLaidTurnout(addM);
+ InitCmdStruct(addM);
+ InitCmdHelix(addM);
+ InitCmdTurntable(addM);
+
+ cmdGroup = BG_CONTROL;
+ ButtonGroupBegin( _("Control Element"), "cmdControlElements",
+ _("Control Element") );
+ InitCmdBlock(addM);
+ InitCmdSwitchMotor(addM);
+ InitCmdSignal(addM);
+ InitCmdControl(addM);
+ InitCmdSensor(addM);
+ ButtonGroupEnd();
+
+ /*
+ * CHANGE MENU
+ */
+ cmdGroup = BG_SELECT;
+ InitCmdDescribe(changeM);
+ InitCmdSelect(changeM);
+ InitCmdPan(viewM);
+
+ wMenuSeparatorCreate(changeM);
+
+ cmdGroup = BG_TRKGRP;
+ InitCmdMove(changeM);
+ InitCmdMoveDescription(changeM);
+ InitCmdDelete();
+ InitCmdTunnel();
+ InitCmdTies();
+ InitCmdBridge();
+ InitCmdRoadbed();
+ InitCmdAboveBelow();
+
+ cmdGroup = BG_TRKMOD;
+ InitCmdModify(changeM);
+ InitCmdCornu(changeM);
+
+ MiscMenuItemCreate(changeM, NULL, "cmdRescale", _("Change Scale"), 0,
+ DoRescale, IC_SELECTED, NULL);
+
+
+ wMenuSeparatorCreate(changeM);
+
+ InitCmdJoin(changeM);
+ InitCmdSplit(changeM);
+
+ wMenuSeparatorCreate(changeM);
+
+ InitCmdPull(changeM);
+
+ wMenuSeparatorCreate(changeM);
+
+ MiscMenuItemCreate(changeM, NULL, "cmdAddElevations",
+ _("Raise/Lower Elevations"), ACCL_CHGELEV,
+ ShowAddElevations, IC_SELECTED,
+ NULL);
+ InitCmdElevation(changeM);
+ InitCmdProfile(changeM);
+
+ MiscMenuItemCreate(changeM, NULL, "cmdClearElevations",
+ _("Clear Elevations"), ACCL_CLRELEV,
+ ClearElevations, IC_SELECTED, NULL);
+ MiscMenuItemCreate(changeM, NULL, "cmdElevation", _("Recompute Elevations"),
+ 0, RecomputeElevations, 0, NULL);
+ ParamRegister(&addElevPG);
+
+ /*
+ * DRAW MENU
+ */
+ cmdGroup = BG_MISCCRT;
+ InitCmdDraw(drawM);
+ InitCmdText(drawM);
+ InitTrkNote(drawM);
+
+ cmdGroup = BG_RULER;
+ InitCmdRuler(drawM);
+
+ /*
+ * OPTION MENU
+ */
+ MiscMenuItemCreate(optionM, NULL, "cmdLayout", _("L&ayout ..."),
+ ACCL_LAYOUTW, LayoutInit(), IC_MODETRAIN_TOO, NULL);
+ MiscMenuItemCreate(optionM, NULL, "cmdDisplay", _("&Display ..."),
+ ACCL_DISPLAYW, DisplayInit(), IC_MODETRAIN_TOO, NULL);
+ MiscMenuItemCreate(optionM, NULL, "cmdCmdopt", _("Co&mmand ..."),
+ ACCL_CMDOPTW, CmdoptInit(), IC_MODETRAIN_TOO, NULL);
+ MiscMenuItemCreate(optionM, NULL, "cmdEasement", _("&Easements ..."),
+ ACCL_EASEW, DoEasementRedir,
+ IC_MODETRAIN_TOO, NULL);
+ MiscMenuItemCreate(optionM, NULL, "fontSelW", _("&Fonts ..."), ACCL_FONTW,
+ SelectFont, IC_MODETRAIN_TOO, NULL);
+ MiscMenuItemCreate(optionM, NULL, "cmdSticky", _("Stic&ky ..."),
+ ACCL_STICKY, DoSticky, IC_MODETRAIN_TOO,
+ NULL);
+ if (extraButtons) {
+ menuPLs[menuPG.paramCnt].context = debugW;
+ MiscMenuItemCreate(optionM, NULL, "cmdDebug", _("&Debug ..."), 0,
+ DebugInit, IC_MODETRAIN_TOO, NULL);
+ }
+ MiscMenuItemCreate(optionM, NULL, "cmdPref", _("&Preferences ..."),
+ ACCL_PREFERENCES, PrefInit(), IC_MODETRAIN_TOO, NULL);
+ MiscMenuItemCreate(optionM, NULL, "cmdColor", _("&Colors ..."), ACCL_COLORW,
+ ColorInit(), IC_MODETRAIN_TOO, NULL);
+
+ /*
+ * MACRO MENU
+ */
+ wMenuPushCreate(macroM, "cmdRecord", _("&Record ..."), ACCL_RECORD,
+ DoRecord, NULL);
+ wMenuPushCreate(macroM, "cmdDemo", _("&Play Back ..."), ACCL_PLAYBACK,
+ DoPlayBack, NULL);
+
+ /*
+ * WINDOW MENU
+ */
+ wMenuPushCreate(windowM, "menuWindow", _("Main window"), 0,
+ (wMenuCallBack_p) wShow, mainW);
+ winList_mi = wMenuListCreate(windowM, "menuWindow", -1, DoShowWindow);
+
+ /*
+ * HELP MENU
+ */
+
+ /* main help window */
+ wMenuAddHelp(helpM);
+
+ /* help on recent messages */
+ wMenuSeparatorCreate(helpM);
+ wMenu_p messageListM = wMenuMenuCreate(helpM, "menuHelpRecentMessages",
+ _("Recent Messages"));
+ messageList_ml = wMenuListCreate(messageListM, "messageListM", 10,
+ ShowMessageHelp);
+ wMenuListAdd(messageList_ml, 0, _(MESSAGE_LIST_EMPTY), NULL);
+ wMenuPushCreate(helpM, "menuHelpProblemrep", _("Collect Problem Info"), 0,
+ DoProblemCollect, NULL);
+
+ /* tip of the day */
+ wMenuSeparatorCreate( helpM );
+ wMenuPushCreate( helpM, "cmdTip", _("Tip of the Day..."), 0, ShowTip,
+ I2VP(SHOWTIP_FORCESHOW | SHOWTIP_NEXTTIP));
+ demoM = wMenuMenuCreate( helpM, "cmdDemo", _("&Demos") );
+ wMenuPushCreate( helpM, "cmdExamples", _("Examples..."), 0, ChkExamples, NULL);
+
+ /* about window */
+ wMenuSeparatorCreate(helpM);
+ wMenuPushCreate(helpM, "about", _("About"), 0,
+ CreateAboutW, NULL);
+
+ /*
+ * MANAGE MENU
+ */
+
+ cmdGroup = BG_TRAIN | BG_BIGGAP;
+ InitCmdTrain(manageM);
+ wMenuSeparatorCreate(manageM);
+
+ InitNewTurn(
+ wMenuMenuCreate(manageM, "cmdTurnoutNew",
+ _("Tur&nout Designer...")));
+
+ MiscMenuItemCreate(manageM, NULL, "cmdContmgm",
+ _("Layout &Control Elements"), ACCL_CONTMGM,
+ ControlMgrInit(), 0, NULL);
+ MiscMenuItemCreate(manageM, NULL, "cmdGroup", _("&Group"), ACCL_GROUP,
+ DoGroup, IC_SELECTED, NULL);
+ MiscMenuItemCreate(manageM, NULL, "cmdUngroup", _("&Ungroup"), ACCL_UNGROUP,
+ DoUngroup, IC_SELECTED, NULL);
+
+ MiscMenuItemCreate(manageM, NULL, "cmdCustmgm",
+ _("Custom defined parts..."), ACCL_CUSTMGM, CustomMgrInit(),
+ 0, NULL);
+ MiscMenuItemCreate(manageM, NULL, "cmdRefreshCompound",
+ _("Update Turnouts and Structures"), 0,
+ DoRefreshCompound, 0, NULL);
+
+ MiscMenuItemCreate(manageM, NULL, "cmdCarInventory", _("Car Inventory"),
+ ACCL_CARINV, DoCarDlg, IC_MODETRAIN_TOO,
+ NULL);
+
+ wMenuSeparatorCreate(manageM);
+
+ MiscMenuItemCreate(manageM, NULL, "cmdLayer", _("Layers ..."), ACCL_LAYERS,
+ InitLayersDialog(), 0, NULL);
+ wMenuSeparatorCreate(manageM);
+
+ MiscMenuItemCreate(manageM, NULL, "cmdEnumerate", _("Parts &List ..."),
+ ACCL_PARTSLIST, EnumerateTracks, 0,
+ NULL);
+ MiscMenuItemCreate(manageM, NULL, "cmdPricelist", _("Price List..."),
+ ACCL_PRICELIST, PriceListInit(), 0, NULL);
+
+ cmdGroup = BG_LAYER | BG_BIGGAP;
+
+ InitCmdSelect2(changeM);
+ InitCmdDescribe2(changeM);
+ InitCmdPan2(changeM);
+
+ InitLayers();
+
+ cmdGroup = BG_HOTBAR;
+ InitHotBar();
+
+ InitBenchDialog();
+
+ ParamRegister(&rotatePG);
+ ParamRegister(&movePG);
+ ParamRegister(&indexPG);
+
+ // stickySet is initialized by AddMenuButton based on IC_STICKY flag
+ // Now check to see if there is saved value
+ wPrefGetInteger( "DialogItem", "sticky-set", &stickySet, stickySet );
+ ParamRegister(&stickyPG);
+}
+
+
+static void InitCmdExport(void)
+{
+ ButtonGroupBegin( _("Import/Export"), "cmdExportImportSetCmd",
+ _("Import/Export") );
+ cmdGroup = BG_EXPORTIMPORT;
+ AddToolbarButton("cmdExport", wIconCreatePixMap(doc_export_xpm3[iconSize]),
+ IC_SELECTED | IC_ACCLKEY, DoExport, NULL);
+ AddToolbarButton("cmdExportDXF",
+ wIconCreatePixMap(doc_export_dxf_xpm3[iconSize]),
+ IC_SELECTED | IC_ACCLKEY, DoExportDXF, I2VP(1));
+ AddToolbarButton("cmdExportBmap",
+ wIconCreatePixMap(doc_export_bmap_xpm3[iconSize]), IC_ACCLKEY,
+ OutputBitMapInit(), NULL);
+#if XTRKCAD_CREATE_SVG
+ AddToolbarButton("cmdExportSVG",
+ wIconCreatePixMap(doc_export_svg_xpm3[iconSize]),
+ IC_ACCLKEY, DoExportSVG, NULL); // IC_SELECTED |
+#endif
+ AddToolbarButton("cmdImport", wIconCreatePixMap(doc_import_xpm3[iconSize]),
+ IC_ACCLKEY,
+ DoImport, I2VP(0));
+ AddToolbarButton("cmdImportModule",
+ wIconCreatePixMap(doc_import_mod_xpm3[iconSize]), IC_ACCLKEY,
+ DoImport, I2VP(1));
+ ButtonGroupEnd();
+ ParamRegister( &menuPG );
+ AddPlaybackProc( "MENU", MenuPlayback, NULL );
+}