/*******************************************************************************
 * Copyright (c) 2005, 2016 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
 *
 *******************************************************************************/
package org.eclipse.dltk.tcl.internal.console.ui;

import java.io.IOException;
import java.util.List;

import org.eclipse.dltk.console.IScriptConsoleShell;
import org.eclipse.dltk.console.ScriptConsoleCompletionProposal;
import org.eclipse.dltk.console.ui.IScriptConsoleViewer;
import org.eclipse.dltk.console.ui.ScriptConsoleCompletionProcessor;
import org.eclipse.dltk.ui.DLTKPluginImages;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.TextPresentation;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.text.contentassist.IContextInformationPresenter;
import org.eclipse.jface.text.contentassist.IContextInformationValidator;
import org.eclipse.swt.graphics.Image;


public class TclConsoleCompletionProcessor extends
		ScriptConsoleCompletionProcessor {

	protected static class Validator implements IContextInformationValidator,
			IContextInformationPresenter {

		protected int installOffset;

		public boolean isContextInformationValid(int offset) {
			return Math.abs(installOffset - offset) < 5;
		}

		public void install(IContextInformation info, ITextViewer viewer,
				int offset) {
			installOffset = offset;
		}

		public boolean updatePresentation(int documentPosition,
				TextPresentation presentation) {
			return false;
		}
	}

	protected IProposalDecorator tclDecorator = new IProposalDecorator() {
		public String formatProposal(ScriptConsoleCompletionProposal c) {
			return c.getDisplay();
		}

		public Image getImage(ScriptConsoleCompletionProposal c) {
			String type = c.getType();
			if (type.equals("var")){
				return DLTKPluginImages
				.get(DLTKPluginImages.IMG_OBJS_LOCAL_VARIABLE); 
			} else if (type.equals("proc")){
				return DLTKPluginImages.get(DLTKPluginImages.IMG_METHOD_PUBLIC);
			} else if (type.equals("command")){
				return DLTKPluginImages.get(DLTKPluginImages.IMG_METHOD_PRIVATE);
			} else if (type.equals("func")){
				return DLTKPluginImages.get(DLTKPluginImages.IMG_OBJS_FIELD);
			}
			
			return null; 
		}
	};
	
	private IContextInformationValidator validator;
	
	public TclConsoleCompletionProcessor(
			IScriptConsoleShell interpreterShell) {
		super(interpreterShell);
	}

	@Override
	public char[] getCompletionProposalAutoActivationCharacters() {
		return new char[] { '$' };
	}

	@Override
	protected ICompletionProposal[] computeCompletionProposalsImpl(
			IScriptConsoleViewer viewer, int offset) {

		try {
			String commandLine = viewer.getCommandLine();
			int cursorPosition = offset - viewer.getCommandLineOffset();

			List list = getInterpreterShell().getCompletions(commandLine,
					cursorPosition);

			List proposals = createProposalsFromString(list, offset, tclDecorator);

			return (ICompletionProposal[]) proposals
					.toArray(new ICompletionProposal[proposals.size()]);
		} catch (IOException e) {
			e.printStackTrace();
		}

		return new ICompletionProposal[] {};
	}

	@Override
	protected IContextInformation[] computeContextInformationImpl(
			ITextViewer viewer, int offset) {
		return null;
	}

	public IContextInformationValidator getContextInformationValidator() {
		if (validator == null) {
			validator = new Validator();
		}

		return validator;
	}
}
