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());
 }
 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;
  }
    @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,
          selectedFile.isFile() ? JFileChooser.FILES_ONLY : JFileChooser.DIRECTORIES_ONLY);
      dlg.setVisible(true);
    }
  /** 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()));
  }
 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;
 }
  /**
   * 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);
      }
    }
 @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 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;
 }
  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;
  }
  /** 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().getLibraryExplorer().refreshSelection(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();
    }
  /**
   * Override the default removal so we can actually stop sharing and delete the file. Deletes the
   * selected rows in the table. CAUTION: THIS WILL DELETE THE FILE FROM THE DISK.
   */
  public void removeSelection() {
    int[] rows = TABLE.getSelectedRows();
    if (rows.length == 0) return;

    if (TABLE.isEditing()) {
      TableCellEditor editor = TABLE.getCellEditor();
      editor.cancelCellEditing();
    }

    List<File> files = new ArrayList<File>(rows.length);

    // sort row indices and go backwards so list indices don't change when
    // removing the files from the model list
    Arrays.sort(rows);
    for (int i = rows.length - 1; i >= 0; i--) {
      File file = DATA_MODEL.getFile(rows[i]);
      files.add(file);
    }

    CheckBoxListPanel<File> listPanel =
        new CheckBoxListPanel<File>(files, new FileTextProvider(), true);
    listPanel.getList().setVisibleRowCount(4);

    // display list of files that should be deleted
    Object[] message =
        new Object[] {
          new MultiLineLabel(
              I18n.tr(
                  "Are you sure you want to delete the selected file(s), thus removing it from your computer?"),
              400),
          Box.createVerticalStrut(ButtonRow.BUTTON_SEP),
          listPanel,
          Box.createVerticalStrut(ButtonRow.BUTTON_SEP)
        };

    // get platform dependent options which are displayed as buttons in the dialog
    Object[] removeOptions = createRemoveOptions();

    int option =
        JOptionPane.showOptionDialog(
            MessageService.getParentComponent(),
            message,
            I18n.tr("Message"),
            JOptionPane.YES_NO_OPTION,
            JOptionPane.QUESTION_MESSAGE,
            null,
            removeOptions,
            removeOptions[0] /* default option */);

    if (option == removeOptions.length - 1 /* "cancel" option index */
        || option == JOptionPane.CLOSED_OPTION) {
      return;
    }

    // remove still selected files
    List<File> selected = listPanel.getSelectedElements();
    List<String> undeletedFileNames = new ArrayList<String>();

    boolean somethingWasRemoved = false;

    for (File file : selected) {
      // stop seeding if seeding
      BittorrentDownload dm = null;
      if ((dm = TorrentUtil.getDownloadManager(file)) != null) {
        dm.setDeleteDataWhenRemove(false);
        dm.setDeleteTorrentWhenRemove(false);
        BTDownloadMediator.instance().remove(dm);
      }

      // close media player if still playing
      if (MediaPlayer.instance().isThisBeingPlayed(file)) {
        MediaPlayer.instance().stop();
        MPlayerMediator.instance().showPlayerWindow(false);
      }

      // removeOptions > 2 => OS offers trash options
      boolean removed =
          FileUtils.delete(
              file, removeOptions.length > 2 && option == 0 /* "move to trash" option index */);
      if (removed) {
        somethingWasRemoved = true;
        DATA_MODEL.remove(DATA_MODEL.getRow(file));
      } else {
        undeletedFileNames.add(getCompleteFileName(file));
      }
    }

    clearSelection();

    if (somethingWasRemoved) {
      LibraryMediator.instance().getLibraryExplorer().refreshSelection(true);
    }

    if (undeletedFileNames.isEmpty()) {
      return;
    }

    // display list of files that could not be deleted
    message =
        new Object[] {
          new MultiLineLabel(
              I18n.tr(
                  "The following files could not be deleted. They may be in use by another application or are currently being downloaded to."),
              400),
          Box.createVerticalStrut(ButtonRow.BUTTON_SEP),
          new JScrollPane(createFileList(undeletedFileNames))
        };

    JOptionPane.showMessageDialog(
        MessageService.getParentComponent(), message, I18n.tr("Error"), JOptionPane.ERROR_MESSAGE);

    super.removeSelection();
  }
 /** Sets up drag & drop for the table. */
 protected void setupDragAndDrop() {
   TABLE.setDragEnabled(true);
   TABLE.setTransferHandler(new LibraryFilesTableTransferHandler(this));
 }
 /** Cancels all editing of fields in the tree and table. */
 void cancelEditing() {
   if (TABLE.isEditing()) {
     TableCellEditor editor = TABLE.getCellEditor();
     editor.cancelCellEditing();
   }
 }
 /**
  * Adds the mouse listeners to the wrapped <tt>JTable</tt>.
  *
  * @param listener the <tt>MouseInputListener</tt> that handles mouse events for the library
  */
 void addMouseInputListener(final MouseInputListener listener) {
   TABLE.addMouseListener(listener);
   TABLE.addMouseMotionListener(listener);
 }
 /** Accessor for the <tt>ListSelectionModel</tt> for the wrapped <tt>JTable</tt> instance. */
 ListSelectionModel getSelectionModel() {
   return TABLE.getSelectionModel();
 }
 /** Refreshes the enabledness of the Enqueue button based on the player enabling state. */
 public void setPlayerEnabled(boolean value) {
   handleSelection(TABLE.getSelectedRow());
 }