/******************************************************************************* * Copyright (c) 2014 Zend Technologies Ltd. * 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 *******************************************************************************/ package org.zend.php.zendserver.deployment.ui.wizards; import org.eclipse.jface.wizard.WizardPage; 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.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.zend.php.zendserver.deployment.core.tunnel.PortForwarding; import org.zend.php.zendserver.deployment.core.tunnel.PortForwarding.Side; import org.zend.php.zendserver.deployment.ui.Activator; /** * Wizard page for creating and editing port forwarding entry. * * @author Wojciech Galanciak, 2014 * */ public class PortForwardingPage extends WizardPage { private ModifyListener modifyListener = new ModifyListener() { public void modifyText(ModifyEvent e) { setPageComplete(validatePage()); updateCommandLabel(); } }; private Combo sideCombo; private Text localAddressText; private Text localPortText; private Text remoteAddressText; private Text remotePortText; private PortForwarding portForwarding; private Label commandLabel; public PortForwardingPage(PortForwarding portForwarding) { super("Port Forwarding Page"); //$NON-NLS-1$ this.portForwarding = portForwarding; setImageDescriptor(Activator .getImageDescriptor(Activator.IMAGE_PORT_FORWARDING_WIZ)); setTitle(portForwarding != null ? Messages.PortForwardingPage_EditTitle : Messages.PortForwardingPage_CreateTitle); setDescription(portForwarding != null ? Messages.PortForwardingPage_EditDesc : Messages.PortForwardingPage_CreateDesc); } public PortForwarding getPortForwarding() { switch (Side.byName(sideCombo.getText())) { case LOCAL: String localAddress = localAddressText.getText(); if (localAddress.isEmpty()) { return PortForwarding.createLocal( Integer.valueOf(localPortText.getText()), remoteAddressText.getText(), Integer.valueOf(remotePortText.getText())); } return PortForwarding.createLocal(localAddressText.getText(), Integer.valueOf(localPortText.getText()), remoteAddressText.getText(), Integer.valueOf(remotePortText.getText())); case REMOTE: String remoteAddress = remoteAddressText.getText(); if (remoteAddress.isEmpty()) { return PortForwarding.createRemote( Integer.valueOf(remotePortText.getText()), localAddressText.getText(), Integer.valueOf(localPortText.getText())); } return PortForwarding.createRemote(remoteAddressText.getText(), Integer.valueOf(remotePortText.getText()), localAddressText.getText(), Integer.valueOf(localPortText.getText())); } return portForwarding; } public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); composite.setLayout(new GridLayout(2, false)); Label label = new Label(composite, SWT.NONE); label.setText(Messages.PortForwardingPage_SideLabel); sideCombo = new Combo(composite, SWT.READ_ONLY); sideCombo.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { setPageComplete(validatePage()); if (isPageComplete()) { updateCommandLabel(); } } }); localAddressText = createText( Messages.PortForwardingPage_LocalAddressLabel, composite); localPortText = createText(Messages.PortForwardingPage_LocalPortLabel, composite); remoteAddressText = createText( Messages.PortForwardingPage_RemoteAddressLabel, composite); remotePortText = createText( Messages.PortForwardingPage_RemotePortLabel, composite); label = new Label(composite, SWT.NONE); label = new Label(composite, SWT.NONE); label.setText(Messages.PortForwardingPage_ResultLabel); label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); commandLabel = new Label(composite, SWT.NONE); commandLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); commandLabel.setText(Messages.PortForwardingPage_ProvideMessage); setControl(composite); init(); setPageComplete(validatePage()); } private boolean validatePage() { setMessage(null); setErrorMessage(null); Side side = Side.byName(sideCombo.getText()); if (localAddressText.getText().isEmpty() && side == Side.REMOTE) { setMessage(Messages.PortForwardingPage_SpecifyLocalAddressMessage); return false; } if (localPortText.getText().isEmpty()) { setMessage(Messages.PortForwardingPage_SpecifyLocalPortMessage); return false; } else { try { Integer.valueOf(localPortText.getText()); } catch (NumberFormatException e) { setErrorMessage(Messages.PortForwardingPage_InvalidLocalPortError); return false; } } if (remoteAddressText.getText().isEmpty() && side == Side.LOCAL) { setMessage(Messages.PortForwardingPage_SpecifyRemoteAddressMessage); return false; } if (remotePortText.getText().isEmpty()) { setMessage(Messages.PortForwardingPage_SpecifyRemotePortMessage); return false; } else { try { Integer.valueOf(remotePortText.getText()); } catch (NumberFormatException e) { setErrorMessage(Messages.PortForwardingPage_InvalidRemotePortError); return false; } } return true; } private void init() { Side[] sides = Side.values(); for (Side side : sides) { sideCombo.add(side.getName()); } sideCombo.select(0); if (portForwarding != null) { sideCombo.select(sideCombo.indexOf(portForwarding.getSide() .getName())); String localAddress = portForwarding.getLocalAddress(); if (localAddress != null) { localAddressText.setText(localAddress); } localPortText .setText(String.valueOf(portForwarding.getLocalPort())); String remoteAddress = portForwarding.getRemoteAddress(); if (remoteAddress != null) { remoteAddressText.setText(remoteAddress); } remotePortText.setText(String.valueOf(portForwarding .getRemotePort())); } } private void updateCommandLabel() { if (isPageComplete()) { PortForwarding forwarding = getPortForwarding(); if (forwarding != null) { commandLabel.setText("ssh " + forwarding.serialize()); //$NON-NLS-1$ return; } } commandLabel.setText(Messages.PortForwardingPage_ProvideMessage); } private Text createText(String name, Composite parent) { Label label = new Label(parent, SWT.NONE); label.setText(name); Text text = new Text(parent, SWT.BORDER); text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); text.addModifyListener(modifyListener); return text; } }