/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.dnd.internal;

import org.eclipse.gef.EditDomain;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.jst.pagedesigner.commands.PaletteDropInsertCommand;
import org.eclipse.jst.pagedesigner.commands.SourceViewerCommand;
import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemDescriptor;
import org.eclipse.jst.pagedesigner.itemcreation.ItemToolEntry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Point;
import org.eclipse.wst.sse.ui.StructuredTextEditor;
import org.eclipse.wst.sse.ui.internal.ExtendedEditorDropTargetAdapter;

/**
 * @author mengbo
 */
public class DesignerSourceMouseTrackAdapter extends
		ExtendedEditorDropTargetAdapter implements MouseListener,
		MouseMoveListener {
	private int _location;

	private StructuredTextEditor _textEditor;

	private EditDomain _domain;

	public DesignerSourceMouseTrackAdapter(StructuredTextEditor textEditor,
			EditDomain domain) {
		super(false);
		_textEditor = textEditor;
		_domain = domain;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.swt.events.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent)
	 */
	public void mouseMove(MouseEvent event) {
		Object object = getPaletteObject();
		StyledText text = null;
		if (_textEditor.getTextViewer() != null) {
			text = _textEditor.getTextViewer().getTextWidget();
		} else {
			return;
		}
		if (object == null) {
			text.setCursor(new Cursor(null, SWT.CURSOR_IBEAM));
			return;
		}
		Point p = new Point(event.x, event.y);
		p = _textEditor.getTextViewer().getTextWidget().toDisplay(p);
		SourceViewerDragDropHelper.getInstance().updateCaret(_textEditor, p);
		_location = text.getCaretOffset();
		_location = SourceViewerDragDropHelper.getInstance().getValidLocation(
				_textEditor, _location);
		_location = SourceViewerDragDropHelper.getInstance().showCaret(
				_textEditor, _location);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
	 */
	public void mouseUp(MouseEvent event) {
		if (event.button != 1) {
			if (_domain.getPaletteViewer() != null) {
				_domain.getPaletteViewer().setActiveTool(null);
			}
			return;
		} else {
			SourceViewerCommand command = getCommand(event);
			if (command != null) {
				command.execute();
				resetPalette();
			}
			_location = 0;
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.palette.PaletteListener#activeToolChanged(org.eclipse.gef.ui.palette.PaletteViewer,
	 *      org.eclipse.gef.palette.ToolEntry)
	 */
	public Object getPaletteObject() {
		if (_domain.getPaletteViewer() != null) {
			Object tool = _domain.getPaletteViewer().getActiveTool();
			if (tool instanceof ItemToolEntry) {
				Object object = ((ItemToolEntry) tool).getItemDesc();
				return object;
			}
		}
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
	 */
	public void mouseDoubleClick(MouseEvent e) {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
	 */
	public void mouseDown(MouseEvent e) {
	}

	private PaletteDropInsertCommand getCommand(MouseEvent event) {
		Object data = getPaletteObject();
		PaletteDropInsertCommand command = null;
		if (data instanceof PaletteItemDescriptor) {
			PaletteItemDescriptor descriptor = (PaletteItemDescriptor) data;
			// "Create new item"
			command = new PaletteDropInsertCommand(
					PageDesignerResources
							.getInstance()
							.getString(
									"DesignerSourceDropTargetListener.InserCommandLabel"),
					_textEditor, descriptor, _location);
		}
		return command;
	}

	private void resetPalette() {
		if (_domain.getPaletteViewer() != null) {
			ToolEntry tool = _domain.getPaletteViewer().getPaletteRoot()
					.getDefaultEntry();
			if (tool != null) {
				_domain.getPaletteViewer().setActiveTool((ToolEntry) tool);
			}
		}
	}
}
