/*******************************************************************************
* Copyright (c)                                                                *
*           2005   Tristan Allwood,                                            *
*           2005   Daniel Burke,                                               *
*           2005   Marc Hull,                                                  *
*           2005   Ekaterina Itskova,                                          *
*           2005   Steve Zymler                                                *
*                                                                              *
* Permission is hereby granted, free of charge, to any person obtaining a      *
* copy of this software and associated documentation files (the                *
* "Software"), to deal in the Software without restriction, including          *
* without limitation the rights to use, copy, modify, merge, publish,          *
* distribute, sublicense, and/or sell copies of the Software, and to           *
* permit persons to whom the Software is furnished to do so, subject to        *
* the following conditions:                                                    *
*                                                                              *
* The above copyright notice and this permission notice shall be included      *
* in all copies or substantial portions of the Software.                       *
*                                                                              *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS      *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF                   *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.       *
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY         *
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,         *
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE            *
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                       *
*******************************************************************************/
/*
 * Created on 20.10.2004
 *
 */
package uk.ac.ic.doc.kevlar.gui.internal.taskpane.programpane;

import java.io.FileNotFoundException;
import java.util.Iterator;
import java.util.Set;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;

import uk.ac.ic.doc.kevlar.core.framework.IProgramIDDescription;
import uk.ac.ic.doc.kevlar.gui.GUIManager;
import uk.ac.ic.doc.kevlar.gui.internal.CanvasManager;
import uk.ac.ic.doc.kevlar.gui.internal.caches.ColorCache;
import uk.ac.ic.doc.kevlar.gui.internal.caches.FontCache;
import uk.ac.ic.doc.kevlar.gui.internal.caches.ImageCache;
import uk.ac.ic.doc.kevlar.gui.internal.help.HelpManager;
import uk.ac.ic.doc.kevlar.gui.internal.pipeline.PipeLineManager;
import uk.ac.ic.doc.kevlar.gui.internal.pipeline.Program;
import uk.ac.ic.doc.kevlar.gui.internal.taskpane.ATaskPane;
import uk.ac.ic.doc.kevlar.hial.IProgramNode;
import uk.ac.ic.doc.kevlar.hial.IProgramTreeNode;

/**
 * @author ei02
 *
 */

public class ProgramEntry extends AProgramTreeNodeEntry {
	
	static final String PROGRAM_BACKGROUND_FILENAME = "childprogram2.png";
	static final String PROGRAM_ROLLOVER_FILENAME = "childprogram2_rollover.png";
	
	public ProgramEntry(IProgramTreeNode program, int panePositionIndex, ATaskPane programPane, int animationMode) {
	    
		super(program, panePositionIndex, programPane, animationMode);
		
		initialise();
				
	}
	
	public ProgramEntry(IProgramIDDescription desc, int panePosition, ATaskPane taskPane, int animationMode)
	{
		/*this constructor gets called when the search results need to be displayed */
		
		super(desc, panePosition, taskPane, animationMode);
		initialise();
	}
	
	private void initialise()
	{
		try {
			
			this.background = ImageCache.get(PROGRAM_BACKGROUND_FILENAME);
			
		} catch (FileNotFoundException e) {
			
			this.background = null;
			
		}
				
		try {
			
			this.rollover = ImageCache.get(PROGRAM_ROLLOVER_FILENAME);
			
		} catch (FileNotFoundException e) {
			
			this.rollover = null;
			
		}
	}
	
	public void drawBefore(GC gc, Rectangle area)
	{
	    gc.setForeground(ColorCache.get(0, 0, 0));
	    gc.setFont(FontCache.get("Arial", 8, SWT.NORMAL));
		super.drawBefore(gc, area);
				
	}
	
	public void mousePress(Point position, int mouseButton)
	{
	    super.mousePress(position, mouseButton);
	    
/*		boolean isDisplayed = HelpManager.getSingleton().isDisplayed();
		
		if (mouseButton==1 && !isDisplayed)
		{
			if (progDesc == null)
			{
				progDesc = getProgramDescription();
			}
			
			int x = getAbsoluteArea().x - HelpManager.getSingleton().getWidth() - 20;
			HelpManager.getSingleton().displayProgramHelp(progDesc,x, area.y);
		} */

	    if (mouseButton == MB_RIGHT) {
	    
	        int x = getAbsoluteArea().x - HelpManager.getSingleton().getWidth() - 20;
	        HelpManager.getSingleton().displayProgramHelp(getDescription(), x, area.y);
	        
	    }
	    
	}
	
	
	public void onDrag(Point offset) {
	    
		if (HelpManager.getSingleton().isDisplayed())
		{
			HelpManager.getSingleton().hideHelp();
		}
		Program program = createProgram();
		CanvasManager.getSingleton().setDragObject(program, offset);
		
	}
	
	private IProgramIDDescription getProgramDescription()
	{
		IProgramIDDescription helpDesc = null;
		Set<IProgramIDDescription> desc = GUIManager.getHial().getProgramTreeRoot().getSecond();
		
		Iterator descriptionIterator = desc.iterator();
		
		while(descriptionIterator.hasNext())
		{
			IProgramIDDescription description = (IProgramIDDescription) descriptionIterator.next();
			if (description.getFriendlyName().equals(dataNode.getName()))
			{
				helpDesc = description;
			}
		}
		
		return helpDesc;
		
	}
	
	private Program createProgram()
	{
/*		Program program = null;
		
		if (progDesc == null)
		{
			program = new Program(((IProgramNode)dataNode).getDescription());
		}
		else
		{
			program = new Program(progDesc);
		} */
		
		return new Program(getDescription());
	}
	
	public IProgramIDDescription getDescription() {
	    
	    if (progDesc == null) {
	        
	        return ((IProgramNode)dataNode).getDescription();
	        
	    } else {
	        
	        return progDesc;
	        
	    }
	    
	}
	
	public void perform() {
	    
        PipeLineManager.getSingleton().addProgram(getDescription());	    
	    
	}
	
}
