// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.mdm.repository.ui.dialogs.impact;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
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 org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.mdm.repository.core.service.ModelImpactAnalyseService;
import org.talend.mdm.repository.core.service.ModelImpactAnalyseService.Change;
import org.talend.mdm.repository.core.service.ModelImpactAnalyseService.EntitiesToDrop;
import org.talend.mdm.repository.core.service.ModelImpactAnalyseService.ImpactOperation;
import org.talend.mdm.repository.core.service.ModelImpactAnalyseService.Result;
import org.talend.mdm.repository.i18n.Messages;
import org.talend.mdm.repository.plugin.RepositoryPlugin;
import org.talend.mdm.repository.utils.EclipseResourceManager;
import com.amalto.workbench.MDMWorbenchPlugin;
/**
* created by HHB on 2014-3-11 Detailled comment
*
*/
public class ImpactResultDialog extends Dialog {
private class TreeContentProvider implements ITreeContentProvider {
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@Override
public void dispose() {
}
@Override
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof Collection) {
return ((Collection) parentElement).toArray();
} else if (parentElement instanceof IRepositoryViewObject) {
Result result = input.get(parentElement);
List changes = result.getChanges();
EntitiesToDrop entitiesToDrop = result.getEntitiesToDrop();
if (entitiesToDrop != null && entitiesToDrop.getEntities() != null && !entitiesToDrop.getEntities().isEmpty()) {
changes.add(entitiesToDrop);
}
if (changes != null) {
return changes.toArray();
}
} else if (parentElement instanceof EntitiesToDrop) {
List<String> entities = ((EntitiesToDrop) parentElement).getEntities();
return entities.toArray();
}
return new Object[0];
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
}
private static final String[] OPERATIONS_HIGH = { Messages.ModelImpactAnalyseService_recreateTable,
Messages.ModelImpactAnalyseService_cancelDeploying };
private static final String[] OPERATIONS_FULL = { Messages.ModelImpactAnalyseService_recreateTable,
Messages.ModelImpactAnalyseService_applyChange, Messages.ModelImpactAnalyseService_cancelDeploying };
private static final String[] OPERATIONS_LITE = { Messages.ModelImpactAnalyseService_applyChange,
Messages.ModelImpactAnalyseService_cancelDeploying };
private TreeViewer treeViewer;
private final Map<IRepositoryViewObject, Result> input;
private final Map<IRepositoryViewObject, ImpactOperation> result = new HashMap<IRepositoryViewObject, ModelImpactAnalyseService.ImpactOperation>();
private static final Image IMG_MODEL = EclipseResourceManager.getImage(RepositoryPlugin.PLUGIN_ID, "icons/datamodel.png"); //$NON-NLS-1$;
private static final Image IMG_ENTITY = EclipseResourceManager.getImage(MDMWorbenchPlugin.ID, "icons/concept.png"); //$NON-NLS-1$;
private static final Image IMG_HIGH = EclipseResourceManager.getImage(RepositoryPlugin.PLUGIN_ID, "icons/high.gif"); //$NON-NLS-1$;
private static final Image IMG_MEDIUM = EclipseResourceManager.getImage(RepositoryPlugin.PLUGIN_ID, "icons/medium.gif"); //$NON-NLS-1$;
private static final Image IMG_LOW = EclipseResourceManager.getImage(RepositoryPlugin.PLUGIN_ID, "icons/low.gif"); //$NON-NLS-1$;
private class ViewerLabelProvider extends LabelProvider implements ITableLabelProvider {
@Override
public Image getImage(Object element) {
return super.getImage(element);
}
@Override
public String getText(Object element) {
return super.getText(element);
}
@Override
public Image getColumnImage(Object element, int columnIndex) {
if (columnIndex == 0) {
if (element instanceof IRepositoryViewObject) {
return IMG_MODEL;
} else if (element instanceof Change) {
switch (((Change) element).getSeverity()) {
case ModelImpactAnalyseService.HIGH:
return IMG_HIGH;
case ModelImpactAnalyseService.MEDIUM:
return IMG_MEDIUM;
case ModelImpactAnalyseService.LOW:
return IMG_LOW;
}
} else if (element instanceof String) {
return IMG_ENTITY;
}
}
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
if (element instanceof IRepositoryViewObject) {
IRepositoryViewObject viewObject = (IRepositoryViewObject) element;
if (columnIndex == 0) {
return viewObject.getLabel();
} else if (columnIndex == 2) {
ImpactOperation operation = getOperation(viewObject);
return operation.getDescription();
}
} else if (element instanceof Change) {
Change change = (Change) element;
switch (columnIndex) {
case 0:
return change.getMessage();
case 1:
switch (change.getSeverity()) {
case ModelImpactAnalyseService.HIGH:
return Messages.ImpactResultDialog_high;
case ModelImpactAnalyseService.MEDIUM:
return Messages.ImpactResultDialog_medium;
case ModelImpactAnalyseService.LOW:
return Messages.ImpactResultDialog_low;
}
break;
case 2:
}
} else if (element instanceof EntitiesToDrop && columnIndex == 0) {
return Messages.ImpactResultDialog_recreatedEntities;
} else if (element instanceof String && columnIndex == 0) {
return (String) element;
}
return ""; //$NON-NLS-1$
}
}
public ImpactResultDialog(Shell parentShell, Map<IRepositoryViewObject, Result> changes) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
this.input = changes;
}
/**
* Create contents of the dialog.
*
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
container.setLayout(new GridLayout(1, false));
Label messageLabel = new Label(container, SWT.WRAP);
messageLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
messageLabel.setText(Messages.ImpactResultDialog_titleMessage);
treeViewer = new TreeViewer(container, SWT.BORDER | SWT.FULL_SELECTION);
Tree tree = treeViewer.getTree();
tree.setHeaderVisible(true);
GridData gd_tree = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
gd_tree.verticalIndent = 5;
tree.setLayoutData(gd_tree);
TreeColumn changeColumn = new TreeColumn(tree, SWT.NONE);
changeColumn.setWidth(340);
changeColumn.setText(Messages.ImpactResultDialog_modelChange);
TreeColumn levelColumn = new TreeColumn(tree, SWT.NONE);
levelColumn.setWidth(60);
levelColumn.setText(Messages.ImpactResultDialog_level);
TreeColumn operationColumn = new TreeColumn(tree, SWT.NONE);
operationColumn.setWidth(130);
operationColumn.setText(Messages.ImpactResultDialog_operation);
Group grpLevel = new Group(container, SWT.NONE);
grpLevel.setText(Messages.ImpactResultDialog_changeLegend);
grpLevel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
grpLevel.setLayout(new GridLayout(2, false));
CLabel lowLabel = new CLabel(grpLevel, SWT.NONE);
lowLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
lowLabel.setText(Messages.ImpactResultDialog_low);
lowLabel.setImage(IMG_LOW);
Label lowMsgLabel = new Label(grpLevel, SWT.WRAP);
lowMsgLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
lowMsgLabel.setText(Messages.ImpactResultDialog_lowMessage);
CLabel mediumLabel = new CLabel(grpLevel, SWT.NONE);
mediumLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
mediumLabel.setText(Messages.ImpactResultDialog_medium);
mediumLabel.setImage(IMG_MEDIUM);
Label mediumMsgLabel = new Label(grpLevel, SWT.WRAP);
mediumMsgLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
mediumMsgLabel.setText(Messages.ImpactResultDialog_mediumMessage);
CLabel highLabel = new CLabel(grpLevel, SWT.NONE);
highLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
highLabel.setText(Messages.ImpactResultDialog_high);
highLabel.setImage(IMG_HIGH);
Label highMsgLabel = new Label(grpLevel, SWT.WRAP);
highMsgLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
highMsgLabel.setText(Messages.ImpactResultDialog_highMessage);
treeViewer.setContentProvider(new TreeContentProvider());
treeViewer.setLabelProvider(new ViewerLabelProvider());
initTree();
return container;
}
private int getCurrentTopSeverityLevel(IRepositoryViewObject viewObj) {
Result result = input.get(viewObj);
List<Change> changes = result.getChanges();
int level = 0;
for (Change change : changes) {
if (change.getSeverity() > level) {
level = change.getSeverity();
}
}
return level;
}
private ImpactOperation getOperation(IRepositoryViewObject viewObj) {
ImpactOperation operation = result.get(viewObj);
if (operation == null) {
int topLevel = getCurrentTopSeverityLevel(viewObj);
if (topLevel == ModelImpactAnalyseService.LOW || topLevel == ModelImpactAnalyseService.MEDIUM) {
operation = ImpactOperation.APPLY_LOW_CHANGE;
} else {
operation = ImpactOperation.CANCEL;
}
result.put(viewObj, operation);
}
return operation;
}
private void initTree() {
treeViewer.setInput(input.keySet());
Tree tree = treeViewer.getTree();
TreeItem[] tableItems = tree.getItems();
System.out.println(tableItems.length);
for (TreeItem item : tableItems) {
Object data = item.getData();
if (data != null && data instanceof IRepositoryViewObject) {
final IRepositoryViewObject viewObj = (IRepositoryViewObject) data;
final TreeEditor editor = new TreeEditor(tree);
final CCombo combo = new CCombo(tree, SWT.READ_ONLY);
// combo.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
String[] items = getDefaultComboItems(viewObj);
combo.setItems(items);
ImpactOperation operation = getOperation(viewObj);
combo.setText(operation.getDescription());
combo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
modifyOperationValue(viewObj, combo.getSelectionIndex());
}
});
editor.grabHorizontal = true;
editor.setEditor(combo, item, 2);
}
}
//
treeViewer.expandAll();
}
private void modifyOperationValue(IRepositoryViewObject viewObj, int index) {
if (index < 0) {
return;
}
int severity = getCurrentTopSeverityLevel(viewObj);
switch (severity) {
case ModelImpactAnalyseService.LOW:
index += 1;
break;
case ModelImpactAnalyseService.MEDIUM:
break;
case ModelImpactAnalyseService.HIGH:
if (index > 0) {
index = 2;
}
break;
}
ImpactOperation operation = ImpactOperation.getOperation(index);
result.put(viewObj, operation);
}
private String[] getDefaultComboItems(IRepositoryViewObject viewObj) {
int severity = getCurrentTopSeverityLevel(viewObj);
switch (severity) {
case ModelImpactAnalyseService.LOW:
return OPERATIONS_LITE;
case ModelImpactAnalyseService.MEDIUM:
return OPERATIONS_FULL;
case ModelImpactAnalyseService.HIGH:
return OPERATIONS_HIGH;
default:
return new String[0];
}
}
/**
* Create contents of the button bar.
*
* @param parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
}
/**
* Return the initial size of the dialog.
*/
@Override
protected Point getInitialSize() {
return new Point(580, 495);
}
public Map<IRepositoryViewObject, ImpactOperation> getImpactConfiguration() {
return result;
}
}