class UndoListPanel
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package NewUndoTest;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.undo.UndoableEdit;
/**
*
* @author Administrator
*/
public class UndoListPanel extends JPanel implements UndoListener {
// TODO: define the list, listmodel, undo/redo button
DefaultListModel undoModel = new DefaultListModel();
JList undoList = new JList(undoModel);
JScrollPane undoJScrollPane = new JScrollPane(undoList);
NewUndoManager newUndoManager;
JToolBar toolBar = new JToolBar();
JButton undoButton = new JButton("undo");
JButton redoButton = new JButton("redo");
int firstIndex, secondIndex;
//int[] undoIndex;
int state;
public UndoListPanel(final NewUndoManager newUndoManager) {
this.newUndoManager = newUndoManager;
setLayout(new BorderLayout());
newUndoManager.addListener(this);
undoList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
undoJScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
undoJScrollPane.setBorder(BorderFactory.createTitledBorder("Undo"));
undoJScrollPane.setPreferredSize(new Dimension(200, 300));
toolBar.add(redoButton);
toolBar.add(undoButton);
add(undoJScrollPane, BorderLayout.NORTH);
add(toolBar, BorderLayout.SOUTH);
undoButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (newUndoManager.canUndo()) {
newUndoManager.undo();
undoList.setCellRenderer(new MyRenderer(--state, Color.GREEN));
firstIndex--;
}
}
});
redoButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (newUndoManager.canRedo()) {
newUndoManager.redo();
undoList.setCellRenderer(new MyRenderer(++state, Color.GREEN));
firstIndex++;
}
}
});
undoList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent lse) {
if (undoList.getValueIsAdjusting()) {
state = undoList.getSelectedIndex();
secondIndex = undoList.getSelectedIndex();
} else {
firstIndex = undoList.getSelectedIndex();
}
// undoIndex = new int[secondIndex];
// for (int j = 0; j < secondIndex; j++) {
// undoIndex[j] = undoList.getSelectedIndex();
// }
// MyRenderer renderer = new MyRenderer(undoIndex, Color.yellow);
// undoList.setCellRenderer(renderer);
undoList.setCellRenderer(new MyRenderer(secondIndex, Color.GREEN));
if (firstIndex < secondIndex) {
for (int i = firstIndex; i < secondIndex; i++) {
if (newUndoManager.canRedo()) {
newUndoManager.redo();
}
}
} else if (firstIndex >
secondIndex) {
for (int i = firstIndex; i > secondIndex; i--) {
if (newUndoManager.canUndo()) {
newUndoManager.undo();
}
}
}
}
});
}
@Override
public void undoChanged() {
undoModel.removeAllElements();
for (UndoableEdit edit : newUndoManager.getEdits()) {
undoModel.addElement(edit);
state = undoModel.size() - 1;