`

flex设计器功能拆分之二(撤销与恢复)

    博客分类:
  • Flex
阅读更多

撤销与恢复主要用到了命令模式,也许还会和其他模式相结合:



 

package org.forever.drawlines
{
	//命令接口
	public interface Command
	{
		 function execute():void;//执行操作
		 function unexecute():void;//取消操作
		 function canExecute():Boolean;//是否允许执行操作
		 function canUnexecute():Boolean;//是否允许取消操作
	}
}

 

package org.forever.drawlines
{
	//命令集合类,负责存储执行过的命令和撤销执行的命令
	public class CommandList
	{
		private var _executedCommands:Array = new Array();
		private var _unexecutedCommands:Array = new Array();
		
		private function _execute(command:Command):void{
			command.execute();//执行具体的命令
			_executedCommands.push(command);//记录执行的命令
		}
		
		public function execute(command:Command):void{
			_unexecutedCommands = new Array();
			_execute(command);
		}
		
		//撤销执行,每执行一次该方法,将从最近的一次操作开始撤销
		public function unexecute():void{
			var command:Command = _executedCommands.pop();//出栈最后一次执行命令
			command.unexecute();//撤销该命令的执行
			_unexecutedCommands.push(command);//记录撤销的命令
		}
		
		//恢复执行,每执行一次该方法,将从最近的一次操作开始撤销
		public function reexecute():void{
			var command:Command = _unexecutedCommands.pop();//出栈最后一次撤销命令
			_execute(command);//重新执行
		}
		
		public function reset():void{
			_executedCommands = new Array();
			_unexecutedCommands = new Array();
		}
		
		//是否允许撤销命令,没有执行过命令就不存在撤销
		public function canUnexecuteCommand():Boolean{
			return !(_executedCommands.length==0);
		}
		
		//是否允许恢复命令,没有撤销过命令就不存在恢复
		public function canReexecuteCommand():Boolean{
			return !(_unexecutedCommands.length==0);
		}
		
	}
}

 

package org.forever.drawlines
{
	//添加线命令类
	public class AddLineCommand implements Command
	{
		private var _drawing:Drawing;//画布
		private var _line:Line;//直线
		
		
		public function AddLineCommand(drawing:Drawing,line:Line)
		{
			this._drawing = drawing;
			this._line = line;
		}
		
		public function execute():void
		{
			_drawing.add(_line);
		}
		
		public function unexecute():void
		{
			_drawing.remove(_line);
		}
		
		public function canExecute():Boolean
		{
			return true;
		}
		
		public function canUnexecute():Boolean
		{
			return true;
		}
	}
}

 

package org.forever.drawlines
{
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	import mx.collections.ArrayList;
	import mx.controls.Alert;
	
	import spark.components.BorderContainer;
	
	//(接收者,负责具体实施和执行一个请求)画布,可以在该画布上画任意条直线
	public class Drawing extends BorderContainer
	{
		private var _application:DrawLines;//应用程序
		private var _lines:ArrayList;//直线集合
		private var _startPosition:Point;//画线开始位置
		private var _mousePosition:Point;//鼠标位置
		private var _mousePressed:Boolean;//鼠标是否按下
		private var _currentLine:Line;//正在画的直线
		
		public function Drawing(owner:DrawLines)
		{
			_application = owner;
			_lines = new ArrayList();
			_mousePressed = false;//默认鼠标未按下
			addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
			addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler);
			addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler);
			
		}
		
	
		
		//鼠标按键在组件上按下时调用
		public function mouseDownHandler(event:MouseEvent):void{
			_mousePressed = true;//鼠标为按下状态
			_startPosition = new Point(mouseX,mouseY);//记录下直线的开始位置
			_currentLine = new Line(_startPosition,_startPosition);
			addElement(_currentLine);
		}
		
		
		public function mouseUpHandler(event:MouseEvent):void{
			
			if(mouseX!=_startPosition.x&& mouseY!=_startPosition.y){//两点不重合
				var _addLineCommand:AddLineCommand = new AddLineCommand(this,_currentLine);//创建添加直线的一个命令
				_application.execute(_addLineCommand);//请求者请求命令的执行
			}else{//两点重合,不画直线
				removeElement(_currentLine);
			}
			_mousePressed = false;//未按下状态
		}
		
		public function mouseMoveHandler(event:MouseEvent):void{
			if(_mousePressed){//画线进行中......
				_mousePosition = new Point(mouseX,mouseY);
				_currentLine.end = _mousePosition;
				_currentLine.draw();
			}
		}
		
		public function add(line:Line):void{
			_lines.addItem(line);
			if(!contains(line)){
				addElement(line);
			}
		}
		
		public function remove(line:Line):void{
			_lines.removeItem(line);
			removeElement(line);
		}
		
	}
}

 

package org.forever.drawlines
{
	import flash.display.Graphics;
	import flash.geom.Point;
	
	import mx.core.UIComponent;

	public class Line extends UIComponent
	{
		
		public var x1:int;
		public var y1:int;
		public var x2:int;
		public var y2:int;
		public var _length:int;
		
		private var _start:Point;
		private var _end:Point;
		
		public function Line(start:Point,end:Point)
		{
			this.x1 = start.x;
			this.y1 = start.y;
			this.x2 = end.x;
			this.y2 = end.y;
			//_length = Number(Math.sqrt(Math.pow((x2-x1),2)+Math.pow((y2-y1),2)).toFixed());
		}
		
		public function get end():Point
		{
			return _end;
		}

		public function set end(value:Point):void
		{
			_end = value;
			x2 = end.x;
			y2 = end.y;
		}

		public function get start():Point
		{
			return _start;
		}

		public function set start(value:Point):void
		{
			_start = value;
			x1 = start.x;
			y1 = start.y;
		}

		public function draw():void{
			this.graphics.clear();
			this.graphics.moveTo(x1,y1);
			this.graphics.beginFill(0x00FF00);
			this.graphics.lineTo(x2, y2);
			this.graphics.lineStyle(2, 0x0000a00);
			this.graphics.endFill();
		}
	}
}

 

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
			   creationComplete="init()" xmlns:drawlines="org.forever.drawlines.*">
	<fx:Script>
		<![CDATA[
			import mx.controls.Alert;
			
			import org.forever.drawlines.Command;
			import org.forever.drawlines.CommandList;
			import org.forever.drawlines.Drawing;
			
			private var _drawing:Drawing;
			private var _commands:CommandList;
		
			
			//请求者(负责调用命令对象执行请求)
			public function init():void{
				_commands = new CommandList();
				_drawing = new Drawing(this);
				_drawing.x = 0;
				_drawing.y = 0;
				_drawing.percentWidth = 100;
				_drawing.percentHeight = 100;
				vg.addElement(_drawing);
				
				undoButton.addEventListener(MouseEvent.MOUSE_DOWN,undoMouseDownHandler);
				redoButton.addEventListener(MouseEvent.MOUSE_DOWN,redoMouseDownHandler);
				resetButton.addEventListener(MouseEvent.MOUSE_DOWN,resetMouseDownHandler);
				
				this.addEventListener(KeyboardEvent.KEY_DOWN,appKeyDownHandler);
				this.addEventListener(KeyboardEvent.KEY_UP,appKeyUpHandler);
				this.setFocus();
			}

			public function appKeyDownHandler(event:KeyboardEvent):void{
				
			}
			
			public function appKeyUpHandler(event:KeyboardEvent):void{
				
			}
			
			public function undoMouseDownHandler(event:MouseEvent):void{
				_commands.unexecute();
				updateButtons();
			}
			
			public function redoMouseDownHandler(event:MouseEvent):void{
				_commands.reexecute();
				updateButtons();
			}
			
			public function resetMouseDownHandler(event:MouseEvent):void{
				_commands.reset();
				updateButtons();
			}
			
			public function execute(command:Command):void{
				_commands.execute(command);// 执行命令
				updateButtons();
			} 
			
			// 更新按钮状态(根据是否能够undo撤销或者是否能够redo恢复)
			private function updateButtons():void {
				undoButton.enabled = _commands.canUnexecuteCommand();
				redoButton.enabled = _commands.canReexecuteCommand();
			}
			
		]]>
	</fx:Script>
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	
	
	<s:VGroup x="0" y="0" width="100%" height="100%" id="vg">
		<s:HGroup width="100%" height="34" verticalAlign="middle">
			<s:Button x="0" y="1" label="撤销" id="undoButton"/>
			<s:Button x="82" y="0" label="重做" id="redoButton"/>
			<s:Button x="160" y="0" label="重置" id="resetButton"/>
		</s:HGroup>
		
	</s:VGroup>
</s:Application>

 

  • 大小: 13.9 KB
1
2
分享到:
评论

相关推荐

    flex设计器功能拆分之一(调整组件大小位置)

    NULL 博文链接:https://abstractforever.iteye.com/blog/960132

    Flex流程设计器

    Flex流程设计器是一款基于Adobe Flex技术开发的业务流程设计工具,其源码的提供为开发者提供了深入理解并定制流程设计功能的机会。Flex是一种用于构建富互联网应用程序(RIA)的开源框架,它基于ActionScript编程...

    流程设计器(flex版)

    流程设计器(flex版)结合了Flex的强大功能,提供了直观的拖放界面,使得非程序员也能轻松地设计复杂的流程图。 在设计流程时,用户可以通过流程设计器(flex版)选择各种预定义的流程节点,如开始、结束、决策、任务等...

    flex css设计器

    Flex CSS设计器是一款基于Flash技术的工具,专门用于帮助开发者对Flex应用程序中的用户界面控件进行CSS样式设计。这款工具提供了一个可视化的环境,使得设计师和开发者能够更直观、便捷地调整Flex控件的外观和布局,...

    flex设计器

    在Flex设计器中,DesignView是其核心功能之一,它允许开发者通过拖放组件、调整布局和设置属性来构建用户界面。DesignView通常包含一个图形化的布局编辑器,显示了应用程序在运行时的样子。用户可以在这个视图中添加...

    flex css 设计器

    flex css 设计器,flex css 设计器,flex css 设计器flex css 设计器,flex css 设计器,flex css 设计器flex css 设计器,flex css 设计器,flex css 设计器flex css 设计器,flex css 设计器,flex css 设计器

    FlexForm表单设计器

    在描述中提到的“可以完成界面的基本的操作和容器操作”,这表明FlexForm表单设计器具备以下功能: 1. **组件库**:提供了各种预定义的UI组件,如文本输入框、下拉列表、复选框、单选按钮等,方便用户快速搭建表单...

    flex 工作流设计器

    二、Flex工作流设计器的设计原理 1. **模型驱动**:Flex工作流设计器基于模型驱动的设计理念,通过定义流程模型来驱动实际的工作流程。 2. **元数据驱动**:使用元数据来描述工作流的结构和行为,元数据可以被解析...

    baidu全景图flex设计器

    BPM系统用于管理、设计和优化企业的工作流程,如果百度全景图Flex设计器能与之配合,意味着用户可以将全景图嵌入到更复杂的业务流程中,如虚拟导览、远程协作或者数据分析等场景。 综上所述,百度全景图Flex设计器...

    flex样式设计器

    在本“Flex样式设计器”中,我们可以方便地对元素进行布局设计,实现灵活多变的界面效果。 1. **Flex容器(Container)**:Flex布局中的主体是Flex容器,它可以包含一个或多个Flex项目。容器通过设置`display`属性...

    aspnet免Flex报表设计器

    【ASP.NET免Flex报表设计器】是一款专为.NET Framework 4平台设计的报表工具,它无需使用Adobe Flex技术,简化了报表的设计和开发流程。这款报表设计器的出现,为开发者提供了更加便捷、高效的报表创建和编辑体验,...

    flex流程设计器源码

    2. **图形用户界面(GUI)设计**:作为一款图形化设计器,Flex流程设计器利用了Flex中的图形绘制和布局管理功能,如Canvas组件用于自定义绘图,以及Layout Manager来处理组件的排列和尺寸计算。 3. **工作流模型**...

    flex设计模式flex设计模式flex设计模式

    flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式

    pentaho平台 flex 仪表盘设计器 插件

    其中,"Flex 仪表盘设计器插件"是 Pentaho 平台的一个重要组成部分,专为创建交互式和动态的仪表板而设计。Flex 仪表板设计器允许用户通过直观的拖放界面来构建复杂的数据展示应用,极大地提升了数据可视化的工作...

    flex 流程设计器

    flex 流程设计器,flex 流程设计器

    flex4 流程设计器

    不错的流程设计器,实现了连线,拖动,修改属性等,,,

    flex组件,功能强大的下拉框

    这个自编的Flex下拉框组件设计用于提供丰富的功能,如多级级联选择,这在数据层级结构复杂的应用场景中尤为有用。 1. **Flex布局基础** Flex布局,全称为Flexible Box,是CSS3中的一种布局模式,旨在解决传统盒...

    flex3 样式设计器

    Flex3样式设计器是一款专为Adobe Flex 3开发者设计的强大工具,它允许用户直观地创建、编辑和预览Flex应用程序中的CSS样式。这个工具极大地简化了Flex应用的界面定制过程,提高了开发效率。Flex3是Adobe Flex框架的...

Global site tag (gtag.js) - Google Analytics