rename org.spearce.egit -> org.eclipse.egit and bump version to 0.5.0
[egit/imyousuf.git] / org.eclipse.egit.ui / src / org / eclipse / egit / ui / internal / push / PushResultTable.java
blob8d3ddfb1316d9fc8f31ea0037c4d897b483d6dc5
1 /*******************************************************************************
2 * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * See LICENSE for the full license text, also available.
7 *******************************************************************************/
8 package org.eclipse.egit.ui.internal.push;
10 import org.eclipse.egit.core.op.PushOperationResult;
11 import org.eclipse.egit.ui.UIIcons;
12 import org.eclipse.egit.ui.UIText;
13 import org.eclipse.egit.ui.internal.components.CenteredImageLabelProvider;
14 import org.eclipse.jface.layout.TableColumnLayout;
15 import org.eclipse.jface.resource.ColorRegistry;
16 import org.eclipse.jface.resource.ImageRegistry;
17 import org.eclipse.jface.viewers.ColumnLabelProvider;
18 import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
19 import org.eclipse.jface.viewers.ColumnWeightData;
20 import org.eclipse.jface.viewers.IElementComparer;
21 import org.eclipse.jface.viewers.TableViewer;
22 import org.eclipse.jface.viewers.TableViewerColumn;
23 import org.eclipse.osgi.util.NLS;
24 import org.eclipse.swt.SWT;
25 import org.eclipse.swt.events.DisposeEvent;
26 import org.eclipse.swt.events.DisposeListener;
27 import org.eclipse.swt.graphics.Color;
28 import org.eclipse.swt.graphics.Image;
29 import org.eclipse.swt.graphics.RGB;
30 import org.eclipse.swt.layout.GridData;
31 import org.eclipse.swt.layout.GridLayout;
32 import org.eclipse.swt.widgets.Composite;
33 import org.eclipse.swt.widgets.Control;
34 import org.eclipse.swt.widgets.Table;
35 import org.eclipse.swt.widgets.TableColumn;
36 import org.spearce.jgit.lib.Constants;
37 import org.spearce.jgit.lib.ObjectId;
38 import org.spearce.jgit.lib.Ref;
39 import org.spearce.jgit.lib.Repository;
40 import org.spearce.jgit.transport.RemoteRefUpdate;
41 import org.spearce.jgit.transport.URIish;
42 import org.spearce.jgit.transport.RemoteRefUpdate.Status;
44 /**
45 * Table displaying push operation results.
47 class PushResultTable {
48 private static final int TABLE_PREFERRED_WIDTH = 650;
50 private static final int TABLE_PREFERRED_HEIGHT = 300;
52 private static final int COLUMN_STATUS_WEIGHT = 40;
54 private static final int COLUMN_DST_WEIGHT = 40;
56 private static final int COLUMN_SRC_WEIGHT = 40;
58 private static final int COLUMN_MODE_WEIGHT = 15;
60 private static final String IMAGE_DELETE = "MODE_DELETE";
62 private static final String IMAGE_ADD = "MODE_ADD";
64 private static final String COLOR_REJECTED_KEY = "REJECTED";
66 private static final RGB COLOR_REJECTED = new RGB(255, 0, 0);
68 private static final String COLOR_UPDATED_KEY = "UPDATED";
70 private static final RGB COLOR_UPDATED = new RGB(0, 255, 0);
72 private static final String COLOR_UP_TO_DATE_KEY = "UP_TO_DATE";
74 private static final RGB COLOR_UP_TO_DATE = new RGB(245, 245, 245);
76 private final TableViewer tableViewer;
78 private final Composite tablePanel;
80 private final ImageRegistry imageRegistry;
82 private final ColorRegistry colorRegistry;
84 PushResultTable(final Composite parent) {
85 tablePanel = new Composite(parent, SWT.NONE);
86 tablePanel.setLayout(new GridLayout());
87 final GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
88 layoutData.heightHint = TABLE_PREFERRED_HEIGHT;
89 layoutData.widthHint = TABLE_PREFERRED_WIDTH;
90 tableViewer = new TableViewer(tablePanel);
91 ColumnViewerToolTipSupport.enableFor(tableViewer);
92 final Table table = tableViewer.getTable();
93 table.setLinesVisible(true);
94 table.setHeaderVisible(true);
96 imageRegistry = new ImageRegistry(table.getDisplay());
97 imageRegistry.put(IMAGE_ADD, UIIcons.ELCL16_ADD);
98 imageRegistry.put(IMAGE_DELETE, UIIcons.ELCL16_DELETE);
100 colorRegistry = new ColorRegistry(table.getDisplay());
101 colorRegistry.put(COLOR_REJECTED_KEY, COLOR_REJECTED);
102 colorRegistry.put(COLOR_UPDATED_KEY, COLOR_UPDATED);
103 colorRegistry.put(COLOR_UP_TO_DATE_KEY, COLOR_UP_TO_DATE);
105 tablePanel.addDisposeListener(new DisposeListener() {
106 public void widgetDisposed(DisposeEvent e) {
107 imageRegistry.dispose();
111 tableViewer.setComparer(new IElementComparer() {
112 // we need this to keep refresh() working while having custom
113 // equals() in PushOperationResult
114 public boolean equals(Object a, Object b) {
115 return a == b;
118 public int hashCode(Object element) {
119 return element.hashCode();
122 tableViewer.setContentProvider(new RefUpdateContentProvider());
123 tableViewer.setInput(null);
126 void setData(final Repository localDb, final PushOperationResult result) {
127 // We have to recreate columns.
128 for (final TableColumn tc : tableViewer.getTable().getColumns())
129 tc.dispose();
130 // Set empty result for a while.
131 tableViewer.setInput(null);
133 // Layout should be recreated to work properly.
134 final TableColumnLayout layout = new TableColumnLayout();
135 tablePanel.setLayout(layout);
137 final TableViewerColumn modeViewer = createColumn(layout,
138 UIText.PushResultTable_columnMode, COLUMN_MODE_WEIGHT,
139 SWT.CENTER);
140 modeViewer.setLabelProvider(new CenteredImageLabelProvider() {
141 @Override
142 public Image getImage(Object element) {
143 if (((RefUpdateElement) element).isDelete())
144 return imageRegistry.get(IMAGE_DELETE);
145 return imageRegistry.get(IMAGE_ADD);
148 @Override
149 public String getToolTipText(Object element) {
150 if (((RefUpdateElement) element).isDelete())
151 return UIText.RefSpecPanel_modeDeleteDescription;
152 return UIText.RefSpecPanel_modeUpdateDescription;
156 final TableViewerColumn srcViewer = createColumn(layout,
157 UIText.PushResultTable_columnSrc, COLUMN_SRC_WEIGHT, SWT.LEFT);
158 srcViewer.setLabelProvider(new ColumnLabelProvider() {
159 @Override
160 public String getText(Object element) {
161 return ((RefUpdateElement) element).getSrcRefName();
165 final TableViewerColumn dstViewer = createColumn(layout,
166 UIText.PushResultTable_columnDst, COLUMN_DST_WEIGHT, SWT.LEFT);
167 dstViewer.setLabelProvider(new ColumnLabelProvider() {
168 @Override
169 public String getText(Object element) {
170 return ((RefUpdateElement) element).getDstRefName();
174 if (result == null) {
175 tablePanel.layout();
176 return;
179 int i = 0;
180 for (final URIish uri : result.getURIs()) {
181 final TableViewerColumn statusViewer = createColumn(layout, NLS
182 .bind(UIText.PushResultTable_columnStatusRepo, Integer
183 .toString(++i)), COLUMN_STATUS_WEIGHT, SWT.CENTER);
184 statusViewer.getColumn().setToolTipText(uri.toString());
185 statusViewer.setLabelProvider(new UpdateStatusLabelProvider(
186 localDb, uri));
188 tableViewer.setInput(result);
189 tablePanel.layout();
192 Control getControl() {
193 return tablePanel;
196 private TableViewerColumn createColumn(
197 final TableColumnLayout columnLayout, final String text,
198 final int weight, final int style) {
199 final TableViewerColumn viewerColumn = new TableViewerColumn(
200 tableViewer, style);
201 final TableColumn column = viewerColumn.getColumn();
202 column.setText(text);
203 columnLayout.setColumnData(column, new ColumnWeightData(weight));
204 return viewerColumn;
207 private class UpdateStatusLabelProvider extends ColumnLabelProvider {
208 private Repository localDb;
210 private final URIish uri;
212 UpdateStatusLabelProvider(final Repository localDb, final URIish uri) {
213 this.localDb = localDb;
214 this.uri = uri;
217 @Override
218 public String getText(Object element) {
219 final RefUpdateElement rue = (RefUpdateElement) element;
220 if (!rue.isSuccessfulConnection(uri))
221 return UIText.PushResultTable_statusConnectionFailed;
223 final RemoteRefUpdate rru = rue.getRemoteRefUpdate(uri);
224 switch (rru.getStatus()) {
225 case OK:
226 if (rru.isDelete())
227 return UIText.PushResultTable_statusOkDeleted;
229 final Ref oldRef = rue.getAdvertisedRemoteRef(uri);
230 if (oldRef == null) {
231 if (rue.getDstRefName().startsWith(Constants.R_TAGS))
232 return UIText.PushResultTable_statusOkNewTag;
233 return UIText.PushResultTable_statusOkNewBranch;
236 return oldRef.getObjectId().abbreviate(localDb).name()
237 + (rru.isFastForward() ? ".." : "...")
238 + rru.getNewObjectId().abbreviate(localDb).name();
239 case UP_TO_DATE:
240 return UIText.PushResultTable_statusUpToDate;
241 case NON_EXISTING:
242 return UIText.PushResultTable_statusNoMatch;
243 case REJECTED_NODELETE:
244 case REJECTED_NONFASTFORWARD:
245 case REJECTED_REMOTE_CHANGED:
246 return UIText.PushResultTable_statusRejected;
247 case REJECTED_OTHER_REASON:
248 return UIText.PushResultTable_statusRemoteRejected;
249 default:
250 throw new IllegalArgumentException(NLS.bind(
251 UIText.PushResultTable_statusUnexpected, rru
252 .getStatus()));
256 @Override
257 public Color getBackground(Object element) {
258 final RefUpdateElement rue = (RefUpdateElement) element;
259 if (!rue.isSuccessfulConnection(uri))
260 return colorRegistry.get(COLOR_REJECTED_KEY);
262 final Status status = rue.getRemoteRefUpdate(uri).getStatus();
263 switch (status) {
264 case OK:
265 return colorRegistry.get(COLOR_UPDATED_KEY);
266 case UP_TO_DATE:
267 case NON_EXISTING:
268 return colorRegistry.get(COLOR_UP_TO_DATE_KEY);
269 case REJECTED_NODELETE:
270 case REJECTED_NONFASTFORWARD:
271 case REJECTED_REMOTE_CHANGED:
272 case REJECTED_OTHER_REASON:
273 return colorRegistry.get(COLOR_REJECTED_KEY);
274 default:
275 throw new IllegalArgumentException(NLS.bind(
276 UIText.PushResultTable_statusUnexpected, status));
280 @Override
281 public String getToolTipText(Object element) {
282 final RefUpdateElement rue = (RefUpdateElement) element;
283 if (!rue.isSuccessfulConnection(uri))
284 return rue.getErrorMessage(uri);
286 final RemoteRefUpdate rru = rue.getRemoteRefUpdate(uri);
287 final Ref oldRef = rue.getAdvertisedRemoteRef(uri);
288 switch (rru.getStatus()) {
289 case OK:
290 if (rru.isDelete())
291 return NLS.bind(UIText.PushResultTable_statusDetailDeleted,
292 oldRef.getObjectId().abbreviate(localDb).name());
293 if (oldRef == null)
294 return null;
295 if (rru.isFastForward())
296 return UIText.PushResultTable_statusDetailFastForward;
297 return UIText.PushResultTable_statusDetailForcedUpdate;
298 case UP_TO_DATE:
299 return null;
300 case NON_EXISTING:
301 return UIText.PushResultTable_statusDetailNonExisting;
302 case REJECTED_NODELETE:
303 return UIText.PushResultTable_statusDetailNoDelete;
304 case REJECTED_NONFASTFORWARD:
305 return UIText.PushResultTable_statusDetailNonFastForward;
306 case REJECTED_REMOTE_CHANGED:
307 final Ref remoteRef = oldRef;
308 final String curVal;
309 if (remoteRef == null)
310 curVal = UIText.PushResultTable_refNonExisting;
311 else
312 curVal = remoteRef.getObjectId().abbreviate(localDb).name();
314 final ObjectId expectedOldObjectId = rru
315 .getExpectedOldObjectId();
316 final String expVal;
317 if (expectedOldObjectId.equals(ObjectId.zeroId()))
318 expVal = UIText.PushResultTable_refNonExisting;
319 else
320 expVal = expectedOldObjectId.abbreviate(localDb).name();
321 return NLS.bind(UIText.PushResultTable_statusDetailChanged,
322 curVal, expVal);
323 case REJECTED_OTHER_REASON:
324 return rru.getMessage();
325 default:
326 throw new IllegalArgumentException(NLS.bind(
327 UIText.PushResultTable_statusUnexpected, rru
328 .getStatus()));