Posted on 2008-01-08 10:27
Raul Gong 閱讀(1888)
評論(0) 編輯 收藏 所屬分類:
eclipse
在制作eclipse插件的時候,時常需要對已經存在的視圖做一些擴展,例如在project explorer中增加一個右鍵菜單,或者需要獲取outline中當前選中項,等等。而這些操作的前提,是獲取這些視圖的id,然后通過獲取視圖的語句獲取到視圖,并進行下一步操作。
例如:如果是在view中:
IViewPart part = getViewSite().getPage().findView("org.eclipse.ui.views.ContentOutline");
如果是在action中:
IViewPart part = Plugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().findView("org.eclipse.ui.views.ContentOutline");
可見獲取到視圖的id是很重要的。如何獲取id呢,有很多方法,我覺得比較常用的是以下兩種:
1.通過手動查找目標視圖所在的插件的plugin.xml中對改視圖的定義,獲得視圖id。
描述:我覺得這是最保險的辦法,因為所有的視圖都必定有一個plugin.xml定義,但是找到這個plugin.xml還是需要一些操作,可能會耗費一些時間。
步驟:
a.點擊“工具欄”->“Search”->“Search”,或者熱鍵“ctrl+h”。選“ Plugin Search”。
b.Search for 選"Extention Point",Limit to 選“References”,External Scope 選“Enabled Plug-ins only”。
c.下面的scope選“Worksapaces”。
d.上面的Search String框填入我們要搜索的插件的擴展點的名字,這里我們要找視圖插件,所以填入:org.eclipse.ui.views
e.點擊search以后,在底部Search視圖內列出很多搜索結果,任意選中一個,雙擊,可以看到editor內打開了該plugin.xml,選中編輯器底部的Extentions,用圖形化的方式來查看會更快捷。
f.可以看到該插件使用的擴展點已經以列表的形式列出,我們查找的org.eclipse.ui.views擴展點也已經選中,展開選中的擴展點,可以看到它實現了哪些view,點擊某一個,可以在頁面右邊看到該視圖的詳細信息,第一項即是視圖的id。
我們無法知道目標視圖在搜索結果中的哪個plugin中,所以可能會耗費一些時間,建議在查看搜索結果時,通過對視圖的分類分析,確定一個大概范圍再進行查看。
同時,用這種方法也可以查找其他擴展點的實現插件。
2.通過代碼直接讀出該視圖的id。
描述:通過這種方法,可以直接用鼠標點擊某個你想知道的視圖,控制臺會打印出該視圖的id和所屬插件的id。
步驟:
a.通過插件向導新建一個插件,并使用Available Templates中的Plugin with a view模板,點finish。
b.對自動創建的SampleView代碼進行修改,修改結果如下。其中主要步驟有三個:實現IPartListener2接口,編寫isActivePart()方法,調用isActivePart()方法。
package com.raul.learn.sampleview.views;


import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.*;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.SWT;

import com.raul.learn.sampleview.Activator;



/** *//**
* This sample class demonstrates how to plug-in a new
* workbench view. The view shows data obtained from the
* model. The sample creates a dummy model on the fly,
* but a real implementation would connect to the model
* available either in this or another plug-in (e.g. the workspace).
* The view is connected to the model using a content provider.
* <p>
* The view uses a label provider to define how model
* objects should be presented in the view. Each
* view can present the same model objects using
* different labels and icons, if needed. Alternatively,
* a single label provider can be shared between views
* in order to ensure that objects of the same type are
* presented in the same way everywhere.
* <p>
*/


public class SampleView extends ViewPart implements IPartListener2
{
private TableViewer viewer;
private Action action1;
private Action action2;
private Action doubleClickAction;


/**//*
* The content provider class is responsible for
* providing objects to the view. It can wrap
* existing objects in adapters or simply return
* objects as-is. These objects may be sensitive
* to the current input of the view, or ignore
* it and always show the same content
* (like Task List, for example).
*/

class ViewContentProvider implements IStructuredContentProvider
{

public void inputChanged(Viewer v, Object oldInput, Object newInput)
{
}

public void dispose()
{
}

public Object[] getElements(Object parent)
{

return new String[]
{ "One", "Two", "Three" };
}
}

class ViewLabelProvider extends LabelProvider implements ITableLabelProvider
{

public String getColumnText(Object obj, int index)
{
return getText(obj);
}

public Image getColumnImage(Object obj, int index)
{
return getImage(obj);
}

public Image getImage(Object obj)
{
return PlatformUI.getWorkbench().
getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
}
}

class NameSorter extends ViewerSorter
{
}


/** *//**
* The constructor.
*/

public SampleView()
{
Activator.getDefault().getWorkbench().getActiveWorkbenchWindow()
.getActivePage().addPartListener(this);

}

@Override

public void dispose()
{
// TODO Auto-generated method stub
Activator.getDefault().getWorkbench().getActiveWorkbenchWindow()
.getActivePage().removePartListener(this);
super.dispose();
}

/** *//**
* This is a callback that will allow us
* to create the viewer and initialize it.
*/

public void createPartControl(Composite parent)
{
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setSorter(new NameSorter());
viewer.setInput(getViewSite());
makeActions();
hookContextMenu();
hookDoubleClickAction();
contributeToActionBars();
}


private void hookContextMenu()
{
MenuManager menuMgr = new MenuManager("#PopupMenu");
menuMgr.setRemoveAllWhenShown(true);

menuMgr.addMenuListener(new IMenuListener()
{

public void menuAboutToShow(IMenuManager manager)
{
SampleView.this.fillContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(menuMgr, viewer);
}


private void contributeToActionBars()
{
IActionBars bars = getViewSite().getActionBars();
fillLocalPullDown(bars.getMenuManager());
fillLocalToolBar(bars.getToolBarManager());
}


private void fillLocalPullDown(IMenuManager manager)
{
manager.add(action1);
manager.add(new Separator());
manager.add(action2);
}


private void fillContextMenu(IMenuManager manager)
{
manager.add(action1);
manager.add(action2);
// Other plug-ins can contribute there actions here
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}

private void fillLocalToolBar(IToolBarManager manager)
{
manager.add(action1);
manager.add(action2);
}


private void makeActions()
{

action1 = new Action()
{

public void run()
{
showMessage("Action 1 executed");
}
};
action1.setText("Action 1");
action1.setToolTipText("Action 1 tooltip");
action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));

action2 = new Action()
{

public void run()
{
showMessage("Action 2 executed");
}
};
action2.setText("Action 2");
action2.setToolTipText("Action 2 tooltip");
action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));

doubleClickAction = new Action()
{

public void run()
{
ISelection selection = viewer.getSelection();
Object obj = ((IStructuredSelection)selection).getFirstElement();
showMessage("Double-click detected on "+obj.toString());
}
};
}


private void hookDoubleClickAction()
{

viewer.addDoubleClickListener(new IDoubleClickListener()
{

public void doubleClick(DoubleClickEvent event)
{
doubleClickAction.run();
}
});
}

private void showMessage(String message)
{
MessageDialog.openInformation(
viewer.getControl().getShell(),
"Sample View",
message);
}


/** *//**
* Passing the focus request to the viewer's control.
*/

public void setFocus()
{
viewer.getControl().setFocus();
}

@Override

public void partActivated(IWorkbenchPartReference partRef)
{
// TODO Auto-generated method stub
isActivePart();
}

@Override

public void partBroughtToTop(IWorkbenchPartReference partRef)
{
// TODO Auto-generated method stub
}

@Override

public void partClosed(IWorkbenchPartReference partRef)
{
// TODO Auto-generated method stub
}

@Override

public void partDeactivated(IWorkbenchPartReference partRef)
{
// TODO Auto-generated method stub
}

@Override

public void partHidden(IWorkbenchPartReference partRef)
{
// TODO Auto-generated method stub
}

@Override

public void partInputChanged(IWorkbenchPartReference partRef)
{
// TODO Auto-generated method stub
}

@Override

public void partOpened(IWorkbenchPartReference partRef)
{
// TODO Auto-generated method stub
}

@Override

public void partVisible(IWorkbenchPartReference partRef)
{
// TODO Auto-generated method stub
}

private void isActivePart()
{
IWorkbenchPart part = getViewSite().getPage().getActivePart();
//return part != null && part.equals(this);
System.out.println(part.getSite().getId());
part.getSite().getPluginId();
}
}
然后調插件,在運行環境中調出該視圖,接著當你用鼠標點擊你想知道的視圖時,在開發環境中的控制臺,就會打印出該視圖的id以及所屬插件的id。