/**
*
*/
package org.jboss.tools.smooks.gef.tree.figures;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.GridData;
import org.eclipse.draw2d.GridLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.MouseEvent;
import org.eclipse.draw2d.MouseMotionListener;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator;
import org.jboss.tools.smooks.configuration.editors.GraphicsConstants;
import org.jboss.tools.smooks.gef.tree.editpolicy.IShowHighlighFigure;
import org.jboss.tools.smooks.gef.tree.model.TreeContainerModel;
/**
* @author DartPeng
*
*/
public class TreeContainerFigure extends Figure implements ISelectableFigure,
IShowHighlighFigure {
private IFigure headerFigure;
private IFigure contentFigure;
private Label label;
private TreeContainerModel model;
private Color targetHeaderColor = GraphicsConstants.TB_BG_CORLOR;
private Color sourceHeaderColor = ColorConstants.orange;
protected Color targetHeaderSelectedColor = GraphicsConstants.BORDER_CORLOR;// FigureUtilities.lighter(targetHeaderColor);
protected Color sourceHeaderSelectedColor = FigureUtilities
.lighter(sourceHeaderColor);
private boolean focus;
private boolean selected;
private Color highlightColor = null;
private boolean showHightlight = false;
private IFigure dragLinkFigure = null;
private boolean showDragLink = false;
private boolean isSource = true;
private Font oldLabelFont;
public TreeContainerFigure(TreeContainerModel model) {
super();
this.model = model;
this.addChildrenFigures();
hookFigure();
}
/**
* @return the isSource
*/
public boolean isSource() {
return isSource;
}
/**
* @param isSource
* the isSource to set
*/
public void setSource(boolean isSource) {
this.isSource = isSource;
}
protected void hookFigure() {
this.addMouseMotionListener(new MouseMotionListener() {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseMotionListener#mouseDragged(org.eclipse
* .draw2d.MouseEvent)
*/
public void mouseDragged(MouseEvent me) {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseMotionListener#mouseEntered(org.eclipse
* .draw2d.MouseEvent)
*/
public void mouseEntered(MouseEvent me) {
showDragLink = true;
dragLinkFigure.repaint();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseMotionListener#mouseExited(org.eclipse
* .draw2d.MouseEvent)
*/
public void mouseExited(MouseEvent me) {
showDragLink = false;
dragLinkFigure.repaint();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseMotionListener#mouseHover(org.eclipse
* .draw2d.MouseEvent)
*/
public void mouseHover(MouseEvent me) {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseMotionListener#mouseMoved(org.eclipse
* .draw2d.MouseEvent)
*/
public void mouseMoved(MouseEvent me) {
}
});
}
protected void addChildrenFigures() {
IFigure headerContainerFigure = new Figure();
GridLayout gl = new GridLayout();
gl.numColumns = 2;
headerContainerFigure.setLayoutManager(gl);
headerFigure = new Figure() {
@Override
protected void paintFigure(Graphics graphics) {
super.paintFigure(graphics);
drawHeaderFigure(graphics);
}
@Override
public Dimension getPreferredSize(int hint, int hint2) {
Dimension size = super.getPreferredSize(hint, hint2);
int width = Math.max(size.width, 100);
return new Dimension(width, 25);
}
};
headerFigure.add(headerContainerFigure);
label = new Label();
headerContainerFigure.add(label);
ToolbarLayout layout = new ToolbarLayout();
layout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
GridData gd = new GridData(GridData.FILL_BOTH);
gl.setConstraint(label, gd);
dragLinkFigure = new DragLinkFigure() {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics
* )
*/
@Override
protected void paintFigure(Graphics graphics) {
super.paintFigure(graphics);
if (showDragLink) {
if (model instanceof TreeContainerModel) {
if (!((TreeContainerModel) model).canDragLink()) {
return;
}
}
Image img = SmooksConfigurationActivator.getDefault()
.getImageRegistry()
.get(GraphicsConstants.IMAGE_DRAG_LINK);
if (img != null) {
graphics.drawImage(img, getLocation());
}
}
}
};
dragLinkFigure.addMouseMotionListener(new MouseMotionListener() {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseMotionListener#mouseDragged(org.eclipse
* .draw2d.MouseEvent)
*/
public void mouseDragged(MouseEvent me) {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseMotionListener#mouseEntered(org.eclipse
* .draw2d.MouseEvent)
*/
public void mouseEntered(MouseEvent me) {
showDragLink = true;
dragLinkFigure.repaint();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseMotionListener#mouseExited(org.eclipse
* .draw2d.MouseEvent)
*/
public void mouseExited(MouseEvent me) {
showDragLink = false;
dragLinkFigure.repaint();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseMotionListener#mouseHover(org.eclipse
* .draw2d.MouseEvent)
*/
public void mouseHover(MouseEvent me) {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.draw2d.MouseMotionListener#mouseMoved(org.eclipse
* .draw2d.MouseEvent)
*/
public void mouseMoved(MouseEvent me) {
}
});
dragLinkFigure.setSize(16, 16);
gd = new GridData();
gd.horizontalAlignment = GridData.END;
gl.setConstraint(dragLinkFigure, gd);
headerContainerFigure.add(dragLinkFigure);
headerFigure.setLayoutManager(layout);
headerFigure.setOpaque(true);
contentFigure = new Figure();
contentFigure.setLayoutManager(new ToolbarLayout());
this.add(headerFigure);
this.add(contentFigure);
ToolbarLayout tl = new ToolbarLayout();
tl.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
this.setLayoutManager(tl);
}
protected void drawHeaderFigure(Graphics graphics) {
try {
graphics.pushState();
Color currentColor = sourceHeaderColor;
// label.getFont().getFontData()[0].setStyle(SWT.NORMAL);
if (!isSource)
currentColor = targetHeaderColor;
if (isSelected() || isFocus() || showHightlight) {
// label.getFont().getFontData()[0].setStyle(SWT.BOLD);
currentColor = sourceHeaderSelectedColor;
if (!isSource)
currentColor = targetHeaderSelectedColor;
}
if (showHightlight && highlightColor != null) {
currentColor = highlightColor;
}
graphics.setForegroundColor(currentColor);
graphics.setBackgroundColor(ColorConstants.white);
graphics.fillGradient(headerFigure.getBounds().expand(30, 0), true);
graphics.setForegroundColor(currentColor);
graphics.drawLine(getBounds().getBottomLeft().translate(0, -1),
getBounds().getBottomRight().translate(0, -1));
graphics.popState();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @return the label
*/
public Label getLabel() {
return label;
}
/**
* @param label
* the label to set
*/
public void setLabel(Label label) {
this.label = label;
}
public IFigure getContentFigure() {
return contentFigure;
}
public Color getHeaderColor() {
return targetHeaderColor;
}
public void setHeaderColor(Color headerColor) {
this.targetHeaderColor = headerColor;
}
public Rectangle getBounds() {
Rectangle rect = super.getBounds();
if (getLayoutManager() != null) {
Dimension d = getLayoutManager().getPreferredSize(this, -1, -1);
rect.setSize(d);
}
return rect;
}
@Override
protected void paintBorder(Graphics graphics) {
// if(true){
// super.paintBorder(graphics);
// return;
// }
try {
graphics.setLineStyle(SWT.LINE_SOLID);
graphics.setForegroundColor(ColorConstants.buttonDarkest);
if (isSelected() || isFocus()) {
graphics.setForegroundColor(ColorConstants.blue);
graphics.setLineStyle(SWT.LINE_DOT);
}
if (showHightlight && highlightColor != null) {
graphics.setForegroundColor(FigureUtilities
.darker(highlightColor));
graphics.setLineStyle(SWT.LINE_DOT);
}
Rectangle drawnRectangle = new Rectangle(getBounds().x,
getBounds().y, getBounds().width - 1,
getBounds().height - 1);
graphics.drawRoundRectangle(drawnRectangle, 5, 5);
} catch (Exception e) {
e.printStackTrace();
}
}
public void setText(String text) {
if (label != null) {
label.setText(text);
}
}
public TreeContainerModel getModel() {
return model;
}
public void setModel(TreeContainerModel model) {
this.model = model;
}
@Override
protected void paintFigure(Graphics graphics) {
super.paintFigure(graphics);
graphics.pushState();
graphics.setAlpha(190);
graphics.setBackgroundColor(ColorConstants.white);
graphics.fillRectangle(getBounds());
graphics.popState();
}
public void setIcon(Image i) {
if (label != null) {
label.setIcon(i);
}
}
/**
* @return the headerFigure
*/
public IFigure getHeaderFigure() {
return headerFigure;
}
/**
* @param headerFigure
* the headerFigure to set
*/
public void setHeaderFigure(IFigure headerFigure) {
this.headerFigure = headerFigure;
}
/**
* @return the focus
*/
public boolean isFocus() {
return focus;
}
/**
* @param focus
* the focus to set
*/
public void setFocus(boolean focus) {
this.focus = focus;
}
/**
* @return the selected
*/
public boolean isSelected() {
return selected;
}
/**
* @param selected
* the selected to set
*/
public void setSelected(boolean selected) {
this.selected = selected;
repaint();
}
/**
* @param contentFigure
* the contentFigure to set
*/
public void setContentFigure(IFigure contentFigure) {
this.contentFigure = contentFigure;
// this.repaint(0,0,0,0);
repaint();
}
public void showbackOldbackgroundColor(Color color) {
showHightlight = false;
highlightColor = null;
repaint();
}
public void showHighlightBackgroudColor(Color color) {
showHightlight = true;
highlightColor = color;
repaint();
}
}