public void run() {
    try {
      if (!OptionsUI.instance.enablefilter.isSelected()) return;
      if (filter.isDisabled()) return;
      filter.removeSelectionListeners();
      int[] indices = filter.list.getSelectedIndices();
      Vector selected_keys = new Vector();
      DefaultListModel dlm = (DefaultListModel) filter.list.getModel();
      for (int i = 0; i < indices.length; ++i) {
        Object value = dlm.getElementAt(indices[i]);
        selected_keys.add(value);
      }
      Vector removed_keys = new Vector();
      Collection coll = filter.keys.entrySet();
      if (coll != null) {
        Iterator key_iter = coll.iterator();
        while (key_iter.hasNext()) {
          Map.Entry entry = (Map.Entry) key_iter.next();
          KeyRecord record = (KeyRecord) entry.getValue();
          if (record.songs.containsKey(song)) {
            record.songs.remove(song);
            if (record.songs.size() == 0) {
              removed_keys.add(record.key);
              boolean done = false;
              int i = 0;
              while ((i < dlm.size()) && !done) {
                Object key2 = dlm.getElementAt(i);
                if (record.key.equals(key2)) {
                  dlm.removeElementAt(i);
                  done = true;
                }
                ++i;
              }
            }
          }
        }
      }
      for (int i = 0; i < removed_keys.size(); ++i) {
        filter.keys.remove(removed_keys.get(i));
      }
      if (!removed) {
        Filter actual_parent = filter.parent;
        while ((actual_parent != null) && actual_parent.allSelected()) {
          actual_parent = actual_parent.parent;
        }
        if (actual_parent == null) {
          if (OptionsUI.instance.filterusestyles.isSelected()) {
            if (filter.column_id == 43) {
              // styles
            } else {
              if (StylesPane.instance.isMemberOfCurrentStyle(song)) {
                if (!OptionsUI.instance.filteraffectedbysearch.isSelected()
                    || RapidEvolutionUI.instance.passesSearchTest(song, false)) {
                  filter.populateKeyFromSong(song);
                }
              }
            }
          } else {
            if (filter.column_id == 43) {
              // styles
            } else {
              if (!OptionsUI.instance.filteraffectedbysearch.isSelected()
                  || RapidEvolutionUI.instance.passesSearchTest(song, true)) {
                filter.populateKeyFromSong(song);
              }
            }
          }
        } else {
          Collection keyset = actual_parent.songs.keySet();
          if (keyset != null) {
            Iterator s_iter = keyset.iterator();
            while (s_iter.hasNext()) {
              SongLinkedList iter = (SongLinkedList) s_iter.next();
              if (iter == song) {
                if (filter.column_id == 43) {
                  StyleLinkedList style = SongDB.instance.masterstylelist;
                  while (style != null) {
                    if (style.containsLogical(iter)) filter.populateKeyFromStyle(style, iter);
                    style = style.next;
                  }
                } else {
                  filter.populateKeyFromSong(iter);
                }
              }
            }
          }
        }
        coll = filter.keys.entrySet();
        if (coll != null) {
          Iterator key_iter = coll.iterator();
          while (key_iter.hasNext()) {
            Map.Entry entry = (Map.Entry) key_iter.next();
            KeyRecord record = (KeyRecord) entry.getValue();
            Comparable key = (Comparable) record.key;
            int index = ListUtil.sortedInsert(dlm, key);
          }
        }
      }

      Vector selected_indices = new Vector();
      for (int s = 0; s < selected_keys.size(); ++s) {
        Object key = selected_keys.get(s);
        if (filter.keys.containsKey(key)) {
          int i = 0;
          boolean done = false;
          while ((i < dlm.size()) && !done) {
            Object key2 = dlm.getElementAt(i);
            if (key.equals(key2)) {
              done = true;
              selected_indices.add(new Integer(i));
            }
            ++i;
          }
        }
      }
      int[] selected = new int[selected_indices.size()];
      for (int s = 0; s < selected.length; ++s) {
        selected[s] = ((Integer) selected_indices.get(s)).intValue();
      }
      filter.list.setSelectedIndices(selected);
      // if (indices.length != selected.length) {
      filter.valueChanged(null);
      // }
      filter.addSelectionListener();

    } catch (Exception e) {
      log.error("run(): error Exception", e);
    }
  }