Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushTagsPage.java')
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushTagsPage.java215
1 files changed, 215 insertions, 0 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushTagsPage.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushTagsPage.java
new file mode 100644
index 0000000000..d51bb0bd8a
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/push/PushTagsPage.java
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Robin Stocker <robin@nibor.org> and others.
+ * 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
+ *******************************************************************************/
+package org.eclipse.egit.ui.internal.push;
+
+import java.net.URISyntaxException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.egit.ui.internal.CachedCheckboxTreeViewer;
+import org.eclipse.egit.ui.internal.CommonUtils;
+import org.eclipse.egit.ui.internal.FilteredCheckboxTree;
+import org.eclipse.egit.ui.internal.UIText;
+import org.eclipse.egit.ui.internal.components.RemoteSelectionCombo;
+import org.eclipse.egit.ui.internal.components.RemoteSelectionCombo.SelectionType;
+import org.eclipse.egit.ui.internal.repository.RepositoriesViewContentProvider;
+import org.eclipse.egit.ui.internal.repository.RepositoriesViewStyledCellLabelProvider;
+import org.eclipse.egit.ui.internal.repository.tree.TagNode;
+import org.eclipse.egit.ui.internal.repository.tree.TagsNode;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.layout.LayoutConstants;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.transport.RemoteConfig;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * Tag to select a remote and one or more tags to push.
+ */
+public class PushTagsPage extends WizardPage {
+
+ private final Repository repository;
+
+ private final Set<String> tagRefNamesToSelect = new HashSet<String>();
+
+ private RemoteConfig selectedRemoteConfig = null;
+
+ private List<TagNode> selectedTags = new ArrayList<TagNode>();
+
+ private boolean forceUpdateSelected = false;
+
+ private Label tagsLabel;
+
+ /**
+ * @param repository
+ * @param tagNamesToSelect
+ */
+ public PushTagsPage(Repository repository,
+ Collection<String> tagNamesToSelect) {
+ super(UIText.PushTagsPage_PageName);
+ setTitle(UIText.PushTagsPage_PageTitle);
+ setMessage(UIText.PushTagsPage_PageMessage);
+
+ this.repository = repository;
+ for (String tagName : tagNamesToSelect) {
+ if (tagName.startsWith(Constants.R_TAGS))
+ tagRefNamesToSelect.add(tagName);
+ else
+ tagRefNamesToSelect.add(Constants.R_TAGS + tagName);
+ }
+ }
+
+ public void createControl(Composite parent) {
+ Composite main = new Composite(parent, SWT.NONE);
+ main.setLayout(GridLayoutFactory.swtDefaults()
+ .spacing(LayoutConstants.getSpacing()).numColumns(2).create());
+
+ Label remoteLabel = new Label(main, SWT.NONE);
+ remoteLabel.setText(UIText.PushTagsPage_RemoteLabel);
+
+ RemoteSelectionCombo remoteSelectionCombo = new RemoteSelectionCombo(
+ main, SWT.NONE, SelectionType.PUSH);
+ remoteSelectionCombo.setLayoutData(GridDataFactory.fillDefaults()
+ .grab(true, false).create());
+ selectedRemoteConfig = remoteSelectionCombo
+ .setItems(getRemoteConfigs());
+ remoteSelectionCombo
+ .addRemoteSelectionListener(new RemoteSelectionCombo.IRemoteSelectionListener() {
+ public void remoteSelected(RemoteConfig remoteConfig) {
+ selectedRemoteConfig = remoteConfig;
+ }
+ });
+
+ tagsLabel = new Label(main, SWT.NONE);
+ tagsLabel.setText(UIText.PushTagsPage_TagsLabelNoneSelected);
+ tagsLabel.setLayoutData(GridDataFactory.fillDefaults()
+ .grab(true, false).span(2, 1).create());
+
+ FilteredCheckboxTree tree = new FilteredCheckboxTree(main, null,
+ SWT.BORDER);
+ tree.setLayoutData(GridDataFactory.fillDefaults().grab(true, true)
+ .span(2, 1).hint(400, 300).create());
+
+ final Button forceUpdateButton = new Button(main, SWT.CHECK);
+ forceUpdateButton
+ .setText(UIText.PushTagsPage_ForceUpdateButton);
+ forceUpdateButton.setSelection(false);
+ forceUpdateButton.setLayoutData(GridDataFactory.fillDefaults()
+ .grab(true, false).span(2, 1).create());
+ forceUpdateButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ forceUpdateSelected = forceUpdateButton.getSelection();
+ }
+ });
+
+ final CachedCheckboxTreeViewer treeViewer = tree
+ .getCheckboxTreeViewer();
+ final TagsNode tagsNode = new TagsNode(null, repository);
+ RepositoriesViewContentProvider contentProvider = new RepositoriesViewContentProvider() {
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return getChildren(tagsNode);
+ }
+ };
+ treeViewer.setContentProvider(contentProvider);
+ treeViewer
+ .setLabelProvider(new RepositoriesViewStyledCellLabelProvider());
+ treeViewer.setComparator(new ViewerComparator(
+ CommonUtils.STRING_ASCENDING_COMPARATOR));
+ treeViewer.setInput(tagsNode);
+
+ final Object[] tagNodes = contentProvider.getElements(tagsNode);
+ initiallySelectTags(tagNodes, treeViewer);
+
+ treeViewer.addCheckStateListener(new ICheckStateListener() {
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ setSelectedTags(treeViewer.getCheckedElements());
+ }
+ });
+
+ setControl(main);
+ }
+
+ @Override
+ public boolean isPageComplete() {
+ return selectedRemoteConfig != null && !selectedTags.isEmpty();
+ }
+
+ RemoteConfig getSelectedRemoteConfig() {
+ return selectedRemoteConfig;
+ }
+
+ List<TagNode> getSelectedTags() {
+ return selectedTags;
+ }
+
+ boolean isForceUpdateSelected() {
+ return forceUpdateSelected;
+ }
+
+ private void initiallySelectTags(Object[] tagNodes,
+ CheckboxTreeViewer viewer) {
+ List<TagNode> checkedTags = new ArrayList<TagNode>();
+ for (Object node : tagNodes) {
+ if (node instanceof TagNode) {
+ TagNode tagNode = (TagNode) node;
+ Ref ref = tagNode.getObject();
+ if (tagRefNamesToSelect.contains(ref.getName()))
+ checkedTags.add(tagNode);
+ }
+ }
+
+ TagNode[] checkedTagsArray = checkedTags
+ .toArray(new TagNode[checkedTags.size()]);
+ viewer.setCheckedElements(checkedTagsArray);
+ viewer.setSelection(StructuredSelection.EMPTY);
+ if (checkedTagsArray.length > 0)
+ viewer.reveal(checkedTagsArray[0]);
+ setSelectedTags(checkedTagsArray);
+ }
+
+ private void setSelectedTags(Object[] tags) {
+ selectedTags.clear();
+ for (Object tag : tags) {
+ if (tag instanceof TagNode)
+ selectedTags.add((TagNode) tag);
+ }
+ int number = selectedTags.size();
+ if (number == 0)
+ tagsLabel.setText(UIText.PushTagsPage_TagsLabelNoneSelected);
+ else
+ tagsLabel.setText(MessageFormat.format(UIText.PushTagsPage_TagsLabelSelected,
+ Integer.valueOf(selectedTags.size())));
+ setPageComplete(isPageComplete());
+ }
+
+ private List<RemoteConfig> getRemoteConfigs() {
+ try {
+ return RemoteConfig.getAllRemoteConfigs(repository.getConfig());
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}

Back to the top