/** * */ package org.nightlabs.jfire.reporting.ui.textpart; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.language.LanguageChooser; import org.nightlabs.base.ui.table.AbstractTableComposite; import org.nightlabs.base.ui.table.TableLabelProvider; import org.nightlabs.jfire.reporting.textpart.ReportTextPart; import org.nightlabs.jfire.reporting.textpart.ReportTextPartConfiguration; /** * @author Alexander Bieber <!-- alex [AT] nightlabs [DOT] de --> * */ public class ReportTextPartConfigurationEditComposite extends XComposite { private ReportTextPartConfiguration reportTextPartConfiguration; private TextPartTable textPartTable; private Composite editorWrapper; private StackLayout editorWrapperLayout; private Map<ReportTextPart, ReportTextPartEditComposite> editComposites = new HashMap<ReportTextPart, ReportTextPartEditComposite>(); private ListenerList changedListeners = new ListenerList(); private IReportTextPartChangedListener partChangedListener = new IReportTextPartChangedListener() { @Override public void reportTextPartChanged(ReportTextPartChangedEvent evt) { notifyChangedListeners(evt.getReportTextPart()); } }; private LanguageChooser languageChooser; private boolean showTextPartID; private class TextPartTable extends AbstractTableComposite<ReportTextPart> { public TextPartTable(Composite parent, int style) { super(parent, style); } @Override protected void createTableColumns(TableViewer tableViewer, Table table) { table.setHeaderVisible(false); } @Override protected void setTableProvider(TableViewer tableViewer) { tableViewer.setContentProvider(new ArrayContentProvider()); tableViewer.setLabelProvider(new TableLabelProvider() { @Override public String getColumnText(Object element, int columnIndex) { if (element instanceof ReportTextPart) { return ((ReportTextPart) element).getName().getText(); } return null; } }); } } /** * Create a new {@link ReportTextPartConfigurationEditComposite}. * * @param parent The parent to use. * @param style The style to apply. */ public ReportTextPartConfigurationEditComposite(Composite parent, int style, LanguageChooser languageChooser, boolean showTextPartID) { super(parent, style, LayoutMode.NONE); this.languageChooser = languageChooser; this.showTextPartID = showTextPartID; createContents(); } /** * Create a new {@link ReportTextPartConfigurationEditComposite}. * * @param parent The parent to use. * @param style The style to apply. * @param layoutDataMode The layoutDataMode to apply. */ public ReportTextPartConfigurationEditComposite(Composite parent, int style, LayoutDataMode layoutDataMode, LanguageChooser languageChooser, boolean showTextPartID) { super(parent, style, LayoutMode.NONE, layoutDataMode); this.languageChooser = languageChooser; this.showTextPartID = showTextPartID; createContents(); } protected synchronized void createContents() { setLayout(new FillLayout()); SashForm sashForm = new SashForm(this, SWT.HORIZONTAL); textPartTable = new TextPartTable(sashForm, SWT.NONE); textPartTable.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { if (textPartTable.getSelectionCount() != 1) return; switchReportTextPart(textPartTable.getFirstSelectedElement()); } }); editorWrapper = new Composite(sashForm, SWT.NONE); editorWrapperLayout = new StackLayout(); editorWrapper.setLayout(editorWrapperLayout); sashForm.setWeights(new int[] {1, 3}); } public synchronized void setReportTextPartConfiguration(ReportTextPartConfiguration reportTextPartConfiguration) { if (reportTextPartConfiguration == null) return; this.reportTextPartConfiguration = reportTextPartConfiguration; List<ReportTextPart> parts = reportTextPartConfiguration.getReportTextParts(); for (ReportTextPartEditComposite composite : editComposites.values()) { composite.dispose(); } editComposites.clear(); for (ReportTextPart part : parts) { final ReportTextPartEditComposite editComposite = new ReportTextPartEditComposite( editorWrapper, SWT.NONE, part, languageChooser, showTextPartID); editComposite.addReportTextPartChangedListener(partChangedListener); editComposite.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { editComposite.removeReportTextPartChangedListener(partChangedListener); } }); editComposite.adaptToToolkit(); editComposites.put(part, editComposite); } textPartTable.setInput(parts); if (parts.size() > 0) { ReportTextPart part = parts.iterator().next(); textPartTable.setSelection(new StructuredSelection(part)); switchReportTextPart(part); } } private void switchReportTextPart(ReportTextPart part) { ReportTextPartEditComposite editComposite = editComposites.get(part); if (editComposite == null) throw new IllegalStateException("EditComposite for ReportTextPart "+part.getReportTextPartID()+" is unknown"); //$NON-NLS-1$ //$NON-NLS-2$ if (editComposite.isDisposed()) throw new IllegalStateException("EditComposite for ReportTextPart "+part.getReportTextPartID()+" is already disposed"); //$NON-NLS-1$ //$NON-NLS-2$ editorWrapperLayout.topControl = editComposite; editorWrapper.layout(); } public void updateReportTextPartConfiguration() { List<ReportTextPart> parts = reportTextPartConfiguration.getReportTextParts(); for (ReportTextPart part : parts) { ReportTextPartEditComposite editComposite = editComposites.get(part); if (editComposite != null && !editComposite.isDisposed()) editComposite.updateReportTextPart(); } } public void addReportTextPartConfigurationChangedListener(IReportTextPartConfigurationChangedListener listener) { changedListeners.add(listener); } public void removeReportTextPartConfigurationChangedListener(IReportTextPartConfigurationChangedListener listener) { changedListeners.remove(listener); } protected void notifyChangedListeners(ReportTextPart reportTextPart) { Object[] listeners = changedListeners.getListeners(); if (listeners.length <= 0) return; ReportTextPartConfigurationChangedEvent event = new ReportTextPartConfigurationChangedEvent(reportTextPartConfiguration, reportTextPart); for (Object listener : listeners) { if (listener instanceof IReportTextPartConfigurationChangedListener) { ((IReportTextPartConfigurationChangedListener) listener).reportTextPartConfigurationChanged(event); } } } }