/******************************************************************************* * Copyright (c) 2014, 2015 Scott Clarke (scott@dawg6.com). * * This file is part of Dawg6's Demon Hunter DPS Calculator. * * Dawg6's Demon Hunter DPS Calculator 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. * * Dawg6's Demon Hunter DPS Calculator 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 this program. If not, see <http://www.gnu.org/licenses/>. *******************************************************************************/ package com.dawg6.web.dhcalc.client; import java.util.Collection; import java.util.Date; import java.util.Map; import java.util.Set; import com.dawg6.gwt.client.ApplicationPanel; import com.dawg6.web.dhcalc.shared.calculator.ActiveSkill; import com.dawg6.web.dhcalc.shared.calculator.DamageType; import com.dawg6.web.dhcalc.shared.calculator.GemAttributeData; import com.dawg6.web.dhcalc.shared.calculator.GemSkill; import com.dawg6.web.dhcalc.shared.calculator.ItemHolder; import com.dawg6.web.dhcalc.shared.calculator.Passive; import com.dawg6.web.dhcalc.shared.calculator.Rune; import com.dawg6.web.dhcalc.shared.calculator.Slot; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.storage.client.Storage; import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.ui.DoubleBox; import com.google.gwt.user.client.ui.IntegerBox; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.SimpleCheckBox; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.ValueBoxBase; import com.google.gwt.user.client.ui.Widget; public class BasePanel extends ApplicationPanel { protected boolean disableListeners = false; protected void loadForm() { if (!loadStorage()) loadCookies(); } protected String getFieldValue(String field, String defaultValue) { if (Storage.isLocalStorageSupported()) { Storage storage = Storage.getLocalStorageIfSupported(); String value = storage.getItem(field); return (value != null) ? value : defaultValue; } else { return getCookie(field, defaultValue); } } protected boolean loadStorage() { boolean result = false; if (Storage.isLocalStorageSupported()) { Storage storage = Storage.getLocalStorageIfSupported(); Collection<String> cookies = null; if (Cookies.isCookieEnabled()) { cookies = Cookies.getCookieNames(); } for (Field f : getFields()) { String value = storage.getItem(f.name); if (value != null) { // do nothing } else if ((cookies != null) && (cookies.contains(f.name))) { value = getCookie(f.name, f.defaultValue); storage.setItem(f.name, value); Cookies.removeCookie(f.name); } else { value = f.defaultValue; storage.setItem(f.name, value); } setFieldValue(f, value); } result = true; } return result; } protected boolean loadCookies() { boolean result = false; if (Cookies.isCookieEnabled()) { result = true; for (Field f : getFields()) { loadCookie(f); } } return result; } protected void saveForm() { saveFields(getFields()); } protected void saveFields(Field... fields) { if (Storage.isLocalStorageSupported()) { Storage storage = Storage.getLocalStorageIfSupported(); for (Field f : fields) { saveField(storage, f); } } else { for (Field f : fields) { saveCookie(f); } } } protected void saveField(String field, String value) { if (Storage.isLocalStorageSupported()) { Storage storage = Storage.getLocalStorageIfSupported(); storage.setItem(field, value); } else { saveCookie(value, field); } } protected void saveField(Storage storage, Field f) { String value = getFieldValue(f); storage.setItem(f.name, value); } protected Field getField(Widget w) { for (Field f : getFields()) { if (f.field == w) return f; } return null; } protected class Field { public Object field; public String name; public String defaultValue; public Field(Object field, String name, String defaultValue) { this.field = field; this.name = name; this.defaultValue = defaultValue; } } protected Field[] getFields() { return new Field[0]; } protected void saveCookie(Field field) { String value = getFieldValue(field); saveCookie(value, field.name); } protected void loadCookie(Field field) { String value = getCookie(field.name, field.defaultValue); setFieldValue(field, value); } protected static final long ONE_YEAR = 1000 * 60 * 60 * 24 * 365; protected void saveCookie(String value, String name) { Date date = new Date(); Cookies.setCookie(name, value, new Date(date.getTime() + ONE_YEAR)); } protected String getCookie(String name, String defaultValue) { String value = Cookies.getCookie(name); if (value == null) value = defaultValue; return value; } protected int getValue(NumberSpinner spinner) { Integer value = spinner.getValue(); if (value == null) { spinner.setValue(0); value = 0; } return value; } protected long getValue(LongSpinner spinner) { Long value = spinner.getValue(); if (value == null) { spinner.setValue(0L); value = 0L; } return value; } protected double getValue(DoubleSpinner spinner) { Double value = spinner.getValue(); if (value == null) { spinner.setValue(0.0); value = 0.0; } return value; } protected double getValue(TextBox textBox) { try { String text = textBox.getText(); return Double.valueOf(text); } catch (Exception e) { textBox.setValue("0"); return 0.0; } } protected int getValue(IntegerBox box) { try { Integer value = box.getValue(); if (value == null) { box.setValue(0); value = 0; } return value; } catch (Exception e) { box.setValue(0); return 0; } } protected double getValue(DoubleBox box) { try { Double value = box.getValue(); if (value == null) { box.setValue(0.0); value = 0.0; } return value; } catch (Exception e) { box.setValue(0.0); return 0.0; } } @Override protected void onLoad() { Field[] fields = getFields(); for (Field f : fields) { if (f.field instanceof ValueBoxBase) { final ValueBoxBase<?> tf = (ValueBoxBase<?>) f.field; tf.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { tf.selectAll(); } }); } } } protected String getFieldValue(Field f) { Object field = f.field; String defaultValue = f.defaultValue; if (field instanceof TextBox) return getFieldValue((TextBox) field, defaultValue); else if (field instanceof IntegerBox) return getFieldValue((IntegerBox) field, defaultValue); else if (field instanceof NumberSpinner) return getFieldValue((NumberSpinner) field, defaultValue); else if (field instanceof LongSpinner) return getFieldValue((LongSpinner) field, defaultValue); else if (field instanceof DoubleSpinner) return getFieldValue((DoubleSpinner) field, defaultValue); else if (field instanceof DoubleBox) return getFieldValue((DoubleBox) field, defaultValue); else if (field instanceof SimpleCheckBox) return getFieldValue((SimpleCheckBox) field, defaultValue); else if (field instanceof ListBox) return getFieldValue((ListBox) field, defaultValue); else if (field instanceof PassivesPanel) return getFieldValue(((PassivesPanel) field).getPassives(), defaultValue); else if (field instanceof GemsPanel) return getGemsFieldValue(((GemsPanel) field).getGems(), defaultValue); else if (field instanceof ItemPanel) return getSpecialItemsFieldValue(((ItemPanel) field).getItems(), ((ItemPanel) field).getSetCounts(), defaultValue); else if (field instanceof SkillsPanel) return getEnumFieldValue(((SkillsPanel) field).getSkills(), defaultValue); else if (field instanceof DamageTypePanel) return getFieldValue(((DamageTypePanel) field).getValues(), defaultValue); else if (field instanceof SkillDamagePanel) return getFieldValue(((SkillDamagePanel) field).getValues(), defaultValue); else return defaultValue; } protected <K extends Enum<K>, V extends Enum<V>> String getEnumFieldValue( Map<K, V> map, String defaultValue) { if (map == null) return defaultValue; return JsonUtil.toJSONObject(JsonUtil.createStringMap(map)).toString(); } protected <K, V> String getFieldValue(Map<K, V> map, String defaultValue) { if (map == null) return defaultValue; return JsonUtil.toJSONObject(JsonUtil.createStringMap(map)).toString(); } protected String getFieldValue(Set<Passive> passives, String defaultValue) { if (passives == null) return defaultValue; return JsonUtil.toJSONObject(passives).toString(); } protected String getGemsFieldValue(Map<GemSkill, GemAttributeData> gems, String defaultValue) { if (gems == null) return defaultValue; return JsonUtil.gemsToJSONObject(gems).toString(); } protected String getFieldValue(ListBox field, String defaultValue) { int i = field.getSelectedIndex(); if (i < 0) return defaultValue; return field.getValue(i); } protected String getFieldValue(SimpleCheckBox field, String defaultValue) { return String.valueOf(field.getValue()); } protected String getFieldValue(DoubleBox field, String defaultValue) { try { return String.valueOf(field.getValue()); } catch (Exception e) { field.setText(defaultValue); return defaultValue; } } protected String getFieldValue(DoubleSpinner field, String defaultValue) { try { return String.valueOf(field.getValue()); } catch (Exception e) { field.setText(defaultValue); return defaultValue; } } protected String getFieldValue(NumberSpinner field, String defaultValue) { try { return String.valueOf(field.getValue()); } catch (Exception e) { field.setText(defaultValue); return defaultValue; } } protected String getFieldValue(LongSpinner field, String defaultValue) { try { return String.valueOf(field.getValue()); } catch (Exception e) { field.setText(defaultValue); return defaultValue; } } protected String getFieldValue(IntegerBox field, String defaultValue) { try { return String.valueOf(field.getValue()); } catch (Exception e) { field.setText(defaultValue); return defaultValue; } } protected String getFieldValue(TextBox field, String defaultValue) { String value = field.getValue(); if ((value != null) && (value.length() > 0)) return field.getValue(); field.setText(defaultValue); return defaultValue; } public void populateFormData(Map<String, String> data) { for (Field f : getFields()) { String name = f.name; String value = getFieldValue(f); data.put(name, value); } } public void restoreFormData(Map<String, String> data) { for (Field f : getFields()) { String name = f.name; String value = data != null ? data.get(name) : null; setFieldValue(f, value); } } protected void setFieldValue(Field f, String value) { Object field = f.field; if (value == null) value = f.defaultValue; if (field instanceof TextBox) setFieldValue((TextBox) field, value); else if (field instanceof IntegerBox) setFieldValue((IntegerBox) field, value); else if (field instanceof NumberSpinner) setFieldValue((NumberSpinner) field, value); else if (field instanceof LongSpinner) setFieldValue((LongSpinner) field, value); else if (field instanceof DoubleSpinner) setFieldValue((DoubleSpinner) field, value); else if (field instanceof DoubleBox) setFieldValue((DoubleBox) field, value); else if (field instanceof SimpleCheckBox) setFieldValue((SimpleCheckBox) field, value); else if (field instanceof ListBox) setFieldValue((ListBox) field, value); else if (field instanceof PassivesPanel) setFieldValue((PassivesPanel) field, value); else if (field instanceof GemsPanel) setFieldValue((GemsPanel) field, value); else if (field instanceof ItemPanel) setFieldValue((ItemPanel) field, value); else if (field instanceof SkillsPanel) setFieldValue((SkillsPanel) field, value); else if (field instanceof DamageTypePanel) setFieldValue((DamageTypePanel) field, value); else if (field instanceof SkillDamagePanel) setFieldValue((SkillDamagePanel) field, value); } protected void setFieldValue(PassivesPanel field, String value) { Set<Passive> set = JsonUtil.parseSet(Passive.class, value); field.setPassives(set); } protected void setFieldValue(GemsPanel field, String value) { Map<GemSkill, GemAttributeData> gems = JsonUtil.parseGemsMap(value); field.setGems(gems); } protected void setFieldValue(ItemPanel field, String value) { Map<Slot, ItemHolder> items = JsonUtil .parseSpecialItemsMap(value); field.setItems(items); Map<String, Integer> sets = JsonUtil.parseSetCounts(value); field.setSetCounts(sets); } protected void setFieldValue(SkillsPanel field, String value) { Map<ActiveSkill, Rune> map = JsonUtil.parseMap(ActiveSkill.class, Rune.class, value); field.setSkills(map); } protected void setFieldValue(DamageTypePanel field, String value) { Map<DamageType, Double> map = JsonUtil .parseMap(DamageType.class, value); field.setValues(map); } protected void setFieldValue(SkillDamagePanel field, String value) { Map<ActiveSkill, Double> map = JsonUtil.parseMap(ActiveSkill.class, value); field.setValues(map); } protected void setFieldValue(ListBox field, String value) { try { for (int i = 0; i < field.getItemCount(); i++) { String v = field.getValue(i); if (v.equals(value)) { field.setSelectedIndex(i); return; } } field.setSelectedIndex(0); } catch (Exception e) { field.setSelectedIndex(0); } } protected void setFieldValue(SimpleCheckBox field, String value) { field.setValue(Boolean.valueOf(value)); } protected void setFieldValue(DoubleBox field, String value) { try { field.setValue(Double.valueOf(value)); } catch (Exception e) { field.setValue(0.0); } } protected void setFieldValue(DoubleSpinner field, String value) { try { field.setValue(Double.valueOf(value)); } catch (Exception e) { field.setValue(0.0); } } protected void setFieldValue(NumberSpinner field, String value) { try { field.setValue(Integer.valueOf(value)); } catch (Exception e) { field.setValue(0); } } protected void setFieldValue(LongSpinner field, String value) { try { field.setValue(Long.valueOf(value)); } catch (Exception e) { field.setValue(0L); } } protected void setFieldValue(IntegerBox field, String value) { try { field.setValue(Integer.valueOf(value)); } catch (Exception e) { field.setValue(0); } } protected void setFieldValue(TextBox field, String value) { field.setValue(value); } public String getSpecialItemsFieldValue( Map<Slot, ItemHolder> items, Map<String, Integer> setCounts, String defaultValue) { return JsonUtil.specialItemsToJSONObject(items, setCounts).toString(); } }