Java tutorial
/** * Copyright (c) 2015 Genuitec LLC. * 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 * * Contributors: * Piotr Tomiak <piotr@genuitec.com> - initial API and implementation */ package com.genuitec.eclipse.gerrit.tools.internal.gps.dialogs; import java.util.HashMap; import java.util.Map; import org.eclipse.jface.layout.TreeColumnLayout; import org.eclipse.jface.viewers.BaseLabelProvider; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TreeColumn; import com.genuitec.eclipse.gerrit.tools.GerritToolsPlugin; import com.genuitec.eclipse.gerrit.tools.dialogs.SettingsDialog; import com.genuitec.eclipse.gerrit.tools.internal.gps.model.GpsFile; import com.genuitec.eclipse.gerrit.tools.internal.gps.model.GpsGitRepositoriesConfig; import com.genuitec.eclipse.gerrit.tools.internal.gps.model.IGpsRepositoriesConfig; import com.genuitec.eclipse.gerrit.tools.internal.gps.model.IGpsRepositorySetup; import com.genuitec.eclipse.gerrit.tools.internal.gps.model.IGpsRepositorySetup.State; public class ImportProjectsDialog extends SettingsDialog { Map<String, Object> settings = new HashMap<String, Object>(); GpsFile gpsFile; public ImportProjectsDialog(Shell parentShell, GpsFile gpsFile) { super(parentShell, "Configure project import"); this.gpsFile = gpsFile; } @Override protected void createDialogContents(Composite parent) { Composite contents = new Composite(parent, SWT.NONE); contents.setLayout(new GridLayout()); contents.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); //create git options createGitOptionsGroup(contents); //create repositories options createRepositoriesGroup(contents); } private void createGitOptionsGroup(Composite parent) { Group group = new Group(parent, SWT.NONE); group.setText("Git project's import"); group.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); group.setLayout(new GridLayout(4, false)); Label label = new Label(group, SWT.WRAP); label.setText( "Choose additional operations, which are performed on Git repositories before projects are imported."); GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1); gd.widthHint = 350; label.setLayoutData(gd); createOptionCheckBox(group, "Configure 'Push to upstream'.", GpsGitRepositoriesConfig.PROP_CONFIGURE_PUSH_TO_UPSTREAM, true); createOptionCheckBox(group, "Reconfigure branches setup", GpsGitRepositoriesConfig.PROP_RECONFIGURE_BRANCH, true); createOptionCheckBox(group, "Automatically pull each of repositories", GpsGitRepositoriesConfig.PROP_AUTO_PULL, true); createOptionCheckBox(group, "Force checkout (WARNING: this will override any non committed changes in problematic repositories)", GpsGitRepositoriesConfig.PROP_FORCE_CHECKOUT, false); } private void createRepositoriesGroup(Composite parent) { Group group = new Group(parent, SWT.NONE); group.setText("Git repositories"); group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); group.setLayout(new GridLayout()); Composite treeParent = new Composite(group, SWT.NONE); GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); data.heightHint = 200; treeParent.setLayoutData(data); TreeColumnLayout treeLayout = new TreeColumnLayout(); treeParent.setLayout(treeLayout); TreeViewer viewer = new TreeViewer(treeParent); viewer.getTree().setHeaderVisible(true); TreeColumn column = new TreeColumn(viewer.getTree(), SWT.NONE); column.setText("Name"); treeLayout.setColumnData(column, new ColumnWeightData(30)); column = new TreeColumn(viewer.getTree(), SWT.NONE); column.setText("State"); treeLayout.setColumnData(column, new ColumnWeightData(20)); TreeViewerColumn vc = new TreeViewerColumn(viewer, SWT.NONE); column = vc.getColumn(); column.setText("User name"); treeLayout.setColumnData(column, new ColumnWeightData(20)); vc.setEditingSupport(new MyCellEditingSupport(viewer)); viewer.setContentProvider(new ContentProvider()); viewer.setLabelProvider(new MyLabelProvider()); viewer.setInput(null); for (IGpsRepositoriesConfig repo : gpsFile.getRepositoryConfigs()) { if (repo.getType().equals("git")) { //$NON-NLS-1$ viewer.setInput(repo.getRepositoriesSetups()); } } } private static class MyLabelProvider extends BaseLabelProvider implements ITableLabelProvider { @Override public Image getColumnImage(Object element, int columnIndex) { return columnIndex == 0 ? GerritToolsPlugin.getDefault().getImage(GerritToolsPlugin.IMG_GIT_REPO) : null; } @Override public String getColumnText(Object element, int columnIndex) { IGpsRepositorySetup repo = (IGpsRepositorySetup) element; switch (columnIndex) { case 0: return repo.getName(); case 1: return repo.getState().toString().toLowerCase(); case 2: return repo.getState() == State.CLONE ? repo.getUserName() : ""; } return null; } } private static class ContentProvider implements ITreeContentProvider { @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public Object[] getElements(Object inputElement) { return (Object[]) inputElement; } @Override public Object[] getChildren(Object parentElement) { return null; } @Override public Object getParent(Object element) { return null; } @Override public boolean hasChildren(Object element) { return false; } } private static class MyCellEditingSupport extends EditingSupport { private CellEditor userNameEditor; public MyCellEditingSupport(TreeViewer viewer) { super(viewer); userNameEditor = new TextCellEditor(viewer.getTree()); } @Override protected boolean canEdit(Object element) { IGpsRepositorySetup repo = (IGpsRepositorySetup) element; return repo.getState() == State.CLONE && repo.getUserName() != null; } @Override protected CellEditor getCellEditor(Object element) { return userNameEditor; } @Override protected Object getValue(Object element) { return ((IGpsRepositorySetup) element).getUserName(); } @Override protected void setValue(Object element, Object value) { ((IGpsRepositorySetup) element).setUserName((String) value); getViewer().refresh(element); } } }