1

ビュー内の同じコンテンツでいずれかのパースペクティブで一度開いた場合、両方のパースペクティブで特定のビュー (2 つの異なるパースペクティブに追加される) を表示する必要があるアプリケーションで問題が発生しました。つまり、パースペクティブのいずれかでビューを開いた場合、パースペクティブを切り替えると、他のパースペクティブに対して開かれているはずです。

4

1 に答える 1

0

あなたがある程度説明する振る舞いは、EclipseUIガイドラインとEclipseUIメタファーの考え方に違反しています。ただし、次のようなコードを使用して、目的の動作を実現できます。

public class MyViewPart extends ViewPart {

    public final static String ID = "foo.bar.perspectivesync.view";

    private final class PerspectiveListenerImplementation implements IPerspectiveListener4 {
        final Set<String> PERSPECTIVE_IDS = new HashSet<String>(Arrays.asList("foo.bar.perspectivesync.p1",
                                                                              "foo.bar.perspectivesync.p2"));

        @Override
        public void perspectiveActivated(final IWorkbenchPage page, final IPerspectiveDescriptor perspective) {                
            if (PERSPECTIVE_IDS.contains(perspective.getId())) {
                if (!viewIsAlreadyInPage(MyViewPart.ID, page)) {
                    try {
                        page.showView(MyViewPart.ID);
                    }
                    catch (PartInitException e) {
                        // TODO log exception properly
                        e.printStackTrace();
                    }
                }
            }
        }

        private boolean viewIsAlreadyInPage(final String id, final IWorkbenchPage page) {
            boolean result = false;
            IViewReference[] viewReferences = page.getViewReferences();
            for (IViewReference ref: viewReferences) {
                if (id.equals(ref.getId())) {
                    result = true;
                }
            }
            return result;
        }

        //@formatter:off
        @Override public void perspectiveChanged(final IWorkbenchPage page, final IPerspectiveDescriptor perspective, final String changeId) {}
        @Override public void perspectiveChanged(final IWorkbenchPage page, final IPerspectiveDescriptor perspective, final IWorkbenchPartReference partRef, final String changeId) {}
        @Override public void perspectiveSavedAs(final IWorkbenchPage page, final IPerspectiveDescriptor oldPerspective, final IPerspectiveDescriptor newPerspective) {}
        @Override public void perspectiveOpened(final IWorkbenchPage page, final IPerspectiveDescriptor perspective) {}
        @Override public void perspectiveDeactivated(final IWorkbenchPage page, final IPerspectiveDescriptor perspective) {}
        @Override public void perspectiveClosed(final IWorkbenchPage page, final IPerspectiveDescriptor perspective) {}
        @Override public void perspectivePreDeactivate(final IWorkbenchPage page, final IPerspectiveDescriptor perspective) {}
        //@formatter:on
    }

    private final IPerspectiveListener4 perspectiveListener = new PerspectiveListenerImplementation();

    @Override
    public void init(final IViewSite site) throws PartInitException {
        super.init(site);
        site.getWorkbenchWindow().addPerspectiveListener(perspectiveListener);
    }

    @Override
    public void dispose() {
        getSite().getWorkbenchWindow().removePerspectiveListener(perspectiveListener);
        super.dispose();
    }

    //@formatter:off
    @Override public void createPartControl(final Composite parent) {}
    @Override public void setFocus(){}
    // @formatter:on

}
于 2012-06-04T15:13:42.383 に答える