/*******************************************************************************
* 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.wizard;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import com.cloudbees.eclipse.core.CloudBeesCorePlugin;
import com.cloudbees.eclipse.core.CloudBeesException;
import com.cloudbees.eclipse.core.domain.JenkinsInstance;
import com.cloudbees.eclipse.core.jenkins.api.JenkinsJobsResponse.Job;
public abstract class NewJenkinsJobComposite extends Composite {
private static final String GROUP_LABEL = "Jenkins";
private static final String JENKINS_JOB_CHECK_LABEL = "New Jenkins job";
private static final String JOB_NAME_LABEL = "Job Name:";
public static final String ERR_JOB_NAME = "Please provide a job name";
public static final String ERR_JENKINS_INSTANCE = "Jenkins service not enabled for this account.";
public static final String ERR_DUPLICATE_JOB_NAME = "Please specify another job name to avoid overriding an existing job configuration";
//private JenkinsInstance jenkinsInstance;
private final Map<String, List<Job>> jobs;
private Button makeJobCheck;
private Label jobNameLabel;
private Text jobNameText;
private final Group group;
private JenkinsInstance jenkinsInstance;
public NewJenkinsJobComposite(Composite parent) {
super(parent, SWT.NONE);
this.jobs = new HashMap<String, List<Job>>();
FillLayout layout = new FillLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.spacing = 0;
setLayout(layout);
this.group = new Group(this, SWT.NONE);
this.group.setText(GROUP_LABEL);
this.group.setLayout(new GridLayout(2, false));
createComponents();
}
public String getJobNameText() {
if (this.jobNameText == null) {
return null;
}
return this.jobNameText.getText();
}
public void setJobNameText(String text) {
this.jobNameText.setText(text);
}
public boolean isMakeNewJob() {
return this.makeJobCheck != null && this.makeJobCheck.getSelection();
}
public JenkinsInstance getJenkinsInstance() {
if (jenkinsInstance == null) {
try {
List<JenkinsInstance> instances = CloudBeesCorePlugin.getDefault().getGrandCentralService()
.loadDevAtCloudInstances(new NullProgressMonitor());
if (instances != null) {
Iterator<JenkinsInstance> it = instances.iterator();
if (it.hasNext()) {
jenkinsInstance = it.next();
}
}
} catch (CloudBeesException e) {
// safetoignore
}
}
return this.jenkinsInstance;
}
public List<Job> getInstanceJobs(JenkinsInstance instance) {
if (!this.jobs.containsKey(instance.id)) {
this.jobs.put(instance.id, loadJobs(instance));
}
return this.jobs.get(instance.id);
}
public void addJobCheckListener(SelectionListener listener) {
if (listener != null && this.makeJobCheck != null) {
this.makeJobCheck.addSelectionListener(listener);
}
}
protected void createJobCheck() {
GridData data = new GridData();
data.horizontalSpan = 2;
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = SWT.LEFT;
this.makeJobCheck = new Button(this.group, SWT.CHECK);
this.makeJobCheck.setText(JENKINS_JOB_CHECK_LABEL);
this.makeJobCheck.setSelection(false);
this.makeJobCheck.setLayoutData(data);
this.makeJobCheck.addSelectionListener(new MakeJenkinsJobSelectionListener());
}
protected void createInstanceChooser() {
GridData data = new GridData();
data.verticalAlignment = SWT.CENTER;
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = SWT.FILL;
}
protected void createJobText() {
GridData data = new GridData();
data.verticalAlignment = SWT.CENTER;
this.jobNameLabel = new Label(this.group, SWT.NULL);
this.jobNameLabel.setLayoutData(data);
this.jobNameLabel.setText(JOB_NAME_LABEL);
this.jobNameLabel.setEnabled(this.makeJobCheck == null);
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = SWT.FILL;
this.jobNameText = new Text(this.group, SWT.BORDER | SWT.SINGLE);
this.jobNameText.setLayoutData(data);
this.jobNameText.setEnabled(this.makeJobCheck == null);
this.jobNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validate();
}
});
}
protected abstract void createComponents();
protected abstract void validate();
protected abstract JenkinsInstance[] loadJenkinsInstances();
protected abstract List<Job> loadJobs(JenkinsInstance instance);
private class MakeJenkinsJobSelectionListener implements SelectionListener {
public void widgetSelected(SelectionEvent e) {
handleEvent();
}
public void widgetDefaultSelected(SelectionEvent e) {
handleEvent();
}
private void handleEvent() {
boolean selected = isMakeNewJob();
NewJenkinsJobComposite.this.jobNameText.setEnabled(selected);
NewJenkinsJobComposite.this.jobNameLabel.setEnabled(selected);
validate();
}
}
}