Package net.sf.robocode.ui.dialog

Source Code of net.sf.robocode.ui.dialog.RobotSelectionPanel$EventHandler

/**
* Copyright (c) 2001-2014 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*/
package net.sf.robocode.ui.dialog;


import net.sf.robocode.core.Container;
import net.sf.robocode.repository.IRobotSpecItem;
import net.sf.robocode.repository.IRepositoryManager;
import net.sf.robocode.ui.IWindowManager;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;


/**
* @author Mathew A. Nelson (original)
* @author Matthew Reeder (contributor)
* @author Flemming N. Larsen (contributor)
* @author Robert D. Maupin (contributor)
*/
@SuppressWarnings("serial")
public class RobotSelectionPanel extends WizardPanel {

  private AvailableRobotsPanel availableRobotsPanel;

  private JPanel selectedRobotsPanel;
  private JScrollPane selectedRobotsScrollPane;
  private JList selectedRobotsList;

  private JPanel buttonsPanel;
  private JPanel addButtonsPanel;
  private JPanel removeButtonsPanel;
  private JButton addButton;
  private JButton addAllButton;
  private JButton removeButton;
  private JButton removeAllButton;

  private final EventHandler eventHandler = new EventHandler();
  private RobotDescriptionPanel descriptionPanel;
  private String instructions;
  private JLabel instructionsLabel;
  private JPanel mainPanel;
  private int maxRobots = 1;
  private int minRobots = 1;
  private boolean onlyShowSource;
  private boolean onlyShowWithPackage;
  private boolean onlyShowRobots;
  private boolean onlyShowDevelopment;
  private boolean onlyShowInJar;
  private boolean ignoreTeamRobots;
  private String preSelectedRobots;
  private final List<AvailableRobotsPanel.ItemWrapper> selectedRobots = new ArrayList<AvailableRobotsPanel.ItemWrapper>();
  private final IRepositoryManager repositoryManager;

  public RobotSelectionPanel(IRepositoryManager repositoryManager) {
    super();
    this.repositoryManager = repositoryManager;
  }

  public void setup(int minRobots, int maxRobots,
      boolean showNumRoundsPanel, String instructions, boolean onlyShowSource, boolean onlyShowWithPackage,
      boolean onlyShowRobots, boolean onlyShowDevelopment, boolean onlyShowInJar, boolean ignoreTeamRobots,
      String preSelectedRobots) {
    this.minRobots = minRobots;
    this.maxRobots = maxRobots;
    this.instructions = instructions;
    this.onlyShowSource = onlyShowSource;
    this.onlyShowWithPackage = onlyShowWithPackage;
    this.onlyShowRobots = onlyShowRobots;
    this.onlyShowDevelopment = onlyShowDevelopment;
    this.onlyShowInJar = onlyShowInJar;

    this.ignoreTeamRobots = ignoreTeamRobots;
    this.preSelectedRobots = preSelectedRobots;
    initialize();
  }

  private class EventHandler implements ActionListener, ListSelectionListener {
    public void actionPerformed(ActionEvent e) {
      if (e.getSource() == getAddAllButton()) {
        addAllButtonActionPerformed();
      } else if (e.getSource() == getAddButton()) {
        addButtonActionPerformed();
      } else if (e.getSource() == getRemoveAllButton()) {
        removeAllButtonActionPerformed();
      } else if (e.getSource() == getRemoveButton()) {
        removeButtonActionPerformed();
      }
    }

    public void valueChanged(ListSelectionEvent e) {
      if (e.getValueIsAdjusting()) {
        return;
      }
      if (e.getSource() == getSelectedRobotsList()) {
        selectedRobotsListSelectionChanged();
      }
    }
  }

  private void addAllButtonActionPerformed() {
    JList selectedList = getSelectedRobotsList();
    SelectedRobotsModel selectedModel = (SelectedRobotsModel) selectedList.getModel();

    for (AvailableRobotsPanel.ItemWrapper selected : availableRobotsPanel.getAvailableRobots()) {
      selectedRobots.add(selected);
    }

    selectedList.clearSelection();
    selectedModel.changed();
    fireStateChanged();
    if (selectedModel.getSize() >= minRobots && selectedModel.getSize() <= maxRobots) {
      showInstructions();
    } else if (selectedModel.getSize() > maxRobots) {
      showWrongNumInstructions();
    }

    availableRobotsPanel.getAvailableRobotsList().requestFocus();
  }

  private void addButtonActionPerformed() {
    SelectedRobotsModel selectedModel = (SelectedRobotsModel) getSelectedRobotsList().getModel();
    List<AvailableRobotsPanel.ItemWrapper> moves = availableRobotsPanel.getSelectedRobots();

    for (AvailableRobotsPanel.ItemWrapper move : moves) {
      selectedRobots.add(new AvailableRobotsPanel.ItemWrapper(move.getItem()));
    }

    selectedModel.changed();
    fireStateChanged();
    if (selectedModel.getSize() >= minRobots && selectedModel.getSize() <= maxRobots) {
      showInstructions();
    } else if (selectedModel.getSize() > maxRobots) {
      showWrongNumInstructions();
    }

    availableRobotsPanel.getAvailableRobotsList().requestFocus();
  }

  private JButton getAddAllButton() {
    if (addAllButton == null) {
      addAllButton = new JButton();
      addAllButton.setText("Add All ->");
      addAllButton.setMnemonic('l');
      addAllButton.setDisplayedMnemonicIndex(5);
      addAllButton.addActionListener(eventHandler);
    }
    return addAllButton;
  }

  private JButton getAddButton() {
    if (addButton == null) {
      addButton = new JButton();
      addButton.setText("Add ->");
      addButton.setMnemonic('A');
      addButton.addActionListener(eventHandler);
    }
    return addButton;
  }

  private JPanel getAddButtonsPanel() {
    if (addButtonsPanel == null) {
      addButtonsPanel = new JPanel();
      addButtonsPanel.setLayout(new GridLayout(2, 1));
      addButtonsPanel.add(getAddButton());
      addButtonsPanel.add(getAddAllButton());
    }
    return addButtonsPanel;
  }

  private JPanel getButtonsPanel() {
    if (buttonsPanel == null) {
      buttonsPanel = new JPanel();
      buttonsPanel.setLayout(new BorderLayout(5, 5));
      buttonsPanel.setBorder(BorderFactory.createEmptyBorder(21, 5, 5, 5));
      buttonsPanel.add(getAddButtonsPanel(), BorderLayout.NORTH);
      buttonsPanel.add(getRemoveButtonsPanel(), BorderLayout.SOUTH);
    }
    return buttonsPanel;
  }

  private JButton getRemoveAllButton() {
    if (removeAllButton == null) {
      removeAllButton = new JButton();
      removeAllButton.setText("<- Remove All");
      removeAllButton.setMnemonic('v');
      removeAllButton.setDisplayedMnemonicIndex(7);
      removeAllButton.addActionListener(eventHandler);
    }
    return removeAllButton;
  }

  private JButton getRemoveButton() {
    if (removeButton == null) {
      removeButton = new JButton();
      removeButton.setText("<- Remove");
      removeButton.setMnemonic('m');
      removeButton.setDisplayedMnemonicIndex(5);
      removeButton.addActionListener(eventHandler);
    }
    return removeButton;
  }

  private JPanel getRemoveButtonsPanel() {
    if (removeButtonsPanel == null) {
      removeButtonsPanel = new JPanel();
      removeButtonsPanel.setLayout(new GridLayout(2, 1));
      removeButtonsPanel.add(getRemoveButton());
      removeButtonsPanel.add(getRemoveAllButton());
    }
    return removeButtonsPanel;
  }

  public String getSelectedRobotsAsString() {
    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < selectedRobots.size(); i++) {
      if (i != 0) {
        sb.append(',');
      }
      sb.append(selectedRobots.get(i).getItem().getUniqueFullClassNameWithVersion());
    }
    return sb.toString();
  }

  public List<IRobotSpecItem> getSelectedRobots() {
    List<IRobotSpecItem> res = new ArrayList<IRobotSpecItem>();

    for (AvailableRobotsPanel.ItemWrapper item : selectedRobots) {
      res.add(item.getItem());
    }
    return res;
  }

  private JList getSelectedRobotsList() {
    if (selectedRobotsList == null) {
      selectedRobotsList = new JList();
      selectedRobotsList.setModel(new SelectedRobotsModel());
      selectedRobotsList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
      MouseListener mouseListener = new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
          if (e.getClickCount() == 2) {
            removeButtonActionPerformed();
          }
          if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0) {
            contextMenuActionPerformed();
          }
        }
      };

      selectedRobotsList.addMouseListener(mouseListener);
      selectedRobotsList.addListSelectionListener(eventHandler);
    }
    return selectedRobotsList;
  }

  private JPanel getSelectedRobotsPanel() {
    if (selectedRobotsPanel == null) {
      selectedRobotsPanel = new JPanel();
      selectedRobotsPanel.setLayout(new BorderLayout());
      selectedRobotsPanel.setPreferredSize(new Dimension(120, 100));
      selectedRobotsPanel.setBorder(
          BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Selected Robots"));
      selectedRobotsPanel.add(getSelectedRobotsScrollPane(), BorderLayout.CENTER);
    }
    return selectedRobotsPanel;
  }

  private JScrollPane getSelectedRobotsScrollPane() {
    if (selectedRobotsScrollPane == null) {
      selectedRobotsScrollPane = new JScrollPane();
      selectedRobotsScrollPane.setViewportView(getSelectedRobotsList());
    }
    return selectedRobotsScrollPane;
  }

  private void initialize() {
    setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    setLayout(new BorderLayout());
    add(getInstructionsLabel(), BorderLayout.NORTH);
    add(getMainPanel(), BorderLayout.CENTER);
    add(getDescriptionPanel(), BorderLayout.SOUTH);
    setVisible(true);
    showInstructions();
    refreshRobotList(false);
  }

  private void removeAllButtonActionPerformed() {
    JList selectedList = getSelectedRobotsList();
    SelectedRobotsModel selectedModel = (SelectedRobotsModel) selectedList.getModel();

    selectedRobots.clear();
    selectedList.clearSelection();
    selectedModel.changed();
    fireStateChanged();
    showInstructions();
  }

  private void contextMenuActionPerformed() {}

  private void removeButtonActionPerformed() {
    JList selectedList = getSelectedRobotsList();
    SelectedRobotsModel selectedModel = (SelectedRobotsModel) selectedList.getModel();
    int sel[] = selectedList.getSelectedIndices();

    for (int i = 0; i < sel.length; i++) {
      selectedRobots.remove(sel[i] - i);
    }
    selectedList.clearSelection();
    selectedModel.changed();
    fireStateChanged();
    if (selectedModel.getSize() < minRobots || selectedModel.getSize() > maxRobots) {
      showWrongNumInstructions();
    } else {
      showInstructions();
    }
  }

  class SelectedRobotsModel extends AbstractListModel {
    public void changed() {
      fireContentsChanged(this, 0, getSize());
    }

    public int getSize() {
      return selectedRobots.size();
    }

    public Object getElementAt(int which) {
      return selectedRobots.get(which);
    }
  }

  public AvailableRobotsPanel getAvailableRobotsPanel() {
    if (availableRobotsPanel == null) {
      availableRobotsPanel = new AvailableRobotsPanel(getAddButton(), "Available Robots", getSelectedRobotsList(),
          this);
    }
    return availableRobotsPanel;
  }

  private RobotDescriptionPanel getDescriptionPanel() {
    if (descriptionPanel == null) {
      descriptionPanel = new RobotDescriptionPanel();
      descriptionPanel.setBorder(BorderFactory.createEmptyBorder(1, 10, 1, 10));
    }
    return descriptionPanel;
  }

  private JLabel getInstructionsLabel() {
    if (instructionsLabel == null) {
      instructionsLabel = new JLabel();
      if (instructions != null) {
        instructionsLabel.setText(instructions);
      }
    }
    return instructionsLabel;
  }

  private JPanel getMainPanel() {
    if (mainPanel == null) {
      mainPanel = new JPanel();
      mainPanel.setPreferredSize(new Dimension(550, 300));
      GridBagLayout layout = new GridBagLayout();

      mainPanel.setLayout(layout);

      GridBagConstraints constraints = new GridBagConstraints();

      constraints.fill = GridBagConstraints.BOTH;
      constraints.weightx = 2;
      constraints.weighty = 1;
      constraints.anchor = GridBagConstraints.NORTHWEST;
      constraints.gridwidth = 2;
      layout.setConstraints(getAvailableRobotsPanel(), constraints);
      mainPanel.add(getAvailableRobotsPanel());
      constraints.gridwidth = 1;
      constraints.weightx = 0;
      constraints.weighty = 0;
      constraints.anchor = GridBagConstraints.CENTER;
      layout.setConstraints(getButtonsPanel(), constraints);
      mainPanel.add(getButtonsPanel());
      constraints.gridwidth = GridBagConstraints.REMAINDER;
      constraints.weightx = 1;
      constraints.weighty = 1;
      constraints.anchor = GridBagConstraints.NORTHWEST;
      layout.setConstraints(getSelectedRobotsPanel(), constraints);
      mainPanel.add(getSelectedRobotsPanel());
    }
    return mainPanel;
  }

  public int getSelectedRobotsCount() {
    return selectedRobots.size();
  }

  @Override
  public boolean isReady() {
    return (getSelectedRobotsCount() >= minRobots && getSelectedRobotsCount() <= maxRobots);
  }

  public void refreshRobotList(final boolean withClear) {

    final Runnable runnable = new Runnable() {
      public void run() {
        final IWindowManager windowManager = Container.getComponent(IWindowManager.class);

        try {
          windowManager.setBusyPointer(true);
          repositoryManager.refresh(withClear);

          List<IRobotSpecItem> robotList = repositoryManager.getRepositoryItems(onlyShowSource,
              onlyShowWithPackage, onlyShowRobots, onlyShowDevelopment, false, ignoreTeamRobots, onlyShowInJar);

          getAvailableRobotsPanel().setRobotList(robotList);
          if (preSelectedRobots != null && preSelectedRobots.length() > 0) {
            setSelectedRobots(preSelectedRobots);
            preSelectedRobots = null;
          }
        } finally {
          windowManager.setBusyPointer(false);
        }
      }
    };

    SwingUtilities.invokeLater(runnable);
  }

  private void selectedRobotsListSelectionChanged() {
    int sel[] = getSelectedRobotsList().getSelectedIndices();

    if (sel.length == 1) {
      availableRobotsPanel.clearSelection();
      IRobotSpecItem robotSpecification = ((AvailableRobotsPanel.ItemWrapper) getSelectedRobotsList().getModel().getElementAt(sel[0])).getItem();

      showDescription(robotSpecification);
    } else {
      showDescription(null);
    }
  }

  private void setSelectedRobots(String selectedRobotsString) {
    if (selectedRobotsString != null) {
      for (IRobotSpecItem item: repositoryManager.getSelectedSpecifications(selectedRobotsString)) {
        this.selectedRobots.add(new AvailableRobotsPanel.ItemWrapper(item));
      }
    }
    ((SelectedRobotsModel) getSelectedRobotsList().getModel()).changed();
    fireStateChanged();
  }

  public void showDescription(IRobotSpecItem robotSpecification) {
    getDescriptionPanel().showDescription(robotSpecification);
  }

  public void showInstructions() {
    if (instructions != null) {
      instructionsLabel.setText(instructions);
      instructionsLabel.setVisible(true);
    } else {
      instructionsLabel.setVisible(false);
    }
  }

  public void showWrongNumInstructions() {
    if (minRobots == maxRobots) {
      if (minRobots == 1) {
        instructionsLabel.setText("Please select exactly 1 robot.");
      } else {
        instructionsLabel.setText("Please select exactly " + minRobots + " robots.");
      }
    } else {
      instructionsLabel.setText("Please select between " + minRobots + " and " + maxRobots + " robots.");
    }
    instructionsLabel.setVisible(true);
  }
}
TOP

Related Classes of net.sf.robocode.ui.dialog.RobotSelectionPanel$EventHandler

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.