Reduce PushOperationResult contructor visibility, accept null instead
[egit/zawir.git] / org.spearce.egit.ui / src / org / spearce / egit / ui / internal / push / ConfirmationPage.java
blob08d21b316c6558072c5bf4c76544525b0d8bf2b3
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.jface.wizard.WizardPage;
17 import org.eclipse.osgi.util.NLS;
18 import org.eclipse.swt.SWT;
19 import org.eclipse.swt.layout.GridData;
20 import org.eclipse.swt.layout.GridLayout;
21 import org.eclipse.swt.widgets.Button;
22 import org.eclipse.swt.widgets.Composite;
23 import org.eclipse.swt.widgets.Control;
24 import org.spearce.egit.core.op.PushOperation;
25 import org.spearce.egit.core.op.PushOperationResult;
26 import org.spearce.egit.core.op.PushOperationSpecification;
27 import org.spearce.egit.ui.UIText;
28 import org.spearce.egit.ui.internal.components.RefSpecPage;
29 import org.spearce.egit.ui.internal.components.RepositorySelection;
30 import org.spearce.egit.ui.internal.components.RepositorySelectionPage;
31 import org.spearce.egit.ui.internal.components.SelectionChangeListener;
32 import org.spearce.jgit.lib.Repository;
33 import org.spearce.jgit.transport.RefSpec;
34 import org.spearce.jgit.transport.RemoteRefUpdate;
35 import org.spearce.jgit.transport.Transport;
36 import org.spearce.jgit.transport.URIish;
38 class ConfirmationPage extends WizardPage {
39 static Collection<RemoteRefUpdate> copyUpdates(
40 final Collection<RemoteRefUpdate> refUpdates) throws IOException {
41 final Collection<RemoteRefUpdate> copy = new ArrayList<RemoteRefUpdate>(
42 refUpdates.size());
43 for (final RemoteRefUpdate rru : refUpdates)
44 copy.add(new RemoteRefUpdate(rru, null));
45 return copy;
48 private final Repository local;
50 private final RepositorySelectionPage repoPage;
52 private final RefSpecPage refSpecPage;
54 private RepositorySelection displayedRepoSelection;
56 private List<RefSpec> displayedRefSpecs;
58 private PushOperationResult confirmedResult;
60 private PushResultTable resultPanel;
62 private Button requireUnchangedButton;
64 private Button showOnlyIfChanged;
66 public ConfirmationPage(final Repository local,
67 final RepositorySelectionPage repoPage,
68 final RefSpecPage refSpecPage) {
69 super(ConfirmationPage.class.getName());
70 this.local = local;
71 this.repoPage = repoPage;
72 this.refSpecPage = refSpecPage;
74 setTitle(UIText.ConfirmationPage_title);
75 setDescription(UIText.ConfirmationPage_description);
77 final SelectionChangeListener listener = new SelectionChangeListener() {
78 public void selectionChanged() {
79 checkPreviousPagesSelections();
82 repoPage.addSelectionListener(listener);
83 refSpecPage.addSelectionListener(listener);
86 public void createControl(final Composite parent) {
87 final Composite panel = new Composite(parent, SWT.NONE);
88 panel.setLayout(new GridLayout());
90 resultPanel = new PushResultTable(panel);
91 final Control tableControl = resultPanel.getControl();
92 tableControl
93 .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
95 requireUnchangedButton = new Button(panel, SWT.CHECK);
96 requireUnchangedButton
97 .setText(UIText.ConfirmationPage_requireUnchangedButton);
99 showOnlyIfChanged = new Button(panel, SWT.CHECK);
100 showOnlyIfChanged.setText(UIText.ConfirmationPage_showOnlyIfChanged);
102 setControl(panel);
105 @Override
106 public void setVisible(final boolean visible) {
107 if (visible)
108 revalidate();
109 super.setVisible(visible);
112 boolean isConfirmed() {
113 return confirmedResult != null;
116 PushOperationResult getConfirmedResult() {
117 return confirmedResult;
120 boolean isRequireUnchangedSelected() {
121 return requireUnchangedButton.getSelection();
124 boolean isShowOnlyIfChangedSelected() {
125 return showOnlyIfChanged.getSelection();
128 private void checkPreviousPagesSelections() {
129 if (!repoPage.selectionEquals(displayedRepoSelection)
130 || !refSpecPage.specsSelectionEquals(displayedRefSpecs)) {
131 // Allow user to finish by skipping confirmation...
132 setPageComplete(true);
133 } else {
134 // ... but if user doesn't skip confirmation, allow only when no
135 // critical errors occurred
136 setPageComplete(confirmedResult != null);
140 private void revalidate() {
141 // always update this page
142 resultPanel.setData(local, null);
143 confirmedResult = null;
144 displayedRepoSelection = repoPage.getSelection();
145 displayedRefSpecs = refSpecPage.getRefSpecs();
146 setErrorMessage(null);
147 setPageComplete(false);
148 getControl().getDisplay().asyncExec(new Runnable() {
149 public void run() {
150 revalidateImpl();
155 private void revalidateImpl() {
156 if (getControl().isDisposed() || !isCurrentPage())
157 return;
159 final List<RefSpec> fetchSpecs;
160 if (displayedRepoSelection.isConfigSelected())
161 fetchSpecs = displayedRepoSelection.getConfig().getFetchRefSpecs();
162 else
163 fetchSpecs = null;
165 final PushOperation operation;
166 try {
167 final Collection<RemoteRefUpdate> updates = Transport
168 .findRemoteRefUpdatesFor(local, displayedRefSpecs,
169 fetchSpecs);
170 if (updates.isEmpty()) {
171 // It can happen only when local refs changed in the mean time.
172 setErrorMessage(UIText.ConfirmationPage_errorRefsChangedNoMatch);
173 setPageComplete(false);
174 return;
177 final PushOperationSpecification spec = new PushOperationSpecification();
178 for (final URIish uri : displayedRepoSelection.getAllURIs())
179 spec.addURIRefUpdates(uri, copyUpdates(updates));
181 operation = new PushOperation(local, spec, true,
182 displayedRepoSelection.getConfig());
183 getContainer().run(true, true, operation);
184 } catch (final IOException e) {
185 setErrorMessage(NLS.bind(
186 UIText.ConfirmationPage_errorCantResolveSpecs, e
187 .getMessage()));
188 return;
189 } catch (final InvocationTargetException e) {
190 setErrorMessage(NLS.bind(UIText.ConfirmationPage_errorUnexpected, e
191 .getCause().getMessage()));
192 return;
193 } catch (final InterruptedException e) {
194 setErrorMessage(UIText.ConfirmationPage_errorInterrupted);
195 setPageComplete(true);
196 displayedRefSpecs = null;
197 displayedRepoSelection = null;
198 return;
201 final PushOperationResult result = operation.getOperationResult();
202 resultPanel.setData(local, result);
203 if (result.isSuccessfulConnectionForAnyURI()) {
204 setPageComplete(true);
205 confirmedResult = result;
206 } else {
207 setErrorMessage(NLS.bind(UIText.ConfirmationPage_cantConnectToAny,
208 result.getErrorStringForAllURis()));