/*******************************************************************************
* 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.Set;
import java.util.TreeSet;
import java.util.Vector;
import com.dawg6.gwt.client.widgets.SimpleCaptionPanel;
import com.dawg6.web.dhcalc.shared.calculator.Passive;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.ListBox;
public class PassivesPanel extends Composite {
private final List<ChangeHandler> handlers = new Vector<ChangeHandler>();
private final List<ListBox> listBoxes = new Vector<ListBox>();
private final List<Anchor> anchors = new Vector<Anchor>();
private boolean disableListeners = false;
public static final int NUM_PASSIVES = 5;
public PassivesPanel() {
SimpleCaptionPanel SimpleCaptionPanel = new SimpleCaptionPanel("Passives");
initWidget(SimpleCaptionPanel);
FlexTable flexTable = new FlexTable();
flexTable.setCellPadding(2);
SimpleCaptionPanel.setContentWidget(flexTable);
List<Passive> list = new Vector<Passive>();
for (Passive p : Passive.values())
list.add(p);
Collections.sort(list, new Comparator<Passive>(){
@Override
public int compare(Passive a, Passive b) {
return a.getLongName().compareTo(b.getLongName());
}});
for (int i = 0; i < NUM_PASSIVES; i++) {
final ListBox lb = new ListBox();
lb.setWidth("100%");
flexTable.setWidget(i, 1, lb);
final Anchor anchor = new Anchor("passive " + (i + 1));
anchor.setWordWrap(false);
anchor.setTarget("_blank");
anchor.setHref("javascript:void(0)");
flexTable.setWidget(i, 0, anchor);
lb.addItem("None", "");
for (Passive p : list) {
lb.addItem(p.getLongName(), p.name());
}
lb.setSelectedIndex(0);
lb.addChangeHandler(new ChangeHandler(){
@Override
public void onChange(ChangeEvent event) {
setTooltip(lb, anchor);
checkDuplicate(lb);
passivesChanged(event);
}});
listBoxes.add(lb);
anchors.add(anchor);
}
}
protected void checkDuplicate(ListBox lb) {
int selected = lb.getSelectedIndex();
boolean prev = disableListeners;
disableListeners = true;
for (int i = 0; i < NUM_PASSIVES; i++) {
ListBox l = listBoxes.get(i);
if ((l != lb) && (l.getSelectedIndex() == selected)) {
l.setSelectedIndex(0);
setTooltip(anchors.get(i), null);
}
}
disableListeners = prev;
}
protected void setTooltip(ListBox lb, Anchor anchor) {
Passive p = getPassive(lb);
setTooltip(anchor, p);
}
private void setTooltip(Anchor anchor, Passive p) {
anchor.setHref((p == null)?"javascript:void(0)":p.getUrl());
}
protected void passivesChanged(ChangeEvent event) {
if (!disableListeners) {
for (ChangeHandler h : handlers)
h.onChange(event);
}
}
public void addChangeHandler(ChangeHandler handler) {
this.handlers.add(handler);
}
public void setPassives(Set<Passive> list) {
disableListeners = true;
boolean changed = false;
int n = 0;
if (list != null) {
for (Passive p : list) {
if (n < NUM_PASSIVES) {
Anchor a = anchors.get(n);
ListBox lb = listBoxes.get(n++);
int before = lb.getSelectedIndex();
setPassive(lb, p);
setTooltip(a, p);
changed |= (lb.getSelectedIndex() != before);
}
}
}
while (n < NUM_PASSIVES) {
Anchor a = anchors.get(n);
ListBox lb = listBoxes.get(n++);
int before = lb.getSelectedIndex();
setPassive(lb, (Passive)null);
setTooltip(a, null);
changed |= (0 != before);
}
disableListeners = false;
if (changed)
passivesChanged(null);
}
public Set<Passive> getPassives() {
Set<Passive> set = new TreeSet<Passive>();
for (ListBox lb : listBoxes) {
Passive p = getPassive(lb);
if (p != null)
set.add(p);
}
return set;
}
private Passive getPassive(ListBox lb) {
int i = lb.getSelectedIndex();
String value = lb.getValue(i);
return (value.length() == 0) ? null : Passive.valueOf(value);
}
private void setPassive(ListBox lb, Passive p) {
setPassive(lb, (p == null) ? null : p.name());
}
private void setPassive(ListBox lb, String name) {
int n = lb.getItemCount();
if ((name != null) && (name.length() > 0)) {
for (int i = 0; i < n; i++) {
String value = lb.getValue(i);
if (value.equals(name)) {
lb.setSelectedIndex(i);
return;
}
}
}
lb.setSelectedIndex(0);
}
}