<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 笑看人生 閱讀(2172) | 評論 (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 笑看人生 閱讀(2160) | 評論 (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 笑看人生 閱讀(1875) | 評論 (1)編輯 收藏

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    僅列出標題
    共4頁: 上一頁 1 2 3 4 下一頁 
    主站蜘蛛池模板: 亚洲深深色噜噜狠狠爱网站| 岛国大片免费在线观看| 毛片免费在线观看| 99在线观看免费视频| 又粗又大又黑又长的免费视频 | 久久aa毛片免费播放嗯啊| 1000部免费啪啪十八未年禁止观看| 久久亚洲高清观看| 亚洲日韩精品无码AV海量| 一个人免费高清在线观看| 中文字幕乱码亚洲无线三区| 青青视频观看免费99| 亚洲av中文无码字幕色不卡| 国产成人高清精品免费鸭子| 国产AV日韩A∨亚洲AV电影| 亚洲第一视频在线观看免费| 亚洲综合无码一区二区| 精品一区二区三区免费毛片爱| 亚洲福利一区二区精品秒拍| 男男黄GAY片免费网站WWW| 精品国产日韩亚洲一区| 波多野结衣免费一区视频| 麻豆国产入口在线观看免费| 亚洲AV日韩精品久久久久久久| 久久精品无码专区免费东京热| 亚洲欧洲自拍拍偷午夜色| 日韩免费视频播播| 国产精品视频全国免费观看| 亚洲AV成人片色在线观看| 无码国产精品久久一区免费| 免费一级全黄少妇性色生活片 | 成年女人免费碰碰视频| 美美女高清毛片视频黄的一免费 | 亚洲JIZZJIZZ中国少妇中文| 国内精品一级毛片免费看| 亚洲成人福利在线观看| 91青青国产在线观看免费| 亚洲精品无码久久久久A片苍井空| 久久精品夜色噜噜亚洲A∨| 在线看片v免费观看视频777| 精品女同一区二区三区免费播放|