/*******************************************************************************
* 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 com.dawg6.gwt.client.widgets.SimpleCaptionPanel;
import com.dawg6.web.dhcalc.shared.calculator.MonsterHealth;
import com.dawg6.web.dhcalc.shared.calculator.MonsterType;
import com.dawg6.web.dhcalc.shared.calculator.TargetSize;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
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 SituationalPanel extends Composite {
private final NumberSpinner additional;
private final NumberSpinner distance;
private final NumberSpinner targetSpacing;
private final NumberSpinner percentSlowedChilled;
private final NumberSpinner percentControlled;
private final NumberSpinner percentAtLeast10Yards;
private final ListBox targetSize;
private final NumberSpinner numHealthGlobes;
private final NumberSpinner firingDelay;
private final NumberSpinner riftLevel;
private final LongSpinner primaryTargetHealth;
private final ListBox primaryTargetType;
private final LongSpinner additionalTargetsHealth;
private final NumberSpinner numPlayers;
private final ListBox additionalTargetType;
private boolean disableListeners = false;
private final NumberSpinner percentMoving;
public SituationalPanel() {
SimpleCaptionPanel SimpleCaptionPanel = new SimpleCaptionPanel("Situational");
initWidget(SimpleCaptionPanel);
FlexTable flexTable = new FlexTable();
flexTable.setCellPadding(2);
SimpleCaptionPanel.setContentWidget(flexTable);
int row = 0;
Label lblGreaterRiftLevel = new Label("Greater Rift Level:");
lblGreaterRiftLevel.setWordWrap(false);
flexTable.setWidget(row, 0, lblGreaterRiftLevel);
riftLevel = new NumberSpinner();
riftLevel.setVisibleLength(4);
riftLevel.setTitle("Greater Rift Level");
riftLevel.setText("1");
riftLevel.setMin(1);
riftLevel.setMax(100);
flexTable.setWidget(row++, 1, riftLevel);
Label lblNumberOfPlayers = new Label("Number of Players:");
lblNumberOfPlayers.setWordWrap(false);
flexTable.setWidget(row, 0, lblNumberOfPlayers);
numPlayers = new NumberSpinner();
numPlayers.setVisibleLength(4);
numPlayers.setTitle("# of players in rift (used to calculate monster health)");
numPlayers.setText("1");
numPlayers.setMin(1);
numPlayers.setMax(4);
flexTable.setWidget(row++, 1, numPlayers);
Label lblPrimaryTargetType = new Label("Primary Target Type:");
lblPrimaryTargetType.setWordWrap(false);
flexTable.setWidget(row, 0, lblPrimaryTargetType);
primaryTargetType = new ListBox();
flexTable.setWidget(row++, 1, primaryTargetType);
primaryTargetType.setWidth("100%");
Label lblPrimaryTargetHealth = new Label("Primary Target Health:");
lblPrimaryTargetHealth.setWordWrap(false);
flexTable.setWidget(row, 0, lblPrimaryTargetHealth);
primaryTargetHealth = new LongSpinner();
primaryTargetHealth.setVisibleLength(20);
primaryTargetHealth.setTitle("Number of additional targets to account for.");
primaryTargetHealth.setText("0");
flexTable.setWidget(row++, 1, primaryTargetHealth);
Label lblAdditionalTargetsType = new Label("Additional Targets Type:");
lblAdditionalTargetsType.setWordWrap(false);
flexTable.setWidget(row, 0, lblAdditionalTargetsType);
additionalTargetType = new ListBox();
flexTable.setWidget(row++, 1, additionalTargetType);
additionalTargetType.setWidth("100%");
Label lblOfadditional = new Label("# of Additional targets:");
lblOfadditional.setWordWrap(false);
flexTable.setWidget(row, 0, lblOfadditional);
additional = new NumberSpinner();
additional.setVisibleLength(4);
additional
.setTitle("Number of additional targets to account for.");
additional.setText("0");
flexTable.setWidget(row++, 1, additional);
this.additional.setMax(10);
Label lblAdditionalTargetsHealth = new Label("Additional Targets Health:");
lblAdditionalTargetsHealth.setWordWrap(false);
flexTable.setWidget(row, 0, lblAdditionalTargetsHealth);
additionalTargetsHealth = new LongSpinner();
additionalTargetsHealth.setVisibleLength(20);
additionalTargetsHealth.setTitle("Number of additional targets to account for.");
additionalTargetsHealth.setText("0");
flexTable.setWidget(row++, 1, additionalTargetsHealth);
Label lblPercentOfTargets = new Label(
"Percent of targets slowed/chilled?");
lblPercentOfTargets.setWordWrap(false);
flexTable.setWidget(row, 0, lblPercentOfTargets);
percentSlowedChilled = new NumberSpinner();
percentSlowedChilled.setVisibleLength(4);
percentSlowedChilled
.setTitle("Percent of targets slowed or chilled (apply Cull the Weak).");
percentSlowedChilled.setText("0");
flexTable.setWidget(row++, 1, percentSlowedChilled);
Label lblPercentOfTargets_1 = new Label(
"Percent of targets control impaired?");
lblPercentOfTargets_1.setWordWrap(false);
flexTable.setWidget(row, 0, lblPercentOfTargets_1);
percentControlled = new NumberSpinner();
percentControlled.setVisibleLength(4);
percentControlled
.setTitle("Percent of targets control impaired (apply Bane of the Trapped).");
percentControlled.setText("0");
flexTable.setWidget(row++, 1, percentControlled);
Label lblPercentOfTargets_2 = new Label(
"Percent of targets at least 10 yards away?");
lblPercentOfTargets_2.setWordWrap(false);
flexTable.setWidget(row, 0, lblPercentOfTargets_2);
percentAtLeast10Yards = new NumberSpinner();
percentAtLeast10Yards.setVisibleLength(4);
percentAtLeast10Yards
.setTitle("Percent of targets at least 10 yards away (apply Steady Aim/UE4).");
percentAtLeast10Yards.setText("0");
flexTable.setWidget(row++, 1, percentAtLeast10Yards);
Label label_8 = new Label("Distance to target(s) (yards)");
label_8.setWordWrap(false);
flexTable.setWidget(row, 0, label_8);
distance = new NumberSpinner();
distance.setVisibleLength(4);
distance.setTitle("Average distance (in yards) to target(s) (for Zei's Stone of Vengeance).");
distance.setText("0");
flexTable.setWidget(row++, 1, distance);
Label lblSpacingBetweenTargets = new Label(
"Spacing between targets (yards):");
lblSpacingBetweenTargets.setWordWrap(false);
flexTable.setWidget(row, 0, lblSpacingBetweenTargets);
targetSpacing = new NumberSpinner();
targetSpacing.setVisibleLength(4);
targetSpacing
.setTitle("Average distance (in yards) between target(s) (for Grenades, certain Marked for Death runes and Single Out).");
targetSpacing.setText("0");
flexTable.setWidget(row++, 1, targetSpacing);
Label moving = new Label(
"% of time Moving:");
moving.setWordWrap(false);
flexTable.setWidget(row, 0, moving);
percentMoving = new NumberSpinner();
percentMoving.setVisibleLength(4);
percentMoving
.setTitle("Percent of the time that the player is moving (vs standing still)");
percentMoving.setMin(0);
percentMoving.setMax(100);
percentMoving.setText("50");
flexTable.setWidget(row++, 1, percentMoving);
Label lblTargetSizefor = new Label("Target Size (for Ball Lightning):");
lblTargetSizefor.setWordWrap(false);
flexTable.setWidget(row, 0, lblTargetSizefor);
targetSize = new ListBox();
targetSize.setTitle("Target Size");
flexTable.setWidget(row++, 1, targetSize);
targetSize.setWidth("100%");
Label label = new Label("# Health Globes:");
flexTable.setWidget(row, 0, label);
numHealthGlobes = new NumberSpinner();
numHealthGlobes.setVisibleLength(4);
numHealthGlobes.setTitle("# of Health Globes picked up during fight");
flexTable.setWidget(row++, 1, numHealthGlobes);
Label label_1 = new Label("Average Firing Delay (ms):");
label_1.setWordWrap(false);
flexTable.setWidget(row, 0, label_1);
firingDelay = new NumberSpinner();
firingDelay.setVisibleLength(4);
firingDelay.setTitle("Average delay (in milliseconds) of player actions.");
flexTable.setWidget(row++, 1, firingDelay);
this.distance.setMax(100);
this.targetSpacing.setMax(100);
this.percentAtLeast10Yards.setMax(100);
this.percentControlled.setMax(100);
this.percentSlowedChilled.setMax(100);
this.numHealthGlobes.setMin(0);
this.firingDelay.setMin(0);
this.firingDelay.setMax(1000);
for (TargetSize t : TargetSize.values()) {
targetSize.addItem(t.getDisplayName(), t.name());
}
ChangeHandler primaryHandler = new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
if (!disableListeners)
updatePrimaryMonsterHealth();
}};
ChangeHandler additionalHandler = new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
if (!disableListeners)
updateAdditionalMonsterHealth();
}};
for (MonsterType m : MonsterType.values()) {
this.primaryTargetType.addItem(m.toString(), m.name());
this.additionalTargetType.addItem(m.toString(), m.name());
}
this.primaryTargetType.setSelectedIndex(0);
this.additionalTargetType.setSelectedIndex(0);
this.riftLevel.addChangeHandler(primaryHandler);
this.riftLevel.addChangeHandler(additionalHandler);
this.primaryTargetType.addChangeHandler(primaryHandler);
this.additionalTargetType.addChangeHandler(additionalHandler);
this.numPlayers.addChangeHandler(primaryHandler);
this.numPlayers.addChangeHandler(additionalHandler);
}
protected void updatePrimaryMonsterHealth() {
long value = MonsterHealth.getHealth(this.riftLevel.getValue(), this.numPlayers.getValue(), getMonsterType(this.primaryTargetType));
this.primaryTargetHealth.setValue(value);
}
public static MonsterType getMonsterType(ListBox listBox) {
int i = listBox.getSelectedIndex();
String value = listBox.getValue(i);
return MonsterType.valueOf(value);
}
protected void updateAdditionalMonsterHealth() {
long value = MonsterHealth.getHealth(this.riftLevel.getValue(), this.numPlayers.getValue(), getMonsterType(this.additionalTargetType));
this.additionalTargetsHealth.setValue(value);
}
public NumberSpinner getAdditional() {
return additional;
}
public NumberSpinner getDistance() {
return distance;
}
public NumberSpinner getTargetSpacing() {
return targetSpacing;
}
public NumberSpinner getPercentSlowedChilled() {
return percentSlowedChilled;
}
public NumberSpinner getPercentControlled() {
return percentControlled;
}
public NumberSpinner getPercentAtLeast10Yards() {
return percentAtLeast10Yards;
}
public ListBox getTargetSize() {
return targetSize;
}
public TargetSize getSelectedTargetSize() {
int i = targetSize.getSelectedIndex();
if (i < 0)
return null;
String value = targetSize.getValue(i);
return TargetSize.valueOf(value);
}
public void setTargetSize(TargetSize targetSize) {
for (int i = 0; i < this.targetSize.getItemCount(); i++) {
String value = this.targetSize.getValue(i);
if (value.equals(targetSize.name())) {
this.targetSize.setSelectedIndex(i);
return;
}
}
}
public NumberSpinner getNumHealthGlobes() {
return numHealthGlobes;
}
public NumberSpinner getFiringDelay() {
return firingDelay;
}
public NumberSpinner getRiftLevel() {
return riftLevel;
}
public LongSpinner getPrimaryTargetHealth() {
return primaryTargetHealth;
}
public ListBox getPrimaryTargetType() {
return primaryTargetType;
}
public LongSpinner getAdditionalTargetsHealth() {
return additionalTargetsHealth;
}
public NumberSpinner getNumPlayers() {
return numPlayers;
}
public ListBox getAdditionalTargetType() {
return additionalTargetType;
}
public boolean isDisableListeners() {
return disableListeners;
}
public void setDisableListeners(boolean disableListeners) {
this.disableListeners = disableListeners;
}
public NumberSpinner getPercentMoving() {
return this.percentMoving;
}
}