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
;
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
) {
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())
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
,
140 modeViewer
.setLabelProvider(new CenteredImageLabelProvider() {
142 public Image
getImage(Object element
) {
143 if (((RefUpdateElement
) element
).isDelete())
144 return imageRegistry
.get(IMAGE_DELETE
);
145 return imageRegistry
.get(IMAGE_ADD
);
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() {
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() {
169 public String
getText(Object element
) {
170 return ((RefUpdateElement
) element
).getDstRefName();
174 if (result
== null) {
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(
188 tableViewer
.setInput(result
);
192 Control
getControl() {
196 private TableViewerColumn
createColumn(
197 final TableColumnLayout columnLayout
, final String text
,
198 final int weight
, final int style
) {
199 final TableViewerColumn viewerColumn
= new TableViewerColumn(
201 final TableColumn column
= viewerColumn
.getColumn();
202 column
.setText(text
);
203 columnLayout
.setColumnData(column
, new ColumnWeightData(weight
));
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
;
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()) {
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();
240 return UIText
.PushResultTable_statusUpToDate
;
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
;
250 throw new IllegalArgumentException(NLS
.bind(
251 UIText
.PushResultTable_statusUnexpected
, rru
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();
265 return colorRegistry
.get(COLOR_UPDATED_KEY
);
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
);
275 throw new IllegalArgumentException(NLS
.bind(
276 UIText
.PushResultTable_statusUnexpected
, status
));
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()) {
291 return NLS
.bind(UIText
.PushResultTable_statusDetailDeleted
,
292 oldRef
.getObjectId().abbreviate(localDb
).name());
295 if (rru
.isFastForward())
296 return UIText
.PushResultTable_statusDetailFastForward
;
297 return UIText
.PushResultTable_statusDetailForcedUpdate
;
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
;
309 if (remoteRef
== null)
310 curVal
= UIText
.PushResultTable_refNonExisting
;
312 curVal
= remoteRef
.getObjectId().abbreviate(localDb
).name();
314 final ObjectId expectedOldObjectId
= rru
315 .getExpectedOldObjectId();
317 if (expectedOldObjectId
.equals(ObjectId
.zeroId()))
318 expVal
= UIText
.PushResultTable_refNonExisting
;
320 expVal
= expectedOldObjectId
.abbreviate(localDb
).name();
321 return NLS
.bind(UIText
.PushResultTable_statusDetailChanged
,
323 case REJECTED_OTHER_REASON
:
324 return rru
.getMessage();
326 throw new IllegalArgumentException(NLS
.bind(
327 UIText
.PushResultTable_statusUnexpected
, rru