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
.spearce
.egit
.ui
.internal
.push
;
10 import java
.io
.IOException
;
11 import java
.lang
.reflect
.InvocationTargetException
;
12 import java
.util
.ArrayList
;
13 import java
.util
.Collection
;
14 import java
.util
.List
;
16 import org
.eclipse
.core
.runtime
.IStatus
;
17 import org
.eclipse
.core
.runtime
.Status
;
18 import org
.eclipse
.jface
.dialogs
.ErrorDialog
;
19 import org
.eclipse
.jface
.wizard
.WizardPage
;
20 import org
.eclipse
.osgi
.util
.NLS
;
21 import org
.eclipse
.swt
.SWT
;
22 import org
.eclipse
.swt
.layout
.GridData
;
23 import org
.eclipse
.swt
.layout
.GridLayout
;
24 import org
.eclipse
.swt
.widgets
.Button
;
25 import org
.eclipse
.swt
.widgets
.Composite
;
26 import org
.eclipse
.swt
.widgets
.Control
;
27 import org
.spearce
.egit
.core
.op
.PushOperation
;
28 import org
.spearce
.egit
.core
.op
.PushOperationResult
;
29 import org
.spearce
.egit
.core
.op
.PushOperationSpecification
;
30 import org
.spearce
.egit
.ui
.Activator
;
31 import org
.spearce
.egit
.ui
.UIText
;
32 import org
.spearce
.egit
.ui
.internal
.components
.RefSpecPage
;
33 import org
.spearce
.egit
.ui
.internal
.components
.RepositorySelection
;
34 import org
.spearce
.egit
.ui
.internal
.components
.RepositorySelectionPage
;
35 import org
.spearce
.egit
.ui
.internal
.components
.SelectionChangeListener
;
36 import org
.spearce
.jgit
.lib
.Repository
;
37 import org
.spearce
.jgit
.transport
.RefSpec
;
38 import org
.spearce
.jgit
.transport
.RemoteRefUpdate
;
39 import org
.spearce
.jgit
.transport
.Transport
;
40 import org
.spearce
.jgit
.transport
.URIish
;
42 class ConfirmationPage
extends WizardPage
{
43 static Collection
<RemoteRefUpdate
> copyUpdates(
44 final Collection
<RemoteRefUpdate
> refUpdates
) throws IOException
{
45 final Collection
<RemoteRefUpdate
> copy
= new ArrayList
<RemoteRefUpdate
>(
47 for (final RemoteRefUpdate rru
: refUpdates
)
48 copy
.add(new RemoteRefUpdate(rru
, null));
52 private final Repository local
;
54 private final RepositorySelectionPage repoPage
;
56 private final RefSpecPage refSpecPage
;
58 private RepositorySelection displayedRepoSelection
;
60 private List
<RefSpec
> displayedRefSpecs
;
62 private PushOperationResult confirmedResult
;
64 private PushResultTable resultPanel
;
66 private Button requireUnchangedButton
;
68 private Button showOnlyIfChanged
;
70 public ConfirmationPage(final Repository local
,
71 final RepositorySelectionPage repoPage
,
72 final RefSpecPage refSpecPage
) {
73 super(ConfirmationPage
.class.getName());
75 this.repoPage
= repoPage
;
76 this.refSpecPage
= refSpecPage
;
78 setTitle(UIText
.ConfirmationPage_title
);
79 setDescription(UIText
.ConfirmationPage_description
);
81 final SelectionChangeListener listener
= new SelectionChangeListener() {
82 public void selectionChanged() {
83 checkPreviousPagesSelections();
86 repoPage
.addSelectionListener(listener
);
87 refSpecPage
.addSelectionListener(listener
);
90 public void createControl(final Composite parent
) {
91 final Composite panel
= new Composite(parent
, SWT
.NONE
);
92 panel
.setLayout(new GridLayout());
94 resultPanel
= new PushResultTable(panel
);
95 final Control tableControl
= resultPanel
.getControl();
97 .setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
99 requireUnchangedButton
= new Button(panel
, SWT
.CHECK
);
100 requireUnchangedButton
101 .setText(UIText
.ConfirmationPage_requireUnchangedButton
);
103 showOnlyIfChanged
= new Button(panel
, SWT
.CHECK
);
104 showOnlyIfChanged
.setText(UIText
.ConfirmationPage_showOnlyIfChanged
);
110 public void setVisible(final boolean visible
) {
113 super.setVisible(visible
);
116 boolean isConfirmed() {
117 return confirmedResult
!= null;
120 PushOperationResult
getConfirmedResult() {
121 return confirmedResult
;
124 boolean isRequireUnchangedSelected() {
125 return requireUnchangedButton
.getSelection();
128 boolean isShowOnlyIfChangedSelected() {
129 return showOnlyIfChanged
.getSelection();
132 private void checkPreviousPagesSelections() {
133 if (!repoPage
.selectionEquals(displayedRepoSelection
)
134 || !refSpecPage
.specsSelectionEquals(displayedRefSpecs
)) {
135 // Allow user to finish by skipping confirmation...
136 setPageComplete(true);
138 // ... but if user doesn't skip confirmation, allow only when no
139 // critical errors occurred
140 setPageComplete(confirmedResult
!= null);
144 private void revalidate() {
145 // always update this page
146 resultPanel
.setData(local
, null);
147 confirmedResult
= null;
148 displayedRepoSelection
= repoPage
.getSelection();
149 displayedRefSpecs
= refSpecPage
.getRefSpecs();
150 setErrorMessage(null);
151 setPageComplete(false);
152 getControl().getDisplay().asyncExec(new Runnable() {
159 private void revalidateImpl() {
160 if (getControl().isDisposed() || !isCurrentPage())
163 final List
<RefSpec
> fetchSpecs
;
164 if (displayedRepoSelection
.isConfigSelected())
165 fetchSpecs
= displayedRepoSelection
.getConfig().getFetchRefSpecs();
169 final PushOperation operation
;
171 final Collection
<RemoteRefUpdate
> updates
= Transport
172 .findRemoteRefUpdatesFor(local
, displayedRefSpecs
,
174 if (updates
.isEmpty()) {
175 // It can happen only when local refs changed in the mean time.
176 setErrorMessage(UIText
.ConfirmationPage_errorRefsChangedNoMatch
);
177 setPageComplete(false);
181 final PushOperationSpecification spec
= new PushOperationSpecification();
182 for (final URIish uri
: displayedRepoSelection
.getAllURIs())
183 spec
.addURIRefUpdates(uri
, copyUpdates(updates
));
185 operation
= new PushOperation(local
, spec
, true,
186 displayedRepoSelection
.getConfig());
187 getContainer().run(true, true, operation
);
188 } catch (final IOException e
) {
189 setErrorMessage(NLS
.bind(
190 UIText
.ConfirmationPage_errorCantResolveSpecs
, e
193 } catch (final InvocationTargetException e
) {
194 setErrorMessage(NLS
.bind(UIText
.ConfirmationPage_errorUnexpected
, e
195 .getCause().getMessage()));
197 } catch (final InterruptedException e
) {
198 setErrorMessage(UIText
.ConfirmationPage_errorInterrupted
);
199 setPageComplete(true);
200 displayedRefSpecs
= null;
201 displayedRepoSelection
= null;
205 final PushOperationResult result
= operation
.getOperationResult();
206 resultPanel
.setData(local
, result
);
207 if (result
.isSuccessfulConnectionForAnyURI()) {
208 setPageComplete(true);
209 confirmedResult
= result
;
211 final String message
= NLS
.bind(
212 UIText
.ConfirmationPage_cantConnectToAny
, result
213 .getErrorStringForAllURis());
214 setErrorMessage(message
);
216 .openError(getShell(),
217 UIText
.ConfirmationPage_cantConnectToAnyTitle
,
219 new Status(IStatus
.ERROR
, Activator
.getPluginId(),