posts - 36, comments - 30, trackbacks - 0, articles - 3

  问题描述:

最近在Eclipse插件开发中遇到这样的问题,我使用如入扩展点

<extension
       
point="org.eclipse.debug.ui.launchConfigurationTabs">
    
<tab
          
class="com.example.launch.SqlDebugTab"
          group
="org.eclipse.jdt.debug.ui.launchConfigurationTabGroup.localJavaApplication"
          id
=" com.example.launchs.SqlDebugTab"
          name
="SqlDebugTab">
       
<associatedDelegate
             
delegate=" com.example.launch.SqlDebugLaunchDelegate">
       
</associatedDelegate>
    
</tab>
 
</extension>

<extension
          
point="org.eclipse.debug.core.launchDelegates">
       
<launchDelegate
             
delegate=" com.example.launch.SqlDebugLaunchDelegate"
             id
=" com.example.launch.SqlDebugLaunchDelegate"
             modes
="debug"
             type
="org.eclipse.jdt.launching.localJavaApplication">
       
</launchDelegate>
    
</extension>

 

也就是在调式Java Application的对话框中,增加一个Tab页,Tab页的名字为SqlDebugTab,在这个Tab页上增加几个复选框,复选框要显示视图的名称,如果用户选择某个复选框,点“Debug”后,将显示指定的视图,可是在com.example.launch.SqlDebugLaunchDelegate类中的launch方法中调用PlatformUI.getWorkbench().getActiveWorkbenchWindow(),得到的对象却为null,调试程序才发现,运行com.example.launch.SqlDebugLaunchDelegate类是,走的是新线程,也就是说点“Debug”按钮时,Eclipse平台启动的是新的线程(非UI线程),而在新线程中是取不到ActiveWorkbenchWindow对象,为了解决这个问题,花费了很多时间,最后终于找到解决方法,launch方法通过如下程序来显示视图,就可以解决上面遇到的问题:

PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
            
public void run() {
                IWorkbenchWindow window 
= PlatformUI.getWorkbench()
                        .getActiveWorkbenchWindow();
                
if (window != null){
                    window.getActivePage().showView(
"……");
}

}

}

posted @ 2008-04-23 19:41 笑看人生 阅读(2127) | 评论 (1)编辑 收藏

要在编辑器中支持复制,粘贴功能,首先,要在编辑器中选择活动节点,Eclipse工作台的菜单中复制,粘贴按钮处于激活状态,要实现这功能,我们还必须做些配置,因为编辑器没有单独的菜单栏,所有编辑器共享一个菜单栏,前面我们在定义编辑器扩展点时,有一个属性contributorClass没有指定值,它的值应该是一个实现IEditorActionBarContributor接口的类的全名,只有指定这个属性,菜单栏中的菜单项才能够对我们在编辑器中所做的操作进行相应;
首先,我们增加属性contributorClass对应的类:
package com.example.workflow.actions;

import org.eclipse.gef.ui.actions.ActionBarContributor;
import org.eclipse.ui.actions.ActionFactory;

public class WorkflowActionContributor extends ActionBarContributor {

    @Override
    
protected void buildActions() {
        
    }

    
    @Override
    
protected void declareGlobalActionKeys() {
        addGlobalActionKey(ActionFactory.COPY.getId());
        
    }
    

}

在declareGlobalActionKeys增加对复制命令的申明,同时把属性contributorClass指定为这个类,包含全路径。再定义复制动作CopyAction,代码如下:

package com.example.workflow.actions;

import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.actions.ActionFactory;

public class CopyAction extends SelectionAction{

    
public CopyAction(IWorkbenchPart part) {
        
super(part);
        setId(ActionFactory.COPY.getId());
    }


    @Override
    
protected boolean calculateEnabled() {        
        
return true;
    }


}

 


注意构造函数中一定要把这个action的id设置为ActionFactory.COPY.getId(),和前面统一起来;

到这儿还没有结束,还必须在编辑器类中注册这个action,覆盖编辑器父类中的createActions()方法:

protected void createActions() {
    
super.createActions();

    CopyAction copyAction 
= new CopyAction((IWorkbenchPart) this);
    getActionRegistry().registerAction(copyAction);
    getSelectionActions().add(copyAction.getId());
}
但是当我们在复制按钮可用情况,点击之后,我们希望把我们选择的对象,拷贝到剪切板上,这个在其他软件中已经成功实现,但要是在我们开发的流程设计器中,要实现这个功能,我们还必须自己写代码来实现,必须重写CopyAction父类中的run方法,把我们选择的对象放到剪切板上,代码如下:
public void run() {
    Clipboard.getDefault().setContents(
super.getSelectedObjects());
}

这样当我们点复制按钮之后,流程设计器就把我们选择的内容放到剪切板上,下一步要做的就是粘贴了。

要使粘贴按钮可用,所做的修改和复制类似,在类WorkflowActionContributor 的方法declareGlobalActionKeys中增加addGlobalActionKey(ActionFactory.PASTE.getId())

增加PasteAction类,代码如下:

package com.example.workflow.actions;

import org.eclipse.gef.ui.actions.Clipboard;
import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.actions.ActionFactory;

public class PasteAction extends SelectionAction{

    
public PasteAction(IWorkbenchPart part) {
        
super(part);
        setId(ActionFactory.PASTE.getId());
    }


    @Override
    
protected boolean calculateEnabled() {        
        
if(Clipboard.getDefault().getContents()!=null){
            
return true;
        }
else{
            
return false;
        }

    }


}

这里对Paste菜单的可用性作了判断,只有当剪切板中内容不为空时,粘贴按钮才可用,否则为不可用状
态。
另外还要在编辑器中对这个action进行申明,
PasteAction pasteAction = new PasteAction((IWorkbenchPart) this);
getActionRegistry().registerAction(pasteAction);
getSelectionActions().add(pasteAction.getId());
到这里,当我们在编辑器中选择活动,选择复制之后,粘贴按钮可用,但点粘贴按钮具体做什么,我们还没有定义,要实现这个做什么功能,还必须覆盖PasteAction父类中的run方法:
public void run() {
        List list 
= (List)Clipboard.getDefault().getContents();
        
for(int i=0;i<list.size();i++){
            AbstractActivityEditPart part 
= (AbstractActivityEditPart)list.get(i);
            AbstractActivity model 
= (AbstractActivity)part.getModel();
            WorkflowProcess parent 
= (WorkflowProcess)part.getParent().getModel();
            AbstractActivity clone 
= new AbstractActivity();
            clone.setName(
"CloneActivity");
            clone.setLocation(model.getLocation());
            clone.setSize(model.getSize());
            clone.setFigure(model.getFigure());
            parent.addChild(clone);
        }

    }

这里只是做了一下简单处理,更复杂的逻辑用户可以根据自己应用的需要,这里的run可以通过执行一个命令,以支持撤销,重做功能,原理就是这样的,另外剪切功能和这类似,只是在复制基础上多了个删除操作。

posted @ 2008-01-17 08:27 笑看人生 阅读(2118) | 评论 (1)编辑 收藏

这节介绍如何在SSH框架中使用Validator框架,Validator框架采用基于xml文件来配置验证规则,它主要依赖两个jar包:commons-validator-1.3.0.jar和oro-2.0.8.jar,要在SSH使用Validator框架,必须把这两个jar包引用进来,其实Struts框架已包含这两个jar包,所以我们不用再单独引入了。
       要在SSH框架中使用Validator,更确切的说是在Struts框架中使用,可以采用插件机制把Validator加入到框架,这需要修改原来的struts-config.xml文件,增加配置ValidatorPlugIn插件,代码如下:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/org/apache/struts/validator/validator-rules.xml,
/WEB-INF/validation.xml"
 />
      
<set-property property="stopOnFirstError" value="true" />
 
</plug-in>
这样当应用启动时,Struts框架就会加载ValidatorPlugIn插件。
validator-rules.xml文件是Validator框架自带的,它定义了一些常有的校验规则,而validation.xml是我们自己定义的,它针对某个应用,内容如下:
    
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE form-validation PUBLIC
          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
          "http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd"
>
<form-validation>   
 
<formset> 
    
<form name="registerForm">
      
<field property="register.username" depends="required">      
        
<arg key="register.username" position="0"/>      
      
</field> 
      
<field property="register.password" depends="required,minlength">      
        
<arg key="register.password" position="0"/>
        
<arg name="minlength" key="${var:minlength}" resource="false" position="1"/>
         
<var>
          
<var-name>minlength</var-name>
          
<var-value>6</var-value>
        
</var>     
      
</field>
      
<field property="register.email" depends="required,email">      
        
<arg key="register.email" position="0"/>      
      
</field>       
    
</form>   
 
</formset>
</form-validation>

 

form元素的name属性指定要进行验证的表单,field元素的property属性指定要验证属性,depends定义了验证方式,在这里,我们定义了username属性不能为空,password属性不能为空,并且最小长度不能小于6,email属性必须是合法的邮件地址。定义验证方式之后,我们还必须修改资源文件registermessages.properties,增加以下内容:

# Errors
errors.header=
<h3><fontcolor="red">ValidationError</font></h3>Youmustcorrectthefollowingerror(s)beforeproceeding:
errors.required={0}isrequired.
errors.minlength={0}cannotbelessthan{1}characters.
errors.email={0}isaninvalide-mailaddress.
这资源文件中{0}对应着<arg key="" position="0"/>,{1}对应着<arg key="" position="1"/>,以此类推,如果有验证错误产生,将用key的值替换{n}
 
此外,我们还要修改struts-config.xml文件,修改内容见粗体:

//把原来的DynaActionForm 改为DynaValidatorForm
<form-beans>
       
<form-bean name="registerForm"
           type
="org.apache.struts.validator.DynaValidatorForm">
           
<form-property name="register" type="test.register.entity.Register" />        
       
</form-bean>
    
</form-beans>
//把原来的validate="false"改为validate="true"
<action-mappings>
       
<action name="registerForm" path="/register" scope="request"
           type
="test.register.action.RegisterAction" validate="true"
           input
="/register.jsp">
           
<forward name="success" path="/registerSuccess.jsp" />
       
</action>
    
</action-mappings>

修改错误显示的样式,我们在register.jsp中,替换原来<html/errors>为
<logic:messagesPresent>
   
<bean:message key="errors.header"/>
   
<ul>
   
<html:messages id="error">
      
<li><bean:write name="error"/></li>
   
</html:messages>
   
</ul><hr />
</logic:messagesPresent>

注意在页面上加入
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>

这样,我们运行程序,校验失败的效果如图:

posted @ 2008-01-16 15:21 笑看人生 阅读(1851) | 评论 (1)编辑 收藏

     摘要:   到目前为止,一个完整的流程设计器已基本完成,为了增加系统的可扩展性,比如目前活动的类型有三种,假如以后我们要增加活动的类型,怎么办?按照目前的做法,我们只能修改代码,为了使系统的扩展性更好,即我们如果要增加活动类型,只需要修改配置文件,而无须修改现有系统的代码,为此,我们把活动类型定义一个扩展点,用户以后要增加活动类型,只需扩展这个扩展点就可以了。(代码) 在plugin.xml...  阅读全文

posted @ 2008-01-16 08:42 笑看人生 阅读(1531) | 评论 (3)编辑 收藏

     摘要:  这一节主要介绍如何通过新建向导,来新建我们扩展的文件(.workflow),要在新建增加内容,必须扩展org.eclipse.ui.newWizards,因此我们要修改plugin.xml文件,增加内容如下:(代码下载) <extension          point="org.ec...  阅读全文

posted @ 2008-01-15 08:45 笑看人生 阅读(1697) | 评论 (0)编辑 收藏

     摘要: 这一节主要介绍如何给编辑器增加属性页,属性页主要用来显示编辑器中选中对象的属性的,比如在编辑器选中活动,可以在属性页上显示活动的大小和位置等信息,要实现这一功能,首先要让模型实现IPropertySource接口,我们让模型的基类ModelElement实现这个接口,基类要实现这接口中六个方法,这六个方法如下: /** *//** An empty p...  阅读全文

posted @ 2008-01-14 08:59 笑看人生 阅读(2017) | 评论 (5)编辑 收藏

     摘要:  要实现大纲视图,我们先回顾一下以前在编辑器中实现GraphicalViewer视图,是如何实现的,找到以前的代码,在WorkflowProcessEditor的configureGraphicalViewer方法中, GraphicalViewer viewer = getGraphicalViewer(); viewer.setEditPartFac...  阅读全文

posted @ 2008-01-11 08:44 笑看人生 阅读(1537) | 评论 (1)编辑 收藏

     摘要: 这一节主要介绍如何在转移上增加拐点,要实现这功能,首先要修改转移的模型,增加一个列表属性,维护转移上所有的拐点,转移模型为实现拐点功能而增加的代码如下:   public static final String BENDPOINT_PROP = "Transition.BendPoint"; private Li...  阅读全文

posted @ 2008-01-10 09:46 笑看人生 阅读(1369) | 评论 (2)编辑 收藏

     摘要:       哪个模型的控制器能接受在活动之间建立转移的请求呢,只有活动模型的控制器了,因为活动模型中维护着活动的输入和输出转移的列表,在活动控制器增加策略,使该控制器能接受建立转移的请求,代码如下: protectedvoid createEditPolicies() {    &nbs...  阅读全文

posted @ 2008-01-09 11:10 笑看人生 阅读(1427) | 评论 (2)编辑 收藏

     摘要:       这一节我们来介绍如何在编辑器中移动活动,改变活动的大小和删除活动,在流程控制器中已经安装的策略WorkflowProcessXYLayoutEditPolicy,可以接受移动活动和改变活动大小的请求,但不能接受删除活动的请求,要处理删除活动的请求,必须在活动控制器中安装策略。     &nb...  阅读全文

posted @ 2008-01-07 17:16 笑看人生 阅读(1203) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4 下一页