/*
 * Copyright 2000-2009 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.intellij.ui;

import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.keymap.Keymap;
import com.intellij.openapi.keymap.KeymapManager;

import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.text.JTextComponent;
import javax.swing.undo.UndoManager;

/**
 * @deprecated use {@link com.intellij.util.ui.UIUtil#addUndoRedoActions(javax.swing.text.JTextComponent)}
 * @author yole
 */
public class TextComponentUndoProvider implements Disposable {
  protected final JTextComponent myTextComponent;
  protected final UndoManager myUndoManager = new UndoManager();
  private UndoableEditListener myUndoableEditListener;

  public TextComponentUndoProvider(final JTextComponent textComponent) {
    myTextComponent = textComponent;

    myUndoableEditListener = new UndoableEditListener() {
      @Override
      public void undoableEditHappened(UndoableEditEvent e) {
        myUndoManager.addEdit(e.getEdit());
      }
    };
    myTextComponent.getDocument().addUndoableEditListener(myUndoableEditListener);
    Keymap activeKeymap = KeymapManager.getInstance().getActiveKeymap();
    Shortcut[] undoShortcuts = activeKeymap.getShortcuts(IdeActions.ACTION_UNDO);
    Shortcut[] redoShortcuts = activeKeymap.getShortcuts(IdeActions.ACTION_REDO);

    AnAction undoAction = new AnAction() {
      @Override
      public void update(AnActionEvent e) {
        super.update(e);
        e.getPresentation().setEnabled(canUndo());
      }

      @Override
      public void actionPerformed(AnActionEvent e) {
        undo();
      }
    };

    AnAction redoAction = new AnAction() {
      @Override
      public void update(AnActionEvent e) {
        super.update(e);
        e.getPresentation().setEnabled(canRedo());
      }

      @Override
      public void actionPerformed(AnActionEvent e) {
        redo();
      }
    };

    undoAction.registerCustomShortcutSet(new CustomShortcutSet(undoShortcuts), myTextComponent);
    redoAction.registerCustomShortcutSet(new CustomShortcutSet(redoShortcuts), myTextComponent);
  }

  protected boolean canUndo() {
    return myUndoManager.canUndo();
  }

  protected boolean canRedo() {
    return myUndoManager.canRedo();
  }

  protected void redo() {
    if (myUndoManager.canRedo()) {
      myUndoManager.redo();
    }
  }

  protected void undo() {
    if (myUndoManager.canUndo()) {
      myUndoManager.undo();
    }
  }

  @Override
  public void dispose() {
    if (myUndoableEditListener != null) {
      myTextComponent.getDocument().removeUndoableEditListener(myUndoableEditListener);
      myUndoableEditListener = null;
    }
  }
}
