/******************************************************************************* * Copyright (c) 2011 Subgraph. * 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: * Subgraph - initial API and implementation ******************************************************************************/ package com.subgraph.vega.ui.http.builder; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.FontMetrics; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import com.subgraph.vega.api.http.requests.IHttpRequestBuilder; public class RequestAddressEditor extends Composite implements IHttpBuilderPart { private String requestSchemes[] = { "http", "https", }; private IHttpRequestBuilder requestBuilder; private ComboViewer requestScheme; private Text requestHost; private Text requestPort; public RequestAddressEditor(Composite parent, final IHttpRequestBuilder requestBuilder) { super(parent, SWT.NONE); this.requestBuilder = requestBuilder; final GridLayout controlLayout = new GridLayout(3, false); controlLayout.marginWidth = 0; controlLayout.marginHeight = 0; controlLayout.marginLeft = 0; controlLayout.marginTop = 0; controlLayout.marginRight = 0; controlLayout.marginBottom = 0; setLayout(controlLayout); final Composite schemeControl = new Composite(this, SWT.NONE); schemeControl.setLayout(new GridLayout(2, false)); schemeControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); Label label = new Label(schemeControl, SWT.NONE); label.setText("Scheme:"); label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); requestScheme = new ComboViewer(schemeControl, SWT.READ_ONLY); requestScheme.setContentProvider(new ArrayContentProvider()); requestScheme.setLabelProvider(new LabelProvider() { public String getText(Object element) { return (String)element; } }); requestScheme.setInput(requestSchemes); requestScheme.setSelection(new StructuredSelection(requestSchemes[0])); requestScheme.addSelectionChangedListener(createSelectionChangedListenerRequestScheme()); final Composite hostControl = new Composite(this, SWT.NONE); hostControl.setLayout(new GridLayout(2, false)); hostControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); label = new Label(hostControl, SWT.NONE); label.setText("Host:"); label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); requestHost = new Text(hostControl, SWT.BORDER | SWT.SINGLE); requestHost.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); final Composite portControl = new Composite(this, SWT.NONE); portControl.setLayout(new GridLayout(2, false)); portControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); label = new Label(portControl, SWT.NONE); label.setText("Port:"); label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); requestPort = new Text(portControl, SWT.BORDER | SWT.SINGLE); final FontMetrics requestPortFm = new GC(requestPort).getFontMetrics(); GridData requestPortGd = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); requestPortGd.widthHint = requestPortFm.getAverageCharWidth() * 7; requestPort.setLayoutData(requestPortGd); requestPort.addListener(SWT.Verify, new Listener() { public void handleEvent(Event e) { String string = e.text; char[] chars = new char[string.length()]; string.getChars(0, chars.length, chars, 0); for (int i = 0; i < chars.length; i++) { if (!('0' <= chars[i] && chars[i] <= '9')) { e.doit = false; return; } } } }); refresh(); } @Override public Control getControl() { return this; } @Override public void setEditable(boolean editable) { requestScheme.getCombo().setEnabled(editable); requestHost.setEditable(editable); requestPort.setEditable(editable); } @Override public void refresh() { requestScheme.setSelection(new StructuredSelection(requestBuilder.getScheme())); requestHost.setText(requestBuilder.getHost()); requestPort.setText(Integer.toString(requestBuilder.getHostPort())); } @Override public void processContents() { final String scheme = (String)((IStructuredSelection) requestScheme.getSelection()).getFirstElement(); requestBuilder.setScheme(scheme); requestBuilder.setHost(requestHost.getText().trim()); try { requestBuilder.setHostPort(Integer.parseInt(requestPort.getText().trim())); } catch (NumberFormatException e) { throw new IllegalArgumentException("Invalid host port"); } } private ISelectionChangedListener createSelectionChangedListenerRequestScheme() { return new ISelectionChangedListener() { public void selectionChanged(final SelectionChangedEvent e) { final String scheme = (String)((IStructuredSelection)requestScheme.getSelection()).getFirstElement(); if (scheme.equals("https")) { requestPort.setText("443"); } else { requestPort.setText("80"); } } }; } }