ビューは、情報を表示する為の領域。
(編集する目的ではエディターを使う)
通常の操作では、Eclipseのメニューバーの「ウィンドウ(W)」→「ビューの表示(V)」でビューを開くことが出来る。
(ワークベンチ内に同じビューを複数開くことは出来ない)
→プログラムからビューを開く例
プログラム内からビューを開く例。
import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.WorkbenchPart;
String ID = "org.eclipse.ui.views.ProblemView";
WorkbenchPart part = 〜; //エディターとか
IWorkbenchPage page = part.getSite().getWorkbenchWindow().getActivePage();
try {
/* IViewPart view = */ page.showView(ID, null, IWorkbenchPage.VIEW_VISIBLE);
} catch (PartInitException e) {
/* IViewPart view = */ page.findView(ID);
}
| ビューID | ビュー |
|---|---|
org.eclipse.ui.views.ContentOutline |
アウトラインビュー |
org.eclipse.ui.views.PropertySheet |
プロパティービュー |
org.eclipse.ui.views.TaskList |
タスクビュー |
org.eclipse.ui.views.ProblemView |
問題ビュー |
org.eclipse.ui.console.ConsoleView |
コンソールビュー |
独自のビューを作るには、ViewPartを継承する。
package jp.hishidama.example.view; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.ViewPart;
public class ExampleView extends ViewPart implements IPartListener {
public static final String ID = "jp.hishidama.example.view.examleView";
private TreeViewer viewer;
@Override
public void createPartControl(Composite parent) {
// ビューの内容は普通にSWTで作成する
this.viewer = new TreeViewer(parent, SWT.BORDER | SWT.FULL_SELECTION);
〜
IWorkbenchPage page = getSite().getWorkbenchWindow().getActivePage();
page.addPartListener(this);
}
@Override
public void dispose() {
IWorkbenchPage page = getSite().getWorkbenchWindow().getActivePage();
page.removePartListener(this);
super.dispose();
}
@Override
public void setFocus() {
}
// ビューが開かれた時とか閉じられた時とか
@Override
public void partOpened(IWorkbenchPart part) {
}
@Override
public void partClosed(IWorkbenchPart part) {
}
@Override
public void partActivated(IWorkbenchPart part) {
}
@Override
public void partDeactivated(IWorkbenchPart part) {
}
@Override
public void partBroughtToTop(IWorkbenchPart part) {
}
}
<extension
point="org.eclipse.ui.views">
<category
id="jp.hishidama.example.views.category"
name="My Example">
</category>
<view
category="jp.hishidama.example.views.category"
class="jp.hishidama.example.view.ExampleView"
id="jp.hishidama.example.view.exampleView"
name="Example View"
restorable="true">
</view>
</extension>
ビューの位置はパースペクティブの定義で指定する。[2014-02-23]
<extension
point="org.eclipse.ui.perspectiveExtensions">
<perspectiveExtension
targetID="org.eclipse.jdt.ui.JavaPerspective">
<view
id="jp.hishidama.example.view.exampleView"
relationship="stack"
relative="org.eclipse.ui.views.ResourceNavigator"
visible="true">
</view>
</perspectiveExtension>
</extension>
relativeとrelationshipは、既存のビューに対して自分のビューをどの位置に配置するかを指定する。
visibleをtrueにしておくと、パースペクティブを(初めて)開いたときに自動的にビューを表示する。
自分のビューの選択状態(ISelection)を返すには、ISelectionProviderを登録しておく必要がある。[2014-11-29]
import org.eclipse.jface.viewers.StructuredSelection;
@Override
public void createPartControl(Composite parent) {
〜
getSite().setSelectionProvider(new SelectionProviderAdapter());
}
// 選択状態をセット
protected void setSelection(Object element) {
getSite().getSelectionProvider().setSelection(new StructuredSelection(element));
}
package jp.hishidama.eclipse_plugin.jface; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection;
public class SelectionProviderAdapter implements ISelectionProvider {
private final List<ISelectionChangedListener> listeners = new ArrayList<ISelectionChangedListener>();
private ISelection theSelection = StructuredSelection.EMPTY;
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
listeners.add(listener);
}
@Override
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
listeners.remove(listener);
}
@Override
public void setSelection(ISelection selection) {
theSelection = selection;
final SelectionChangedEvent event = new SelectionChangedEvent(this, selection);
for (final ISelectionChangedListener listener : listeners) {
SafeRunner.run(new SafeRunnable() {
@Override
public void run() {
listener.selectionChanged(event);
}
});
}
}
@Override
public ISelection getSelection() {
return theSelection;
}
}
独自ビュー用のコンテキストメニューを作る例。[2014-12-01]
import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IWorkbenchActionConstants;
public class ExampleView extends ViewPart implements IPartListener {
private static final String MENU_ID = "com.example.ui.exampleView";
private static final String CONTEXT_MENU_ID = "ExampleViewContextMenu";
private TreeViewer viewer;
@Override
public void createPartControl(Composite parent) {
this.viewer = new TreeViewer(parent, SWT.BORDER | SWT.FULL_SELECTION);
〜
configureContextMenu();
}
protected void configureContextMenu() {
MenuManager menuManager = new MenuManager(CONTEXT_MENU_ID, CONTEXT_MENU_ID);
menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menuManager.setRemoveAllWhenShown(true);
Menu contextMenu = menuManager.createContextMenu(this.viewer.getTree());
this.viewer.getTree().setMenu(contextMenu);
getSite().registerContextMenu(MENU_ID, menuManager, this.viewer);
}
}
<extension point="org.eclipse.ui.menus">
<menuContribution
locationURI="popup:com.example.ui.exampleView?after=additions">
〜
</menuContribution>
</extension>