/*******************************************************************************
 * Copyright (c) 2009 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.common.snippets.ui;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.wst.common.snippets.core.ISnippetProvider;
import org.eclipse.wst.common.snippets.internal.AbstractSnippetProvider;
import org.eclipse.wst.common.snippets.internal.Logger;
import org.eclipse.wst.common.snippets.internal.editors.ISnippetEditor;
import org.eclipse.wst.common.snippets.internal.editors.VariableItemEditor;
import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
import org.eclipse.wst.common.snippets.internal.util.StringUtils;

public class TextSnippetProvider extends AbstractSnippetProvider implements ISnippetProvider {

	public SnippetPaletteItem createSnippet(PaletteEntry drawer) throws CoreException {
		SnippetPaletteItem item = super.createSnippet(drawer);
		ITextSelection selection = getTextSelection();
		try {
			String selectedText = getDocument().get(selection.getOffset(), selection.getLength());			
			item.setDescription(StringUtils.firstLineOf(selectedText).trim() + "..."); //$NON-NLS-1$
			item.setContentString(selectedText);
		}
		catch (BadLocationException e) {
			Logger.logException(e);
		}
		return item;
	}
	

	protected ITextSelection getTextSelection() {
		ITextEditor editor = getTextEditor();
		if (editor != null) {
			ISelection selection = editor.getSelectionProvider().getSelection();
			if (selection instanceof ITextSelection) {
				return (ITextSelection) selection;
			}
		}
		return null;
	}

	protected ITextEditor getTextEditor() {
		ITextEditor editor = null;
		IWorkbenchPart activePart = fEditorPart;
		
		if (activePart instanceof ITextEditor) {
			editor = (ITextEditor) activePart;
		}
		if (editor == null) {
			editor = (ITextEditor) activePart.getAdapter(ITextEditor.class);
		}
		return editor;
	}

	public boolean isActionEnabled(ISelection selection) {
		boolean enable = false;
		if (selection != null) {
			if (selection instanceof ITextSelection) {
				if (((ITextSelection) selection).getLength() > 0) {
					enable = true;
				}
			}
			else {
				enable = !selection.isEmpty();
			}
		}
		return enable;
	}

	public IDocument getDocument() {
		return getTextEditor().getDocumentProvider().getDocument(fEditorPart.getEditorInput());
	}

	public IStatus saveAdditionalContent(IPath path) {
		return Status.OK_STATUS;
	}


	public ISnippetInsertion getSnippetInsertion() {
		return new DefaultSnippetInsertion();
	}


	public String getId() {
		return TextSnippetProvider.class.getName();
	}


	public ISnippetEditor getSnippetEditor() {
		return new VariableItemEditor();
	}

}
