/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.workflow.execute; import java.io.ByteArrayInputStream; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; 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.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; import de.rcenvironment.core.component.model.configuration.api.PlaceholdersMetaDataDefinition; import de.rcenvironment.core.component.workflow.execution.api.WorkflowPlaceholderHandler; import de.rcenvironment.core.component.workflow.model.api.WorkflowDescription; import de.rcenvironment.core.component.workflow.model.api.WorkflowNode; import de.rcenvironment.core.gui.workflow.Activator; /** * Dialog for clearing placeholder history. * * @author Sascha Zur */ public class WorkflowPageClearHistoryDialog extends Dialog { private String title; private WorkflowPlaceholderHandler weph; private WorkflowDescription wd; private Map<String, String> guiNameToPlaceholder; private Tree componentPlaceholderTree; private Composite container; private Button deleteAllPasswordHistories; protected WorkflowPageClearHistoryDialog(Shell parentShell, String title, WorkflowPlaceholderHandler pd, WorkflowDescription workflowDescription) { super(parentShell); this.title = title; this.weph = pd; this.wd = workflowDescription; guiNameToPlaceholder = new HashMap<String, String>(); setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.APPLICATION_MODAL); } @Override protected Control createDialogArea(final Composite parent) { container = (Composite) super.createDialogArea(parent); container.setLayout(new GridLayout(1, false)); GridData containergridData = new GridData(GridData.FILL, GridData.FILL, true, true); container.setLayoutData(containergridData); componentPlaceholderTree = new Tree(container, SWT.MULTI | SWT.CHECK); componentPlaceholderTree.setLayoutData(containergridData); componentPlaceholderTree.setHeaderVisible(false); componentPlaceholderTree.setLinesVisible(true); fillTree(); // resize the row height using a MeasureItem listener componentPlaceholderTree.addListener(SWT.MeasureItem, new Listener() { @Override public void handleEvent(Event event) { event.height = 2 * 10; } }); Listener listener = new Listener() { @Override public void handleEvent(Event e) { final TreeItem treeItem = (TreeItem) e.item; parent.getDisplay().asyncExec(new Runnable() { @Override public void run() { treeItem.getParent().getColumn(0).pack(); } }); } }; componentPlaceholderTree.addListener(SWT.Collapse, listener); componentPlaceholderTree.addListener(SWT.Expand, listener); componentPlaceholderTree.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) { checkItems((TreeItem) event.item, ((TreeItem) event.item).getChecked()); } private void checkItems(TreeItem item, boolean checked) { item.setChecked(checked); if (item.getItemCount() > 0) { for (TreeItem it : item.getItems()) { checkItems(it, checked); } } } }); deleteAllPasswordHistories = new Button(container, SWT.CHECK); deleteAllPasswordHistories.setText("Delete ALL password histories"); return container; } private void clearHistory(TreeItem itComp, String parent, boolean isGlobal) { for (WorkflowNode wn : wd.getWorkflowNodes()) { if (wn.getComponentDescription().getName().equals(itComp.getParentItem().getText())) { weph.deletePlaceholderHistory(wn.getComponentDescription().getIdentifier(), guiNameToPlaceholder.get(itComp.getText())); } } } private void fillTree() { TreeColumn column1 = new TreeColumn(componentPlaceholderTree, SWT.LEFT); column1.setText(""); Set<String> componentTypesWithPlaceholder = weph.getIdentifiersOfPlaceholderContainingComponents(); String[] componentTypesWithPlaceholderArray = componentTypesWithPlaceholder.toArray(new String[componentTypesWithPlaceholder.size()]); Arrays.sort(componentTypesWithPlaceholderArray); for (String componentID : componentTypesWithPlaceholderArray) { TreeItem componentIDTreeItem = new TreeItem(componentPlaceholderTree, 0); String componentName = wd.getWorkflowNode(weph.getComponentInstances(componentID).get(0)) .getComponentDescription().getName(); componentIDTreeItem.setText(0, componentName); componentIDTreeItem.setImage(getImage( wd.getWorkflowNode(weph.getComponentInstances(componentID).get(0)))); PlaceholdersMetaDataDefinition metaData = getPlaceholderAttributes(componentName); componentIDTreeItem.setExpanded(true); if (weph.getPlaceholderNameSetOfComponentID(componentID) != null) { List<String> globalPlaceholderOrder = PlaceholderSortUtils.getPlaceholderOrder(weph.getPlaceholderNameSetOfComponentID(componentID), metaData); if (globalPlaceholderOrder == null) { globalPlaceholderOrder = new LinkedList<String>(); } for (String componentPlaceholder : globalPlaceholderOrder) { TreeItem compPHTreeItem = new TreeItem(componentIDTreeItem, 0); String guiName = metaData.getGuiName(componentPlaceholder); guiNameToPlaceholder.put(guiName, componentPlaceholder); compPHTreeItem.setText(0, guiName); compPHTreeItem.setExpanded(true); } } if (weph.getComponentInstances(componentID) != null) { List<String> instancesWithPlaceholder = weph.getComponentInstances(componentID); instancesWithPlaceholder = PlaceholderSortUtils.sortInstancesWithPlaceholderByName(instancesWithPlaceholder, wd); if (instancesWithPlaceholder != null) { String compInstances = instancesWithPlaceholder.get(0); Set<String> unsortedInstancePlaceholder = weph.getPlaceholderNameSetOfComponentInstance(compInstances); List<String> sortedInstancePlaceholder = PlaceholderSortUtils.getPlaceholderOrder(unsortedInstancePlaceholder, metaData); for (String instancePlaceholder : sortedInstancePlaceholder) { TreeItem instancePHTreeItem = new TreeItem(componentIDTreeItem, 0); String guiName = metaData.getGuiName(instancePlaceholder); guiNameToPlaceholder.put(guiName, instancePlaceholder); if (guiName != null) { instancePHTreeItem.setText(0, guiName); } else { instancePHTreeItem.setText(0, instancePlaceholder); } instancePHTreeItem.setExpanded(true); } } } } column1.pack(); } private PlaceholdersMetaDataDefinition getPlaceholderAttributes(String name) { for (WorkflowNode wn : wd.getWorkflowNodes()) { if (wn.getComponentDescription().getName().equals(name)) { return wn.getComponentDescription().getConfigurationDescription() .getComponentConfigurationDefinition().getPlaceholderMetaDataDefinition(); } } return null; } private Image getImage(WorkflowNode element) { byte[] icon = element.getComponentDescription().getIcon16(); Image image; if (icon != null) { image = new Image(Display.getCurrent(), new ByteArrayInputStream(icon)); } else { image = Activator.getInstance().getImageRegistry().get(Activator.IMAGE_RCE_ICON_16); } return image; } @Override public void create() { super.create(); // dialog title getShell().setText(title); for (TreeItem it1 : componentPlaceholderTree.getItems()) { expandItem(it1); } this.getShell().pack(); this.getShell().setSize(this.getShell().getSize().x, this.getShell().getSize().y + 3 * 10); componentPlaceholderTree.getColumn(0).setWidth(container.getSize().x - 5 * 2); } private void expandItem(TreeItem it1) { it1.setExpanded(true); if (it1.getItems().length > 0) { for (TreeItem it2 : it1.getItems()) { expandItem(it2); } } } @Override protected void okPressed() { for (TreeItem it : componentPlaceholderTree.getItems()) { for (TreeItem itComp : it.getItems()) { if (itComp.getChecked()) { clearHistory(itComp, it.getText(), true); } } } if (deleteAllPasswordHistories.getSelection()) { weph.deleteAllPasswordHistories(); } super.okPressed(); } @Override protected Button createButton(Composite parent, int id, String label, boolean defaultButton) { if (id == IDialogConstants.OK_ID) { label = Messages.clear; } return super.createButton(parent, id, label, defaultButton); } }