⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _gm_undo.class

📁 是一个经济学管理应用软件 很难找的 但是经济学学生又必须用到
💻 CLASS
字号:
/*                                _gm_undo

	Class for managing the graphics undo log.
*/
*! version 1.0.0  30jul2002

version 8

class {
    class:
    	sz = 50

    instance:
    	array edits			/* undo edits, references to logs
					 * holding the edits. managed as a
					 * circular list. */
	nxt = 1				/* index of next open edit */
					 * the undo */
} , inherit(object)

/* -------------------------------------------------------------------------*/
program define new

	forvalues i=1/`.sz' {
		.edits[`i'] = ._gm_undoedit.new
	}

end


/* -------------------------------------------------------------------------*/
/* Add an edit to the list that can be undone.  Must specify the name of the
   log and number of lines in the log that correspond to the edit 
*/
program define add

	args logname num_edits

	local idx = 0`.`logname'.arrnels'

	if `idx'-`num_edits' < 0 {
		di as text "`logname' not found or `num_edits' is too large"
		exit 198					/* EXIT */
	}

	.edits[`.nxt'].log     = "`logname'"
	.edits[`.nxt'].logdex  = `idx'
	.edits[`.nxt'].n_edits = `num_edits'

	._update_nxt
end


/* -------------------------------------------------------------------------*/
/* Undo the most recently logged edit.  This removes the edit from the undo
   list and from its log.  It does not redraw the edited object.
*/

program define undo

	forvalues i = `=`.nxt'-1'(-1)1 {
		if "`.edits[`i'].log'" != "" {
			local edex `i'
			continue, break
		}
	}

	if ! 0`edex' {
		forvalues i = `.sz'(-1)`=`.nxt'+1' {
			if "`.edits[`i'].log'" != "" {
				local edex `i'
				continue, break
			}
		}
	}

	if 0`edex' <= 0 {
		di as text "(note: nothing to undo)"
		exit						/* EXIT */
	}

	local edit edits[`edex']
	local log  `.`edit'.log'
	local logidx = 0`.`log'.arrnels'

	if `logidx' < 0`.`edit'.logdex' {
		di as error "undo edit has become invalid, no longer in log"
		local rc 198
	}
	else {
		if `logidx'-`.`edit'.n_edits' < 0 {
			di as error "undo implies more edits than log contains"
			local rc 198
		}
	}

	if ! 0`rc' {
		if 0`.`edit'.logdex' == `logidx' {
			forvalues i = 1/`.`edit'.n_edits' {
				.`log'.Arrpop
			}
		}
		else {
			local idx `.`edit'.logdex'
			forvalues i = 0/`=`.`edit'.n_edits'-1' {
				.`log'[`idx'-`i'].Arrdropel
			}
		}

		.nxt = `edex'
		._clear_nxt
	}

	class exit `"`._topname `log''"'
	// exit `rc'
end


/* -------------------------------------------------------------------------*/
/* Clear all edits.
*/

program define clear

	forvalues i=1/`.sz' {
		._clear_i `i'
	}
end


/* -------------------------------------------------------------------------*/
/*  Clear all undo edits for a specific log.
*/

program define clear_graph

	args grnm

	forvalues i = 1/`.sz' {
		if "`._topname `.edits[`i'].log''" == "`grnm'" {
			._clear_i `i'
		}
	}
end


/* -------------------------------------------------------------------------*/
program define debug
	di ".nxt = `.nxt'"
	forvalues i=1/`.sz' {
		di "log `.edits[`i'].log' logdex=`.edits[`i'].logdex' "	/*
			*/ "n_edits=`.edits[`i'].n_edits'
	}
end


/* -------------------------------------------------------------------------*/

program define _update_nxt
	.nxt = cond(`.nxt'==`.sz', 1, `.nxt'+1)
	._clear_nxt
end

program define _clear_nxt
	._clear_i `.nxt'
end

program define _clear_i
	args i

	.edits[`i'].log     = ""
	.edits[`i'].logdex  = exp(.)
	.edits[`i'].n_edits = exp(.)
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -