Implement Undo
This commit is contained in:
parent
6b79738ce6
commit
fb1460a3d7
@ -8,6 +8,7 @@ package kontakte.controller;
|
|||||||
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -16,10 +17,12 @@ import java.util.HashMap;
|
|||||||
public class CommandInvoker
|
public class CommandInvoker
|
||||||
{
|
{
|
||||||
private HashMap<Component, CommandInterface> commands;
|
private HashMap<Component, CommandInterface> commands;
|
||||||
|
private Stack<CommandInterface> undoStack;
|
||||||
|
|
||||||
public CommandInvoker()
|
public CommandInvoker()
|
||||||
{
|
{
|
||||||
commands = new HashMap<>();
|
commands = new HashMap<>();
|
||||||
|
undoStack = new Stack<CommandInterface>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addCommand(Component key, CommandInterface value)
|
public void addCommand(Component key, CommandInterface value)
|
||||||
@ -30,5 +33,14 @@ public class CommandInvoker
|
|||||||
public void executeCommand(Component key)
|
public void executeCommand(Component key)
|
||||||
{
|
{
|
||||||
commands.get(key).execute();
|
commands.get(key).execute();
|
||||||
|
undoStack.add(commands.get(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void undoCommand()
|
||||||
|
{
|
||||||
|
if (!undoStack.empty())
|
||||||
|
{
|
||||||
|
undoStack.pop().undo();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
40
src/kontakte/controller/CommandNewKontaktCancel.java
Normal file
40
src/kontakte/controller/CommandNewKontaktCancel.java
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* To change this license header, choose License Headers in Project Properties.
|
||||||
|
* To change this template file, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kontakte.controller;
|
||||||
|
|
||||||
|
import kontakte.model.Model;
|
||||||
|
import kontakte.view.View;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author nobody
|
||||||
|
*/
|
||||||
|
public class CommandNewKontaktCancel implements CommandInterface
|
||||||
|
{
|
||||||
|
private View view;
|
||||||
|
private Model model;
|
||||||
|
|
||||||
|
public CommandNewKontaktCancel(View view, Model model)
|
||||||
|
{
|
||||||
|
this.view = view;
|
||||||
|
this.model = model;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute()
|
||||||
|
{
|
||||||
|
view.getTextName().setText("");
|
||||||
|
view.getTextCity().setText("");
|
||||||
|
view.getTextStreet().setText("");
|
||||||
|
view.getAddEntryFrame().dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void undo()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
package kontakte.controller;
|
package kontakte.controller;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Stack;
|
||||||
import kontakte.model.Kontakt;
|
import kontakte.model.Kontakt;
|
||||||
import kontakte.model.Model;
|
import kontakte.model.Model;
|
||||||
import kontakte.view.View;
|
import kontakte.view.View;
|
||||||
@ -18,11 +20,14 @@ public class CommandNewKontaktOk implements CommandInterface
|
|||||||
{
|
{
|
||||||
private View view;
|
private View view;
|
||||||
private Model model;
|
private Model model;
|
||||||
|
private Stack<Kontakt> undoStack;
|
||||||
|
|
||||||
public CommandNewKontaktOk(View view, Model model)
|
public CommandNewKontaktOk(View view, Model model)
|
||||||
{
|
{
|
||||||
this.view = view;
|
this.view = view;
|
||||||
this.model = model;
|
this.model = model;
|
||||||
|
view.getAddEntryFrame().pack();
|
||||||
|
undoStack = new Stack<Kontakt>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -31,13 +36,34 @@ public class CommandNewKontaktOk implements CommandInterface
|
|||||||
String name = view.getTextName().getText();
|
String name = view.getTextName().getText();
|
||||||
String wohnort = view.getTextCity().getText();
|
String wohnort = view.getTextCity().getText();
|
||||||
String strasse = view.getTextStreet().getText();
|
String strasse = view.getTextStreet().getText();
|
||||||
|
view.getTextName().setText("");
|
||||||
|
view.getTextCity().setText("");
|
||||||
|
view.getTextStreet().setText("");
|
||||||
Kontakt neuKon = new Kontakt(name, wohnort, strasse);
|
Kontakt neuKon = new Kontakt(name, wohnort, strasse);
|
||||||
model.addKontakt(neuKon);
|
model.addKontakt(neuKon);
|
||||||
view.getAddEntryFrame().setVisible(false);
|
undoStack.add(neuKon);
|
||||||
|
redrawTextbox();
|
||||||
|
view.getAddEntryFrame().dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void undo()
|
public void undo()
|
||||||
{
|
{
|
||||||
|
if(!undoStack.empty())
|
||||||
|
{
|
||||||
|
model.deleteKontakt(undoStack.pop());
|
||||||
|
redrawTextbox();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void redrawTextbox()
|
||||||
|
{
|
||||||
|
view.getTxtKontakte().setText("");
|
||||||
|
for (Map.Entry<String, Kontakt> k: model.kontaktliste.entrySet())
|
||||||
|
{
|
||||||
|
view.getTxtKontakte().append(k.getValue().name + " ");
|
||||||
|
view.getTxtKontakte().append(k.getValue().wohnort + " ");
|
||||||
|
view.getTxtKontakte().append(k.getValue().strasse + "\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,9 @@ public class Controller implements ActionListener
|
|||||||
view.getBtnSave().addActionListener(this);
|
view.getBtnSave().addActionListener(this);
|
||||||
view.getMenuSave().addActionListener(this);
|
view.getMenuSave().addActionListener(this);
|
||||||
view.getBtnNewEntry().addActionListener(this);
|
view.getBtnNewEntry().addActionListener(this);
|
||||||
|
view.getBtnOk().addActionListener(this);
|
||||||
|
view.getBtnCancel().addActionListener(this);
|
||||||
|
view.getMenuUndo().addActionListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerCommands()
|
public void registerCommands()
|
||||||
@ -47,13 +50,22 @@ public class Controller implements ActionListener
|
|||||||
invoker.addCommand(view.getBtnSave(), cmdSave);
|
invoker.addCommand(view.getBtnSave(), cmdSave);
|
||||||
invoker.addCommand(view.getMenuSave(), cmdSave);
|
invoker.addCommand(view.getMenuSave(), cmdSave);
|
||||||
invoker.addCommand(view.getBtnNewEntry(), new CommandNewKontaktVisible(view, model));
|
invoker.addCommand(view.getBtnNewEntry(), new CommandNewKontaktVisible(view, model));
|
||||||
|
invoker.addCommand(view.getBtnOk(),new CommandNewKontaktOk(view,model));
|
||||||
|
invoker.addCommand(view.getBtnCancel(),new CommandNewKontaktCancel(view,model));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e)
|
public void actionPerformed(ActionEvent e)
|
||||||
{
|
{
|
||||||
Component key = (Component)e.getSource();
|
Component key = (Component)e.getSource();
|
||||||
invoker.executeCommand(key);
|
if(key != view.getMenuUndo())
|
||||||
|
{
|
||||||
|
invoker.executeCommand(key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
invoker.undoCommand();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -168,6 +168,16 @@
|
|||||||
<Property name="text" type="java.lang.String" value="Delete Entry"/>
|
<Property name="text" type="java.lang.String" value="Delete Entry"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
<MenuItem class="javax.swing.JMenuItem" name="menuUndo">
|
||||||
|
<Properties>
|
||||||
|
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
|
||||||
|
<KeyStroke key="Ctrl+Z"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="mnemonic" type="int" value="85"/>
|
||||||
|
<Property name="text" type="java.lang.String" value="Undo"/>
|
||||||
|
<Property name="toolTipText" type="java.lang.String" value=""/>
|
||||||
|
</Properties>
|
||||||
|
</MenuItem>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Menu>
|
</Menu>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
@ -264,32 +274,6 @@
|
|||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
|
|
||||||
<AuxValues>
|
|
||||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
|
||||||
</AuxValues>
|
|
||||||
<Constraints>
|
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
|
||||||
<BorderConstraints direction="Center"/>
|
|
||||||
</Constraint>
|
|
||||||
</Constraints>
|
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
|
||||||
<SubComponents>
|
|
||||||
<Component class="javax.swing.JTable" name="tableContacts">
|
|
||||||
<Properties>
|
|
||||||
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
|
|
||||||
<Table columnCount="4" rowCount="4">
|
|
||||||
<Column editable="true" title="Title 1" type="java.lang.Object"/>
|
|
||||||
<Column editable="true" title="Title 2" type="java.lang.Object"/>
|
|
||||||
<Column editable="true" title="Title 3" type="java.lang.Object"/>
|
|
||||||
<Column editable="true" title="Title 4" type="java.lang.Object"/>
|
|
||||||
</Table>
|
|
||||||
</Property>
|
|
||||||
</Properties>
|
|
||||||
</Component>
|
|
||||||
</SubComponents>
|
|
||||||
</Container>
|
|
||||||
<Container class="javax.swing.JLayeredPane" name="jLayeredPane2">
|
<Container class="javax.swing.JLayeredPane" name="jLayeredPane2">
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||||
@ -342,6 +326,26 @@
|
|||||||
</Component>
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="jScrollPane2">
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||||
|
<BorderConstraints direction="Center"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JTextArea" name="txtKontakte">
|
||||||
|
<Properties>
|
||||||
|
<Property name="columns" type="int" value="20"/>
|
||||||
|
<Property name="rows" type="int" value="5"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
|
@ -131,14 +131,6 @@ public class View extends javax.swing.JFrame
|
|||||||
return menuSave;
|
return menuSave;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the tableContacts
|
|
||||||
*/
|
|
||||||
public javax.swing.JTable getTableContacts()
|
|
||||||
{
|
|
||||||
return tableContacts;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the textCity
|
* @return the textCity
|
||||||
*/
|
*/
|
||||||
@ -226,14 +218,14 @@ public class View extends javax.swing.JFrame
|
|||||||
btnClose = new javax.swing.JButton();
|
btnClose = new javax.swing.JButton();
|
||||||
textFileAdress = new javax.swing.JTextField();
|
textFileAdress = new javax.swing.JTextField();
|
||||||
jLayeredPane1 = new javax.swing.JLayeredPane();
|
jLayeredPane1 = new javax.swing.JLayeredPane();
|
||||||
jScrollPane1 = new javax.swing.JScrollPane();
|
|
||||||
tableContacts = new javax.swing.JTable();
|
|
||||||
jLayeredPane2 = new javax.swing.JLayeredPane();
|
jLayeredPane2 = new javax.swing.JLayeredPane();
|
||||||
btnNewEntry = new javax.swing.JButton();
|
btnNewEntry = new javax.swing.JButton();
|
||||||
jButton2 = new javax.swing.JButton();
|
jButton2 = new javax.swing.JButton();
|
||||||
jLayeredPane3 = new javax.swing.JLayeredPane();
|
jLayeredPane3 = new javax.swing.JLayeredPane();
|
||||||
textFindTip = new javax.swing.JTextField();
|
textFindTip = new javax.swing.JTextField();
|
||||||
textFind = new javax.swing.JTextField();
|
textFind = new javax.swing.JTextField();
|
||||||
|
jScrollPane2 = new javax.swing.JScrollPane();
|
||||||
|
txtKontakte = new javax.swing.JTextArea();
|
||||||
jMenuBar1 = new javax.swing.JMenuBar();
|
jMenuBar1 = new javax.swing.JMenuBar();
|
||||||
menuFile = new javax.swing.JMenu();
|
menuFile = new javax.swing.JMenu();
|
||||||
menuOpen = new javax.swing.JMenuItem();
|
menuOpen = new javax.swing.JMenuItem();
|
||||||
@ -242,6 +234,7 @@ public class View extends javax.swing.JFrame
|
|||||||
menuEdit = new javax.swing.JMenu();
|
menuEdit = new javax.swing.JMenu();
|
||||||
menuAddEntry = new javax.swing.JMenuItem();
|
menuAddEntry = new javax.swing.JMenuItem();
|
||||||
menuDeleteEntry = new javax.swing.JMenuItem();
|
menuDeleteEntry = new javax.swing.JMenuItem();
|
||||||
|
menuUndo = new javax.swing.JMenuItem();
|
||||||
|
|
||||||
addEntryFrame.getContentPane().setLayout(new javax.swing.BoxLayout(addEntryFrame.getContentPane(), javax.swing.BoxLayout.Y_AXIS));
|
addEntryFrame.getContentPane().setLayout(new javax.swing.BoxLayout(addEntryFrame.getContentPane(), javax.swing.BoxLayout.Y_AXIS));
|
||||||
|
|
||||||
@ -326,23 +319,6 @@ public class View extends javax.swing.JFrame
|
|||||||
|
|
||||||
jLayeredPane1.setLayout(new java.awt.BorderLayout());
|
jLayeredPane1.setLayout(new java.awt.BorderLayout());
|
||||||
|
|
||||||
tableContacts.setModel(new javax.swing.table.DefaultTableModel(
|
|
||||||
new Object [][]
|
|
||||||
{
|
|
||||||
{null, null, null, null},
|
|
||||||
{null, null, null, null},
|
|
||||||
{null, null, null, null},
|
|
||||||
{null, null, null, null}
|
|
||||||
},
|
|
||||||
new String []
|
|
||||||
{
|
|
||||||
"Title 1", "Title 2", "Title 3", "Title 4"
|
|
||||||
}
|
|
||||||
));
|
|
||||||
jScrollPane1.setViewportView(tableContacts);
|
|
||||||
|
|
||||||
jLayeredPane1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
|
|
||||||
|
|
||||||
jLayeredPane2.setLayout(new java.awt.FlowLayout());
|
jLayeredPane2.setLayout(new java.awt.FlowLayout());
|
||||||
|
|
||||||
btnNewEntry.setIcon(new javax.swing.ImageIcon(getClass().getResource("/kontakte/view/img/Add24.gif"))); // NOI18N
|
btnNewEntry.setIcon(new javax.swing.ImageIcon(getClass().getResource("/kontakte/view/img/Add24.gif"))); // NOI18N
|
||||||
@ -366,6 +342,12 @@ public class View extends javax.swing.JFrame
|
|||||||
|
|
||||||
jLayeredPane1.add(jLayeredPane3, java.awt.BorderLayout.PAGE_START);
|
jLayeredPane1.add(jLayeredPane3, java.awt.BorderLayout.PAGE_START);
|
||||||
|
|
||||||
|
txtKontakte.setColumns(20);
|
||||||
|
txtKontakte.setRows(5);
|
||||||
|
jScrollPane2.setViewportView(txtKontakte);
|
||||||
|
|
||||||
|
jLayeredPane1.add(jScrollPane2, java.awt.BorderLayout.CENTER);
|
||||||
|
|
||||||
getContentPane().add(jLayeredPane1, java.awt.BorderLayout.CENTER);
|
getContentPane().add(jLayeredPane1, java.awt.BorderLayout.CENTER);
|
||||||
|
|
||||||
menuFile.setMnemonic('F');
|
menuFile.setMnemonic('F');
|
||||||
@ -407,6 +389,12 @@ public class View extends javax.swing.JFrame
|
|||||||
menuDeleteEntry.setText("Delete Entry");
|
menuDeleteEntry.setText("Delete Entry");
|
||||||
menuEdit.add(menuDeleteEntry);
|
menuEdit.add(menuDeleteEntry);
|
||||||
|
|
||||||
|
menuUndo.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Z, java.awt.event.InputEvent.CTRL_MASK));
|
||||||
|
menuUndo.setMnemonic('U');
|
||||||
|
menuUndo.setText("Undo");
|
||||||
|
menuUndo.setToolTipText("");
|
||||||
|
menuEdit.add(menuUndo);
|
||||||
|
|
||||||
jMenuBar1.add(menuEdit);
|
jMenuBar1.add(menuEdit);
|
||||||
|
|
||||||
setJMenuBar(jMenuBar1);
|
setJMenuBar(jMenuBar1);
|
||||||
@ -483,7 +471,7 @@ public class View extends javax.swing.JFrame
|
|||||||
private javax.swing.JLayeredPane jLayeredPane7;
|
private javax.swing.JLayeredPane jLayeredPane7;
|
||||||
private javax.swing.JLayeredPane jLayeredPane8;
|
private javax.swing.JLayeredPane jLayeredPane8;
|
||||||
private javax.swing.JMenuBar jMenuBar1;
|
private javax.swing.JMenuBar jMenuBar1;
|
||||||
private javax.swing.JScrollPane jScrollPane1;
|
private javax.swing.JScrollPane jScrollPane2;
|
||||||
private javax.swing.JTextField jTextField1;
|
private javax.swing.JTextField jTextField1;
|
||||||
private javax.swing.JTextField jTextField3;
|
private javax.swing.JTextField jTextField3;
|
||||||
private javax.swing.JTextField jTextField5;
|
private javax.swing.JTextField jTextField5;
|
||||||
@ -495,12 +483,29 @@ public class View extends javax.swing.JFrame
|
|||||||
private javax.swing.JMenu menuFile;
|
private javax.swing.JMenu menuFile;
|
||||||
private javax.swing.JMenuItem menuOpen;
|
private javax.swing.JMenuItem menuOpen;
|
||||||
private javax.swing.JMenuItem menuSave;
|
private javax.swing.JMenuItem menuSave;
|
||||||
private javax.swing.JTable tableContacts;
|
private javax.swing.JMenuItem menuUndo;
|
||||||
private javax.swing.JTextField textCity;
|
private javax.swing.JTextField textCity;
|
||||||
private javax.swing.JTextField textFileAdress;
|
private javax.swing.JTextField textFileAdress;
|
||||||
private javax.swing.JTextField textFind;
|
private javax.swing.JTextField textFind;
|
||||||
private javax.swing.JTextField textFindTip;
|
private javax.swing.JTextField textFindTip;
|
||||||
private javax.swing.JTextField textName;
|
private javax.swing.JTextField textName;
|
||||||
private javax.swing.JTextField textStreet;
|
private javax.swing.JTextField textStreet;
|
||||||
|
private javax.swing.JTextArea txtKontakte;
|
||||||
// End of variables declaration//GEN-END:variables
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the txtKontakte
|
||||||
|
*/
|
||||||
|
public javax.swing.JTextArea getTxtKontakte()
|
||||||
|
{
|
||||||
|
return txtKontakte;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the menuUndo
|
||||||
|
*/
|
||||||
|
public javax.swing.JMenuItem getMenuUndo()
|
||||||
|
{
|
||||||
|
return menuUndo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user