package org.nightlabs.jfire.trade.editor2d.ui.layout; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.Collection; import java.util.LinkedList; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.job.Job; import org.nightlabs.base.ui.util.RCPUtil; import org.nightlabs.jfire.trade.editor2d.ILayout; import org.nightlabs.jfire.trade.editor2d.ui.resource.Messages; import org.nightlabs.progress.ProgressMonitor; public abstract class AbstractLocalLayoutListComposite<L extends ILayout> extends XComposite { private static final Logger logger = Logger.getLogger(AbstractLocalLayoutListComposite.class); protected LayoutTable<L> layoutTable; private Text baseFolderText; private static final int PREVIEW_MAX_WIDTH = 300; private static final int PREVIEW_MAX_HEIGHT = 200; /** * * @param parent * @param style */ public AbstractLocalLayoutListComposite(Composite parent, int style) { super(parent, style); Label label = new Label(this, SWT.NONE); label.setText(Messages.getString("org.nightlabs.jfire.trade.editor2d.ui.layout.AbstractLocalLayoutListComposite.label.availableLayouts")); //$NON-NLS-1$ XComposite threeColWrapper = new XComposite(this, SWT.NONE, LayoutMode.TIGHT_WRAPPER, LayoutDataMode.GRID_DATA_HORIZONTAL, 3); label = new Label(threeColWrapper, SWT.NONE); label.setText(Messages.getString("org.nightlabs.jfire.trade.editor2d.ui.layout.AbstractLocalLayoutListComposite.label.baseFolder")); //$NON-NLS-1$ baseFolderText = new Text(threeColWrapper, getBorderStyle()); baseFolderText.setEditable(false); XComposite.setLayoutDataMode(LayoutDataMode.GRID_DATA_HORIZONTAL, baseFolderText); Button chooseBaseFolderButton = new Button(threeColWrapper, SWT.PUSH); chooseBaseFolderButton.setText("..."); //$NON-NLS-1$ chooseBaseFolderButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { DirectoryDialog dialog = new DirectoryDialog(RCPUtil.getActiveShell()); if (new File(baseFolderText.getText()).isDirectory()) dialog.setFilterPath(baseFolderText.getText()); else dialog.setFilterPath("."); //$NON-NLS-1$ String directoryName = dialog.open(); if (directoryName != null) { File directoryFile = new File(directoryName); if (directoryFile.exists() && directoryFile.isDirectory()) { storeInitialBaseFolder(directoryFile); baseFolderText.setText(directoryFile.getPath()); loadLayouts(directoryFile); } } } }); XComposite twoColWrapper = new XComposite(this, SWT.NONE, LayoutMode.TIGHT_WRAPPER, LayoutDataMode.GRID_DATA, 2); layoutTable = new LayoutTable<L>(twoColWrapper, getBorderStyle()); String configModuleBaseDirectory = getInitialBaseFolder(); File baseDirectory = new File(configModuleBaseDirectory); if (!baseDirectory.isDirectory()) baseDirectory = new File("."); //$NON-NLS-1$ baseFolderText.setText(baseDirectory.getAbsolutePath()); layoutTable.displayLoadingMessage(); loadLayouts(baseDirectory); final LayoutPreviewComposite<L> preview = new LayoutPreviewComposite<L>(twoColWrapper, getRenderer(), PREVIEW_MAX_WIDTH, PREVIEW_MAX_HEIGHT); layoutTable.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { preview.showPreview(layoutTable.getFirstSelectedElement()); } }); // GridData gd = new GridData(GridData.FILL_VERTICAL); GridData gd = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, true); gd.widthHint = PREVIEW_MAX_WIDTH; gd.heightHint = PREVIEW_MAX_HEIGHT; preview.setLayoutData(gd); } private Job loadLayoutsJob; public void loadLayouts(final File baseDirectory) { String name = Messages.getString("org.nightlabs.jfire.trade.editor2d.ui.layout.AbstractLocalLayoutListComposite.job.loadLayouts.name "); //$NON-NLS-1$ loadLayoutsJob = new Job(name) { //$NON-NLS-1$ @Override protected IStatus run(ProgressMonitor monitor) throws Exception { final Job thisJob = this; Display.getDefault().asyncExec(new Runnable() { @Override public void run() { if (loadLayoutsJob == thisJob) layoutTable.displayLoadingMessage(); } }); FilenameFilter ticketLayoutFilenameFilter = new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith("." + getLayoutFileExtension()); //$NON-NLS-1$ } }; final Collection<ILayout> layouts = new LinkedList<ILayout>(); for (File tldFile : baseDirectory.listFiles(ticketLayoutFilenameFilter)) { try { ILayout layout = createLayoutFromFile(tldFile); layouts.add(layout); } catch (IOException e) { logger.info("Loading the ticket layout file '" + tldFile.getPath() + "' failed.", e); //$NON-NLS-1$ //$NON-NLS-2$ } } Display.getDefault().asyncExec(new Runnable() { @Override public void run() { if (loadLayoutsJob == thisJob) layoutTable.setInput(layouts); } }); return Status.OK_STATUS; } }; loadLayoutsJob.schedule(); } public L getSelectedLayout() { return layoutTable.getFirstSelectedElement(); } public LayoutTable<L> getLayoutTable() { return layoutTable; } public String getBaseFolder() { return baseFolderText.getText(); } protected abstract String getInitialBaseFolder(); protected abstract void storeInitialBaseFolder(File folder); protected abstract L createLayoutFromFile(File file) throws IOException; protected abstract ILayoutPreviewRenderer<L> getRenderer(); protected abstract String getLayoutFileExtension(); }