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 笑看人生 閱讀(2163) | 評論 (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 笑看人生 閱讀(2151) | 評論 (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 笑看人生 閱讀(1868) | 評論 (1)編輯 收藏

               摘要:   到目前為止,一個完整的流程設計器已基本完成,為了增加系統的可擴展性,比如目前活動的類型有三種,假如以后我們要增加活動的類型,怎么辦?按照目前的做法,我們只能修改代碼,為了使系統的擴展性更好,即我們如果要增加活動類型,只需要修改配置文件,而無須修改現有系統的代碼,為此,我們把活動類型定義一個擴展點,用戶以后要增加活動類型,只需擴展這個擴展點就可以了。(代碼) 在plugin.xml...  閱讀全文

          posted @ 2008-01-16 08:42 笑看人生 閱讀(1559) | 評論 (3)編輯 收藏

               摘要:  這一節主要介紹如何通過新建向導,來新建我們擴展的文件(.workflow),要在新建增加內容,必須擴展org.eclipse.ui.newWizards,因此我們要修改plugin.xml文件,增加內容如下:(代碼下載) <extension          point="org.ec...  閱讀全文

          posted @ 2008-01-15 08:45 笑看人生 閱讀(1717) | 評論 (0)編輯 收藏

               摘要: 這一節主要介紹如何給編輯器增加屬性頁,屬性頁主要用來顯示編輯器中選中對象的屬性的,比如在編輯器選中活動,可以在屬性頁上顯示活動的大小和位置等信息,要實現這一功能,首先要讓模型實現IPropertySource接口,我們讓模型的基類ModelElement實現這個接口,基類要實現這接口中六個方法,這六個方法如下: /** *//** An empty p...  閱讀全文

          posted @ 2008-01-14 08:59 笑看人生 閱讀(2040) | 評論 (5)編輯 收藏

               摘要:  要實現大綱視圖,我們先回顧一下以前在編輯器中實現GraphicalViewer視圖,是如何實現的,找到以前的代碼,在WorkflowProcessEditor的configureGraphicalViewer方法中, GraphicalViewer viewer = getGraphicalViewer(); viewer.setEditPartFac...  閱讀全文

          posted @ 2008-01-11 08:44 笑看人生 閱讀(1560) | 評論 (1)編輯 收藏

               摘要: 這一節主要介紹如何在轉移上增加拐點,要實現這功能,首先要修改轉移的模型,增加一個列表屬性,維護轉移上所有的拐點,轉移模型為實現拐點功能而增加的代碼如下:   public static final String BENDPOINT_PROP = "Transition.BendPoint"; private Li...  閱讀全文

          posted @ 2008-01-10 09:46 笑看人生 閱讀(1389) | 評論 (2)編輯 收藏

               摘要:       哪個模型的控制器能接受在活動之間建立轉移的請求呢,只有活動模型的控制器了,因為活動模型中維護著活動的輸入和輸出轉移的列表,在活動控制器增加策略,使該控制器能接受建立轉移的請求,代碼如下: protectedvoid createEditPolicies() {    &nbs...  閱讀全文

          posted @ 2008-01-09 11:10 笑看人生 閱讀(1452) | 評論 (2)編輯 收藏

               摘要:       這一節我們來介紹如何在編輯器中移動活動,改變活動的大小和刪除活動,在流程控制器中已經安裝的策略WorkflowProcessXYLayoutEditPolicy,可以接受移動活動和改變活動大小的請求,但不能接受刪除活動的請求,要處理刪除活動的請求,必須在活動控制器中安裝策略。     &nb...  閱讀全文

          posted @ 2008-01-07 17:16 笑看人生 閱讀(1218) | 評論 (0)編輯 收藏

          僅列出標題
          共4頁: 上一頁 1 2 3 4 下一頁 
          主站蜘蛛池模板: 嘉祥县| 永善县| 广平县| 茶陵县| 上饶县| 若尔盖县| 崇阳县| 田林县| 鸡西市| 吴江市| 盐津县| 方城县| 华宁县| 阳谷县| 巴林右旗| 柘城县| 安远县| 盐山县| 万全县| 东莞市| 临清市| 隆昌县| 宜兴市| 兴义市| 乌海市| 金昌市| 南昌市| 美姑县| 隆化县| 阿合奇县| 蛟河市| 吉首市| 新化县| 双流县| 贡觉县| 旬阳县| 临桂县| 丁青县| 江永县| 舞阳县| 双辽市|