1 package autotest.moblab.wizard; 2 3 import autotest.moblab.rpc.MoblabRpcCallbacks; 4 import autotest.moblab.rpc.VersionInfo; 5 import com.google.gwt.event.dom.client.ClickEvent; 6 import com.google.gwt.event.dom.client.ClickHandler; 7 import com.google.gwt.json.client.JSONValue; 8 import com.google.gwt.user.client.Window; 9 import com.google.gwt.user.client.ui.Button; 10 import com.google.gwt.user.client.ui.Composite; 11 import com.google.gwt.user.client.ui.FlexTable; 12 import com.google.gwt.user.client.ui.FlowPanel; 13 import com.google.gwt.user.client.ui.Label; 14 import com.google.gwt.user.client.ui.SimplePanel; 15 import com.google.gwt.user.client.ui.VerticalPanel; 16 import com.google.gwt.user.client.ui.Widget; 17 18 import autotest.common.JsonRpcCallback; 19 import autotest.common.ui.NotifyManager; 20 import autotest.moblab.rpc.MoblabRpcHelper; 21 22 import java.util.Collection; 23 24 /** 25 * The configuration wizard for Moblab. A wizard supports multiple modes - 26 * the view mode and the edit mode. Each mode has its own UI. A wizard has 27 * a list of cards. Each card is responsible for the configuration of one 28 * piece of information. 29 */ 30 public class ConfigWizard extends Composite { 31 // All the wizard cards. 32 private WizardCard[] cards; 33 34 // The wizard header widget 35 private Widget headerContainer; 36 37 // The wizard footer widget 38 private Widget footerContainer; 39 40 // The container panel for wizard content widget. 41 private SimplePanel contentContainer; 42 43 // The current mode of the wizard - edit vs view 44 private Mode mode; 45 46 // The view mode controller. 47 private ConfigViewMode viewMode; 48 49 // The edit mode controller. 50 private ConfigEditMode editMode; 51 52 // Constructor. 53 public ConfigWizard() { 54 cards = new WizardCard[] {}; 55 56 VerticalPanel pnlWizard = new VerticalPanel(); 57 pnlWizard.setStyleName("wizard-layout"); 58 59 headerContainer = createWizardHeader(); 60 pnlWizard.add(headerContainer); 61 62 contentContainer = new SimplePanel(); 63 contentContainer.setStyleName("wizard-panel"); 64 pnlWizard.add(contentContainer); 65 66 footerContainer = createWizardFooter(); 67 pnlWizard.add(footerContainer); 68 69 initWidget(pnlWizard); 70 71 setStyleName("config-wizard"); 72 73 viewMode = new ConfigViewMode(this); 74 editMode = new ConfigEditMode(this); 75 76 // Default to view mode. 77 setMode(Mode.View); 78 } 79 80 /** 81 * Creates the wizard header widget. 82 */ 83 protected Widget createWizardHeader() { 84 FlowPanel headerPanel = new FlowPanel(); 85 headerPanel.setStyleName("wizard-header"); 86 Button btnStartConfig = new Button("Configure"); 87 headerPanel.add(btnStartConfig); 88 btnStartConfig.addClickHandler(new ClickHandler() { 89 @Override 90 public void onClick(ClickEvent event) { 91 onStartEdit(); 92 } 93 }); 94 95 Button btnReboot = new Button("Reboot"); 96 headerPanel.add(btnReboot); 97 btnReboot.addClickHandler(new ClickHandler() { 98 @Override 99 public void onClick(ClickEvent event) { 100 if (Window.confirm("Are you sure you want to reboot the Moblab device?")) { 101 MoblabRpcHelper.rebootMoblab(new JsonRpcCallback() { 102 @Override 103 public void onSuccess(JSONValue result) { 104 NotifyManager.getInstance().showMessage("Reboot command has been issued."); 105 } 106 }); 107 } 108 } 109 }); 110 return headerPanel; 111 } 112 113 /** 114 * Creates the wizard header widget. 115 */ 116 protected Widget createWizardFooter() { 117 final FlexTable layoutTable = new FlexTable(); 118 MoblabRpcHelper.fetchMoblabBuildVersionInfo(new MoblabRpcCallbacks.FetchVersionInfoCallback() { 119 @Override 120 public void onVersionInfoFetched(VersionInfo info) { 121 int row = 0; 122 layoutTable.setWidget(row, 0, new Label("Version")); 123 layoutTable.setWidget(row, 1, new Label(info.getVersion())); 124 row++; 125 layoutTable.setWidget(row, 0, new Label("Track")); 126 layoutTable.setWidget(row, 1, new Label(info.getReleaseTrack())); 127 row++; 128 layoutTable.setWidget(row, 0, new Label("Description")); 129 layoutTable.setWidget(row, 1, new Label(info.getReleaseDescription())); 130 row++; 131 layoutTable.setWidget(row, 0, new Label("Moblab Identification")); 132 layoutTable.setWidget(row, 1, new Label( 133 info.getMoblabIdentification())); 134 row++; 135 layoutTable.setWidget(row, 0, new Label("Moblab Mac Address")); 136 layoutTable.setWidget(row, 1, new Label(info.getMoblabMacAddress())); 137 } 138 }); 139 return layoutTable; 140 } 141 142 public WizardCard[] getCards() { 143 return cards; 144 } 145 146 public void setCards(WizardCard[] cards) { 147 if (cards != null) { 148 this.cards = cards; 149 } else { 150 this.cards = new WizardCard[] {}; 151 } 152 for (WizardCard card : cards) { 153 card.setDataStatusListener(editMode); 154 } 155 updateModeUI(); 156 } 157 158 public void setCards(Collection<WizardCard> cards) { 159 WizardCard[] cardArray = null; 160 if (cards != null) { 161 cardArray = (WizardCard[]) cards.toArray(); 162 } 163 setCards(cardArray); 164 updateModeUI(); 165 } 166 167 public Mode getMode() { 168 return mode; 169 } 170 171 public void onFinishEdit() { 172 setMode(Mode.View); 173 } 174 175 public void onCancelEdit() { 176 setMode(Mode.View); 177 } 178 179 public void onStartEdit() { 180 setMode(Mode.Edit); 181 } 182 183 private void setMode(Mode mode) { 184 this.mode = mode; 185 headerContainer.setVisible(Mode.View == mode); 186 footerContainer.setVisible(Mode.View == mode); 187 updateModeUI(); 188 } 189 190 private void updateModeUI() { 191 switch(this.mode) { 192 case Edit: 193 contentContainer.setWidget(editMode.display()); 194 viewMode.hide(); 195 break; 196 case View: 197 contentContainer.setWidget(viewMode.display()); 198 editMode.hide(); 199 break; 200 } 201 } 202 203 public enum Mode { 204 View, 205 Edit 206 } 207 208 public interface ConfigWizardMode { 209 public void hide(); 210 public Widget display(); 211 } 212 } 213