/* Copyright 2011 Massimo Gengarelli <gengarel@cs.unibo.it> * This file is part of Floz Configurator. * Floz Configurator is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Floz Configurator is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Floz Configurator. If not, see http://www.gnu.org/licenses/. */ package it.unibo.cs.v2.client; import it.unibo.cs.v2.servlets.ShutdownMachine; import it.unibo.cs.v2.servlets.ShutdownMachineAsync; import it.unibo.cs.v2.shared.MachineProcessInfo; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.user.client.History; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.Widget; public class MainPage extends HTMLPanel implements ValueChangeHandler<String> { private static MainPage instance; private final String WELCOME = "<h2>Welcome to Live ShockVM!</h2>" + "This is the main interface of <b>Live ShockVM</b>, use the left panel to create a new machine or to start up" + " the machines you've already created. The left panel is divided into three menus: the one with your name is the main menu, where you can create " + "a new machine; the second one is a short brief of the machines you already own while the latter one displays the MOTD of Live ShockVM."; private final HTML label = new HTML(WELCOME); private HTML vncApplet = new HTML(); private Wizard newWizard = new NewMachineWizard(); private final ShutdownMachineAsync shutdownMachineProxy = (ShutdownMachineAsync) GWT.create(ShutdownMachine.class); protected MainPage() { super(""); getElement().getStyle().setPaddingLeft(3, Unit.EM); add(label); } public static MainPage getInstance() { if (instance == null) instance = new MainPage(); return instance; } @Override public void onValueChange(ValueChangeEvent<String> event) { JS.restoreContainer(); // Clear the page and show the new one clear(); String historyToken = event.getValue(); if (historyToken.equals(HistoryTokens.START)) { label.setHTML(WELCOME); add(label); } else if (historyToken.equals(HistoryTokens.NEWMACHINE)) { if (newWizard.hasFinished()) newWizard = new NewMachineWizard(); ((Widget) newWizard).setVisible(true); add((Widget) newWizard); } else if (historyToken.equals(HistoryTokens.PREBUILT)) add(new PrebuiltWizard()); else if (historyToken.equals(HistoryTokens.EXPORT)) add(new ExportMachineWizard()); History.newItem("", false); } public void showApplet(final MachineProcessInfo mpi, final boolean newWindow) { JS.restoreContainer(); clear(); add(vncApplet); vncApplet.getElement().setId("vncAppletContainer"); vncApplet.setHTML("<h2>Viewing " + mpi.getMachineName() + " (" + mpi.getPid() + ")</h2>" + "<p><b>Warning:</b> if you can't connect and you're sure your machine is running, " + "click on disconnect a couple of times and then reconnect. This is a known bug of <b>websockify</b>.</p>" + "<div id=\"controls\"></div><div id=\"empty\"></div>"); JS.showVNC("forse.v2.cs.unibo.it", String.valueOf(9000 + mpi.getVncServer())); // JS.showVNC("192.168.0.202", "9091"); // vncApplet.setHTML("<h2>Viewing " + mpi.getMachineName() + " (" + mpi.getPid() + ")</h2>" + // "<b>To shutdown this machine, freeing the VNC server, " + // "please use the \"Shutdown this machine\" button positioned on the bottom of the page</b><br />" + // "<applet code=\"VncViewer.class\" archive=\"VncViewer.jar\" width=\"800\" height=\"600\">" + // "<param name=\"port\" value=\"" + (5900+mpi.getVncServer()) + "\"/>" + // "<param name=\"open new window\" value=\"" + (newWindow? "yes" : "no") + "\"/>" + // "<param name=\"view only\" value=\"" + (mpi.isOwned()? "no" : "yes") + "\"/>" + // "</applet>"); final Button shutdown = new Button("Shutdown this machine"); add(shutdown); shutdown.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { shutdownMachineProxy.shutdownMachine(mpi, new AsyncCallback<Void>() { @Override public void onSuccess(Void result) { JS.restoreContainer(); vncApplet.setHTML("<h2>Thank you</h2><span style=\"color: green\">" + "Machine successfully shut down.</span>"); remove(shutdown); } @Override public void onFailure(Throwable caught) { Window.alert(caught.getMessage()); } }); } }); } }