/**
  * Set the current actor's default attack
  *
  * @param row the model row to set as default
  */
 public void setDefaultAttack(int row) {
   if (row < 0 || row >= currentActor.getNumAttacks()) {
     if (LOG.isLoggable(Level.INFO)) {
       LOG.info("Row out of range! " + row);
     }
     return;
   }
   // int oldDefault = currentActor.getDefaultAttack();
   currentActor.setDefaultAttack(row);
   // fireTableRowsUpdated(oldDefault, oldDefault);
   // fireTableRowsUpdated(row, row);
 }
  /**
   * Set the value at the row/col specified For cloned actors, this will update all clones (and fire
   * table updated events)
   *
   * @param value : Must be either int (for hp/damage/health) or String (for name/State/Type)
   * @param row : The row where the actor lives. Any clones will be updated also.
   * @param col : The column of the value to edit: use 'columns' enum to address.
   */
  @Override
  public void setValueAt(Object value, int row, int col) {
    if (LOG.isLoggable(Level.FINER)) {
      LOG.finer(
          "Setting value at "
              + row
              + ","
              + col
              + " to "
              + value
              + " (an instance of "
              + value.getClass()
              + ")");
    }

    // Check if there is any actual change
    if (getValueAt(row, col).equals(value)) {
      if (LOG.isLoggable(Level.FINER)) {
        LOG.finer("Values are identical. Exiting.");
      }
      return;
    }

    Attack a = currentActor.getAttack(row);
    switch (columns.values()[col]) {
      case Name:
        a.name = (String) value;
        break;
      case Skill:
        a.skill = (Integer) value;
        break;
      case Damage:
        a.damage = (String) value;
        break;
      case Unbalanced:
        a.unbalanced = (Boolean) value;
    }
    currentActor.setAttack(a, row);
    // Update the entire row, since changing state or type may affect formatting for all cells in
    // the row.
    fireTableRowsUpdated(row, row);
  }
 /** Remove all selected rows */
 public void removeAttacks(int[] rows) {
   if (currentActor != null && rows.length > 0) {
     for (int i = rows.length - 1; i >= 0; i--) { // Go from bottom up to preserve numbering
       if (LOG.isLoggable(Level.FINE)) {
         LOG.fine("Deleting row: " + rows[i]);
       }
       currentActor.removeAttack(
           rows[i]); // Just remove the rows indicated: not all instances of clones
     }
     // fireTableRowsDeleted(rows[0], rows[rows.length-1]);
   }
 }
 public Object getValueAt(int rowIndex, int columnIndex) {
   if (currentActor == null) return null;
   Attack attack = currentActor.getAttack(rowIndex);
   switch (columns.values()[columnIndex]) {
     case Name:
       return attack.name;
     case Skill:
       return attack.skill;
     case Damage:
       return attack.damage;
     case Unbalanced:
       return attack.unbalanced;
     default:
       return null;
   }
 }
 public int getRowCount() {
   if (currentActor == null) return 0;
   return currentActor.getNumAttacks();
 }
 /** Add new attack row */
 public void addAttack() {
   if (currentActor != null) {
     currentActor.addAttack(new Attack());
     // fireTableRowsInserted(getRowCount()-1, getRowCount()-1);
   }
 }