/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.excel.gui.properties;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
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.Text;
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.core.gui.utils.common.components.PropertyTabGuiHelper;
import de.rcenvironment.core.gui.workflow.editor.properties.ValidatingWorkflowNodePropertySection;
/**
* Excel File implementation for tabbed properties view.
*
* @author Markus Kunde
* @author Patrick Schaefer
* @author Doreen Seider
* @author Arne Bachmann
*/
public class FileSection extends ValidatingWorkflowNodePropertySection {
private static final int FILE_TEXTFIELD_WIDTH = 300;
private Button fileChooser;
private Composite fileGroup;
private Text xlsFilename;
@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 fileChoosingSection = toolkit.createFlatFormComposite(content);
initFileChoosingSection(toolkit, fileChoosingSection);
}
/**
* Initialize file choosing section.
*
* @param toolkit the toolkit to create section content
* @param container parent
*/
private void initFileChoosingSection(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.fileChoosingSectionName);
final Composite client = toolkit.createComposite(section);
layoutData = new GridData(GridData.FILL_HORIZONTAL);
client.setLayoutData(layoutData);
client.setLayout(new GridLayout(1, false));
toolkit.createCLabel(client, Messages.fileSectionDescription);
fileGroup = toolkit.createComposite(client);
fileGroup.setLayout(new GridLayout(3, false));
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL_HORIZONTAL;
gridData.grabExcessHorizontalSpace = true;
gridData.widthHint = FILE_TEXTFIELD_WIDTH;
fileChooser = toolkit.createButton(fileGroup, Messages.fileLinkButtonLabel, SWT.PUSH);
final int aKeyCode = 97;
xlsFilename = toolkit.createText(fileGroup, "", SWT.SINGLE | SWT.READ_ONLY);
xlsFilename.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.stateMask == SWT.CTRL && e.keyCode == aKeyCode){
xlsFilename.selectAll();
}
}
});
xlsFilename.setData(CONTROL_PROPERTY_KEY, ExcelComponentConstants.XL_FILENAME);
xlsFilename.setLayoutData(gridData);
section.setClient(client);
}
/**
* Returns the image descriptor with the given relative path.
*
* @param relativePath relative path to image
* @return ImageDescriptor of image
*/
public static ImageDescriptor getImageDescriptor(final String relativePath) {
ImageDescriptor id = ImageDescriptor.createFromURL(FileSection.class.getClassLoader()
.getResource(ExcelPropertiesConstants.ICONBASEPATH + relativePath));
return id;
}
/**
* Open file choosing dialog for Excel file.
*
*/
private void fileChoosing() {
final IFile file = PropertyTabGuiHelper.selectFileFromActiveProject(fileGroup.getShell(), Messages.loadTitle, Messages.loadMessage);
if (file != null) {
setProperty(ExcelComponentConstants.XL_FILENAME, file.getFullPath().makeRelative().toString());
refreshSection();
}
}
@Override
protected void refreshBeforeValidation() {
fileGroup.pack(true);
}
@Override
protected Controller createController() {
return new FileController();
}
/**
* Custom {@link DefaultController} implementation to handle the activation of the GUI
* controls.
*
* @author Markus Kunde
*/
private final class FileController extends DefaultController {
@Override
protected void widgetSelected(final SelectionEvent event, final Control source) {
super.widgetSelected(event, source);
if (source == fileChooser) {
fileChoosing();
}
}
}
}