// ============================================================================
//
// Copyright (C) 2006-2012 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.designer.core.ui.editor.connections;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.draw2d.ActionEvent;
import org.eclipse.draw2d.ActionListener;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.ImageFigure;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.talend.commons.ui.runtime.image.ECoreImage;
import org.talend.commons.ui.runtime.image.EImage;
import org.talend.commons.ui.runtime.image.ImageProvider;
import org.talend.commons.ui.runtime.image.OverlayImage.EPosition;
import org.talend.commons.ui.utils.workbench.gef.SimpleHtmlFigure;
import org.talend.commons.utils.workbench.preferences.GlobalConstant;
import org.talend.core.CorePlugin;
import org.talend.core.model.process.IConnection;
import org.talend.core.ui.images.OverlayImageProvider;
import org.talend.designer.core.model.components.EParameterName;
/**
* DOC nrousseau class global comment. Detailled comment <br/>
*
* $Id: ConnectionTraceFigure.java 77219 2012-01-24 01:14:15Z mhirt $
*
*/
public class ConnectionTraceFigure extends Figure {
private static final String FIELD_SEP = "|"; //$NON-NLS-1$
private static final String FIELD_EQUAL = "="; //$NON-NLS-1$
private static final Color BACKGROUND = new Color(null, 220, 220, 220);
private static final int MAX_VARIABLE_WIDTH = 70;
private static final int MAX_VALUE_WIDTH = 100;
public static final String BREAKPOINT_IMAGE = "icons/breakpoint.png";
private Connection connection;
private boolean maximized;
private ConnectionTraceFigure tooltip = null;
private CollapseFigure collapseButton;
private int contentWidth = 0;
public ConnectionTraceFigure(Connection connection, boolean maximized) {
ToolbarLayout layout = new ToolbarLayout();
setLayoutManager(layout);
// setBorder(new SimpleRaisedBorder());
this.connection = connection;
this.maximized = maximized;
if (maximized) {
tooltip = new ConnectionTraceFigure(connection, false);
this.setToolTip(tooltip);
tooltip.setVisible(false);
}
}
@Override
public void paint(Graphics graphics) {
// see bug 2074
if (GlobalConstant.generatingScreenShoot) {
return;
}
super.paint(graphics);
}
Figure variableFigure = null;
private void setVariableFigureBorder() {
if (variableFigure != null && variableFigure.getBorder() == null)
variableFigure.setBorder(new LineBorder(ColorConstants.darkGray, SWT.LEFT | SWT.BOTTOM | SWT.RIGHT));
}
public void setTraceData(String data, boolean flag, boolean traceFlag) {
if (data != null) {
List childrens = this.getChildren();
childrens.clear();
boolean noVarNameDefined = false;
Figure outlineFigure = new Figure();
outlineFigure.setLayoutManager(new ToolbarLayout(true));
int title1With = 0;
int title2With = 0;
if (tooltip != null) {
collapseButton = new CollapseFigure();
collapseButton.setCollapsed(connection.getConnectionTrace().isCollapse());
collapseButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
connection.getConnectionTrace().setCollapse(!connection.getConnectionTrace().isCollapse());
collapseButton.setCollapsed(connection.getConnectionTrace().isCollapse());
refreshCollapseStatus();
}
});
if (flag == true)
outlineFigure.add(collapseButton);
}
int sepIndex = data.indexOf(FIELD_SEP); // index separator for row name
String dataWithoutRowName = data.substring(sepIndex + 1);
sepIndex = dataWithoutRowName.indexOf(FIELD_SEP);
String lineNumber = dataWithoutRowName.substring(0, sepIndex);
SimpleHtmlFigure titleFigure = new SimpleHtmlFigure();
titleFigure.setText(""); //$NON-NLS-1$
titleFigure.setText("<font color='#0000FF'> <b> " + connection.getConnectionLabel().getLabelText() //$NON-NLS-1$
+ "</b></font>"); //$NON-NLS-1$ //$NON-NLS-2$
if (tooltip != null) {
titleFigure.setBackgroundColor(ColorConstants.white);
titleFigure.setOpaque(false);
}
titleFigure.getPreferredSize().expand(20, 2);
title1With = titleFigure.getPreferredSize().width;
SimpleHtmlFigure titleFigureSe = new SimpleHtmlFigure();
titleFigureSe.setText(" <font color='#808080'>Current row : " + lineNumber + "</font>"); //$NON-NLS-1$ //$NON-NLS-2$
if (tooltip != null) {
titleFigureSe.setBackgroundColor(ColorConstants.white);
titleFigureSe.setOpaque(false);
}
titleFigureSe.getPreferredSize().expand(20, 2);
title2With = titleFigureSe.getPreferredSize().width;
if (flag == true)
outlineFigure.add(titleFigure);
ImageFigure figure = new ImageFigure(getTraceConnectionImage(flag));
outlineFigure.add(figure);
if (flag == true)
outlineFigure.add(titleFigureSe);
outlineFigure.setBorder(new LineBorder(ColorConstants.darkGray, SWT.LEFT | SWT.RIGHT | SWT.TOP | SWT.BOTTOM));
outlineFigure.setOpaque(true);
add(outlineFigure);
Dimension size = titleFigure.getPreferredSize().getCopy();
int variableWidth = 0;
int valueWidth = 0;
String lineInfo = dataWithoutRowName.substring(sepIndex + 1);
ArrayList columnValueList = new ArrayList();
int lastLocation = 0;
int endLocation = lineInfo.indexOf(FIELD_SEP, lastLocation);
while (endLocation != -1) {
columnValueList.add(lineInfo.substring(lastLocation, endLocation + 1));
lastLocation = endLocation + 2;
endLocation = lineInfo.indexOf(FIELD_SEP, lastLocation);
}
if (columnValueList.size() > 0 && connection.traceColumn.size() == 0
&& connection.getPropertyValue(EParameterName.TRACES_CONNECTION_FILTER.getName()) != null) {
Object value = connection.getPropertyValue(EParameterName.TRACES_CONNECTION_FILTER.getName());
lineInfo = "";
for (Object o : columnValueList) {
for (Object o1 : (ArrayList) value) {
if (o1 instanceof HashMap) {
String columnValue = o.toString();
if (columnValue.indexOf("=") > 0) {
if (((HashMap) o1).get(IConnection.TRACE_SCHEMA_COLUMN).toString().equals(
columnValue.substring(0, columnValue.indexOf("=")).trim())
&& Boolean.TRUE.toString().equals(
((HashMap) o1).get(IConnection.TRACE_SCHEMA_COLUMN_CHECKED).toString())) {
lineInfo += columnValue;
break;
}
}
}
}
}
}
if (columnValueList.size() > 0 && (connection.traceColumn.size() > 0 || connection.setNullColumn == true)) {
lineInfo = "";
Object value = connection.getPropertyValue(EParameterName.TRACES_CONNECTION_FILTER.getName());
int columnNum = 0;
for (Object o : columnValueList) {
if (connection.traceColumn != null && connection.traceColumn.contains(columnNum))
lineInfo += o.toString();
else {
for (Object o1 : (ArrayList) value) {
if (((HashMap) o1).get(IConnection.TRACE_SCHEMA_COLUMN).toString().equals(
o.toString().substring(0, o.toString().indexOf("=")).trim())
&& Boolean.TRUE.toString().equals(
((HashMap) o1).get(IConnection.TRACE_SCHEMA_COLUMN_CHECKED).toString())) {
lineInfo += o.toString();
break;
}
}
}
columnNum++;
}
}
StringTokenizer st = new StringTokenizer(lineInfo, FIELD_SEP);
while (st.hasMoreTokens()) {
String str = st.nextToken();
int valueStart = str.indexOf(FIELD_EQUAL);
if (valueStart != -1) {
String formatedVariable = "<font color='#000000'> <b>" + str.substring(0, valueStart) //$NON-NLS-1$
+ "</b></font>"; //$NON-NLS-1$
String formatedValue = "<font color='#FF8040'> <b>" + str.substring(valueStart + 1) + "</b></font>"; //$NON-NLS-1$ //$NON-NLS-2$
SimpleHtmlFigure var = new SimpleHtmlFigure();
var.setText(formatedVariable);
SimpleHtmlFigure value = new SimpleHtmlFigure();
value.setText(formatedValue);
Dimension varSize = var.getPreferredSize();
varSize.expand(0, 3);
var.setPreferredSize(varSize);
if (varSize.width > variableWidth) {
variableWidth = varSize.width;
}
Dimension valueSize = value.getPreferredSize();
valueSize.expand(0, 3);
value.setPreferredSize(valueSize);
if (valueSize.width > valueWidth) {
valueWidth = valueSize.width;
}
size.expand(0, varSize.height);
} else {
noVarNameDefined = true;
String formatedValue = "<font color='#FF8040'> <b>" + str + "</b></font>"; //$NON-NLS-1$ //$NON-NLS-2$
SimpleHtmlFigure value = new SimpleHtmlFigure();
value.setText(formatedValue);
Dimension valueSize = value.getPreferredSize();
if (valueSize.width > valueWidth) {
valueWidth = valueSize.width;
}
size.expand(0, valueSize.height);
}
}
variableWidth += 10;
valueWidth += 10;
if (variableWidth < title1With) {
variableWidth = title1With;
}
if (valueWidth < title2With) {
valueWidth = title2With;
}
// if (maximized) {
if (variableWidth < MAX_VARIABLE_WIDTH) {
variableWidth = MAX_VARIABLE_WIDTH;
}
if (valueWidth < MAX_VALUE_WIDTH) {
valueWidth = MAX_VALUE_WIDTH;
}
// }
if ((variableWidth + valueWidth) < titleFigure.getPreferredSize().width) {
valueWidth = titleFigure.getPreferredSize().width - variableWidth;
}
if (noVarNameDefined) {
if (titleFigure.getPreferredSize().width > valueWidth) {
valueWidth = titleFigure.getPreferredSize().width;
}
}
st = new StringTokenizer(lineInfo, FIELD_SEP);
int nbVar = 0;
while (st.hasMoreTokens()) {
String str = st.nextToken();
int valueStart = str.indexOf(FIELD_EQUAL);
if (valueStart != -1) {
String formatedVariable = "<font color='#000000'> <b>" + str.substring(0, valueStart) //$NON-NLS-1$
+ "</b></font>"; //$NON-NLS-1$
String formatedValue = "<font color='#FF8040'> <b>" + str.substring(valueStart + 1) + "</b></font>"; //$NON-NLS-1$ //$NON-NLS-2$
SimpleHtmlFigure var = new SimpleHtmlFigure();
var.setText(formatedVariable);
SimpleHtmlFigure value = new SimpleHtmlFigure();
value.setText(formatedValue);
Dimension valueSize = value.getPreferredSize();
valueSize.expand(0, 3);
value.setPreferredSize(valueSize);
value.setPreferredSize(valueWidth, valueSize.height);
var.setBorder(new LineBorder(ColorConstants.darkGray, SWT.RIGHT));
Dimension varSize = var.getPreferredSize();
varSize.expand(0, 3);
var.setPreferredSize(varSize);
var.setPreferredSize(variableWidth, varSize.height);
ToolbarLayout variableLayout = new ToolbarLayout(true);
variableFigure = new Figure();
variableFigure.setLayoutManager(variableLayout);
variableFigure.add(var);
variableFigure.add(value);
if (flag == true)
add(variableFigure);
} else {
String formatedValue = "<font color='#FF8040'> <b> " + str + "</b></font>"; //$NON-NLS-1$ //$NON-NLS-2$
SimpleHtmlFigure value = new SimpleHtmlFigure();
value.setText(formatedValue);
Dimension valueSize = value.getPreferredSize();
valueSize.expand(0, 3);
value.setPreferredSize(valueSize);
value.setPreferredSize(valueWidth, valueSize.height);
ToolbarLayout variableLayout = new ToolbarLayout(true);
variableFigure = new Figure();
variableFigure.setLayoutManager(variableLayout);
variableFigure.add(value);
if (flag == true)
add(variableFigure);
}
if (tooltip != null) {
variableFigure.setBorder(new LineBorder(ColorConstants.darkGray, SWT.LEFT | SWT.RIGHT));
}
variableFigure.setOpaque(true);
if ((nbVar % 2) != 0) {
if (tooltip != null) {
variableFigure.setBackgroundColor(ColorConstants.white);
}
} else {
variableFigure.setBackgroundColor(BACKGROUND);
}
nbVar++;
}
if (tooltip != null) {
if (variableFigure != null) {
variableFigure.setBorder(new LineBorder(ColorConstants.darkGray, SWT.LEFT | SWT.BOTTOM | SWT.RIGHT));
}
}
if (maximized)
this.setVariableFigureBorder();
if (noVarNameDefined) {
size.width = valueWidth;
} else {
size.width = variableWidth + valueWidth;
}
if (size.width < titleFigure.getPreferredSize().width) {
size.width = titleFigure.getPreferredSize().width;
}
// size.width = size.width * 2;
size.expand(5, 3);
setPreferredSize(size);
setVisible(true);
if (!flag) {
this.remove(outlineFigure);
add(figure);
}
} else {
if (traceFlag) {
Image enableImage = getTraceConnectionImage(flag);
setPreferredSize(enableImage.getImageData().width, enableImage.getImageData().height);
this.getChildren().clear();
ImageFigure figure = new ImageFigure(enableImage);
add(figure);
setVisible(true);
} else {
setPreferredSize(0, 0);
setVisible(false);
}
}
if (tooltip != null) {
if (flag) {
tooltip.setTraceData(data, flag, traceFlag);
} else {
tooltip.setTraceData(data, flag, false);
}
}
contents = new ArrayList(getChildren());
refreshCollapseStatus();
}
/**
*
* cLi Comment method "getTraceConnectionImage".
*
* feature 6355.
*/
private Image getTraceConnectionImage(boolean enable) {
Image image = null;
if (enable) {
image = ImageProvider.getImage(ECoreImage.TRACE_ON);
} else {
image = ImageProvider.getImage(ECoreImage.TRACE_OFF);
}
if (connection.getElementParameter(EParameterName.ACTIVEBREAKPOINT.getName()) != null) {
if ((Boolean) connection.getElementParameter(EParameterName.ACTIVEBREAKPOINT.getName()).getValue()
&& (Boolean) connection.getElementParameter(EParameterName.TRACES_CONNECTION_ENABLE.getName()).getValue()) {
image = ImageProvider.getImage(CorePlugin.getImageDescriptor(BREAKPOINT_IMAGE));
} else {
}
}
if (image != null && connection.getCondition() != null) {
image = OverlayImageProvider.getImageForOverlay(image, EImage.INFORMATION_SMALL, EPosition.BOTTOM_LEFT);
}
return image;
}
private List contents = null;
/**
* Refresh the collapse status of the content table according to the selection of collapse button.
*/
private void refreshCollapseStatus() {
if (collapseButton == null) {
return;
}
boolean collapse = connection.getConnectionTrace().isCollapse();
if (collapse) {
List list = new ArrayList(getChildren());
for (int i = 1; i < list.size(); i++) {
remove((IFigure) list.get(i));
}
IFigure figure = (IFigure) contents.get(0);
this.getPreferredSize().height = figure.getPreferredSize().height;
if (contentWidth <= this.getPreferredSize().width) {
contentWidth = this.getPreferredSize().width;
} else {
this.getPreferredSize().width = contentWidth;
}
setPreferredSize(getPreferredSize());
} else {
removeAll();
for (int i = 0; i < contents.size(); i++) {
IFigure figure = (IFigure) contents.get(i);
add(figure);
}
IFigure figure = (IFigure) contents.get(0);
this.getPreferredSize().height = figure.getPreferredSize().height * contents.size();
if (contentWidth <= this.getPreferredSize().width) {
contentWidth = this.getPreferredSize().width;
} else {
this.getPreferredSize().width = contentWidth;
}
setPreferredSize(getPreferredSize());
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
*/
@Override
public Dimension getPreferredSize(int hint, int hint2) {
// TODO Auto-generated method stub
return super.getPreferredSize(hint, hint2);
}
}