diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2024-07-03 10:19:36 +0200 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2024-07-03 10:19:36 +0200 | 
| commit | b6bd52cd7330a90fc0e44dbe6022551a8dd768a1 (patch) | |
| tree | 9804282102f8c40d27407b9c94119b35eeb5013c /app/bin/command.c | |
| parent | c9d0740841fbe0539e42e66d3865672bfcd3ac02 (diff) | |
| parent | a14a7a0ccc9de76aeab0b2e4bbf58f1a79deedc2 (diff) | |
Update upstream source from tag 'upstream/5.3.0GA'
Update to upstream version '5.3.0GA'
with Debian dir dfd14d63b0238e276ade6f54dd9100325df5b2f9
Diffstat (limited to 'app/bin/command.c')
| -rw-r--r-- | app/bin/command.c | 800 | 
1 files changed, 800 insertions, 0 deletions
diff --git a/app/bin/command.c b/app/bin/command.c new file mode 100644 index 0000000..bf628f8 --- /dev/null +++ b/app/bin/command.c @@ -0,0 +1,800 @@ +/* file command.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 "command.h" +#include "common.h" +#include "cselect.h" +#include "cundo.h" +#include "draw.h" +#include "fileio.h" +#include "track.h" +#include "common-ui.h" +#include "menu.h" + +/***************************************************************************** + * + * COMMAND + * + */ + +#define COMMAND_MAX (250) +#define BUTTON_MAX (250) + +static struct { +	wControl_p control; +	wBool_t enabled; +	wWinPix_t x, y; +	long options; +	int group; +	wIndex_t cmdInx; +} buttonList[BUTTON_MAX]; +EXPORT int buttonCnt = 0; // TODO-misc-refactor + +static struct { +	procCommand_t cmdProc; +	char * helpKey; +	wIndex_t buttInx; +	char * labelStr; +	wIcon_p icon; +	int reqLevel; +	wBool_t enabled; +	long options; +	long stickyMask; +	long acclKey; +	wMenuPush_p menu[NUM_CMDMENUS]; +	void * context; +} commandList[COMMAND_MAX]; + + +EXPORT int commandCnt = 0; + +static wIndex_t curCommand = 0; + +EXPORT int cmdGroup; + +static int log_command; + +#define TOOLBARSET_INIT				(0xFFFF) +EXPORT long toolbarSet = TOOLBARSET_INIT; +EXPORT wWinPix_t toolbarHeight = 0; +static wWinPix_t toolbarWidth = 0; +EXPORT long preSelect = 0;	/**< default command 0 = Describe 1 = Select */ +EXPORT long rightClickMode = 0; +EXPORT void * commandContext; +EXPORT coOrd cmdMenuPos; + +/*--------------------------------------------------------------------*/ +EXPORT const char* GetCurCommandName() +{ +	return commandList[curCommand].helpKey; +} + +EXPORT void EnableCommands(void) +{ +	int inx, minx; +	wBool_t enable; + +	LOG(log_command, 5, +	    ( "COMMAND enable S%d M%d\n", selectedTrackCount, programMode )) +	for (inx = 0; inx < commandCnt; inx++) { +		if (commandList[inx].buttInx) { +			if ((commandList[inx].options & IC_SELECTED) +			    && selectedTrackCount <= 0) { +				enable = FALSE; +			} else if ((programMode == MODE_TRAIN +			            && (commandList[inx].options +			                & (IC_MODETRAIN_TOO | IC_MODETRAIN_ONLY)) == 0) +			           || (programMode != MODE_TRAIN +			               && (commandList[inx].options & IC_MODETRAIN_ONLY) +			               != 0)) { +				enable = FALSE; +			} else { +				enable = TRUE; +			} +			if (commandList[inx].enabled != enable) { +				if (commandList[inx].buttInx >= 0) +					wControlActive(buttonList[commandList[inx].buttInx].control, +					               enable); +				for (minx = 0; minx < NUM_CMDMENUS; minx++) +					if (commandList[inx].menu[minx]) { +						wMenuPushEnable(commandList[inx].menu[minx], enable); +					} +				commandList[inx].enabled = enable; +			} +		} +	} + +	EnableMenus(); + +	for (inx = 0; inx < buttonCnt; inx++) { +		if (buttonList[inx].cmdInx < 0 +		    && (buttonList[inx].options & IC_SELECTED)) { +			wControlActive(buttonList[inx].control, selectedTrackCount > 0); +		} +	} +} + +EXPORT wIndex_t GetCurrentCommand() +{ +	return curCommand; +} + +EXPORT void Reset(void) +{ +	if (recordF) { +		fprintf(recordF, "RESET\n"); +		fflush(recordF); +	} +	LOG(log_command, 2, +	    ( "COMMAND CANCEL %s\n", commandList[curCommand].helpKey )) +	commandList[curCommand].cmdProc( C_CANCEL, zero); +	if (commandList[curCommand].buttInx >= 0) +		wButtonSetBusy( +		        (wButton_p) buttonList[commandList[curCommand].buttInx].control, +		        FALSE); +	curCommand = (preSelect ? selectCmdInx : describeCmdInx); +	wSetCursor(mainD.d, preSelect ? defaultCursor : wCursorQuestion); +	commandContext = commandList[curCommand].context; +	if (commandList[curCommand].buttInx >= 0) +		wButtonSetBusy( +		        (wButton_p) buttonList[commandList[curCommand].buttInx].control, +		        TRUE); +	DYNARR_RESET( trkSeg_t, tempSegs_da ); + +	TryCheckPoint(); + +	ClrAllTrkBits( TB_UNDRAWN ); +	DoRedraw(); // Reset +	EnableCommands(); +	ResetMouseState(); +	LOG(log_command, 1, +	    ( "COMMAND RESET %s\n", commandList[curCommand].helpKey )) +	(void) commandList[curCommand].cmdProc( C_START, zero); +} + +static BOOL_T CheckClick(wAction_t *action, coOrd *pos, BOOL_T checkLeft, +                         BOOL_T checkRight) +{ +	static long time0; +	static coOrd pos0; +	long time1; +	long timeDelta; +	DIST_T distDelta; + +	switch (*action) { +	case C_LDOUBLE: +		if (!checkLeft) { +			return TRUE; +		} +		time0 = 0; +		break; +	case C_DOWN: +		if (!checkLeft) { +			return TRUE; +		} +		time0 = wGetTimer() - adjTimer; +		pos0 = *pos; +		return FALSE; +	case C_MOVE: +		if (!checkLeft) { +			return TRUE; +		} +		if (time0 != 0) { +			time1 = wGetTimer() - adjTimer; +			timeDelta = time1 - time0; +			distDelta = FindDistance(*pos, pos0); +			if (timeDelta > dragTimeout || distDelta > dragDistance) { +				time0 = 0; +				*pos = pos0; +				*action = C_DOWN; +			} else { +				return FALSE; +			} +		} +		break; +	case C_UP: +		if (!checkLeft) { +			return TRUE; +		} +		if (time0 != 0) { +			time1 = wGetTimer() - adjTimer; +			timeDelta = time1 - time0; +			distDelta = FindDistance(*pos, pos0); +			time0 = 0; +			*action = C_LCLICK; +		} +		break; +	case C_RDOWN: +		if (!checkRight) { +			return TRUE; +		} +		time0 = wGetTimer() - adjTimer; +		pos0 = *pos; +		return FALSE; +	case C_RMOVE: +		if (!checkRight) { +			return TRUE; +		} +		if (time0 != 0) { +			time1 = wGetTimer() - adjTimer; +			timeDelta = time1 - time0; +			distDelta = FindDistance(*pos, pos0); +			if (timeDelta > dragTimeout || distDelta > dragDistance) { +				time0 = 0; +				*pos = pos0; +				*action = C_RDOWN; +			} else { +				return FALSE; +			} +		} +		break; +	case C_RUP: +		if (!checkRight) { +			return TRUE; +		} +		if (time0 != 0) { +			time0 = 0; +			*action = C_RCLICK; +		} +		break; +	} +	return TRUE; +} + +EXPORT wBool_t DoCurCommand(wAction_t action, coOrd pos) +{ +	wAction_t rc; +	int mode; +	wBool_t bExit = FALSE; + +	if (action == wActionMove) { +		if ((commandList[curCommand].options & IC_WANT_MOVE) == 0) { +			bExit = TRUE; +		} +	} else if ((action&0xFF) == wActionModKey) { +		if ((commandList[curCommand].options & IC_WANT_MODKEYS) == 0) { +			bExit = TRUE; +		} +	} else if (!CheckClick(&action, &pos, +	                       (int) (commandList[curCommand].options & IC_LCLICK), TRUE)) { +		bExit = TRUE; +	} else if (action == C_RCLICK +	           && (commandList[curCommand].options & IC_RCLICK) == 0) { +		if (!inPlayback) { +			mode = MyGetKeyState(); +			if ((mode & (~WKEY_SHIFT)) != 0) { +				wBeep(); +				bExit = TRUE; +			} else if (((mode & WKEY_SHIFT) == 0) == (rightClickMode == 0)) { +				if (selectedTrackCount > 0) { +					if (commandList[curCommand].options & IC_CMDMENU) { +					} +					wMenuPopupShow(popup2M); +				} else { +					wMenuPopupShow(popup1M); +				} +				bExit = TRUE; +			} else if ((commandList[curCommand].options & IC_CMDMENU)) { +				cmdMenuPos = pos; +				action = C_CMDMENU; +			} else { +				wBeep(); +				bExit = TRUE; +			} +		} else { +			bExit = TRUE; +		} +	} +	if ( bExit ) { +		TempRedraw(); // DoCurCommand: precommand +		return C_CONTINUE; +	} + +	LOG(log_command, 2, +	    ( "COMMAND MOUSE %s %d @ %0.3f %0.3f\n", commandList[curCommand].helpKey, +	      (int)action, pos.x, pos.y )) +	rc = commandList[curCommand].cmdProc(action, pos); +	LOG(log_command, 4, ( "    COMMAND returns %d\n", rc )) +	switch ( action & 0xFF ) { +	case wActionMove: +	case wActionModKey: +	case C_DOWN: +	case C_MOVE: +	case C_UP: +	case C_RDOWN: +	case C_RMOVE: +	case C_RUP: +	case C_LCLICK: +	case C_RCLICK: +	case C_TEXT: +	case C_OK: +		if (rc== C_TERMINATE) { MainRedraw(); } +		else { TempRedraw(); } // DoCurCommand: postcommand +		break; +	default: +		break; +	} +	if ((rc == C_TERMINATE || rc == C_INFO) +	    && (commandList[curCommand].options & IC_STICKY) +	    && (commandList[curCommand].stickyMask & stickySet)) { +		DYNARR_RESET( trkSeg_t, tempSegs_da ); +		UpdateAllElevations(); +		if (commandList[curCommand].options & IC_NORESTART) { +			return C_CONTINUE; +		} +		//Make sure we checkpoint even sticky commands +		TryCheckPoint(); +		LOG(log_command, 1, +		    ( "COMMAND START %s\n", commandList[curCommand].helpKey )) +		wSetCursor(mainD.d,defaultCursor); +		rc = commandList[curCommand].cmdProc( C_START, pos); +		LOG(log_command, 4, ( "    COMMAND returns %d\n", rc )) +		switch (rc) { +		case C_CONTINUE: +			break; +		case C_ERROR: +			Reset(); +#ifdef VERBOSE +			lprintf( "Start returns Error"); +#endif +			break; +		case C_TERMINATE: +			InfoMessage(""); +		case C_INFO: +			Reset(); +			break; +		} +	} +	return rc; +} + +/* + * \parm reset says if the user used Esc rather than undo/redo + */ +EXPORT int ConfirmReset(BOOL_T retry) +{ +	wAction_t rc; +	if (curCommand != describeCmdInx) { +		LOG(log_command, 3, +		    ( "COMMAND CONFIRM %s\n", commandList[curCommand].helpKey )) +		rc = commandList[curCommand].cmdProc( C_CONFIRM, zero); +		LOG(log_command, 4, ( "    COMMAND returns %d\n", rc )) +		if (rc == C_ERROR) { +			if (retry) +				rc = +				        wNotice3( +				                _( +				                        "Cancelling the current command will undo the changes\n" +				                        "you are currently making. Do you want to do the update instead?"), +				                _("Yes"), _("No"), _("Cancel")); +			else +				rc = +				        wNoticeEx( NT_WARNING, +				                   _( +				                           "Cancelling the current command will undo the changes\n" +				                           "you are currently making. Do you want to do the update instead?"), +				                   _("Yes"), _("No")); +			if (rc == 1) { +				LOG(log_command, 3, +				    ( "COMMAND OK %s\n", commandList[curCommand].helpKey )) +				commandList[curCommand].cmdProc( C_OK, zero); +				return C_OK; +			} else if (rc == -1) { +				return C_CANCEL; +			} +		} else if (rc == C_TERMINATE) { +			return C_TERMINATE; +		} +	} +	if (retry) { +		/* because user pressed esc */ +		SetAllTrackSelect( FALSE); +	} +	Reset(); +	LOG(log_command, 1, +	    ( "COMMAND RESET %s\n", commandList[curCommand].helpKey )) +	commandList[curCommand].cmdProc( C_START, zero); +	return C_CONTINUE; +} + +EXPORT void DoCommandB(void * data) +{ +	wIndex_t inx = (wIndex_t)VP2L(data); +	STATUS_T rc; +	static coOrd pos = { 0, 0 }; +	static int inDoCommandB = FALSE; +	wIndex_t buttInx; + +	if (inDoCommandB) { +		return; +	} +	inDoCommandB = TRUE; + +	if (inx < 0 || inx >= commandCnt) { +		CHECK(FALSE); +		inDoCommandB = FALSE; +		return; +	} + +	if ((!inPlayback) && (!commandList[inx].enabled)) { +		ErrorMessage(MSG_COMMAND_DISABLED); +		inx = describeCmdInx; +	} + +	InfoMessage(""); +	if (curCommand != selectCmdInx) { +		LOG(log_command, 3, +		    ( "COMMAND FINISH %s\n", commandList[curCommand].helpKey )) +		rc = commandList[curCommand].cmdProc( C_FINISH, zero); +		LOG(log_command, 3, +		    ( "COMMAND CONFIRM %s\n", commandList[curCommand].helpKey )) +		rc = commandList[curCommand].cmdProc( C_CONFIRM, zero); +		LOG(log_command, 4, ( "    COMMAND returns %d\n", rc )) +		if (rc == C_ERROR) { +			rc = wNotice3( +			             _("Cancelling the current command will undo the changes\n" +			               "you are currently making. Do you want to update?"), +			             _("Yes"), _("No"), _("Cancel")); +			if (rc == 1) { +				commandList[curCommand].cmdProc( C_OK, zero); +			} else if (rc == -1) { +				inDoCommandB = FALSE; +				return; +			} +		} +		LOG(log_command, 3, +		    ( "COMMAND CANCEL %s\n", commandList[curCommand].helpKey )) +		commandList[curCommand].cmdProc( C_CANCEL, pos); +		DYNARR_RESET( trkSeg_t, tempSegs_da ); +	} else { +		LOG(log_command, 3, +		    ( "COMMAND FINISH %s\n", commandList[curCommand].helpKey )) +		rc = commandList[curCommand].cmdProc( C_FINISH, zero); +	} +	if (commandList[curCommand].buttInx >= 0) +		wButtonSetBusy( +		        (wButton_p) buttonList[commandList[curCommand].buttInx].control, +		        FALSE); + +	if (recordF) { +		fprintf(recordF, "COMMAND %s\n", commandList[inx].helpKey + 3); +		fflush(recordF); +	} + +	curCommand = inx; +	commandContext = commandList[curCommand].context; +	if ((buttInx = commandList[curCommand].buttInx) >= 0) { +		if (buttonList[buttInx].cmdInx != curCommand) { +			wButtonSetLabel((wButton_p) buttonList[buttInx].control, +			                (char*) commandList[curCommand].icon); +			wControlSetHelp(buttonList[buttInx].control, +			                GetBalloonHelpStr(commandList[curCommand].helpKey)); +			wControlSetContext(buttonList[buttInx].control, +			                   I2VP(curCommand)); +			buttonList[buttInx].cmdInx = curCommand; +		} +		wButtonSetBusy( +		        (wButton_p) buttonList[commandList[curCommand].buttInx].control, +		        TRUE); +	} +	LOG(log_command, 1, +	    ( "COMMAND START %s\n", commandList[curCommand].helpKey )) +	wSetCursor(mainD.d,defaultCursor); +	rc = commandList[curCommand].cmdProc( C_START, pos); +	LOG(log_command, 4, ( "    COMMAND returns %d\n", rc )) +	TempRedraw(); // DoCommandB +	switch (rc) { +	case C_CONTINUE: +		break; +	case C_ERROR: +		Reset(); +#ifdef VERBOSE +		lprintf( "Start returns Error"); +#endif +		break; +	case C_TERMINATE: +	case C_INFO: +		if (rc == C_TERMINATE) { +			InfoMessage(""); +		} +		Reset(); +		break; +	} +	inDoCommandB = FALSE; +} + +static void LayoutSetPos(wIndex_t inx) +{ +	wWinPix_t w, h, offset; +	static wWinPix_t toolbarRowHeight = 0; +	static wWinPix_t width; +	static int lastGroup; +	static wWinPix_t gap; +	static int layerButtCnt; +	static int layerButtNumber; +	int currGroup; + +	if (inx == 0) { +		lastGroup = 0; +		wWinGetSize(mainW, &width, &h); +		gap = 5; +		toolbarWidth = width - 20 + 5; +		layerButtCnt = 0; +		layerButtNumber = 0; +		toolbarHeight = 0; +	} + +	if (buttonList[inx].control) { +		if (toolbarRowHeight <= 0) { +			toolbarRowHeight = wControlGetHeight(buttonList[inx].control); +		} + +		currGroup = buttonList[inx].group & ~BG_BIGGAP; +		if (currGroup != lastGroup && (buttonList[inx].group & BG_BIGGAP)) { +			gap = 15; +		} +		if ((toolbarSet & (1 << currGroup)) +		    && (programMode != MODE_TRAIN +		        || (buttonList[inx].options +		            & (IC_MODETRAIN_TOO | IC_MODETRAIN_ONLY))) +		    && (programMode == MODE_TRAIN +		        || (buttonList[inx].options & IC_MODETRAIN_ONLY) == 0) +		    && ((buttonList[inx].group & ~BG_BIGGAP) != BG_LAYER +		        || layerButtCnt < layerCount)) { +			if (currGroup != lastGroup) { +				toolbarWidth += gap; +				lastGroup = currGroup; +				gap = 5; +			} +			w = wControlGetWidth(buttonList[inx].control); +			h = wControlGetHeight(buttonList[inx].control); +			if (h<toolbarRowHeight) { +				offset = (h-toolbarRowHeight)/2; +				h = toolbarRowHeight;  //Uniform +			} else { offset = 0; } +			if (inx < buttonCnt - 1 && (buttonList[inx + 1].options & IC_ABUT)) { +				w += wControlGetWidth(buttonList[inx + 1].control); +			} +			if (toolbarWidth + w > width - 20) { +				toolbarWidth = 0; +				toolbarHeight += h + 5; +			} +			if ((currGroup == BG_LAYER) && layerButtNumber>1 +			    && GetLayerHidden(layerButtNumber-2) ) { +				wControlShow(buttonList[inx].control, FALSE); +				layerButtNumber++; +			} else { +				if (currGroup == BG_LAYER ) { +					if (layerButtNumber>1) { layerButtCnt++; } // Ignore List and Background +					layerButtNumber++; +				} +				wControlSetPos(buttonList[inx].control, toolbarWidth, +				               toolbarHeight - (h + 5 +offset)); +				buttonList[inx].x = toolbarWidth; +				buttonList[inx].y = toolbarHeight - (h + 5 + offset); +				toolbarWidth += wControlGetWidth(buttonList[inx].control); +				wControlShow(buttonList[inx].control, TRUE); +			} +		} else { +			wControlShow(buttonList[inx].control, FALSE); +		} +	} +} + +EXPORT void LayoutToolBar( void * data ) +{ +	int inx; + +	for (inx = 0; inx < buttonCnt; inx++) { +		LayoutSetPos(inx); +	} +	if (toolbarSet&(1<<BG_HOTBAR)) { +		LayoutHotBar(data); +	} else { +		HideHotBar(); +	} +} + +static void ToolbarChange(long changes) +{ +	if ((changes & CHANGE_TOOLBAR)) { +		/*if ( !(changes&CHANGE_MAIN) )*/ +		MainProc( mainW, wResize_e, NULL, NULL ); +		/*else +		 LayoutToolBar();*/ +	} +} + +/*************************************************************************** + * + * + * + */ + +EXPORT BOOL_T CommandEnabled(wIndex_t cmdInx) +{ +	return commandList[cmdInx].enabled; +} + + +EXPORT wIndex_t AddCommand(procCommand_t cmdProc, const char * helpKey, +                           const char * nameStr, wIcon_p icon, int reqLevel, long options, long acclKey, +                           wIndex_t buttInx, long stickyMask, wMenuPush_p cmdMenus[NUM_CMDMENUS], +                           void * context) +{ +	CHECK( commandCnt < COMMAND_MAX - 1 ); +	commandList[commandCnt].labelStr = MyStrdup(nameStr); +	commandList[commandCnt].helpKey = MyStrdup(helpKey); +	commandList[commandCnt].cmdProc = cmdProc; +	commandList[commandCnt].icon = icon; +	commandList[commandCnt].reqLevel = reqLevel; +	commandList[commandCnt].enabled = TRUE; +	commandList[commandCnt].options = options; +	commandList[commandCnt].acclKey = acclKey; +	commandList[commandCnt].context = context; +	commandList[commandCnt].buttInx = buttInx; +	commandList[commandCnt].stickyMask = stickyMask; +	commandList[commandCnt].menu[0] = cmdMenus[0]; +	commandList[commandCnt].menu[1] = cmdMenus[1]; +	commandList[commandCnt].menu[2] = cmdMenus[2]; +	commandList[commandCnt].menu[3] = cmdMenus[3]; +	if ( buttInx >= 0 && buttonList[buttInx].cmdInx == -1 ) { +		// set button back-link +		buttonList[buttInx].cmdInx = commandCnt; +	} +	commandCnt++; +	return commandCnt - 1; +} + +EXPORT void AddToolbarControl(wControl_p control, long options) +{ +	CHECK( buttonCnt < COMMAND_MAX - 1 ); +	buttonList[buttonCnt].enabled = TRUE; +	buttonList[buttonCnt].options = options; +	buttonList[buttonCnt].group = cmdGroup; +	buttonList[buttonCnt].x = 0; +	buttonList[buttonCnt].y = 0; +	buttonList[buttonCnt].control = control; +	buttonList[buttonCnt].cmdInx = -1; +	LayoutSetPos(buttonCnt); +	buttonCnt++; +} + + +/*--------------------------------------------------------------------*/ + +EXPORT void PlaybackButtonMouse(wIndex_t buttInx) +{ +	wWinPix_t cmdX, cmdY; +	coOrd pos; + +	if (buttInx < 0 || buttInx >= buttonCnt) { +		return; +	} +	if (buttonList[buttInx].control == NULL) { +		return; +	} +	cmdX = buttonList[buttInx].x + 17; +	cmdY = toolbarHeight - (buttonList[buttInx].y + 17) +	       + (wWinPix_t) (mainD.size.y / mainD.scale * mainD.dpi) + 30; + +	mainD.Pix2CoOrd( &mainD, cmdX, cmdY, &pos ); +	MovePlaybackCursor(&mainD, pos, TRUE, buttonList[buttInx].control); +	if (playbackTimer == 0) { +		wButtonSetBusy((wButton_p) buttonList[buttInx].control, TRUE); +		wFlush(); +		wPause(500); +		wButtonSetBusy((wButton_p) buttonList[buttInx].control, FALSE); +		wFlush(); +	} +} + + +EXPORT void PlaybackCommand(const char * line, wIndex_t lineNum) +{ +	size_t inx; +	wIndex_t buttInx; +	size_t len1, len2; +	len1 = strlen(line + 8); +	for (inx = 0; inx < commandCnt; inx++) { +		len2 = strlen(commandList[inx].helpKey + 3); +		if (len1 == len2 +		    && strncmp(line + 8, commandList[inx].helpKey + 3, len2) == 0) { +			break; +		} +	} +	if (inx >= commandCnt) { +		fprintf(stderr, "Unknown playback COMMAND command %d : %s\n", lineNum, +		        line); +	} else { +		wWinPix_t cmdX, cmdY; +		coOrd pos; +		if ((buttInx = commandList[inx].buttInx) >= 0) { +			cmdX = buttonList[buttInx].x + 17; +			cmdY = toolbarHeight - (buttonList[buttInx].y + 17) +			       + (wWinPix_t) (mainD.size.y / mainD.scale * mainD.dpi) + 30; +			mainD.Pix2CoOrd( &mainD, cmdX, cmdY, &pos ); +			MovePlaybackCursor(&mainD, pos,TRUE,buttonList[buttInx].control); +		} +		if (strcmp(line + 8, "Undo") == 0) { +			if (buttInx > 0 && playbackTimer == 0) { +				wButtonSetBusy((wButton_p) buttonList[buttInx].control, TRUE); +				wFlush(); +				wPause(500); +				wButtonSetBusy((wButton_p) buttonList[buttInx].control, FALSE); +				wFlush(); +			} +			UndoUndo(NULL); +		} else if (strcmp(line + 8, "Redo") == 0) { +			if (buttInx >= 0 && playbackTimer == 0) { +				wButtonSetBusy((wButton_p) buttonList[buttInx].control, TRUE); +				wFlush(); +				wPause(500); +				wButtonSetBusy((wButton_p) buttonList[buttInx].control, FALSE); +				wFlush(); +			} +			UndoRedo(NULL); +		} else { +			if (buttInx >= 0 && playbackTimer == 0) { +				wButtonSetBusy((wButton_p) buttonList[buttInx].control, TRUE); +				wFlush(); +				wPause(500); +				wButtonSetBusy((wButton_p) buttonList[buttInx].control, FALSE); +				wFlush(); +			} +			DoCommandB(I2VP(inx)); +		} +	} +} + +/*--------------------------------------------------------------------*/ + + +EXPORT BOOL_T IsCurCommandSticky(void) +{ +	if ((commandList[curCommand].options & IC_STICKY) != 0 +	    && (commandList[curCommand].stickyMask & stickySet) != 0) { +		return TRUE; +	} +	return FALSE; +} + +EXPORT void ResetIfNotSticky(void) +{ +	if ((commandList[curCommand].options & IC_STICKY) == 0 +	    || (commandList[curCommand].stickyMask & stickySet) == 0) { +		Reset(); +	} +} + + +/*--------------------------------------------------------------------*/ +EXPORT void CommandInit( void ) +{ +	curCommand = describeCmdInx; +	commandContext = commandList[curCommand].context; +	log_command = LogFindIndex( "command" ); +	RegisterChangeNotification(ToolbarChange); +} +  | 
