blob: c9ff0ee1314e2e9126049d60bd500b4dd5fef591 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2006 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.page;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
import org.eclipse.jst.jsf.facesconfig.ui.page.detail.FacesConfigDetailsPage;
import org.eclipse.jst.jsf.facesconfig.ui.section.FacesConfigMasterSection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.forms.DetailsPart;
import org.eclipse.ui.forms.IDetailsPage;
import org.eclipse.ui.forms.IDetailsPageProvider;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.views.properties.IPropertySheetPage;
/**
* In some cases the page is a master-detail style, the content of the right
* side will change according user's selection on the left side. This is an
* abstract implementation of IFacesConfigPage, with a FacesConfigMasterSection
* array and a DetailsPart.
*
* @author sfshi
*
*/
public abstract class FacesConfigMasterDetailPage extends FormPage implements
IFacesConfigPage, IDetailsPageProvider, ISelectionChangedListener,
ISelectionProvider, IEditingDomainProvider {
private static final String BANNER_IMAGE_FILE = "form_banner.gif"; //$NON-NLS-1$
private final static Image BANNER_IMAGE = EditorPlugin.getDefault()
.getImage(BANNER_IMAGE_FILE);
private FacesConfigMasterSection[] facesConfigMasterSections;
private DetailsPart detailsPart;
private Object input;
private List selectionChangedListeners = new ArrayList();
private IPropertySheetPage propertySheetPage;
private ISelection currentSelection = null;
/**
*
* @param editor
* the editor part that this page belongs to;
* @param id
* page id;
* @param title
* page title;
*/
public FacesConfigMasterDetailPage(FacesConfigEditor editor, String id,
String title) {
super(editor, id, title);
}
public void dispose() {
for(int i=0; i < facesConfigMasterSections.length;i++) {
FacesConfigMasterSection master = facesConfigMasterSections[i];
if (master != null)
master.dispose();
}
selectionChangedListeners.clear();
super.dispose();
}
public EditingDomain getEditingDomain() {
return ((FacesConfigEditor) getEditor()).getEditingDomain();
}
/**
*
* @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
*/
protected void createFormContent(IManagedForm managedForm) {
ScrolledForm form = managedForm.getForm();
form.setText(this.getTitle());
form.setBackgroundImage(BANNER_IMAGE);
fillBody(managedForm, managedForm.getToolkit());
managedForm.refresh();
}
/**
* set input for this page when the it got activated at the first time; if
* it's not the first time, then refresh the page.
*
* @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean)
*/
public void setActive(boolean active) {
super.setActive(active);
if (active) {
if (getInput() != ((FacesConfigEditor) getEditor())
.getFacesConfig()) {
setInput(((FacesConfigEditor) getEditor()).getFacesConfig());
} else {
this.refresh();
}
}
}
public boolean isEditor() {
return true;
}
/**
*
* @param managedForm
* @param toolkit
*/
private void fillBody(IManagedForm managedForm, FormToolkit toolkit) {
Composite body = managedForm.getForm().getBody();
GridLayout gridLayout = new GridLayout();
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
gridLayout.numColumns = 2;
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
body.setLayout(gridLayout);
SashForm sashForm = new SashForm(body, SWT.NULL);
managedForm.getToolkit().adapt(sashForm, false, false);
sashForm.setMenu(body.getMenu());
sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite leftContainer = toolkit.createComposite(sashForm);
GridLayout gl = new GridLayout();
gl.marginHeight = 0;
leftContainer.setLayout(gl);
// create master sections here
facesConfigMasterSections = createMasterSections(leftContainer,
managedForm, toolkit, this);
if (facesConfigMasterSections != null) {
for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
FacesConfigMasterSection aSection = facesConfigMasterSections[i];
aSection.initialize();
aSection.addSelectionChangedListener(this);
}
}
detailsPart = new DetailsPart(managedForm, sashForm, SWT.NULL);
managedForm.addPart(detailsPart);
detailsPart.setPageLimit(4);
detailsPart.setPageProvider(this);
detailsPart.initialize(managedForm);
sashForm.setWeights(new int[] { 40, 60 });
getSite().setSelectionProvider(this);
}
/**
* Create the detail sections, and set layout data and initial expand state
* for them.
*
* @param composite
* @param managedForm
* @param toolkit
* @param page
* @return the detail sections
*/
abstract protected FacesConfigMasterSection[] createMasterSections(
Composite composite, IManagedForm managedForm, FormToolkit toolkit,
FacesConfigMasterDetailPage page);
/**
* set input object; also set into all the master sections.
*/
public void setInput(Object input) {
if (facesConfigMasterSections != null) {
for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
facesConfigMasterSections[i].setInput(input);
}
}
this.input = input;
}
/**
* get the input object.
*/
public Object getInput() {
return input;
}
/**
* Defaultly use the EClass object of the selected object as page key. Sub
* classes can override this method if there has other ways.
*
* @param object
*/
public Object getPageKey(Object object) {
if (object instanceof EObject) {
EObject eObject = (EObject) object;
return eObject.eClass();
}
return null;
}
/**
* Subclasses should create and return an IDetailsPage instance according
* what the key is. Defaultly the EClass object of the selected object in
* the structured viewer will be taken as the page key.
*
* @see #getPageKey
*
*/
abstract public IDetailsPage getPage(Object key);
/**
* transfer the selection changed event to detail part.
*/
public void selectionChanged(SelectionChangedEvent event) {
currentSelection = event.getSelection();
if (event.getSource() instanceof FacesConfigMasterSection) {
FacesConfigMasterSection source = (FacesConfigMasterSection) event
.getSource();
detailsPart.selectionChanged(source, event.getSelection());
if (source.getSection().isExpanded()) {
for (int i = 0, n = selectionChangedListeners.size(); i < n; i++) {
((ISelectionChangedListener) selectionChangedListeners
.get(i)).selectionChanged(event);
}
}
} else if (event.getSource() instanceof FacesConfigDetailsPage) {
for (int i = 0, n = selectionChangedListeners.size(); i < n; i++) {
((ISelectionChangedListener) selectionChangedListeners.get(i))
.selectionChanged(event);
}
}
}
/**
* set other sections' expand state to false, except this section;
*
* @param section
* the section that be expanded.
*/
public void closeOtherSections(FacesConfigMasterSection section) {
for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
FacesConfigMasterSection aSection = facesConfigMasterSections[i];
if (aSection != section && aSection.getSection().isExpanded()) {
aSection.getSection().setExpanded(false);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
aSection.getSection().setLayoutData(gd);
}
}
}
/**
* refresh this page, the expanded section and the detail page will got
* refreshed.
*/
public void refresh() {
// only refresh the expanded section;
for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
if (facesConfigMasterSections[i].getSection().isExpanded()) {
facesConfigMasterSections[i].refresh();
}
}
// refresh the detail page, it will call detail sections
// to got refreshed.
if (detailsPart.getCurrentPage() != null) {
detailsPart.getCurrentPage().refresh();
}
}
/**
* get the section that is expanded.
*
* @return the master section
*/
protected FacesConfigMasterSection getActiveSection() {
for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
if (facesConfigMasterSections[i].getSection().isExpanded()) {
return facesConfigMasterSections[i];
}
}
return null;
}
public void addSelectionChangedListener(ISelectionChangedListener listener) {
selectionChangedListeners.add(listener);
}
public ISelection getSelection() {
if(currentSelection != null)
return currentSelection;
return StructuredSelection.EMPTY;
}
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
selectionChangedListeners.remove(listener);
}
public void setSelection(ISelection selection) {
// no selection setting
}
public Object getAdapter(Class adapter) {
if (adapter == IPropertySheetPage.class) {
return getPropertySheetPage();
}
return super.getAdapter(adapter);
}
private IPropertySheetPage getPropertySheetPage() {
AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) getEditor()
.getAdapter(EditingDomain.class);
AdapterFactory adapterFactory = (AdapterFactory) getEditor()
.getAdapter(AdapterFactory.class);
if (propertySheetPage == null) {
propertySheetPage = new ExtendedPropertySheetPage(editingDomain) {
public void setSelectionToViewer(List selection) {
// FacesConfigEditor.this.setSelectionToViewer(selection);
// FacesConfigEditor.this.setFocus();
}
public void setActionBars(IActionBars actionBars) {
super.setActionBars(actionBars);
// getActionBarContributor().shareGlobalActions(this,
// actionBars);
}
};
((ExtendedPropertySheetPage) propertySheetPage)
.setPropertySourceProvider(new AdapterFactoryContentProvider(
adapterFactory));
// this.addSelectionChangedListener((ExtendedPropertySheetPage)
// propertySheetPage);
}
return propertySheetPage;
}
/**
* @return the facesConfigMasterSections
*/
public FacesConfigMasterSection[] getFacesConfigMasterSections() {
return facesConfigMasterSections;
}
}