ビューは、情報を表示する為の領域。
(編集する目的ではエディターを使う)
通常の操作では、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>