/*******************************************************************************
 * Copyright (c) 2000, 2013 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ant.internal.ui.editor.actions;

import java.util.Iterator;
import java.util.List;

import org.eclipse.ant.internal.ui.AntUIPlugin;
import org.eclipse.ant.internal.ui.editor.AntEditor;
import org.eclipse.ant.internal.ui.editor.EditorSynchronizer;
import org.eclipse.ant.internal.ui.editor.OccurrencesFinder;
import org.eclipse.jdt.ui.actions.SelectionDispatchAction;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.link.LinkedModeModel;
import org.eclipse.jface.text.link.LinkedModeUI;
import org.eclipse.jface.text.link.LinkedPosition;
import org.eclipse.jface.text.link.LinkedPositionGroup;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.ui.texteditor.link.EditorLinkedModeUI;

public class RenameInFileAction extends SelectionDispatchAction {

	private AntEditor fEditor;

	public RenameInFileAction(AntEditor antEditor) {
		super(antEditor.getSite());
		fEditor = antEditor;
		setText(AntEditorActionMessages.getString("RenameInFileAction.0")); //$NON-NLS-1$
		setDescription(AntEditorActionMessages.getString("RenameInFileAction.1")); //$NON-NLS-1$
		setToolTipText(AntEditorActionMessages.getString("RenameInFileAction.2")); //$NON-NLS-1$
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.action.IAction#run()
	 */
	@Override
	public void run() {
		if (fEditor == null) {
			return;
		}

		ISourceViewer viewer = fEditor.getViewer();
		IDocument document = viewer.getDocument();
		int offset = ((ITextSelection) getSelection()).getOffset();
		LinkedPositionGroup group = new LinkedPositionGroup();
		OccurrencesFinder finder = new OccurrencesFinder(fEditor, fEditor.getAntModel(), document, offset);
		List<Position> positions = finder.perform();
		if (positions == null) {
			return;
		}

		addPositionsToGroup(offset, positions, document, group);
		if (group.isEmpty()) {
			return;
		}
		try {
			LinkedModeModel model = new LinkedModeModel();
			model.addGroup(group);
			model.forceInstall();
			model.addLinkingListener(new EditorSynchronizer(fEditor));
			LinkedModeUI ui = new EditorLinkedModeUI(model, viewer);
			ui.setExitPosition(viewer, offset, 0, Integer.MAX_VALUE);
			ui.enter();
			viewer.setSelectedRange(offset, 0);
		}
		catch (BadLocationException e) {
			AntUIPlugin.log(e);
		}
	}

	private void addPositionsToGroup(int offset, List<Position> positions, IDocument document, LinkedPositionGroup group) {
		Iterator<Position> iter = positions.iterator();
		int i = 0;
		int j = 0;
		int firstPosition = -1;
		try {
			while (iter.hasNext()) {
				Position position = iter.next();
				if (firstPosition == -1) {
					if (position.overlapsWith(offset, 0)) {
						firstPosition = i;
						group.addPosition(new LinkedPosition(document, position.getOffset(), position.getLength(), j++));
					}
				} else {
					group.addPosition(new LinkedPosition(document, position.getOffset(), position.getLength(), j++));
				}
				i++;
			}

			for (i = 0; i < firstPosition; i++) {
				Position position = positions.get(i);
				group.addPosition(new LinkedPosition(document, position.getOffset(), position.getLength(), j++));
			}
		}
		catch (BadLocationException be) {
			AntUIPlugin.log(be);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jdt.ui.actions.SelectionDispatchAction#selectionChanged(org.eclipse.jface.text.ITextSelection)
	 */
	@Override
	public void selectionChanged(ITextSelection selection) {
		setEnabled(fEditor != null);
	}

	/**
	 * Set the Ant editor associated with the action
	 * 
	 * @param editor
	 *            the ant editor to do the renames
	 */
	public void setEditor(AntEditor editor) {
		fEditor = editor;
	}
}