/*******************************************************************************
* Copyright (c) 2011 Red Hat, Inc.
* Distributed under license by Red Hat, 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.openshift.express.internal.ui.wizard.application;
import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.databinding.fieldassist.ControlDecorationSupport;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.IWizard;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.navigator.INavigatorContentService;
import org.eclipse.ui.navigator.NavigatorContentServiceFactory;
import org.jboss.tools.common.ui.WizardUtils;
import org.jboss.tools.common.ui.databinding.DataBindingUtils;
import org.jboss.tools.common.ui.databinding.ValueBindingBuilder;
import org.jboss.tools.openshift.express.internal.ui.utils.Logger;
import org.jboss.tools.openshift.express.internal.ui.wizard.application.details.ApplicationDetailsDialog;
import org.jboss.tools.openshift.internal.common.ui.databinding.RequiredControlDecorationUpdater;
import org.jboss.tools.openshift.internal.common.ui.wizard.AbstractOpenShiftWizardPage;
import com.openshift.client.IApplication;
/**
* @author Andre Dietisheim
* @author Xavier Coulon
*/
public class SelectApplicationWizardPage extends AbstractOpenShiftWizardPage {
private static final String COMMON_VIEWER_ID = "org.jboss.tools.openshift.express.internal.ui.wizard.application.SelectApplicationWizardPage";
private final SelectApplicationWizardPageModel pageModel;
private TreeViewer applicationsTreeViewer;
public SelectApplicationWizardPage(OpenShiftApplicationWizardModel wizardModel, IWizard wizard) {
super("Select Existing Application", "Please choose the existing application that you want to import.", "Select Existing Application", wizard);
this.pageModel = new SelectApplicationWizardPageModel(wizardModel);
}
@Override
protected void doCreateControls(Composite parent, DataBindingContext dbc) {
GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(parent);
GridLayoutFactory.fillDefaults()
.numColumns(2).applyTo(parent);
Label existingApplicationsLabel = new Label(parent, SWT.NONE);
existingApplicationsLabel.setText("Existing Applications:");
GridDataFactory.fillDefaults()
.align(SWT.LEFT, SWT.CENTER).span(2, 1).applyTo(existingApplicationsLabel);
// applications tree
this.applicationsTreeViewer = createApplicationsTree(parent, dbc);
GridDataFactory.fillDefaults()
.align(SWT.FILL, SWT.FILL).grab(true, true).hint(SWT.DEFAULT, 200).span(1,4)
.applyTo(applicationsTreeViewer.getControl());
Binding selectedApplicationBinding = ValueBindingBuilder
.bind(ViewerProperties.singlePostSelection().observe(applicationsTreeViewer))
.validatingAfterGet(new IValidator() {
@Override
public IStatus validate(Object value) {
if (!(value instanceof IApplication)) {
return ValidationStatus.cancel("Please choose the existing application that you want to import.");
}
return ValidationStatus.ok();
}
})
.to(BeanProperties.value(SelectApplicationWizardPageModel.PROPERTY_SELECTED_APPLICATION).observe(pageModel))
.in(dbc);
ControlDecorationSupport.create(
selectedApplicationBinding, SWT.LEFT | SWT.TOP, null, new RequiredControlDecorationUpdater(true));
// buttons
Button detailsButton = new Button(parent, SWT.PUSH);
detailsButton.setText("De&tails...");
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).hint(80, SWT.DEFAULT)
.applyTo(detailsButton);
DataBindingUtils.bindEnablementToValidationStatus(detailsButton, IStatus.OK, dbc, selectedApplicationBinding);
detailsButton.addSelectionListener(onDetails(dbc));
Control filler = new Label(parent, SWT.NONE);
GridDataFactory.fillDefaults()
.applyTo(filler);
Button refreshButton = new Button(parent, SWT.PUSH);
refreshButton.setText("R&efresh");
GridDataFactory.fillDefaults()
.align(SWT.FILL, SWT.CENTER).applyTo(refreshButton);
refreshButton.addSelectionListener(onRefresh(dbc));
filler = new Label(parent, SWT.NONE);
GridDataFactory.fillDefaults()
.grab(false, true).applyTo(filler);
}
protected TreeViewer createApplicationsTree(Composite parent, DataBindingContext dbc) {
CommonViewer commonViewer =
new CommonViewer(COMMON_VIEWER_ID, parent, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL);
INavigatorContentService contentService =
NavigatorContentServiceFactory.INSTANCE.createContentService(COMMON_VIEWER_ID, commonViewer);
contentService.createCommonContentProvider();
contentService.createCommonLabelProvider();
return commonViewer;
}
@Override
protected void onPageActivated(DataBindingContext dbc) {
pageModel.loadOpenShiftResources();
setViewerInput(pageModel);
}
private SelectionAdapter onRefresh(final DataBindingContext dbc) {
return new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
try {
WizardUtils.runInWizard(new Job("Loading applications...") {
@Override
protected IStatus run(IProgressMonitor monitor) {
pageModel.refresh();
setViewerInput(pageModel);
return Status.OK_STATUS;
}
}, getContainer(), dbc);
} catch (Exception e) {
Logger.error("Failed to refresh applications list", e);
// ignore
}
}
};
}
private SelectionAdapter onDetails(DataBindingContext dbc) {
return new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
new ApplicationDetailsDialog(pageModel.getSelectedApplication(), getShell()).open();
}
};
}
private void setViewerInput(final SelectApplicationWizardPageModel pageModel) {
getShell().getDisplay().syncExec(new Runnable() {
@Override
public void run() {
applicationsTreeViewer.setInput(pageModel.getConnection());
}
});
}
public IApplication getSelectedApplication() {
return pageModel.getSelectedApplication();
}
}