/*******************************************************************************
* Copyright (c) 2015 Red Hat Inc..
* 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:
* Red Hat Incorporated - initial API and implementation
*******************************************************************************/
package org.jboss.tools.openshift.internal.ui.server;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import org.eclipse.core.runtime.CoreException;
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.dialogs.IPageChangingListener;
import org.eclipse.jface.dialogs.PageChangingEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.wst.server.core.TaskModel;
import org.eclipse.wst.server.ui.wizard.IWizardHandle;
import org.eclipse.wst.server.ui.wizard.WizardFragment;
import org.jboss.ide.eclipse.as.ui.editor.DeploymentTypeUIUtil.ICompletable;
import org.jboss.tools.common.ui.WizardUtils;
import org.jboss.tools.openshift.core.connection.Connection;
import org.jboss.tools.openshift.internal.common.ui.OpenShiftCommonImages;
import org.jboss.tools.openshift.internal.common.ui.connection.ConnectionWizardPageModel;
import org.jboss.tools.openshift.internal.common.ui.utils.UIUtils;
/**
* @author Andre Dietisheim
*/
public class ServerSettingsWizardFragment extends WizardHandleAwareFragment implements ICompletable {
static final String IS_LOADING_SERVICES = "isLoadingServices";
private PropertyChangeListener connectionChangeListener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
final IWizardContainer wizardContainer = getWizardContainer();
if(serverSettingsWizardPage == null
|| serverSettingsWizardPage.getModel() == null
|| wizardContainer == null) {
//nothing to update;
return;
}
if(ConnectionWizardPageModel.PROPERTY_SELECTED_CONNECTION.equals(evt.getPropertyName())) {
if(evt.getNewValue() == null || evt.getNewValue() instanceof Connection) {
Connection newConnection = (Connection)evt.getNewValue();
if(newConnection != serverSettingsWizardPage.getModel().getConnection() && wizardContainer != null) {
serverSettingsWizardPage.needsLoadingResources = true;
serverSettingsWizardPage.getModel().setConnection(newConnection);
serverSettingsWizardPage.getModel().setResourceItems(new ArrayList<>());
serverSettingsWizardPage.setComplete(false);
wizardContainer.updateButtons();
}
} else {
//do nothing
}
} else if(ConnectionWizardPageModel.PROPERTY_CONNECTED_STATUS.equals(evt.getPropertyName())) {
serverSettingsWizardPage.needsLoadingResources = true;
serverSettingsWizardPage.getModel().setResourceItems(new ArrayList<>());
serverSettingsWizardPage.setComplete(false);
wizardContainer.updateButtons();
}
}
};
private ServerSettingsWizardPageWrapper serverSettingsWizardPage;
/**
* Constructor.
*/
public ServerSettingsWizardFragment() {
// no finishing wizard before input provided in this page
setComplete(false);
}
/**
* @return the connection change listener to update the widgets if the
* connection selection changed in the
* {@link ConnectionWizardFragment}.
*/
public PropertyChangeListener getConnectionChangeListener() {
return connectionChangeListener;
}
@Override
public boolean hasComposite() {
return true;
}
@Override
public void performFinish(IProgressMonitor monitor) throws CoreException {
if(serverSettingsWizardPage != null) {
serverSettingsWizardPage.updateServer();
serverSettingsWizardPage.unhook();
}
super.performFinish(monitor); //only removes handle, it should be done after successful update only.
}
@Override
public void performCancel(IProgressMonitor monitor) throws CoreException {
if(serverSettingsWizardPage != null) {
serverSettingsWizardPage.unhook();
}
super.performCancel(monitor);
}
/**
* Exposing the protected method {@link WizardFragment#setComplete} in the API by the {@link ICompletable} interface
*/
@Override
public void setComplete(boolean complete) {
super.setComplete(complete);
}
@Override
public boolean isComplete() {
return this.serverSettingsWizardPage != null
&& !this.serverSettingsWizardPage.isLoadingResources()
&& !this.serverSettingsWizardPage.isNeedsLoadingResources()
&& this.serverSettingsWizardPage.getModel().getResource() != null
&& serverSettingsWizardPage.isPageComplete();
}
@Override
public Composite createComposite(final Composite parent, final IWizardHandle handle) {
setHandle(handle);
this.serverSettingsWizardPage = createServerSettingsWizardPage(parent, handle);
updateWizardHandle(handle, this.serverSettingsWizardPage);
WizardFragmentUtils.getWizardDialog(handle).addPageChangingListener(onPageChanging());
return (Composite) this.serverSettingsWizardPage.getControl();
}
private ServerSettingsWizardPageWrapper createServerSettingsWizardPage(final Composite parent, final IWizardHandle handle) {
final ServerSettingsWizardPageWrapper serverSettingsWizardPage = new ServerSettingsWizardPageWrapper(handle, getTaskModel());
serverSettingsWizardPage.getModel().addPropertyChangeListener(connectionChangeListener);
serverSettingsWizardPage.createControl(parent);
return serverSettingsWizardPage;
}
private void updateWizardHandle(final IWizardHandle handle, final ServerSettingsWizardPageWrapper serverSettingsWizardPage) {
handle.setTitle(serverSettingsWizardPage.getTitle());
handle.setDescription(serverSettingsWizardPage.getDescription());
handle.setImageDescriptor(OpenShiftCommonImages.OPENSHIFT_LOGO_WHITE_MEDIUM);
}
private IPageChangingListener onPageChanging() {
return new IPageChangingListener() {
@Override
public void handlePageChanging(PageChangingEvent event) {
if(serverSettingsWizardPage != null) {
serverSettingsWizardPage.reloadServices();
}
}
};
}
protected ModifyListener onFilterTextModified(final TreeViewer applicationTemplatesViewer) {
return new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
applicationTemplatesViewer.refresh();
applicationTemplatesViewer.expandAll();
}
};
}
class ServerSettingsWizardPageWrapper extends ServerSettingsWizardPage {
private IWizardHandle wizardHandle;
private ServerSettingsWizardPageWrapper(final IWizardHandle wizardHandle, final TaskModel taskModel) {
super(((IWizardPage) wizardHandle).getWizard(),
OpenShiftServerTaskModelAccessor.getServer(taskModel),
OpenShiftServerTaskModelAccessor.getConnection(taskModel),
UIUtils.getFirstSelectedWorkbenchProject());
this.wizardHandle = wizardHandle;
}
boolean isWizardDisposed() {
return getContainer() == null
|| getContainer().getShell() == null
|| getContainer().getShell().isDisposed();
}
@Override
public void setPageComplete(boolean complete) {
super.setPageComplete(complete);
if(!isWizardDisposed()) {
wizardHandle.update();
}
}
@Override
public void setErrorMessage(String newMessage) {
if(!isWizardDisposed()) {
((WizardPage) wizardHandle).setErrorMessage(newMessage);
}
}
@Override
public void setMessage(String newMessage, int newType) {
if(!isWizardDisposed()) {
wizardHandle.setMessage(newMessage, newType);
}
}
public void onPageWillGetDeactivated(Direction direction, PageChangingEvent event) {
onPageWillGetDeactivated(direction, event, null);
}
void reloadServices() {
final IWizardContainer container = getContainer();
if(!needsLoadingResources || container == null) {
return;
}
try {
this.isLoadingResources = true;
getTaskModel().putObject(IS_LOADING_SERVICES, isLoadingResources);
container.updateButtons();
WizardUtils.runInWizard(new Job("Loading services...") {
@Override
protected IStatus run(IProgressMonitor monitor) {
//only reload services.
if(!isWizardDisposed()) {
ServerSettingsWizardPageWrapper.this.model.loadResources();
ServerSettingsWizardPageWrapper.this.needsLoadingResources = false;
}
return Status.OK_STATUS;
}
}, container);
} catch (InvocationTargetException | InterruptedException e) {
// swallow intentionally
} finally {
this.needsLoadingResources = false;
this.isLoadingResources = false;
getTaskModel().putObject(IS_LOADING_SERVICES, isLoadingResources);
if(!isWizardDisposed()) {
container.updateButtons();
}
}
}
void unhook() {
uiHook = null;
model = null;
}
}
}