view src/luan/modules/swing/UndoManagerLuan.java @ 1884:55ad3e7cd01a

swing
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 08 Apr 2025 19:43:00 -0600
parents 3c30ae764004
children 1d60e0ac3b97
line wrap: on
line source

package luan.modules.swing;

import java.util.WeakHashMap;
import javax.swing.event.UndoableEditListener;
import javax.swing.event.UndoableEditEvent;
import javax.swing.undo.UndoManager;
import javax.swing.undo.UndoableEdit;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.CannotRedoException;
import goodjava.util.GoodUtils;
import luan.Luan;
import luan.LuanFunction;
import luan.LuanException;
import luan.LuanRuntimeException;
import goodjava.logging.Logger;
import goodjava.logging.LoggerFactory;


public class UndoManagerLuan extends UndoManager {
	private static final Logger logger = LoggerFactory.getLogger(UndoManagerLuan.class);

	private final WeakHashMap<LuanFunction,Boolean> map = new WeakHashMap<LuanFunction,Boolean>();
	private final Luan luan;
	private UndoableEdit unedited = null;

	public UndoManagerLuan(Luan luan) {
		this.luan = luan;
	}

	private void notifyListeners() {
		for( LuanFunction fn : map.keySet() ) {
			try {
				fn.call(luan);
			} catch(LuanException e) {
				throw new LuanRuntimeException(e);
			}
		}
	}

	@Override public void undoableEditHappened(UndoableEditEvent event) {
		super.undoableEditHappened(event);
		notifyListeners();
	}

	@Override public void undo() throws CannotUndoException {
		super.undo();
		notifyListeners();
	}

	@Override public void redo() throws CannotRedoException {
		super.redo();
		notifyListeners();
	}

	public void addListener(LuanFunction fn) {
		map.put(fn,Boolean.TRUE);
	}

	public boolean isUnedited() {
		return GoodUtils.equal(unedited,editToBeUndone());
	}

	public void setUnedited() {
		unedited = editToBeUndone();
		notifyListeners();
	}

	public void clearUnedited() {
		discardAllEdits();
		unedited = null;
		notifyListeners();
	}
}