blob: 85884e39d32e7b597e6f1c9b48e106635fdd0f6c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2005 Sybase, Inc. and others.
*
* 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:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
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.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.MultiPageEditorPart;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.PropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.ISection;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import org.eclipse.wst.sse.ui.StructuredTextEditor;
/**
* This class defines the general tab for pageflow attributes. This class
* defines the controls shown in this sectin and their event handler. For
* MultiPageEditorPart, if it support getAdapter(IEditorPart.class) to get the
* current active editor, then, this section can get the different
* PropertySheetPage for different sub EditorPart.
*
* @author Xiao-guang Zhang
*/
public class GeneralViewSection implements ISection,
ISelectionChangedListener {
/** the pagebook */
private PageBook pageBook = null;
/**
* A data structure used to store the information about a single page within
* a MultiPageEditorPart
*/
protected static class PageRec {
/**
* The part including editorpart, or Control
*/
public IWorkbenchPart part;
/**
* The page.
*/
public IPropertySheetPage page;
/**
* Creates a new page record initialized to the given part and page.
*
* @param part
* @param page
*/
public PageRec(IWorkbenchPart part, IPropertySheetPage page) {
this.part = part;
this.page = page;
}
/**
* Disposes of this page record by <code>null</code>ing its fields.
*/
public void dispose() {
part = null;
page = null;
}
}
/**
* Map from parts to part records (key type: <code>IWorkbenchPart</code>;
* value type: <code>PartRec</code>).
*/
private Map mapPartToRec = new HashMap();
/**
* The page record for the default page.
*/
private PageRec defaultPageRec;
/**
* The page rec which provided the current page or <code>null</code>
*/
private PageRec activeRec;
/*
* (non-Javadoc)
*
* @see com.createControls(Composite, TabbedPropertySheetPage)
*/
public void createControls(Composite parent,
TabbedPropertySheetPage tabbedPropertySheetPage) {
FillLayout layout = new FillLayout();
layout.marginWidth = ITabbedPropertyConstants.HSPACE;
layout.marginHeight = ITabbedPropertyConstants.VSPACE;
// composite.setLayout(layout);
parent.setLayout(layout);
// pagebook
pageBook = new PageBook(parent, SWT.BORDER);
// create a default property page.
createDefaultPage();
// Show the default page
if (defaultPageRec != null) {
showPageRec(defaultPageRec);
}
}
/**
* Shows page contained in the given page record in this view. The page
* record must be one from this pagebook view.
* <p>
* The <code>PageBookView</code> implementation of this method asks the
* pagebook control to show the given page's control, and records that the
* given page is now current. Subclasses may extend.
* </p>
*
* @param pageRec
* the page record containing the page to show
*/
protected void showPageRec(PageRec pageRec) {
// If already showing do nothing
if (activeRec == pageRec) {
return;
}
// If the page is the same, just set activeRec to pageRec
if (activeRec != null && pageRec != null
&& activeRec.page == pageRec.page) {
activeRec = pageRec;
return;
}
// Show new page.
activeRec = pageRec;
Control pageControl = activeRec.page.getControl();
if (pageControl != null && !pageControl.isDisposed()) {
// Verify that the page control is not disposed
// If we are closing, it may have already been disposed
pageBook.showPage(pageControl);
}
}
/**
* Creates a page for a given part. Adds it to the pagebook but does not
* show it.
*
* @param part
* The part we are making a page for.
* @return IWorkbenchPart
*/
private PageRec createPage(IWorkbenchPart part) {
PageRec rec = doCreatePage(part);
if (rec != null) {
mapPartToRec.put(part, rec);
}
return rec;
}
/*
* (non-Javadoc) Method declared on PageBookView.
*/
/**
* @param part
* @return PageRec for part
*/
protected PageRec doCreatePage(IWorkbenchPart part) {
// FIXME: Because the PropertySheetPage of StructuredTextEditor has a
// bug:
// the editor can't be opened twice if the property view is shown.
// This bug only exists in WTP 1.0.0 version.
if (part instanceof StructuredTextEditor) {
return null;
}
// Try to get an property page.
Object obj = part.getAdapter(IPropertySheetPage.class);
if (obj instanceof IPropertySheetPage) {
IPropertySheetPage page = (IPropertySheetPage) obj;
page.createControl(getPageBook());
return new PageRec(part, page);
}
// There is no content property page
return null;
}
private void createDefaultPage() {
// Create the default PropertySheetPage rec.
IPropertySheetPage defaultPage = new PropertySheetPage();
defaultPage.createControl(getPageBook());
defaultPageRec = new PageRec(null, defaultPage);
}
/**
* Returns the pagebook control for this view.
*
* @return the pagebook control, or <code>null</code> if not initialized
*/
protected PageBook getPageBook() {
return pageBook;
}
/**
* Returns the page record for the given part.
*
* @param part
* the part
* @return the corresponding page record, or <code>null</code> if not
* found
*/
protected PageRec getPageRec(Object part) {
return (PageRec) mapPartToRec.get(part);
}
/*
* (non-Javadoc)
*
* @see ISection#setInput(IWorkbenchPart, ISelection)
*/
public void setInput(IWorkbenchPart part, ISelection selection) {
if (part instanceof MultiPageEditorPart) {
IEditorPart subPage = (IEditorPart) part
.getAdapter(IEditorPart.class);
if (subPage != null) {
// get or Create a PropertySheetPage for the part.
PageRec rec = getPageRec(subPage);
if (rec == null) {
rec = createPage(subPage);
}
// Show the page.
if (rec != null) {
showPageRec(rec);
} else {
showPageRec(defaultPageRec);
}
}
}
activeRec.page.selectionChanged(part, selection);
}
/*
* (non-Javadoc)
*
* @see ISection#aboutToBeShown()
*/
public void aboutToBeShown() {
refresh();
}
/*
* (non-Javadoc)
*
* @see ISection#aboutToBeHidden()
*/
public void aboutToBeHidden() {
// do nothing
}
/*
* (non-Javadoc)
*
* @see ISection#dispose()
*/
public void dispose() {
// Deref all of the pages.
activeRec = null;
if (defaultPageRec != null) {
// check for null since the default page may not have
// been created (ex. perspective never visible)
defaultPageRec.page.dispose();
defaultPageRec = null;
}
Map clone = (Map) ((HashMap) mapPartToRec).clone();
Iterator iter = clone.values().iterator();
while (iter.hasNext()) {
PageRec rec = (PageRec) iter.next();
removePage(rec);
}
}
/**
* Removes a page record. If it is the last reference to the page dispose of
* it - otherwise just decrement the reference count.
*
* @param rec
*/
private void removePage(PageRec rec) {
mapPartToRec.remove(rec.part);
Control control = rec.page.getControl();
if (control != null && !control.isDisposed()) {
// Dispose the page's control so pages don't have to do this in
// their
// dispose method.
// The page's control is a child of this view's control so if this
// view
// is closed, the page's control will already be disposed.
control.dispose();
}
// free the page
doDestroyPage(rec.part, rec);
}
/**
* Destroys a page in the pagebook for a particular part.
*
* @param part
* the input part
* @param rec
* a page record for the part
*/
protected void doDestroyPage(IWorkbenchPart part, PageRec rec) {
IPropertySheetPage page = rec.page;
page.dispose();
rec.dispose();
}
/*
* (non-Javadoc)
*
* @see ISection#getMinimumHeight()
*/
public int getMinimumHeight() {
return SWT.DEFAULT;
}
/*
* (non-Javadoc)
*
* @see com.ibm.xtools.common.ui.properties.ISection#shouldUseExtraSpace()
*/
public boolean shouldUseExtraSpace() {
/**
* here should return true, otherwise, the component controls will not
* fill the whole panel of the tab.
*/
return true;
}
/*
* (non-Javadoc)
*
* @see com.ibm.xtools.common.ui.properties.ISection#refresh()
*/
public void refresh() {
return;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
setInput((IWorkbenchPart) event.getSource(), event.getSelection());
}
}