{"thread":{"id":"14399","subject":"[EGIT PATCH 1/6] Create a selection handler for the revision graph.","startedAt":"2008-07-10T22:39:27Z","lastAt":"2008-07-11T11:14:13Z","messageCount":10,"participants":["Robin Rosenberg","Shawn O. Pearce","Johannes Schindelin"],"isPatch":true,"patchVersion":1,"patchTotal":6},"messages":[{"id":"82863","messageId":"1215729573-26536-1-git-send-email-robin.rosenberg@dewire.com","threadId":"14399","inReplyTo":null,"subject":"[EGIT PATCH 0/6] RevObject selection handler","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2008-07-10T22:39:27Z","receivedAt":"2008-07-10T22:39:27Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"This adds a new type of selection handler that connects to the\nhistory view, but could be used in other, yet to be invented\nviews. It allows us to declare actions using the view and \nobject contribution mechanism. And then some uses of that code.\n\n-- robin\n\nRobin Rosenberg (6):\n  Create a selection handler for the revision graph.\n  Using the page site selection turned out to be cumbersome.\n  Adapt Git team operations to non-resouce objects\n  Teach the revision selection handler about the active repository\n  Create baseclasses for actions and operations on RevObjects\n  Add actions in history view to perform reset actions\n\n .../org/spearce/egit/core/internal/UpdateJob.java  |    2 +\n .../egit/core/op/AssumeUnchangedOperation.java     |    6 +-\n .../egit/core/op/DisconnectProviderOperation.java  |    7 +-\n .../org/spearce/egit/core/op/TrackOperation.java   |    6 +-\n .../org/spearce/egit/core/op/UntrackOperation.java |    6 +-\n org.spearce.egit.ui/plugin.xml                     |   28 ++++++++\n .../internal/actions/AbstractOperationAction.java  |   15 +++--\n .../internal/actions/AbstractRevObjectAction.java  |   26 ++++++++\n .../actions/AbstractRevObjectOperation.java        |   21 ++++++\n .../actions/HardResetToRevisionAction.java         |   26 ++++++++\n .../actions/MixedResetToRevisionAction.java        |   26 ++++++++\n .../actions/SoftResetToRevisionAction.java         |   26 ++++++++\n .../egit/ui/internal/history/GitHistoryPage.java   |   16 ++++-\n .../history/RevObjectSelectionProvider.java        |   67 ++++++++++++++++++++\n 14 files changed, 258 insertions(+), 20 deletions(-)\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractRevObjectAction.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractRevObjectOperation.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/HardResetToRevisionAction.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/MixedResetToRevisionAction.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SoftResetToRevisionAction.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/RevObjectSelectionProvider.java\n"},{"id":"82860","messageId":"1215729573-26536-2-git-send-email-robin.rosenberg@dewire.com","threadId":"14399","inReplyTo":"1215729573-26536-1-git-send-email-robin.rosenberg@dewire.com","subject":"[EGIT PATCH 1/6] Create a selection handler for the revision graph.","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2008-07-10T22:39:28Z","receivedAt":"2008-07-10T22:39:28Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"This make it possible to associate content menu contributions\nwith selections in the history graph.\n\nSigned-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n .../egit/ui/internal/history/GitHistoryPage.java   |   11 ++++-\n .../history/RevObjectSelectionProvider.java        |   48 ++++++++++++++++++++\n 2 files changed, 57 insertions(+), 2 deletions(-)\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/RevObjectSelectionProvider.java\n\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java\nindex 9bcae19..6eaa6e4 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java\n@@ -181,6 +181,11 @@ public class GitHistoryPage extends HistoryPage {\n \t */\n \tprivate List<String> pathFilters;\n \n+\t/**\n+\t * The selection provider tracks the selected revisions for the context menu\n+\t */\n+\tprivate RevObjectSelectionProvider revObjectSelectionProvider;\n+\n \t@Override\n \tpublic void createControl(final Composite parent) {\n \t\tGridData gd;\n@@ -211,6 +216,7 @@ public class GitHistoryPage extends HistoryPage {\n \t\tlayoutSashForm(graphDetailSplit, SPLIT_GRAPH);\n \t\tlayoutSashForm(revInfoSplit, SPLIT_INFO);\n \n+\t\trevObjectSelectionProvider = new RevObjectSelectionProvider();\n \t\tpopupMgr = new MenuManager(null, POPUP_ID);\n \t\tattachCommitSelectionChanged();\n \t\tcreateLocalToolbarActions();\n@@ -221,7 +227,6 @@ public class GitHistoryPage extends HistoryPage {\n \t\tattachContextMenu(graph.getControl());\n \t\tattachContextMenu(commentViewer.getControl());\n \t\tattachContextMenu(fileViewer.getControl());\n-\n \t\tlayout();\n \t}\n \n@@ -229,7 +234,8 @@ public class GitHistoryPage extends HistoryPage {\n \t\tpopupMgr.add(new Separator());\n \t\tpopupMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));\n \t\tgetSite().registerContextMenu(POPUP_ID, popupMgr,\n-\t\t\t\tgetSite().getSelectionProvider());\n+\t\t\t\trevObjectSelectionProvider);\n+\t\tgetSite().setSelectionProvider(revObjectSelectionProvider);\n \t}\n \n \tprivate void attachContextMenu(final Control c) {\n@@ -299,6 +305,7 @@ public class GitHistoryPage extends HistoryPage {\n \t\t\t\tc = (PlotCommit<?>) sel.getFirstElement();\n \t\t\t\tcommentViewer.setInput(c);\n \t\t\t\tfileViewer.setInput(c);\n+\t\t\t\trevObjectSelectionProvider.setSelection(s);\n \t\t\t}\n \t\t});\n \t\tcommentViewer\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/RevObjectSelectionProvider.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/RevObjectSelectionProvider.java\nnew file mode 100644\nindex 0000000..c44b229\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/RevObjectSelectionProvider.java\n@@ -0,0 +1,48 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.history;\n+\n+import java.util.ArrayList;\n+import java.util.List;\n+\n+import org.eclipse.jface.viewers.ISelection;\n+import org.eclipse.jface.viewers.ISelectionChangedListener;\n+import org.eclipse.jface.viewers.ISelectionProvider;\n+import org.eclipse.jface.viewers.SelectionChangedEvent;\n+\n+/**\n+ * A selection provider for Git revision objects\n+ */\n+public class RevObjectSelectionProvider implements ISelectionProvider {\n+\n+\tprivate List<ISelectionChangedListener> listeners = new ArrayList<ISelectionChangedListener>();\n+\n+\tprivate ISelection selection;\n+\n+\tpublic void addSelectionChangedListener(ISelectionChangedListener listener) {\n+\t\tlisteners.add(listener);\n+\t}\n+\n+\tpublic ISelection getSelection() {\n+\t\treturn selection;\n+\t}\n+\n+\tpublic void removeSelectionChangedListener(\n+\t\t\tISelectionChangedListener listener) {\n+\t\tlisteners.remove(listener);\n+\t}\n+\n+\tpublic void setSelection(ISelection selection) {\n+\t\tthis.selection = selection;\n+\t\tSelectionChangedEvent event = new SelectionChangedEvent(this, selection);\n+\t\tfor (ISelectionChangedListener l : listeners) {\n+\t\t\tl.selectionChanged(event);\n+\t\t}\n+\t}\n+\n+}\n-- \n1.5.6.2.220.g44701\n"},{"id":"82864","messageId":"1215729573-26536-3-git-send-email-robin.rosenberg@dewire.com","threadId":"14399","inReplyTo":"1215729573-26536-2-git-send-email-robin.rosenberg@dewire.com","subject":"[EGIT PATCH 2/6] Using the page site selection turned out to be cumbersome.","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2008-07-10T22:39:29Z","receivedAt":"2008-07-10T22:39:29Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"So we use the view site instead. I'm not sure that is the proper\nway though.\n\nSigned-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n org.spearce.egit.ui/plugin.xml                     |   23 ++++++++++++++++++++\n .../egit/ui/internal/history/GitHistoryPage.java   |    3 +-\n 2 files changed, 25 insertions(+), 1 deletions(-)\n\ndiff --git a/org.spearce.egit.ui/plugin.xml b/org.spearce.egit.ui/plugin.xml\nindex 611829a..924c6e5 100644\n--- a/org.spearce.egit.ui/plugin.xml\n+++ b/org.spearce.egit.ui/plugin.xml\n@@ -97,6 +97,29 @@\n                menubarPath=\"team.main/group1\"\n                tooltip=\"%CommitAction_tooltip\"/>\n \t  </objectContribution>\n+      <objectContribution\n+            id=\"org.spearce.egit.ui.revobjectContributions\"\n+            adaptable=\"true\"\n+            objectClass=\"org.spearce.jgit.revwalk.RevObject\">\n+         <action\n+               class=\"org.spearce.egit.ui.internal.actions.BranchAction\"\n+               id=\"org.spearce.egit.ui.action1\"\n+               label=\"Kolla\"\n+               enablesFor=\"*\"\n+               menubarPath=\"additions\">\n+         </action>\n+      </objectContribution>\n+      <viewerContribution\n+            id=\"org.spearce.egit.ui.viewerContribution1\"\n+            targetID=\"org.spearce.egit.ui.historyPageContributions\">\n+         <action\n+               class=\"org.spearce.egit.ui.internal.actions.ResetAction\"\n+               id=\"org.spearce.egit.ui.action1\"\n+               label=\"Titta\"\n+               enablesFor=\"*\"\n+               menubarPath=\"additions\">\n+         </action>\n+      </viewerContribution>\n    </extension>\n \n    <extension\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java\nindex 6eaa6e4..d8777ef 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java\n@@ -235,7 +235,8 @@ public class GitHistoryPage extends HistoryPage {\n \t\tpopupMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));\n \t\tgetSite().registerContextMenu(POPUP_ID, popupMgr,\n \t\t\t\trevObjectSelectionProvider);\n-\t\tgetSite().setSelectionProvider(revObjectSelectionProvider);\n+\t\tgetHistoryPageSite().getPart().getSite().setSelectionProvider(\n+\t\t\t\trevObjectSelectionProvider);\n \t}\n \n \tprivate void attachContextMenu(final Control c) {\n-- \n1.5.6.2.220.g44701\n"},{"id":"82865","messageId":"1215729573-26536-4-git-send-email-robin.rosenberg@dewire.com","threadId":"14399","inReplyTo":"1215729573-26536-3-git-send-email-robin.rosenberg@dewire.com","subject":"[EGIT PATCH 3/6] Adapt Git team operations to non-resouce objects","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2008-07-10T22:39:30Z","receivedAt":"2008-07-10T22:39:30Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"Sometimes structures in the workbench, such as in the Project Explorer\nin the Java EE perspective, are not represented directly as resources,\nbut connect to resources. We use the IAdaptable interface to ask for\nthe underlying resource and the proceed as usual.\n\nSigned-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n .../org/spearce/egit/core/internal/UpdateJob.java  |    2 ++\n .../egit/core/op/AssumeUnchangedOperation.java     |    6 +++---\n .../egit/core/op/DisconnectProviderOperation.java  |    7 +++----\n .../org/spearce/egit/core/op/TrackOperation.java   |    6 +++---\n .../org/spearce/egit/core/op/UntrackOperation.java |    6 +++---\n 5 files changed, 14 insertions(+), 13 deletions(-)\n\ndiff --git a/org.spearce.egit.core/src/org/spearce/egit/core/internal/UpdateJob.java b/org.spearce.egit.core/src/org/spearce/egit/core/internal/UpdateJob.java\nindex 9641529..be1c591 100644\n--- a/org.spearce.egit.core/src/org/spearce/egit/core/internal/UpdateJob.java\n+++ b/org.spearce.egit.core/src/org/spearce/egit/core/internal/UpdateJob.java\n@@ -21,6 +21,7 @@ import org.eclipse.core.resources.IResourceProxy;\n import org.eclipse.core.resources.IResourceProxyVisitor;\n import org.eclipse.core.resources.IResourceVisitor;\n import org.eclipse.core.runtime.CoreException;\n+import org.eclipse.core.runtime.IAdaptable;\n import org.eclipse.core.runtime.IProgressMonitor;\n import org.eclipse.core.runtime.IStatus;\n import org.eclipse.core.runtime.NullProgressMonitor;\n@@ -65,6 +66,7 @@ public class UpdateJob extends Job {\n \t\t\t\tfinal int[] count=new int[1];\n \t\t\t\tlong t0=System.currentTimeMillis();\n \t\t\t\tfor (Object obj : rsrcList) {\n+\t\t\t\t\tobj = ((IAdaptable)obj).getAdapter(IResource.class);\n \t\t\t\t\tif (obj instanceof IContainer) {\n \t\t\t\t\t\t((IContainer)obj).accept(new IResourceProxyVisitor() {\n \t\t\t\t\t\t\tpublic boolean visit(IResourceProxy rp) throws CoreException {\ndiff --git a/org.spearce.egit.core/src/org/spearce/egit/core/op/AssumeUnchangedOperation.java b/org.spearce.egit.core/src/org/spearce/egit/core/op/AssumeUnchangedOperation.java\nindex 856ef3f..78a84bb 100644\n--- a/org.spearce.egit.core/src/org/spearce/egit/core/op/AssumeUnchangedOperation.java\n+++ b/org.spearce.egit.core/src/org/spearce/egit/core/op/AssumeUnchangedOperation.java\n@@ -18,6 +18,7 @@ import org.eclipse.core.resources.IResource;\n import org.eclipse.core.resources.IResourceVisitor;\n import org.eclipse.core.resources.IWorkspaceRunnable;\n import org.eclipse.core.runtime.CoreException;\n+import org.eclipse.core.runtime.IAdaptable;\n import org.eclipse.core.runtime.IProgressMonitor;\n import org.eclipse.core.runtime.NullProgressMonitor;\n import org.spearce.egit.core.Activator;\n@@ -51,9 +52,8 @@ public class AssumeUnchangedOperation implements IWorkspaceRunnable {\n \t\tfinal IdentityHashMap<RepositoryMapping, Boolean> tomerge = new IdentityHashMap<RepositoryMapping, Boolean>();\n \t\tm.beginTask(CoreText.AssumeUnchangedOperation_adding, rsrcList.size() * 200);\n \t\ttry {\n-\t\t\tfinal Iterator i = rsrcList.iterator();\n-\t\t\twhile (i.hasNext()) {\n-\t\t\t\tfinal Object obj = i.next();\n+\t\t\tfor (Object obj : rsrcList) {\n+\t\t\t\tobj = ((IAdaptable)obj).getAdapter(IResource.class);\n \t\t\t\tif (obj instanceof IResource) {\n \t\t\t\t\tfinal IResource toAssumeValid = (IResource)obj;\n \t\t\t\t\tfinal RepositoryMapping rm = RepositoryMapping.getMapping(toAssumeValid);\ndiff --git a/org.spearce.egit.core/src/org/spearce/egit/core/op/DisconnectProviderOperation.java b/org.spearce.egit.core/src/org/spearce/egit/core/op/DisconnectProviderOperation.java\nindex 7fde335..b63c69b 100644\n--- a/org.spearce.egit.core/src/org/spearce/egit/core/op/DisconnectProviderOperation.java\n+++ b/org.spearce.egit.core/src/org/spearce/egit/core/op/DisconnectProviderOperation.java\n@@ -8,13 +8,13 @@\n package org.spearce.egit.core.op;\n \n import java.util.Collection;\n-import java.util.Iterator;\n \n import org.eclipse.core.resources.IContainer;\n import org.eclipse.core.resources.IProject;\n import org.eclipse.core.resources.IResource;\n import org.eclipse.core.resources.IWorkspaceRunnable;\n import org.eclipse.core.runtime.CoreException;\n+import org.eclipse.core.runtime.IAdaptable;\n import org.eclipse.core.runtime.IProgressMonitor;\n import org.eclipse.core.runtime.NullProgressMonitor;\n import org.eclipse.core.runtime.SubProgressMonitor;\n@@ -51,9 +51,8 @@ public class DisconnectProviderOperation implements IWorkspaceRunnable {\n \t\tm.beginTask(CoreText.DisconnectProviderOperation_disconnecting,\n \t\t\t\tprojectList.size() * 200);\n \t\ttry {\n-\t\t\tfinal Iterator i = projectList.iterator();\n-\t\t\twhile (i.hasNext()) {\n-\t\t\t\tfinal Object obj = i.next();\n+\t\t\tfor (Object obj : projectList) {\n+\t\t\t\tobj = ((IAdaptable)obj).getAdapter(IResource.class);\n \t\t\t\tif (obj instanceof IProject) {\n \t\t\t\t\tfinal IProject p = (IProject) obj;\n \ndiff --git a/org.spearce.egit.core/src/org/spearce/egit/core/op/TrackOperation.java b/org.spearce.egit.core/src/org/spearce/egit/core/op/TrackOperation.java\nindex af16cdb..29b4344 100644\n--- a/org.spearce.egit.core/src/org/spearce/egit/core/op/TrackOperation.java\n+++ b/org.spearce.egit.core/src/org/spearce/egit/core/op/TrackOperation.java\n@@ -21,6 +21,7 @@ import org.eclipse.core.resources.IResource;\n import org.eclipse.core.resources.IResourceVisitor;\n import org.eclipse.core.resources.IWorkspaceRunnable;\n import org.eclipse.core.runtime.CoreException;\n+import org.eclipse.core.runtime.IAdaptable;\n import org.eclipse.core.runtime.IProgressMonitor;\n import org.eclipse.core.runtime.NullProgressMonitor;\n import org.eclipse.team.core.Team;\n@@ -65,9 +66,8 @@ public class TrackOperation implements IWorkspaceRunnable {\n \t\tfinal IdentityHashMap<RepositoryMapping, Boolean> tomerge = new IdentityHashMap<RepositoryMapping, Boolean>();\n \t\tm.beginTask(CoreText.AddOperation_adding, rsrcList.size() * 200);\n \t\ttry {\n-\t\t\tfinal Iterator i = rsrcList.iterator();\n-\t\t\twhile (i.hasNext()) {\n-\t\t\t\tfinal Object obj = i.next();\n+\t\t\tfor (Object obj : rsrcList) {\n+\t\t\t\tobj = ((IAdaptable)obj).getAdapter(IResource.class);\n \t\t\t\tif (obj instanceof IResource) {\n \t\t\t\t\tfinal IResource toAdd = (IResource)obj;\n \t\t\t\t\tfinal RepositoryMapping rm = RepositoryMapping.getMapping(toAdd);\ndiff --git a/org.spearce.egit.core/src/org/spearce/egit/core/op/UntrackOperation.java b/org.spearce.egit.core/src/org/spearce/egit/core/op/UntrackOperation.java\nindex fdc9c2e..369ff38 100644\n--- a/org.spearce.egit.core/src/org/spearce/egit/core/op/UntrackOperation.java\n+++ b/org.spearce.egit.core/src/org/spearce/egit/core/op/UntrackOperation.java\n@@ -20,6 +20,7 @@ import org.eclipse.core.resources.IResource;\n import org.eclipse.core.resources.IResourceVisitor;\n import org.eclipse.core.resources.IWorkspaceRunnable;\n import org.eclipse.core.runtime.CoreException;\n+import org.eclipse.core.runtime.IAdaptable;\n import org.eclipse.core.runtime.IProgressMonitor;\n import org.eclipse.core.runtime.NullProgressMonitor;\n import org.spearce.egit.core.Activator;\n@@ -62,9 +63,8 @@ public class UntrackOperation implements IWorkspaceRunnable {\n \t\tfinal IdentityHashMap<RepositoryMapping, Boolean> tomerge = new IdentityHashMap<RepositoryMapping, Boolean>();\n \t\tm.beginTask(CoreText.AddOperation_adding, rsrcList.size() * 200);\n \t\ttry {\n-\t\t\tfinal Iterator i = rsrcList.iterator();\n-\t\t\twhile (i.hasNext()) {\n-\t\t\t\tfinal Object obj = i.next();\n+\t\t\tfor (Object obj : rsrcList) {\n+\t\t\t\tobj = ((IAdaptable)obj).getAdapter(IResource.class);\n \t\t\t\tif (obj instanceof IResource) {\n \t\t\t\t\tfinal IResource toRemove = (IResource)obj;\n \t\t\t\t\tfinal IProject p = toRemove.getProject();\t\t\t\t\t\n-- \n1.5.6.2.220.g44701\n"},{"id":"82861","messageId":"1215729573-26536-5-git-send-email-robin.rosenberg@dewire.com","threadId":"14399","inReplyTo":"1215729573-26536-4-git-send-email-robin.rosenberg@dewire.com","subject":"[EGIT PATCH 4/6] Teach the revision selection handler about the active repository","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2008-07-10T22:39:31Z","receivedAt":"2008-07-10T22:39:31Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"The handler needs to know which repository the selected revision was in.\n\nSigned-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n .../egit/ui/internal/history/GitHistoryPage.java   |    4 ++++\n .../history/RevObjectSelectionProvider.java        |   19 +++++++++++++++++++\n 2 files changed, 23 insertions(+), 0 deletions(-)\n\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java\nindex d8777ef..6b55185 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/GitHistoryPage.java\n@@ -503,6 +503,8 @@ public class GitHistoryPage extends HistoryPage {\n \n \t@Override\n \tpublic boolean inputSet() {\n+\t\tif (revObjectSelectionProvider != null)\n+\t\t\trevObjectSelectionProvider.setActiveRepository(null);\n \t\tcancelRefreshJob();\n \n \t\tif (graph == null)\n@@ -589,9 +591,11 @@ public class GitHistoryPage extends HistoryPage {\n \t\tlist.source(currentWalk);\n \n \t\tfinal GenerateHistoryJob rj = new GenerateHistoryJob(this, list);\n+\t\tfinal Repository fdb = db;\n \t\trj.addJobChangeListener(new JobChangeAdapter() {\n \t\t\t@Override\n \t\t\tpublic void done(final IJobChangeEvent event) {\n+\t\t\t\trevObjectSelectionProvider.setActiveRepository(fdb);\n \t\t\t\tfinal Control graphctl = graph.getControl();\n \t\t\t\tif (job != rj || graphctl.isDisposed())\n \t\t\t\t\treturn;\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/RevObjectSelectionProvider.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/RevObjectSelectionProvider.java\nindex c44b229..46a091c 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/RevObjectSelectionProvider.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/history/RevObjectSelectionProvider.java\n@@ -14,6 +14,7 @@ import org.eclipse.jface.viewers.ISelection;\n import org.eclipse.jface.viewers.ISelectionChangedListener;\n import org.eclipse.jface.viewers.ISelectionProvider;\n import org.eclipse.jface.viewers.SelectionChangedEvent;\n+import org.spearce.jgit.lib.Repository;\n \n /**\n  * A selection provider for Git revision objects\n@@ -24,6 +25,8 @@ public class RevObjectSelectionProvider implements ISelectionProvider {\n \n \tprivate ISelection selection;\n \n+\tprivate Repository repository;\n+\n \tpublic void addSelectionChangedListener(ISelectionChangedListener listener) {\n \t\tlisteners.add(listener);\n \t}\n@@ -45,4 +48,20 @@ public class RevObjectSelectionProvider implements ISelectionProvider {\n \t\t}\n \t}\n \n+\t/**\n+\t * Sets the active repository. This one is called by the view when the view\n+\t * is updated with new data.\n+\t *\n+\t * @param repository\n+\t */\n+\tpublic void setActiveRepository(Repository repository) {\n+\t\tthis.repository = repository;\n+\t}\n+\n+\t/**\n+\t * @return currently active repository\n+\t */\n+\tpublic Repository getActiveRepository() {\n+\t\treturn repository;\n+\t}\n }\n-- \n1.5.6.2.220.g44701\n"},{"id":"82862","messageId":"1215729573-26536-6-git-send-email-robin.rosenberg@dewire.com","threadId":"14399","inReplyTo":"1215729573-26536-5-git-send-email-robin.rosenberg@dewire.com","subject":"[EGIT PATCH 5/6] Create baseclasses for actions and operations on RevObjects","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2008-07-10T22:39:32Z","receivedAt":"2008-07-10T22:39:32Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n .../internal/actions/AbstractOperationAction.java  |   15 +++++++----\n .../internal/actions/AbstractRevObjectAction.java  |   26 ++++++++++++++++++++\n .../actions/AbstractRevObjectOperation.java        |   21 ++++++++++++++++\n 3 files changed, 57 insertions(+), 5 deletions(-)\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractRevObjectAction.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractRevObjectOperation.java\n\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractOperationAction.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractOperationAction.java\nindex be6d0d5..52f60f5 100644\n--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractOperationAction.java\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractOperationAction.java\n@@ -32,11 +32,20 @@ import org.spearce.egit.ui.UIText;\n  * Common functionality for EGit operations.\n  */\n public abstract class AbstractOperationAction implements IObjectActionDelegate {\n-\tprivate IWorkbenchPart wp;\n+\t/**\n+\t * The active workbench part\n+\t */\n+\tprotected IWorkbenchPart wp;\n \n \tprivate IWorkspaceRunnable op;\n \n \tpublic void selectionChanged(final IAction act, final ISelection sel) {\n+\t\t// work performed in setActivePart\n+\t}\n+\n+\tpublic void setActivePart(final IAction act, final IWorkbenchPart part) {\n+\t\twp = part;\n+\t\tISelection sel = part.getSite().getPage().getSelection();\n \t\tfinal List selection;\n \t\tif (sel instanceof IStructuredSelection && !sel.isEmpty()) {\n \t\t\tselection = ((IStructuredSelection) sel).toList();\n@@ -47,10 +56,6 @@ public abstract class AbstractOperationAction implements IObjectActionDelegate {\n \t\tact.setEnabled(op != null && wp != null);\n \t}\n \n-\tpublic void setActivePart(final IAction act, final IWorkbenchPart part) {\n-\t\twp = part;\n-\t}\n-\n \t/**\n \t * Instantiate an operation on an action on provided objects.\n \t *\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractRevObjectAction.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractRevObjectAction.java\nnew file mode 100644\nindex 0000000..b7f4285\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractRevObjectAction.java\n@@ -0,0 +1,26 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.actions;\n+\n+import org.spearce.egit.ui.internal.history.RevObjectSelectionProvider;\n+import org.spearce.jgit.lib.Repository;\n+\n+abstract class AbstractRevObjectAction extends AbstractOperationAction {\n+\n+\t/**\n+\t * Find out which repository is involved here\n+\t *\n+\t * @return the Git repository associated with the selected RevObject\n+\t */\n+\tprotected Repository getActiveRepository() {\n+\t\tRevObjectSelectionProvider selectionProvider = (RevObjectSelectionProvider) wp\n+\t\t\t\t.getSite().getSelectionProvider();\n+\t\treturn selectionProvider.getActiveRepository();\n+\t}\n+\n+}\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractRevObjectOperation.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractRevObjectOperation.java\nnew file mode 100644\nindex 0000000..0c5d570\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/AbstractRevObjectOperation.java\n@@ -0,0 +1,21 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.actions;\n+\n+import org.eclipse.core.resources.IWorkspaceRunnable;\n+import org.spearce.jgit.lib.Repository;\n+\n+abstract class AbstractRevObjectOperation implements IWorkspaceRunnable {\n+\n+\tRepository repository;\n+\n+\tAbstractRevObjectOperation(final Repository repository) {\n+\t\tthis.repository = repository;\n+\t}\n+\n+}\n-- \n1.5.6.2.220.g44701\n"},{"id":"82866","messageId":"1215729573-26536-7-git-send-email-robin.rosenberg@dewire.com","threadId":"14399","inReplyTo":"1215729573-26536-6-git-send-email-robin.rosenberg@dewire.com","subject":"[EGIT PATCH 6/6] Add actions in history view to perform reset actions","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2008-07-10T22:39:33Z","receivedAt":"2008-07-10T22:39:33Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"Soft, mixed and hard reset supported\n\nSigned-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n org.spearce.egit.ui/plugin.xml                     |   43 +++++++++++---------\n .../actions/HardResetToRevisionAction.java         |   26 ++++++++++++\n .../actions/MixedResetToRevisionAction.java        |   26 ++++++++++++\n .../actions/SoftResetToRevisionAction.java         |   26 ++++++++++++\n 4 files changed, 102 insertions(+), 19 deletions(-)\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/HardResetToRevisionAction.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/MixedResetToRevisionAction.java\n create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SoftResetToRevisionAction.java\n\ndiff --git a/org.spearce.egit.ui/plugin.xml b/org.spearce.egit.ui/plugin.xml\nindex 924c6e5..cfd4b80 100644\n--- a/org.spearce.egit.ui/plugin.xml\n+++ b/org.spearce.egit.ui/plugin.xml\n@@ -97,29 +97,34 @@\n                menubarPath=\"team.main/group1\"\n                tooltip=\"%CommitAction_tooltip\"/>\n \t  </objectContribution>\n-      <objectContribution\n-            id=\"org.spearce.egit.ui.revobjectContributions\"\n-            adaptable=\"true\"\n-            objectClass=\"org.spearce.jgit.revwalk.RevObject\">\n+\t  <objectContribution\n+         id=\"org.spearce.egit.ui.resetto\"\n+         objectClass=\"org.spearce.jgit.revwalk.RevCommit\">\n          <action\n-               class=\"org.spearce.egit.ui.internal.actions.BranchAction\"\n-               id=\"org.spearce.egit.ui.action1\"\n-               label=\"Kolla\"\n-               enablesFor=\"*\"\n-               menubarPath=\"additions\">\n+               class=\"org.spearce.egit.ui.internal.actions.SoftResetToRevisionAction\"\n+               id=\"org.spearce.egit.ui.softresettorevision\"\n+               label=\"Soft Reset\"\n+               menubarPath=\"additions\"\n+               enablesFor=\"1\"\n+               tooltip=\"Resets HEAD but not working directory nor index\">\n          </action>\n-      </objectContribution>\n-      <viewerContribution\n-            id=\"org.spearce.egit.ui.viewerContribution1\"\n-            targetID=\"org.spearce.egit.ui.historyPageContributions\">\n          <action\n-               class=\"org.spearce.egit.ui.internal.actions.ResetAction\"\n-               id=\"org.spearce.egit.ui.action1\"\n-               label=\"Titta\"\n-               enablesFor=\"*\"\n-               menubarPath=\"additions\">\n+               class=\"org.spearce.egit.ui.internal.actions.MixedResetToRevisionAction\"\n+               id=\"org.spearce.egit.ui.mixedresettorevision\"\n+               label=\"Mixed Reset\"\n+               menubarPath=\"additions\"\n+               enablesFor=\"1\"\n+               tooltip=\"Resets HEAD and index, but not working directory\">\n          </action>\n-      </viewerContribution>\n+         <action\n+               class=\"org.spearce.egit.ui.internal.actions.HardResetToRevisionAction\"\n+               id=\"org.spearce.egit.ui.hardresettorevision\"\n+               label=\"Hard Reset\"\n+               menubarPath=\"additions\"\n+               enablesFor=\"1\"\n+               tooltip=\"Resets HEAD and index, and working directory (changed in tracked files will be lost)\">\n+         </action>\n+\t  </objectContribution>\n    </extension>\n \n    <extension\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/HardResetToRevisionAction.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/HardResetToRevisionAction.java\nnew file mode 100644\nindex 0000000..78fd87f\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/HardResetToRevisionAction.java\n@@ -0,0 +1,26 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.actions;\n+\n+import java.util.List;\n+\n+import org.eclipse.core.resources.IWorkspaceRunnable;\n+import org.eclipse.jface.action.IAction;\n+import org.spearce.egit.core.op.ResetOperation;\n+\n+/**\n+ * Hard reset to selected revision\n+ */\n+public class HardResetToRevisionAction extends AbstractRevObjectAction {\n+\n+\t@Override\n+\tprotected IWorkspaceRunnable createOperation(IAction act, List selection) {\n+\t\treturn new ResetOperation(getActiveRepository(), selection.get(0)\n+\t\t\t\t.toString(), ResetOperation.ResetType.HARD);\n+\t}\n+}\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/MixedResetToRevisionAction.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/MixedResetToRevisionAction.java\nnew file mode 100644\nindex 0000000..6e4a9bf\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/MixedResetToRevisionAction.java\n@@ -0,0 +1,26 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.actions;\n+\n+import java.util.List;\n+\n+import org.eclipse.core.resources.IWorkspaceRunnable;\n+import org.eclipse.jface.action.IAction;\n+import org.spearce.egit.core.op.ResetOperation;\n+\n+/**\n+ * Mixed reset to selected revision\n+ */\n+public class MixedResetToRevisionAction extends AbstractRevObjectAction {\n+\n+\t@Override\n+\tprotected IWorkspaceRunnable createOperation(IAction act, List selection) {\n+\t\treturn new ResetOperation(getActiveRepository(), selection.get(0)\n+\t\t\t\t.toString(), ResetOperation.ResetType.MIXED);\n+\t}\n+}\ndiff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SoftResetToRevisionAction.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SoftResetToRevisionAction.java\nnew file mode 100644\nindex 0000000..7abbc92\n--- /dev/null\n+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/SoftResetToRevisionAction.java\n@@ -0,0 +1,26 @@\n+/*******************************************************************************\n+ * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>\n+ *\n+ * All rights reserved. This program and the accompanying materials\n+ * are made available under the terms of the Eclipse Public License v1.0\n+ * See LICENSE for the full license text, also available.\n+ *******************************************************************************/\n+package org.spearce.egit.ui.internal.actions;\n+\n+import java.util.List;\n+\n+import org.eclipse.core.resources.IWorkspaceRunnable;\n+import org.eclipse.jface.action.IAction;\n+import org.spearce.egit.core.op.ResetOperation;\n+\n+/**\n+ * Soft reset to selected revision\n+ */\n+public class SoftResetToRevisionAction extends AbstractRevObjectAction {\n+\n+\t@Override\n+\tprotected IWorkspaceRunnable createOperation(IAction act, List selection) {\n+\t\treturn new ResetOperation(getActiveRepository(), selection.get(0)\n+\t\t\t\t.toString(), ResetOperation.ResetType.SOFT);\n+\t}\n+}\n-- \n1.5.6.2.220.g44701\n"},{"id":"82914","messageId":"20080711034717.GA32633@spearce.org","threadId":"14399","inReplyTo":"1215729573-26536-3-git-send-email-robin.rosenberg@dewire.com","subject":"Re: [EGIT PATCH 2/6] Using the page site selection turned out to be cumbersome.","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-11T03:47:17Z","receivedAt":"2008-07-11T03:47:17Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Robin Rosenberg <robin.rosenberg@dewire.com> wrote:\n> +         <action\n> +               class=\"org.spearce.egit.ui.internal.actions.BranchAction\"\n> +               id=\"org.spearce.egit.ui.action1\"\n> +               label=\"Kolla\"\n\nWhat does this label mean?\n\n> +         <action\n> +               class=\"org.spearce.egit.ui.internal.actions.ResetAction\"\n> +               id=\"org.spearce.egit.ui.action1\"\n> +               label=\"Titta\"\n\nDitto.  You can use i18n translations in plugin.xml by putting these\ninto a properties file and using %propertyname inside the XML.\nSo we can prepare translations, but given that all of our source\nis documented in English I would prefer the property names to be\nthe English name if we are going to start supporting translations.\n\n-- \nShawn.\n"},{"id":"82915","messageId":"20080711035249.GA32652@spearce.org","threadId":"14399","inReplyTo":"20080711034717.GA32633@spearce.org","subject":"Re: [EGIT PATCH 2/6] Using the page site selection turned out to be cumbersome.","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-11T03:52:49Z","receivedAt":"2008-07-11T03:52:49Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"\"Shawn O. Pearce\" <spearce@spearce.org> wrote:\n> Robin Rosenberg <robin.rosenberg@dewire.com> wrote:\n> > +         <action\n> > +               class=\"org.spearce.egit.ui.internal.actions.BranchAction\"\n> > +               id=\"org.spearce.egit.ui.action1\"\n> > +               label=\"Kolla\"\n> \n> What does this label mean?\n> \n> > +         <action\n> > +               class=\"org.spearce.egit.ui.internal.actions.ResetAction\"\n> > +               id=\"org.spearce.egit.ui.action1\"\n> > +               label=\"Titta\"\n> \n> Ditto.  You can use i18n translations in plugin.xml by putting these\n> into a properties file and using %propertyname inside the XML.\n> So we can prepare translations, but given that all of our source\n> is documented in English I would prefer the property names to be\n> the English name if we are going to start supporting translations.\n\nNever mind, I see you fixed this in 6/6.  Don't bother reworking\nthe series of this minor issue.\n\n-- \nShawn.\n"},{"id":"82944","messageId":"alpine.DEB.1.00.0807111313070.3640@eeepc-johanness","threadId":"14399","inReplyTo":"20080711035249.GA32652@spearce.org","subject":"Re: [EGIT PATCH 2/6] Using the page site selection turned out to be cumbersome.","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-07-11T11:14:13Z","receivedAt":"2008-07-11T11:14:13Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 11 Jul 2008, Shawn O. Pearce wrote:\n\n> \"Shawn O. Pearce\" <spearce@spearce.org> wrote:\n> > Robin Rosenberg <robin.rosenberg@dewire.com> wrote:\n> > \n> > > +         <action\n> > > +               class=\"org.spearce.egit.ui.internal.actions.ResetAction\"\n> > > +               id=\"org.spearce.egit.ui.action1\"\n> > > +               label=\"Titta\"\n\nJust in case somebody thought Robin tried to slip in a perverse word: not \nso.  In Swedish, \"Titta\" means \"look!\".\n\nCiao,\nDscho\n"}]}