/* *****************************************************************************
* org.nightlabs.base.ui - NightLabs Eclipse utilities *
* Copyright (C) 2004-2005 NightLabs - http://NightLabs.org *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 2.1 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin St, Fifth Floor, *
* Boston, MA 02110-1301 USA *
* *
* Or get it online : *
* http://www.gnu.org/copyleft/lesser.html *
* *
* *
******************************************************************************/
package org.nightlabs.jfire.reporting.admin.ui.layout.editor;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.birt.report.designer.internal.ui.editors.FileReportProvider;
import org.eclipse.birt.report.designer.ui.editors.IReportEditorPage;
import org.eclipse.birt.report.designer.ui.editors.IReportProvider;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.gef.ui.actions.ActionRegistry;
import org.eclipse.jface.operation.IRunnableWithProgress;
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.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.IFormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.part.EditorPart;
import org.nightlabs.base.ui.composite.Fadeable;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.entity.editor.EntityEditor;
import org.nightlabs.base.ui.entity.editor.EntityEditorController;
import org.nightlabs.base.ui.entity.editor.IEntityEditorPageController;
import org.nightlabs.base.ui.form.NightlabsFormsToolkit;
import org.nightlabs.base.ui.job.FadeableCompositeJob;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.base.ui.progress.RCPProgressMonitor;
import org.nightlabs.jfire.reporting.admin.ui.resource.Messages;
import org.nightlabs.progress.ProgressMonitor;
/**
* This Editor serves as base class to use pages from the {@link EntityEditor} framework
* as pages of the {@link JFireReportEditor}.
* It creates a container for only one {@link IFormPage} that will be assigned to only one {@link IEntityEditorPageController},
* see the abstract methods {@link #createFormPage(EntityEditor)} and {@link #createPageController(EntityEditor)}.
*
* @author Alexander Bieber <!-- alex [AT] nightlabs [DOT] de -->
*/
public abstract class ReportLayoutEntityEditor extends EditorPart implements IReportEditorPage
{
private int staleType;
private Control control;
private FormEditor editor;
private int index;
/**
* The provider is needed for the page to be correctly
* integrated into the editor (otherwise the dirty notifications won't work).
*/
private IReportProvider provider;
public ReportLayoutEntityEditor()
{ }
/**
* Get the editor id.
* @return The editor id
*/
public String getEditorID() {
return getEditorSite().getId();
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.EditorPart#doSaveAs()
*/
@Override
public void doSaveAs() {
// Save as not supported by entity editor
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
*/
@Override
public boolean isSaveAsAllowed() {
return false;
}
/**
* {@inheritDoc}
* This implementation additionally creates this editor's controller.
*/
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
setSite(site);
setInput(input);
}
private IRunnableWithProgress saveRunnable = new IRunnableWithProgress() {
public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
if (isDirty()) {
for (IFormPage page : pageController.getPages()) {
page.getManagedForm().commit(true);
}
pageController.doSave(new org.nightlabs.base.ui.progress.ProgressMonitorWrapper(monitor));
Display.getDefault().asyncExec(new Runnable() {
public void run() {
editorDirtyStateChanged();
}
});
}
}
};
private IFormPage formPage;
private IEntityEditorPageController pageController;
private ScrolledForm scrolledForm;
@Override
public boolean isDirty() {
return pageController != null ? pageController.isDirty() : false;
}
protected void editorDirtyStateChanged() {
firePropertyChange(PROP_DIRTY);
getEditor().editorDirtyStateChanged();
}
/**
* {@inheritDoc}
*
* This implementation will start a job to save the
* editor. It will first let all pages commit and then
* call its controllers doSave() method. This will
* cause all page controllers to save their model.
* If the active page appears to be {@link Fadeable} it will
* be faded until the save operation is finished.
*/
@Override
public void doSave(IProgressMonitor monitor) {
Job saveJob = null;
IFormPage page = getPage();
if (page instanceof Fadeable) {
saveJob = new FadeableCompositeJob(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.layout.editor.ReportLayoutEntityEditor.job.saveEntity"), ((Fadeable)page), this) { //$NON-NLS-1$
@Override
protected IStatus run(ProgressMonitor monitor, Object source) throws Exception {
try {
saveRunnable.run(new RCPProgressMonitor(monitor));
} catch (Exception e) {
throw new RuntimeException(e);
}
return Status.OK_STATUS;
}
};
}
if (saveJob == null) {
saveJob = new Job(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.layout.editor.ReportLayoutEntityEditor.job.saveEntity")) { //$NON-NLS-1$
@Override
protected IStatus run(ProgressMonitor monitor) {
try {
saveRunnable.run(getProgressMonitor());
} catch (Exception e) {
throw new RuntimeException(e);
}
return Status.OK_STATUS;
}
};
}
// saveJob.setUser(true);
saveJob.schedule();
}
@Override
public void dispose() {
super.dispose();
if (pageController != null)
pageController.dispose();
}
@Override
public void createPartControl(Composite parent) {
toolkit = new NightlabsFormsToolkit(parent.getDisplay());
XComposite wrapper = new XComposite(parent, SWT.BORDER);
wrapper.setToolkit(toolkit);
// scrolledForm = toolkit.createScrolledForm(parent);
// GridLayout gl = new GridLayout();
// XComposite.configureLayout(LayoutMode.ORDINARY_WRAPPER, gl);
// scrolledForm.getBody().setLayout(gl);
// XComposite wrapper = new XComposite(scrolledForm.getBody(), SWT.NONE, LayoutMode.TOTAL_WRAPPER);
// GridData gd = new GridData(GridData.FILL_BOTH);
// gd.widthHint = 1;
// gd.heightHint = 1;
// wrapper.setLayoutData(gd);
// wrapper.setToolkit(toolkit);
//
// ManagedForm mForm = new ManagedForm(toolkit, scrolledForm);
//
EntityEditor dummyEditor = getDummyEntityEditor();
pageController = createPageController(dummyEditor);
formPage = createFormPage(dummyEditor);
pageController.addPage(formPage);
wrapper.setLayout(new FillLayout());
formPage.createPartControl(wrapper);
wrapper.adaptToToolkit();
// scrolledForm.setLayoutData(new GridData(GridData.FILL_BOTH));
control = wrapper;
}
@Override
public void setFocus() {
formPage.setFocus();
}
protected abstract IEntityEditorPageController createPageController(EntityEditor entityEditor);
protected abstract IFormPage createFormPage(EntityEditor entityEditor);
protected ScrolledForm getForm() {
return scrolledForm;
}
private IFormPage getPage() {
return formPage;
}
@Override
public JFireRemoteReportEditorInput getEditorInput() {
return (JFireRemoteReportEditorInput) super.getEditorInput();
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.editor.IFormPage#getPartControl()
*/
public Control getPartControl() {
return control;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.editor.IFormPage#initialize(org.eclipse.ui.forms.editor.FormEditor)
*/
public void initialize(FormEditor editor) {
this.editor = editor;
}
/*
* (non-Javadoc)
* @see org.eclipse.birt.report.designer.ui.editors.IReportEditorPage#onBroughtToTop(org.eclipse.birt.report.designer.ui.editors.IReportEditorPage)
*/
public boolean onBroughtToTop(IReportEditorPage prePage) {
return true;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.editor.IFormPage#canLeaveThePage()
*/
public boolean canLeaveThePage() {
return true;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.editor.IFormPage#getEditor()
*/
public FormEditor getEditor() {
return editor;
}
/*
* (non-Javadoc)
* @see org.eclipse.birt.report.designer.ui.editors.IReportEditorPage#getStaleType()
*/
public int getStaleType() {
return staleType;
}
/*
* (non-Javadoc)
* @see org.eclipse.birt.report.designer.ui.editors.IReportEditorPage#markPageStale(int)
*/
public void markPageStale(int type) {
staleType = type;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.editor.IFormPage#getIndex()
*/
public int getIndex() {
return index;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.editor.IFormPage#getManagedForm()
*/
public IManagedForm getManagedForm() {
return null;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.editor.IFormPage#isActive()
*/
public boolean isActive() {
return false;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.editor.IFormPage#isEditor()
*/
public boolean isEditor() {
return false;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.editor.IFormPage#selectReveal(java.lang.Object)
*/
public boolean selectReveal(Object object) {
return false;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.editor.IFormPage#setActive(boolean)
*/
public void setActive(boolean active) {
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.forms.editor.IFormPage#setIndex(int)
*/
public void setIndex(int index) {
this.index = index;
}
@Override
public void setInput(IEditorInput input) {
super.setInput(input);
}
/**
* {@inheritDoc}
* <p>
* Returns the provider from the editor set in {@link #initialize(FormEditor)}
* in order to share the provider with the other editor pages.
*
* @see org.nightlabs.jfire.reporting.admin.ui.layout.editor.preview.ReportLayoutPreviewEditor#getProvider()
*/
protected IReportProvider getProvider() {
IReportProvider provider = null;
if (editor != null)
provider = (IReportProvider) editor.getAdapter(IReportProvider.class);
if (provider != null)
setProvider(provider);
if(provider == null)
{
provider = getDefaultProvider();
}
return provider;
}
protected IReportProvider getDefaultProvider()
{
if (provider == null) {
provider = new FileReportProvider();
}
return provider;
}
protected void setProvider(IReportProvider provider) {
this.provider = provider;
}
private ActionRegistry registry;
private NightlabsFormsToolkit toolkit;
@Override
public Object getAdapter(Class required) {
if (required.equals( ActionRegistry.class ) )
{
if ( registry == null )
{
registry = new ActionRegistry( );
}
return registry;
}
return super.getAdapter(required);
}
private class DummyEntityEditor extends EntityEditor {
private EntityEditorController c;
public DummyEntityEditor() {
c = new EntityEditorController(this) {
@Override
public IEntityEditorPageController getPageController(IFormPage page) {
return pageController;
}
};
}
@Override
public EntityEditorController getController() {
return c;
}
@Override
public FormToolkit getToolkit() {
return toolkit;
}
@Override
public JFireRemoteReportEditorInput getEditorInput() {
return ReportLayoutEntityEditor.this.getEditorInput();
}
@Override
public void editorDirtyStateChanged() {
ReportLayoutEntityEditor.this.editorDirtyStateChanged();
}
}
public EntityEditor getDummyEntityEditor() {
return new DummyEntityEditor();
}
}