Package com.drakulo.games.ais.ui.component

Source Code of com.drakulo.games.ais.ui.component.TransferWindow

package com.drakulo.games.ais.ui.component;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;

import com.drakulo.games.ais.core.Colony;
import com.drakulo.games.ais.core.GameData;
import com.drakulo.games.ais.core.Resource;
import com.drakulo.games.ais.core.ResourceHelper;
import com.drakulo.games.ais.core.Settings;
import com.drakulo.games.ais.ui.I18n;
import com.drakulo.games.ais.ui.ImageManager;
import com.drakulo.games.ais.ui.UIHelper;
import com.drakulo.games.ais.ui.component.button.TextButton;
import com.drakulo.games.ais.ui.twlbridge.RootPane;

import de.matthiasmann.twl.ComboBox;
import de.matthiasmann.twl.EditField;
import de.matthiasmann.twl.EditField.Callback;
import de.matthiasmann.twl.model.SimpleChangableListModel;

/**
* This class displays and handle resource transfer between two colonies
*
* @author Drakulo
*
*/
public class TransferWindow extends UIComponent {
  /** The combo selecting the source colony */
  private ComboBox<Colony> comboFrom;
  /** The combo selecting the destination colony */
  private ComboBox<Colony> comboTo;
  /** The cancel button */
  private TextButton closeButton;
  /** The send button */
  private TextButton sendButton;
  /** Resources of the source colony */
  private ResourceDisplay resourceDispFrom;
  /** Resources of the destination colony */
  private ResourceDisplay resourceDispTo;
  /** Text fields */
  private Map<Resource, EditField> fields;
  /** The colony list for combo boxes */
  private SimpleChangableListModel<Colony> colonyList;
  /** The TWL Root Panel */
  private RootPane rootPane;

  public TransferWindow(RootPane twlRootPane) {
    rootPane = twlRootPane;
    setWidth(300);
    setHeight(300);
    int x = Settings.WIDTH / 2 - getWidth() / 2;
    int y = Settings.HEIGHT / 2 - getHeight() / 2;
    setOX(x);
    setOY(y);

    final int comboWidth = 120;
    final int comboHeight = 18;

    colonyList = new SimpleChangableListModel<Colony>(
        GameData.getColonies());

    x += 10;
    y += 10;
    comboFrom = new ComboBox<Colony>(colonyList);
    comboFrom.setTheme("listbox");
    comboFrom.setSize(comboWidth, comboHeight);
    comboFrom.setPosition(x, y);
    comboFrom.addCallback(new Runnable() {

      @Override
      public void run() {
        System.out.println("From : " + comboFrom.getSelected());
        if (comboFrom.getSelected() == -1) {
          return;
        }
        Colony c = colonyList.getEntry(comboFrom.getSelected());
        resourceDispFrom.setMap(ResourceHelper.cloneMap(c
            .getResources()));
      }
    });
    twlRootPane.add(comboFrom);

    resourceDispFrom = new ResourceDisplay(twlRootPane, x, y + comboHeight
        + 10);

    x = getOX() + getWidth() - 6 - 10 - comboWidth;
    comboTo = new ComboBox<Colony>(colonyList);
    comboTo.setTheme("listbox");
    comboTo.setSize(comboWidth, comboHeight);
    comboTo.setPosition(x, y);
    comboTo.addCallback(new Runnable() {

      @Override
      public void run() {
        if (comboTo.getSelected() == -1) {
          return;
        }
        Colony c = colonyList.getEntry(comboTo.getSelected());
        resourceDispTo.setMap(ResourceHelper.cloneMap(c.getResources()));
      }
    });
    twlRootPane.add(comboTo);

    resourceDispTo = new ResourceDisplay(twlRootPane, x, y + comboHeight
        + 10);

    x = getOX() + 10 + 21;
    y += resourceDispTo.getHeight() + 9;
    fields = new HashMap<Resource, EditField>();
    Resource[] resources = Resource.values();
    for (Resource r : resources) {
      EditField ef = new NumberField();
      ef.setTheme("editfield");
      ef.setPosition(x, y += 25);
      ef.setSize(120, 15);
      twlRootPane.add(ef);
      fields.put(r, ef);
    }

    x = Settings.WIDTH / 2 - 5 - TextButton.DEFAULT_WIDTH;
    y = getOY() + getHeight() - 10 - TextButton.DEFAULT_HEIGHT;
    closeButton = new TextButton(I18n.get("global.close"));
    closeButton.setPosition(x, y);
    closeButton.bindTo(twlRootPane);
    closeButton.setActionHandler(new ActionHandler() {

      @Override
      public void run() {
        hide();
      }
    });

    x = Settings.WIDTH / 2 + 5;
    sendButton = new TextButton(I18n.get("global.send"));
    sendButton.setPosition(x, y);
    sendButton.bindTo(twlRootPane);
    sendButton.setActionHandler(new ActionHandler() {

      @Override
      public void run() {
        sendResources();

      }
    });

    hide();
  }

  @Override
  public void render(Graphics g) throws SlickException {
    if (!isShown()) {
      return;
    }
    UIHelper.drawWindow(g, getOX(), getOY(), getWidth(), getHeight());
    closeButton.render(g);
    sendButton.render(g);
    resourceDispFrom.render(g);
    resourceDispTo.render(g);

    int x = getOX() + 10;
    int y = getOY() + 10 + comboFrom.getHeight() + 10
        + resourceDispFrom.getHeight();

    Resource[] resources = Resource.values();
    Image img;
    for (Resource r : resources) {
      img = ImageManager.getGfx(r.getGfxBase() + "-small");

      UIHelper.drawBlackBox(g, x, y, 20, 20);
      img.draw(x, y, r.getColor());

      y += 20 + 5;
    }
  }

  @Override
  public void update(Input input) throws SlickException {
    if (!isShown()) {
      return;
    }
    closeButton.update(input);
    sendButton.update(input);
    resourceDispFrom.update(input);
    resourceDispTo.update(input);

    updateSenderData();
    updateReseiverData();
  }

  public void show() {
    super.show();
    display(true);
    closeButton.show();
    sendButton.show();
    resourceDispFrom.show();
    resourceDispTo.show();
  }

  public void hide() {
    super.hide();
    display(false);
    closeButton.hide();
    sendButton.hide();
    resourceDispFrom.hide();
    resourceDispTo.hide();
  }

  private void display(boolean show) {
    comboFrom.setVisible(show);
    comboTo.setVisible(show);
    Resource[] resources = Resource.values();
    for (Resource r : resources) {
      fields.get(r).setVisible(show);
    }
  }

  private void sendResources() {
    final int from = comboFrom.getSelected();
    final int to = comboTo.getSelected();

    // 2 colonies must be selected
    if (from == -1 || to == -1) {
      // TODO play an error sound
      // TODO display an error message
      return;
    }

    // The colonies selected must be different!
    if (from == to) {
      // TODO play an error sound
      // TODO display an error message
      return;
    }
   
    final Colony sender = comboFrom.getModel().getEntry(from);
    final Colony receiver = comboTo.getModel().getEntry(to);
    // Is there enough resource in the sender colony?
    Map<Resource, BigDecimal> map = new HashMap<Resource, BigDecimal>();
    Resource[] resources = Resource.values();
    for (Resource r : resources) {
      String strVal = fields.get(r).getText();
      if ("".equals(strVal)) {
        strVal = "0";
      }
      BigDecimal value = BigDecimal.valueOf(Long.valueOf(strVal));
      map.put(r, value);
    }
    if (!ResourceHelper.enoughResourcesFor(map, sender)) {
      // TODO play an error sound
      // TODO display an error message
      return;
    }

    // Is there enough space in the target colony?
    if (!ResourceHelper.enoughSpaceFor(map, receiver)) {
      // TODO play an error sound
      // TODO display an error message
      return;
    }

    // Everything is allright, resources can be transfered
    // Remove from sender and add to receiver...
    for (Resource r : resources) {
      // Send...
      sender.updateResource(r, map.get(r).negate());
      // Receive...
      receiver.updateResource(r, map.get(r));
    }
    hide();
  }

  protected void updateSenderData() {
    if (comboFrom.getSelected() == -1) {
      return;
    }
    Colony c = colonyList.getEntry(comboFrom.getSelected());
    resourceDispFrom.setMap(ResourceHelper.cloneMap(c.getResources()));
  }

  protected void updateReseiverData() {
    if (comboTo.getSelected() == -1) {
      return;
    }
    Colony c = colonyList.getEntry(comboTo.getSelected());
    resourceDispTo.setMap(ResourceHelper.cloneMap(c.getResources()));
  }

  public void reloadList() {
    colonyList = new SimpleChangableListModel<Colony>(
        GameData.getColonies());
    comboFrom.setModel(colonyList);
    comboTo.setModel(colonyList);
   
    comboFrom.invalidateLayout();
    comboTo.invalidateLayout();
  }
}
TOP

Related Classes of com.drakulo.games.ais.ui.component.TransferWindow

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.