/******************************************************************************* * Copyright (c) 2013 Cloud Bees, Inc. * All rights reserved. * This program is 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: * Cloud Bees, Inc. - initial API and implementation *******************************************************************************/ package com.cloudbees.eclipse.ui.internal.preferences; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import com.cloudbees.eclipse.core.domain.JenkinsInstance; import com.cloudbees.eclipse.ui.CloudBeesUIPlugin; /** * CloudBees Jenkins instances configuration * * @author ahtik */ public class JenkinsInstancesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { protected Table table; protected Button btnAdd; protected Button btnEdit; protected Button btnRemove; public JenkinsInstancesPreferencePage() { setPreferenceStore(CloudBeesUIPlugin.getDefault().getPreferenceStore()); setDescription("Configure On-Premise Jenkins access.");//TODO i18n } /* * (non-Javadoc) * * @see * org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) */ public void init(final IWorkbench workbench) { } @Override protected Control createContents(final Composite parent) { parent.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Composite comp = new Composite(parent, SWT.NONE); GridLayout gl_comp = new GridLayout(1, false); gl_comp.marginWidth = 0; gl_comp.verticalSpacing = 0; gl_comp.horizontalSpacing = 0; comp.setLayout(gl_comp); Label lblConfiguredJenkins = new Label(comp, SWT.NONE); lblConfiguredJenkins.setText("Available On-Premise Jenkins installations:"); //TODO i18n Composite compositeJenkinsInstances = new Composite(comp, SWT.NONE); compositeJenkinsInstances.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); GridLayout gl_compositeJenkinsInstances = new GridLayout(2, false); gl_compositeJenkinsInstances.marginWidth = 0; compositeJenkinsInstances.setLayout(gl_compositeJenkinsInstances); Composite compositeTable = new Composite(compositeJenkinsInstances, SWT.NONE); compositeTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); GridLayout gl_compositeTable = new GridLayout(1, false); gl_compositeTable.marginHeight = 0; gl_compositeTable.marginWidth = 0; compositeTable.setLayout(gl_compositeTable); this.table = new Table(compositeTable, SWT.BORDER | SWT.FULL_SELECTION); this.table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); this.table.setHeaderVisible(true); this.table.setLinesVisible(true); this.table.addSelectionListener(new SelectionListener() { public void widgetSelected(final SelectionEvent e) { enableButtons(); } public void widgetDefaultSelected(final SelectionEvent e) { enableButtons(); } }); TableColumn tblclmnLabel = new TableColumn(this.table, SWT.NONE); tblclmnLabel.setWidth(120); tblclmnLabel.setText("Label");//TODO i18n TableColumn tblclmnUrl = new TableColumn(this.table, SWT.NONE); tblclmnUrl.setWidth(300); tblclmnUrl.setText("Url");//TODO i18n Composite compositeButtons = new Composite(compositeJenkinsInstances, SWT.NONE); GridLayout gl_compositeButtons = new GridLayout(1, false); gl_compositeButtons.marginHeight = 0; gl_compositeButtons.marginWidth = 0; compositeButtons.setLayout(gl_compositeButtons); compositeButtons.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1)); this.btnAdd = new Button(compositeButtons, SWT.PUSH); GridData gd_btnAdd = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); gd_btnAdd.widthHint = 70; this.btnAdd.setLayoutData(gd_btnAdd); this.btnAdd.setText("&Add..."); this.btnEdit = new Button(compositeButtons, SWT.NONE); this.btnEdit.setEnabled(false); GridData gd_btnEdit = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); gd_btnEdit.widthHint = 70; this.btnEdit.setLayoutData(gd_btnEdit); this.btnEdit.setText("E&dit..."); this.btnRemove = new Button(compositeButtons, SWT.NONE); this.btnRemove.setEnabled(false); GridData gd_btnRemove = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); gd_btnRemove.widthHint = 70; this.btnRemove.setLayoutData(gd_btnRemove); this.btnRemove.setText("&Remove"); SelectionAdapter addListener = new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { Shell parent = CloudBeesUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(); WizardDialog dialog = new JenkinsWizardDialog(parent); dialog.create(); dialog.getShell().setSize(Math.max(400, dialog.getShell().getSize().x), 400); dialog.open(); loadTable(); } }; this.btnAdd.addSelectionListener(addListener); SelectionAdapter editListener = new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { TableItem[] items = JenkinsInstancesPreferencePage.this.table.getSelection(); if (items == null || items.length <= 0) { return; } JenkinsInstance ni = (JenkinsInstance) items[0].getData(); Shell parent = CloudBeesUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell(); WizardDialog dialog = new JenkinsWizardDialog(parent, ni); dialog.create(); dialog.getShell().setSize(Math.max(400, dialog.getShell().getSize().x), 400); dialog.open(); loadTable(); } }; this.btnEdit.addSelectionListener(editListener); SelectionAdapter removeListener = new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { TableItem[] items = JenkinsInstancesPreferencePage.this.table.getSelection(); int[] itemIndices = JenkinsInstancesPreferencePage.this.table.getSelectionIndices(); if (items == null || items.length <= 0) { return; } for (TableItem item : items) { JenkinsInstance ni = (JenkinsInstance) item.getData(); CloudBeesUIPlugin.getDefault().removeJenkinsInstance(ni); } JenkinsInstancesPreferencePage.this.table.remove(itemIndices); } }; this.btnRemove.addSelectionListener(removeListener); loadTable(); return comp; } private void loadTable() { // TODO preserve selection on reload this.table.removeAll(); List<JenkinsInstance> insts = CloudBeesUIPlugin.getDefault().loadManualJenkinsInstances(); Collections.sort(insts, new Comparator<JenkinsInstance>() { public int compare(final JenkinsInstance o1, final JenkinsInstance o2) { return o1.label.compareTo(o2.label); } }); for (JenkinsInstance instance : insts) { TableItem tableItem = new TableItem(this.table, SWT.NONE); tableItem.setText(new String[] { instance.label, instance.url }); tableItem.setData(instance); } if (this.table.getItemCount() > 0) { this.table.setSelection(0); } enableButtons(); } private void enableButtons() { TableItem[] items = this.table.getSelection(); JenkinsInstancesPreferencePage.this.btnEdit.setEnabled(items != null && items.length > 0); JenkinsInstancesPreferencePage.this.btnRemove.setEnabled(items != null && items.length > 0); } }