public void handleActionKey() {
    LibraryFilesTableDataLine line = DATA_MODEL.get(TABLE.getSelectedRow());
    if (line == null || line.getFile() == null) {
      return;
    }
    if (getMediaType().equals(MediaType.getAudioMediaType())
        && MediaPlayer.isPlayableFile(line.getFile())) {
      MediaPlayer.instance()
          .asyncLoadMedia(new MediaSource(line.getFile()), true, false, true, null, getFilesView());
      UXStats.instance().log(UXAction.LIBRARY_PLAY_AUDIO_FROM_FILE);
      return;
    }

    int[] rows = TABLE.getSelectedRows();
    // LibraryTableModel ltm = DATA_MODEL;
    // File file;
    for (int i = 0; i < rows.length; i++) {
      // file = ltm.getFile(rows[i]);
      // if it's a directory try to select it in the library tree
      // if it could be selected return
      //			if (file.isDirectory()
      //				&& LibraryMediator.setSelectedDirectory(file))
      //				return;
    }

    launch(true);
  }
 @Override
 protected void setDefaultRenderers() {
   super.setDefaultRenderers();
   TABLE.setDefaultRenderer(PlayableIconCell.class, new PlayableIconCellRenderer());
   TABLE.setDefaultRenderer(PlayableCell.class, new PlayableCellRenderer());
   TABLE.setDefaultRenderer(PaymentOptions.class, new PaymentOptionsRenderer());
 }
  /** Sets the default editors. */
  protected void setDefaultEditors() {
    TableColumnModel model = TABLE.getColumnModel();

    TableColumn tc = model.getColumn(LibraryPlaylistsTableDataLine.STARRED_IDX);
    tc.setCellEditor(new PlaylistItemStarEditor());

    TABLE.addMouseMotionListener(
        new MouseMotionAdapter() {
          int currentCellColumn = -1;
          int currentCellRow = -1;

          @Override
          public void mouseMoved(MouseEvent e) {
            Point hit = e.getPoint();
            int hitColumn = TABLE.columnAtPoint(hit);
            int hitRow = TABLE.rowAtPoint(hit);
            if (currentCellRow != hitRow || currentCellColumn != hitColumn) {
              if (TABLE.getCellRenderer(hitRow, hitColumn) instanceof PlaylistItemStarRenderer) {
                TABLE.editCellAt(hitRow, hitColumn);
              }
              currentCellColumn = hitColumn;
              currentCellRow = hitRow;
            }
          }
        });

    tc = model.getColumn(LibraryPlaylistsTableDataLine.TITLE_IDX);
    tc.setCellEditor(new LibraryNameHolderEditor());
  }
 @Override
 protected void setupDragAndDrop() {
   TABLE.setDragEnabled(true);
   TABLE.setTransferHandler(
       new MulticastTransferHandler(
           new ResultPanelTransferHandler(this), DNDUtils.DEFAULT_TRANSFER_HANDLERS));
 }
 /** Sets the default renderers to be used in the table. */
 protected void setDefaultRenderers() {
   super.setDefaultRenderers();
   TABLE.setDefaultRenderer(Date.class, DATE_RENDERER);
   TABLE.setDefaultRenderer(Float.class, PERCENTAGE_RENDERER);
   TABLE.setDefaultRenderer(SearchResultNameHolder.class, SEARCH_RESULT_NAME_RENDERER);
   TABLE.setDefaultRenderer(SearchResultActionsHolder.class, SEARCH_RESULT_ACTIONS_RENDERER);
   TABLE.setDefaultRenderer(SourceHolder.class, SOURCE_RENDERER);
 }
 @Override
 protected void setDefaultRenderers() {
   super.setDefaultRenderers();
   TABLE.setDefaultRenderer(PlaylistItemBitRateProperty.class, new PlaylistItemPropertyRenderer());
   TABLE.setDefaultRenderer(PlaylistItemTrackProperty.class, new PlaylistItemPropertyRenderer());
   TABLE.setDefaultRenderer(PlaylistItemStringProperty.class, new PlaylistItemPropertyRenderer());
   TABLE.setDefaultRenderer(PlaylistItemStarProperty.class, new PlaylistItemStarRenderer());
   TABLE.setDefaultRenderer(LibraryNameHolder.class, new LibraryNameHolderRenderer());
 }
 public boolean setFileSelected(File file) {
   int i = DATA_MODEL.getRow(file);
   if (i != -1) {
     TABLE.setSelectedRow(i);
     TABLE.ensureSelectionVisible();
     return true;
   }
   return false;
 }
  // inherit doc comment
  protected JPopupMenu createPopupMenu() {
    if (TABLE.getSelectionModel().isSelectionEmpty()) {
      return null;
    }

    JPopupMenu menu = new SkinPopupMenu();

    menu.add(new SkinMenuItem(LAUNCH_ACTION));
    if (getMediaType().equals(MediaType.getAudioMediaType())) {
      menu.add(new SkinMenuItem(LAUNCH_OS_ACTION));
    }
    if (hasExploreAction()) {
      menu.add(new SkinMenuItem(OPEN_IN_FOLDER_ACTION));
    }

    if (areAllSelectedFilesMP4s()) {
      menu.add(DEMUX_MP4_AUDIO_ACTION);
      DEMUX_MP4_AUDIO_ACTION.setEnabled(
          !((DemuxMP4AudioAction) DEMUX_MP4_AUDIO_ACTION).isDemuxing());
    }

    menu.add(new SkinMenuItem(CREATE_TORRENT_ACTION));

    if (areAllSelectedFilesPlayable()) {
      menu.add(createAddToPlaylistSubMenu());
    }

    menu.add(new SkinMenuItem(SEND_TO_FRIEND_ACTION));
    menu.add(new SkinMenuItem(SEND_TO_ITUNES_ACTION));

    menu.addSeparator();
    menu.add(new SkinMenuItem(DELETE_ACTION));
    menu.addSeparator();

    int[] rows = TABLE.getSelectedRows();
    boolean dirSelected = false;
    boolean fileSelected = false;

    for (int i = 0; i < rows.length; i++) {
      File f = DATA_MODEL.get(rows[i]).getFile();
      if (f.isDirectory()) {
        dirSelected = true;
        //				if (IncompleteFileManager.isTorrentFolder(f))
        //					torrentSelected = true;
      } else fileSelected = true;

      if (dirSelected && fileSelected) break;
    }

    DELETE_ACTION.setEnabled(true);
    LibraryFilesTableDataLine line = DATA_MODEL.get(rows[0]);
    menu.add(createSearchSubMenu(line));
    return menu;
  }
  // inherit doc comment
  protected JPopupMenu createPopupMenu() {
    if (TABLE.getSelectionModel().isSelectionEmpty()) return null;

    JPopupMenu menu = new SkinPopupMenu();

    menu.add(new SkinMenuItem(LAUNCH_ACTION));
    menu.add(new SkinMenuItem(LAUNCH_OS_ACTION));
    if (hasExploreAction()) {
      menu.add(new SkinMenuItem(OPEN_IN_FOLDER_ACTION));
    }

    menu.add(new SkinMenuItem(CREATE_TORRENT_ACTION));
    menu.add(createAddToPlaylistSubMenu());
    menu.add(new SkinMenuItem(SEND_TO_FRIEND_ACTION));

    menu.add(new SkinMenuItem(SEND_TO_ITUNES_ACTION));

    menu.addSeparator();
    menu.add(new SkinMenuItem(DELETE_ACTION));

    int[] rows = TABLE.getSelectedRows();
    boolean dirSelected = false;
    boolean fileSelected = false;

    for (int i = 0; i < rows.length; i++) {
      File f = DATA_MODEL.get(rows[i]).getFile();
      if (f.isDirectory()) {
        dirSelected = true;
        //				if (IncompleteFileManager.isTorrentFolder(f))
        //					torrentSelected = true;
      } else fileSelected = true;

      if (dirSelected && fileSelected) break;
    }
    if (dirSelected) {
      DELETE_ACTION.setEnabled(true);
    } else {
      DELETE_ACTION.setEnabled(true);
    }

    menu.addSeparator();
    menu.add(new SkinMenuItem(importToPlaylistAction));
    menu.add(new SkinMenuItem(exportPlaylistAction));
    menu.add(new SkinMenuItem(cleanupPlaylistAction));
    menu.add(new SkinMenuItem(refreshID3TagsAction));

    menu.addSeparator();
    LibraryPlaylistsTableDataLine line = DATA_MODEL.get(rows[0]);
    menu.add(createSearchSubMenu(line));

    return menu;
  }
  private void drawHelpGraphics(java.awt.Graphics g, Image icon) {

    Graphics2D g2d = (Graphics2D) g;
    int helpPadding = 20;

    g2d.setStroke(
        new BasicStroke(
            6,
            BasicStroke.CAP_ROUND,
            BasicStroke.JOIN_ROUND,
            10.0f,
            new float[] {16.0f, 20.0f},
            0.0f));
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    g2d.setColor(Color.WHITE);
    g2d.fillRect(0, 0, TABLE.getWidth(), TABLE.getHeight());

    g2d.setColor(ThemeMediator.CURRENT_THEME.getCustomUI().getDarkBorder());
    g2d.drawRoundRect(
        helpPadding,
        helpPadding,
        TABLE.getWidth() - helpPadding * 2,
        TABLE.getHeight() - helpPadding * 2,
        6,
        6);

    try {
      if ((TABLE.getHeight() - helpPadding * 3) < (icon.getHeight(null))) {
        int newIconDimension = TABLE.getHeight() - helpPadding * 2 - 5;
        if (newIconDimension > 16) {
          g2d.drawImage(
              icon,
              (TABLE.getWidth() - newIconDimension) / 2,
              (TABLE.getHeight() - newIconDimension) / 2,
              newIconDimension,
              newIconDimension,
              null);
        }
      } else {
        g2d.drawImage(
            icon,
            (TABLE.getWidth() - icon.getWidth(null)) / 2,
            (TABLE.getHeight() - icon.getHeight(null)) / 2,
            null);
      }
    } catch (Throwable t) {
      // don't stop till you get enough
    }
  }
  /**
   * Specialized constructor for creating a "dummy" result panel. This should only be called once at
   * search window creation-time.
   */
  SearchResultMediator(JPanel overlay) {
    super(SEARCH_TABLE);
    setupFakeTable(overlay);

    SEARCH_INFO = SearchInformation.createKeywordSearch("", null, MediaType.getAnyTypeMediaType());
    FILTER = null;
    this.token = 0;
    this.searchTokens = null;
    setButtonEnabled(SearchButtons.TORRENT_DETAILS_BUTTON_INDEX, false);
    // disable dnd for overlay panel
    TABLE.setDragEnabled(false);
    TABLE.setTransferHandler(null);

    SOUTH_PANEL.setVisible(false);
  }
  /** Launches the associated applications for each selected file in the library if it can. */
  void launch(boolean playMedia) {
    int[] rows = TABLE.getSelectedRows();
    if (rows.length == 0) {
      return;
    }

    File selectedFile = DATA_MODEL.getFile(rows[0]);

    if (OSUtils.isWindows()) {
      if (selectedFile.isDirectory()) {
        GUIMediator.launchExplorer(selectedFile);
        return;
      } else if (!MediaPlayer.isPlayableFile(selectedFile)) {
        GUIMediator.launchFile(selectedFile);
        return;
      }
    }

    LaunchableProvider[] providers = new LaunchableProvider[rows.length];
    for (int i = 0; i < rows.length; i++) {
      providers[i] = new FileProvider(DATA_MODEL.getFile(rows[i]));
    }
    if (!playMedia) {
      MediaPlayer.instance().stop();
    }

    if (playMedia) {
      GUILauncher.launch(providers);
    } else {
      GUIMediator.launchFile(selectedFile);
    }
  }
  /**
   * Handles the selection rows in the library window, enabling or disabling buttons and chat menu
   * items depending on the values in the selected rows.
   *
   * @param row the index of the first row that is selected
   */
  public void handleSelection(int row) {
    int[] sel = TABLE.getSelectedRows();
    if (sel.length == 0) {
      handleNoSelection();
      return;
    }

    File selectedFile = getFile(sel[0]);

    //  always turn on Launch, Delete, Magnet Lookup, Bitzi Lookup
    LAUNCH_ACTION.setEnabled(true);
    LAUNCH_OS_ACTION.setEnabled(true);
    DELETE_ACTION.setEnabled(true);
    SEND_TO_ITUNES_ACTION.setEnabled(true);

    if (selectedFile != null && !selectedFile.getName().endsWith(".torrent")) {
      CREATE_TORRENT_ACTION.setEnabled(sel.length == 1);
    }

    if (selectedFile != null) {
      SEND_TO_FRIEND_ACTION.setEnabled(sel.length == 1);
    }

    if (sel.length == 1 && selectedFile.isFile() && selectedFile.getParentFile() != null) {
      OPEN_IN_FOLDER_ACTION.setEnabled(true);
    } else {
      OPEN_IN_FOLDER_ACTION.setEnabled(false);
    }

    if (sel.length == 1) {
      LibraryMediator.instance()
          .getLibraryCoverArt()
          .setFile(getSelectedLibraryLines()[0].getFile());
    }
  }
    @Override
    public void actionPerformed(ActionEvent arg0) {
      File selectedFile = DATA_MODEL.getFile(TABLE.getSelectedRow());

      // can't create torrents out of empty folders.
      if (selectedFile.isDirectory() && selectedFile.listFiles().length == 0) {
        JOptionPane.showMessageDialog(
            null,
            I18n.tr("The folder you selected is empty."),
            I18n.tr("Invalid Folder"),
            JOptionPane.ERROR_MESSAGE);
        return;
      }

      // can't create torrents if the folder/file can't be read
      if (!selectedFile.canRead()) {
        JOptionPane.showMessageDialog(
            null,
            I18n.tr("Error: You can't read on that file/folder."),
            I18n.tr("Error"),
            JOptionPane.ERROR_MESSAGE);
        return;
      }

      CreateTorrentDialog dlg = new CreateTorrentDialog(GUIMediator.getAppFrame());
      dlg.setChosenContent(selectedFile);
      dlg.setVisible(true);
    }
 /**
  * Sets extra values for non dummy ResultPanels. (Used for all tables that will have results.)
  *
  * <p>Currently: - Sorts the count column, if it is visible & real-time sorting is on. - Adds
  * listeners, so the filters can be displayed when necessary.
  */
 private void setupRealTable() {
   SearchTableColumns columns = ((ResultPanelModel) DATA_MODEL).getColumns();
   LimeTableColumn countColumn = columns.getColumn(SearchTableColumns.COUNT_IDX);
   if (SETTINGS.REAL_TIME_SORT.getValue() && TABLE.isColumnVisible(countColumn.getId())) {
     DATA_MODEL.sort(SearchTableColumns.COUNT_IDX); // ascending
     DATA_MODEL.sort(SearchTableColumns.COUNT_IDX); // descending
   }
 }
  /**
   * Gets all currently selected TableLines.
   *
   * @return empty array if no lines are selected.
   */
  SearchResultDataLine[] getAllSelectedLines() {
    int[] rows = TABLE.getSelectedRows();
    if (rows == null) return new SearchResultDataLine[0];

    SearchResultDataLine[] lines = new SearchResultDataLine[rows.length];
    for (int i = 0; i < rows.length; i++) lines[i] = DATA_MODEL.get(rows[i]);
    return lines;
  }
  /** Sets the default editors. */
  protected void setDefaultEditors() {
    TableColumnModel model = TABLE.getColumnModel();

    TableColumn tc = model.getColumn(LibraryFilesTableDataLine.ACTIONS_IDX);
    tc.setCellEditor(new GenericCellEditor(getAbstractActionsRenderer()));

    tc = model.getColumn(LibraryFilesTableDataLine.PAYMENT_OPTIONS_IDX);
    tc.setCellEditor(new GenericCellEditor(new PaymentOptionsRenderer()));
  }
  protected void setDefaultEditors() {
    TableColumnModel model = TABLE.getColumnModel();
    TableColumn tc;
    tc = model.getColumn(SearchTableColumns.ACTIONS_IDX);
    tc.setCellEditor(new GenericCellEditor(new SearchResultActionsRenderer()));

    tc = model.getColumn(SearchTableColumns.SOURCE_IDX);
    tc.setCellEditor(new GenericCellEditor(new SourceRenderer()));
  }
 private List<File> getSelectedFiles() {
   int[] rows = TABLE.getSelectedRows();
   List<File> files = new ArrayList<File>(rows.length);
   for (int i = 0; i < rows.length; i++) {
     int index = rows[i]; // current index to add
     File file = DATA_MODEL.getFile(index);
     files.add(file);
   }
   return files;
 }
    @Override
    public void actionPerformed(ActionEvent e) {
      int[] rows = TABLE.getSelectedRows();
      for (int i = 0; i < rows.length; i++) {
        int index = rows[i]; // current index to add
        File file = DATA_MODEL.getFile(index);

        iTunesMediator.instance().scanForSongs(file);
      }
    }
  /**
   * Handles the selection rows in the library window, enabling or disabling buttons and chat menu
   * items depending on the values in the selected rows.
   *
   * @param row the index of the first row that is selected
   */
  public void handleSelection(int row) {
    int[] sel = TABLE.getSelectedRows();
    if (sel.length == 0) {
      handleNoSelection();
      return;
    }

    File selectedFile = getFile(sel[0]);

    //  always turn on Launch, Delete, Magnet Lookup, Bitzi Lookup
    LAUNCH_ACTION.setEnabled(true);
    LAUNCH_OS_ACTION.setEnabled(true);
    DELETE_ACTION.setEnabled(true);

    if (selectedFile != null && !selectedFile.getName().endsWith(".torrent")) {
      CREATE_TORRENT_ACTION.setEnabled(sel.length == 1);
    }

    if (selectedFile != null) {
      SEND_TO_FRIEND_ACTION.setEnabled(sel.length == 1);

      if (getMediaType().equals(MediaType.getAnyTypeMediaType())) {
        boolean atLeastOneIsPlayable = false;

        for (int i : sel) {
          File f = getFile(i);
          if (MediaPlayer.isPlayableFile(f) || hasExtension(f.getAbsolutePath(), "mp4")) {
            atLeastOneIsPlayable = true;
            break;
          }
        }

        SEND_TO_ITUNES_ACTION.setEnabled(atLeastOneIsPlayable);
      } else {
        SEND_TO_ITUNES_ACTION.setEnabled(
            getMediaType().equals(MediaType.getAudioMediaType())
                || hasExtension(selectedFile.getAbsolutePath(), "mp4"));
      }
    }

    if (sel.length == 1 && selectedFile.isFile() && selectedFile.getParentFile() != null) {
      OPEN_IN_FOLDER_ACTION.setEnabled(true);
    } else {
      OPEN_IN_FOLDER_ACTION.setEnabled(false);
    }

    if (sel.length == 1) {
      LibraryMediator.instance().getLibraryCoverArt().setFile(selectedFile);
    }

    //        boolean anyBeingShared = isAnyBeingShared();
    //        WIFI_SHARE_ACTION.setEnabled(!anyBeingShared);
    //        WIFI_UNSHARE_ACTION.setEnabled(!anyBeingShared);
  }
    public void actionPerformed(ActionEvent ae) {
      int[] sel = TABLE.getSelectedRows();
      if (sel.length == 0) {
        return;
      }

      File selectedFile = getFile(sel[0]);
      if (selectedFile.isFile() && selectedFile.getParentFile() != null) {
        GUIMediator.launchExplorer(selectedFile);
      }
    }
 private boolean areAllSelectedFilesPlayable() {
   boolean selectionIsAllAudio = true;
   int[] selectedRows = TABLE.getSelectedRows();
   for (int i : selectedRows) {
     if (!MediaPlayer.isPlayableFile(DATA_MODEL.get(i).getInitializeObject())) {
       selectionIsAllAudio = false;
       break;
     }
   }
   return selectionIsAllAudio;
 }
 @Override
 public void actionPerformed(ActionEvent e) {
   int[] rows = TABLE.getSelectedRows();
   List<File> files = new ArrayList<File>();
   for (int i = 0; i < rows.length; i++) {
     int index = rows[i]; // current index to add
     File file = DATA_MODEL.getFile(index);
     files.add(file);
   }
   iTunesMediator.instance().scanForSongs(files.toArray(new File[0]));
 }
  private boolean areAllSelectedFilesMP4s() {
    boolean selectionIsAllMP4 = true;
    int[] selectedRows = TABLE.getSelectedRows();
    for (int i : selectedRows) {
      if (!DATA_MODEL.getFile(i).getAbsolutePath().toLowerCase().endsWith("mp4")) {
        selectionIsAllMP4 = false;
        break;
      }
    }

    return selectionIsAllMP4;
  }
  private void playMedia() {
    LibraryPlaylistsTableDataLine line = DATA_MODEL.get(TABLE.getSelectedRow());
    if (line == null || line.getPlayListItem() == null) {
      return;
    }

    MediaSource mediaSource = new MediaSource(line.getPlayListItem());
    if (MediaPlayer.isPlayableFile(mediaSource)) {
      MediaPlayer.instance()
          .asyncLoadMedia(mediaSource, true, true, currentPlaylist, getFilesView());
    }
  }
  /** Launches the associated applications for each selected file in the library if it can. */
  void launch(boolean playAudio) {
    int[] rows = TABLE.getSelectedRows();
    if (rows.length == 0) {
      return;
    }

    File selectedFile = DATA_MODEL.getFile(rows[0]);

    if (OSUtils.isWindows()) {
      if (selectedFile.isDirectory()) {
        GUIMediator.launchExplorer(selectedFile);
        return;
      } else if (!MediaPlayer.isPlayableFile(selectedFile)) {
        String extension = FilenameUtils.getExtension(selectedFile.getName());
        if (extension != null && extension.equals("torrent")) {
          GUIMediator.instance().openTorrentFile(selectedFile, true);
        } else {
          GUIMediator.launchFile(selectedFile);
        }
        return;
      }
    }

    LaunchableProvider[] providers = new LaunchableProvider[rows.length];
    boolean stopAudio = false;
    for (int i = 0; i < rows.length; i++) {
      try {
        MediaType mt =
            MediaType.getMediaTypeForExtension(
                FilenameUtils.getExtension(DATA_MODEL.getFile(rows[i]).getName()));
        if (mt.equals(MediaType.getVideoMediaType())) {
          stopAudio = true;
        }
      } catch (Throwable e) {
        // ignore
      }
      providers[i] = new FileProvider(DATA_MODEL.getFile(rows[i]));
    }
    if (stopAudio || !playAudio) {
      MediaPlayer.instance().stop();
    }

    if (playAudio) {
      GUILauncher.launch(providers);
      UXStats.instance()
          .log(stopAudio ? UXAction.LIBRARY_VIDEO_PLAY : UXAction.LIBRARY_PLAY_AUDIO_FROM_FILE);
    } else {
      GUIMediator.launchFile(selectedFile);
    }
  }
  @Override
  protected void addListeners() {
    super.addListeners();

    TABLE.addKeyListener(
        new KeyAdapter() {
          @Override
          public void keyReleased(KeyEvent e) {
            if (LibraryUtils.isRefreshKeyEvent(e)) {
              LibraryMediator.instance().getLibraryPlaylists().refreshSelection();
            }
          }
        });
  }
  /**
   * Notification that a filter on this panel has changed.
   *
   * <p>Updates the data model with the new list, maintains the selection, and moves the viewport to
   * the first still visible selected row.
   *
   * <p>Note that the viewport moving cannot be done by just storing the first visible row, because
   * after the filters change, the row might not exist anymore. Thus, it is necessary to store all
   * visible rows and move to the first still-visible one.
   */
  boolean filterChanged(TableLineFilter<SearchResultDataLine> filter, int depth) {
    FILTER.setFilter(depth, filter);
    // if(!FILTER.setFilter(depth, filter))
    //    return false;

    // store the selection & visible rows
    int[] rows = TABLE.getSelectedRows();
    SearchResultDataLine[] lines = new SearchResultDataLine[rows.length];
    List<SearchResultDataLine> inView = new LinkedList<SearchResultDataLine>();
    for (int i = 0; i < rows.length; i++) {
      int row = rows[i];
      SearchResultDataLine line = DATA_MODEL.get(row);
      lines[i] = line;
      if (TABLE.isRowVisible(row)) inView.add(line);
    }

    // change the table.
    DATA_MODEL.filtersChanged();

    // reselect & move the viewpoint to the first still visible row.
    for (int i = 0; i < rows.length; i++) {
      SearchResultDataLine line = lines[i];
      int row = DATA_MODEL.getRow(line);
      if (row != -1) {
        TABLE.addRowSelectionInterval(row, row);
        if (inView != null && inView.contains(line)) {
          TABLE.ensureRowVisible(row);
          inView = null;
        }
      }
    }

    // update the tab count.
    SearchMediator.setTabDisplayCount(this);
    return true;
  }
    @Override
    public void actionPerformed(ActionEvent e) {
      final short videoCount = (short) TABLE.getSelectedRows().length;

      // can't happen, but just in case.
      if (videoCount < 1) {
        return;
      }

      // get selected files before we switch to audio and loose the selection
      final List<File> selectedFiles = getSelectedFiles();

      selectAudio();

      String status = I18n.tr("Extracting audio from " + videoCount + " selected videos...");
      if (videoCount == 1) {
        status = I18n.tr("Extracting audio from selected video...");
      }
      LibraryMediator.instance().getLibrarySearch().pushStatus(status);

      SwingWorker<Void, Void> demuxWorker =
          new SwingWorker<Void, Void>() {

            @Override
            protected Void doInBackground() throws Exception {
              isDemuxing = true;
              demuxFiles(selectedFiles);
              isDemuxing = false;
              return null;
            }

            @Override
            protected void done() {
              int failed = videoCount - demuxedFiles.size();
              String failedStr = (failed > 0) ? " (" + failed + " " + I18n.tr("failed") + ")" : "";
              LibraryMediator.instance()
                  .getLibrarySearch()
                  .pushStatus(I18n.tr("Done extracting audio.") + failedStr);
            }
          };
      demuxWorker.execute();
    }