@Override
  public void keyPressed(KeyEvent e) {
    // Do not edit neural web while user is selecting key bindings
    if (expandContractKey.isActive()
        || newNeuronKey.isActive()
        || newClusterKey.isActive()
        || deleteKey.isActive()) return;

    try {
      if (e.getKeyChar() == expandContractKey.getText().charAt(0)) {
        if (selectedCluster != null && selectedCluster.clusterNum != 0)
          selectedCluster.expanded = !selectedCluster.expanded;
        else if (selectedNeuron != null)
          selectedNeuron.cluster.expanded = !selectedNeuron.cluster.expanded;

        redraw = true;
      } else if (e.getKeyChar() == newNeuronKey.getText().charAt(0)) {
        Cluster cluster;

        if (selectedCluster != null) cluster = selectedCluster;
        else if (selectedNeuron != null) cluster = selectedNeuron.cluster;
        else if (clusters.size() > 2) {
          cluster = clusters.get(2);
        } else {
          WindowTools.informationWindow(
              "Error: You cannot add a neuron without a cluster, please select a Neuron or a Cluster.",
              "Error");
          return;
        }

        int x = Math.min(Main.canvasWidth - 11, Math.max(10, mouseX));
        int y = Math.min(Main.canvasHeight - 33, Math.max(33, mouseY));

        neurons.add(new Neuron(x, y, cluster));

        redraw = true;
      } else if (e.getKeyChar() == newClusterKey.getText().charAt(0)) {
        int x = Math.min(Main.canvasWidth - 11, Math.max(10, mouseX));
        int y = Math.min(Main.canvasHeight - 33, Math.max(33, mouseY));

        clusters.add(new Cluster(x, y));

        redraw = true;
      } else if (e.getKeyChar() == deleteKey.getText().charAt(0)) {
        if (selectedCluster != null) selectedCluster.delete();
        else if (selectedNeuron != null) selectedNeuron.delete();
        else if (selectedConnection != null) selectedConnection.delete();

        redraw = true;
      }
    } catch (StringIndexOutOfBoundsException sioobe) {
      WindowTools.informationWindow(
          "Invalid keybinding, please select a character for each action.", "Whoops!");
    }
  }
  @Test
  public void testDeleteLongListOfLong() {
    Connection db = getConnection();
    long app = getAppId();
    try {
      List<Long> ids = insertRecords();
      db.delete(app, ids);

      ResultSet rs = db.select(app, "");
      if (rs.size() != 0) {
        fail("failed to delete");
      }
    } catch (Exception e) {
      fail("db exception:" + e.getMessage());
    }
  }
  @Override
  public void mousePressed(MouseEvent e) {
    int x = e.getX();
    int y = e.getY();

    switch (e.getButton()) {
      case MouseEvent.BUTTON1:
        if (leftSelectButton.isChecked()) {
          for (Cluster c : clusters)
            if (c.collides(x, y)) {
              selectCluster(c);
              return;
            }

          for (Neuron n : neurons) {
            if (n.collides(x, y)) {
              selectNeuron(n);
              return;
            }
            for (Connection c : n.outgoingConnections)
              if (c.collides(x, y)) {
                selectConnection(c);
                return;
              }
          }

          for (Neuron n : inputs) {
            if (n.collides(x, y)) {
              selectNeuron(n);
              return;
            }
            for (Connection c : n.outgoingConnections)
              if (c.collides(x, y)) {
                selectConnection(c);
                return;
              }
          }

          for (Neuron n : outputs) {
            if (n.collides(x, y)) {
              selectNeuron(n);
              return;
            }
            for (Connection c : n.outgoingConnections)
              if (c.collides(x, y)) {
                selectConnection(c);
                return;
              }
          }
        }
        break;
      case MouseEvent.BUTTON3:
        if (rightConnectButton.isChecked()) {
          for (Neuron n : neurons) {
            if (n.collides(x, y) && n != selectedNeuron) {
              new Connection(selectedNeuron, n);
              return;
            }
          }

          for (Neuron n : inputs) {
            if (n.collides(x, y) && n != selectedNeuron) {
              new Connection(selectedNeuron, n);
              return;
            }
          }

          for (Neuron n : outputs) {
            if (n.collides(x, y) && n != selectedNeuron) {
              new Connection(selectedNeuron, n);
              return;
            }
          }
        } else if (rightDeleteButton.isChecked()) {
          for (Cluster c : clusters)
            if (c.collides(x, y)) {
              c.delete();
              return;
            }

          for (Neuron n : neurons) {
            if (n.collides(x, y)) {
              n.delete();
              return;
            }
            for (Connection c : n.outgoingConnections)
              if (c.collides(x, y)) {
                c.delete();
                return;
              }
          }

          for (Neuron n : inputs) {
            if (n.collides(x, y)) {
              n.delete();
              return;
            }
            for (Connection c : n.outgoingConnections)
              if (c.collides(x, y)) {
                c.delete();
                return;
              }
          }

          for (Neuron n : outputs) {
            if (n.collides(x, y)) {
              n.delete();
              return;
            }
            for (Connection c : n.outgoingConnections)
              if (c.collides(x, y)) {
                c.delete();
                return;
              }
          }
        }
    }
  }