/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.ui.editor.figures;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.draw2d.*;
import org.eclipse.draw2d.geometry.*;
import org.eclipse.gef.handles.HandleBounds;
import org.jboss.tools.common.gef.GEFGraphicalViewer;
import org.jboss.tools.jsf.ui.editor.edit.GroupEditPart;
import org.jboss.tools.jsf.ui.editor.figures.xpl.FixedConnectionAnchor;
import org.jboss.tools.jsf.ui.editor.model.IGroup;
import org.jboss.tools.jsf.ui.editor.model.IPage;
import org.jboss.tools.jsf.ui.editor.print.PrintIconHelper;
public class GroupFigure extends NodeFigure implements HandleBounds,
FigureListener, MouseListener, MouseMotionListener, KeyListener {
private static final Dimension SIZE = new Dimension(56, 100);
private Image icon = null;
public IGroup group;
private Label label = null;
PointList fillPointlist, fill2Pointlist, shadowPointlist, shadow2Pointlist;
String path;
GroupEditPart editPart;
public void setGroupEditPart(GroupEditPart part) {
editPart = part;
}
public void setBounds(Rectangle rect) {
super.setBounds(rect);
resizeFigure();
}
public void setConstraint(IFigure child, Object constraint) {
super.setConstraint(child, constraint);
}
public void setPath(String path) {
this.path = path;
if (label != null) {
label.setText(path);
label.setSize(label.getPreferredSize());
}
}
public void refreshFont() {
if (label != null) {
label.setFont(group.getJSFModel().getOptions().getViewPathFont());
label.setSize(label.getPreferredSize());
label.setLocation(new Point(getLocation().x - 5, getLocation().y
- (12 + group.getJSFModel().getOptions().getViewPathFont()
.getFontData()[0].getHeight())));
}
}
public void setIcon(Image i) {
icon = PrintIconHelper.getPrintImage(i);
}
public void addNotify() {
if (group == null)
return;
label = new Label(path);
label.setFont(group.getJSFModel().getOptions().getViewPathFont());
getParent().add(label);
label.setForegroundColor(ColorConstants.black);
label.setOpaque(false);
label.setText(path);
label.setVisible(true);
label.setSize(label.getPreferredSize());
label.setLocation(new Point(getLocation().x - 5, getLocation().y
- (12 + group.getJSFModel().getOptions().getViewPathFont()
.getFontData()[0].getHeight())));
label.addMouseListener(this);
}
public void removeNotify() {
if (group == null)
return;
label.removeMouseListener(this);
getParent().remove(label);
}
public void figureMoved(IFigure source) {
if (group != null)
label.setLocation(new Point(getLocation().x - 5,
getLocation().y - 20));
}
public void init(int number) {
FixedConnectionAnchor c;
if (number == 0)
number = 1;
for (int i = 0; i < number; i++) {
c = new FixedConnectionAnchor(this);
c.offsetV = 32 + LINK_HEIGHT * i;
c.leftToRight = false;
connectionAnchors.put((i + 1) + "_OUT", c); //$NON-NLS-1$
outputConnectionAnchors.addElement(c);
}
}
public void addConnectionAnchor(int number) {
FixedConnectionAnchor c;
if (number == 1)
return;
c = new FixedConnectionAnchor(this);
c.offsetV = 32 + LINK_HEIGHT * (number - 1);
// c.offsetH = -1;
c.leftToRight = false;
connectionAnchors.put(number + "_OUT", c); //$NON-NLS-1$
outputConnectionAnchors.addElement(c);
}
public void removeConnectionAnchor() {
if (outputConnectionAnchors.size() == 1)
return;
outputConnectionAnchors.remove(outputConnectionAnchors.size() - 1);
}
public void removeAllConnectionAnchor() {
outputConnectionAnchors.removeAllElements();
}
public GroupFigure(IGroup group) {
this.group = group;
if (group != null) {
setIcon(group.getImage());
setPath(group.getVisiblePath());
}
setOpaque(false);
setLayoutManager(new XYLayout());
resizeFigure();
addFigureListener(this);
addKeyListener(this);
setBorder(new GroupBorder(blackColor));
if (group != null) {
FixedConnectionAnchor c;
c = new FixedConnectionAnchor(this);
c.offsetV = 8;
c.offsetH = -1;
connectionAnchors.put("1_IN", c); //$NON-NLS-1$
inputConnectionAnchors.addElement(c);
if (group.getPageList().size() <= 1)
init(group.getListOutputLinks().size());
}
}
/**
* @see org.eclipse.gef.handles.HandleBounds#getHandleBounds()
*/
public Rectangle getHandleBounds() {
return getBounds().getCropped(new Insets(0, 0, 0, 0));
}
/**
* @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
*/
public Dimension getPreferredSize(int wHint, int hHint) {
return SIZE;
}
int width, height;
private void resizeFigure() {
if (width == getSize().width && height == getSize().height)
return;
int start = 0;
width = getSize().width - 1;
height = getSize().height - 1;
if (group != null && group.isPattern()) {
start += 3;
height -= 1;
}
fillPointlist = new PointList();
fillPointlist.addPoint(start, 20);
fillPointlist.addPoint(start + 23, 20);
fillPointlist.addPoint(start + 23, 0);
fillPointlist.addPoint(width - 15, 0);
fillPointlist.addPoint(width - 1, 14);
fillPointlist.addPoint(width - 1, height - 1);
fillPointlist.addPoint(start, height - 1);
if (group != null && group.isPattern()) {
fill2Pointlist = new PointList();
fill2Pointlist.addPoint(0, 3);
fill2Pointlist.addPoint(1, 2);
fill2Pointlist.addPoint(3, 2);
fill2Pointlist.addPoint(3, getSize().height - 3);
fill2Pointlist.addPoint(width - 6, getSize().height - 3);
fill2Pointlist.addPoint(width - 6, getSize().height - 1);
fill2Pointlist.addPoint(1, getSize().height - 1);
fill2Pointlist.addPoint(0, getSize().height - 2);
}
shadowPointlist = new PointList();
shadowPointlist.addPoint(width - 15, 0);
shadowPointlist.addPoint(width - 14, 4);
shadowPointlist.addPoint(width - 15, 7);
shadowPointlist.addPoint(width - 18, 10);
shadowPointlist.addPoint(width - 1, 14);
shadowPointlist.addPoint(width - 9, 14);
shadowPointlist.addPoint(width - 16, 13);
shadowPointlist.addPoint(width - 21, 11);
shadowPointlist.addPoint(width - 18, 8);
shadowPointlist.addPoint(width - 16, 4);
shadow2Pointlist = new PointList();
shadow2Pointlist.addPoint(width - 15, 0);
shadow2Pointlist.addPoint(width - 1, 14);
shadow2Pointlist.addPoint(width - 3, 14);
shadow2Pointlist.addPoint(width - 15, 2);
}
/**
* @see org.eclipse.draw2d.Figure#paintFigure(Graphics)
*/
protected void paintFigure(Graphics g) {
Rectangle r = getBounds().getCopy();
g.translate(r.getLocation());
int height = r.height - 1;
int start = 0;
if (group != null && group.isPattern()) {
start += 3;
height -= 1;
}
g.setBackgroundColor(whiteColor);
g.fillRectangle(start + 1, 1, 22, 19);
if (icon != null)
g.drawImage(icon, start + 4, 2);
if (group.hasErrors())
g.drawImage(errorIcon, start + 4, 10);
if (group != null && group.isPattern()) {
g.setBackgroundColor(lightBlueColor);
} else if (group != null && group.isConfirmed()) {
g.setBackgroundColor(yellowColor);
} else {
g.setBackgroundColor(lightGrayColor);
}
g.fillPolygon(fillPointlist);
if (group != null && group.isPattern())
g.fillPolygon(fill2Pointlist);
if (group != null && group.isPattern()) {
g.setBackgroundColor(darkBlueColor);
} else if (group != null && group.isConfirmed()) {
g.setBackgroundColor(orangeColor);
} else {
g.setBackgroundColor(lightGrayColor);
}
g.fillPolygon(shadowPointlist);
g.fillPolygon(shadow2Pointlist);
}
class GroupBorder extends LineBorder {
public GroupBorder(Color color) {
super(color);
}
public void paint(IFigure figure, Graphics graphics, Insets insets) {
Rectangle r = getPaintRectangle(figure, insets).getCopy();
graphics.translate(r.getLocation());
int start = 0;
int width = r.width - 1;
int height = r.height - 1;
if (group != null && group.isPattern()) {
start += 3;
height -= 1;
}
if (group != null && group.isConfirmed())
graphics.setForegroundColor(blackColor);
else
graphics.setForegroundColor(darkGrayColor);
graphics.drawLine(start + 1, 0, width - 15, 0);
graphics.drawLine(start, 1, start, height - 2);
graphics.drawLine(start + 1, height - 1, width - 2, height - 1);
graphics.drawLine(width - 1, 14, width - 1, height - 2);
graphics.drawLine(width - 15, 0, width - 1, 14);
graphics.drawLine(start, 1, start + 1, 0);
graphics.drawLine(start, height - 2, start + 1, height - 1);
graphics.drawLine(width - 2, height - 1, width - 1, height - 2);
graphics.drawLine(width - 15, 0, width - 14, 4);
graphics.drawLine(width - 14, 4, width - 15, 7);
graphics.drawLine(width - 15, 7, width - 18, 10);
graphics.drawLine(width - 18, 10, width - 1, 14);
graphics.drawLine(start + 23, 0, start + 23, 19);
graphics.drawLine(start, 20, start + 22, 20);
graphics.drawLine(start + 22, 20, start + 23, 19);
if (group != null && group.isPattern()) {
graphics.drawLine(1, 2, 3, 2);
graphics.drawLine(0, 3, 0, r.height - 2);
graphics.drawLine(1, r.height - 1, width - 7, r.height - 1);
graphics.drawLine(width - 6, r.height - 2, width - 6,
r.height - 3);
graphics.drawLine(0, 3, 1, 2);
graphics.drawLine(0, r.height - 2, 1, r.height - 1);
graphics.drawLine(width - 7, r.height - 1, width - 6,
r.height - 2);
}
if (group != null && group.isPattern())
graphics.setForegroundColor(pattBorder);
else if (group != null && group.isConfirmed())
graphics.setForegroundColor(borderColor);
else
graphics.setForegroundColor(darkGrayColor);
int index = 0;
int y = 24;
if (group != null)
for (int i = 1; i < group.getPageList().size(); i++) {
index = ((IPage) group.getPageList().get(i - 1))
.getLinkList().size();
if (((IPage) group.getPageList().get(i - 1)).getLinkList()
.size() == 0)
index = 1;
y += index * LINK_HEIGHT - 1;
graphics.drawLine(start + 1, y, width - 2, y);
y += 1;
}
}
}
public void mouseDoubleClicked(MouseEvent me) {
}
public void mousePressed(MouseEvent me) {
if (me.button == 3) {
((GEFGraphicalViewer) editPart.getViewer()).setNoDeselect();
editPart.getViewer().select(editPart);
}
}
public void mouseReleased(MouseEvent me) {
}
public void mouseDragged(MouseEvent me) {
}
public void mouseEntered(MouseEvent me) {
}
public void mouseExited(MouseEvent me) {
closeNavigator();
}
public void closeNavigator() {
}
public void mouseHover(MouseEvent me) {
}
public void mouseMoved(MouseEvent me) {
}
public void keyPressed(KeyEvent ke) {
}
public void keyReleased(KeyEvent ke) {
}
}