/******************************************************************************* * 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.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.Vector; import com.dawg6.gwt.client.widgets.SimpleCaptionPanel; import com.dawg6.web.dhcalc.shared.calculator.DamageType; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; public class DamageTypePanel extends Composite { private final Map<DamageType, Holder> fields = new TreeMap<DamageType, Holder>(); private final ListBox listBox; private final Button addButton; private final FlexTable flexTable; private class Holder { public NumberSpinner spinner; public int row; public Button removeButton; public DamageType type; } public DamageTypePanel() { SimpleCaptionPanel SimpleCaptionPanel = new SimpleCaptionPanel("Elemental Damage Modifiers"); initWidget(SimpleCaptionPanel); flexTable = new FlexTable(); SimpleCaptionPanel.setContentWidget(flexTable); List<DamageType> list = new Vector<DamageType>(DamageType.values().length); listBox = new ListBox(); for (DamageType type: DamageType.values()) { list.add(type); } Collections.sort(list, new Comparator<DamageType>(){ @Override public int compare(DamageType o1, DamageType o2) { return o1.getLongName().compareTo(o2.getLongName()); }}); for (DamageType s : list) { listBox.addItem(s.getLongName(), s.name()); } listBox.setSelectedIndex(0); addButton = new Button("Add"); addButton.addClickHandler(new ClickHandler(){ @Override public void onClick(ClickEvent event) { addType(); }}); flexTable.setWidget(0, 0, new Label("Type:", false)); flexTable.setWidget(0, 1, listBox); flexTable.getFlexCellFormatter().setColSpan(0, 1, 2); flexTable.setWidget(0, 2, addButton); } protected void addType() { int i = listBox.getSelectedIndex(); if (i < 0) return; String s = listBox.getValue(i); listBox.removeItem(i); DamageType type = DamageType.valueOf(s); addType(type, 0); } private void addType(DamageType type, int value) { int row = fields.size() + 1; final Holder holder = new Holder(); holder.removeButton = new Button("Remove"); holder.row = row; holder.spinner = new NumberSpinner(); holder.spinner.setVisibleLength(4); holder.spinner.setTitle("Additional damage done by " + type.getLongName() + " skills, as shown in-game in the Character Details screen, under Offense"); holder.spinner.setValue(value); holder.type = type; holder.removeButton.addClickHandler(new ClickHandler(){ @Override public void onClick(ClickEvent event) { removeType(holder); }}); fields.put(type, holder); flexTable.setWidget(row, 0, new Label(type.getLongName(), false)); flexTable.setWidget(row, 1, new Label("+ %", false)); flexTable.setWidget(row, 2, holder.spinner); flexTable.setWidget(row, 3, holder.removeButton); } protected void removeType(Holder holder) { int row = holder.row; DamageType type = holder.type; flexTable.removeRow(row); fields.remove(holder.type); for (Holder h : fields.values()) { if (h.row > row) h.row--; } int n = listBox.getItemCount(); int index = -1; for (int i = 0; i < n; i++) { String s = listBox.getItemText(i); if (type.getLongName().compareTo(s) > 0) { index = i; break; } } if (index < 0) { listBox.addItem(type.getLongName(), type.name()); listBox.setSelectedIndex(n); } else { listBox.insertItem(type.getLongName(), type.name(), index); listBox.setSelectedIndex(index); } } public void setValues(Map<DamageType, Double> map) { for (Holder h : fields.values()) { DamageType s = h.type; Double d = map.get(s); if ((d == null) || (d == 0.0)) removeType(h); else h.spinner.setValue((int)Math.round(d * 100.0)); } for (Map.Entry<DamageType, Double> e : map.entrySet()) { DamageType s = e.getKey(); Double d = e.getValue(); if ((d != null) && (d > 0.0)) { Holder h = fields.get(s); if (h == null) { addType(s, (int)Math.round(d * 100.0)); int n = listBox.getItemCount(); for (int i = 0; i < n; i++) { String v = listBox.getValue(i); if (v.equals(s.name())) { listBox.removeItem(i); break; } } } } } } public Map<DamageType, Double> getValues() { Map<DamageType, Double> map = new TreeMap<DamageType, Double>(); for (Holder h : fields.values()) { int value = h.spinner.getValue(); if (value > 0) { map.put(h.type, value / 100.0); } } return map; } }