| /******************************************************************************* |
| * Copyright (c) 2006 Versant. 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: Versant. - initial API and implementation |
| ******************************************************************************/ |
| package org.eclipse.jpt.ui.internal.details; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.layout.FillLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.ui.part.PageBook; |
| |
| /** |
| * A wrapper for a <code>PageBook</code> with convenience methods. |
| */ |
| public class PageBookManager extends PageBook { |
| |
| private Map<Object, Composite> pageRecords; |
| private Object active; |
| private PageBook pageBook; |
| private Composite defaultComposite; |
| |
| /** |
| * A <code>PageBookManager<code> is a wrapper for a <code>PageBook</code>. It provides |
| * convenience methods to add, remove, activate and inactive pages in the internal <code>PageBook</code>. |
| * If a page gets deactivated, the manager activates a default page. |
| * |
| * @param parent The parent composite to this manager |
| * @param aDefaultLabel The label on the the default page. |
| */ |
| public PageBookManager(Composite parent, String aDefaultLabel) { |
| super(parent, SWT.NULL); |
| this.setLayout(new FillLayout()); |
| this.pageRecords = new HashMap<Object, Composite>(); |
| this.pageBook = new PageBook(this, SWT.NONE); |
| this.defaultComposite = new DefaultComposite(pageBook, aDefaultLabel); |
| this.pageBook.showPage(this.defaultComposite); |
| } |
| |
| /** |
| * @param anObj Activates (flips to top in the <code>PageBook</code>) the associated <code>Composite</code> |
| * for the given <code>Object</code>. Activates the <code>DefaultComposite</code> if there is no association |
| * for the given <code>Object</code>. |
| * @return Return false if there is no <code>Composite</code> association to the given <code>Object</code> or |
| * the associated <code>Composite</code> is already active. |
| */ |
| public boolean activate(Object anObj) { |
| if(anObj != null && !anObj.equals(this.active) && this.pageRecords.containsKey(anObj)) { |
| Composite composite = this.pageRecords.get(anObj); |
| this.pageBook.showPage(composite); |
| this.active = anObj; |
| return true; |
| } else if((anObj == null || !anObj.equals(this.active)) && !this.pageRecords.containsKey(anObj)) { |
| this.pageBook.showPage(this.defaultComposite); |
| this.active = null; |
| } |
| return false; |
| } |
| |
| /** |
| * @param anObj |
| * @return Returns true if the associated <code>Composite</code> has been deactivated. |
| * Returns false if there is no <code>Composite</code> for the given <code>Object</code> |
| * or the <code>Composite</code> is already inactive. |
| */ |
| public boolean deactivate(Object anObj) { |
| if(anObj.equals(this.active)) { |
| this.pageBook.showPage(this.defaultComposite); |
| this.active = null; |
| return true; |
| } else { |
| return false; |
| } |
| } |
| |
| /** |
| * Associates the specified <code>Object</code> with the specified <code>Composite</code> |
| * in this <code>PageBookManager</code>. |
| * If this manager previously contained a mapping for the <code>Object</code>, the old |
| * <code>Composite</code> is replaced by the specified <code>Composite</code>. |
| * |
| * @param anObj <code>Object</code> with which the specified <code>Composite</code> is to be associated. |
| * @param aComposite <code>Composite</code> to be associated with the specified <code>Object</code>. |
| * |
| * @return previous <code>Composite</code> associated with specified <code>Object</code>, |
| * or <tt>null</tt> if there was no mapping for <code>Object</code>. |
| */ |
| public Composite put(Object anObj, Composite aComposite) { |
| Composite composite = this.pageRecords.put(anObj, aComposite); |
| this.activate(anObj); |
| return composite; |
| } |
| |
| /** |
| * Removes the mapping for this <code>Object</code> from this pagebookmanager if it is present. |
| * |
| * @param anObj <code>Object</code> whose mapping is to be removed from this <code>PageBookManager</code>. |
| * @return previous <code>Composite</code> associated with specified <code>Object</code>. |
| */ |
| public Composite remove(Object anObj) { |
| if(anObj.equals(this.active)) { |
| this.active = null; |
| this.pageBook.showPage(this.defaultComposite); |
| } |
| return this.pageRecords.remove(anObj); |
| } |
| |
| /** |
| * @param anObj whose presence in this map is to be tested |
| * @return true if this <code>PageBookManager</code> contains a mapping for the |
| * given <code>Object</code>. False otherwise. |
| */ |
| public boolean contains(Object anObj) { |
| return this.pageRecords.containsKey(anObj); |
| } |
| |
| public Composite get(Object key) { |
| return pageRecords.get(key); |
| } |
| |
| /** |
| * @return The currently active composite |
| */ |
| public Composite getActive() { |
| if(this.active == null) { |
| return this.defaultComposite; |
| } else { |
| return this.pageRecords.get(this.active); |
| } |
| } |
| |
| /** |
| * @return The internal <code>PageBook</code> of this <code>PageBookManager</code>. |
| * <code>Composite</code>s which should work with this manager needs to be created |
| * with this <code>Composite</code> as their parent composite. |
| */ |
| public Composite getComposite() { |
| return this.pageBook; |
| } |
| |
| // a default composite which is show if the active composite |
| // gets deactivated |
| private class DefaultComposite extends Composite { |
| public DefaultComposite(Composite aParent, String aDefaultLabel) { |
| super(aParent, SWT.NONE); |
| setLayout(new FillLayout(SWT.VERTICAL)); |
| Label label = new Label(this, SWT.LEFT); |
| label.setText(aDefaultLabel); |
| } |
| } |
| |
| @Override |
| public void dispose() { |
| super.dispose(); |
| for (Composite pane : this.pageRecords.values()) { |
| pane.dispose(); |
| } |
| } |
| } |