/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.wizards.toolintegration; import java.awt.Image; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; import javax.imageio.ImageIO; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.ArrayUtils; import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.events.TraverseEvent; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.graphics.Point; 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.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.eclipse.ui.help.IWorkbenchHelpSystem; import de.rcenvironment.core.component.integration.ToolIntegrationConstants; import de.rcenvironment.core.component.integration.ToolIntegrationContext; import de.rcenvironment.core.gui.utils.incubator.AlphanumericalTextContraintListener; import de.rcenvironment.core.gui.wizards.toolintegration.api.ToolIntegrationWizardPage; import de.rcenvironment.core.utils.common.CrossPlatformFilenameUtils; import de.rcenvironment.core.utils.common.StringUtils; /** * @author Sascha Zur */ public class ToolCharacteristicsPage extends ToolIntegrationWizardPage { private static final String HELP_CONTEXT_ID = "de.rcenvironment.core.gui.wizard.toolintegration.integration_characteristics"; private static final String DOTS = " ... "; private static final String DOC_EXTENTION_NOT_VALID = "Documentation extension not valid. Valid extensions: "; private static final String VALID_EXTENSION_SEPERATOR = ", "; private static final String DOC_DOES_NOT_EXIST = "Documentation path is invalid."; private static final int TOOL_DESCRIPTION_TEXT_HEIGHT = 50; private static final String KEY_KEYS = "properties"; private static final char[] FORBIDDEN_CHARS = new char[] { '/', '\\', ':', '*', '?', '\"', '>', '<', '|' }; protected Map<String, Object> configurationMap; private Text toolNameText; private Text iconText; private final List<String> usedToolnames; private Text groupNameText; private Text descriptionTextArea; private Text integratorName; private Text integratorEmail; private Button uploadIconToFolder; private List<String> groupNames; private Text documenationText; private String docValid = ""; private String iconValid = ""; private String nameValid = ""; private PathChooserButtonListener docPathChooserButtonListener; protected ToolCharacteristicsPage(String pageName, Map<String, Object> configurationMap, List<String> usedToolnames, List<String> groupNames) { super(pageName); setTitle(pageName); setDescription(Messages.firstPageDescription); this.configurationMap = configurationMap; this.usedToolnames = usedToolnames; this.groupNames = groupNames; if (configurationMap.get(ToolIntegrationConstants.KEY_UPLOAD_ICON) == null) { configurationMap.put(ToolIntegrationConstants.KEY_UPLOAD_ICON, true); } } @Override public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(2, false); container.setLayout(layout); GridData containerData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); container.setLayoutData(containerData); Composite toolDataComp = new Composite(container, SWT.NONE); toolDataComp.setLayout(new GridLayout(1, false)); GridData toolData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); toolDataComp.setLayoutData(toolData); Group toolPropertiesGroup = new Group(toolDataComp, SWT.NONE); toolPropertiesGroup.setText(Messages.toolPropGroup); toolPropertiesGroup.setLayout(new GridLayout(3, false)); GridData toolPropertyData = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); toolPropertiesGroup.setLayoutData(toolPropertyData); toolNameText = addLabelAndTextfieldForPropertyToComposite(toolPropertiesGroup, Messages.nameRequired, ToolIntegrationConstants.KEY_TOOL_NAME); ((GridData) toolNameText.getLayoutData()).horizontalSpan = 2; toolNameText.addListener(SWT.Verify, new AlphanumericalTextContraintListener(FORBIDDEN_CHARS)); toolNameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent arg0) { nameValid = validateName(); validate(true); } }); iconText = addLabelAndTextfieldForPropertyToComposite(toolPropertiesGroup, Messages.iconPath, ToolIntegrationConstants.KEY_TOOL_ICON_PATH); iconText.setMessage(Messages.iconSizeMessage); iconText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent arg0) { iconValid = validateIcon(); validate(true); } }); GridLayout iconCompLayout = new GridLayout(2, false); iconCompLayout.marginWidth = 0; Composite iconComp = new Composite(toolPropertiesGroup, SWT.NONE); iconComp.setLayout(iconCompLayout); Button choosePathButton = new Button(iconComp, SWT.PUSH); choosePathButton.setText(DOTS); choosePathButton.addSelectionListener(new PathChooserButtonListener(iconText, false, getShell())); uploadIconToFolder = new Button(iconComp, SWT.CHECK); uploadIconToFolder.setText(Messages.copyIconButtonLabel); uploadIconToFolder.setSelection(true); uploadIconToFolder.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent arg0) { configurationMap.put(ToolIntegrationConstants.KEY_UPLOAD_ICON, (uploadIconToFolder.getSelection())); } @Override public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } }); groupNameText = addLabelAndTextfieldForPropertyToComposite(toolPropertiesGroup, Messages.groupNameText, ToolIntegrationConstants.KEY_TOOL_GROUPNAME); GridData groupNameTextData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL); groupNameText.setLayoutData(groupNameTextData); Button chooseGroupButton = new Button(toolPropertiesGroup, SWT.PUSH); chooseGroupButton.setText(DOTS); chooseGroupButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent arg0) { showGroupSelectionDialog(); } @Override public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } }); documenationText = addLabelAndTextfieldForPropertyToComposite(toolPropertiesGroup, "Documentation: ", ToolIntegrationConstants.KEY_DOC_FILE_PATH); Button chooseDocButton = new Button(toolPropertiesGroup, SWT.PUSH); chooseDocButton.setText(DOTS); docPathChooserButtonListener = new PathChooserButtonListener(documenationText, false, getShell()); chooseDocButton.addSelectionListener(docPathChooserButtonListener); documenationText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent arg0) { docValid = validateDoc(); validate(true); } }); Label toolDescriptionLabel = new Label(toolPropertiesGroup, SWT.NONE); toolDescriptionLabel.setText(Messages.toolDescription); GridData toolDescriptionLabelData = new GridData(); toolDescriptionLabelData.verticalAlignment = GridData.BEGINNING; toolDescriptionLabel.setLayoutData(toolDescriptionLabelData); descriptionTextArea = new Text(toolPropertiesGroup, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.WRAP); descriptionTextArea.addModifyListener(new TextModifyListener(descriptionTextArea)); descriptionTextArea.setData(KEY_KEYS, ToolIntegrationConstants.KEY_TOOL_DESCRIPTION); descriptionTextArea.addTraverseListener(new DescriptionTraverseListener()); GridData descriptionData = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_BOTH | GridData.GRAB_VERTICAL); descriptionData.heightHint = TOOL_DESCRIPTION_TEXT_HEIGHT; descriptionData.horizontalSpan = 2; descriptionTextArea.setLayoutData(descriptionData); Group userInformationGroup = new Group(toolDataComp, SWT.NONE); userInformationGroup.setText(Messages.userInformationGroup); userInformationGroup.setLayout(new GridLayout(2, false)); GridData userInfoData = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL); userInformationGroup.setLayoutData(userInfoData); integratorName = addLabelAndTextfieldForPropertyToComposite(userInformationGroup, Messages.nameIntegrator, ToolIntegrationConstants.KEY_TOOL_INTEGRATOR_NAME); integratorEmail = addLabelAndTextfieldForPropertyToComposite(userInformationGroup, Messages.email, ToolIntegrationConstants.KEY_TOOL_INTEGRATOR_EMAIL); setControl(container); PlatformUI.getWorkbench().getHelpSystem().setHelp(this.getControl(), HELP_CONTEXT_ID); validate(false); } private String validateDoc() { if (documenationText.getText() != null && !documenationText.getText().isEmpty()) { File doc = new File(documenationText.getText()); if (!doc.exists() && !doc.isAbsolute() && configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME) != null && !((String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME)).isEmpty()) { ToolIntegrationContext context = ((ToolIntegrationWizard) getWizard()).getCurrentContext(); doc = new File(new File( new File(new File(context.getRootPathToToolIntegrationDirectory(), context.getNameOfToolIntegrationDirectory()), (String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME)), ToolIntegrationConstants.DOCS_DIR_NAME), documenationText.getText()); } if (doc.exists()) { String extension = FilenameUtils.getExtension(doc.getAbsolutePath()); if (!ArrayUtils.contains(ToolIntegrationConstants.VALID_DOCUMENTATION_EXTENSIONS, extension)) { String allowedExt = DOC_EXTENTION_NOT_VALID; for (String current : ToolIntegrationConstants.VALID_DOCUMENTATION_EXTENSIONS) { allowedExt += current + VALID_EXTENSION_SEPERATOR; } return allowedExt.substring(0, allowedExt.length() - VALID_EXTENSION_SEPERATOR.length()); } } else { return DOC_DOES_NOT_EXIST; } } return ""; } private String validateIcon() { if (iconText.getText() != null && !iconText.getText().isEmpty()) { try { File icon = new File(iconText.getText()); if (!icon.exists() && !icon.isAbsolute() && (String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME) != null && !((String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME)).isEmpty()) { ToolIntegrationContext context = ((ToolIntegrationWizard) getWizard()).getCurrentContext(); icon = new File(new File( new File(context.getRootPathToToolIntegrationDirectory(), context.getNameOfToolIntegrationDirectory()), (String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME)), iconText.getText()); } Image image = ImageIO.read(icon); if (image == null) { return "Icon path or file format is invalid. The default icon will be used."; } } catch (IOException ex) { return "Icon path or file format is invalid. The default icon will be used."; } } return ""; } private String validateName() { if (!CrossPlatformFilenameUtils.isFilenameValid(toolNameText.getText())) { return "The chosen filename is not valid."; } return ""; } private void showGroupSelectionDialog() { ElementListSelectionDialog dlg = new ElementListSelectionDialog( getShell(), new LabelProvider()); dlg.setElements(groupNames.toArray()); dlg.setHelpAvailable(false); dlg.setMultipleSelection(false); dlg.setStatusLineAboveButtons(false); dlg.setMessage(Messages.chooseGroupDlgMessage); dlg.setTitle(Messages.chooseGroupDlgTitle); if (!groupNameText.getText().isEmpty() && groupNames.contains(groupNameText.getText())) { dlg.setInitialSelections(new String[] { groupNameText.getText() }); } if (dlg.open() == Window.OK) { groupNameText.setText(dlg.getFirstResult().toString()); } } private Text addLabelAndTextfieldForPropertyToComposite(Composite composite, String propertyMessage, String key) { Label propertyLabel = new Label(composite, SWT.NONE); propertyLabel.setText(propertyMessage); Point prefSize = propertyLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT); GridData labelData = new GridData(); labelData.widthHint = prefSize.x; propertyLabel.setLayoutData(labelData); final Text propertyText = new Text(composite, SWT.BORDER); GridData gridDataText = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL); propertyText.setLayoutData(gridDataText); propertyText.setData(KEY_KEYS, key); propertyText.addModifyListener(new TextModifyListener(propertyText)); return propertyText; } /** * Listener for writing all configuration into the map when entered. * * @author Sascha Zur */ private class TextModifyListener implements ModifyListener { private final Text text; TextModifyListener(Text text) { this.text = text; } @Override public void modifyText(ModifyEvent arg0) { configurationMap.put((String) text.getData(KEY_KEYS), text.getText()); validate(false); } } /** * Listener allowing to leave the description field by pressing TAB (instead of inserting a tab into the text). * * @author bode_br */ private class DescriptionTraverseListener implements TraverseListener { @Override public void keyTraversed(TraverseEvent e) { if (e.detail == SWT.TRAVERSE_TAB_NEXT) { e.doit = true; } } } private void validate(boolean update) { setMessage(null, DialogPage.NONE); setPageComplete(true); String nameError = StringUtils.checkAgainstCommonInputRules(toolNameText.getText()); if (nameError != null) { setMessage("This tool name is invalid for running the tool via Remote Access:\n " + nameError, DialogPage.WARNING); } if (!iconValid.isEmpty()) { setMessage(iconValid, DialogPage.WARNING); } if (!docValid.isEmpty()) { setMessage(docValid, DialogPage.ERROR); setPageComplete(false); } String name = (String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME); if (name == null || name.trim().isEmpty()) { setMessage(Messages.toolFilenameInvalid, DialogPage.ERROR); setPageComplete(false); } else if ((!update) && usedToolnames.contains((configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME)))) { setMessage(Messages.toolFilenameUsed, DialogPage.ERROR); setPageComplete(false); } if (!nameValid.isEmpty()) { setMessage(nameValid, DialogPage.ERROR); setPageComplete(false); } } /** * Sets a new configurationMap and updates all fields. * * @param newConfigurationMap new map */ @Override public void setConfigMap(Map<String, Object> newConfigurationMap) { if ((String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME) != null) { usedToolnames.add((String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME)); } configurationMap = newConfigurationMap; if (configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME) != null) { usedToolnames.remove(configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME)); } if (configurationMap.get(ToolIntegrationConstants.KEY_UPLOAD_ICON) == null) { configurationMap.put(ToolIntegrationConstants.KEY_UPLOAD_ICON, true); } updatePageValues(); } private void updatePageValues() { if ((String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME) != null) { toolNameText.setText((String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME)); } else { toolNameText.setText(""); } if (configurationMap.get(ToolIntegrationConstants.KEY_TOOL_ICON_PATH) != null) { iconText.setText((String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_ICON_PATH)); } else { iconText.setText(""); } if ((Boolean) configurationMap.get(ToolIntegrationConstants.KEY_UPLOAD_ICON)) { uploadIconToFolder.setSelection(true); } else { uploadIconToFolder.setSelection(false); } if (configurationMap.get(ToolIntegrationConstants.KEY_DOC_FILE_PATH) != null) { documenationText.setText((String) configurationMap.get(ToolIntegrationConstants.KEY_DOC_FILE_PATH)); File pathToOpen = new File(documenationText.getText()); if (!pathToOpen.isAbsolute()) { ToolIntegrationContext context = ((ToolIntegrationWizard) getWizard()).getCurrentContext(); pathToOpen = new File( new File(new File(context.getRootPathToToolIntegrationDirectory(), context.getNameOfToolIntegrationDirectory()), (String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_NAME)), ToolIntegrationConstants.DOCS_DIR_NAME); } docPathChooserButtonListener.setOpenPath(pathToOpen); } else { documenationText.setText(""); } if (configurationMap.get(ToolIntegrationConstants.KEY_TOOL_GROUPNAME) != null) { groupNameText.setText((String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_GROUPNAME)); } else { groupNameText.setText(""); } if (configurationMap.get(ToolIntegrationConstants.KEY_TOOL_DESCRIPTION) != null) { descriptionTextArea.setText((String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_DESCRIPTION)); } else { descriptionTextArea.setText(""); } if (configurationMap.get(ToolIntegrationConstants.KEY_TOOL_INTEGRATOR_NAME) != null) { integratorName.setText((String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_INTEGRATOR_NAME)); } else { integratorName.setText(""); } if (configurationMap.get(ToolIntegrationConstants.KEY_TOOL_INTEGRATOR_EMAIL) != null) { integratorEmail.setText((String) configurationMap.get(ToolIntegrationConstants.KEY_TOOL_INTEGRATOR_EMAIL)); } else { integratorEmail.setText(""); } validate(true); } @Override public void performHelp() { super.performHelp(); IWorkbenchHelpSystem helpSystem = PlatformUI.getWorkbench().getHelpSystem(); helpSystem.displayHelp(HELP_CONTEXT_ID); } @Override public void updatePage() { // TODO Auto-generated method stub } }