New to undo/redo on component

hello all,
i'm new to swing programming & i have to develop a web enabled application. in that i'm having an internalframe which contains a panel with some labels in it. i'm able to move the labels around the panel by using mouse listener. but my problem is i have to implement undo/redo functionality on this movement. but i don't know how to proceed since i don't have a single idea abt this api. i got some materials related to undo/redo of textual components. but nothing related to this labels or components like that. can someone help me on this topic or guide me to some links which has details. if u can provide me some code samples i'll be really greateful.
Thanks in advance

The Java Tutorial provides a section on how to implement the java.swing.undo package.
http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.html#undo
The TextComponentDemo example code it references uses a text Document to generate the UndoableEditListener events, but any component document or data model can be coded to do the same thing, such as the data model for your label placement panel. The listeners are usually added by a controlling parent class, such as a JFrame.
* Create an addUndoableEditListener(UndoableEditListener listener) method in your model class.
* Whenever an undoable edit is done in your model class, create an UndoableEditEvent object with the undoable edit data and call the undoableEditHappened(UndoableEditEvent e) method for all of your registered listeners.
* Create an UndoManager object in your controlling parent class.
* Create UndoAction and RedoAction subclassed objects in your controlling parent class.
* Create an UndoableEditListener object in your controlling parent class and add it to your model class.
The listeners will handle adding the UndoableEditEvent object to the UndoManager and updating any menu or toolbar Undo/Redo actions. The Undo/Redo actions will handle performing the commands via the UndoManager and updating the state of the Undo/Redo actions.
I hope you find this of some help.

Similar Messages

  • To many undo redo button

    Hi to everyone!!!
    I need your advice for my problem!!
    when I cliked new in the file to create a new JTextPane the undo redo button will multiply and if I have so many JTextPane then I have many undo redo in my toolbar
    here is my code.
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.text.*;
    import java.util.*;
    import javax.swing.undo.*;
    public class URTest extends JFrame {
         JToolBar toolBar = new JToolBar();
         JButton undo;
         JButton redo = new JButton("Redo");
         JMenuBar menuBar = new JMenuBar();
         JMenu menu = new JMenu("File");
         JMenuItem item = new JMenuItem("New");
         JMenuItem item2 = new JMenuItem("Close");
         JTabbedPane tabbedPane = new JTabbedPane();
         JTextPane pane;
         public URTest() {
              item.addActionListener(new ActionListener() {
                   public void actionPerformed(ActionEvent e) {
                        create();
              item2.addActionListener(new ActionListener() {
                   public void actionPerformed(ActionEvent e) {
                        removeCreate();
              menu.add(item);
              menu.add(item2);
              menuBar.add(menu);
              this.add(toolBar,BorderLayout.NORTH);
              this.add(tabbedPane);
              this.setJMenuBar(menuBar);
         void create() {
              undo = new JButton("Undo");
              redo = new JButton("Redo");
              pane = new JTextPane();
              EditorKit editorKit = new StyledEditorKit() {
                   public Document createDefaultDocument() {
                        return new SyntaxDocument();
              pane.setEditorKit(editorKit);
              final CompoundUndoManager undoManager = new CompoundUndoManager( pane );
              undo.addActionListener( new ActionListener()
                   public void actionPerformed(ActionEvent e)
                        try
                             undoManager.undo();
                             pane.requestFocus();
                        catch (CannotUndoException ex)
                             System.out.println("Unable to undo: " + ex);
              redo.addActionListener( new ActionListener()
                   public void actionPerformed(ActionEvent e)
                        try
                             undoManager.redo();
                             pane.requestFocus();
                        catch (CannotRedoException ex)
                             System.out.println("Unable to redo: " + ex);
              toolBar.add(undo);
              toolBar.add(redo);
              tabbedPane.addTab("Tab",pane);
         void removeCreate() {
              tabbedPane.remove(tabbedPane.getSelectedIndex());
         public static void main(String[] args) {
              URTest frame = new URTest();
              frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
              frame.setSize(400,400);
              frame.setVisible(true);
    class CompoundUndoManager extends UndoManager
         implements UndoableEditListener, DocumentListener
         public CompoundEdit compoundEdit;
         private JTextComponent editor;
         //  These fields are used to help determine whether the edit is an
         //  incremental edit. For each character added the offset and length
         //  should increase by 1 or decrease by 1 for each character removed.
         private int lastOffset;
         private int lastLength;
         public CompoundUndoManager(JTextComponent editor)
              this.editor = editor;
              editor.getDocument().addUndoableEditListener( this );
         **  Add a DocumentLister before the undo is done so we can position
         **  the Caret correctly as each edit is undone.
         public void undo()
              editor.getDocument().addDocumentListener( this );
              super.undo();
              editor.getDocument().removeDocumentListener( this );
         **  Add a DocumentLister before the redo is done so we can position
         **  the Caret correctly as each edit is redone.
         public void redo()
              editor.getDocument().addDocumentListener( this );
              super.redo();
              editor.getDocument().removeDocumentListener( this );
         **  Whenever an UndoableEdit happens the edit will either be absorbed
         **  by the current compound edit or a new compound edit will be started
         public void undoableEditHappened(UndoableEditEvent e)
              //  Start a new compound edit
              if (compoundEdit == null)
                   compoundEdit = startCompoundEdit( e.getEdit() );
                   lastLength = editor.getDocument().getLength();
                   return;
              //  Check for an attribute change
              AbstractDocument.DefaultDocumentEvent event =
                   (AbstractDocument.DefaultDocumentEvent)e.getEdit();
              if  (event.getType().equals(DocumentEvent.EventType.CHANGE))
                   compoundEdit.addEdit( e.getEdit() );
                   return;
              //  Check for an incremental edit or backspace.
              //  The change in Caret position and Document length should be either
              //  1 or -1 .
              int offsetChange = editor.getCaretPosition() - lastOffset;
              int lengthChange = editor.getDocument().getLength() - lastLength;
              if (Math.abs(offsetChange) == 1
              &&  Math.abs(lengthChange) == 1)
                   compoundEdit.addEdit( e.getEdit() );
                   lastOffset = editor.getCaretPosition();
                   lastLength = editor.getDocument().getLength();
                   return;
              //  Not incremental edit, end previous edit and start a new one
              compoundEdit.end();
              compoundEdit = startCompoundEdit( e.getEdit() );
         **  Each CompoundEdit will store a group of related incremental edits
         **  (ie. each character typed or backspaced is an incremental edit)
         private CompoundEdit startCompoundEdit(UndoableEdit anEdit)
              //  Track Caret and Document information of this compound edit
              lastOffset = editor.getCaretPosition();
              lastLength = editor.getDocument().getLength();
              //  The compound edit is used to store incremental edits
              compoundEdit = new MyCompoundEdit();
              compoundEdit.addEdit( anEdit );
              //  The compound edit is added to the UndoManager. All incremental
              //  edits stored in the compound edit will be undone/redone at once
              addEdit( compoundEdit );
              return compoundEdit;
         //  Implement DocumentListener
         //      Updates to the Document as a result of Undo/Redo will cause the
         //  Caret to be repositioned
         public void insertUpdate(final DocumentEvent e)
              SwingUtilities.invokeLater(new Runnable()
                   public void run()
                        int offset = e.getOffset() + e.getLength();
                        offset = Math.min(offset, editor.getDocument().getLength());
                        editor.setCaretPosition( offset );
         public void removeUpdate(DocumentEvent e)
              editor.setCaretPosition(e.getOffset());
         public void changedUpdate(DocumentEvent e)      {}
         class MyCompoundEdit extends CompoundEdit
              public boolean isInProgress()
                   //  in order for the canUndo() and canRedo() methods to work
                   //  assume that the compound edit is never in progress
                   return false;
              public void undo() throws CannotUndoException
                   //  End the edit so future edits don't get absorbed by this edit
                   if (compoundEdit != null)
                        compoundEdit.end();
                   super.undo();
                   //  Always start a new compound edit after an undo
                   compoundEdit = null;

    I was not actually sure what you wanted so I made the wild guess that you actually wanted only one pair of Undo/Redo buttons. Here you go :import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.util.List;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.text.*;
    import javax.swing.undo.*;
    public class URTest extends JPanel {
         private JMenuBar theMenuBar;
         private JTabbedPane theTabbedPane;
         private List<Pane> thePanes;
         private static class Pane {
              private JTextPane theTextPane;
              private CompoundUndoManager theUndoManager;
              private class CompoundUndoManager extends UndoManager implements UndoableEditListener, DocumentListener {
                   public CompoundEdit compoundEdit;
                   private int lastOffset;
                   private int lastLength;
                   public CompoundUndoManager() {
                        compoundEdit = null;
                   public void undo() {
                        theTextPane.getDocument().addDocumentListener(this);
                        super.undo();
                        theTextPane.getDocument().removeDocumentListener(this);
                   public void redo() {
                        theTextPane.getDocument().addDocumentListener(this);
                        super.redo();
                        theTextPane.getDocument().removeDocumentListener(this);
                   public void undoableEditHappened(UndoableEditEvent e) {
                        if (compoundEdit == null) {
                             compoundEdit = startCompoundEdit(e.getEdit());
                             lastLength = theTextPane.getDocument().getLength();
                             return;
                        AbstractDocument.DefaultDocumentEvent event = (AbstractDocument.DefaultDocumentEvent)e.getEdit();
                        if (event.getType().equals(DocumentEvent.EventType.CHANGE)) {
                             compoundEdit.addEdit(e.getEdit());
                             return;
                        int offsetChange = theTextPane.getCaretPosition() - lastOffset;
                        int lengthChange = theTextPane.getDocument().getLength() - lastLength;
                        if (Math.abs(offsetChange) == 1
                             && Math.abs(lengthChange) == 1) {
                             compoundEdit.addEdit(e.getEdit());
                             lastOffset = theTextPane.getCaretPosition();
                             lastLength = theTextPane.getDocument().getLength();
                             return;
                        compoundEdit.end();
                        compoundEdit = startCompoundEdit(e.getEdit());
                   private CompoundEdit startCompoundEdit(UndoableEdit anEdit) {
                        lastOffset = theTextPane.getCaretPosition();
                        lastLength = theTextPane.getDocument().getLength();
                        compoundEdit = new MyCompoundEdit();
                        compoundEdit.addEdit(anEdit);
                        addEdit(compoundEdit);
                        return compoundEdit;
                   public void insertUpdate(final DocumentEvent e) {
                        SwingUtilities.invokeLater(new Runnable() {
                             public void run() {
                                  int offset = e.getOffset() + e.getLength();
                                  offset = Math.min(offset, theTextPane.getDocument().getLength());
                                  theTextPane.setCaretPosition(offset);
                   public void removeUpdate(DocumentEvent e) {
                        theTextPane.setCaretPosition(e.getOffset());
                   public void changedUpdate(DocumentEvent e) {}
                   class MyCompoundEdit extends CompoundEdit {
                        public boolean isInProgress() {
                             return false;
                        public void undo() throws CannotUndoException {
                             if (compoundEdit != null) compoundEdit.end();
                             super.undo();
                             compoundEdit = null;
              public Pane() {
                   theTextPane = new JTextPane();
                   theTextPane.setEditorKit(new StyledEditorKit() {
                        public Document createDefaultDocument() {
                             return new SyntaxDocument();
                   theUndoManager = new CompoundUndoManager();
                   theTextPane.getDocument().addUndoableEditListener(theUndoManager);
              public JTextPane getTextPane() {
                   return theTextPane;
              public UndoManager getUndoManager() {
                   return theUndoManager;
         public URTest() {
              super(new BorderLayout(5, 5));
              setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
              JToolBar toolBar = new JToolBar();
              toolBar.setFloatable(false);
              toolBar.add(new AbstractAction("Undo") {
                   public void actionPerformed(ActionEvent e) {
                        undo();
              toolBar.add(new AbstractAction("Redo") {
                   public void actionPerformed(ActionEvent e) {
                        redo();
              add(toolBar, BorderLayout.NORTH);
              thePanes = new LinkedList<Pane>();
              theTabbedPane = new JTabbedPane();
              add(theTabbedPane, BorderLayout.CENTER);
              theMenuBar = new JMenuBar();
              JMenu menu = new JMenu("File");
              menu.add(new AbstractAction("New") {
                   public void actionPerformed(ActionEvent e) {
                        create();
              menu.add(new AbstractAction("Close") {
                   public void actionPerformed(ActionEvent e) {
                        remove();
              theMenuBar.add(menu);
         public JMenuBar getMenuBar() {
              return theMenuBar;
         private void create() {
              Pane pane = new Pane();
              thePanes.add(pane);
              theTabbedPane.addTab("Tab", pane.getTextPane());
         private void remove() {
              Pane selectedPane = getSelectedPane();
              if (selectedPane == null) return;
              thePanes.remove(selectedPane);
              theTabbedPane.remove(selectedPane.getTextPane());
         private void undo() {
              Pane selectedPane = getSelectedPane();
              if (selectedPane == null) return;
              try {
                   selectedPane.getUndoManager().undo();
                   selectedPane.getTextPane().requestFocus();
              } catch (CannotUndoException ex) {
                   System.out.println("Unable to undo: " + ex);
         private void redo() {
              Pane selectedPane = getSelectedPane();
              if (selectedPane == null) return;
              try {
                   selectedPane.getUndoManager().redo();
                   selectedPane.getTextPane().requestFocus();
              } catch (CannotRedoException ex) {
                   System.out.println("Unable to redo: " + ex);
         private Pane getSelectedPane() {
              Component selectedComponent = theTabbedPane.getSelectedComponent();
              if (selectedComponent == null) return null;
              for (Pane pane : thePanes) {
                   if (pane.getTextPane() == selectedComponent) return pane;
              return null;
         private static void test() {
              JFrame f = new JFrame("URTest");
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              URTest urTest = new URTest();
              f.setContentPane(urTest);
              f.setJMenuBar(urTest.getMenuBar());
              f.setSize(400, 400);
              f.setLocationRelativeTo(null);
              f.setVisible(true);
         public static void main(String[] args) {
              SwingUtilities.invokeLater(new Runnable() {
                   public void run() {
                        test();
    }Hope it helps.

  • Having Undo/Redo Problems

    Could somebody throw some light on this particular code. It's throwing up some strange errors, ie: class or interface expected, that kind of thing. so it's probably just a mattter of having the parts in the right areas
    jTextArea1 jtxt = new jTextArea1();
    final UndoManager undo = new UndoManager();
            Document doc = textarea.getDocument();
            doc.addUndoableEditListener(new UndoableEditListener() {
             public void undoableEditHappened(UndoableEditEvent evt) {
                 undo.addEdit(evt.getEdit());
         // Create an undo action and add it to the text component
         textcomp.getActionMap().put("Undo",
             new AbstractAction("Undo") {
                 public void jButton18_actionPerformed(ActionEvent evt) {
                     try {
                         if (undo.canUndo()) {
                             undo.undo();
                     } catch (CannotUndoException e) {
         // Create a redo action and add it to the text component
         textarea.getActionMap().put("Redo",
             new AbstractAction("Redo") {
                 public void jButton19_actionPerformed(ActionEvent evt) {
                     try {
                         if (undo.canRedo()) {
                             undo.redo();
                     } catch (CannotRedoException e) {
             });*/

    To create a concrete subclass of AbstractAction, you have to define a method with the signature   public void actionPerformed(ActionEvent evt)Your undo and redo actions fail to do that.

  • Undo/Redo Jgraph

    Hi,
    I need to implement an undo and redo function within a Jgraph application, I have my buttons created and want to have an undo and redo function available for when the user wants to undo or redo the last action (i.e. they have drawn a component or a connection on the graph). Does anyone have any idea how to go about this, would very much appreciate it.
    Thanks,
    Jason

    I get confused every time I try to use Undo/Redo but I'll try to remember what I've done in the past.
    textPane.getDocument().addUndoAbleEditListener(new MyUndoAbleEditListener()); The above is used to to accumulate the edits for undo/redo. The UndoManager is responsible for undo/redo of the actual edit, so in your case you would also have 3 UndoManagers. Presumably you have a toolbar button or menuItem to invoke the undo/redo. When you click on the button, you must make sure you are using the correct UndoManager to undo/redo the edit.
    When I was playing around trying to learn Swing I created a [url http://www.discoverteenergy.com/files/Editor.zip]Simple Editor that handles this. In my EditPanel class I created a UndoManager class for each textPane. This class also contains undo/redo buttons and menuItems for this UndoManager. Whenever I switch tabs to work with a new textpane, I also switch the undo/redo buttons and menuItems so that the buttons displayed are for the UndoManager of the current textpane. This code is done by the updateToolbarAndMenubar() method of the Editor class.

  • Undo/Redo button are not performing more than one operation at a time

    Hi,
    I have created undo/redo button on my paint application. But it performing only last action to undo.I have just the code which store offscreen image into undo buffer image like this :
        if (OSC == null || widthOfOSC != getSize().width || heightOfOSC != getSize().height) {
                     // Create the OSC, or make a new one if canvas size has changed.
                 OSC = null;  // (If OSC & undoBuffer already exist, this frees up the memory.)
                 undoBuffer = null;
                 OSC = createImage(getSize().width, getSize().height);
                 widthOfOSC = getSize().width;
                 heightOfOSC = getSize().height;
                 OSG = OSC.getGraphics();  // Graphics context for drawing to OSC.
                 OSG.setColor(getBackground());              
                 OSG.dispose();
                 undoBuffer = createImage(widthOfOSC, heightOfOSC);
                  OSG = undoBuffer.getGraphics();  // Graphics context for drawing to the undoBuffer.
                  OSG.setColor(getBackground());            
                  OSG.fillRect(0, 0,widthOfOSC, heightOfOSC);
                   and the button performed it's action :
    else if (command.equals("Undo")) {
                 // Swap the off-screen canvas with the undoBuffer and repaint.
                 Image temp = OSC;
                 OSC = undoBuffer;
                 undoBuffer = temp;
                 repaint();I want to create undo button that performed end operation on canvas.
    please help me
    Thanks in advance....

    Don't post the same question repeatedly. I've removed the thread you started 4 days after this one with the identical same question.
    db

  • Keybindings for undo/redo buttons.

    I thought I knew how to do this, and I do seem to have this working fine for cut/copy/paste/select all keybindings CTRL X/C/V/A respectively.
    However I tried to do this for CTRL X and Y undo/redo and it's not working as I intended. Can anyone see what I'm doing wrong?
    I created a SSCCE based off the original example I was following from: [http://www.java2s.com/Code/Java/Swing-JFC/Undoredotextarea.htm]
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.KeyStroke;
    import javax.swing.event.UndoableEditEvent;
    import javax.swing.event.UndoableEditListener;
    import javax.swing.undo.CannotRedoException;
    import javax.swing.undo.UndoManager;
    public class UndoRedoTextArea extends JFrame implements KeyListener{
        private static final long serialVersionUID = 1L;
        protected JTextArea textArea = new JTextArea();
        protected UndoManager undoManager = new UndoManager();
        protected JButton undoButton = new JButton("Undo");
        protected JButton redoButton = new JButton("Redo");
        public UndoRedoTextArea() {
            super("Undo/Redo Demo");
            undoButton.setEnabled(false);
            redoButton.setEnabled(false);
            JPanel buttonPanel = new JPanel(new GridLayout());
            buttonPanel.add(undoButton);
            buttonPanel.add(redoButton);
            JScrollPane scroller = new JScrollPane(textArea);
            getContentPane().add(buttonPanel, BorderLayout.NORTH);
            getContentPane().add(scroller, BorderLayout.CENTER);
            textArea.getDocument().addUndoableEditListener(
                new UndoableEditListener() {
                    public void undoableEditHappened(UndoableEditEvent e) {
                        undoManager.addEdit(e.getEdit());
                        updateButtons();
            undoButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    try {
                        undoManager.undo();
                    } catch (CannotRedoException cre) {
                        cre.printStackTrace();
                    updateButtons();
            undoButton.addKeyListener(this);
            redoButton.addKeyListener(this);
            redoButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    try {
                        undoManager.redo();
                    } catch (CannotRedoException cre)  {
                        cre.printStackTrace();
                    updateButtons();
            setSize(400, 300);
            setVisible(true);
        public void updateButtons() {
            undoButton.setText(undoManager.getUndoPresentationName());
            redoButton.setText(undoManager.getRedoPresentationName());
            undoButton.setEnabled(undoManager.canUndo());
            redoButton.setEnabled(undoManager.canRedo());
        public static void main(String argv[]) {
            new UndoRedoTextArea();
        public void keyPressed(KeyEvent e){
            if (e.equals(KeyStroke.getKeyStroke
                (KeyEvent.VK_Z, InputEvent.CTRL_DOWN_MASK))){
                // undo
                try {
                    undoManager.undo();
                } catch (CannotRedoException cre)  {
                    cre.printStackTrace();
                updateButtons();
            else if (e.equals(KeyStroke.getKeyStroke
                    (KeyEvent.VK_Y, InputEvent.CTRL_DOWN_MASK))){
                // redo
                try  {
                    undoManager.redo();
                } catch (CannotRedoException cre) {
                    cre.printStackTrace();
                updateButtons();
        public void keyTyped(KeyEvent e){}
        public void keyReleased(KeyEvent e){}
    }Edited by: G-Unit on Oct 24, 2010 5:30 AM

    camickr wrote:
    So the way I posted in the second lump of code OK (3rd post) or did you mean something different? Why did you set the key bindings? Did I not state they would be created automatically? I think you need to reread my suggestion (and the tutorial).Because I don't get it, it says only Menu items can contain accelerators and buttons only get mnemonics. I'm not using menu items here, I only have a text pane and 2 buttons. So I set the actions for the InputMap in TextPane. For the buttons, I pretty much used the small bit of code using undoManager.
    I tried to set KEYSTROKE constructor for the action and simply add them to the buttons that way, but this didn't seem to have any response.
    Also I don't get how this could happen anyway if the TextPane has the focus.
    Not like the example using MNEMONICS.
        Action leftAction = new LeftAction(); //LeftAction code is shown later
        button = new JButton(leftAction)
        menuItem = new JMenuItem(leftAction);
    To create an Action object, you generally create a subclass of AbstractAction and then instantiate it. In your subclass, you must implement the actionPerformed method to react appropriately when the action event occurs. Here's an example of creating and instantiating an AbstractAction subclass:
        leftAction = new LeftAction("Go left", anIcon,
                     "This is the left button.",
                     new Integer(KeyEvent.VK_L));
        class LeftAction extends AbstractAction {
            public LeftAction(String text, ImageIcon icon,
                              String desc, Integer mnemonic) {
                super(text, icon);
                putValue(SHORT_DESCRIPTION, desc);
                putValue(MNEMONIC_KEY, mnemonic);
            public void actionPerformed(ActionEvent e) {
                displayResult("Action for first button/menu item", e);
        }This is what I attempted. No errors... It just doesn't work.
    public JPanel p()
        undoButton.addActionListener(new UndoAction(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK)));
        panel.add(undoButton);
        return panel;
    private class UndoAction extends AbstractAction
         public UndoAction(KeyStroke keyStroke)
              putValue(ACCELERATOR_KEY, keyStroke);
         private static final long serialVersionUID = 1L;
         public void actionPerformed(ActionEvent e)
              try
                   if (undoManager.canUndo())
                        undoManager.undo();
              catch (CannotRedoException cre)
                   cre.printStackTrace();
              updateButtons();
    }Edited by: G-Unit on Oct 25, 2010 8:32 AM

  • Undo / Redo Feature in Swing

    Hi all,
    Iam working on swing project which uses Undo/Redo feature for drag and drop figure and delete,cut,copy,paste and all the feature which ever want to use, and iam using multiple internal frames so the feature Undo/Redo should be specific to perticular internal frame.
    Is any buddy already done such a kind of thing then pls help me, or if it's possible then pls send the code also.
    Regards
    Laxmikant

    Hi,
    you would have to create an UndoableEditListener for each object, undo/redo shall be perfomed. The listener then is connected to an instance of UndoManager to do the actual handling:  /** Listener for edits on a document. */
      private UndoableEditListener undoHandler = new UndoHandler();
      /** UndoManager that we add edits to. */
      private UndoManager undo = new UndoManager();
      /** inner class for handling undoable edit events */
      public class UndoHandler implements UndoableEditListener {
         * Messaged when the Document has created an edit, the edit is
         * added to <code>undo</code>, an instance of UndoManager.
        public void undoableEditHappened(UndoableEditEvent e) {
          undo.addEdit(e.getEdit());
      } This now can be registered with let's say a Document like thiseditor.getDocument().addUndoableEditListener(undoHandler); (editor is an instance of JEditorPane containing the document).
    Once you have this, you only need actions to perform undo or redo by calling the respective method of your instance of UndoManager undo() and redo().
    Hope that helps
    Ulrich

  • Very slow Undo/Redo Process !

    Hi,
    Upgraded to Logic 10.1 yesterday, on a Brand new Mac Pro ( 2015 ), 32GB Memory, 1 TB SSD,
    Everything seems to be running smoothly, EXCEPT ...!!! ( Capital Letters )
    It's taking 15 seconds MINIMUM to Undo or Redo, Sometimes even a little longer !!
    What? Even simple MIDI operations, like delete One Midi note, to undo the process ( Commandl-Z ) it takes 15-16 seconds.
    On my Old macPro ( early 2008 ), I also did the update to LPX 10.1 and it is working fine, I am getting immediate Undo/Redo.
    I already tried all basic troubleshooting, anyone getting this bug? Any solutions?

    Macbook Pro 2011
    2.4 Ghz Quad i7
    8GB RAM
    500 GB SSD
    750 GB 5200 rpm hdd
    OSX 10.10.2
    Logic 10.1.0
    thanks!
    Joe
    Etrecheck Report...
    EtreCheck version: 2.1.8 (121)
    Report generated February 9, 2015 at 6:37:54 PM EST
    Download EtreCheck from http://etresoft.com/etrecheck
    Click the [Click for support] links for help with non-Apple products.
    Click the [Click for details] links for more information about that line.
    Click the [Adware! - Remove] links for help removing adware.
    Hardware Information: ℹ️
        MacBook Pro (15-inch, Late 2011) (Technical Specifications)
        MacBook Pro - model: MacBookPro8,2
        1 2.4 GHz Intel Core i7 CPU: 4-core
        8 GB RAM Upgradeable
            BANK 0/DIMM0
                4 GB DDR3 1333 MHz ok
            BANK 1/DIMM0
                4 GB DDR3 1333 MHz ok
        Bluetooth: Old - Handoff/Airdrop2 not supported
        Wireless:  en1: 802.11 a/b/g/n
        Battery Health: Normal - Cycle count 788
    Video Information: ℹ️
        Intel HD Graphics 3000 - VRAM: 512 MB
        AMD Radeon HD 6770M - VRAM: 1024 MB
            HP 27xi spdisplays_1080p
    System Software: ℹ️
        OS X 10.10.2 (14C109) - Time since boot: 2:32:26
    Disk Information: ℹ️
        M4-CT512M4SSD2 disk0 : (512.11 GB)
            EFI (disk0s1) <not mounted> : 210 MB
            Recovery HD (disk0s3) <not mounted>  [Recovery]: 650 MB
            JT SSD (disk2) / : 510.88 GB (126.68 GB free)
                Core Storage: disk0s2 511.25 GB Online
        TOSHIBA MK7559GSXF disk1 : (750.16 GB)
            EFI (disk1s1) <not mounted> : 210 MB
            DATA (disk1s2) /Volumes/DATA : 749.30 GB (107.62 GB free)
    USB Information: ℹ️
        Apple Inc. FaceTime HD Camera (Built-in)
        Apple Inc. Apple Internal Keyboard / Trackpad
        Apple Inc. BRCM2070 Hub
            Apple Inc. Bluetooth USB Host Controller
        Apple Computer, Inc. IR Receiver
        VIA Labs, Inc. USB3.0 Hub
        Seagate Backup+ Desk 3 TB
            EFI (disk4s1) <not mounted> : 315 MB
            MBProBkup (disk4s2) /Volumes/MBProBkup : 1.50 TB (70.13 GB free)
            JTBACKUP (disk4s3) /Volumes/JTBACKUP : 1.50 TB (615.33 GB free)
        Burr-Brown from TI USB audio CODEC
        Seagate FreeAgent FW 1 TB
            EFI (disk3s1) <not mounted> : 210 MB
            the archaeologist (disk3s2) /Volumes/the archaeologist : 999.86 GB (371.40 GB free)
        Focusrite A.E. Ltd Impulse
        Apple, Inc. Keyboard Hub
            iLok iLok
            Apple, Inc Apple Keyboard
    Thunderbolt Information: ℹ️
        Apple Inc. thunderbolt_bus
            StarTech.com Thunderbolt Laptop Dock
                Universal Audio, Inc. Apollo Twin
    Configuration files: ℹ️
        /etc/sysctl.conf - Exists
    Gatekeeper: ℹ️
        Anywhere
    Adware: ℹ️
        Geneio [Adware! - Remove]
    Kernel Extensions: ℹ️
            /Library/Extensions
        [not loaded]    com.apogee.driver.ApogeeUSBQuartetAudio (1.0.0a1 - SDK 10.8) [Click for support]
        [not loaded]    com.apogeedigital.kext.ApogeeUSBDuetAudio (1.0.0a1 - SDK 10.8) [Click for support]
        [not loaded]    com.caiaq.driver.NIUSBHardwareDriver (2.6.0 - SDK 10.8) [Click for support]
        [not loaded]    com.displaylink.dlusbncm (1.11.0 - SDK 10.9) [Click for support]
        [loaded]    com.displaylink.driver.DisplayLinkDriver (2.2 - SDK 10.9) [Click for support]
        [not loaded]    com.motu.driver.FireWireAudio (1.6 64254 - SDK 10.4) [Click for support]
        [not loaded]    com.motu.driver.MicroBookAudio (1.6 64254 - SDK 10.4) [Click for support]
        [not loaded]    com.motu.driver.PCIAudio (1.6 64254 - SDK 10.4) [Click for support]
        [not loaded]    com.motu.driver.USBMidiKext (1.6 64254 - SDK 10.4) [Click for support]
        [not loaded]    jp.co.roland.RDUSB0145Dev (1.0.1 - SDK 10.9) [Click for support]
            /System/Library/Extensions
        [loaded]    com.Cycling74.driver.Soundflower (1.6.6 - SDK 10.6) [Click for support]
        [not loaded]    com.RME.driver.FirefaceAudioDriver (3.16 - SDK 10.5) [Click for support]
        [not loaded]    com.caiaq.driver.NIUSBGuitarRigMobileDriver (2.4.23) [Click for support]
        [not loaded]    com.jft.driver.PdaNetDrv (1.0.0d1) [Click for support]
        [not loaded]    com.m-audio.driver.firewire (1.10.5) [Click for support]
        [not loaded]    com.m-audio.driver.firewire.dice (2.4.2 - SDK 10.6) [Click for support]
        [not loaded]    com.m-audio.usb.midisupport.driver (1.1) [Click for support]
        [not loaded]    com.paceap.kext.pacesupport.master (5.9.1 - SDK 10.6) [Click for support]
        [loaded]    com.uaudio.driver.UAD2System (7.11.1 - SDK 10.6) [Click for support]
        [not loaded]    com.xxxchurch.x3nke (1.0.0) [Click for support]
        [not loaded]    jp.co.roland.RDUSB0033Dev (1.0.0) [Click for support]
        [not loaded]    jp.co.roland.RDUSB010FDev (1.0.0 - SDK 10.6) [Click for support]
            /System/Library/Extensions/PACESupportFamily.kext/Contents/PlugIns
        [not loaded]    com.paceap.kext.pacesupport.leopard (5.9.1 - SDK 10.4) [Click for support]
        [not loaded]    com.paceap.kext.pacesupport.panther (5.9.1 - SDK 10.-1) [Click for support]
        [loaded]    com.paceap.kext.pacesupport.snowleopard (5.9.1 - SDK 10.6) [Click for support]
        [not loaded]    com.paceap.kext.pacesupport.tiger (5.9.1 - SDK 10.4) [Click for support]
    Startup Items: ℹ️
        DigidesignLoader: Path: /Library/StartupItems/DigidesignLoader
        M-Audio FireWire Audio Helper: Path: /Library/StartupItems/M-Audio FireWire Audio Helper
        M-Audio Firmware Loader: Path: /Library/StartupItems/M-Audio Firmware Loader
        RDUSB0145Startup: Path: /Library/StartupItems/RDUSB0145Startup
        Startup items are obsolete in OS X Yosemite
    Launch Agents: ℹ️
        [running]    com.ApogeePopup.plist [Click for support]
        [not loaded]    com.displaylink.useragent-prelogin.plist [Click for support]
        [running]    com.displaylink.useragent.plist [Click for support]
        [running]    com.eastwest.server.plist [Click for support]
        [running]    com.maudio.profire.helper.plist [Click for support]
        [running]    com.motu.MOTULauncher.plist [Click for support]
        [loaded]    com.oracle.java.Java-Updater.plist [Click for support]
        [running]    de.rme-audio.firefaceAgent.plist [Click for support]
        [running]    touchAbleServer.plist [Click for support]
    Launch Daemons: ℹ️
        [loaded]    com.adobe.fpsaud.plist [Click for support]
        [loaded]    com.avid.bsd.DigiShoeTool.plist [Click for support]
        [loaded]    com.avid.bsd.ShoeTool.plist [Click for support]
        [running]    com.displaylink.displaylinkmanager.plist [Click for support]
        [running]    com.DuetUSBDaemon.plist [Click for support]
        [loaded]    com.gobbler.bsd.HelperTool.plist [Click for support]
        [loaded]    com.gobbler.DownstreamProxy.plist [Click for support]
        [running]    com.m-audio.firewire.helper.plist [Click for support]
        [loaded]    com.novation.automap.pluginhelper.plist [Click for support]
        [loaded]    com.oracle.java.Helper-Tool.plist [Click for support]
        [loaded]    com.oracle.java.JavaUpdateHelper.plist [Click for support]
        [running]    com.paceap.eden.licensed.plist [Click for support]
        [running]    com.QuartetDaemon.plist [Click for support]
        [failed]    com.x3.x3daemon.plist [Click for support] [Click for details]
        [loaded]    org.cindori.TEAuth.plist [Click for support]
        [loaded]    PACESupport.plist [Click for support]
    User Launch Agents: ℹ️
        [failed]    com.amazon.cloud-player.plist [Click for support] [Click for details]
        [running]    com.amazon.music.plist [Click for support]
        [loaded]    com.genieo.completer.download.plist [Adware! - Remove]
        [loaded]    com.genieo.completer.ltvbit.plist [Adware! - Remove]
        [running]    com.genieo.completer.update.plist [Adware! - Remove]
        [loaded]    com.google.keystone.agent.plist [Click for support]
        [running]    com.spotify.webhelper.plist [Click for support]
    User Login Items: ℹ️
        gfxCardStatus    UNKNOWN  (missing value)
        iTunesHelper    UNKNOWN Hidden (missing value)
        EvernoteHelper    UNKNOWN  (missing value)
        EvernoteHelper    UNKNOWN  (missing value)
        EEventManager    Application Hidden (/Applications/Epson Software/Event Manager.app/Contents/Resources/Assistants/Event Manager/EEventManager.app)
        SafeEyes    UNKNOWN  (missing value)
        TuneupMyMac    UNKNOWN  (missing value)
        Gobbler2    UNKNOWN  (missing value)
        UA Mixer Engine    Application  (/Library/Application Support/Universal Audio/Apollo/UA Mixer Engine.app)
        NIHardwareAgent    Application Hidden (/Library/Application Support/Native Instruments/Hardware/NIHardwareAgent.app)
        EEventManager    Application  (/Applications/Epson Software/Event Manager.app/Contents/Resources/Assistants/Event Manager/EEventManager.app)
    Internet Plug-ins: ℹ️
        AmazonMP3DownloaderPlugin1017277: Version: AmazonMP3DownloaderPlugin 1.0.17 [Click for support]
        Unity Web Player: Version: UnityPlayer version 3.3.0f4 [Click for support]
        Default Browser: Version: 600 - SDK 10.10
        iLokClientHelper: Version: 3.6 - SDK 10.5 [Click for support]
        QuakeLivePlugin: Version: 0.1.0.277 [Click for support]
        Silverlight: Version: 5.1.30514.0 - SDK 10.6 [Click for support]
        FlashPlayer-10.6: Version: 16.0.0.305 - SDK 10.6 [Click for support]
        DivXBrowserPlugin: Version: 1.4 [Click for support]
        WidevineMediaOptimizer: Version: 6.0.0.12757 - SDK 10.7 [Click for support]
        Flash Player: Version: 16.0.0.305 - SDK 10.6 [Click for support]
        QuickTime Plugin: Version: 7.7.3
        iPhotoPhotocast: Version: 7.0
        WidevineMediaTransformer: Version: Unknown [Click for support]
        AdobePDFViewer: Version: 9.3.3 [Click for support]
        JavaAppletPlugin: Version: Java 8 Update 31 Check version
    User internet Plug-ins: ℹ️
        VusionWARPVideo: Version: 1.6.0 [Click for support]
        Move_Media_Player: Version: npmnqmp 071503000004 [Click for support]
        BrowserPlus_2.9.8: Version: 2.9.8 [Click for support]
        iGetterScriptablePlugin: Version: 2.9.2 [Click for support]
    Audio Plug-ins: ℹ️
        DVCPROHDAudio: Version: 1.3.2
    3rd Party Preference Panes: ℹ️
        Flash Player  [Click for support]
        Java  [Click for support]
        Native Instruments USB Audio  [Click for support]
        SPD-SX  [Click for support]
    Time Machine: ℹ️
        Skip System Files: NO
        Mobile backups: OFF
        Auto backup: NO - Auto backup turned off
        Volumes being backed up:
            JT SSD: Disk size: 510.88 GB Disk used: 384.19 GB
        Destinations:
            MBProBkup [Local]
            Total size: 1.50 TB
            Total number of backups: 34
            Oldest backup: 2014-11-04 00:04:04 +0000
            Last backup: 2015-02-06 21:56:19 +0000
            Size of backup disk: Adequate
                Backup size 1.50 TB > (Disk used 384.19 GB X 3)
    Top Processes by CPU: ℹ️
            76%    Logic Pro X
             9%    coreaudiod
             3%    UA Mixer Engine
             3%    WindowServer
             3%    AutomapServer
    Top Processes by Memory: ℹ️
        1.86 GB    Logic Pro X
        172 MB    mds_stores
        120 MB    WindowServer
        94 MB    Finder
        77 MB    com.apple.WebKit.WebContent
    Virtual Memory Information: ℹ️
        1.96 GB    Free RAM
        3.50 GB    Active RAM
        1.61 GB    Inactive RAM
        1.51 GB    Wired RAM
        2.28 GB    Page-ins
        0 B    Page-outs
    Diagnostics Information: ℹ️
        Feb 9, 2015, 06:35:34 PM    /Library/Logs/DiagnosticReports/Logic Pro X_2015-02-09-183534_[redacted].hang
        Feb 9, 2015, 04:05:02 PM    Self test - passed
        Feb 9, 2015, 11:53:32 AM    /Library/Logs/DiagnosticReports/Logic Pro X_2015-02-09-115332_[redacted].cpu_resource.diag [Click for details]
        Feb 9, 2015, 09:56:58 AM    /Library/Logs/DiagnosticReports/Logic Pro X_2015-02-09-095658_[redacted].cpu_resource.diag [Click for details]
        Feb 6, 2015, 07:14:11 PM    /Library/Logs/DiagnosticReports/Logic Pro X_2015-02-06-191411_[redacted].cpu_resource.diag [Click for details]
        Feb 6, 2015, 07:10:34 PM    /Users/[redacted]/Library/Logs/DiagnosticReports/AutomapServer_2015-02-06-19103 4_[redacted].crash

  • Problem with undo/redo actions in a StyledDocument

    Hello,
    In my app i have a text area where each user can keep some notes.The document is serialized and saved in the database for later access as StyledDocument, in order to be saved with the formating the user has chosen(for example with certain fonts,text color and size).
    What i want to do now is to give to the user the ability to undo/redo his actions. I have these methods implemented and everything worked fine when i was saving and loading simple text in my JTextPane (previously i was saving in the database what user typed as a simple string which meant that the formatting was lost). Now, after loading styled document (using the textPane.setStyledDocument(doc) code line) these actions do not work.
    Are there any suggestions on how i can make this work? Is it possible?
    I hope i made my problem clear enough
    Thanks in advance

    Seem like I found the answer to my issue: http://helpx.adobe.com/dreamweaver/using/whats-new-2014.html#Undo/Redo enhancements
    Undo/Redo enhancements
    All undo/redo actions are recorded at the HTML file-level. This means, any manual changes to a CSS file can be undone from ANY related file.
    Someone called it Undo/Redo enhancements!? Damn this is the most stupid thing one can imagine about undo/redo! How the heck editing one source file affects the other!? Do whatever you want in Designer mode, but I'm editing SOURCE CODE and need to be able to undo/redo my actions on a file level.
    With this change TextEdit or Notepad becomes a more suitable tool for editing HTML/CSS than Dreamweaver.

  • Undo/Redo in JTextArea using UndoableEditListener

    I tried to implement undo/redo functionality in JTextArea using UndoableEditListener
    interface, but it throws java.lang.NullPointerException. I really not sure
    how the UndoableEditListener works?? I mean when the user type text in JTextArea,
    it already listens the event?? But when I go to menu bar and select "undo item,"
    how can they communicate??
    Here's my attempts. Thanks a lot!!
    private UndoManager undoManager;
    UndoableEditSupport edit = new UndoableEditSupport();
    //Registers an UndoableEditListener.
    edit.addUndoableEditListener(this);
    public void undoableEditHappened(UndoableEditEvent evt)
    {     undoManager = (UndoManager)evt.getEdit();
         //AbstractUndoableEdit edit = evt.getEdit();
    if (undoManager.canRedo())
         System.out.println("can redo...");
    if (undoManager.canUndo())
         System.out.println("can undo...");
    public void actionPerformed(ActionEvent evt)
    Object source = evt.getSource();
         if (source == undoItem)
              String s = undoManager.getUndoPresentationName();
              System.out.println("undo item = " + s);
    }

    Hi
    Sinceraly never used it in JTextArea components but since it also is an JTextComponent (as is JTextField) try to use this method:
        * add UNDO&REDO commands to a given textfield
      private void addUndoRedo(JTextField tf) {
        final UndoManager undo = new UndoManager();
        Document doc = tf.getDocument();
        doc.addUndoableEditListener(
          new UndoableEditListener() {
            public void undoableEditHappened(UndoableEditEvent evt) {
              undo.addEdit(evt.getEdit());
        tf.getActionMap().put(EDIT_CONTROLS[6][0], // UNDO
          new AbstractAction(EDIT_CONTROLS[6][0]) {
            public void actionPerformed(ActionEvent evt) {
              try {
                if (undo.canUndo()) { undo.undo(); }
              } catch (CannotUndoException e) {}
        tf.getInputMap().put(KeyStroke.getKeyStroke(EDIT_CONTROLS[6][1]), EDIT_CONTROLS[6][0]);
        tf.getActionMap().put(EDIT_CONTROLS[7][0], // REDO
          new AbstractAction(EDIT_CONTROLS[7][0]) {
            public void actionPerformed(ActionEvent evt) {
              try {
                if (undo.canRedo()) { undo.redo(); }
              } catch (CannotRedoException e) {}
        tf.getInputMap().put(KeyStroke.getKeyStroke(EDIT_CONTROLS[7][1]), EDIT_CONTROLS[7][0]);
      }I believe it'll work fine, please reply as possible.
    Regards.

  • Undo/redo animation

    I'm begging you guys to move the giant "undo/redo" message that appears in the center of the screen someplace less conspicuous. Also I'd like the undo/redo of the last step to be buffered for fast toggling (like show before image). The way it is now is very distracting.

    I get confused every time I try to use Undo/Redo but I'll try to remember what I've done in the past.
    textPane.getDocument().addUndoAbleEditListener(new MyUndoAbleEditListener()); The above is used to to accumulate the edits for undo/redo. The UndoManager is responsible for undo/redo of the actual edit, so in your case you would also have 3 UndoManagers. Presumably you have a toolbar button or menuItem to invoke the undo/redo. When you click on the button, you must make sure you are using the correct UndoManager to undo/redo the edit.
    When I was playing around trying to learn Swing I created a [url http://www.discoverteenergy.com/files/Editor.zip]Simple Editor that handles this. In my EditPanel class I created a UndoManager class for each textPane. This class also contains undo/redo buttons and menuItems for this UndoManager. Whenever I switch tabs to work with a new textpane, I also switch the undo/redo buttons and menuItems so that the buttons displayed are for the UndoManager of the current textpane. This code is done by the updateToolbarAndMenubar() method of the Editor class.

  • Undo/redo bug

    Hi Adobe-ites!
    I recently changed all sorts of syntax and font properties to my installation of Flash Builder 4 in an effort to reduce long-term eye damage .
    Somehow, I inadvertently induced a nasty bug of some sort. I haven't totally wrapped my head around it's behavior, but basically - I lose code undo/redo functionality at some point while working on a given component or class. If I close the window for the component/class and reopen it, I get undo/redo functionality back. However, at some point while typing code, the functionality goes away. Any programmer can imagine how counter-productive this can be . Any one have any ideas what could be causing the issue and how to remedy?
    Many thanks,
    JJ

    Hi,
    Thanks for the adding comments in the issue https://bugs.adobe.com/jira/browse/FB-29897. The problem is faced whenever preferences are changed and there is an active editor opened.
    I have re-ropened the issue.
    -Radhakrishna

  • Need Undo/Redo Help

    hi,
    I'm trying to make a program where I can undo any sort of action and also redo it.
    I have created a sample; can't get it to work with the undomanager.
    Help. Thanks.
       import javax.swing.*;
       import javax.swing.undo.*;
       import java.awt.*;
       import java.awt.event.*;
        public class UndoManagerTest extends JPanel implements ActionListener
          JButton add;
          JButton undo;
          JButton redo;
          JPanel panel, buttonpanel;
          UndoManager manager;
           public UndoManagerTest()
             manager = new UndoManager();
             setPreferredSize(new Dimension(800, 600));
             setLayout(new BorderLayout());
             panel = new JPanel(new FlowLayout());
             buttonpanel = new JPanel();
             panel.setPreferredSize(new Dimension(800, 400));
             // this.addUndoableEditListener(manager);
             add = new JButton("Add Label");
             add.addActionListener(this);
             undo = new JButton("Undo");
             undo.addActionListener(this);
             redo = new JButton("Redo");
             redo.addActionListener(this);
             buttonpanel.add(add);
             buttonpanel.add(undo);
             buttonpanel.add(redo);
             add(panel, BorderLayout.NORTH);
             add(buttonpanel, BorderLayout.SOUTH);          
           public void actionPerformed(ActionEvent e)
             if(e.getSource() == add)
                panel.add(new JLabel("New Label"));
                panel.updateUI();
             if(e.getSource() == undo)
                if(manager.canUndo())
                   try
                      manager.undo();
                       catch(CannotUndoException b)
             if(e.getSource() == redo)
                try
                   manager.redo();
                    catch(CannotRedoException b)
           public static void main (String[] args)
             JFrame frame = new JFrame("UndoManagerTest");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.add(new UndoManagerTest());               
             frame.setVisible(true);
             frame.pack();
       }

    Everything can be done.
    You don't undo clicking a button. You undo what your programa did when the button was clicked. In other words if you, for instance, created a jlabel and put it in a jpanel. You must "save" that information so the jlabel can be removed and/or be put again if the user wants.
    How you do that? You create an undoEdit class for every kind of "event" you want to undo. When I say event I don't mean java event like mouseEvents but your own doing in the methods.
    This is an example of one of my undoEdits:
    import javax.swing.undo.*;
    public class UndoBorder extends AbstractUndoableEdit{
        Parent parent; // any object you want to use like a Jframe o whatever
        int r, c;
        Border old, neww;
        String key;
        public UndoBorder(Parent parent, int r, int c, String key, Border old, Border neww) {
          this.parent=parent;
          this.r=r;
          this.c=c;
          this.key=key;
          this.old=old;
          this.neww=neww;
        public void undo(){
          if(old == null) parent.getBorders().remove(key);
          else parent.getBorders().put(key, old);
        public void redo(){
          if(neww == null) parent.getBorders().remove(key);
          else parent.getBorders().put(key, neww);
        // I don't recall why this is here but don't remove it cause it is necessary.
        public boolean canUndo(){ return true; }
        public boolean canRedo(){ return true; }
    }How do you use this:
    When I create a border and add it to the application (a hashMap) I also create the undo so the user can undo the action:
    Border neww = new Border(row, col, true, BorderLines.THIN, black);
    borders.put(row+colS, neww);
    edit.addEdit(new UndoBorder(this, row, col, row+colS, old, neww));In case you need to undo several action at once you have to create a CompoundUndoEdit object. Let me know if you need it.

  • Creating a new DC in existing software component

    Hi,
    I am trying to create new DC in a software component that is custom developed.
    You can consider this as a totally build product and I want to extend the features implementing new DC.
    I am able to import the development components, and when I try to create a new DC in the configuraition pool, I am anot able to select the vendor from the Vendor dropdown.
    Can some one explain how to do this?
    Is it possible to keep the software component as is, but copy the same to a custom namespace (with new vendor name newvendor.com) and create a dc in it. This way i can change the sc as is and make changes on new SC.
    Please suggest.
    Thanks and regards,
    Chinnu

    Hi Satya,
    Thankyou for quick response.
    I did not create any namespace prefixes in SLD.
    Can you give me some clarity about name spaces? I am not very clear about the same.
    About the SC i am trying to modify, it is not SAP deliverd SC, instead created under custom vendor name and I am able to import the DCs and hopefully check in the same.
    Also, after seeing your reply, I checked for any available namespaces in SLD, and all I can see is sap.com/home etc., which are owned by SAP.
    Do I have to create a new namespace with the vendor name to create new DCs?
    Also, I get this error message when trying to create a new DC:
    Syntax of 'sap.com/home/NewDC' is not valid: Name suffix must be spelled lower case: home/NewDC
    Please suggest.
    Thanks and regards,
    Chinnu
    Edited by: Chinnu on Aug 14, 2009 10:06 AM

  • View in expert mode shows following on the bottom PHOTO BIN, TOOL OPTIONS, UNDO, REDO, ROTATE, LAYOUT ORGANIZER how do i remove this?

    Adobe Photoshop Elements 11. When in EXPERT MODE i get the following  on the bottom PHOTO BIN, TOOL OPTIONS, UNDO, REDO, ROTATE, LAYOUT ORGANIZER how do i remove this?

    Sorry, but you don't. That's part of the way adobe changed PSE starting with PSE 11. If you don't like it, you can leave feedback here:
    Photoshop Family Customer Community

Maybe you are looking for