/*******************************************************************************
 * 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$
	}

	@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);
		}
	}

	@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;
	}
}