package org.xmind.ui.internal.views; import org.eclipse.jface.dialogs.IPageChangedListener; import org.eclipse.jface.dialogs.PageChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.IContributedContentsView; import org.eclipse.ui.part.ViewPart; import org.xmind.gef.IGraphicalViewer; import org.xmind.gef.ui.editor.IGraphicalEditor; import org.xmind.gef.ui.editor.IGraphicalEditorPage; public class InspectorView extends ViewPart implements IContributedContentsView, IPartListener, IPageChangedListener { private IGraphicalEditor contributingPart; private Composite container; private Composite contentsPage; private InspectorViewer viewer; @Override public void createPartControl(Composite parent) { container = new Composite(parent, SWT.NONE); StackLayout layout = new StackLayout(); layout.marginWidth = 0; layout.marginHeight = 0; container.setLayout(layout); createContentsPage(container); showPage(contentsPage); if (getSite().getPage() != null && getSite().getPage().getActivePart() == this) { setFocus(); } } private void createContentsPage(Composite parent) { contentsPage = new Composite(parent, SWT.NONE); contentsPage.setLayout(new FillLayout()); doCreatePartControl(contentsPage); } private void showPage(Composite page) { if (page == null || page.isDisposed()) return; if (container == null || container.isDisposed()) return; ((StackLayout) container.getLayout()).topControl = page; container.layout(); } private void doCreatePartControl(Composite parent) { viewer = new InspectorViewer(); viewer.addSection(new AuthorInfoInspectorSection()); viewer.addSection(new AttachmentsInspectorSection()); viewer.addSection(new ExternalFilesInspectorSection()); viewer.addSection(new HyperlinkInspectorSection()); viewer.addSection(new ImageInspectorSection()); viewer.addSection(new FileInfoInspectorSection()); viewer.createControl(parent); getSite().getPage().addPartListener(this); partActivated(getSite().getPage().getActivePart()); } @Override public void dispose() { setContributingPart(null); getSite().getPage().removePartListener(this); super.dispose(); } public IWorkbenchPart getContributingPart() { return contributingPart; } private void setContributingPart(IGraphicalEditor part) { if (this.contributingPart != null) { this.contributingPart.removePageChangedListener(this); } this.contributingPart = part; if (viewer != null) { viewer.setContributingViewer(getContributingViewer(part)); } if (part != null) { part.addPageChangedListener(this); } } private IGraphicalViewer getContributingViewer(IGraphicalEditor editor) { if (editor != null) { IGraphicalEditorPage page = editor.getActivePageInstance(); if (page != null) return page.getViewer(); } return null; } public void setFocus() { if (viewer != null && viewer.getControl() != null && !viewer.getControl().isDisposed()) { viewer.getControl().setFocus(); } } @SuppressWarnings("unchecked") @Override public Object getAdapter(Class adapter) { if (adapter == IContributedContentsView.class) return this; return super.getAdapter(adapter); } public void partActivated(IWorkbenchPart part) { if (part instanceof IGraphicalEditor) { setContributingPart((IGraphicalEditor) part); } } public void partBroughtToTop(IWorkbenchPart part) { } public void partClosed(IWorkbenchPart part) { if (part == contributingPart) { setContributingPart(null); } } public void partDeactivated(IWorkbenchPart part) { } public void partOpened(IWorkbenchPart part) { } public void pageChanged(PageChangedEvent event) { if (viewer != null) { viewer.setContributingViewer( getContributingViewer(contributingPart)); } } }