]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.team.ui/src/org/simantics/team/ui/UndoView.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.team.ui / src / org / simantics / team / ui / UndoView.java
index 0e87bf612ff1dd62abd2e6e7d792e9cb7c74e6ab..28fadd0f89cd21099c20434555e2c078165f2868 100644 (file)
-package org.simantics.team.ui;\r
-\r
-import java.lang.ref.WeakReference;\r
-import java.nio.ByteBuffer;\r
-import java.nio.CharBuffer;\r
-import java.nio.charset.CharacterCodingException;\r
-import java.nio.charset.Charset;\r
-import java.nio.charset.CharsetDecoder;\r
-import java.nio.charset.CodingErrorAction;\r
-import java.util.Collection;\r
-import java.util.Iterator;\r
-import java.util.Vector;\r
-\r
-import org.eclipse.jface.action.Action;\r
-import org.eclipse.jface.layout.TreeColumnLayout;\r
-import org.eclipse.jface.resource.JFaceResources;\r
-import org.eclipse.jface.resource.LocalResourceManager;\r
-import org.eclipse.jface.viewers.ColumnWeightData;\r
-import org.eclipse.jface.viewers.TreeViewer;\r
-import org.eclipse.jface.viewers.TreeViewerColumn;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.graphics.Image;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.simantics.db.Operation;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.UndoContext;\r
-import org.simantics.db.common.utils.Logger;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.service.UndoRedoSupport;\r
-import org.simantics.db.service.UndoRedoSupport.ChangeListener;\r
-import org.simantics.team.Activator;\r
-import org.simantics.team.internal.Images;\r
-import org.simantics.ui.SimanticsUI;\r
-import org.simantics.utils.ui.dialogs.ShowError;\r
-\r
-/**\r
- * @author Kalle Kondelin\r
- */\r
-public class UndoView extends TreeView {\r
-    @Override\r
-    public void createPartControl(Composite parent) {\r
-        this.parent = parent;\r
-        this.treeViewer = new TreeViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION);\r
-        this.resourceManager = new LocalResourceManager(JFaceResources.getResources(parent.getDisplay()), treeViewer.getTree());\r
-        Images.getInstance(JFaceResources.getResources());\r
-        TreeColumnLayout ad = new TreeColumnLayout();\r
-        parent.setLayout(ad);\r
-        treeViewer.getTree().setHeaderVisible(true);\r
-        //treeViewer.getTree().setLinesVisible(true);\r
-        //treeViewer.setUseHashlookup(true);\r
-        //treeViewer.setAutoExpandLevel(3);\r
-\r
-        TreeViewerColumn idColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
-        TreeViewerColumn dateColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
-        TreeViewerColumn commentColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);\r
-\r
-        idColumn.setLabelProvider(new IdColumnLabelProvider());\r
-        dateColumn.setLabelProvider(new DateColumnLabelProvider());\r
-        commentColumn.setLabelProvider(new CommentColumnLabelProvider());\r
-\r
-        idColumn.getColumn().setText("Id");\r
-        idColumn.getColumn().setWidth(20);\r
-        ad.setColumnData(idColumn.getColumn(), new ColumnWeightData(50, 20));\r
-        dateColumn.getColumn().setText("Date");\r
-        dateColumn.getColumn().setWidth(20);\r
-        ad.setColumnData(dateColumn.getColumn(), new ColumnWeightData(50, 40));\r
-        commentColumn.getColumn().setText("Comment");\r
-        commentColumn.getColumn().setWidth(20);\r
-        ad.setColumnData(commentColumn.getColumn(), new ColumnWeightData(50, 50));\r
-\r
-        final UndoContentProvider contentProvider = new UndoContentProvider(SimanticsUI.getSession());\r
-          treeViewer.setContentProvider(contentProvider);\r
-          treeViewer.setInput(this);\r
-          getViewSite().getActionBars().getToolBarManager().add(new Action("Remove All", Activator.REMOVE_ALL_ICON) {\r
-              @Override\r
-              public void run() {\r
-                  contentProvider.removeAll();\r
-              }\r
-          });\r
-          getViewSite().getActionBars().getToolBarManager().add(new Action("Get Undo History", Activator.REFRESH_ICON) {\r
-              @Override\r
-              public void run() {\r
-                  treeViewer.setContentProvider(contentProvider);\r
-              }\r
-          });\r
-          new ItemDetailToolTip(treeViewer, treeViewer.getTree(), null);\r
-    }\r
-}\r
-\r
-abstract class UndoViewElement extends TreeElement {\r
-    protected Session session;\r
-    UndoViewElement(Session session) {\r
-        this.session = session;\r
-    }\r
-    protected static final Charset UTF8 = Charset.forName("UTF-8");\r
-    protected String toString(byte[] data) {\r
-        if (data == null)\r
-            return "null";\r
-        CharsetDecoder decoder = UTF8.newDecoder();\r
-        ByteBuffer bbuf = ByteBuffer.wrap(data);\r
-        CharBuffer cbuf;\r
-        String s = null;\r
-        try {\r
-            cbuf = decoder.decode(bbuf);\r
-            s = cbuf.toString();\r
-        } catch (CharacterCodingException e) {\r
-            bbuf.rewind();\r
-            try {\r
-                cbuf = UTF8\r
-                .newDecoder()\r
-                .onMalformedInput(CodingErrorAction.REPLACE)\r
-                .onUnmappableCharacter(CodingErrorAction.REPLACE)\r
-                .decode(bbuf);\r
-                s = cbuf.toString();\r
-            } catch (CharacterCodingException e1) {\r
-                return "String conversion error.";\r
-            }\r
-        }\r
-        return s;\r
-    }\r
-    @Override\r
-    boolean hasChildren() {\r
-            return false;\r
-    }\r
-    @Override\r
-    Object[] getChildren() {\r
-        return new Object[0];\r
-    }\r
-}\r
-\r
-class UndoContextElement extends UndoViewElement {\r
-    protected String name = "Undo";\r
-    protected WeakReference<UndoContext> contextRef;\r
-    UndoContextElement(Session session, UndoContext context) {\r
-        super(session);\r
-        this.contextRef = new WeakReference<UndoContext>(context);\r
-    }\r
-    @Override\r
-    protected Image getIdImage() {\r
-        return Images.getInstance().OTHER_IMAGE;\r
-    }\r
-    @Override\r
-    protected String getIdText() {\r
-        String s = toString();\r
-        return s.substring(0, Math.min(10, s.length()));\r
-    }\r
-    @Override\r
-    boolean hasChildren() {\r
-        UndoContext c = contextRef.get();\r
-        if (null == c)\r
-            return false;\r
-        try {\r
-            return c.getAll().size() > 0;\r
-        } catch (DatabaseException e) {\r
-            Logger.defaultLogError(e);\r
-            return false;\r
-        }\r
-    }\r
-    @Override\r
-    public String toString() {\r
-        UndoContext c = contextRef.get();\r
-        if (null == c)\r
-            return name + "@no context";\r
-        return name + "@" + c;\r
-    }\r
-    @Override\r
-    Object[] getChildren() {\r
-        UndoContext c = contextRef.get();\r
-        if (null == c)\r
-            return new Object[0];\r
-        Collection<Operation> operations;\r
-        try {\r
-            operations = c.getAll();\r
-        } catch (DatabaseException e) {\r
-            Logger.defaultLogError(e);\r
-            return new Object[0];\r
-        }\r
-        if (operations.size() < 1)\r
-            return new Object[0];\r
-        Object[] objects = new Object[operations.size()];\r
-        Iterator<Operation> it = operations.iterator();\r
-        int i = operations.size();\r
-        while (it.hasNext()) {\r
-            Operation op = it.next();\r
-            objects[--i] = new UndoCombinedElement(session, op);\r
-        }\r
-        assert(0==i);\r
-        return objects;\r
-    }\r
-}\r
-\r
-class RedoContextElement extends UndoContextElement {\r
-    RedoContextElement(Session session, UndoContext context) {\r
-        super(session, context);\r
-        this.name = "Redo";\r
-    }\r
-    @Override\r
-    boolean hasChildren() {\r
-        UndoContext c = contextRef.get();\r
-        if (null == c)\r
-            return false;\r
-        try {\r
-            return c.getRedoList().size() > 0;\r
-        } catch (DatabaseException e) {\r
-            Logger.defaultLogError(e);\r
-            return false;\r
-        }\r
-    }\r
-    @Override\r
-    Object[] getChildren() {\r
-        UndoContext c = contextRef.get();\r
-        if (null == c)\r
-            return new Object[0];\r
-        Collection<Operation> operations;\r
-        try {\r
-            operations = c.getRedoList();\r
-        } catch (DatabaseException e) {\r
-            Logger.defaultLogError(e);\r
-            operations = null;\r
-        }\r
-        if (operations.size() < 1)\r
-            return new Object[0];\r
-        Object[] objects = new Object[operations.size()];\r
-        Iterator<Operation> it = operations.iterator();\r
-        int i = operations.size();\r
-        while (it.hasNext()) {\r
-            Operation op = it.next();\r
-            objects[--i] = new UndoCombinedElement(session, op); \r
-        }\r
-        assert(0 == i);\r
-        return objects;\r
-    }\r
-}\r
-\r
-class UndoCombinedElement extends UndoViewElement {\r
-    private final Operation operation;\r
-    private final Vector<ChangeSetElement> elements = new Vector<ChangeSetElement>();\r
-    private String comment = null;\r
-    UndoCombinedElement(Session session, Operation op) {\r
-        super(session);\r
-        operation = op;\r
-    }\r
-    @Override\r
-    protected Image getIdImage() {\r
-        return Images.getInstance().UNDO_IMAGE;\r
-    }\r
-    @Override\r
-    protected String getIdText() {\r
-        return "" + operation.getId();\r
-    }\r
-    @Override\r
-    protected String getDateText() {\r
-        if (elements.size() == 0)\r
-            getChildren();\r
-        if (elements.size() > 0)\r
-            return elements.firstElement().getDateText();\r
-        else\r
-            return null; \r
-    }\r
-    @Override\r
-    protected String getCommentText() {\r
-        if (elements.size() == 0)\r
-            getChildren();\r
-        if (elements.size() > 0)\r
-            return elements.firstElement().getCommentText();\r
-        else\r
-            return null; \r
-    }\r
-    @Override\r
-    boolean hasChildren() {\r
-        return operation.getOperations().size() > 0;\r
-    }\r
-    @Override\r
-    Object[] getChildren() {\r
-        Collection<Operation> ops = operation.getOperations();\r
-        final int SIZE = ops.size(); \r
-        if (SIZE < 1)\r
-            return new Object[0];\r
-        elements.clear();\r
-        Iterator<Operation> it = ops.iterator();\r
-        for (int i=0; i<SIZE; ++i) {\r
-            Operation op = it.next();\r
-            ChangeSetElement e = new ChangeSetElement(session, op.getCSId());\r
-            elements.add(e);\r
-        }\r
-        if (elements.size() == 1)\r
-            return elements.firstElement().getChildren();\r
-        return elements.toArray();\r
-    }\r
-    @Override\r
-    public String toString() {\r
-        getChildren(); // This initializes elements vector.\r
-        for (ChangeSetElement e : elements) {\r
-            comment = e.toString();\r
-            if (null != comment)\r
-                return comment;\r
-        }\r
-        return "no name";\r
-    }\r
-}\r
-\r
-class UndoContentProvider extends ChangeSetProvider implements ChangeListener {\r
-    private UndoContextElement uce;\r
-    protected UndoRedoSupport undoRedoSupport;\r
-    private boolean subscribed = false;\r
-    UndoContentProvider(Session session) {\r
-        super(session);\r
-        undoRedoSupport = session.getService(UndoRedoSupport.class);\r
-        subscribe();\r
-    }\r
-    @Override\r
-    public Object[] getElements(Object inputElement) {\r
-        return getElements(session);\r
-    }\r
-    @Override\r
-    public void dispose() {\r
-        managementSupport.cancel(this);\r
-        this.subscribed = false;\r
-        super.dispose();\r
-    }\r
-    @Override\r
-    public void onChanged() {\r
-        if (null != viewer)\r
-            refresh();\r
-    }\r
-    protected Object[] getElements(Session session) {\r
-        try {\r
-            UndoRedoSupport undoSupport = session.getService(UndoRedoSupport.class);\r
-            UndoContext undoContext = undoSupport.getUndoContext(session);\r
-            if (null != undoContext) {\r
-                uce = new UndoContextElement(session, undoContext);\r
-                return uce.getChildren();\r
-            }\r
-        } catch (Exception e) {\r
-            Logger.defaultLogError(e);\r
-            if (DEBUG)\r
-                ShowError.showError("Error", e.getMessage(), e);\r
-        }\r
-        return new Object[0];\r
-    }\r
-    protected void subscribe() {\r
-        super.subscribe();\r
-        if (this.subscribed)\r
-            return;\r
-        if (null == undoRedoSupport)\r
-            undoRedoSupport = session.getService(UndoRedoSupport.class);\r
-        undoRedoSupport.subscribe(this);\r
-        this.subscribed = true;\r
-    }\r
-    void removeAll() {\r
-        UndoRedoSupport us = session.getService(UndoRedoSupport.class);\r
-        UndoContext uc = us.getUndoContext(session);\r
-        if (uc != null) {\r
-            uc.clear();\r
-            refresh();\r
-        }\r
-    }\r
-}\r
-\r
-class RedoContentProvider extends UndoContentProvider {\r
-    private RedoContextElement rce;\r
-    RedoContentProvider(Session session) {\r
-        super(session);\r
-    }\r
-    @Override\r
-    protected Object[] getElements(Session session) {\r
-        try {\r
-            UndoRedoSupport undoSupport = session.getService(UndoRedoSupport.class);\r
-            UndoContext undoContext = undoSupport.getUndoContext(session);\r
-            if (null != undoContext) {\r
-                rce = new RedoContextElement(session, undoContext);\r
-                return rce.getChildren();\r
-            }\r
-        } catch (Exception e) {\r
-            Logger.defaultLogError(e);\r
-            if (DEBUG)\r
-                ShowError.showError("Error", e.getMessage(), e);\r
-        }\r
-        return new Object[0];\r
-    }\r
-}\r
+package org.simantics.team.ui;
+
+import java.lang.ref.WeakReference;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CodingErrorAction;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Vector;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.layout.TreeColumnLayout;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.TreeViewerColumn;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.simantics.db.Operation;
+import org.simantics.db.Session;
+import org.simantics.db.UndoContext;
+import org.simantics.db.common.utils.Logger;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.service.UndoRedoSupport;
+import org.simantics.db.service.UndoRedoSupport.ChangeListener;
+import org.simantics.team.Activator;
+import org.simantics.team.internal.Images;
+import org.simantics.ui.SimanticsUI;
+import org.simantics.utils.ui.dialogs.ShowError;
+
+/**
+ * @author Kalle Kondelin
+ */
+public class UndoView extends TreeView {
+    @Override
+    public void createPartControl(Composite parent) {
+        this.parent = parent;
+        this.treeViewer = new TreeViewer(parent, SWT.SINGLE | SWT.FULL_SELECTION);
+        this.resourceManager = new LocalResourceManager(JFaceResources.getResources(parent.getDisplay()), treeViewer.getTree());
+        Images.getInstance(JFaceResources.getResources());
+        TreeColumnLayout ad = new TreeColumnLayout();
+        parent.setLayout(ad);
+        treeViewer.getTree().setHeaderVisible(true);
+        //treeViewer.getTree().setLinesVisible(true);
+        //treeViewer.setUseHashlookup(true);
+        //treeViewer.setAutoExpandLevel(3);
+
+        TreeViewerColumn idColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
+        TreeViewerColumn dateColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
+        TreeViewerColumn commentColumn = new TreeViewerColumn(treeViewer, SWT.LEFT);
+
+        idColumn.setLabelProvider(new IdColumnLabelProvider());
+        dateColumn.setLabelProvider(new DateColumnLabelProvider());
+        commentColumn.setLabelProvider(new CommentColumnLabelProvider());
+
+        idColumn.getColumn().setText("Id");
+        idColumn.getColumn().setWidth(20);
+        ad.setColumnData(idColumn.getColumn(), new ColumnWeightData(50, 20));
+        dateColumn.getColumn().setText("Date");
+        dateColumn.getColumn().setWidth(20);
+        ad.setColumnData(dateColumn.getColumn(), new ColumnWeightData(50, 40));
+        commentColumn.getColumn().setText("Comment");
+        commentColumn.getColumn().setWidth(20);
+        ad.setColumnData(commentColumn.getColumn(), new ColumnWeightData(50, 50));
+
+        final UndoContentProvider contentProvider = new UndoContentProvider(SimanticsUI.getSession());
+          treeViewer.setContentProvider(contentProvider);
+          treeViewer.setInput(this);
+          getViewSite().getActionBars().getToolBarManager().add(new Action("Remove All", Activator.REMOVE_ALL_ICON) {
+              @Override
+              public void run() {
+                  contentProvider.removeAll();
+              }
+          });
+          getViewSite().getActionBars().getToolBarManager().add(new Action("Get Undo History", Activator.REFRESH_ICON) {
+              @Override
+              public void run() {
+                  treeViewer.setContentProvider(contentProvider);
+              }
+          });
+          new ItemDetailToolTip(treeViewer, treeViewer.getTree(), null);
+    }
+}
+
+abstract class UndoViewElement extends TreeElement {
+    protected Session session;
+    UndoViewElement(Session session) {
+        this.session = session;
+    }
+    protected static final Charset UTF8 = Charset.forName("UTF-8");
+    protected String toString(byte[] data) {
+        if (data == null)
+            return "null";
+        CharsetDecoder decoder = UTF8.newDecoder();
+        ByteBuffer bbuf = ByteBuffer.wrap(data);
+        CharBuffer cbuf;
+        String s = null;
+        try {
+            cbuf = decoder.decode(bbuf);
+            s = cbuf.toString();
+        } catch (CharacterCodingException e) {
+            bbuf.rewind();
+            try {
+                cbuf = UTF8
+                .newDecoder()
+                .onMalformedInput(CodingErrorAction.REPLACE)
+                .onUnmappableCharacter(CodingErrorAction.REPLACE)
+                .decode(bbuf);
+                s = cbuf.toString();
+            } catch (CharacterCodingException e1) {
+                return "String conversion error.";
+            }
+        }
+        return s;
+    }
+    @Override
+    boolean hasChildren() {
+            return false;
+    }
+    @Override
+    Object[] getChildren() {
+        return new Object[0];
+    }
+}
+
+class UndoContextElement extends UndoViewElement {
+    protected String name = "Undo";
+    protected WeakReference<UndoContext> contextRef;
+    UndoContextElement(Session session, UndoContext context) {
+        super(session);
+        this.contextRef = new WeakReference<UndoContext>(context);
+    }
+    @Override
+    protected Image getIdImage() {
+        return Images.getInstance().OTHER_IMAGE;
+    }
+    @Override
+    protected String getIdText() {
+        String s = toString();
+        return s.substring(0, Math.min(10, s.length()));
+    }
+    @Override
+    boolean hasChildren() {
+        UndoContext c = contextRef.get();
+        if (null == c)
+            return false;
+        try {
+            return c.getAll().size() > 0;
+        } catch (DatabaseException e) {
+            Logger.defaultLogError(e);
+            return false;
+        }
+    }
+    @Override
+    public String toString() {
+        UndoContext c = contextRef.get();
+        if (null == c)
+            return name + "@no context";
+        return name + "@" + c;
+    }
+    @Override
+    Object[] getChildren() {
+        UndoContext c = contextRef.get();
+        if (null == c)
+            return new Object[0];
+        Collection<Operation> operations;
+        try {
+            operations = c.getAll();
+        } catch (DatabaseException e) {
+            Logger.defaultLogError(e);
+            return new Object[0];
+        }
+        if (operations.size() < 1)
+            return new Object[0];
+        Object[] objects = new Object[operations.size()];
+        Iterator<Operation> it = operations.iterator();
+        int i = operations.size();
+        while (it.hasNext()) {
+            Operation op = it.next();
+            objects[--i] = new UndoCombinedElement(session, op);
+        }
+        assert(0==i);
+        return objects;
+    }
+}
+
+class RedoContextElement extends UndoContextElement {
+    RedoContextElement(Session session, UndoContext context) {
+        super(session, context);
+        this.name = "Redo";
+    }
+    @Override
+    boolean hasChildren() {
+        UndoContext c = contextRef.get();
+        if (null == c)
+            return false;
+        try {
+            return c.getRedoList().size() > 0;
+        } catch (DatabaseException e) {
+            Logger.defaultLogError(e);
+            return false;
+        }
+    }
+    @Override
+    Object[] getChildren() {
+        UndoContext c = contextRef.get();
+        if (null == c)
+            return new Object[0];
+        Collection<Operation> operations;
+        try {
+            operations = c.getRedoList();
+        } catch (DatabaseException e) {
+            Logger.defaultLogError(e);
+            operations = null;
+        }
+        if (operations.size() < 1)
+            return new Object[0];
+        Object[] objects = new Object[operations.size()];
+        Iterator<Operation> it = operations.iterator();
+        int i = operations.size();
+        while (it.hasNext()) {
+            Operation op = it.next();
+            objects[--i] = new UndoCombinedElement(session, op); 
+        }
+        assert(0 == i);
+        return objects;
+    }
+}
+
+class UndoCombinedElement extends UndoViewElement {
+    private final Operation operation;
+    private final Vector<ChangeSetElement> elements = new Vector<ChangeSetElement>();
+    private String comment = null;
+    UndoCombinedElement(Session session, Operation op) {
+        super(session);
+        operation = op;
+    }
+    @Override
+    protected Image getIdImage() {
+        return Images.getInstance().UNDO_IMAGE;
+    }
+    @Override
+    protected String getIdText() {
+        return "" + operation.getId();
+    }
+    @Override
+    protected String getDateText() {
+        if (elements.size() == 0)
+            getChildren();
+        if (elements.size() > 0)
+            return elements.firstElement().getDateText();
+        else
+            return null; 
+    }
+    @Override
+    protected String getCommentText() {
+        if (elements.size() == 0)
+            getChildren();
+        if (elements.size() > 0)
+            return elements.firstElement().getCommentText();
+        else
+            return null; 
+    }
+    @Override
+    boolean hasChildren() {
+        return operation.getOperations().size() > 0;
+    }
+    @Override
+    Object[] getChildren() {
+        Collection<Operation> ops = operation.getOperations();
+        final int SIZE = ops.size(); 
+        if (SIZE < 1)
+            return new Object[0];
+        elements.clear();
+        Iterator<Operation> it = ops.iterator();
+        for (int i=0; i<SIZE; ++i) {
+            Operation op = it.next();
+            ChangeSetElement e = new ChangeSetElement(session, op.getCSId());
+            elements.add(e);
+        }
+        if (elements.size() == 1)
+            return elements.firstElement().getChildren();
+        return elements.toArray();
+    }
+    @Override
+    public String toString() {
+        getChildren(); // This initializes elements vector.
+        for (ChangeSetElement e : elements) {
+            comment = e.toString();
+            if (null != comment)
+                return comment;
+        }
+        return "no name";
+    }
+}
+
+class UndoContentProvider extends ChangeSetProvider implements ChangeListener {
+    private UndoContextElement uce;
+    protected UndoRedoSupport undoRedoSupport;
+    private boolean subscribed = false;
+    UndoContentProvider(Session session) {
+        super(session);
+        undoRedoSupport = session.getService(UndoRedoSupport.class);
+        subscribe();
+    }
+    @Override
+    public Object[] getElements(Object inputElement) {
+        return getElements(session);
+    }
+    @Override
+    public void dispose() {
+        managementSupport.cancel(this);
+        this.subscribed = false;
+        super.dispose();
+    }
+    @Override
+    public void onChanged() {
+        if (null != viewer)
+            refresh();
+    }
+    protected Object[] getElements(Session session) {
+        try {
+            UndoRedoSupport undoSupport = session.getService(UndoRedoSupport.class);
+            UndoContext undoContext = undoSupport.getUndoContext(session);
+            if (null != undoContext) {
+                uce = new UndoContextElement(session, undoContext);
+                return uce.getChildren();
+            }
+        } catch (Exception e) {
+            Logger.defaultLogError(e);
+            if (DEBUG)
+                ShowError.showError("Error", e.getMessage(), e);
+        }
+        return new Object[0];
+    }
+    protected void subscribe() {
+        super.subscribe();
+        if (this.subscribed)
+            return;
+        if (null == undoRedoSupport)
+            undoRedoSupport = session.getService(UndoRedoSupport.class);
+        undoRedoSupport.subscribe(this);
+        this.subscribed = true;
+    }
+    void removeAll() {
+        UndoRedoSupport us = session.getService(UndoRedoSupport.class);
+        UndoContext uc = us.getUndoContext(session);
+        if (uc != null) {
+            uc.clear();
+            refresh();
+        }
+    }
+}
+
+class RedoContentProvider extends UndoContentProvider {
+    private RedoContextElement rce;
+    RedoContentProvider(Session session) {
+        super(session);
+    }
+    @Override
+    protected Object[] getElements(Session session) {
+        try {
+            UndoRedoSupport undoSupport = session.getService(UndoRedoSupport.class);
+            UndoContext undoContext = undoSupport.getUndoContext(session);
+            if (null != undoContext) {
+                rce = new RedoContextElement(session, undoContext);
+                return rce.getChildren();
+            }
+        } catch (Exception e) {
+            Logger.defaultLogError(e);
+            if (DEBUG)
+                ShowError.showError("Error", e.getMessage(), e);
+        }
+        return new Object[0];
+    }
+}