/*******************************************************************************
 * Copyright (c) 2001, 2004 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
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.sse.ui.internal.selection;

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

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.util.Assert;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.ui.texteditor.ITextEditor;

public class SelectionHistory {
	private ITextEditor fEditor;
	private List fHistory;
	private List fHistoryActions;
	private int fSelectionChangeListenerCounter;
	private ISelectionChangedListener fSelectionListener;

	public SelectionHistory(ITextEditor editor) {
		Assert.isNotNull(editor);
		fEditor = editor;
		fHistory = new ArrayList(3);
		fSelectionListener = new ISelectionChangedListener() {
			public void selectionChanged(SelectionChangedEvent event) {
				if (fSelectionChangeListenerCounter == 0)
					flush();
			}
		};
		fEditor.getSelectionProvider().addSelectionChangedListener(fSelectionListener);
	}

	public void dispose() {
		fEditor.getSelectionProvider().removeSelectionChangedListener(fSelectionListener);
		fEditor = null;
		if (fHistory != null && !fHistory.isEmpty()) {
			fHistory.clear();
		}
		if (fHistoryActions != null && !fHistoryActions.isEmpty()) {
			fHistoryActions.clear();
		}
	}

	public void flush() {
		if (fHistory.isEmpty())
			return;
		fHistory.clear();
		updateHistoryAction();
	}

	public IRegion getLast() {
		if (isEmpty())
			return null;
		int size = fHistory.size();
		IRegion result = (IRegion) fHistory.remove(size - 1);
		updateHistoryAction();
		return result;
	}

	public void ignoreSelectionChanges() {
		fSelectionChangeListenerCounter++;
	}

	public boolean isEmpty() {
		return fHistory.isEmpty();
	}

	public void listenToSelectionChanges() {
		fSelectionChangeListenerCounter--;
	}

	public void remember(IRegion region) {
		fHistory.add(region);
		updateHistoryAction();
	}

	public void setHistoryAction(IAction action) {
		Assert.isNotNull(action);
		
		if (fHistoryActions == null)
			fHistoryActions = new ArrayList();
		if (!fHistoryActions.contains(action))
			fHistoryActions.add(action);
		
		// update action
		if (fHistory != null && !fHistory.isEmpty())
			action.setEnabled(true);
		else
			action.setEnabled(false);
	}

	private void updateHistoryAction() {
		if (fHistoryActions != null && !fHistoryActions.isEmpty()) {
			boolean enabled = false;
			if (fHistory != null && !fHistory.isEmpty())
				enabled = true;

			Iterator iter = fHistoryActions.iterator();
			while (iter.hasNext()) {
				((IAction)iter.next()).setEnabled(enabled);
			}
		}
	}
}
