/******************************************************************************* * Copyright (c) 2012 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.express.internal.ui.server; import java.util.Arrays; import java.util.List; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.internal.ide.dialogs.ResourceComparator; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.wst.server.core.IServerWorkingCopy; import org.eclipse.wst.server.ui.editor.ServerEditorSection; import org.eclipse.wst.server.ui.internal.editor.ServerEditorPartInput; import org.jboss.ide.eclipse.as.ui.UIUtil; import org.jboss.ide.eclipse.as.ui.editor.ServerWorkingCopyPropertyComboCommand; import org.jboss.ide.eclipse.as.wtp.ui.editor.ServerWorkingCopyPropertyButtonCommand; import org.jboss.ide.eclipse.as.wtp.ui.editor.ServerWorkingCopyPropertyCommand; import org.jboss.tools.openshift.common.core.connection.ConnectionURL; import org.jboss.tools.openshift.common.core.utils.StringUtils; import org.jboss.tools.openshift.express.internal.core.connection.ExpressConnection; import org.jboss.tools.openshift.express.internal.core.server.ExpressServerUtils; import org.jboss.tools.openshift.express.internal.ui.ExpressUIMessages; /** * @author Rob Stryker */ public class ExpressServerEditorSection extends ServerEditorSection { private static final String DEFAULT_HOST_MARKER = " (default)"; private IEditorInput input; protected Text connectionText, remoteText; protected Text deployFolderText; protected Text appNameText; protected Text domainNameText; protected Combo deployProjectCombo; protected Button verifyButton, browseDestButton, overrideProjectSettings; protected Group projectSettingGroup; @Override public void init(IEditorSite site, IEditorInput input) { super.init(site, input); this.input = input; } @Override public void createSection(Composite parent) { super.createSection(parent); FormToolkit toolkit = new FormToolkit(parent.getDisplay()); Section section = toolkit.createSection(parent, ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED | ExpandableComposite.TITLE_BAR); section.setText("OpenShift Server Adapter"); section.setLayoutData(new GridData( GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL)); Composite c = toolkit.createComposite(section, SWT.NONE); GridLayoutFactory.fillDefaults() .numColumns(2).equalWidth(true).applyTo(c); createWidgets(c, toolkit); toolkit.paintBordersFor(c); toolkit.adapt(c); section.setClient(c); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { initWidgets(); addListeners(); } }); } protected void initWidgets() { // Set the widgets deployProjectCombo.setEnabled(true); ConnectionURL connectionUrl = ExpressServerUtils.getConnectionUrl(server); connectionText.setText(createConnectionLabel(connectionUrl)); String domainName = ExpressServerUtils.getDomainName(server); domainNameText.setText(StringUtils.null2emptyString(domainName)); String appName = ExpressServerUtils.getApplicationName(server); appNameText.setText(StringUtils.null2emptyString(appName)); connectionText.setEnabled(false); domainNameText.setEnabled(false); appNameText.setEnabled(false); deployFolderText.setText(StringUtils.null2emptyString(ExpressServerUtils.getDeployFolder(server))); String remote = ExpressServerUtils.getRemoteName(server); remoteText.setText(StringUtils.null2emptyString(remote)); deployProjectCombo.setItems(getSuitableProjects()); int index = getProjectIndex( ExpressServerUtils.getDeployProjectName(server), Arrays.asList(deployProjectCombo.getItems())); if (index > -1) { deployProjectCombo.select(index); } boolean overrides = ExpressServerUtils.isOverridesProject(server); overrideProjectSettings.setSelection(overrides); remoteText.setEnabled(overrides); deployFolderText.setEnabled(overrides); browseDestButton.setEnabled(overrides); } private int getProjectIndex(String deployProject, List<String> deployProjectNames) { if (deployProject == null) { return -1; } return deployProjectNames.indexOf(deployProject); } private String createConnectionLabel(ConnectionURL connectionUrl) { String connectionLabel = ""; if (connectionUrl != null) { ExpressConnection connection = new ExpressConnection(connectionUrl.getUsername(), connectionUrl.getHost()); StringBuilder builder = new StringBuilder(connection.getUsername()).append(" - ").append(connection.getHost()); if (connectionUrl.isDefaultHost()) { builder.append(DEFAULT_HOST_MARKER); } connectionLabel = builder.toString(); } return connectionLabel; } private String[] getSuitableProjects() { IProject[] allProjects = ExpressServerUtils.getAllOpenshiftProjects(); String[] allProjectNames = new String[allProjects.length]; for (int i = 0; i < allProjects.length; i++) { allProjectNames[i] = allProjects[i].getName(); } return allProjectNames; } protected Composite createComposite(Section section) { createWidgets(section, new FormToolkit(section.getDisplay())); return section; } private void createWidgets(Composite composite, FormToolkit toolkit) { GridLayoutFactory.fillDefaults() .numColumns(2).equalWidth(false).applyTo(composite); Label deployLocationLabel = toolkit.createLabel(composite, ExpressUIMessages.EditorSectionDeployLocLabel, SWT.NONE); deployProjectCombo = new Combo(composite, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, false).applyTo(deployProjectCombo); projectSettingGroup = new Group(composite, SWT.NONE); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, false).span(2, 1) .applyTo(projectSettingGroup); projectSettingGroup.setLayout(new GridLayout(2, false)); projectSettingGroup.setText(ExpressUIMessages.EditorSectionProjectSettingsGroup); overrideProjectSettings = toolkit.createButton(projectSettingGroup, ExpressUIMessages.EditorSectionOverrideProjectSettings, SWT.CHECK); GridDataFactory.fillDefaults() .align(SWT.FILL, SWT.FILL).grab(true, false).span(2, 1).applyTo(overrideProjectSettings); // connection Label connectionLabel = toolkit .createLabel(projectSettingGroup, ExpressUIMessages.EditorSectionConnectionLabel, SWT.NONE); GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).applyTo(connectionLabel); connectionText = toolkit.createText(projectSettingGroup, "", SWT.SINGLE | SWT.BORDER); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, false).applyTo(connectionText); // domain name Label domainNameLabel = toolkit.createLabel( projectSettingGroup, ExpressUIMessages.EditorSectionDomainNameLabel, SWT.NONE); GridDataFactory.fillDefaults() .align(SWT.LEFT, SWT.CENTER).applyTo(domainNameLabel); domainNameText = toolkit.createText(projectSettingGroup, "", SWT.SINGLE | SWT.BORDER); GridDataFactory.fillDefaults() .align(SWT.FILL, SWT.FILL).grab(true, false).applyTo(domainNameText); // application name Label appNameLabel = toolkit.createLabel( projectSettingGroup, ExpressUIMessages.EditorSectionAppNameLabel,SWT.NONE); GridDataFactory.fillDefaults() .align(SWT.LEFT, SWT.CENTER).applyTo(appNameLabel); appNameText = toolkit.createText(projectSettingGroup, "", SWT.SINGLE | SWT.BORDER); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, false).applyTo(appNameText); Label outputDestLabel = toolkit.createLabel(projectSettingGroup, ExpressUIMessages.EditorSectionOutputDestLabel, SWT.NONE); Composite outputDestComposite = toolkit.createComposite(projectSettingGroup, SWT.NONE); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, false).applyTo(outputDestComposite); outputDestComposite.setLayout(new FormLayout()); browseDestButton = toolkit.createButton( outputDestComposite, ExpressUIMessages.EditorSectionBrowseDestButton, SWT.PUSH); browseDestButton.setLayoutData(UIUtil.createFormData2(0, 5, 100, -5, null, 0, 100, 0)); deployFolderText = toolkit.createText(outputDestComposite, "", SWT.SINGLE | SWT.BORDER); deployFolderText.setLayoutData(UIUtil.createFormData2(0, 5, 100, -5, 0, 0, browseDestButton, -5)); Label remoteLabel = toolkit.createLabel( projectSettingGroup, ExpressUIMessages.EditorSectionRemoteLabel, SWT.NONE); GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).applyTo(remoteLabel); remoteText = toolkit.createText(projectSettingGroup, "", SWT.SINGLE | SWT.BORDER); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, false).applyTo(remoteText); } ModifyListener remoteModifyListener, deployDestinationModifyListener, deployProjectListener; SelectionListener overrideListener; protected void addListeners() { deployProjectListener = new ModifyListener() { @Override public void modifyText(ModifyEvent e) { int ind = deployProjectCombo.getSelectionIndex(); String newVal = ind == -1 ? null : deployProjectCombo.getItem(ind); ((ServerEditorPartInput) input).getServerCommandManager().execute( new SetProjectCommand(server, newVal)); } }; deployProjectCombo.addModifyListener(deployProjectListener); overrideListener = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { ((ServerEditorPartInput) input).getServerCommandManager().execute(new SetOverrideCommand(server)); } }; overrideProjectSettings.addSelectionListener(overrideListener); remoteModifyListener = new ModifyListener() { @Override public void modifyText(ModifyEvent e) { ((ServerEditorPartInput) input).getServerCommandManager().execute(new SetRemoteCommand(server)); } }; remoteText.addModifyListener(remoteModifyListener); deployDestinationModifyListener = new ModifyListener() { @Override public void modifyText(ModifyEvent e) { ((ServerEditorPartInput) input).getServerCommandManager().execute(new SetDeployFolderCommand(server)); } }; deployFolderText.addModifyListener(deployDestinationModifyListener); browseDestButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { browsePressed(); } }); } private void browsePressed() { IFolder f = chooseFolder(); if (f != null) { deployFolderText.setText(f.getFullPath().removeFirstSegments(1).makeRelative().toOSString()); } } private IFolder chooseFolder() { String depProject = ExpressServerUtils.getDeployProjectName(server); IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(depProject); ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(Display.getDefault().getActiveShell(), new WorkbenchLabelProvider(), new WorkbenchContentProvider()); dialog.setTitle("Deploy Location"); dialog.setMessage("Please choose a location to put zipped projects"); dialog.setInput(p); dialog.setComparator(new ResourceComparator(ResourceComparator.NAME)); IResource res = p.findMember(new Path( StringUtils.null2emptyString(ExpressServerUtils.getDeployFolder(server)))); if (res != null) dialog.setInitialSelection(res); if (dialog.open() == Window.OK) return (IFolder) dialog.getFirstResult(); return null; } public class SetRemoteCommand extends ServerWorkingCopyPropertyCommand { public SetRemoteCommand(IServerWorkingCopy server) { super(server, "Change Remote Name", remoteText, remoteText.getText(), ExpressServerUtils.ATTRIBUTE_REMOTE_NAME, remoteModifyListener, ExpressServerUtils.ATTRIBUTE_REMOTE_NAME_DEFAULT); } } public class SetProjectCommand extends ServerWorkingCopyPropertyComboCommand { public SetProjectCommand(IServerWorkingCopy wc, String newVal) { super(wc, "Change OpenShift Project", deployProjectCombo, newVal, ExpressServerUtils.ATTRIBUTE_DEPLOY_PROJECT, deployProjectListener); } @Override protected void postOp(int type) { updateWidgetsFromWorkingCopy(); } } public class SetDeployFolderCommand extends ServerWorkingCopyPropertyCommand { public SetDeployFolderCommand(IServerWorkingCopy server) { super(server, "Change Deployment Folder", deployFolderText, deployFolderText.getText(), ExpressServerUtils.ATTRIBUTE_DEPLOY_FOLDER_NAME, deployDestinationModifyListener, ExpressServerUtils.getDefaultDeployFolder(server)); } } public class SetOverrideCommand extends ServerWorkingCopyPropertyButtonCommand { public SetOverrideCommand(IServerWorkingCopy wc) { super(wc, "Override OpenShift Project Settings Command", overrideProjectSettings, overrideProjectSettings.getSelection(), ExpressServerUtils.ATTRIBUTE_OVERRIDE_PROJECT_SETTINGS, overrideListener); } @Override protected void postOp(int type) { updateWidgetsFromWorkingCopy(); } } private void updateWidgetsFromWorkingCopy() { ConnectionURL connectionUrl = ExpressServerUtils.getConnectionUrl(server); connectionText.setText(createConnectionLabel(connectionUrl)); String appName = ExpressServerUtils.getApplicationName(server); appNameText.setText(StringUtils.null2emptyString(appName)); String domainName = ExpressServerUtils.getDomainName(server); domainNameText.setText(StringUtils.null2emptyString(domainName)); browseDestButton.setEnabled(overrideProjectSettings.getSelection()); deployFolderText.setEnabled(overrideProjectSettings.getSelection()); remoteText.setEnabled(overrideProjectSettings.getSelection()); String remote = ExpressServerUtils.getRemoteName(server, ExpressServerUtils.SETTING_FROM_PROJECT); String depFolder = ExpressServerUtils.getDeployFolder(server, ExpressServerUtils.SETTING_FROM_PROJECT); remoteText.removeModifyListener(remoteModifyListener); deployFolderText.removeModifyListener(deployDestinationModifyListener); remoteText.setText(StringUtils.null2emptyString(remote)); deployFolderText.setText(StringUtils.null2emptyString(depFolder)); remoteText.addModifyListener(remoteModifyListener); deployFolderText.addModifyListener(deployDestinationModifyListener); } }