/*******************************************************************************
 * Copyright (c) 2008 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:
 *     Red Hat, Inc. - initial API and implementation
 ******************************************************************************/
package org.jboss.tools.smooks.graphical.editors.process;

import java.util.Iterator;
import java.util.List;

import org.eclipse.draw2d.ActionEvent;
import org.eclipse.draw2d.ActionListener;
import org.eclipse.draw2d.Clickable;
import org.eclipse.draw2d.Figure;
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.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.zest.core.widgets.CGraphNode;
import org.eclipse.zest.core.widgets.Graph;
import org.eclipse.zest.core.widgets.GraphItem;
import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator;
import org.jboss.tools.smooks.configuration.editors.GraphicsConstants;
import org.jboss.tools.smooks.graphical.editors.SmooksProcessGraphicalEditor;

/**
 * @author Dart
 * 
 */
public class TaskNodeFigure extends Figure {
	
	private Label problemTooltip;

	private IFigure mainFigure;

	private IFigure addTaskFigure;

	private Image image;

	private String labelText;

	private SmooksProcessGraphicalEditor processGraphicalViewerEditor;

	private Label label;

	private IFigure imageFigure;

	private Color oldLabelColor = null;

	private boolean showAddFigure = false;

	private Rectangle imageSourceRectangle = null;

	public TaskNodeFigure(SmooksProcessGraphicalEditor graph, Image image, String labelText) {
		super();
		this.image = image;
		this.labelText = labelText;
		this.processGraphicalViewerEditor = graph;
		this.problemTooltip = new Label();
		initFigure();
		hookTaskNodeFigure();
	}
	
	public void setProblemMessage(String message){
		if(message == null){
			this.setToolTip(null);
		}else{
			this.problemTooltip.setText(message);
			this.setToolTip(problemTooltip);
		}
	}

	public Label getLabel() {
		return label;
	}

	private void hookTaskNodeFigure() {
		// this.addMouseMotionListener(new MouseMotionListener() {
		//
		// public void mouseDragged(MouseEvent me) {
		// }
		//
		// public void mouseEntered(MouseEvent me) {
		// showAddFigure = true;
		// imageSourceRectangle = null;
		// addTaskFigure.repaint();
		// }
		//
		// public void mouseExited(MouseEvent me) {
		// showAddFigure = false;
		// addTaskFigure.repaint();
		// }
		//
		// public void mouseHover(MouseEvent me) {
		// }
		//
		// public void mouseMoved(MouseEvent me) {
		// }
		//
		// });
		addTaskFigure.addMouseMotionListener(new MouseMotionListener() {

			public void mouseDragged(MouseEvent me) {
			}

			public void mouseEntered(MouseEvent me) {
				showAddFigure = true;
				imageSourceRectangle = null;
				addTaskFigure.repaint();
			}

			public void mouseExited(MouseEvent me) {
				showAddFigure = false;
				addTaskFigure.repaint();
			}

			public void mouseHover(MouseEvent me) {
			}

			public void mouseMoved(MouseEvent me) {
			}

		});
	}

	protected void initFigure() {
		initMainFigure();
		initAddTaskFigure();
		GridLayout girdlLayout = new GridLayout();
		girdlLayout.numColumns = 2;
		this.setLayoutManager(girdlLayout);
		GridData d = new GridData(GridData.FILL_VERTICAL);
		// ToolbarLayout layout = new ToolbarLayout(true);
		// layout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
		this.add(mainFigure);
		this.add(addTaskFigure);
		girdlLayout.setConstraint(addTaskFigure, d);
		// this.setLayoutManager(layout);
	}

	private void initAddTaskFigure() {
		addTaskFigure = new Clickable() {
			@Override
			protected void paintBorder(Graphics graphics) {
			}

			@Override
			protected void paintFigure(Graphics graphics) {
				super.paintFigure(graphics);
				Rectangle rect = getBounds();
				Point center = rect.getCenter();
				if (!showAddFigure) {
//					int feet = 4;
					graphics.fillRectangle(rect);
					return;
					// imageSourceRectangle = new Rectangle(rect.x + feet,
					// rect.y + feet, rect.width - feet * 2,
					// rect.height - feet * 2);
				}
				Image image = SmooksConfigurationActivator.getDefault().getImageRegistry().get(
						GraphicsConstants.IMAGE_ADD_TASK_BUTTON);
				if (image != null) {
//					System.out.println(center.x - image.getBounds().width / 2);
					Point location = new Point(center.x - image.getBounds().width / 2, center.y
							- image.getBounds().height / 2);
					graphics.drawImage(image, location);
					if (imageSourceRectangle == null) {
//						graphics.drawImage(image, getLocation());
					} else {
//						graphics.drawImage(image, sourceRectangle, imageSourceRectangle);
					}
				}
			}

		};
		((Clickable) addTaskFigure).addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent event) {
				if (!showAddFigure)
					return;
				Graph g = processGraphicalViewerEditor.getProcessGraphViewer().getGraphControl();
				processGraphicalViewerEditor.setNeedupdatewhenshow(false);
				List<?> nodes = g.getNodes();
				for (Iterator<?> iterator = nodes.iterator(); iterator.hasNext();) {
					GraphItem item = (GraphItem) iterator.next();
					if (item instanceof CGraphNode) {
						if (TaskNodeFigure.this == ((CGraphNode) item).getFigure()) {
							processGraphicalViewerEditor.updateProcessActions(new StructuredSelection(item.getData()));
							break;
						}
					}
				}
				Menu menu = processGraphicalViewerEditor.getProcessGraphViewer().getGraphControl().getMenu();
				menu.setVisible(true);
				// processGraphicalViewerEditor.setNeedupdatewhenshow(true);
			}
		});
		addTaskFigure.setSize(16, 16);
	}

	private void initMainFigure() {
		mainFigure = new Figure();
		imageFigure = new Figure() {

			/*
			 * (non-Javadoc)
			 * 
			 * @see
			 * org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics
			 * )
			 */
			@Override
			protected void paintFigure(Graphics graphics) {
				super.paintFigure(graphics);
				if (image != null) {
					graphics.drawImage(image, getLocation());
				} else {
					graphics.drawRectangle(0, 0, 24, 24);
				}
			}

		};
		if (image != null) {
			imageFigure.setSize(new Dimension(image.getBounds().width, image.getBounds().height));
		} else {
			imageFigure.setSize(24, 24);
		}

		mainFigure.add(imageFigure);

		label = new Label();
		label.setForegroundColor(GraphicsConstants.BORDER_CORLOR);
		label.setText(labelText);

		oldLabelColor = label.getForegroundColor();

		mainFigure.add(label);

		ToolbarLayout layout = new ToolbarLayout(false);
		layout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER);
		mainFigure.setLayoutManager(layout);
	}

	/**
	 * @return the image
	 */
	public Image getImage() {
		return image;
	}

	/**
	 * @param image
	 *            the image to set
	 */
	public void setImage(Image image) {
		this.image = image;
	}

	/**
	 * @return the labelText
	 */
	public String getLabelText() {
		return labelText;
	}

	/**
	 * @param labelText
	 *            the labelText to set
	 */
	public void setLabelText(String labelText) {
		this.labelText = labelText;
	}

	public void highlightLabel(Color highlightColor) {
		oldLabelColor = label.getForegroundColor();
		label.setForegroundColor(highlightColor);
		label.repaint();
	}

	public void unhighlightLabel() {
		if (oldLabelColor != null) {
			label.setForegroundColor(oldLabelColor);
			label.repaint();
		}
	}

}
