/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.xml.loader.gui.properties;
import java.io.IOException;
import java.io.StringWriter;
import org.apache.commons.io.IOUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.swt.SWT;
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.xml.loader.common.XmlLoaderComponentConstants;
import de.rcenvironment.core.gui.utils.common.components.PropertyTabGuiHelper;
import de.rcenvironment.core.gui.workflow.editor.properties.ValidatingWorkflowNodePropertySection;
/**
* GUI in property tab for tool finding.
*
* @author Markus Kunde
* @author Arne Bachmann
* @author Markus Litz
* @author Jan Flink
*/
public class XmlLoaderComponentSection extends ValidatingWorkflowNodePropertySection {
private static final int MINIMUM_HEIGHT_OF_FILE_CONTENT_TEXT = 300;
private Button fileChooser;
private Text fileContentText;
private LayoutComposite content;
@Override
protected void createCompositeContent(final Composite parent, final TabbedPropertySheetPage aTabbedPropertySheetPage) {
final TabbedPropertySheetWidgetFactory toolkit = aTabbedPropertySheetPage.getWidgetFactory();
content = new LayoutComposite(parent);
content.setLayout(new FillLayout());
initFileChoosingSection(toolkit, content);
}
/**
* Initialize file choosing section.
*
* @param toolkit the toolkit to create section content
* @param container parent
*/
private void initFileChoosingSection(final TabbedPropertySheetWidgetFactory toolkit, final Composite container) {
final Section section = toolkit.createSection(container, Section.TITLE_BAR);
section.setText(Messages.fileChoosingSectionName);
final Composite client = toolkit.createComposite(section);
client.setLayout(new GridLayout());
fileChooser = toolkit.createButton(client, Messages.fileLinkButtonLabel, SWT.PUSH);
toolkit.createCLabel(client, Messages.actuallyLoadedLabel);
GridData gridData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
gridData.heightHint = MINIMUM_HEIGHT_OF_FILE_CONTENT_TEXT;
fileContentText = toolkit.createText(client, "", SWT.V_SCROLL | SWT.H_SCROLL);
fileContentText.setEditable(false);
fileContentText.setLayoutData(gridData);
section.setClient(client);
}
/**
* Open file choosing dialog for XML file.
*
*/
private void fileChoosing() {
final IFile file = PropertyTabGuiHelper.selectFileFromProjects(content.getShell(), Messages.loadTitle, Messages.loadMessage);
if (file != null) {
StringWriter writer = new StringWriter();
try {
IOUtils.copy(file.getContents(), writer);
String theString = writer.toString();
setProperty(XmlLoaderComponentConstants.XMLCONTENT, theString);
} catch (IOException | CoreException e) {
logger.error("Cannot read content from file.", e);
}
refreshSection();
}
}
@Override
protected void refreshBeforeValidation() {
setXMLContent();
}
private void setXMLContent() {
if (getProperty(XmlLoaderComponentConstants.XMLCONTENT) != null) {
fileContentText.setText(getProperty(XmlLoaderComponentConstants.XMLCONTENT));
return;
}
fileContentText.setText("");
}
@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();
}
}
}
}