教你怎樣擴展Eclipse的擴展點(三)

接下來,我們開始實現 擴展點的一些 功能吧,新增選中的包和類:

爲了方便起見,我將這些類的源代碼貼出來

 TheFirstAction .java:

 

package org.vwpolo.rcp.extension.client.actions;

import org.eclipse.jface.action.Action;

/**
 * <p> 。</p>
 * 
@author 劉繞興
 * <p>2008-2-12</p>
 
*/
public class TheFirstAction extends Action {

  
/**
   * 
   
*/
  
public static final String ID = TheFirstAction.class.getName();
  
  
/**
   * 構造函數。
   
*/
  
public TheFirstAction() {
    setId(ID);
    setText(
"第一個Action");
  }
  
  
public void run() {
    Shell shell 
= Display.getCurrent().getActiveShell();
    MessageDialog.openInformation(shell, 
"信 息""第一個項目中的Action");
  }
}

ExtensionContances .java

 

package org.vwpolo.rcp.extension.client.extender;

/**
 * <p> 擴展點常量。</p>
 * 
@author 劉繞興
 * <p>2008-2-12</p>
 
*/
public class ExtensionContances {

  
/**  */
  
public static final String EXTENSION_ID = "org.vwpolo.rcp.extender";

  
/**  */
  
public static final String ATTR_ID = "id";

  
/**  */
  
public static final String ATTR_NAME = "name";

  
/**  */
  
public static final String ATTR_TYPE = "type";

  
/**  */
  
public static final String ATTR_CLIENTID = "clientId";

  
/**  */
  
public static final String ATTR_INDEX = "index";

  
/**  */
  
public static final String ATTR_DESC = "desc";

  
/**  */
  
public static final String ATTR_CLASS = "className";

  
/**  */
  
public static final String TYPE_PERSPECTIVE = "perspective";

  
/**  */
  
public static final String TYPE_VIEW = "view";

  
/**  */
  
public static final String TYPE_ACTION = "action";
}

ExtensionHelper .java

 

package org.vwpolo.rcp.extension.client.extender;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.vwpolo.rcp.extension.client.Activator;
import org.vwpolo.rcp.extension.client.actions.TheFirstAction;

/**
 * <p> 。</p>
 * 
@author 劉繞興
 * <p>2008-2-12</p>
 
*/
public class ExtensionHelper {

  
/** */
  
private String ID = ExtensionContances.EXTENSION_ID;

  
/** */
  
public static ExtensionHelper instance;

  
/** Action Map */
  
private Map<String, List<ExtensionInfoBean>> actionMap = new HashMap<String, List<ExtensionInfoBean>>();

  
/** 視圖 Map  */
  
private Map<String, List<ExtensionInfoBean>> viewMap = new HashMap<String, List<ExtensionInfoBean>>();

  
/** 透視圖 Map */
  
private Map<String, List<ExtensionInfoBean>> perspectiveMap = new HashMap<String, List<ExtensionInfoBean>>();

  
/**   */
  
private MenuManager extendMenu;

  
/**
   * 構造函數。
   
*/
  
private ExtensionHelper() {
    loadExtensions();
  }

  
/**
   * <p> 。</p>
   * 
@author 劉繞興
   * 
@return ExtensionHelper
   
*/
  
public static ExtensionHelper getInstance() {
    
if (instance == null)
      instance 
= new ExtensionHelper();
    
return instance;
  }

  
/**
   * <p> 讀取擴展點的屬性,然後生成ExtensionInfoBean 對象。</p>
   * 
@author 劉繞興
   
*/
  
private void loadExtensions() {
    IConfigurationElement[] elements 
= Platform.getExtensionRegistry().getConfigurationElementsFor(Activator.EXTENSION_ID);
    
if (elements == null || elements.length == 0)
      
return;

    
for (int i = 0; i < elements.length; i++) {
      IConfigurationElement element 
= elements[i];
      ExtensionInfoBean bean 
= new ExtensionInfoBean();
      bean.setId(element.getAttribute(ExtensionContances.ATTR_ID));
      bean.setName(element.getAttribute(ExtensionContances.ATTR_NAME));
      bean.setType(element.getAttribute(ExtensionContances.ATTR_TYPE));
      bean.setClientId(element.getAttribute(ExtensionContances.ATTR_CLIENTID));
      String index 
= element.getAttribute(ExtensionContances.ATTR_INDEX);
      
if (index == null || index.trim().isEmpty()) {
        bean.setIndex(
100);
      } 
else {
        bean.setIndex(Integer.parseInt(index));
      }
      bean.setDesc(element.getAttribute(ExtensionContances.ATTR_DESC));
      
if (ExtensionContances.TYPE_ACTION.equalsIgnoreCase(bean.getType())) {
        
try {
          String classPath 
= element.getAttribute(ExtensionContances.ATTR_CLASS);
          Object object 
= null;
          
if (!classPath.isEmpty()) {
            object 
= element.createExecutableExtension(ExtensionContances.ATTR_CLASS);
          } 
else {
            object 
= element.createExecutableExtension(ExtensionContances.ATTR_CLIENTID);
          }
          
if (object instanceof IAction) {
            bean.setAction((IAction) object);
          }
        } 
catch (Exception e) {
          e.printStackTrace();
        }
      }
      appendGroup(bean);
    }
  }

  
/**
   * <p> 。</p>
   * 
@author 劉繞興
   * 
@param bean 
   
*/
  
private void appendGroup(ExtensionInfoBean bean) {
    
if (ExtensionContances.TYPE_PERSPECTIVE.equalsIgnoreCase(bean.getType()))
      addToMap(perspectiveMap, bean);
    
else if (ExtensionContances.TYPE_VIEW.equalsIgnoreCase(bean.getType()))
      addToMap(viewMap, bean);
    
else if (ExtensionContances.TYPE_ACTION.equalsIgnoreCase(bean.getType()))
      addToMap(actionMap, bean);
  }

  
/**
   * <p> 。</p>
   * 
@author 劉繞興
   * 
@param map
   * 
@param bean
   
*/
  
private void addToMap(Map<String, List<ExtensionInfoBean>> map, ExtensionInfoBean bean) {
    List
<ExtensionInfoBean> list;
    
if (map.containsKey(ID)) {
      list 
= (List<ExtensionInfoBean>) map.get(ID);
    } 
else {
      list 
= new ArrayList<ExtensionInfoBean>();
      map.put(ID, list);
    }
    list.add(bean);
  }

  
/**
   * <p> 。</p>
   * 
@author 劉繞興
   * 
@param menuManager
   
*/
  
public void fillMenuBar(IMenuManager menuManager) {
    extendMenu 
= new MenuManager("擴展菜單");
    menuManager.add(extendMenu);

    fillMenuBar(perspectiveMap);
    fillMenuBar(viewMap);
    fillMenuBar(actionMap);
  }

  
/**
   * <p> 。</p>
   * 
@author 劉繞興
   * 
@param map
   
*/
  
private void fillMenuBar(Map<String, List<ExtensionInfoBean>> map) {
    List
<ExtensionInfoBean> list = map.get(ID);
    
if (list == null || list.size() == 0)
      
return;

    Iterator
<ExtensionInfoBean> iter = list.iterator();
    
while (iter.hasNext()) {
      ExtensionInfoBean bean 
= iter.next();
      IAction action 
= bean.getAction();
      
if (action == null) {
        action 
= new TheFirstAction();
      }
      extendMenu.add(action);
    }
  }
}

ExtensionInfoBean .java

 

package org.vwpolo.rcp.extension.client.extender;

import org.eclipse.jface.action.IAction;

/**
 * <p>擴展點實體 。</p>
 * 
@author 劉繞興
 * <p>2008-2-12</p>
 
*/
public class ExtensionInfoBean {

  
/**  */
  
private String id;
  
/**  */
  
private String name;
  
/**  */
  
private String type;
  
/**  */
  
private String clientId;
  
/**  */
  
private int index;
  
/**  */
  
private String desc;
  
/**  */
  
private IAction action;

  
/**
   * 
@return id
   
*/
  
public String getId() {
    
return id;
  }

  
/**
   * <p>設置id 。</p>
   * 
@param id
   
*/
  
public void setId(String id) {
    
this.id = id;
  }

  
/**
   * 
@return name
   
*/
  
public String getName() {
    
return name;
  }

  
/**
   * <p>設置name 。</p>
   * 
@param name
   
*/
  
public void setName(String name) {
    
this.name = name;
  }

  
/**
   * 
@return type
   
*/
  
public String getType() {
    
return type;
  }

  
/**
   * <p>設置type 。</p>
   * 
@param type
   
*/
  
public void setType(String type) {
    
this.type = type;
  }

  
/**
   * 
@return clientId
   
*/
  
public String getClientId() {
    
return clientId;
  }

  
/**
   * <p>設置clientId 。</p>
   * 
@param clientId
   
*/
  
public void setClientId(String clientId) {
    
this.clientId = clientId;
  }

  
/**
   * 
@return index
   
*/
  
public int getIndex() {
    
return index;
  }

  
/**
   * <p>設置index 。</p>
   * 
@param index
   
*/
  
public void setIndex(int index) {
    
this.index = index;
  }

  
/**
   * 
@return desc
   
*/
  
public String getDesc() {
    
return desc;
  }

  
/**
   * <p>設置desc 。</p>
   * 
@param desc
   
*/
  
public void setDesc(String desc) {
    
this.desc = desc;
  }

  
/**
   * 
@return action
   
*/
  
public IAction getAction() {
    
return action;
  }

  
/**
   * <p>設置action 。</p>
   * 
@param action
   
*/
  
public void setAction(IAction action) {
    
this.action = action;
  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章