<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>nuoda</title>
    <description></description>
    <link>http://nuoda.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>GEF编辑器的深入应用</title>
        <author>nuoda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nuoda.javaeye.com">nuoda</a>&nbsp;
          链接：<a href="http://nuoda.javaeye.com/blog/216619" style="color:red;">http://nuoda.javaeye.com/blog/216619</a>&nbsp;
          发表时间: 2008年07月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近，由于项目工作较忙，写作很少，但是通过项目的应用，对GEF进行了深度研究，主要内容如下：<br /><br />一、GEF编辑器中网格线线型的调整、背景颜色的改变等等<br /><br />GEF编辑器中，网格线作为辅助实现节点定位、相邻节点之间自动对齐调整等功能，具有重要意义。但是，GEF网格确省网格线留给我们的调整余地只有单元格的间距，针对有些用户的特殊要求，比如修改线型等，就无能为力了。<br /><br />由于项目的需要，对此类内容进行了研究，实现了网格线线型的调整、编辑器背景颜色的调整等等。实现的方法是：对rootEditPart进行createGridLayer进行重写，将自己网格的设计来替换系统确省的gridLayer。<br /><br />二、GEF编辑器中，建立层的概念<br /><br />GEF编辑器中，可以设置多个层，每一层都有自己的画布，在画布上实现自己的元素布置。可以控制显示不同的层。<br /><br />三、对于采用XYLayout布局的容器，在容器尺寸变化时，同步放大或缩小容器的元素尺寸，使容器的元素始终能够全部显示出来。<br /><br />四、消除调色板所占的位置。确省情况下，即使调色板没有，系统仍然为其保留空白区域。<br /><br />五、建立编辑状态和运行状态的两种模式，在运行模式下，Figure中各个元素响应外部事件，按照模型的配置，实现实际的控制和执行等等。<br /><br />由于最近比较忙，空下来时，逐步补全有关内容。
          <br/>
          <span style="color:red;">
            <a href="http://nuoda.javaeye.com/blog/216619#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Jul 2008 23:57:16 +0800</pubDate>
        <link>http://nuoda.javaeye.com/blog/216619</link>
        <guid>http://nuoda.javaeye.com/blog/216619</guid>
      </item>
      <item>
        <title>java.sql.SQLException: Io 异常: The Network Adapter </title>
        <author>nuoda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nuoda.javaeye.com">nuoda</a>&nbsp;
          链接：<a href="http://nuoda.javaeye.com/blog/200002" style="color:red;">http://nuoda.javaeye.com/blog/200002</a>&nbsp;
          发表时间: 2008年06月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          有没有高手帮助解决数据库连接错误：java.sql.SQLException: Io 异常: The Network Adapter 。<br /><br />系统运行环境：Tomcat 5.0/JDK1.5/Oracle 9.2.1。<br /><br />注：1、网络正常；2、监听正常；3、数据库与应用服务器不在同一台机器；4、。。。<br /><br />例子程序：<br />.....<br />&lt;%<br />	try{<br />		Class.forName("oracle.jdbc.driver.OracleDriver");<br />      		Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.9:1521:nuoda","scott","tiger");<br />		Statement	stmt = conn.createStatement();<br />		 ResultSet rs = stmt.executeQuery("select * from dual");<br />		rs.next();<br />		out.println(rs.getString(1));<br />		System.out.println(rs.getString(1)+"=rs.getString(1))");<br />		} catch (SQLException e) {<br />			e.printStackTrace();<br />			out.println(e);<br />		} catch (Exception e) {<br />			out.println(e);<br />			e.printStackTrace();<br />		}<br /><br />%><br />....
          <br/>
          <span style="color:red;">
            <a href="http://nuoda.javaeye.com/blog/200002#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Jun 2008 10:24:38 +0800</pubDate>
        <link>http://nuoda.javaeye.com/blog/200002</link>
        <guid>http://nuoda.javaeye.com/blog/200002</guid>
      </item>
      <item>
        <title>透明FTP访问日志</title>
        <author>nuoda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nuoda.javaeye.com">nuoda</a>&nbsp;
          链接：<a href="http://nuoda.javaeye.com/blog/198588" style="color:red;">http://nuoda.javaeye.com/blog/198588</a>&nbsp;
          发表时间: 2008年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一、本文主要目的是交流和共享思路，仅提供文章相关内容的试用版本，不提供软件源代码。由于试用版本包含JRE环境，程序比较大，无法通过本站上传，有兴趣的朋友可以到公司网站下载（如果无法访问，可以通过QQ:905827651与我联系）； <br /><br />二、正确使用网络抓包技术，可以为服务器管理、业务管理带来极大的方便； <br /><br />三、本文围绕FTP访问抓包、抓包分析，说明日志系统建立、以及日志系统的重要意义；<br /><br />四、对于透明日志系统的测试，可以在网络的任何一台机器上测试，不仅仅局限于服务器。<br /><br />    FTP（File Transfer Protocal），是文件传输协议的简称。用于Internet上的控制文件的双向传输。同时，它也是一个应用程序（Application）。用户可以通过它把自己的PC机与世界各地所有运行FTP协议的服务器相连，访问服务器上的大量程序和信息。<br /><br />    FTP的主要作用，就是让用户连接上一个远程计算机（这些计算机上运行着FTP服务器程序）察看远程计算机有哪些文件，然后把文件从远程计算机上拷到本地计算机，或把本地计算机的文件送到远程计算机去。 当你启动FTP从远程计算机拷贝文件时，你事实上启动了两个程序：一个本地机上的FTP客户程序：它向FTP服务器提出拷贝文件的请求。另一个是启动在远程计算机的上的FTP服务器程序，它响应你的请求把你指定的文件传送到你的计算机中。FTP采用“客户机/服务器”方式，用户端要在自己的本地计算机上安装FTP客户程序。<br /><br />    与大多数Internet服务一样，FTP也是一个客户机/服务器系统。用户通过一个支持FTP协议的客户机程序，连接到在远程主机上的FTP服务器程序。用户通过客户机程序向服务器程序发出命令，服务器程序执行用户所发出的命令，并将执行的结果返回到客户机。<br /><br />    在FTP的使用当中，用户经常遇到两个概念："下载"（Download）和"上载"（Upload）。"下载"文件就是从远程主机拷贝文件至自己的计算机上；"上载"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说，用户可通过客户机程序向（从）远程主机上载（下载）文件。<br /><br />    使用FTP时必须首先登录，在远程主机上获得相应的权限以后，方可上载或下载文件。也就是说，要想同哪一台计算机传送文件，就必须具有哪一台计算机的适当授权。换言之，除非有用户ID和口令，否则便无法传送文件。这种情况违背了Internet的开放性，Internet上的FTP主机何止千万，不可能要求每个用户在每一台主机上都拥有帐号。匿名FTP就是为解决这个问题而产生的。<br /><br />    匿名FTP是这样一种机制，用户可通过它连接到远程主机上，并从其下载文件，而无需成为其注册用户。系统管理员建立了一个特殊的用户ID，名为anonymous, Internet上的任何人在任何地方都可使用该用户ID。<br /><br />    通过FTP程序连接匿名FTP主机的方式同连接普通FTP主机的方式差不多，只是在要求提供用户标识ID时必须输入anonymous，该用户ID的口令可以是任意的字符串。习惯上，用自己的E-mail地址作为口令，使系统维护程序能够记录下来谁在存取这些文件。<br /><br /><br />    TCP/IP协议中，FTP标准命令TCP端口号为21，Port方式数据端口为20。FTP协议的任务是从一台计算机将文件传送到另一台计算机，它与这两台计算机所处的位置、联接的方式、甚至是是否使用相同的操作系统无关。假设两台计算机通过ftp协议对话，并且能访问Internet， 你可以用ftp命令来传输文件。每种操作系统使用上有某一些细微差别，但是每种协议基本的命令结构是相同的。 <br />　　FTP的传输有两种方式：ASCII传输模式和二进制数据传输模式。 <br />　　1．ASCII传输方式：假定用户正在拷贝的文件包含的简单ASCII码文本，如果在远程机器上运行的不是UNIX，当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。 <br />但是常常有这样的情况，用户正在传输的文件包含的不是文本文件，它们可能是程序，数据库，字处理文件或者压缩文件（尽管字处理文件包含的大部分是文本，其中也包含有指示页尺寸，字库等信息的非打印字符）。在拷贝任何非文本文件之前，用binary 命令告诉ftp逐字拷贝，不要对这些文件进行处理，这也是下面要讲的二进制传输。 <br />　　2．二进制传输模式：在二进制传输中，保存文件的位序，以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如，macintosh以二进制方式传送可执行文件到Windows系统，在对方系统上，此文件不能执行。 <br />　　如果你在ASCII方式下传输二进制文件，即使不需要也仍会转译。这会使传输稍微变慢 ，也会损坏数据，使文件变得不能用。（在大多数计算机上，ASCII方式一般假设每一字符的第一有效位无意义，因为ASCII字符组合不使用它。如果你传输二进制文件，所有的位都是重要的。）如果你知道这两台机器是同样的，则二进制方式对文本文件和数据文件都是有效的。 <br /><br />　　FTP支持两种模式，一种方式叫做Standard (也就是 PORT方式，主动方式)，一种是 Passive (也就是PASV，被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。 <br />　　下面介绍一个这两种方式的工作原理： <br />　　Port模式FTP 客户端首先和FTP服务器的TCP 21端口建立连接，通过这个通道发送命令，客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候，服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。 <br />　　Passive模式在建立控制通道的时候和Standard模式类似，但建立连接后发送的不是Port命令，而是Pasv命令。FTP服务器收到Pasv命令后，随机打开一个高端端口（端口号大于1024）并且通知客户端在这个端口上传送数据的请求，客户端连接FTP服务器此端口，然后FTP服务器将通过这个端口进行数据的传送，这个时候FTP server不再需要建立一个新的和客户端之间的连接。 <br />　　很多防火墙在设置的时候都是不允许接受外部发起的连接的，所以许多位于防火墙后或内网的FTP服务器不支持PASV模式，因为客户端无法穿过防火墙打开FTP服务器的高端端口；而许多内网的客户端不能用PORT模式登陆FTP服务器，因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接，造成无法工作。 <br /><br /><br />     通过网络报侦测技术，来获取和分析FTP访问，建立日志和分析系统比前面讲到的HTTP日志分析系统要复杂的多，原因是：FTP采用的是一问一答的会话模式，命令有很多种，常见的有USER/PASS/STOR/RETR/DELE/RMD/MKD/RNFR/RNTO/LIST/TYPE/PASV等等，而HTTP间建立访问时，将要访问的内容统一在头文件中进行了描述。<br /><br />     所以，客户从FTP服务器下载一个文件或执行其他操作时，背后客户段程序与服务器程序进行了大量的“交谈”，交谈的核心是客户的目标，最常见的是上传或下载文件。<br /><br />     通过分析协议包，来获取用户的目标，首先必须能够准确获取用户一次操作的所有会话记录，会话记录可以作为日志，围绕统计分析，我们必须从会话记录中，提取要统计的内容。下面这个例子：<br />     <br />0/116.204.34.62:8354->192.168.1.11:21<br />1/192.168.1.11:21->116.204.34.62:8354<br />2/116.204.34.62:8354->192.168.1.11:21<br />3/192.168.1.11:21->116.204.34.62:8354<br />[220 。。。 就绪...]<br />4/116.204.34.62:8354->192.168.1.11:21<br />[USER anonymous]<br />5/192.168.1.11:21->116.204.34.62:8354<br />6/192.168.1.11:21->116.204.34.62:8354<br />[331 ...密码]<br />7/116.204.34.62:8354->192.168.1.11:21<br />[PASS IEUser@]<br />8/192.168.1.11:21->116.204.34.62:8354<br />9/192.168.1.11:21->116.204.34.62:8354<br />[230 登录成功]<br />10/116.204.34.62:8354->192.168.1.11:21<br />[opts utf8 on]<br />11/192.168.1.11:21->116.204.34.62:8354<br />[502 这个功能被禁止使用]<br />12/116.204.34.62:8354->192.168.1.11:21<br />[syst]<br />13/192.168.1.11:21->116.204.34.62:8354<br />[215 UNIX类型: L8]<br />14/116.204.34.62:8354->192.168.1.11:21<br />[site help]<br />15/192.168.1.11:21->116.204.34.62:8354<br />[550 没有权限]<br />16/116.204.34.62:8354->192.168.1.11:21<br />[PWD]<br />17/192.168.1.11:21->116.204.34.62:8354<br />[257 "/"]<br />18/116.204.34.62:8354->192.168.1.11:21<br />[noop]<br />19/192.168.1.11:21->116.204.34.62:8354<br />[200 OK]<br />20/116.204.34.62:8354->192.168.1.11:21<br />21/116.204.34.62:8354->192.168.1.11:21<br />[CWD /]<br />22/192.168.1.11:21->116.204.34.62:8354<br />[250 成功切换目录]<br />23/116.204.34.62:8354->192.168.1.11:21<br />[TYPE A]<br />24/192.168.1.11:21->116.204.34.62:8354<br />[200 类型设置为 A.]<br />25/116.204.34.62:8354->192.168.1.11:21<br />[PASV]<br />26/192.168.1.11:21->116.204.34.62:8354<br />[227 Entering Passive Mode (192,168,1,11,13,87)]<br />27/116.204.34.62:8354->192.168.1.11:21<br />[LIST]<br />28/192.168.1.11:21->116.204.34.62:8354<br />[150 正在打开文本模式数据连接为 /bin/ls (285 比特).226 传送完毕 (6.628 KB/s).]<br />29/116.204.34.62:8354->192.168.1.11:21<br />30/116.204.34.62:8354->192.168.1.11:21<br />[noop]<br />31/192.168.1.11:21->116.204.34.62:8354<br />[200 OK]<br />32/116.204.34.62:8354->192.168.1.11:21<br />[CWD /]<br />33/192.168.1.11:21->116.204.34.62:8354<br />[250 成功切换目录]<br />34/116.204.34.62:8354->192.168.1.11:21<br />35/116.204.34.62:8354->192.168.1.11:21<br />[noop]<br />36/192.168.1.11:21->116.204.34.62:8354<br />37/192.168.1.11:21->116.204.34.62:8354<br />[200 OK]<br />38/116.204.34.62:8354->192.168.1.11:21<br />[CWD /]<br />39/192.168.1.11:21->116.204.34.62:8354<br />[250 成功切换目录]<br />40/116.204.34.62:8354->192.168.1.11:21<br />[PWD]<br />41/192.168.1.11:21->116.204.34.62:8354<br />[257 "/"]<br />42/116.204.34.62:8354->192.168.1.11:21<br />[CWD /]<br />43/192.168.1.11:21->116.204.34.62:8354<br />[250 成功切换目录]<br />44/116.204.34.62:8354->192.168.1.11:21<br />[TYPE I]<br />45/192.168.1.11:21->116.204.34.62:8354<br />[200 类型设置为 I.]<br />46/116.204.34.62:8354->192.168.1.11:21<br />[PASV]<br />47/192.168.1.11:21->116.204.34.62:8354<br />[227 Entering Passive Mode (192,168,1,11,13,112)]<br />48/116.204.34.62:8354->192.168.1.11:21<br />[SIZE TWebLog.rar]<br />49/192.168.1.11:21->116.204.34.62:8354<br />[213 35431371]<br />50/116.204.34.62:8354->192.168.1.11:21<br />[RETR TWebLog.rar]<br />51/192.168.1.11:21->116.204.34.62:8354<br />[150 正在打开二进制模式数据连接为 TWebLog.rar (35431371 比特).]<br />52/116.204.34.62:8354->192.168.1.11:21<br />53/192.168.1.11:21->116.204.34.62:8354<br />[226 传送完毕 (1589.207 KB/s).]<br />54/116.204.34.62:8354->192.168.1.11:21<br />55/116.204.34.62:8354->192.168.1.11:21<br /><br />上述数据包的核心操作是：RETR TWebLog.rar，即下载TWebLog.rar文件，通过上述数据包，我们可以看到客户端与服务器围绕一次真正用户操作所做的全程会话，通过针对分析命令的提取，我们可以建立统计分析系统，上述过程对我们统计的意义在于：<br /><br />1、访问者的IP<br />2、使用的登陆帐号<br />3、文件所在目录<br />4、核心操作<br />5、操作文件<br />6、操作是否成功
          <br/>
          <span style="color:red;">
            <a href="http://nuoda.javaeye.com/blog/198588#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 30 May 2008 11:17:39 +0800</pubDate>
        <link>http://nuoda.javaeye.com/blog/198588</link>
        <guid>http://nuoda.javaeye.com/blog/198588</guid>
      </item>
      <item>
        <title>透明日志系统</title>
        <author>nuoda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nuoda.javaeye.com">nuoda</a>&nbsp;
          链接：<a href="http://nuoda.javaeye.com/blog/197412" style="color:red;">http://nuoda.javaeye.com/blog/197412</a>&nbsp;
          发表时间: 2008年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          透明日志系统<br /><br />一、本文主要目的是交流和共享思路，仅提供文章相关内容的试用版本，不提供软件源代码。由于试用版本包含JRE环境，程序比较大，无法通过本站上传，有兴趣的朋友可以到公司网站下载<a href="http://ndweb.9966.org" target="_blank">软件下载</a>；<br /><br />二、正确使用网络抓包技术，可以为服务器管理、业务管理带来极大的方便；<br /><br />三、本文围绕HTTP访问抓包、抓包分析，说明日志系统建立、以及日志系统的重要意义。<br /><br />网站做为互联网应用中信息发布、信息共享、在线服务、在线交易的重要平台，其访问情况历来受到关注。网站访问统计分析系统已经从最早的计数器，发展到今天的访问者来源统计、访问者兴趣分析等内容，不仅仅关注量的统计，而是越来越向电子商务发展提供支持。<br /><br />分析系统实现技术包括计数器基础上发展的嵌入式分析代码、针对日志的统计分析系统等等。本文阐述采用网络抓包技术实现web访问日志的建立、以及针对日志的分析。<br /><br />TCP是互联网的重要传输协议，也是一种透明的传输协议，通过抓取TCP网络包、分析报数据，可以完整记录访问过程和访问内容。通过TCP实现数据传输，首先客户端与服务器之间要建立“握手”，在握手建立后，客户方发送申请内容，接着务器端传输回复内容，最后，服务器端发出传输完成指示，客户端确认和发出关闭连接指示。当然，上述过程中，还包括双方对接收数据的确认。另外，如果传输过程中有错误发生，还需要发送控制包，申请重新传输数据。<br /><br />通过对协议传输过程的了解，我们可以建立比较完善的日志系统，记录服务器的活动情况、分析访问过程中出现的错误、网络流量、访问者的IP等等。<br /><br />如果目标是建立统计分析系统，我们就需要对协议包内容进行进一步分析，提取关心的内容，舍弃不需要的信息。下面几种信息对统计分析有着重要的意义：<br /><br />1、访问者的IP。访问者的IP可以通过TCP，简单获取。<br /><br />2、访问页面。访问页面我们需要首先找到客户端发出的申请报文，分析报文内容，提取HTTP的头文件，头文件中包含了访问页面、内容格式等等信息。例子如下：<br />GET /product/TWebLog.htm HTTP/1.1<br />Accept: */*<br />Accept-Language: zh-cn<br />Accept-Encoding: gzip, deflate<br />User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)<br />Host: ndweb.9966.org<br />Connection: Keep-Alive<br /><br />根据上述头文件，我们可以知道本次访问页面：http://ndweb.9966.org/product/TWebLog.htm，我们还可以分析其它信息。对于头文件的分析，完全遵循HTTP规范。<br /><br />3、访问者确定。仅仅凭IP还无法确定一个独立的访问者，因为一个单位中所有上网机器的IP都是同一个公网IP，所以还要根据网站cookie等设置，结合头文件进一步确定。<br /><br />4、服务器响应信息。客户发出的申请，服务器获取后，要检查资源，返回申请内容。如果申请资源不存在时，还要返回错误。所以，下面我们必须分析针对本次申请的响应，来进一步了解访问全过程。返回信息的头文件如下：<br />HTTP/1.1 200 OK<br />ETag: W/"10404-1211260862000"<br />Last-Modified: Tue, 20 May 2008 05:21:02 GMT<br />Content-Type: text/html<br />Content-Length: 10404<br />Date: Tue, 20 May 2008 05:21:32 GMT<br />Server: Apache-Coyote/1.1<br /><br />根据上述头文件，我们知道HTTP的响应代码是200，代表成功。<br /><br />通过上述过程的说明，我们可以比较清楚地掌握日志以及围绕统计需要分析获取的内容。当然，完整的统计分析系统还有很多辅助内容，如IP来源等等。<br /><br />采用抓包技术建立日志，以及统计分析系统，优势明显：<br /><br />透明性：独立于服务器，既不需要修改服务器的任何配置，也不需要读取服务器的任何输出记录。<br /><br />全面性：能够全面诊断系统访问情况显示，能够诊断网站被索引服务访问情况、能够诊断网页链接错误情况。<br /><br />实时性：实时监测访问，及时生成查询数据。<br /><br />灵活部署：既可以和服务器部署在同一台机器，又可以部署到网关服务器上。
          <br/>
          <span style="color:red;">
            <a href="http://nuoda.javaeye.com/blog/197412#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 27 May 2008 12:54:26 +0800</pubDate>
        <link>http://nuoda.javaeye.com/blog/197412</link>
        <guid>http://nuoda.javaeye.com/blog/197412</guid>
      </item>
      <item>
        <title>网站统计分析系统 — 发现、识别、确认、描述</title>
        <author>nuoda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nuoda.javaeye.com">nuoda</a>&nbsp;
          链接：<a href="http://nuoda.javaeye.com/blog/182738" style="color:red;">http://nuoda.javaeye.com/blog/182738</a>&nbsp;
          发表时间: 2008年04月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          网站统计分析系统按照实现过程，可以分为以下四个阶段：<br /><br />一、目标发现<br />二、目标识别<br />三、目标确认<br />四、目标描述<br /><br />不同分析系统发现目标采用的手段不同，有的在网页中嵌入一段代码，在网页浏览时，同时触发代码，代码有关信息；有的采用启动web服务器日志功能，将访问信息记录到服务器日志中，进一步分析日志，发现访问者的信息。上述两种方法各有优缺点，嵌入代码实现起来相对容易、不需要安装、分析快捷、但是每个页面都需要嵌入代码，不管采用何种方式；分析日志的方式，需要安装程序，对客户端信息捕获能力较弱、数据分析有一定滞后、服务器输出日志占用一定资源，但是，可以实现嵌入式代码不能实现的功能，比如网页出错信息等。<br /><br />我们公司开发的系统采用TCP数据报抓取技术，发现访问目标。对比上述系统，难点在于对数据报的分析；优点在于除满足统计基本功能外，还可以扩展形成网络日志、网络流量分析、统计服务器响应速度、统计网页的关联度、分析错误访问的原因等。虽然需要安装客户端，但是不需要改变用户服务器的任何部分，包括web server，有条件时，采集服务器通过“旁听”方式，获取数据，不会加大web server的任何负担。<br /><br />对于目标的发现，嵌入式代码采用cookie/ip/time/path/host等，确定访问、点击、访问目标、来源和去向、停留时间等；对于日志，猜想是通过ip/time/path/host等发现目标。<br />而我们的产品，手段就更多了。<br /><br />对于目标确认，大家都基本相同，不多描述。<br /><br />对于目标的描述，各家产品侧重点不同，描述内容不同：侧重于分析统计的，重点在于访问量、点击量、访问者来源、热点等；侧重于商务部分的，重点分析和把握客户访问过程和重点关注内容、光顾次数等等。<br /><br />我们产品目前处于测试阶段，经常会调整改变，所以服务器经常会改动，暂时可以访问：<a href="http://ndweb.9966.org/" target="_blank">测试网站统计分析系统</a>。如果短时间不能访问，竟请原谅！不要告状呀！
          <br/>
          <span style="color:red;">
            <a href="http://nuoda.javaeye.com/blog/182738#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Apr 2008 23:20:53 +0800</pubDate>
        <link>http://nuoda.javaeye.com/blog/182738</link>
        <guid>http://nuoda.javaeye.com/blog/182738</guid>
      </item>
      <item>
        <title>网站统计分析系统</title>
        <author>nuoda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nuoda.javaeye.com">nuoda</a>&nbsp;
          链接：<a href="http://nuoda.javaeye.com/blog/181017" style="color:red;">http://nuoda.javaeye.com/blog/181017</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          目前大多数的网站统计分析系统都是通过嵌入页面代码、分析web服务器日志实现的，主要功能包括：<br />１、访问量的统计分析<br />２、点击量的统计分析<br />３、热点栏目、热点文章<br />４、针对访问者的分析<br />５、用户忠诚度等等。<br /><br />上述模式各有自己的特点，但是如果全面了解网站运行情况，仅仅有上述内容还是不够的，至少还需要了解响应速度、流量信息、关联度等等，并且仅仅凭ＩＰ还是无法确定是否为同一个人，因为很多公司用户外出都是一个ＩＰ。<br /><br />所以，我们也开发一款统计分析系统，将集成网站访问统计、流量统计、客户资源统计、动态程序访问统计等功能，目前核心部分已经完成，主要包括：<br />１、数据采集系统<br />２、数据传输系统<br />３、访问甄别<br />４、ｗｅｂ查询分析<br />５、报表和发布系统<br />６、文件增量备份系统等等。<br /><br />希望路过的朋友给予支持，点击：<a href="http://ndweb.9966.org/nuoda" target="_blank">网站统计分析系统</a>
          <br/>
          <span style="color:red;">
            <a href="http://nuoda.javaeye.com/blog/181017#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Apr 2008 20:54:15 +0800</pubDate>
        <link>http://nuoda.javaeye.com/blog/181017</link>
        <guid>http://nuoda.javaeye.com/blog/181017</guid>
      </item>
      <item>
        <title>局域网监控管理</title>
        <author>nuoda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nuoda.javaeye.com">nuoda</a>&nbsp;
          链接：<a href="http://nuoda.javaeye.com/blog/176223" style="color:red;">http://nuoda.javaeye.com/blog/176223</a>&nbsp;
          发表时间: 2008年03月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我做的网络管理工具以实用为主，目前主要实现的功能包括：<br /><br />一、局域网扫描<br /><br />１、通过GEF图表方式，显示局域网的网关、本机、邻居，标示“邻居”的ｉｐ、ｍａｃ、机器名、有无ａｒｐ攻击行为、网卡是否处于混杂模式、活动状况等；<br /><br />２、攻击行为跟踪，通过表格记录局域网内ａｒｐ等攻击行为，记录攻击者的ｉｐ、ｍａｃ、机器名、开始攻击时间、最后攻击时间、累计攻击次数；<br /><br />３、记录局域网内各台机器的ｉｐ、ｍａｃ、机器名，追踪修改记录。<br /><br />二、访问分析<br /><br />１、通过表格方式，显示上网记录，分析访问地址<br /><br />２、通过表格方式，分析外部访问本机情况；<br /><br />３、按照类型，分析上网记录。<br /><br />三、访问内容分析<br /><br />目前技术有限，只能还原简单的http访问内容，其它的还在探索。<br /><br />四、安全防护<br /><br />１、规则定义：定义受限访问规则；<br /><br />２、按照规则来监控和报警。<br /><br />五、刺探分析<br /><br />其实就是非法的网络行为：<br />１、通过ａｒｐ欺骗和ｉｐ路由设置，抓取被监控机器的上网记录，分析其上网行为；<br /><br />２、获取被监控主机的某些帐号和密码。<br /><br />在产品发布时，第五项限制使用次数，目的是说明局域网内缺少必要保护的危险性。
          <br/>
          <span style="color:red;">
            <a href="http://nuoda.javaeye.com/blog/176223#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 26 Mar 2008 12:01:10 +0800</pubDate>
        <link>http://nuoda.javaeye.com/blog/176223</link>
        <guid>http://nuoda.javaeye.com/blog/176223</guid>
      </item>
      <item>
        <title>网络安全</title>
        <author>nuoda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nuoda.javaeye.com">nuoda</a>&nbsp;
          链接：<a href="http://nuoda.javaeye.com/blog/173703" style="color:red;">http://nuoda.javaeye.com/blog/173703</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          　　　最近，自己机器总是莫名其妙突然慢起来，不知道什么原因，但是肯定是中毒了。可是，机器上的杀毒软件并没有作出反应，于是利用自己掌握的、不多的网络知识跟踪检查本机的ARP表，发现缺省网关地址是不是被篡改，原来公司的一位高手在捣鬼。<br />　　<br />　　　唉，只有去骂网络管理员了，可是他说也没有太多办法，后来只好请教那位高手，从他那里学来了一些网络知识，原来局域网内截获别人的收发信息如此简单。我想，我们公司网络状况和大多数公司一样，缺少专业的网络管理员、缺少必要的网络安全设备，所以就想也开发一款网络扫描、抓包分析工具，还别说，真的实现了，虽然不是很好，但是给公司内部使用后，反映较好，主要功能：<br /><br />１、局域网机器扫描：发现本机、局域网网关、网上邻居等<br /><br />２、检查本机缺省网关指向，并且自动记录（那位网络高手一旦再通过ARP欺骗，这里就能够查出来）；<br /><br />３、发现网卡处于混杂模式的机器；<br /><br />４、攻击ARP欺骗的机器，使其不能够上网；<br /><br />５、截获进出本机的网络包，进行包类型、包头分析等；<br /><br />６、当然，也可以刺探“那位高手”收发包信息，进一步刺探有关帐号和密码。<br /><br /><br />　　目前，系统虽然还不能够立即阻止非法访问、非法刺探，但是一旦发现上述行为，可以立即通过报警，掌握上述情况。对比同类软件，功能还不算强大，但是由于自己开发的，后期补充完善起来更方便。<br /><br />　　本来想共享给各位网友，但是一方面同类软件已经较多了，另一方面有刺探功能，好像不大好。过一段时间，如果功能完善些、包装的好一些的时候发布出来，供各位评阅。
          <br/>
          <span style="color:red;">
            <a href="http://nuoda.javaeye.com/blog/173703#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 19 Mar 2008 12:29:03 +0800</pubDate>
        <link>http://nuoda.javaeye.com/blog/173703</link>
        <guid>http://nuoda.javaeye.com/blog/173703</guid>
      </item>
      <item>
        <title>利用ＧＥＦ制作表格系统(编辑器设计)</title>
        <author>nuoda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nuoda.javaeye.com">nuoda</a>&nbsp;
          链接：<a href="http://nuoda.javaeye.com/blog/165512" style="color:red;">http://nuoda.javaeye.com/blog/165512</a>&nbsp;
          发表时间: 2008年02月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h3 style="margin: 7.8pt 0cm; text-indent: 32.15pt"><span style="font-family: 宋体"><span style="font-size: large">编辑器设计</span></span></h3><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span style="font-family: 宋体"><span style="font-size: small">为了便于查看，编辑器设计部分进行了简化处理，去掉了保存和导入部分，参考代码如下：</span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small; font-family: Times New Roman">public class FormEditor extends GraphicalEditorWithPalette {</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public static final String ID = &quot;com.nuoda.form.rcp.formeditor&quot;;</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>GraphicalViewer viewer;</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>private DiagramNode diagram;</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public DiagramNode getDiagram() {</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return diagram;</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public void setDiagram(DiagramNode diagram) {</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.diagram = diagram;</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public FormEditor(){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setEditDomain(new DefaultEditDomain(this));</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>protected PaletteRoot getPaletteRoot() {</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// TODO Auto-generated method stub</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return FormPaletteFactory.createPalette();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public void configureGraphicalViewer(){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>super.configureGraphicalViewer();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>viewer = getGraphicalViewer();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ScalableRootEditPart rootEditPart = new ScalableRootEditPart();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>viewer.setRootEditPart(rootEditPart);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>viewer.setEditPartFactory(new FormPartFactory());</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>KeyHandler keyHandler = new KeyHandler();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keyHandler.put(</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>KeyStroke.getPressed(SWT.DEL, 127,0),</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>getActionRegistry().getAction(GEFActionConstants.DELETE)</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>keyHandler.put(</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>KeyStroke.getPressed(SWT.F2,0),</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>getActionRegistry().getAction(GEFActionConstants.DIRECT_EDIT)</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>);</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>getGraphicalViewer().setKeyHandler(keyHandler);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>protected void initializeGraphicalViewer() {</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// TODO Auto-generated method stub</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.viewer.setContents(this.diagram);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>IAction action=new CellOperateAction(getGraphicalViewer());</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>getActionRegistry().registerAction(action);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>getSelectionActions().add(action.getId());</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TableContextMenuProvider provider=new TableContextMenuProvider(getGraphicalViewer(),getActionRegistry());</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>getGraphicalViewer().setContextMenu(provider);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public void doSave(IProgressMonitor monitor){</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>protected void setInput(IEditorInput input){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>super.setInput(input);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.diagram=new DiagramNode();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small; font-family: Times New Roman">}</span></span></p><h3 style="margin: 7.8pt 0cm; text-indent: 32.15pt"><span style="font-family: 宋体"><span style="font-size: large">调色板设计</span></span></h3><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span style="font-family: 宋体"><span style="font-size: small">上述编辑器有一个固定位置的调色板，调色板参考代码如下：</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small; font-family: Times New Roman">public class FormPaletteFactory {</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span>public static PaletteRoot createPalette() {</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span>PaletteRoot root = new PaletteRoot();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span style="font-size: small"><span><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PaletteGroup toolGroup = new PaletteGroup(&quot;</span></span><span style="font-family: 宋体">工具</span><span><span style="font-family: Times New Roman">&quot;);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ToolEntry tool = new SelectionToolEntry();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>toolGroup.add(tool);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>root.setDefaultEntry(tool);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>tool = new MarqueeToolEntry();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>toolGroup.add(tool);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span style="font-size: small"><span><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PaletteDrawer drawer = new PaletteDrawer(&quot;</span></span><span style="font-family: 宋体">数据元素</span><span><span style="font-family: Times New Roman">&quot;);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ImageDescriptor descriptor= AbstractUIPlugin.imageDescriptorFromPlugin(Application.PLUGIN_ID, &quot;/gar.ico&quot;);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CreationToolEntry creationToolEntry = new CreationToolEntry(</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&quot;.Table&quot;,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&quot;.Table&quot;,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>new SimpleFactory(TableNode.class),</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>descriptor,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>descriptor</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>drawer.add(creationToolEntry);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>creationToolEntry = new CreationToolEntry(</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&quot;.Row&quot;,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&quot;.Row&quot;,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>new SimpleFactory(RowNode.class),</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>descriptor,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>descriptor</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>drawer.add(creationToolEntry);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>creationToolEntry = new CreationToolEntry(</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&quot;.Column&quot;,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&quot;.Column&quot;,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>new SimpleFactory(ColumnNode.class),</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>descriptor,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>descriptor</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>drawer.add(creationToolEntry);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>creationToolEntry = new CreationToolEntry(</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&quot;.Cell&quot;,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&quot;.Cell&quot;,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>new SimpleFactory(CellNode.class),</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>descriptor,</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>descriptor</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>drawer.add(creationToolEntry);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return root;</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small; font-family: Times New Roman">}</span></span></p><h3 style="margin: 7.8pt 0cm; text-indent: 32.15pt"><span style="font-size: large"><span><span style="font-family: Times New Roman">EditPart</span></span><span style="font-family: 宋体">工厂</span></span></h3><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span style="font-family: 宋体"><span style="font-size: small">模型和控制器的对应关系通过工厂来实现。</span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small; font-family: Times New Roman">public class FormPartFactory implements EditPartFactory {</span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public EditPart createEditPart(EditPart context, Object model) {</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// TODO Auto-generated method stub</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>EditPart part = getPartForElement(model);</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(part != null){</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>part.setModel(model);</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return part;</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>private EditPart getPartForElement(Object modelElement){</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//System.out.println(&quot;here...TableEditPart():&quot;+modelElement.toString());</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(modelElement instanceof DiagramNode){</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return new DiagramEditPart();</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}else if(modelElement instanceof TableNode){</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//System.out.println(&quot;here...TableEditPart()&quot;);</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>FormTableEditPart part=new FormTableEditPart();</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//System.out.println(&quot;here...TableEditPart()&quot;);</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return part;</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//return new FormTableEditPart();</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}else if(modelElement instanceof CellNode){</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return new CellEditPart();</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}else if(modelElement instanceof RowNode){</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return new RowEditPart();</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}else if(modelElement instanceof ColumnNode){</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return new ColumnEditPart();</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}else if(modelElement instanceof FieldNode){</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return new FieldEditPart();</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>throw new RuntimeException(&quot;Error&quot;);</span></span></span></p><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span><span style="font-size: small; font-family: Times New Roman">}</span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span style="font-family: 宋体"><span style="font-size: small">至此，一个表格系统基本框架已经完成，当然，策略和命令系统还需要实现。有兴趣的朋友可以根据代码来研究和实现，欢迎交流。</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://nuoda.javaeye.com/blog/165512#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 27 Feb 2008 16:39:58 +0800</pubDate>
        <link>http://nuoda.javaeye.com/blog/165512</link>
        <guid>http://nuoda.javaeye.com/blog/165512</guid>
      </item>
      <item>
        <title>利用ＧＥＦ制作表格系统(控制器设计)</title>
        <author>nuoda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nuoda.javaeye.com">nuoda</a>&nbsp;
          链接：<a href="http://nuoda.javaeye.com/blog/165505" style="color:red;">http://nuoda.javaeye.com/blog/165505</a>&nbsp;
          发表时间: 2008年02月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span style="font-family: 宋体"><span style="font-size: small">控制器设计</span></span></p><h3 style="margin: 7.8pt 0cm; text-indent: 32.15pt"><span style="font-family: 宋体"><span style="font-size: large">通用模型</span></span></h3><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span style="font-family: 宋体"><span style="font-size: small">我们可以简单抽取一个控制器通用模型，实现监听器的注册和注销，其它控制器继承该控制器。</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small; font-family: Times New Roman">public class AbstractEditPart extends AbstractGraphicalEditPart </span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>implements PropertyChangeListener{</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//@Override</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public void activate(){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>super.activate();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>((AbstractNode)getModel()).addPropertyChangeListener(this);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//System.out.println(&quot;activate&quot;);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//@Override</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public void deactivate(){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>super.deactivate();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>((AbstractNode)getModel()).removePropertyChange(this);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//System.out.println(&quot;deactivate&quot;);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//@Override</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>protected IFigure createFigure() {</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// TODO Auto-generated method stub</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return null;</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//@Override</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>protected void createEditPolicies() {</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// TODO Auto-generated method stub</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public void propertyChange(PropertyChangeEvent evt) {</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// TODO Auto-generated method stub</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small; font-family: Times New Roman">}</span></span></p><h3 style="margin: 7.8pt 0cm; text-indent: 32.15pt"><span style="font-family: 宋体"><span style="font-size: large">表格控制器设计</span></span></h3><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span style="font-family: 宋体"><span style="font-size: small">表格的控制器虽然比较复杂，但是也理解其机制，也不是特别复杂。重要的是要考虑表格中含有子元素，所以要注意：供子元素列表获取；子元素画板获取；素发生变化时，在刷新视图的显示、刷新子元素列表；安装相应的策略等。</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small; font-family: Times New Roman">public class FormTableEditPart extends AbstractEditPart{</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>protected IFigure createFigure() {</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return new TableFigure((TableNode)getModel());</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public void refreshVisuals(){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Rectangle constraint = ((TableNode)getModel()).getConstraint();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(constraint.width==-1 || constraint.height == -1){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>constraint.width= ((TableNode)getModel()).getGrid().numColumns * 20+2;//((TableNode)getModel()).getWidthHint()</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>constraint.height=((TableNode)getModel()).getHeightHint()*2+2;</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>((TableNode)getModel()).setConstraint(constraint);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>((GraphicalEditPart)getParent()).setLayoutConstraint(this, getFigure(), constraint);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public List getModelChildren(){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return ((TableNode)getModel()).getChildren();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public void createEditPolicies(){</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>installEditPolicy(EditPolicy.CONTAINER_ROLE,new ContainerLayoutEditPolicy());</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>installEditPolicy(EditPolicy.COMPONENT_ROLE,new FormDeleteEditPolicy());</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public IFigure getContentPane(){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return ((TableFigure)getFigure()).getContainerFigure();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public void propertyChange(PropertyChangeEvent event){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String prop=event.getPropertyName();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(TableNode.P_CHILDREN.equals(prop)){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.refreshChildren();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.refreshVisuals();</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}else if(prop.equals(TableNode.P_CONSTRAINT)){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>refreshVisuals();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}else if(prop.equals(TableNode.P_CHILDCHANGE)){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>refreshVisuals();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}else if(prop.equals(TableNode.P_GRIDMANAGER)){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String delta=(String)event.getNewValue();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>test(delta);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TableNode table=(TableNode)getModel();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Rectangle cons=TableTool.getTableConstraint(table);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>table.setConstraint(cons);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}else if(prop.equals(TableNode.P_TABLEBGCOLOR)){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>getFigure().setBackgroundColor(((TableNode)getModel()).getBgColor());</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>super.propertyChange(event);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public void test(String delta){</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>List list=this.getChildren();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>IFigure parent=getContentPane();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String type=delta.split(&quot;:&quot;)[0];</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int chgValue=Integer.parseInt(delta.split(&quot;:&quot;)[1]);</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>GridLayout layout=((TableNode)getModel()).getGrid();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for(int i=0;i&lt;list.size();i++){</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CellEditPart part=(CellEditPart)list.get(i);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>GridData gridData=((CellNode)part.getModel()).getGridData();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(&quot;vspace&quot;.equalsIgnoreCase(type)){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(gridData.verticalSpan &gt;1){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>gridData.heightHint+=(gridData.verticalSpan-1)*chgValue;</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}else if(&quot;hspace&quot;.equalsIgnoreCase(type)){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(gridData.horizontalSpan &gt;1){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>gridData.widthHint+=(gridData.horizontalSpan-1)*chgValue;</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}else{</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>layout.setConstraint(part.getFigure(), gridData);</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small; font-family: Times New Roman">}</span></span></p><h3 style="margin: 7.8pt 0cm; text-indent: 32.15pt"><span style="font-family: 宋体"><span style="font-size: large">其它控制器</span></span></h3><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span style="font-family: 宋体"><span style="font-size: small">其它控制器类似。</span></span></p><span><span style="font-size: small; font-family: Times New Roman">&nbsp;</span></span> <p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span style="font-family: 宋体"><span style="font-size: small">至此，控制器业基本完成。</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://nuoda.javaeye.com/blog/165505#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 27 Feb 2008 16:23:53 +0800</pubDate>
        <link>http://nuoda.javaeye.com/blog/165505</link>
        <guid>http://nuoda.javaeye.com/blog/165505</guid>
      </item>
      <item>
        <title>利用ＧＥＦ制作表格系统(视图设计)</title>
        <author>nuoda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nuoda.javaeye.com">nuoda</a>&nbsp;
          链接：<a href="http://nuoda.javaeye.com/blog/165490" style="color:red;">http://nuoda.javaeye.com/blog/165490</a>&nbsp;
          发表时间: 2008年02月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span style="font-family: 宋体"><span style="font-size: small">视图设计</span></span></p><h3 style="margin: 7.8pt 0cm; text-indent: 32.15pt"><span style="font-family: 宋体"><span style="font-size: large">表格视图设计</span></span></h3><p class="MsoNormal" style="margin: 7.8pt 0cm; text-indent: 24pt"><span style="font-family: 宋体"><span style="font-size: small">在编辑器中调色板中，选择表格，拖入编辑器，系统默认显示一个方框的思路，来规划表格的显示图形。由于表格中有很多子元素，所以设置显示图形时，必须考虑子元素的显示位置和子元素的布局管理。</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small; font-family: Times New Roman">public class TableFigure extends Figure{</span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>private TableNode model;</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>private Figure childPanel;</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public TableFigure(TableNode node){</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span style="font-size: small"><span style="font-family: Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>super();</span></span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: normal"><span><span><span style="font-size: small; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></p