package edu.washington.cs.oneswarm.ui.gwt.client.newui.settings; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.widgetideas.client.ProgressBar; import edu.washington.cs.oneswarm.ui.gwt.client.OneSwarmGWT; import edu.washington.cs.oneswarm.ui.gwt.client.OneSwarmRPCClient; import edu.washington.cs.oneswarm.ui.gwt.client.i18n.OSMessages; import edu.washington.cs.oneswarm.ui.gwt.client.newui.OneSwarmCss; import edu.washington.cs.oneswarm.ui.gwt.client.newui.friends.wizard.FriendsImportWizard; import edu.washington.cs.oneswarm.ui.gwt.rpc.BackendTask; import edu.washington.cs.oneswarm.ui.gwt.rpc.SpeedTestResult; public class SpeedTestPanel extends VerticalPanel { protected final static OSMessages msg = OneSwarmGWT.msg; private final Timer updateTimer; private BackendTask task; private double getRemoteEstimate() { if (task != null) { return getSpeedTestResult().getRemoteEstimate(); } else { return 1000; } } private SpeedTestResult getSpeedTestResult() { if (task != null) { return ((SpeedTestResult) task.getResult()); } return null; } public static final int WIDTH = 270; private final ListBox fractionSelection = new ListBox(); private final TextBox uploadLimit = new TextBox(); private final TextBox uploadRate = new TextBox(); private final Label uploadRateLabel = new Label(); private double currentUpload = 0; private int uploadLimitCalc = 0; private void updateUpload() { int rateInKb = (int) Math.round(currentUpload / 1000); uploadRate.setText(rateInKb + ""); uploadRateLabel.setText(rateInKb + ""); double frac = Double.parseDouble(fractionSelection.getValue(fractionSelection .getSelectedIndex())); uploadLimitCalc = (int) Math.round(currentUpload * frac); uploadLimit.setText((uploadLimitCalc / 1000) + ""); } public SpeedTestPanel(final SpeedTestCallback cb) { super.setWidth(WIDTH + "px"); Label selectLabel = new HTML(msg.speed_test_description()); selectLabel.addStyleName(FriendsImportWizard.CSS_DIALOG_HEADER); selectLabel.setWidth(WIDTH + "px"); super.add(selectLabel); super.setSpacing(3); // AbsolutePanel imagePanel = createSpeedometer(); // super.add(imagePanel); // super.setCellHorizontalAlignment(imagePanel, ALIGN_CENTER); for (int i = 50; i <= 100; i += 10) { fractionSelection.addItem(i + "%", (i / 100.0) + ""); } fractionSelection.setSelectedIndex(3); fractionSelection.addChangeHandler(new ChangeHandler() { public void onChange(ChangeEvent event) { updateUpload(); } }); Grid g = new Grid(3, 2); final String rightColWidth = "60px"; g.setWidget(0, 0, new Label(msg.speed_test_measured_capacity())); g.setWidget(0, 1, uploadRate); g.getCellFormatter().setHorizontalAlignment(0, 1, ALIGN_CENTER); uploadRate.setWidth(rightColWidth); uploadRate.setReadOnly(true); uploadRate.addStyleName(OneSwarmCss.TEXT_BLACK); uploadRate.addStyleName(OneSwarmCss.TEXT_BOLD); g.setWidget(1, 0, new Label(msg.speed_test_fraction_used())); g.setWidget(1, 1, fractionSelection); g.getCellFormatter().setHorizontalAlignment(1, 1, ALIGN_CENTER); fractionSelection.setWidth(rightColWidth); g.setWidget(2, 0, new Label(msg.speed_test_calculated_limit())); g.setWidget(2, 1, uploadLimit); g.getCellFormatter().setHorizontalAlignment(2, 1, ALIGN_CENTER); uploadLimit.setWidth(rightColWidth); uploadLimit.setReadOnly(true); uploadLimit.addStyleName(OneSwarmCss.TEXT_BLACK); super.add(g); super.setCellHorizontalAlignment(g, ALIGN_CENTER); final ProgressBar progress = new ProgressBar(0, 1); progress.setProgress(0); progress.setWidth("100%"); super.add(progress); super.setCellHeight(progress, "30px"); super.setCellVerticalAlignment(progress, ALIGN_MIDDLE); HorizontalPanel buttonPanel = new HorizontalPanel(); buttonPanel.setSpacing(3); buttonPanel.setWidth("100%"); final Button okButton = new Button(msg.speed_test_button_set_limit()); okButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { cb.speedTestCompleted(uploadLimitCalc); } }); Button cancelButton = new Button(msg.button_cancel()); cancelButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { cb.speedTestCanceled(); } }); buttonPanel.add(cancelButton); buttonPanel.setCellHorizontalAlignment(cancelButton, ALIGN_LEFT); buttonPanel.add(okButton); buttonPanel.setCellHorizontalAlignment(okButton, ALIGN_RIGHT); super.add(buttonPanel); updateTimer = new Timer() { @Override public void run() { OneSwarmRPCClient.getService().getBackendTask(OneSwarmRPCClient.getSessionID(), task.getTaskID(), new AsyncCallback<BackendTask>() { public void onSuccess(BackendTask result) { if (result == null) { return; } task = result; SpeedTestResult testResult = getSpeedTestResult(); if (testResult == null) { return; } progress.setProgress(testResult.getProgress()); currentUpload = testResult.getEstimatedUploadRate(); updateUpload(); /* * schedule the next update */ if (testResult.getProgress() < 1) { updateTimer.schedule(200); } } public void onFailure(Throwable caught) { okButton.setText("error"); } }); } }; OneSwarmRPCClient.getService().performSpeedCheck(OneSwarmRPCClient.getSessionID(), 0, new AsyncCallback<BackendTask>() { public void onSuccess(BackendTask result) { task = result; updateTimer.schedule(200); } public void onFailure(Throwable caught) { okButton.setText("error"); } }); updateUpload(); } // private AbsolutePanel createSpeedometer() { // AbsolutePanel imagePanel = new AbsolutePanel(); // int panelSize = 225; // int imageSize = 175; // imagePanel.setPixelSize(panelSize, panelSize); // Image speedImage = new Image("images/speedometer.png"); // int imageOffset = (panelSize - imageSize) / 2; // imagePanel.add(speedImage, imageOffset, imageOffset); // // uploadRateLabel.setWidth(imageSize + "px"); // uploadRateLabel.setHorizontalAlignment(ALIGN_CENTER); // uploadRateLabel.addStyleName("os-welcome_banner"); // imagePanel.add(uploadRateLabel, imageOffset, imageOffset + (imageSize / // 2) + 25); // Label kbpsLabel = new Label("KB/s"); // kbpsLabel.setHorizontalAlignment(ALIGN_CENTER); // kbpsLabel.addStyleName(OneSwarmCss.TEXT_BOLD); // imagePanel.add(kbpsLabel, imageOffset, imageOffset + (imageSize / 2) + // 50); // // return imagePanel; // } public interface SpeedTestCallback { public void speedTestCanceled(); public void speedTestCompleted(double rate); } }