/** * */ package org.nightlabs.jfire.reporting.admin.ui.layout.editor.textpart; import javax.jdo.FetchPlan; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.part.EditorPart; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.composite.XComposite.LayoutMode; import org.nightlabs.base.ui.editor.ToolBarSectionPart; import org.nightlabs.base.ui.form.NightlabsFormsToolkit; import org.nightlabs.base.ui.job.Job; import org.nightlabs.base.ui.language.LanguageChooserCombo; import org.nightlabs.base.ui.progress.ProgressMonitorWrapper; import org.nightlabs.jdo.NLJDOHelper; import org.nightlabs.jfire.idgenerator.IDGenerator; import org.nightlabs.jfire.reporting.admin.ui.layout.editor.JFireRemoteReportEditorInput; import org.nightlabs.jfire.reporting.admin.ui.resource.Messages; import org.nightlabs.jfire.reporting.dao.ReportRegistryItemDAO; import org.nightlabs.jfire.reporting.layout.ReportRegistryItem; import org.nightlabs.jfire.reporting.layout.id.ReportRegistryItemID; import org.nightlabs.jfire.reporting.textpart.ReportTextPart; import org.nightlabs.jfire.reporting.textpart.ReportTextPartConfiguration; import org.nightlabs.jfire.reporting.textpart.dao.ReportTextPartConfigurationDAO; import org.nightlabs.jfire.reporting.ui.textpart.IReportTextPartConfigurationChangedListener; import org.nightlabs.jfire.reporting.ui.textpart.ReportTextPartConfigurationChangedEvent; import org.nightlabs.jfire.reporting.ui.textpart.ReportTextPartConfigurationEditComposite; import org.nightlabs.progress.ProgressMonitor; import org.nightlabs.progress.SubProgressMonitor; /** * @author Alexander Bieber <!-- alex [AT] nightlabs [DOT] de --> * */ public class ReportTextPartConfigurationEditor extends EditorPart { private static final String[] FETCH_GROUPS = new String[] { FetchPlan.DEFAULT, ReportTextPartConfiguration.FETCH_GROUP_REPORT_TEXT_PARTS, ReportTextPart.FETCH_GROUP_NAME, ReportTextPart.FETCH_GROUP_CONTENT }; private ScrolledForm form; private NightlabsFormsToolkit toolkit; private ReportTextPartConfigurationEditComposite configurationEditComposite; private boolean dirty; private IReportTextPartConfigurationChangedListener changedListener = new IReportTextPartConfigurationChangedListener() { @Override public void reportTextPartConfigurationChanged(ReportTextPartConfigurationChangedEvent evt) { markDirty(); } }; private volatile ReportTextPartConfiguration reportTextPartConfiguration; private AddReportTextPartAction addReportTextPartAction; /** * */ public ReportTextPartConfigurationEditor() { } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor) */ @Override public void doSave(IProgressMonitor monitor) { synchronized (this) { if (configurationEditComposite != null && !configurationEditComposite.isDisposed()) { configurationEditComposite.updateReportTextPartConfiguration(); } if (monitor == null) { // Have to check, BIRT passes null monitor = new NullProgressMonitor(); } reportTextPartConfiguration = ReportTextPartConfigurationDAO.sharedInstance().storeReportTextPartConfiguration( reportTextPartConfiguration, true, FETCH_GROUPS, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new ProgressMonitorWrapper(monitor)); updateConfigurationEditComposite(); } dirty = false; } protected void updateConfigurationEditComposite() { if (configurationEditComposite == null) return; configurationEditComposite.setReportTextPartConfiguration(reportTextPartConfiguration); } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#doSaveAs() */ @Override public void doSaveAs() { } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput) */ @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { setSite(site); setInput(input); JFireRemoteReportEditorInput reportEditorInput = (JFireRemoteReportEditorInput) input; final ReportRegistryItemID reportRegistryItemID = reportEditorInput.getReportRegistryItemID(); Job loadJob = new Job(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.layout.editor.textpart.ReportTextPartConfigurationEditor.job.loadReportTextPartConfiguration")) { //$NON-NLS-1$ @Override protected IStatus run(ProgressMonitor monitor) throws Exception { monitor.beginTask(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.layout.editor.textpart.ReportTextPartConfigurationEditor.job.loadReportTextPartConfiguration"), 10); //$NON-NLS-1$ ReportTextPartConfiguration config = ReportTextPartConfigurationDAO.sharedInstance().getReportTextPartConfiguration( reportRegistryItemID, true, FETCH_GROUPS, NLJDOHelper.MAX_FETCH_DEPTH_NO_LIMIT, new SubProgressMonitor(monitor, 7)); synchronized (this) { reportTextPartConfiguration = config; if (reportTextPartConfiguration == null) { reportTextPartConfiguration = new ReportTextPartConfiguration( IDGenerator.getOrganisationID(), IDGenerator.nextID(ReportTextPartConfiguration.class) ); ReportRegistryItem item = ReportRegistryItemDAO.sharedInstance().getReportRegistryItem( reportRegistryItemID, new String[] {FetchPlan.DEFAULT}, new SubProgressMonitor(monitor, 3)); reportTextPartConfiguration.setReportRegistryItem(item); } if (configurationEditComposite != null && !configurationEditComposite.isDisposed()) { configurationEditComposite.getDisplay().asyncExec(new Runnable() { public void run() { updateConfigurationEditComposite(); } }); } monitor.done(); } return Status.OK_STATUS; } }; loadJob.schedule(); } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#isDirty() */ @Override public boolean isDirty() { return dirty; } protected void markDirty() { dirty = true; firePropertyChange(IEditorPart.PROP_DIRTY); } /* (non-Javadoc) * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed() */ @Override public boolean isSaveAsAllowed() { return false; } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) */ @Override public void createPartControl(Composite parent) { synchronized (this) { toolkit = new NightlabsFormsToolkit(parent.getDisplay()); form = toolkit.createScrolledForm(parent); GridLayout gl = new GridLayout(); XComposite.configureLayout(LayoutMode.ORDINARY_WRAPPER, gl); form.getBody().setLayout(gl); ToolBarSectionPart section = new ToolBarSectionPart( toolkit, form.getBody(), ExpandableComposite.TITLE_BAR, Messages.getString("org.nightlabs.jfire.reporting.admin.ui.layout.editor.textpart.ReportTextPartConfigurationEditor.section.textPartConfig.name") //$NON-NLS-1$ ); XComposite comp = new XComposite(section.getSection(), SWT.NONE); comp.setToolkit(toolkit); section.getSection().setClient(comp); form.setText(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.layout.editor.textpart.ReportTextPartConfigurationEditor.form.textPartConfig.name")); //$NON-NLS-1$ addReportTextPartAction = new AddReportTextPartAction(this); section.registerAction(addReportTextPartAction); section.updateToolBarManager(); LanguageChooserCombo languageChooser = new LanguageChooserCombo(comp); languageChooser.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_END | GridData.HORIZONTAL_ALIGN_END)); configurationEditComposite = new ReportTextPartConfigurationEditComposite(comp, SWT.NONE, languageChooser, true); configurationEditComposite.addReportTextPartConfigurationChangedListener(changedListener); configurationEditComposite.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { configurationEditComposite.removeReportTextPartConfigurationChangedListener(changedListener); } }); configurationEditComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); comp.adaptToToolkit(); if (reportTextPartConfiguration != null) { updateConfigurationEditComposite(); } } } /* (non-Javadoc) * @see org.eclipse.ui.part.WorkbenchPart#setFocus() */ @Override public void setFocus() { configurationEditComposite.setFocus(); } protected ReportTextPartConfigurationEditComposite getConfigurationEditComposite() { return configurationEditComposite; } protected ReportTextPartConfiguration getReportTextPartConfiguration() { return reportTextPartConfiguration; } }