/*******************************************************************************
 * Copyright (c) 2004, 2007 Mylyn project committers 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.mylyn.internal.web.tasks;

import java.util.ArrayList;

import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.bindings.keys.ParseException;
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.fieldassist.IContentProposal;
import org.eclipse.jface.fieldassist.IContentProposalListener;
import org.eclipse.jface.fieldassist.IContentProposalListener2;
import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.jface.fieldassist.IControlContentAdapter;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;

/**
 * @author Eugene Kuleshov
 */
public class WebContentProposalProvider implements IContentProposalProvider {

	private final ParametersEditor parametersEditor;

	private final boolean includeTemplates;

	public WebContentProposalProvider(ParametersEditor parametersEditor, boolean includeTemplates) {
		this.parametersEditor = parametersEditor;
		this.includeTemplates = includeTemplates;
	}

	public IContentProposal[] getProposals(String contents, int position) {
		ArrayList<IContentProposal> proposals = new ArrayList<IContentProposal>();
		if (includeTemplates) {
			addProposal(proposals, "({Id}.+?)");
			addProposal(proposals, "({Description}.+?)");
			addProposal(proposals, "({Owner}.+?)");
			addProposal(proposals, "({Type}.+?)");
			addProposal(proposals, "({Status}.+?)");
			// proposals.add("({Due}.+?)");
			// proposals.add("({Updated}.+?)");
			// proposals.add("({Created}.+?)");
			addProposal(proposals, "(.+?)");
			addProposal(proposals, ".+?");
		}
		addProposal(proposals, "${" + WebRepositoryConnector.PARAM_SERVER_URL + "}");
		addProposal(proposals, "${" + WebRepositoryConnector.PARAM_USER_ID + "}");
		addProposal(proposals, "${" + WebRepositoryConnector.PARAM_PASSWORD + "}");
		addProposal(proposals, "${" + WebRepositoryConnector.PARAM_LOGIN_TOKEN + "}");
		for (String param : parametersEditor.getParameters().keySet()) {
			addProposal(proposals, "${" + param.substring(WebRepositoryConnector.PARAM_PREFIX.length()) + "}");
		}
		addProposal(proposals, "${}");
		return proposals.toArray(new IContentProposal[proposals.size()]);
	}

	private boolean addProposal(ArrayList<IContentProposal> proposals, final String content) {
		return proposals.add(new IContentProposal() {

			public String getContent() {
				return content;
			}

			public int getCursorPosition() {
				return content.length();
			}

			public String getDescription() {
				return null;
			}

			public String getLabel() {
				return null;
			}

		});
	}

	@SuppressWarnings("deprecation")
	public static ControlDecoration createDecoration(final Text text, //
			ParametersEditor parametersEditor, boolean includeTemplates) {
		FieldDecorationRegistry registry = FieldDecorationRegistry.getDefault();
		FieldDecoration fieldDecoration = registry.getFieldDecoration(FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);

		ControlDecoration decoration = new ControlDecoration(text, SWT.LEFT | SWT.TOP);
		decoration.setImage(fieldDecoration.getImage());
		decoration.setDescriptionText(fieldDecoration.getDescription());
		decoration.setShowOnlyOnFocus(true);

		KeyStroke keystroke = null;
		try {
			keystroke = KeyStroke.getInstance("Ctrl" + KeyStroke.KEY_DELIMITER + "Space");
		} catch (ParseException e) {
		}

		ContentProposalAdapter adapter = new ContentProposalAdapter(text, new TextContentAdapter(), //
				new WebContentProposalProvider(parametersEditor, includeTemplates), keystroke, null);
		adapter.setPopupSize(new Point(200, 150));
		adapter.setPropagateKeys(true);
		adapter.setFilterStyle(ContentProposalAdapter.FILTER_CUMULATIVE);

		// workaround for bug 196565
		WebContentProposalListener listener = new WebContentProposalListener(adapter);
		adapter.addContentProposalListener((IContentProposalListener) listener);
		adapter.addContentProposalListener((IContentProposalListener2) listener);
		adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_IGNORE);

		return decoration;
	}

	static class WebContentProposalListener implements IContentProposalListener, IContentProposalListener2 {

		private final ContentProposalAdapter adapter;

		private int startCaretPosition;

		private int endCaretPosition;

		public WebContentProposalListener(ContentProposalAdapter adapter) {
			this.adapter = adapter;
		}

		public void proposalAccepted(IContentProposal proposal) {
			IControlContentAdapter contentAdapter = adapter.getControlContentAdapter();
			Control control = adapter.getControl();
			StringBuilder sb = new StringBuilder(contentAdapter.getControlContents(control));
			sb.insert(contentAdapter.getCursorPosition(control), //
					proposal.getContent().substring(endCaretPosition - startCaretPosition));
			contentAdapter.setControlContents(control, sb.toString(), //
					startCaretPosition + proposal.getCursorPosition());
		}

		public void proposalPopupOpened(ContentProposalAdapter adapter) {
			startCaretPosition = adapter.getControlContentAdapter().getCursorPosition(adapter.getControl());
		}

		public void proposalPopupClosed(ContentProposalAdapter adapter) {
			endCaretPosition = adapter.getControlContentAdapter().getCursorPosition(adapter.getControl());
		}

	}

}
