/*******************************************************************************
 * Copyright (c) 2009 by SAP AG, Walldorf. 
 * 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:
 *    SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.common.snippets.tests.providers;

import java.io.ByteArrayInputStream;

import junit.framework.TestCase;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawerFactory;
import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteRoot;
import org.eclipse.wst.common.snippets.internal.ui.SnippetsView;
import org.eclipse.wst.common.snippets.ui.TextSnippetProvider;

public class TextProviderTests extends TestCase {
	
	private IFile file;

	protected void setUp() throws Exception {
		super.setUp();
		String projectName = System.currentTimeMillis() + "";
		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
		if (!project.exists()){
			project.create(new NullProgressMonitor());
		}
		if (!project.isOpen()){
			project.open(new NullProgressMonitor());
		}
		file = project.getFile("testTextSnippet.txt");
		if (!file.exists()){
			ByteArrayInputStream sr = new ByteArrayInputStream("test Text Snippet Provider".getBytes());
			file.create(sr, true, new NullProgressMonitor());
		}
	}

	public void testTextSnippetCreation() throws Exception {
		SnippetsView view;
		SnippetPaletteRoot anchor = null;
		view = (SnippetsView) SnippetsPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(SnippetsPlugin.NAMES.VIEW_ID);
		if (view == null) {
			view = (SnippetsView) SnippetsPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(SnippetsPlugin.NAMES.VIEW_ID);
		}
		if (view != null) {
			anchor = view.getRoot();
		}
		Shell activeShell = SnippetsPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(); //Display.getDefault().getActiveShell();
		assertNotNull("no active shell", activeShell);
		PaletteDrawer drawer = (PaletteDrawer) new SnippetPaletteDrawerFactory().createNewEntry(activeShell, anchor);
		drawer.setLabel("testName");
		TextSnippetProvider textSnippetProvider = new TextSnippetProvider();
		IEditorPart openEditor = IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), file);
		assertNotNull("no editor opened", openEditor);
		textSnippetProvider.setEditor(openEditor);
		
		
		SnippetPaletteItem createSnippet = textSnippetProvider.createSnippet(drawer);
		assertNotNull("no SnippetPaletteItem created", createSnippet);
		ITextEditor editor = (ITextEditor) openEditor;
		editor.selectAndReveal(0, 5);
		
		assertFalse("textSnippetProvider action is enabled with no selection", textSnippetProvider.isActionEnabled(null));
		assertTrue("textSnippetProvider action is not enabled with text selection", textSnippetProvider.isActionEnabled(editor.getSelectionProvider().getSelection()));
		editor.selectAndReveal(0, 0);
		assertFalse("textSnippetProvider action is not enabled with text selection", textSnippetProvider.isActionEnabled(editor.getSelectionProvider().getSelection()));
	}
}
