/*******************************************************************************
 * 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;

import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.IUndoManager;
import org.eclipse.wst.sse.core.text.IStructuredDocument;
import org.eclipse.wst.sse.core.undo.IStructuredTextUndoManager;
import org.eclipse.wst.sse.ui.view.events.ITextSelectionListener;
import org.eclipse.wst.sse.ui.view.events.TextSelectionChangedEvent;


/**
 * Undo manager exclusively for StructuredTextViewers ONLY. This undo manager
 * is aware that structured documents have their own undo manager. This
 * handles communication between IUndoManager and IStructuredTextUndoManager.
 */
class StructuredTextViewerUndoManager implements IUndoManager {
	class UndoNotifier implements ITextSelectionListener {

		public void textSelectionChanged(TextSelectionChangedEvent event) {
			if ((fUndoManager != null) && (event != null)) {
				fUndoManager.forceEndOfPendingCommand(this, event.getTextSelectionStart(), event.getTextSelectionEnd() - event.getTextSelectionStart());
			}
		}

	}

	private StructuredTextViewer fTextViewer = null;
	private IStructuredTextUndoManager fUndoManager = null;
	private ITextSelectionListener fUndoNotifier = new UndoNotifier();

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.IUndoManager#beginCompoundChange()
	 */
	public void beginCompoundChange() {
		// forward the request to the model-based undo manager
		if (fUndoManager != null)
			fUndoManager.beginRecording(fTextViewer);
	}

	/**
	 * Associates a viewer to this undo manager and also attempts to get the
	 * correct document-specific undo manager.
	 * 
	 * @param viewer -
	 *            Assumes viewer instanceof StructuredTextViewer
	 */
	public void connect(ITextViewer viewer) {
		// future_TODO could probably optimize this to check if already
		// connected to same viewer/undo manager, dont do anything

		// disconnect from any old manager/viewer
		disconnect();

		// connect to new viewer/undo manager
		fTextViewer = (StructuredTextViewer) viewer;
		IDocument doc = fTextViewer.getDocument();
		if (doc instanceof IStructuredDocument) {
			IStructuredDocument structuredDocument = (IStructuredDocument) doc;
			setDocument(structuredDocument);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.IUndoManager#disconnect()
	 */
	public void disconnect() {
		// disconnect the viewer from the undo manager
		if (fUndoManager != null) {
			fTextViewer.getViewerSelectionManager().removeTextSelectionListener(fUndoNotifier);
			fUndoManager.disconnect(fTextViewer);
		}

		// null out the viewer and undo manager
		fTextViewer = null;
		fUndoManager = null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.IUndoManager#endCompoundChange()
	 */
	public void endCompoundChange() {
		// forward the request to the model-based undo manager
		if (fUndoManager != null)
			fUndoManager.endRecording(fTextViewer);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.IUndoManager#redo()
	 */
	public void redo() {
		// forward the request to the model-based undo manager
		if (fUndoManager != null)
			fUndoManager.redo(fTextViewer);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.IUndoManager#redoable()
	 */
	public boolean redoable() {
		boolean canRedo = false;

		// forward the request to the model-based undo manager
		if (fUndoManager != null)
			canRedo = fUndoManager.redoable();

		return canRedo;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.IUndoManager#reset()
	 */
	public void reset() {
		// cannot really reset model-based undo manager because other clients
		// will be affected
	}

	/**
	 * Disconnect from the old undo manager and connect to the undo manager
	 * associated with the new document.
	 * 
	 * @param document -
	 *            assumes document is not null
	 */
	public void setDocument(IStructuredDocument document) {
		if (fUndoManager != null) {
			fTextViewer.getViewerSelectionManager().removeTextSelectionListener(fUndoNotifier);
			fUndoManager.disconnect(fTextViewer);
		}

		fUndoManager = document.getUndoManager();
		if (fUndoManager != null) {
			fUndoManager.connect(fTextViewer);
			fTextViewer.getViewerSelectionManager().addTextSelectionListener(fUndoNotifier);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.IUndoManager#setMaximalUndoLevel(int)
	 */
	public void setMaximalUndoLevel(int undoLevel) {
		// cannot really set maximal undo level on model-based undo manager
		// because other clients will be affected
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.IUndoManager#undo()
	 */
	public void undo() {
		// forward the request to the model-based undo manager
		if (fUndoManager != null)
			fUndoManager.undo(fTextViewer);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.text.IUndoManager#undoable()
	 */
	public boolean undoable() {
		boolean canUndo = false;

		// forward the request to the model-based undo manager
		if (fUndoManager != null)
			canUndo = fUndoManager.undoable();

		return canUndo;
	}
}
