package info.ecosensus.udig.view;

import info.ecosensus.udig.ui.UIIconGroup;
import info.ecosensus.udig.ui.UIIconItem;
import info.ecosensus.udig.ui.UIIconManager;
import info.ecosensus.udig.ui.UIUtilities;

import java.util.Vector;

import org.eclipse.ui.part.ViewPart;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.jface.viewers.TableViewer;

import com.vividsolutions.jts.geom.Coordinate;

import java.awt.Color;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
import java.io.File;

import net.refractions.udig.project.IBlackboard;
import net.refractions.udig.project.IMap;
import net.refractions.udig.project.ui.ApplicationGIS;
import net.refractions.udig.project.ui.internal.commands.draw.DrawShapeCommand;
import net.refractions.udig.project.ui.render.displayAdapter.MapMouseEvent;
import net.refractions.udig.project.ui.tool.AbstractModalTool;
import net.refractions.udig.project.ui.tool.IToolHandler;
import net.refractions.udig.project.ui.tool.Tool;
import net.refractions.udig.project.ILayer;

public class IconsView extends ViewPart {
	   
	public static final String BLACKBOARD_KEY = 
	        "net.refractions.udig.tutorials.tool.coordinate";
	 	
	/** The icon manager for this dialog.*/
	private UIIconManager	oManager 	= null;

	/** The list of current IconGroup items.*/
	private Vector 			vtIconGroups = null;
	
	private Composite sShell = null;
	
	private TabFolder tabFolder = null;
		
	public IconsView() {
		oManager = new UIIconManager();
		oManager.loadIconGroups();
	}
	
	public void createPartControl(Composite parent) {
		sShell = parent;
		createTabbedPane();
	}
	
	public void setFocus(){
		tabFolder.setFocus();
	}
	
	private void createTabbedPane() {
		
		tabFolder = new TabFolder(sShell, SWT.TOP);
		tabFolder.setSize (160,460);
		
		Vector vtIconGroups = oManager.getIconGroupNames();
		vtIconGroups = UIUtilities.sortList(vtIconGroups);
		int count = vtIconGroups.size();
		
		String sName = "";
		UIIconGroup icongroup = null;
		
		for (int i=0; i<count; i++) {
			sName = (String)vtIconGroups.elementAt(i);
			icongroup = oManager.getIconGroup(sName);
			if (icongroup != null) {		
			   TabItem item = new TabItem( tabFolder, SWT.NULL);
			   item.setText(sName);
			   Table table = createTable(tabFolder, icongroup);
			   item.setControl( table );
			 }
		}
	}
	
	/**
	 * This method initializes table	
	 *
	 */
	private Table createTable(TabFolder folder, UIIconGroup oIconGroup) {
		final TabFolder tabFolder = folder;
		final Display display = sShell.getDisplay();
				
		final Table table = new Table(tabFolder, SWT.NONE);
		table.setBounds(new org.eclipse.swt.graphics.Rectangle(0,0,258,460));			   
			
		TableViewer viewer = new TableViewer(table);
		
	    TableColumn column = new TableColumn(table, SWT.LEFT);
	    column.setText("Icon");
	    column.setWidth(65);
		
	    TableColumn column2 = new TableColumn(table, SWT.LEFT);
	    column2.setText("Label");
	    column2.setWidth(150);
	    
		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		
		// Implement a "fake" tooltip
		/*final Listener labelListener = new Listener () {
			public void handleEvent (Event event) {
				Label label = (Label)event.widget;
				Shell shell = label.getShell ();
				switch (event.type) {
					case SWT.MouseDown:
						Event e = new Event ();
						e.item = (TableItem) label.getData("_TABLEITEM");
						// Assuming table is single select, set the selection as if
						// the mouse down event went through to the table
						table.setSelection (new TableItem [] {(TableItem) e.item});
						table.notifyListeners (SWT.Selection, e);
						// fall through
					case SWT.MouseExit:
						shell.dispose ();
						break;
				}
			}
		};*/
		
		/*Listener tableListener = new Listener () {
			Shell tip = null;
			Label label = null;
			public void handleEvent (Event event) {
				switch (event.type) {
					case SWT.Dispose:
					case SWT.KeyDown:
					case SWT.MouseMove: {
						if (tip == null) break;
						tip.dispose ();
						tip = null;
						label = null;
						break;
					}
					case SWT.MouseHover: {
						TableItem item = table.getItem (new Point (event.x, event.y));
						
						if (item != null) {
							Object obj = item.getData();
							if (obj instanceof UIIconItem) {
								UIIconItem iconitem = (UIIconItem) obj; 
								if (tip != null  && !tip.isDisposed ()) {
									tip.dispose ();
								}
								
								tip = new Shell (sShell, SWT.ON_TOP | SWT.TOOL);
								tip.setLayout (new FillLayout ());
								label = new Label (tip, SWT.NONE);
								label.setForeground (display.getSystemColor (SWT.COLOR_INFO_FOREGROUND));
								label.setBackground (display.getSystemColor (SWT.COLOR_INFO_BACKGROUND));
								label.setData ("_TABLEITEM", item);
								label.setText (iconitem.getLabel());
								label.addListener (SWT.MouseExit, labelListener);
								label.addListener (SWT.MouseDown, labelListener);
								Point size = tip.computeSize (SWT.DEFAULT, SWT.DEFAULT);
								Rectangle rect = item.getBounds (0);
								Point pt = table.toDisplay (rect.x, rect.y);
								tip.setBounds (pt.x, pt.y, size.x, size.y);
								tip.setVisible (true);
							}
						}
					}
				}
			}
		};
		table.addListener (SWT.Dispose, tableListener);
		table.addListener (SWT.KeyDown, tableListener);
		table.addListener (SWT.MouseMove, tableListener);
		table.addListener (SWT.MouseHover, tableListener);		
		*/
		
		/*MouseListener mouse = new MouseAdapter() {
			public void mouseUp(MouseEvent e) {
				
				System.out.println("In mouse up");
				
		        IMap map = ApplicationGIS.getActiveMap();
		        if (map == null)
		            return;  
		        
		        java.util.List<ILayer> layers=map.getMapLayers();
		        if (layers == null) {
		        	return;
		        }		        		       
		        
		        IBlackboard blackboard = map.getBlackboard();
		        List<Coordinate> points = 
		            (List<Coordinate>) blackboard.get(BLACKBOARD_KEY);
		        if (points == null) {
		            points = new ArrayList<Coordinate>();
		            blackboard.put(BLACKBOARD_KEY,points);
		        }
		        
		        points.add(new Coordinate(10, 10));
		       
		        Rectangle2D r = new Rectangle2D.Double(e.x,e.y,2,2);
		        //DrawShapeCommand command = getContext().getDrawFactory()
		        //	.createDrawShapeCommand(r,Color.BLACK);
		        
		        //getContext().sendASyncCommand(command);        		
			}			
		};
		
		table.addMouseListener(mouse);*/
		
		Vector vtItems = oIconGroup.getItems();
		vtItems = UIUtilities.sortList(vtItems);		
		int count = vtItems.size();
		UIIconItem oItem = null;
		TableItem oTableItem = null;		
		for (int i=0; i<count; i++) {
			oItem = (UIIconItem)vtItems.elementAt(i);
			oTableItem = new TableItem(table, SWT.LEFT, i);
			oTableItem.setData(oItem);
			oTableItem.setImage(0, oItem.getImage());
			oTableItem.setText(1, oItem.getName());			
		}	
		
		DragSource ds = new DragSource(table, DND.DROP_COPY);
		ds.setTransfer(new Transfer[] {TextTransfer.getInstance()});		
		ds.addDragListener(new DragSourceAdapter() {
			public void dragStart(DragSourceEvent e) {
				TableItem[] items = table.getSelection();
				TableItem item = items[0];
				Object obj = item.getData();				
				System.out.println("IN DragStart: "+obj.getClass().getName());
				if (obj instanceof UIIconGroup) {
					e.doit = false;
				}
				else {
					e.doit = true;				
				}
			};	
			
			public void dragSetData(DragSourceEvent e) {
				
				TableItem[] items = table.getSelection();
				TableItem item = items[0];
				Object obj = item.getData();
				
				System.out.println("IN DragSetData: "+obj.getClass().getName());
				MessageDialog.openWarning(null, "Icon Drag and Drop", "This will eventually do something");
				
				if (obj instanceof UIIconItem) {											
					if (TextTransfer.getInstance().isSupportedType(e.dataType)) {
						System.out.println("GETTING DATA");						
						e.data = new String("ECOSENSUS:"+((UIIconItem)obj).getImageString());
					}
				}
			}
		});	
		
		return table;
	}	
}
