﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Genesis</title><link>http://www.blogjava.net/genesis/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2026 16:12:23 GMT</lastBuildDate><pubDate>Thu, 30 Apr 2026 16:12:23 GMT</pubDate><ttl>60</ttl><item><title>[Eclipse][GEF]创建图元的基本流程（一）</title><link>http://www.blogjava.net/genesis/archive/2005/11/24/21336.html</link><dc:creator>genesis</dc:creator><author>genesis</author><pubDate>Thu, 24 Nov 2005 11:57:00 GMT</pubDate><guid>http://www.blogjava.net/genesis/archive/2005/11/24/21336.html</guid><wfw:comment>http://www.blogjava.net/genesis/comments/21336.html</wfw:comment><comments>http://www.blogjava.net/genesis/archive/2005/11/24/21336.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/genesis/comments/commentRss/21336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/genesis/services/trackbacks/21336.html</trackback:ping><description><![CDATA[<P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT face="Courier New">由GEF所构建的图形编辑器用户通常的操作流程描述如下：</FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><SPAN lang=EN-US style="FONT-FAMILY: Verdana">1</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">、创建需要绘制图形的文件，并根据文件类型使用相应的编辑器打开文件，为绘制工作初始化一个图形编辑视图。</SPAN></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><SPAN lang=EN-US style="FONT-FAMILY: Verdana">2</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">、根据图形编辑器所提供的图元工具创建具体图元，将图元绘制于编辑器所提供的图形编辑视图之上</SPAN></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><SPAN lang=EN-US style="FONT-FAMILY: Verdana">3</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">、已绘制图形元素的持久化</SPAN></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">根据这个流程，</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">GEF</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">中的各个类所需要执行的操作基本步骤如下：</SPAN></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><SPAN lang=EN-US style="FONT-FAMILY: Verdana">1</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">、创建文件，根据文件类型选择相应的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">Editor</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">及</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">Editor</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">和相关的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">Viewer</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">的初始化（此部分在以后会详细说明）</SPAN></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><SPAN lang=EN-US style="FONT-FAMILY: Verdana">2</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">、使用</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">Editor</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">所提供的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">Palette</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">在</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">Viewer</SPAN></FONT><FONT face="Courier New"><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">上绘制图形<BR></SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">a</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">、用户选择想要绘制的图元，</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">EditDomain</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">会将用户选择的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">Palette</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">中的相应的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">ToolEntry</SPAN></FONT><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun"><FONT face="Courier New">激活。<BR></FONT><SPAN style="FONT-FAMILY: SimSun"></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;handlePaletteToolChanged()&nbsp;<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ToolEntry&nbsp;entry&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;getPaletteViewer().getActiveTool();<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(entry&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setActiveTool(entry.createTool());<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN></FONT></FONT><SPAN style="COLOR: #000000"><BR><FONT face="Courier New" size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setActiveTool(getDefaultTool());<BR>}<BR></FONT></SPAN></DIV>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><BR><FONT face="Courier New">b、用户在画板视图上按下鼠标左键后，</FONT></SPAN><SPAN style="FONT-FAMILY: Verdana"><FONT face="Courier New">DomainEventDispatcher</FONT></SPAN><SPAN style="FONT-FAMILY: SimSun"><FONT face="Courier New">会监听鼠标事件<BR></FONT></SPAN></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008000"><FONT face="Courier New" size=2>/**</FONT></SPAN><SPAN style="COLOR: #008000"><BR><FONT face="Courier New" size=2>&nbsp;*&nbsp;</FONT></SPAN><SPAN style="COLOR: #808080"><FONT face="Courier New" size=2>@see</FONT></SPAN><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #008000">&nbsp;EventDispatcher#dispatchMousePressed(org.eclipse.swt.events.MouseEvent)<BR></SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></FONT><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;dispatchMousePressed(org.eclipse.swt.events.MouseEvent&nbsp;me)&nbsp;<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #000000">!</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">editorCaptured)&nbsp;<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">super</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">.dispatchMousePressed(me);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;(draw2dBusy())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;(okToDispatch())&nbsp;<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setFocus(</SPAN><SPAN style="COLOR: #0000ff">null</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;control.forceFocus();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setRouteEventsToEditor(</SPAN><SPAN style="COLOR: #0000ff">true</SPAN></FONT></FONT><SPAN style="COLOR: #000000"><FONT face="Courier New" size=2>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;domain.mouseDown(me,&nbsp;viewer);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR></FONT></SPAN></DIV>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">然后根据事件相应的类型将其路由到</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">EditDomain</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">，</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">EditDomain</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">则根据事件的类型执行相应的操作。这些操作的主要工作就是获取</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">EditDomain</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">中当前被激活的工具</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 宋体">（</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">getActiveTool()</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 宋体">），然后执行该工具对这些鼠标事件的响应。</SPAN></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"></FONT></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;mouseDown(MouseEvent&nbsp;mouseEvent,&nbsp;EditPartViewer&nbsp;viewer)&nbsp;<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;Tool&nbsp;tool&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;getActiveTool();<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(tool&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #0000ff">null</SPAN></FONT></FONT><SPAN style="COLOR: #000000"><FONT face="Courier New" size=2>)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tool.mouseDown(mouseEvent,&nbsp;viewer);<BR>}<BR></FONT></SPAN></DIV>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><SPAN lang=ZH-CN style="FONT-FAMILY: 宋体">以</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">CreationTool</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 宋体">为例，它对</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">ButtonDown</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 宋体">事件的响应（</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">handleButtonDown(int)</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 宋体">）就是创建一个</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">CreateRequest</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 宋体">，并赋予其相应的位置信息（</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">setLocation(Point)</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: 宋体">）</SPAN></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"></FONT></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008000"><FONT face="Courier New" size=2>/**</FONT></SPAN><SPAN style="COLOR: #008000"><BR><FONT face="Courier New" size=2>&nbsp;*&nbsp;The&nbsp;creation&nbsp;tool&nbsp;only&nbsp;works&nbsp;by&nbsp;clicking&nbsp;mouse&nbsp;button&nbsp;1&nbsp;(the&nbsp;left&nbsp;mouse&nbsp;button&nbsp;in&nbsp;a<BR>&nbsp;*&nbsp;right-handed&nbsp;world).&nbsp;&nbsp;If&nbsp;any&nbsp;other&nbsp;button&nbsp;is&nbsp;pressed,&nbsp;the&nbsp;tool&nbsp;goes&nbsp;into&nbsp;an&nbsp;invalid<BR>&nbsp;*&nbsp;state.&nbsp;&nbsp;Otherwise,&nbsp;it&nbsp;goes&nbsp;into&nbsp;the&nbsp;drag&nbsp;state,&nbsp;updates&nbsp;the&nbsp;request's&nbsp;location&nbsp;and&nbsp;<BR>&nbsp;*&nbsp;calls&nbsp;{</FONT></SPAN><SPAN style="COLOR: #808080"><FONT face="Courier New" size=2>@link</FONT></SPAN><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #008000">&nbsp;TargetingTool#lockTargetEditPart(EditPart)}&nbsp;with&nbsp;the&nbsp;edit&nbsp;part&nbsp;that&nbsp;was<BR>&nbsp;*&nbsp;just&nbsp;clicked&nbsp;on.<BR>&nbsp;*&nbsp;<BR>&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@see</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #008000">&nbsp;org.eclipse.gef.tools.AbstractTool#handleButtonDown(int)<BR></SPAN><SPAN style="COLOR: #008000">*/</SPAN></FONT></FONT><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #0000ff">protected</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">boolean</SPAN><SPAN style="COLOR: #000000">&nbsp;handleButtonDown(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;button)&nbsp;<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(button&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">1</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">)&nbsp;<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setState(STATE_INVALID);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handleInvalidInput();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;(stateTransition(STATE_INITIAL,&nbsp;STATE_DRAG))&nbsp;<BR><BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getCreateRequest().setLocation(getLocation());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lockTargetEditPart(getTargetEditPart());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;Snap&nbsp;only&nbsp;when&nbsp;size&nbsp;on&nbsp;drop&nbsp;is&nbsp;employed</SPAN></FONT></FONT><SPAN style="COLOR: #008000"><BR></SPAN><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helper&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(SnapToHelper)getTargetEditPart().getAdapter(SnapToHelper.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN></FONT></FONT><SPAN style="COLOR: #000000"><FONT face="Courier New" size=2>;<BR>}<BR></FONT></SPAN></DIV>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><SPAN lang=EN-US style="FONT-FAMILY: Verdana">c</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">、</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">CreationTool</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">还会根据</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">Request</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">的类型及位置将其分派给相应的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">EditPart</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">。</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">[</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">Targeting tools work with a target request. This request is used along with the mouse location to obtain an active target from the current EditPartViewer. This target is then asked for the Command that performs the given request. The target is also asked to show target feedback. </SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">(</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">摘自</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">org.eclipse.gef.tools</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">.</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">TargetingTool</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">)]</SPAN></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"></FONT></P>
<P lang=EN-US style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"><FONT face="Courier New">d、此后的流程基本上就如GEF EMF Redbook中3.3.3Requests节中的Communication chain <BR>Request-EditPart-Command所述</FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1" align=center><FONT face="Courier New"><IMG height=384 src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.gif" width=510></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><BR></FONT></P></SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><SPAN lang=EN-US style="FONT-FAMILY: Verdana"><FONT face="Courier New">Command</FONT></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">执行所做的操作只是对它所涉及到的模型进行相应的设置，譬如大小、位置、颜色等属性。那么图元如何显示在视图之上呢？这一部分正是由</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">GEF</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">中所使用的</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">MVC</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">模式实现。</SPAN></FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><FONT face="Courier New"><SPAN lang=EN-US style="FONT-FAMILY: Verdana">GEF</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">中的每一个模型都实现了某种</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">Notifier</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">(</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">org.eclipse.emf.common.notify</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">.Notifier)</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">或者</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">IPropertySource</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">(</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">org.eclipse.ui.views.properties.IPropertySource</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">)</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">接口作为消息源，每个</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">EditPart</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">则相应的实现了</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">Adapter</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">(</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">org.eclipse.emf.common.notify.Adapter</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">)</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">或</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">PropertyChangeListener(</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: Verdana">java.beans.PropertyChangeListener</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">)</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">等接口作为侦听器。并在</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">EditPart</SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">初始化时，将其本身注册为所对应的模型的一个侦听器，当模型中的属性发生变化时，</SPAN><SPAN lang=EN-US style="FONT-FAMILY: Verdana">EditPart</SPAN></FONT><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun"><FONT face="Courier New">会执行相应的操作。<BR><BR>在<SPAN lang=EN-US style="FONT-FAMILY: Verdana">EditPart</SPAN></FONT><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun"><FONT face="Courier New">初始化时，将其本身注册为所对应的模型的一个侦听器，并在销毁之前注销注册：<BR></FONT></SPAN></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008000"><FONT face="Courier New" size=2>/**</FONT></SPAN><SPAN style="COLOR: #008000"><BR><FONT face="Courier New" size=2>&nbsp;*&nbsp;Upon&nbsp;activation,&nbsp;attach&nbsp;to&nbsp;the&nbsp;model&nbsp;element&nbsp;as&nbsp;a&nbsp;notification&nbsp;change<BR>&nbsp;*&nbsp;listener.<BR>&nbsp;</FONT></SPAN><SPAN style="COLOR: #008000"><FONT face="Courier New" size=2>*/</FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;activate()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #000000">!</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">isActive())&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">super</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">.activate();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((ModelElement)&nbsp;getModel()).eAdapters().add(</SPAN><SPAN style="COLOR: #0000ff">this</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR></SPAN><SPAN style="COLOR: #008000">/**</SPAN></FONT></FONT><SPAN style="COLOR: #008000"><BR><FONT face="Courier New" size=2>&nbsp;*&nbsp;Upon&nbsp;deactivation,&nbsp;detach&nbsp;from&nbsp;the&nbsp;model&nbsp;element&nbsp;as&nbsp;a&nbsp;notification&nbsp;change<BR>&nbsp;*&nbsp;listener.<BR>&nbsp;</FONT></SPAN><SPAN style="COLOR: #008000"><FONT face="Courier New" size=2>*/</FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;deactivate()&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;(isActive())&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">super</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">.deactivate();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((ModelElement)&nbsp;getModel()).eAdapters().remove(</SPAN><SPAN style="COLOR: #0000ff">this</SPAN></FONT></FONT><SPAN style="COLOR: #000000"><FONT face="Courier New" size=2>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR></FONT></SPAN></DIV>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; mso-outline-level: 1"><BR><BR><FONT face="Courier New">当模型中的属性发生变化时，会向所有的侦听器发出消息：<BR></FONT></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008000"><FONT face="Courier New" size=2>/**</FONT></SPAN><SPAN style="COLOR: #008000"><BR><FONT face="Courier New" size=2>&nbsp;*&nbsp;&lt;!--&nbsp;begin-user-doc&nbsp;--&gt;<BR>&nbsp;*&nbsp;&lt;!--&nbsp;end-user-doc&nbsp;--&gt;<BR>&nbsp;*&nbsp;@generated<BR>&nbsp;</FONT></SPAN><SPAN style="COLOR: #008000"><FONT face="Courier New" size=2>*/</FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;setName(String&nbsp;newName)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;oldName&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;name;<BR>&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;newName;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;(eNotificationRequired())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eNotify(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ENotificationImpl(</SPAN><SPAN style="COLOR: #0000ff">this</SPAN></FONT></FONT><SPAN style="COLOR: #000000"><FONT face="Courier New" size=2>,&nbsp;Notification.SET,&nbsp;ModelPackage.ARC_MODEL__NAME,&nbsp;oldName,&nbsp;name));<BR>}<BR></FONT></SPAN></DIV></SPAN></SPAN><BR><FONT face="Courier New" size=2>对于所有在该模型上注册的侦听器（EditPart）都会接收到属性变化的消息，根据消息做出相应的反应：<BR></FONT>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008000"><FONT face="Courier New" size=2>/*</FONT></SPAN><SPAN style="COLOR: #008000"><BR><FONT face="Courier New" size=2>&nbsp;*&nbsp;(non-Javadoc)<BR>&nbsp;*&nbsp;<BR>&nbsp;*&nbsp;@see&nbsp;org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)<BR>&nbsp;</FONT></SPAN><SPAN style="COLOR: #008000"><FONT face="Courier New" size=2>*/</FONT></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;notifyChanged(Notification&nbsp;notification)&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;featureID&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;notification.getFeatureID(ModelPackage.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(ModelPackage.NODE_MODEL__HEIGHT&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;featureID<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000">&nbsp;ModelPackage.NODE_MODEL__WIDTH&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;featureID<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000">&nbsp;ModelPackage.NODE_MODEL__X&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;featureID<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000">&nbsp;ModelPackage.NODE_MODEL__Y&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;featureID)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refreshVisuals();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(ModelPackage.NODE_MODEL__INPUT_ARCS&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN></FONT></FONT><FONT size=2><FONT face="Courier New"><SPAN style="COLOR: #000000">&nbsp;featureID)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refreshTargetConnections();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(ModelPackage.NODE_MODEL__OUTPUT_ARCS&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN></FONT></FONT><SPAN style="COLOR: #000000"><FONT face="Courier New" size=2>&nbsp;featureID)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refreshSourceConnections();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR></FONT></SPAN></DIV><BR><FONT face="Courier New" size=2>（注意：上述示例代码中，模型部分代码是由EMF自动生成，因此使用了Notifier-Adapter侦听机制）</FONT><img src ="http://www.blogjava.net/genesis/aggbug/21336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/genesis/" target="_blank">genesis</a> 2005-11-24 19:57 <a href="http://www.blogjava.net/genesis/archive/2005/11/24/21336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>