| /* |
| * Copyright 2010 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.devmodeoptions.client; |
| |
| import com.google.gwt.core.client.EntryPoint; |
| import com.google.gwt.core.client.GWT; |
| import com.google.gwt.core.client.JavaScriptObject; |
| import com.google.gwt.core.client.JsArray; |
| import com.google.gwt.dom.client.StyleInjector; |
| import com.google.gwt.event.dom.client.ClickEvent; |
| import com.google.gwt.event.dom.client.ClickHandler; |
| import com.google.gwt.event.dom.client.KeyCodes; |
| import com.google.gwt.event.dom.client.KeyPressEvent; |
| import com.google.gwt.event.dom.client.KeyPressHandler; |
| import com.google.gwt.uibinder.client.UiBinder; |
| import com.google.gwt.uibinder.client.UiField; |
| import com.google.gwt.user.client.Window.Location; |
| import com.google.gwt.user.client.ui.Button; |
| import com.google.gwt.user.client.ui.FlexTable; |
| import com.google.gwt.user.client.ui.Label; |
| import com.google.gwt.user.client.ui.RadioButton; |
| import com.google.gwt.user.client.ui.RootLayoutPanel; |
| import com.google.gwt.user.client.ui.TextBox; |
| import com.google.gwt.user.client.ui.Widget; |
| |
| /** |
| * The options page for configuring the set of hosts permitted to use the GWT |
| * Developer Plugin. |
| */ |
| public class DevModeOptions implements EntryPoint { |
| |
| interface Binder extends UiBinder<Widget, DevModeOptions> { |
| } |
| |
| private static final DevModeOptionsResources bundle = GWT.create(DevModeOptionsResources.class); |
| |
| @UiField |
| Button addBtn; |
| |
| @UiField |
| Label errorMessage; |
| |
| @UiField |
| TextBox hostname; |
| |
| @UiField |
| TextBox codeserver; |
| |
| JsArray<HostEntry> hosts; |
| |
| @UiField |
| RadioButton includeNo; |
| |
| @UiField |
| RadioButton includeYes; |
| |
| @UiField |
| FlexTable savedHosts; |
| |
| public void onModuleLoad() { |
| StyleInjector.inject(bundle.css().getText(), true); |
| RootLayoutPanel.get().add( |
| GWT.<Binder> create(Binder.class).createAndBindUi(this)); |
| |
| hosts = HostEntryStorage.get().getHostEntries(); |
| |
| addBtn.addClickHandler(new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| addHost(HostEntry.create(hostname.getText() + "/" |
| + getCodeServer(codeserver), |
| includeYes.getValue())); |
| } |
| }); |
| |
| hostname.setFocus(true); |
| String host = Location.getParameter("host"); |
| if (host != null) { |
| hostname.setText(host); |
| } |
| |
| String code = Location.getParameter("codeserver"); |
| if (code != null) { |
| codeserver.setText(code); |
| } else { |
| //default for users entering through options |
| codeserver.setText("localhost"); |
| } |
| |
| hostname.addKeyPressHandler(new KeyPressHandler() { |
| public void onKeyPress(KeyPressEvent event) { |
| if (event.getCharCode() == KeyCodes.KEY_ENTER) { |
| addHost(HostEntry.create(hostname.getText() + "/" |
| + getCodeServer(codeserver), |
| includeYes.getValue())); |
| } |
| } |
| }); |
| |
| codeserver.addKeyPressHandler(new KeyPressHandler() { |
| public void onKeyPress(KeyPressEvent event) { |
| if (event.getCharCode() == KeyCodes.KEY_ENTER) { |
| addHost(HostEntry.create(hostname.getText() + "/" |
| + getCodeServer(codeserver), |
| includeYes.getValue())); |
| } |
| } |
| }); |
| |
| savedHosts.setText(0, 0, "Web server"); |
| savedHosts.setText(0, 1, "Code server"); |
| savedHosts.setText(0, 2, "Include/Exclude"); |
| savedHosts.setText(0, 3, "Remove"); |
| savedHosts.getCellFormatter().addStyleName(0, 0, |
| bundle.css().savedHostsHeading()); |
| savedHosts.getCellFormatter().addStyleName(0, 0, bundle.css().textCol()); |
| |
| savedHosts.getCellFormatter().addStyleName(0, 1, |
| bundle.css().savedHostsHeading()); |
| savedHosts.getCellFormatter().addStyleName(0, 1, bundle.css().textCol()); |
| |
| savedHosts.getCellFormatter().addStyleName(0, 2, |
| bundle.css().savedHostsHeading()); |
| |
| savedHosts.getCellFormatter().addStyleName(0, 3, |
| bundle.css().savedHostsHeading()); |
| |
| for (int i = 0; i < hosts.length(); i++) { |
| displayHost(hosts.get(i)); |
| } |
| } |
| |
| private void addHost(final HostEntry newHost) { |
| if (newHost.getUrl().length() == 0) { |
| return; |
| } |
| |
| boolean alreadyExists = false; |
| for (int i = 0; i < hosts.length() && !alreadyExists; i++) { |
| if (hosts.get(i).isEqual(newHost)) { |
| alreadyExists = true; |
| } |
| } |
| |
| if (alreadyExists) { |
| error("Cannot add duplicate host entry for " + newHost.getUrl()); |
| return; |
| } else { |
| hosts.push(newHost); |
| clearError(); |
| } |
| HostEntryStorage.get().saveEntries(hosts); |
| |
| displayHost(newHost); |
| |
| codeserver.setText(""); |
| hostname.setText(""); |
| hostname.setFocus(true); |
| } |
| |
| private void clearError() { |
| errorMessage.setText(""); |
| } |
| |
| private void displayHost(final HostEntry newHost) { |
| int numRows = savedHosts.getRowCount(); |
| int col = 0; |
| |
| String[] names = newHost.getUrl().split("/"); |
| |
| savedHosts.insertRow(numRows); |
| savedHosts.setText(numRows, col++, names[0]); |
| savedHosts.setText(numRows, col++, names.length > 0 ? names[1] |
| : "localhost"); |
| savedHosts.setText(numRows, col++, newHost.include() ? "Include" |
| : "Exclude"); |
| if (newHost.include()) { |
| savedHosts.getCellFormatter().addStyleName(numRows, 0, |
| bundle.css().include()); |
| savedHosts.getCellFormatter().addStyleName(numRows, 1, |
| bundle.css().include()); |
| savedHosts.getCellFormatter().addStyleName(numRows, 2, |
| bundle.css().include()); |
| } else { |
| savedHosts.getCellFormatter().addStyleName(numRows, 0, |
| bundle.css().exclude()); |
| savedHosts.getCellFormatter().addStyleName(numRows, 1, |
| bundle.css().exclude()); |
| savedHosts.getCellFormatter().addStyleName(numRows, 2, |
| bundle.css().exclude()); |
| } |
| |
| Button removeHostButton = new Button("x"); |
| removeHostButton.addClickHandler(new ClickHandler() { |
| public void onClick(ClickEvent event) { |
| removeHost(newHost); |
| } |
| }); |
| savedHosts.setWidget(numRows, col, removeHostButton); |
| } |
| |
| private void error(String text) { |
| errorMessage.setText(text); |
| } |
| |
| private void removeHost(HostEntry host) { |
| JsArray<HostEntry> newHosts = JavaScriptObject.createArray().cast(); |
| for (int index = 0; index < hosts.length(); index++) { |
| if (hosts.get(index).isEqual(host)) { |
| savedHosts.removeRow(index + 1); |
| } else { |
| newHosts.push(hosts.get(index)); |
| } |
| } |
| |
| hosts = newHosts; |
| HostEntryStorage.get().saveEntries(hosts); |
| } |
| |
| private String getCodeServer(TextBox box) { |
| return (box.getText().length() > 0) ? box.getText() : "localhost"; |
| } |
| |
| } |