Skip to content

Commit 59d4bb8

Browse files
committed
Finish Undo Redo UI
1 parent 6497394 commit 59d4bb8

8 files changed

Lines changed: 179 additions & 197 deletions

File tree

src/actions/ShowHistory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import java.awt.Dimension;
44

55
import ui.PaintPanel;
6-
import ui.helper.historyui.undoredoLog.UndoredoLog;
6+
import ui.helper.historyui.undoredoLog.UndoredoDialog;
77

88
public class ShowHistory extends PaintAction {
99

@@ -23,7 +23,7 @@ public boolean canPerformAction() {
2323
public void performAction() {
2424
// TODO Auto-generated method stub
2525

26-
UndoredoLog.sharedInstance().setVisible(true);
26+
UndoredoDialog.sharedInstance().setVisible(true);
2727

2828
}
2929

src/actions/edit/undoredo/SharedUndoRedoActionManager.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void redo() {
3939
UndoRedoableInterface redoableAction = redoStack.pop();
4040
redoableAction.redoAction();
4141
undoStack.add(redoableAction);
42-
delegate.didUndoAction(redoableAction);
42+
delegate.didRedoAction(redoableAction);
4343
}
4444

4545
public boolean canUndo() {
@@ -53,14 +53,27 @@ public boolean canRedo() {
5353
public void pushUndoableAction( UndoRedoableInterface undoredoableAction ) {
5454
undoStack.push(undoredoableAction);
5555
redoStack.clear();
56+
delegate.didAddNewAction(undoredoableAction);
5657
}
5758

58-
public SharedUndoRedoActionManagerDelegate getDelegate() {
59-
return delegate;
60-
}
59+
6160

6261
public void setDelegate(SharedUndoRedoActionManagerDelegate delegate) {
6362
this.delegate = delegate;
6463
}
6564

65+
/**
66+
* @return the undoStack
67+
*/
68+
public Stack<UndoRedoableInterface> getUndoStack() {
69+
return undoStack;
70+
}
71+
72+
/**
73+
* @return the redoStack
74+
*/
75+
public Stack<UndoRedoableInterface> getRedoStack() {
76+
return redoStack;
77+
}
78+
6679
}

src/actions/edit/undoredo/SharedUndoRedoActionManagerDelegate.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ public interface SharedUndoRedoActionManagerDelegate {
44

55
public void didUndoAction(UndoRedoableInterface obj);
66
public void didRedoAction(UndoRedoableInterface obj);
7+
public void didAddNewAction(UndoRedoableInterface undoredoableAction);
78
}

src/ui/helper/historyui/HistoryUI.java

Lines changed: 29 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import java.awt.event.ActionEvent;
55
import java.awt.event.ActionListener;
66
import java.util.Arrays;
7-
import java.util.Stack;
8-
import java.util.stream.IntStream;
97

8+
import javax.swing.DefaultListSelectionModel;
9+
import javax.swing.JButton;
1010
import javax.swing.JFrame;
1111
import javax.swing.JPanel;
1212
import javax.swing.JScrollPane;
@@ -15,32 +15,27 @@
1515
import javax.swing.table.DefaultTableModel;
1616

1717

18-
import javax.swing.DefaultListSelectionModel;
19-
import javax.swing.JButton;
20-
21-
2218
/**
2319
* create historyUI
2420
*
2521
*/
26-
public class HistoryUI extends JFrame implements ActionListener
22+
public class HistoryUI extends JFrame
2723
{
28-
private static final long serialVersionUID = 8141494344180865577L;
2924
private JTable resultsTable;
3025
private DefaultTableModel defaultTableModel;
3126
private JPanel panel;
3227
private JScrollPane scrollPane;
3328
private JPanel button_panel;
3429

35-
private Stack<HistoryDataObject[]> delete_history;
30+
private HistoryUIInterface delegate;
3631

3732
/**
3833
* Setup historyUI
3934
*/
4035
public HistoryUI(String[] titles){
4136

4237
// set the defaultTableModel to non editable by user clicking around
43-
setDefaultTableModel(new DefaultTableModel(0, 1) {
38+
this.defaultTableModel = (new DefaultTableModel(0, 1) {
4439
private static final long serialVersionUID = 1L;
4540

4641
@Override
@@ -55,16 +50,14 @@ public boolean isCellEditable(int row, int column) {
5550
panel.setLayout(new BorderLayout(0, 0));
5651

5752
// show result
58-
setResultsTable(new JTable());
59-
getResultsTable().setModel(getDefaultTableModel());
60-
getResultsTable().setSelectionModel(new ForcedListSelectionModel());
53+
this.resultsTable= (new JTable());
54+
resultsTable.setModel(defaultTableModel);
55+
resultsTable.setSelectionModel(new ForcedListSelectionModel());
6156

6257
// scroll option
63-
scrollPane = new JScrollPane(getResultsTable());
58+
scrollPane = new JScrollPane(resultsTable);
6459
panel.add(scrollPane, BorderLayout.CENTER);
6560

66-
//stack, used to stored deleted rows
67-
setDelete_history(new Stack<>());
6861

6962
//create buttons for panel
7063
createButtons(titles);
@@ -80,51 +73,17 @@ private void createButtons(String[] titles){
8073
for (String title : titles){
8174
JButton button = new JButton(title);
8275
button_panel.add(button);
83-
button.addActionListener(this);
76+
button.addActionListener(new ActionListener() {
77+
78+
@Override
79+
public void actionPerformed(ActionEvent e) {
80+
delegate.didPressButton(title, resultsTable.getSelectedRow());
81+
}
82+
});
8483
}
8584
}
8685

87-
@Override
88-
public void actionPerformed(ActionEvent e) {
89-
// TODO Auto-generated method stub
90-
JButton btn = (JButton) e.getSource();
91-
if(btn.getText().equals("delete")){
92-
System.out.println("aaaa");
93-
int[] indices = getResultsTable().getSelectedRows();
94-
if(indices.length != 0)
95-
removeSeveralRows(indices);
96-
}
97-
//if exit button pressed, close window
98-
else if(btn.getText().equals("exit")){
99-
System.exit(EXIT_ON_CLOSE);
100-
}
101-
102-
//if revert button pressed, revert to last version
103-
else if(btn.getText().equals("revert")){
104-
revert();
105-
}
106-
107-
//if clear button pressed, delete all rows in table
108-
else if(btn.getText().equals("clear")){
109-
int num_rows = getResultsTable().getRowCount();
110-
int[] indices = IntStream.range(0, num_rows).toArray();
111-
removeSeveralRows(indices);
112-
}
113-
}
11486

115-
/**
116-
* revert deleted rows
117-
*/
118-
public void revert(){
119-
120-
if(!getDelete_history().isEmpty()){
121-
HistoryDataObject[] objects = delete_history.pop();
122-
//insert data to its row
123-
for(int i = 0; i<objects.length; i++){
124-
getDefaultTableModel().insertRow(objects[i].getRow(), new Object[] {objects[i]} );
125-
}
126-
}
127-
}
12887

12988

13089

@@ -133,8 +92,8 @@ public void revert(){
13392
* receive a HistoryDataObject
13493
*/
13594
public void insert(HistoryDataObject e){
136-
getDefaultTableModel().addRow(new Object[] {e});
137-
getDefaultTableModel().fireTableDataChanged();
95+
defaultTableModel.addRow(new Object[] {e});
96+
defaultTableModel.fireTableDataChanged();
13897
}
13998

14099

@@ -149,42 +108,23 @@ public void removeSeveralRows(int[] indices){
149108

150109
//loop through indices and delete
151110
for(int i=indices.length-1;i>=0;i--){
152-
objects[i] = (HistoryDataObject) getResultsTable().getModel().getValueAt(indices[i], 0);
111+
objects[i] = (HistoryDataObject) defaultTableModel.getValueAt(indices[i], 0);
153112
objects[i].setRow(indices[i]);
154-
getDefaultTableModel().removeRow(indices[i]);
113+
defaultTableModel.removeRow(indices[i]);
155114
}
156115

157-
//stores deleted rows and its data to delete_history stack
158-
getDelete_history().push(objects);
159-
}
160-
161-
public void setDelegate(HistoryUIInterface delegate) {
162-
}
163-
164-
public DefaultTableModel getDefaultTableModel() {
165-
return defaultTableModel;
166-
}
167-
168-
169-
public void setDefaultTableModel(DefaultTableModel defaultTableModel) {
170-
this.defaultTableModel = defaultTableModel;
171116
}
172-
173-
public JTable getResultsTable() {
174-
return resultsTable;
175-
}
176-
177-
178-
public void setResultsTable(JTable resultsTable) {
179-
this.resultsTable = resultsTable;
180-
}
181-
182-
public Stack<HistoryDataObject[]> getDelete_history() {
183-
return delete_history;
117+
118+
public void clear(){
119+
int rowCount = defaultTableModel.getRowCount();
120+
for(int i = 0; i < rowCount; i++){
121+
defaultTableModel.removeRow(0);
122+
}
123+
defaultTableModel.fireTableDataChanged();
184124
}
185125

186-
public void setDelete_history( Stack<HistoryDataObject[]> delete_history) {
187-
this.delete_history = delete_history;
126+
public void setDelegate(HistoryUIInterface delegate) {
127+
this.delegate = delegate;
188128
}
189129

190130
/**

src/ui/helper/historyui/HistoryUIInterface.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
public interface HistoryUIInterface {
44

5-
/**
6-
* Called when a button is pressed.
7-
* @param buttonName The name of the button
8-
* @param selectedRow the index of selected row. -1 if no row selected
9-
*/
5+
/**
6+
* Called when a button is pressed.
7+
* @param buttonName The name of the button
8+
* @param selectedRow the index of selected row. -1 if no row selected
9+
*/
1010

11-
public void didPressButton(String buttonName, int selectedRow);
11+
public void didPressButton(String buttonName, int selectedRow);
1212
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package ui.helper.historyui.undoredoLog;
2+
3+
4+
5+
import java.awt.event.ActionEvent;
6+
import java.util.Arrays;
7+
import java.util.Stack;
8+
import java.util.stream.IntStream;
9+
10+
11+
import javax.swing.JButton;
12+
import javax.swing.undo.UndoManager;
13+
14+
import actions.edit.undoredo.SharedUndoRedoActionManager;
15+
import actions.edit.undoredo.SharedUndoRedoActionManagerDelegate;
16+
import actions.edit.undoredo.UndoRedoableInterface;
17+
import ui.helper.historyui.HistoryDataObject;
18+
import ui.helper.historyui.HistoryUI;
19+
import ui.helper.historyui.HistoryUIInterface;
20+
21+
public class UndoredoDialog extends HistoryUI implements HistoryUIInterface{
22+
23+
private static final String BUTTON_TITLE_REDO = "Redo";
24+
private static final String BUTTON_TITLE_UNDO = "Undo";
25+
SharedUndoRedoActionManager undoRedoManager;
26+
Stack<Integer> num_undo;
27+
28+
private UndoredoDialog(String[] titles) {
29+
super(titles);
30+
num_undo = new Stack<>();
31+
setDelegate(this);
32+
33+
undoRedoManager = SharedUndoRedoActionManager.getSharedInstance();
34+
undoRedoManager.setDelegate(new SharedUndoRedoActionManagerDelegate() {
35+
36+
@Override
37+
public void didUndoAction(UndoRedoableInterface obj) {
38+
update();
39+
40+
41+
}
42+
43+
@Override
44+
public void didRedoAction(UndoRedoableInterface obj) {
45+
46+
update();
47+
}
48+
49+
@Override
50+
public void didAddNewAction(
51+
UndoRedoableInterface undoredoableAction) {
52+
update();
53+
54+
}
55+
});
56+
}
57+
58+
static UndoredoDialog instance = new UndoredoDialog(new String[]{BUTTON_TITLE_UNDO, BUTTON_TITLE_REDO});
59+
60+
public static UndoredoDialog sharedInstance(){
61+
return instance;
62+
}
63+
64+
65+
private void update(){
66+
clear();
67+
Stack<UndoRedoableInterface> undoStack = undoRedoManager.getUndoStack();
68+
69+
for(int i = 0; i < undoStack.size(); i ++){
70+
insert(new HistoryDataObject(undoStack.get(i).description()));
71+
}
72+
73+
74+
Stack<UndoRedoableInterface> redoStack = undoRedoManager.getRedoStack();
75+
for(int i = redoStack.size() - 1 ; i >= 0; i --){
76+
HistoryDataObject historyDataObject = new HistoryDataObject(redoStack.get(i).description());
77+
historyDataObject.setUntraced(true);
78+
insert(historyDataObject);
79+
}
80+
81+
82+
83+
}
84+
85+
86+
@Override
87+
public void didPressButton(String buttonName, int selectedRow) {
88+
switch (buttonName) {
89+
case BUTTON_TITLE_UNDO:
90+
if(selectedRow == -1){
91+
undoRedoManager.undo();
92+
} else {
93+
//undo until reached this action
94+
if(selectedRow < undoRedoManager.getUndoStack().size() ){
95+
for (int i = 0; i < undoRedoManager.getUndoStack().size() - selectedRow + 1; i++) {
96+
undoRedoManager.undo();
97+
}
98+
}
99+
}
100+
break;
101+
102+
case BUTTON_TITLE_REDO:
103+
if (selectedRow == -1 ){
104+
undoRedoManager.redo();
105+
} else {
106+
//if select on redo
107+
if(selectedRow >= undoRedoManager.getUndoStack().size() ){
108+
//undo select - size +1 times
109+
for (int i = 0; i < selectedRow - undoRedoManager.getUndoStack().size() + 2 ; i++) {
110+
undoRedoManager.redo();
111+
}
112+
}
113+
}
114+
115+
default:
116+
break;
117+
}
118+
119+
update();
120+
121+
}
122+
123+
}

0 commit comments

Comments
 (0)