package freenet.clients.http.wizardsteps; import freenet.clients.http.*; import freenet.config.Config; import freenet.config.EnumerableOptionCallback; import freenet.config.Option; import freenet.support.HTMLNode; import freenet.support.Logger; import freenet.support.api.HTTPRequest; /** * This step is the first, and provides a small welcome screen and an option to change the language. */ public class WELCOME implements Step { private final Config config; /** * Constructs a new WELCOME GET handler. * @param config Node config; cannot be null. Used to build language drop-down and change language. */ public WELCOME(Config config) { this.config = config; } /** * Renders the first page of the wizard into the given content node. * @param request used to check whether the user is using a browser with incognito mode. */ @Override public void getStep(HTTPRequest request, PageHelper helper) { HTMLNode contentNode = helper.getPageContent(WizardL10n.l10n("homepageTitle")); boolean incognito = request.isParameterSet("incognito"); HTMLNode optionsTable = contentNode.addChild("table"); HTMLNode tableHeader = optionsTable.addChild("tr"); HTMLNode tableRow = optionsTable.addChild("tr"); //Low security option addSecurityTableCell(tableHeader, tableRow, "Low", helper, incognito); //High security option addSecurityTableCell(tableHeader, tableRow, "High", helper, incognito); //Detailed wizard option addSecurityTableCell(tableHeader, tableRow, "None", helper, incognito); HTMLNode languageForm = helper.addFormChild(contentNode, ".", "languageForm"); //Add option dropdown for languages Option<?> language = config.get("node").getOption("l10n"); EnumerableOptionCallback l10nCallback = (EnumerableOptionCallback)language.getCallback(); HTMLNode dropDown = ConfigToadlet.addComboBox(language.getValueDisplayString(), l10nCallback, language.getName(), false); //Submit automatically upon selection if Javascript. dropDown.addAttribute("onchange", "this.form.submit()"); languageForm.addChild(dropDown); //Otherwise fall back to submit button if no Javascript languageForm.addChild("noscript").addChild("input", "type", "submit"); } @Override public String postStep(HTTPRequest request) { //The user changed their language on the welcome page. Change the language and re-render the page. //Presets are handled within FirstTimeWizardToadlet because it can access all steps. String desiredLanguage = request.getPartAsStringFailsafe("l10n", 4096); try { config.get("node").set("l10n", desiredLanguage); } catch (freenet.config.InvalidConfigValueException e) { Logger.error(this, "Failed to set language to " + desiredLanguage + ". " + e); } catch (freenet.config.NodeNeedRestartException e) { //Changing language doesn't require a restart, at least as of version 1385. //Doing so would be really annoying as the node would have to start up again //which could be very slow. } return FirstTimeWizardToadlet.WIZARD_STEP.WELCOME.name(); } /** * Adds a table cell with information about a given security level and button. * @param row "tr" node to add cell content to * @param header "tr" node to add header to * @param preset suffix for security level keys. * @param helper used to add a form * @param incognito whether incognito mode is enabled */ private void addSecurityTableCell(HTMLNode header, HTMLNode row, String preset, PageHelper helper, boolean incognito) { header.addChild("th", "width", "33%", WizardL10n.l10n("presetTitle"+preset)); HTMLNode tableCell = row.addChild("td"); tableCell.addChild("p", WizardL10n.l10n("preset" + preset)); HTMLNode centerForm = tableCell.addChild("div", "style", "text-align:center;"); HTMLNode secForm = helper.addFormChild(centerForm, ".", "SecForm"+preset); secForm.addChild("input", new String[]{"type", "name", "value", }, new String[]{"hidden", "incognito", String.valueOf(incognito), }); secForm.addChild("input", new String[]{"type", "name", "value"}, new String[]{"submit", "preset" + preset, WizardL10n.l10n("presetChoose" + preset)}); } }