| /******************************************************************************* |
| * Copyright (c) 2006, 2012 Oracle. All rights reserved. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v1.0, which accompanies this distribution |
| * and is available at http://www.eclipse.org/legal/epl-v10.html. |
| * |
| * Contributors: |
| * Oracle - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.jpt.jpa.ui.internal.views; |
| |
| import org.eclipse.jpt.common.utility.internal.StringTools; |
| import org.eclipse.jpt.jpa.ui.internal.JptUiMessages; |
| import org.eclipse.jpt.jpa.ui.selection.JpaEditorManager; |
| import org.eclipse.jpt.jpa.ui.selection.JpaViewManager; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.layout.FillLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IViewPart; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.part.IPage; |
| import org.eclipse.ui.part.Page; |
| import org.eclipse.ui.part.PageBook; |
| import org.eclipse.ui.part.PageBookView; |
| |
| /** |
| * The JPA structure view is a page book view that maintains a |
| * {@link JpaStructurePage JPA structure page} |
| * per editor and a default page when the editor does not contain JPA |
| * content. |
| * <p> |
| * See <code>org.eclipse.jpt.jpa.ui/plugin.xml</code>. |
| */ |
| public class JpaStructureView |
| extends PageBookView |
| { |
| /** |
| * The manager is created when the view's control is |
| * {@link #createPartControl(Composite) created} |
| * and disposed, if necessary, when the view is |
| * {@link #dispose() disposed}. |
| */ |
| private volatile Manager manager; |
| |
| |
| public JpaStructureView() { |
| super(); |
| } |
| |
| @Override |
| public void createPartControl(Composite parent) { |
| this.manager = this.buildManager(); |
| super.createPartControl(parent); |
| } |
| |
| private Manager buildManager() { |
| return new Manager(this.getPageManager()); |
| } |
| |
| /** |
| * Go to the singleton in the sky. |
| * <p> |
| * <strong>NB:</strong> This will trigger the creation of the appropriate |
| * page manager if it does not already exist. |
| */ |
| private JpaViewManager.PageManager getPageManager() { |
| return (JpaViewManager.PageManager) this.getAdapter(JpaViewManager.PageManager.class); |
| } |
| |
| @Override |
| protected IPage createDefaultPage(PageBook book) { |
| DefaultPage page = new DefaultPage(); |
| this.initPage(page); |
| page.createControl(book); |
| return page; |
| } |
| |
| /** |
| * Start with the currently active editor. |
| */ |
| @Override |
| protected IWorkbenchPart getBootstrapPart() { |
| IWorkbenchPage page = this.getSite().getPage(); |
| return (page == null) ? null : page.getActiveEditor(); |
| } |
| |
| /** |
| * Behave the same way as {@link #partActivated(IWorkbenchPart)}; |
| * i.e. {@link #isImportant(IWorkbenchPart) check whether the specified |
| * part is an editor} and display the appropriate page if it is. |
| */ |
| @Override |
| public void partBroughtToTop(IWorkbenchPart part) { |
| super.partBroughtToTop(part); |
| this.partActivated(part); |
| } |
| |
| /** |
| * Display the appropriate page if an editor is |
| * {@link #partActivated(IWorkbenchPart) activated} |
| * or {@link #partBroughtToTop(IWorkbenchPart) brought to the top}. |
| */ |
| @Override |
| protected boolean isImportant(IWorkbenchPart part) { |
| return part instanceof IEditorPart; |
| } |
| |
| /** |
| * The specified part is an editor (see {@link #isImportant(IWorkbenchPart)}. |
| */ |
| @Override |
| protected PageRec doCreatePage(IWorkbenchPart part) { |
| IEditorPart editor = (IEditorPart) part; |
| JpaEditorManager editorManager = this.manager.getEditorManager(editor); |
| if (editorManager == null) { |
| // if there is no editor manager corresponding to the current |
| // editor return null so the default page is displayed |
| return null; |
| } |
| JpaStructurePage page = new JpaStructurePage(this, editorManager); |
| this.initPage(page); |
| page.createControl(this.getPageBook()); |
| return new PageRec(editor, page); |
| } |
| |
| @Override |
| protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) { |
| JpaStructurePage page = (JpaStructurePage) pageRecord.page; |
| page.dispose(); |
| pageRecord.dispose(); |
| } |
| |
| @Override |
| public void dispose() { |
| super.dispose(); |
| if (this.manager != null) { |
| this.manager.dispose(); |
| } |
| } |
| |
| @Override |
| public String toString() { |
| return StringTools.buildToStringFor(this); |
| } |
| |
| |
| // ********** JPA view manager ********** |
| |
| /** |
| * Adapter to the view's page manager. |
| */ |
| /* CU private */ class Manager |
| implements JpaViewManager |
| { |
| /** |
| * The manager for the structure view's workbench page. |
| */ |
| private final JpaViewManager.PageManager pageManager; |
| |
| |
| Manager(JpaViewManager.PageManager pageManager) { |
| super(); |
| if (pageManager == null) { |
| throw new NullPointerException(); // shouldn't happen... |
| } |
| this.pageManager = pageManager; |
| this.pageManager.addViewManager(this); |
| } |
| |
| public IViewPart getView() { |
| return JpaStructureView.this; |
| } |
| |
| JpaEditorManager getEditorManager(IEditorPart editor) { |
| return this.pageManager.getEditorManager(editor); |
| } |
| |
| void dispose() { |
| this.pageManager.removeViewManager(this); |
| } |
| |
| @Override |
| public String toString() { |
| return StringTools.buildToStringFor(this); |
| } |
| } |
| |
| |
| // ********** default page ********** |
| |
| /** |
| * Simply display a message stating the JPA structure is not available. |
| * @see org.eclipse.ui.part.MessagePage |
| */ |
| /* CU private */ static class DefaultPage |
| extends Page |
| { |
| private /* virtually final */ Composite composite; |
| |
| DefaultPage() { |
| super(); |
| } |
| |
| @Override |
| public void createControl(Composite parent) { |
| // a composite will put some margins around the label |
| this.composite = new Composite(parent, SWT.NULL); |
| this.composite.setLayout(new FillLayout()); |
| Label label = new Label(this.composite, SWT.LEFT | SWT.TOP | SWT.WRAP); |
| label.setText(JptUiMessages.JpaStructureView_structureNotAvailable); |
| } |
| |
| @Override |
| public Control getControl() { |
| return this.composite; |
| } |
| |
| @Override |
| public void setFocus() { |
| this.composite.setFocus(); |
| } |
| } |
| } |