/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.excel.gui.properties;
import java.io.File;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
import de.rcenvironment.components.excel.common.ExcelComponentConstants;
import de.rcenvironment.components.excel.common.ExcelService;
import de.rcenvironment.components.excel.common.ExcelUtils;
import de.rcenvironment.components.excel.common.SimpleExcelService;
import de.rcenvironment.core.gui.resources.api.ImageManager;
import de.rcenvironment.core.gui.resources.api.StandardImages;
import de.rcenvironment.core.gui.workflow.editor.properties.ValidatingWorkflowNodePropertySection;
import de.rcenvironment.core.toolkitbridge.transitional.ConcurrencyUtils;
import de.rcenvironment.toolkit.modules.concurrency.api.TaskDescription;
/**
* "Properties" view tab for defining macros to run.
*
* @author Patrick Schaefer
* @author Markus Kunde
*/
public class MacrosSection extends ValidatingWorkflowNodePropertySection {
private Object lock = new Object();
private Composite macroGroup;
private CCombo comboMacroPre;
private CCombo comboMacroRun;
private CCombo comboMacroPost;
private Button discoverMacrosButton;
@Override
protected void createCompositeContent(final Composite parent, final TabbedPropertySheetPage aTabbedPropertySheetPage) {
final TabbedPropertySheetWidgetFactory toolkit = aTabbedPropertySheetPage.getWidgetFactory();
final Composite content = new LayoutComposite(parent);
content.setLayout(new GridLayout(1, true));
final Composite macrosChoosingSection = toolkit.createFlatFormComposite(content);
initMacrosChoosingSection(toolkit, macrosChoosingSection);
}
@Override
public void aboutToBeShown() {
super.aboutToBeShown();
discoverMacros();
}
/**
* Initialize macro choosing section.
*
* @param toolkit the toolkit to create section content
* @param container parent
*/
private void initMacrosChoosingSection(final TabbedPropertySheetWidgetFactory toolkit, final Composite container) {
GridData layoutData;
layoutData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
container.setLayoutData(layoutData);
container.setLayout(new FillLayout());
final Section section = toolkit.createSection(container, Section.TITLE_BAR | Section.EXPANDED);
section.setText(Messages.macrosChoosingSectionName);
final Composite client = toolkit.createComposite(section);
layoutData = new GridData(GridData.FILL_HORIZONTAL);
client.setLayoutData(layoutData);
client.setLayout(new GridLayout(1, false));
CLabel lblDescription = toolkit.createCLabel(client, Messages.macrosSectionDescription);
macroGroup = toolkit.createComposite(client);
macroGroup.setLayout(new GridLayout(2, true));
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
toolkit.createCLabel(macroGroup, Messages.preMacro);
comboMacroPre = toolkit.createCCombo(macroGroup);
comboMacroPre.setEditable(true);
comboMacroPre.setData(CONTROL_PROPERTY_KEY, ExcelComponentConstants.PRE_MACRO);
toolkit.createCLabel(macroGroup, Messages.runMacro);
comboMacroRun = toolkit.createCCombo(macroGroup);
comboMacroRun.setEditable(true);
comboMacroRun.setData(CONTROL_PROPERTY_KEY, ExcelComponentConstants.RUN_MACRO);
toolkit.createCLabel(macroGroup, Messages.postMacro);
comboMacroPost = toolkit.createCCombo(macroGroup);
comboMacroPost.setEditable(true);
comboMacroPost.setData(CONTROL_PROPERTY_KEY, ExcelComponentConstants.POST_MACRO);
toolkit.createCLabel(macroGroup, "");
discoverMacrosButton = toolkit.createButton(macroGroup, Messages.macrosDiscoverButtonLabel, SWT.PUSH);
discoverMacrosButton.setImage(ImageManager.getInstance().getSharedImage(StandardImages.REFRESH_16));
lblDescription.setLayoutData(gridData);
comboMacroPre.setLayoutData(gridData);
comboMacroRun.setLayoutData(gridData);
comboMacroPost.setLayoutData(gridData);
section.setClient(client);
}
/**
* Discover all macros available in Excel file and fill Combo-lists with them.
*
*/
private void discoverMacros() {
ConcurrencyUtils.getAsyncTaskService().execute(new Runnable() {
@Override
@TaskDescription("Browses the given excel file for macros")
public void run() {
ExcelService excelService = new SimpleExcelService();
File xlFile = ExcelUtils.getAbsoluteFile(getProperty(ExcelComponentConstants.XL_FILENAME));
if (xlFile != null) {
final String[] macrosAvailable;
synchronized (lock) {
macrosAvailable = excelService.getMacros(xlFile);
}
Display.getDefault().asyncExec(new Runnable() {
@Override
@TaskDescription("Sets the items of the macro combo boxes")
public void run() {
synchronized (lock) {
if (!comboMacroPre.isDisposed() && !comboMacroRun.isDisposed() && !comboMacroPost.isDisposed()) {
comboMacroPre.setItems(macrosAvailable);
comboMacroRun.setItems(macrosAvailable);
comboMacroPost.setItems(macrosAvailable);
}
}
}
});
}
}
});
}
@Override
protected void refreshBeforeValidation() {
macroGroup.pack(true);
}
@Override
protected Controller createController() {
return new MacrosController();
}
/**
* Custom {@link DefaultController} implementation to handle the activation of the GUI controls.
*
* @author Markus Kunde
*/
private final class MacrosController extends DefaultController {
@Override
protected void widgetSelected(final SelectionEvent event, final Control source) {
super.widgetSelected(event, source);
if (source == discoverMacrosButton) {
discoverMacros();
}
}
}
}