private void editKey(ECKey key, int row) throws BlockStoreException {
   Address addr = key.toAddress();
   while (true) {
     addr = AddressEditDialog.showDialog(this, addr, false);
     if (addr == null) break;
     String label = addr.getLabel();
     boolean valid = true;
     synchronized (BTCLoader.lock) {
       for (ECKey chkKey : BTCLoader.keys) {
         if (chkKey == key) continue;
         if (chkKey.getLabel().compareToIgnoreCase(label) == 0) {
           JOptionPane.showMessageDialog(
               this, "Duplicate name specified", "Error", JOptionPane.ERROR_MESSAGE);
           valid = false;
           break;
         }
       }
       if (valid) {
         if (row >= 0) BTCLoader.keys.remove(row);
         boolean added = false;
         for (int i = 0; i < BTCLoader.keys.size(); i++) {
           ECKey chkKey = BTCLoader.keys.get(i);
           if (chkKey.getLabel().compareToIgnoreCase(label) > 0) {
             key.setLabel(label);
             BTCLoader.keys.add(i, key);
             added = true;
             break;
           }
         }
         if (!added) {
           key.setLabel(label);
           BTCLoader.keys.add(key);
         }
       }
     }
     if (valid) {
       if (row >= 0) {
         BTCLoader.blockStore.setKeyLabel(key);
       } else {
         BTCLoader.blockStore.storeKey(key);
         BTCLoader.bloomFilter.insert(key.getPubKey());
         BTCLoader.bloomFilter.insert(key.getPubKeyHash());
         Message filterMsg = FilterLoadMessage.buildFilterLoadMessage(null, BTCLoader.bloomFilter);
         BTCLoader.networkHandler.broadcastMessage(filterMsg);
       }
       tableModel.fireTableDataChanged();
       break;
     }
   }
 }
 @Override
 public void actionPerformed(ActionEvent ae) {
   try {
     String action = ae.getActionCommand();
     if (action.equals("done")) {
       setVisible(false);
       dispose();
     } else if (action.equals("new")) {
       ECKey key = new ECKey();
       editKey(key, -1);
     } else {
       int row = table.getSelectedRow();
       if (row < 0) {
         JOptionPane.showMessageDialog(
             this, "No entry selected", "Error", JOptionPane.ERROR_MESSAGE);
       } else {
         row = table.convertRowIndexToModel(row);
         switch (action) {
           case "copy":
             String address = (String) tableModel.getValueAt(row, 1);
             StringSelection sel = new StringSelection(address);
             Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
             cb.setContents(sel, null);
             break;
           case "edit":
             ECKey key = BTCLoader.keys.get(row);
             editKey(key, row);
             break;
         }
       }
     }
   } catch (BlockStoreException exc) {
     ErrorLog.logException("Unable to update blockStore database", exc);
   } catch (Exception exc) {
     ErrorLog.logException("Exception while processing action event", exc);
   }
 }