Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Sawicki2011-07-12 23:12:11 +0000
committerStefan Lay2011-07-13 15:28:00 +0000
commit1c9a7bfe3c4e9a0ef109e21f3e84466ab0841301 (patch)
tree7b7d4e8901853e378d529f03817d8b0939bfc1b5 /org.eclipse.egit.ui/src/org
parentb556604880a8b10d1f7d14d0a95e030a23101a9e (diff)
downloadegit-1c9a7bfe3c4e9a0ef109e21f3e84466ab0841301.tar.gz
egit-1c9a7bfe3c4e9a0ef109e21f3e84466ab0841301.tar.xz
egit-1c9a7bfe3c4e9a0ef109e21f3e84466ab0841301.zip
Add more information to push results dialog.
Commits will be shown for each ref updated as well as the files that were modified in the commit. This brings the push result table up to date with the additional information that has been added to the fetch/pull results table. Change-Id: I0027e93bfa2a68dd74314708e5392f20a0454cd2 Signed-off-by: Kevin Sawicki <kevin@github.com>
Diffstat (limited to 'org.eclipse.egit.ui/src/org')
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIIcons.java4
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java12
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/WorkbenchStyledLabelProvider.java52
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchResultTable.java29
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushResultTable.java517
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/RefUpdateContentProvider.java49
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/RefUpdateElement.java241
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties4
8 files changed, 510 insertions, 398 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIIcons.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIIcons.java
index 09b76928e6..958be38978 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIIcons.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIIcons.java
@@ -45,6 +45,9 @@ public class UIIcons {
/** Decoration for lightweight tags **/
public final static ImageDescriptor OVR_LIGHTTAG;
+ /** Decoration for warning **/
+ public final static ImageDescriptor OVR_ERROR;
+
/** Find icon */
public final static ImageDescriptor ELCL16_FIND;
/** Compare / View icon */
@@ -263,6 +266,7 @@ public class UIIcons {
ANNOTATE = map("etool16/annotate.gif"); //$NON-NLS-1$
COMMIT = map("obj16/commit.gif"); //$NON-NLS-1$
REBASE = map("obj16/rebase.gif"); //$NON-NLS-1$
+ OVR_ERROR = map("ovr/error.png"); //$NON-NLS-1$
}
private static ImageDescriptor map(final String icon) {
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java
index a0425d955d..f17871d0b1 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java
@@ -2074,6 +2074,9 @@ public class UIText extends NLS {
public static String PushResultTable_columnMode;
/** */
+ public static String PushResultTable_MesasgeText;
+
+ /** */
public static String PushResultTable_statusUnexpected;
/** */
@@ -3323,6 +3326,15 @@ public class UIText extends NLS {
public static String RefreshPreferencesPage_RefreshWhenIndexChange;
/** */
+ public static String RefUpdateElement_CommitCountDecoration;
+
+ /** */
+ public static String RefUpdateElement_CommitRangeDecoration;
+
+ /** */
+ public static String RefUpdateElement_UrisDecoration;
+
+ /** */
public static String RemoteSelectionCombo_destinationName;
/** */
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/WorkbenchStyledLabelProvider.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/WorkbenchStyledLabelProvider.java
new file mode 100644
index 0000000000..6d40728a8a
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/WorkbenchStyledLabelProvider.java
@@ -0,0 +1,52 @@
+/******************************************************************************
+ * Copyright (c) 2011 GitHub Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Kevin Sawicki (GitHub Inc.) - initial API and implementation
+ *****************************************************************************/
+package org.eclipse.egit.ui.internal;
+
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+/**
+ * Styled label provider that wraps a {@link WorkbenchLabelProvider}
+ */
+public class WorkbenchStyledLabelProvider implements IStyledLabelProvider {
+
+ /**
+ * Workbench label provider
+ */
+ protected final WorkbenchLabelProvider workbenchLabelProvider = new WorkbenchLabelProvider();
+
+ public void removeListener(ILabelProviderListener listener) {
+ // Empty
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void dispose() {
+ workbenchLabelProvider.dispose();
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ // Empty
+ }
+
+ public StyledString getStyledText(Object element) {
+ return new StyledString(workbenchLabelProvider.getText(element));
+ }
+
+ public Image getImage(Object element) {
+ return workbenchLabelProvider.getImage(element);
+ }
+}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchResultTable.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchResultTable.java
index eea5356ddb..4bf4c9a411 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchResultTable.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/fetch/FetchResultTable.java
@@ -11,6 +11,7 @@ import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.UIIcons;
import org.eclipse.egit.ui.UIText;
import org.eclipse.egit.ui.UIUtils;
+import org.eclipse.egit.ui.internal.WorkbenchStyledLabelProvider;
import org.eclipse.egit.ui.internal.commit.CommitEditor;
import org.eclipse.egit.ui.internal.commit.RepositoryCommit;
import org.eclipse.jface.layout.GridDataFactory;
@@ -19,7 +20,6 @@ import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
@@ -51,7 +51,6 @@ import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.model.WorkbenchAdapter;
import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
/**
* Component displaying table with results of fetch operation.
@@ -218,25 +217,7 @@ class FetchResultTable {
addToolbar(treePanel);
- final IStyledLabelProvider styleProvider = new IStyledLabelProvider() {
-
- private final WorkbenchLabelProvider wrapped = new WorkbenchLabelProvider();
-
- public void removeListener(ILabelProviderListener listener) {
- // Empty
- }
-
- public boolean isLabelProperty(Object element, String property) {
- return false;
- }
-
- public void dispose() {
- wrapped.dispose();
- }
-
- public void addListener(ILabelProviderListener listener) {
- // Empty
- }
+ final IStyledLabelProvider styleProvider = new WorkbenchStyledLabelProvider() {
public StyledString getStyledText(Object element) {
// TODO Replace with use of IWorkbenchAdapter3 when is no longer
@@ -247,11 +228,7 @@ class FetchResultTable {
if (element instanceof RepositoryCommit)
return ((RepositoryCommit) element).getStyledText(element);
- return new StyledString(wrapped.getText(element));
- }
-
- public Image getImage(Object element) {
- return wrapped.getImage(element);
+ return super.getStyledText(element);
}
};
treeViewer.setLabelProvider(new DelegatingStyledCellLabelProvider(
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushResultTable.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushResultTable.java
index 267b43212b..65f652c3e5 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushResultTable.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushResultTable.java
@@ -8,111 +8,94 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.push;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
+import java.util.ArrayList;
+import java.util.List;
import org.eclipse.egit.core.op.PushOperationResult;
import org.eclipse.egit.ui.UIIcons;
import org.eclipse.egit.ui.UIText;
-import org.eclipse.egit.ui.internal.components.CenteredImageLabelProvider;
-import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.egit.ui.UIUtils;
+import org.eclipse.egit.ui.internal.WorkbenchStyledLabelProvider;
+import org.eclipse.egit.ui.internal.commit.RepositoryCommit;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
-import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.IElementComparer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jgit.lib.Constants;
-import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.RemoteRefUpdate;
import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
import org.eclipse.jgit.transport.URIish;
-import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Tree;
/**
* Table displaying push operation results.
*/
class PushResultTable {
- private static final int TABLE_PREFERRED_WIDTH = 650;
-
- private static final int TABLE_PREFERRED_HEIGHT = 300;
-
private static final int TEXT_PREFERRED_HEIGHT = 100;
- private static final int COLUMN_STATUS_WEIGHT = 40;
-
- private static final int COLUMN_DST_WEIGHT = 40;
-
- private static final int COLUMN_SRC_WEIGHT = 40;
-
- private static final int COLUMN_MODE_WEIGHT = 15;
-
- private static final String IMAGE_DELETE = "MODE_DELETE"; //$NON-NLS-1$
-
- private static final String IMAGE_ADD = "MODE_ADD"; //$NON-NLS-1$
-
private static final String EMPTY_STRING = ""; //$NON-NLS-1$
private static final String SPACE = " "; //$NON-NLS-1$
- private final TableViewer tableViewer;
+ private final TreeViewer treeViewer;
- private final Composite tablePanel;
+ private final Composite root;
- private final ImageRegistry imageRegistry;
+ private final Image deleteImage;
private ObjectReader reader;
- private Map<ObjectId, String> abbrevations;
+ private Repository repo;
PushResultTable(final Composite parent) {
- tablePanel = new Composite(parent, SWT.NONE);
- tablePanel.setLayout(new GridLayout());
- final GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
- layoutData.heightHint = TABLE_PREFERRED_HEIGHT;
- layoutData.widthHint = TABLE_PREFERRED_WIDTH;
- tableViewer = new TableViewer(tablePanel);
- ColumnViewerToolTipSupport.enableFor(tableViewer);
- final Table table = tableViewer.getTable();
+ root = new Composite(parent, SWT.NONE);
+ GridLayoutFactory.swtDefaults().numColumns(2).applyTo(root);
+
+ treeViewer = new TreeViewer(root);
+ treeViewer.setAutoExpandLevel(2);
+
+ addToolbar(root);
+
+ ColumnViewerToolTipSupport.enableFor(treeViewer);
+ final Tree table = treeViewer.getTree();
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(table);
table.setLinesVisible(true);
- table.setHeaderVisible(true);
- imageRegistry = new ImageRegistry(table.getDisplay());
- imageRegistry.put(IMAGE_ADD, UIIcons.ELCL16_ADD);
- imageRegistry.put(IMAGE_DELETE, UIIcons.ELCL16_DELETE);
+ deleteImage = UIIcons.ELCL16_DELETE.createImage();
+ UIUtils.hookDisposal(root, deleteImage);
- tablePanel.addDisposeListener(new DisposeListener() {
+ root.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (reader != null)
reader.release();
- imageRegistry.dispose();
}
});
- tableViewer.setComparer(new IElementComparer() {
+ treeViewer.setComparer(new IElementComparer() {
// we need this to keep refresh() working while having custom
// equals() in PushOperationResult
public boolean equals(Object a, Object b) {
@@ -123,299 +106,201 @@ class PushResultTable {
return element.hashCode();
}
});
- tableViewer.setContentProvider(new RefUpdateContentProvider());
- tableViewer.setInput(null);
+ final IStyledLabelProvider styleProvider = new WorkbenchStyledLabelProvider() {
+
+ public StyledString getStyledText(Object element) {
+ // TODO Replace with use of IWorkbenchAdapter3 when 3.6 is no
+ // longer supported
+ if (element instanceof RefUpdateElement)
+ return ((RefUpdateElement) element).getStyledText(element);
+ if (element instanceof RepositoryCommit)
+ return ((RepositoryCommit) element).getStyledText(element);
+
+ return super.getStyledText(element);
+ }
+
+ };
+
+ treeViewer.setSorter(new ViewerSorter() {
+
+ public int compare(Viewer viewer, Object e1, Object e2) {
+
+ if (e1 instanceof RefUpdateElement
+ && e2 instanceof RefUpdateElement) {
+ RefUpdateElement r1 = (RefUpdateElement) e1;
+ RefUpdateElement r2 = (RefUpdateElement) e2;
+
+ // Put rejected refs first
+ if (r1.isRejected() && !r2.isRejected())
+ return -1;
+ if (!r1.isRejected() && r2.isRejected())
+ return 1;
+
+ // Put new refs next
+ if (r1.isAdd() && !r2.isAdd())
+ return -1;
+ if (!r1.isAdd() && r2.isAdd())
+ return 1;
+
+ // Put branches before tags
+ if (!r1.isTag() && r2.isTag())
+ return -1;
+ if (r1.isTag() && !r2.isTag())
+ return 1;
+
+ Status s1 = r1.getStatus();
+ Status s2 = r2.getStatus();
+ // Put up to date refs last
+ if (s1 != Status.UP_TO_DATE && s2 == Status.UP_TO_DATE)
+ return -1;
+ if (s1 == Status.UP_TO_DATE && s2 != Status.UP_TO_DATE)
+ return 1;
+
+ String ref1 = r1.getDstRefName();
+ String ref2 = r2.getDstRefName();
+ if (ref1 != null && ref2 != null)
+ return ref1.compareToIgnoreCase(ref2);
+ }
+
+ // Don't alter commit ordering
+ if (e1 instanceof RepositoryCommit
+ && e2 instanceof RepositoryCommit)
+ return 0;
+
+ return super.compare(viewer, e1, e2);
+ }
+
+ });
+ treeViewer.setLabelProvider(new DelegatingStyledCellLabelProvider(
+ styleProvider));
+ treeViewer.setContentProvider(new RefUpdateContentProvider());
// detail message
- final Text text = new Text(parent, SWT.MULTI | SWT.READ_ONLY
+ Group messageGroup = new Group(root, SWT.NONE);
+ messageGroup.setText(UIText.PushResultTable_MesasgeText);
+ GridLayoutFactory.swtDefaults().applyTo(messageGroup);
+ GridDataFactory.fillDefaults().grab(true, false).span(2, 1)
+ .applyTo(messageGroup);
+
+ final Text text = new Text(messageGroup, SWT.MULTI | SWT.READ_ONLY
| SWT.BORDER);
- GridData textLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
- textLayoutData.heightHint = TEXT_PREFERRED_HEIGHT;
- text.setLayoutData(textLayoutData);
- tableViewer
- .addSelectionChangedListener(new ISelectionChangedListener() {
- public void selectionChanged(SelectionChangedEvent event) {
- ISelection selection = event.getSelection();
- if (!(selection instanceof IStructuredSelection)) {
- text.setText(EMPTY_STRING);
- return;
- }
- IStructuredSelection structuredSelection = (IStructuredSelection) selection;
- if (structuredSelection.size() != 1) {
- text.setText(EMPTY_STRING);
- return;
- }
- RefUpdateElement element = (RefUpdateElement) structuredSelection
- .getFirstElement();
- text.setText(getResult(element));
- }
- });
+ GridDataFactory.fillDefaults().grab(true, true)
+ .hint(SWT.DEFAULT, TEXT_PREFERRED_HEIGHT).applyTo(text);
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ ISelection selection = event.getSelection();
+ if (!(selection instanceof IStructuredSelection)) {
+ text.setText(EMPTY_STRING);
+ return;
+ }
+ IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+ if (structuredSelection.size() != 1) {
+ text.setText(EMPTY_STRING);
+ return;
+ }
+ Object selected = structuredSelection.getFirstElement();
+ if (selected instanceof RefUpdateElement)
+ text.setText(getResult((RefUpdateElement) selected));
+ }
+ });
+ }
+
+ private void addToolbar(Composite parent) {
+ ToolBar toolbar = new ToolBar(parent, SWT.VERTICAL);
+ GridDataFactory.fillDefaults().grab(false, true).applyTo(toolbar);
+
+ ToolItem collapseItem = new ToolItem(toolbar, SWT.PUSH);
+ Image collapseImage = UIIcons.COLLAPSEALL.createImage();
+ UIUtils.hookDisposal(collapseItem, collapseImage);
+ collapseItem.setImage(collapseImage);
+ collapseItem.setToolTipText(UIText.FetchResultTable_collapseAll);
+ collapseItem.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ treeViewer.collapseAll();
+ }
+
+ });
+
+ ToolItem expandItem = new ToolItem(toolbar, SWT.PUSH);
+ Image expandImage = UIIcons.EXPAND_ALL.createImage();
+ UIUtils.hookDisposal(expandItem, expandImage);
+ expandItem.setImage(expandImage);
+ expandItem.setToolTipText(UIText.FetchResultTable_expandAll);
+ expandItem.addSelectionListener(new SelectionAdapter() {
+
+ public void widgetSelected(SelectionEvent e) {
+ treeViewer.expandAll();
+ }
+
+ });
}
private String getResult(RefUpdateElement element) {
StringBuilder result = new StringBuilder(EMPTY_STRING);
PushOperationResult pushOperationResult = element
.getPushOperationResult();
- Set<URIish> urIs = pushOperationResult.getURIs();
- Iterator<URIish> iterator = urIs.iterator();
- while(iterator.hasNext()) {
- boolean lineBreakNeeded = false;
- URIish uri = iterator.next();
- result.append(UIText.PushResultTable_repository);
- result.append(SPACE);
- result.append(uri.toString());
- result.append(Text.DELIMITER);
- result.append(Text.DELIMITER);
- String message = element.getRemoteRefUpdate(uri).getMessage();
- if (message != null) {
- result.append(message);
- result.append(Text.DELIMITER);
- lineBreakNeeded = true;
- }
- StringBuilder messagesBuffer = new StringBuilder(pushOperationResult
- .getPushResult(uri).getMessages());
- trim(messagesBuffer);
- if (messagesBuffer.length()>0) {
- result.append(messagesBuffer);
- result.append(Text.DELIMITER);
- lineBreakNeeded = true;
- }
- if (iterator.hasNext() && lineBreakNeeded)
- result.append(Text.DELIMITER);
- }
+ final URIish uri = element.getUri();
+ result.append(UIText.PushResultTable_repository);
+ result.append(SPACE);
+ result.append(uri.toString());
+ result.append(Text.DELIMITER);
+ result.append(Text.DELIMITER);
+ String message = element.getRemoteRefUpdate().getMessage();
+ if (message != null)
+ result.append(message).append(Text.DELIMITER);
+ StringBuilder messagesBuffer = new StringBuilder(pushOperationResult
+ .getPushResult(uri).getMessages());
+ trim(messagesBuffer);
+ if (messagesBuffer.length() > 0)
+ result.append(messagesBuffer).append(Text.DELIMITER);
trim(result);
return result.toString();
}
private static void trim(StringBuilder s) {
// remove leading line breaks
- while (s.length()>0 && (s.charAt(0)=='\n' || s.charAt(0)=='\r'))
+ while (s.length() > 0 && (s.charAt(0) == '\n' || s.charAt(0) == '\r'))
s.deleteCharAt(0);
// remove trailing line breaks
- while (s.length()>0 && (s.charAt(s.length()-1)=='\n' || s.charAt(s.length()-1)=='\r'))
- s.deleteCharAt(s.length()-1);
+ while (s.length() > 0
+ && (s.charAt(s.length() - 1) == '\n' || s
+ .charAt(s.length() - 1) == '\r'))
+ s.deleteCharAt(s.length() - 1);
}
void setData(final Repository localDb, final PushOperationResult result) {
reader = localDb.newObjectReader();
- abbrevations = new HashMap<ObjectId,String>();
+ repo = localDb;
- // We have to recreate columns.
- for (final TableColumn tc : tableViewer.getTable().getColumns())
- tc.dispose();
// Set empty result for a while.
- tableViewer.setInput(null);
-
- // Layout should be recreated to work properly.
- final TableColumnLayout layout = new TableColumnLayout();
- tablePanel.setLayout(layout);
-
- final TableViewerColumn modeViewer = createColumn(layout,
- UIText.PushResultTable_columnMode, COLUMN_MODE_WEIGHT,
- SWT.CENTER);
- modeViewer.setLabelProvider(new CenteredImageLabelProvider() {
- @Override
- public Image getImage(Object element) {
- if (((RefUpdateElement) element).isDelete())
- return imageRegistry.get(IMAGE_DELETE);
- return imageRegistry.get(IMAGE_ADD);
- }
-
- @Override
- public String getToolTipText(Object element) {
- if (((RefUpdateElement) element).isDelete())
- return UIText.RefSpecPanel_modeDeleteDescription;
- return UIText.RefSpecPanel_modeUpdateDescription;
- }
- });
-
- final TableViewerColumn srcViewer = createColumn(layout,
- UIText.PushResultTable_columnSrc, COLUMN_SRC_WEIGHT, SWT.LEFT);
- srcViewer.setLabelProvider(new ColumnLabelProvider() {
- @Override
- public String getText(Object element) {
- return ((RefUpdateElement) element).getSrcRefName();
- }
- });
-
- final TableViewerColumn dstViewer = createColumn(layout,
- UIText.PushResultTable_columnDst, COLUMN_DST_WEIGHT, SWT.LEFT);
- dstViewer.setLabelProvider(new ColumnLabelProvider() {
- @Override
- public String getText(Object element) {
- return ((RefUpdateElement) element).getDstRefName();
- }
- });
+ treeViewer.setInput(null);
if (result == null) {
- tablePanel.layout();
+ root.layout();
return;
}
- int i = 0;
- for (final URIish uri : result.getURIs()) {
- final TableViewerColumn statusViewer = createColumn(layout, NLS
- .bind(UIText.PushResultTable_columnStatusRepo, Integer
- .toString(++i)), COLUMN_STATUS_WEIGHT, SWT.LEFT);
- statusViewer.getColumn().setToolTipText(uri.toString());
- statusViewer.setLabelProvider(new UpdateStatusLabelProvider(uri));
- }
- tableViewer.setInput(result);
+ final List<RefUpdateElement> results = new ArrayList<RefUpdateElement>();
+
+ for (URIish uri : result.getURIs())
+ if (result.isSuccessfulConnection(uri))
+ for (RemoteRefUpdate update : result.getPushResult(uri)
+ .getRemoteUpdates())
+ results.add(new RefUpdateElement(result, update, uri,
+ reader, repo));
+
+ treeViewer.setInput(results.toArray());
// select the first row of table to get the details of the first
// push result shown in the Text control
- Table table = tableViewer.getTable();
- if (table.getItemCount()>0) {
- tableViewer.setSelection(new StructuredSelection(table.getItem(0).getData()));
- }
- tablePanel.layout();
+ Tree table = treeViewer.getTree();
+ if (table.getItemCount() > 0)
+ treeViewer.setSelection(new StructuredSelection(table.getItem(0)
+ .getData()));
+ root.layout();
}
Control getControl() {
- return tablePanel;
- }
-
- private TableViewerColumn createColumn(
- final TableColumnLayout columnLayout, final String text,
- final int weight, final int style) {
- final TableViewerColumn viewerColumn = new TableViewerColumn(
- tableViewer, style);
- final TableColumn column = viewerColumn.getColumn();
- column.setText(text);
- columnLayout.setColumnData(column, new ColumnWeightData(weight));
- return viewerColumn;
+ return root;
}
- private class UpdateStatusLabelProvider extends ColumnLabelProvider {
- private final URIish uri;
-
- UpdateStatusLabelProvider(final URIish uri) {
- this.uri = uri;
- }
-
- @Override
- public String getText(Object element) {
- final RefUpdateElement rue = (RefUpdateElement) element;
- if (!rue.isSuccessfulConnection(uri))
- return UIText.PushResultTable_statusConnectionFailed;
-
- final RemoteRefUpdate rru = rue.getRemoteRefUpdate(uri);
- switch (rru.getStatus()) {
- case OK:
- if (rru.isDelete())
- return UIText.PushResultTable_statusOkDeleted;
-
- final Ref oldRef = rue.getAdvertisedRemoteRef(uri);
- if (oldRef == null) {
- if (rue.getDstRefName().startsWith(Constants.R_TAGS))
- return UIText.PushResultTable_statusOkNewTag;
- return UIText.PushResultTable_statusOkNewBranch;
- }
-
- return safeAbbreviate(oldRef.getObjectId())
- + (rru.isFastForward() ? ".." : "...") //$NON-NLS-1$ //$NON-NLS-2$
- + safeAbbreviate(rru.getNewObjectId());
- case UP_TO_DATE:
- return UIText.PushResultTable_statusUpToDate;
- case NON_EXISTING:
- return UIText.PushResultTable_statusNoMatch;
- case REJECTED_NODELETE:
- case REJECTED_NONFASTFORWARD:
- case REJECTED_REMOTE_CHANGED:
- return UIText.PushResultTable_statusRejected;
- case REJECTED_OTHER_REASON:
- return UIText.PushResultTable_statusRemoteRejected;
- default:
- throw new IllegalArgumentException(NLS.bind(
- UIText.PushResultTable_statusUnexpected, rru
- .getStatus()));
- }
- }
-
- private String safeAbbreviate(ObjectId id) {
- String abbrev = abbrevations.get(id);
- if (abbrev == null) {
- try {
- abbrev = reader.abbreviate(id).name();
- } catch (IOException cannotAbbreviate) {
- abbrev = id.name();
- }
- abbrevations.put(id, abbrev);
- }
- return abbrev;
- }
-
- @Override
- public Image getImage(Object element) {
- final RefUpdateElement rue = (RefUpdateElement) element;
- if (!rue.isSuccessfulConnection(uri))
- return imageRegistry.get(IMAGE_DELETE);
- final Status status = rue.getRemoteRefUpdate(uri).getStatus();
- switch (status) {
- case OK:
- return null; // no icon for ok
- case UP_TO_DATE:
- case NON_EXISTING:
- return null; // no icon for up to date
- case REJECTED_NODELETE:
- case REJECTED_NONFASTFORWARD:
- case REJECTED_REMOTE_CHANGED:
- case REJECTED_OTHER_REASON:
- return imageRegistry.get(IMAGE_DELETE);
- default:
- throw new IllegalArgumentException(NLS.bind(
- UIText.PushResultTable_statusUnexpected, status));
- }
- }
-
- @Override
- public String getToolTipText(Object element) {
- final RefUpdateElement rue = (RefUpdateElement) element;
- if (!rue.isSuccessfulConnection(uri))
- return rue.getErrorMessage(uri);
-
- final RemoteRefUpdate rru = rue.getRemoteRefUpdate(uri);
- final Ref oldRef = rue.getAdvertisedRemoteRef(uri);
- switch (rru.getStatus()) {
- case OK:
- if (rru.isDelete())
- return NLS.bind(UIText.PushResultTable_statusDetailDeleted,
- safeAbbreviate(oldRef.getObjectId()));
- if (oldRef == null)
- return null;
- if (rru.isFastForward())
- return UIText.PushResultTable_statusDetailFastForward;
- return UIText.PushResultTable_statusDetailForcedUpdate;
- case UP_TO_DATE:
- return null;
- case NON_EXISTING:
- return UIText.PushResultTable_statusDetailNonExisting;
- case REJECTED_NODELETE:
- return UIText.PushResultTable_statusDetailNoDelete;
- case REJECTED_NONFASTFORWARD:
- return UIText.PushResultTable_statusDetailNonFastForward;
- case REJECTED_REMOTE_CHANGED:
- final Ref remoteRef = oldRef;
- final String curVal;
- if (remoteRef == null)
- curVal = UIText.PushResultTable_refNonExisting;
- else
- curVal = safeAbbreviate(remoteRef.getObjectId());
-
- final ObjectId expectedOldObjectId = rru
- .getExpectedOldObjectId();
- final String expVal;
- if (expectedOldObjectId.equals(ObjectId.zeroId()))
- expVal = UIText.PushResultTable_refNonExisting;
- else
- expVal = safeAbbreviate(expectedOldObjectId);
- return NLS.bind(UIText.PushResultTable_statusDetailChanged,
- curVal, expVal);
- case REJECTED_OTHER_REASON:
- return rru.getMessage();
- default:
- throw new IllegalArgumentException(NLS.bind(
- UIText.PushResultTable_statusUnexpected, rru
- .getStatus()));
- }
- }
- }
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/RefUpdateContentProvider.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/RefUpdateContentProvider.java
index db9cd1f981..0ed06b44df 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/RefUpdateContentProvider.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/RefUpdateContentProvider.java
@@ -8,15 +8,10 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.push;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.Map.Entry;
-
import org.eclipse.egit.core.op.PushOperationResult;
+import org.eclipse.egit.ui.internal.commit.RepositoryCommit;
import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.eclipse.jgit.transport.URIish;
+import org.eclipse.ui.model.WorkbenchContentProvider;
/**
* Content provided for push result table viewer.
@@ -28,40 +23,16 @@ import org.eclipse.jgit.transport.URIish;
* @see PushOperationResult
* @see RefUpdateElement
*/
-class RefUpdateContentProvider implements IStructuredContentProvider {
- public Object[] getElements(final Object inputElement) {
- if (inputElement == null)
- return new RefUpdateElement[0];
-
- final PushOperationResult result = (PushOperationResult) inputElement;
-
- final SortedMap<String, String> dstToSrc = new TreeMap<String, String>();
- for (final URIish uri : result.getURIs()) {
- if (result.isSuccessfulConnection(uri)) {
- for (final RemoteRefUpdate rru : result.getPushResult(uri)
- .getRemoteUpdates())
- dstToSrc.put(rru.getRemoteName(), rru.getSrcRef());
- // Assuming that each repository received the same ref updates,
- // we need only one to get these ref names.
- break;
- }
- }
-
- // Transforming PushOperationResult model to row-wise one.
- final RefUpdateElement elements[] = new RefUpdateElement[dstToSrc
- .size()];
- int i = 0;
- for (final Entry<String, String> entry : dstToSrc.entrySet())
- elements[i++] = new RefUpdateElement(result, entry.getValue(),
- entry.getKey());
- return elements;
- }
+class RefUpdateContentProvider extends WorkbenchContentProvider implements
+ IStructuredContentProvider {
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- // nothing to do
+ public Object[] getElements(final Object element) {
+ return element instanceof Object[] ? (Object[]) element : new Object[0];
}
- public void dispose() {
- // nothing to dispose
+ public Object[] getChildren(Object element) {
+ if (element instanceof RepositoryCommit)
+ return ((RepositoryCommit) element).getDiffs();
+ return super.getChildren(element);
}
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/RefUpdateElement.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/RefUpdateElement.java
index c20d860b67..5ace2d7335 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/RefUpdateElement.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/RefUpdateElement.java
@@ -8,10 +8,30 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal.push;
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
import org.eclipse.egit.core.op.PushOperationResult;
+import org.eclipse.egit.ui.Activator;
+import org.eclipse.egit.ui.UIIcons;
+import org.eclipse.egit.ui.UIText;
+import org.eclipse.egit.ui.internal.DecorationOverlayDescriptor;
+import org.eclipse.egit.ui.internal.commit.RepositoryCommit;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.eclipse.jgit.transport.RemoteRefUpdate.Status;
import org.eclipse.jgit.transport.URIish;
+import org.eclipse.ui.model.WorkbenchAdapter;
/**
* Data class representing row (element) of table with push results.
@@ -22,51 +42,238 @@ import org.eclipse.jgit.transport.URIish;
* @see PushOperationResult
* @see RefUpdateContentProvider
*/
-class RefUpdateElement {
- private final String srcRefName;
-
- private final String dstRefName;
+class RefUpdateElement extends WorkbenchAdapter {
+ private final RemoteRefUpdate update;
private final PushOperationResult result;
- RefUpdateElement(final PushOperationResult result, final String srcRef,
- final String dstRef) {
+ private final URIish uri;
+
+ private final ObjectReader reader;
+
+ private final Repository repo;
+
+ private Object[] children;
+
+ private final boolean tag;
+
+ RefUpdateElement(final PushOperationResult result, RemoteRefUpdate update,
+ URIish uri, ObjectReader reader, Repository repo) {
this.result = result;
- this.srcRefName = srcRef;
- this.dstRefName = dstRef;
+ this.update = update;
+ this.uri = uri;
+ this.reader = reader;
+ this.repo = repo;
+ String remote = update.getRemoteName();
+ tag = remote != null && remote.startsWith(Constants.R_TAGS);
+ }
+
+ URIish getUri() {
+ return uri;
}
String getSrcRefName() {
- return srcRefName;
+ return update.getSrcRef();
}
String getDstRefName() {
- return dstRefName;
+ return update.getRemoteName();
}
boolean isDelete() {
// Assuming that we never use ObjectId.zeroId() in GUI.
// (no need to compare to it).
- return srcRefName == null;
+ return getSrcRefName() == null;
+ }
+
+ boolean isAdd() {
+ return getAdvertisedRemoteRef() == null;
+ }
+
+ boolean isRejected() {
+ switch (getStatus()) {
+ case REJECTED_NODELETE:
+ case REJECTED_NONFASTFORWARD:
+ case REJECTED_OTHER_REASON:
+ case REJECTED_REMOTE_CHANGED:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ boolean isTag() {
+ return tag;
}
PushOperationResult getPushOperationResult() {
return result;
}
- boolean isSuccessfulConnection(final URIish uri) {
+ boolean isSuccessfulConnection() {
return result.isSuccessfulConnection(uri);
}
- String getErrorMessage(final URIish uri) {
+ String getErrorMessage() {
return result.getErrorMessage(uri);
}
- RemoteRefUpdate getRemoteRefUpdate(final URIish uri) {
- return result.getPushResult(uri).getRemoteUpdate(dstRefName);
+ Status getStatus() {
+ return update.getStatus();
+ }
+
+ RemoteRefUpdate getRemoteRefUpdate() {
+ return update;
+ }
+
+ Ref getAdvertisedRemoteRef() {
+ return result.getPushResult(uri).getAdvertisedRef(getDstRefName());
+ }
+
+ public ImageDescriptor getImageDescriptor(Object object) {
+ switch (getStatus()) {
+ case OK:
+ if (isDelete())
+ return tag ? new DecorationOverlayDescriptor(UIIcons.TAG,
+ UIIcons.OVR_STAGED_REMOVE, IDecoration.TOP_RIGHT)
+ : new DecorationOverlayDescriptor(UIIcons.BRANCH,
+ UIIcons.OVR_STAGED_REMOVE,
+ IDecoration.TOP_RIGHT);
+
+ if (isAdd())
+ return tag ? UIIcons.CREATE_TAG : UIIcons.CREATE_BRANCH;
+ else
+ return tag ? UIIcons.TAG : UIIcons.BRANCH;
+ case UP_TO_DATE:
+ return tag ? UIIcons.TAG : UIIcons.BRANCH;
+ case REJECTED_NODELETE:
+ case REJECTED_NONFASTFORWARD:
+ case REJECTED_OTHER_REASON:
+ case REJECTED_REMOTE_CHANGED:
+ return tag ? new DecorationOverlayDescriptor(UIIcons.TAG,
+ UIIcons.OVR_ERROR, IDecoration.TOP_RIGHT)
+ : new DecorationOverlayDescriptor(UIIcons.BRANCH,
+ UIIcons.OVR_ERROR, IDecoration.TOP_RIGHT);
+ default:
+ return super.getImageDescriptor(object);
+ }
+ }
+
+ public String getLabel(Object object) {
+ return getStyledText(object).getString();
}
- Ref getAdvertisedRemoteRef(final URIish uri) {
- return result.getPushResult(uri).getAdvertisedRef(dstRefName);
+ private RepositoryCommit[] getCommits(Ref end) {
+ final RevWalk walk = new RevWalk(reader);
+ try {
+ walk.setRetainBody(true);
+ walk.markStart(walk.parseCommit(update.getNewObjectId()));
+ walk.markUninteresting(walk.parseCommit(end.getObjectId()));
+ List<RepositoryCommit> commits = new ArrayList<RepositoryCommit>();
+ for (RevCommit commit : walk)
+ commits.add(new RepositoryCommit(repo, commit));
+ return commits.toArray(new RepositoryCommit[commits.size()]);
+ } catch (IOException e) {
+ Activator.logError("Error parsing commits from push result", e); //$NON-NLS-1$
+ return new RepositoryCommit[0];
+ }
+ }
+
+ public Object[] getChildren(Object object) {
+ if (children != null)
+ return children;
+
+ switch (update.getStatus()) {
+ case OK:
+ if (!isDelete()) {
+ final Ref ref = getAdvertisedRemoteRef();
+ if (ref != null) {
+ children = getCommits(ref);
+ break;
+ }
+ }
+ //$FALL-THROUGH$
+ default:
+ children = super.getChildren(object);
+ }
+ return children;
+ }
+
+ /**
+ * Get styled text
+ *
+ * @return styled string
+ */
+ public StyledString getStyledText(Object object) {
+ StyledString styled = new StyledString();
+ final String remote = getDstRefName();
+ final String local = getSrcRefName();
+
+ styled.append(Repository.shortenRefName(remote));
+
+ if (!tag) {
+ styled.append(": ", StyledString.QUALIFIER_STYLER); //$NON-NLS-1$
+ styled.append(Repository.shortenRefName(local),
+ StyledString.QUALIFIER_STYLER);
+ }
+ styled.append(' ');
+ // Include uri if more than one
+ if (result.getURIs().size() > 1)
+ styled.append(MessageFormat.format(
+ UIText.RefUpdateElement_UrisDecoration, uri.toString()),
+ StyledString.QUALIFIER_STYLER);
+
+ styled.append(' ');
+ switch (getStatus()) {
+ case OK:
+ if (update.isDelete())
+ styled.append(UIText.PushResultTable_statusOkDeleted,
+ StyledString.DECORATIONS_STYLER);
+ else {
+ final Ref oldRef = getAdvertisedRemoteRef();
+ if (oldRef == null) {
+ if (tag)
+ styled.append(UIText.PushResultTable_statusOkNewTag,
+ StyledString.DECORATIONS_STYLER);
+ else
+ styled.append(UIText.PushResultTable_statusOkNewBranch,
+ StyledString.DECORATIONS_STYLER);
+ } else {
+ String separator = update.isFastForward() ? ".." : "..."; //$NON-NLS-1$ //$NON-NLS-2$
+ styled.append(MessageFormat.format(
+ UIText.RefUpdateElement_CommitRangeDecoration,
+ update.getNewObjectId().abbreviate(7).name(),
+ separator, oldRef.getObjectId().abbreviate(7)
+ .name()), StyledString.DECORATIONS_STYLER);
+ styled.append(' ');
+ styled.append(MessageFormat.format(
+ UIText.RefUpdateElement_CommitCountDecoration,
+ Integer.valueOf(getChildren(this).length)),
+ StyledString.COUNTER_STYLER);
+ }
+ }
+ break;
+ case UP_TO_DATE:
+ styled.append(UIText.PushResultTable_statusUpToDate,
+ StyledString.DECORATIONS_STYLER);
+ break;
+ case NON_EXISTING:
+ styled.append(UIText.PushResultTable_statusNoMatch,
+ StyledString.DECORATIONS_STYLER);
+ break;
+ case REJECTED_NODELETE:
+ case REJECTED_NONFASTFORWARD:
+ case REJECTED_REMOTE_CHANGED:
+ styled.append(UIText.PushResultTable_statusRejected,
+ StyledString.DECORATIONS_STYLER);
+ break;
+ case REJECTED_OTHER_REASON:
+ styled.append(UIText.PushResultTable_statusRemoteRejected,
+ StyledString.DECORATIONS_STYLER);
+ break;
+ default:
+ break;
+ }
+ return styled;
}
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties
index 34785d38fa..ba95873b34 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties
@@ -681,6 +681,7 @@ PushResultTable_columnStatusRepo=Status: Repository #{0}
PushResultTable_columnDst=Destination Ref
PushResultTable_columnSrc=Source Ref
PushResultTable_columnMode=Mode
+PushResultTable_MesasgeText=Message Details
PushResultTable_statusUnexpected=Unexpected update status: {0}
PushResultTable_statusConnectionFailed=[connection failed]
PushResultTable_statusDetailChanged=remote ref object changed,\nnow it's\: {0},\nnot expected\: {1}
@@ -783,6 +784,9 @@ WindowCachePreferencePage_packedGitMMAP=Use virtual memory mapping
RefreshPreferencesPage_RefreshOnlyWhenActive=Refresh only when workbench is &active
RefreshPreferencesPage_RefreshWhenIndexChange=Refresh resources when &index changes
+RefUpdateElement_CommitCountDecoration=({0})
+RefUpdateElement_CommitRangeDecoration=[{0}{1}{2}]
+RefUpdateElement_UrisDecoration=({0})
CommitDialogPreferencePage_title=Commit Dialog
CommitDialogPreferencePage_formatting=Formatting

Back to the top