diff --git a/desktop/src/com/frostwire/gui/bittorrent/BTDownloadMediator.java b/desktop/src/com/frostwire/gui/bittorrent/BTDownloadMediator.java
index aabef7b7d0..fe3c6f5c46 100644
--- a/desktop/src/com/frostwire/gui/bittorrent/BTDownloadMediator.java
+++ b/desktop/src/com/frostwire/gui/bittorrent/BTDownloadMediator.java
@@ -21,6 +21,7 @@
import com.frostwire.bittorrent.PaymentOptions;
import com.frostwire.gui.bittorrent.BTDownloadActions.PlaySingleMediaFileAction;
import com.frostwire.gui.components.slides.Slide;
+import com.frostwire.gui.components.transfers.TransferDetailFiles;
import com.frostwire.gui.filters.TableLineFilter;
import com.frostwire.gui.library.LibraryUtils;
import com.frostwire.gui.player.MediaPlayer;
@@ -614,6 +615,7 @@ protected void setDefaultRenderers() {
TABLE.setDefaultRenderer(PaymentOptions.class, new PaymentOptionsRenderer());
TABLE.setDefaultRenderer(TransferHolder.class, new TransferActionsRenderer());
TABLE.setDefaultRenderer(SeedingHolder.class, new TransferSeedingRenderer());
+ TABLE.setDefaultRenderer(TransferDetailFiles.TransferItemHolder.class, new TransferDetailFilesActionsRenderer());
}
@Override
diff --git a/desktop/src/com/frostwire/gui/bittorrent/PaymentOptionsRenderer.java b/desktop/src/com/frostwire/gui/bittorrent/PaymentOptionsRenderer.java
index 4ece86024c..aa14a0bb62 100644
--- a/desktop/src/com/frostwire/gui/bittorrent/PaymentOptionsRenderer.java
+++ b/desktop/src/com/frostwire/gui/bittorrent/PaymentOptionsRenderer.java
@@ -1,19 +1,19 @@
/*
- * Created by Angel Leon (@gubatron), Alden Torres (aldenml)
- * Copyright (c) 2011-2015, FrostWire(R). All rights reserved.
+ * Created by Angel Leon (@gubatron), Alden Torres (aldenml),
+ * Marcelina Knitter (@marcelinkaaa), Jose Molina (@votaguz)
+ * Copyright (c) 2011-2020, FrostWire(R). All rights reserved.
*
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
*
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*/
package com.frostwire.gui.bittorrent;
@@ -116,7 +116,7 @@ private void openPaymentOptionsURL(PaymentOptions paymentOptions, PaymentMethod
} else {
String paymentOptionsJSON = UrlUtils.encode(JsonUtils.toJson(paymentOptions).replaceAll("\n", ""));
String title = UrlUtils.encode(paymentOptions.getItemName());
- paymentOptionsUrl = "http://www.frostwire.com/tips/?method=" + method.toString() + "&po=" + paymentOptionsJSON + "&title=" + title;
+ paymentOptionsUrl = "https://www.frostwire.com/tips/?method=" + method.toString() + "&po=" + paymentOptionsJSON + "&title=" + title;
}
GUIMediator.openURL(paymentOptionsUrl);
}
diff --git a/desktop/src/com/frostwire/gui/bittorrent/TransferDetailFilesActionsRenderer.java b/desktop/src/com/frostwire/gui/bittorrent/TransferDetailFilesActionsRenderer.java
index e4c612bba0..d46cf2247e 100644
--- a/desktop/src/com/frostwire/gui/bittorrent/TransferDetailFilesActionsRenderer.java
+++ b/desktop/src/com/frostwire/gui/bittorrent/TransferDetailFilesActionsRenderer.java
@@ -23,11 +23,13 @@
import com.frostwire.gui.player.MediaPlayer;
import com.frostwire.gui.player.MediaSource;
import com.limegroup.gnutella.gui.GUIMediator;
+import com.limegroup.gnutella.gui.I18n;
+import com.limegroup.gnutella.gui.actions.LimeAction;
import com.limegroup.gnutella.gui.search.FWAbstractJPanelTableCellRenderer;
import net.miginfocom.swing.MigLayout;
import javax.swing.*;
-import java.awt.*;
+import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
@@ -45,12 +47,13 @@ public class TransferDetailFilesActionsRenderer extends FWAbstractJPanelTableCel
share_faded = new AlphaIcon(share_solid, 0.1f);
}
- private JLabel playButton;
- private JLabel shareButton;
+ private final JLabel playButton;
+ private final JLabel shareButton;
private TransferDetailFiles.TransferItemHolder transferItemHolder;
public TransferDetailFilesActionsRenderer() {
- setLayout(new MigLayout("insets 2px 18px 0 0", "align center"));
+ setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 0));
+ setLayout(new MigLayout("gap 2px, fillx, center, insets 5px 5px 5px 5px", "[20px!][20px!]"));
playButton = new JLabel(play_transparent);
playButton.addMouseListener(new MouseAdapter() {
@Override
@@ -69,18 +72,13 @@ public void mouseReleased(MouseEvent e) {
}
}
});
- add(playButton, "center");
- add(shareButton, "center");
- }
-
- @Override
- protected void paintComponent(Graphics g) {
- super.paintComponent(g);
- updateButtons();
+ add(playButton, "width 20px!, growx 0, aligny top, push");
+ add(shareButton, "width 20px!, growx 0, aligny top, push");
}
@Override
protected void updateUIData(Object dataHolder, JTable table, int row, int column) {
+ cancelEdit(); // Gubatron: This is what solved the flickering/empty cell bug when the first column cells were clicked on. -Dec 28th 2020
if (!(dataHolder instanceof TransferDetailFiles.TransferItemHolder)) {
if (transferItemHolder != null) {
updateButtons();
@@ -95,12 +93,7 @@ private void onPlay() {
if (!transferItemHolder.transferItem.isComplete()) {
return;
}
- File file = transferItemHolder.transferItem.getFile();
- if (MediaPlayer.isPlayableFile(file)) {
- MediaPlayer.instance().asyncLoadMedia(new MediaSource(file), false, false);
- } else {
- GUIMediator.launchFile(file);
- }
+ new PlayAction(transferItemHolder).actionPerformed(null);
}
private void onShare() {
@@ -111,9 +104,7 @@ private void onShare() {
if (TorrentUtil.askForPermissionToSeedAndSeedDownloads(null)) {
new Thread(() -> {
TorrentUtil.makeTorrentAndDownload(file, null, true);
- GUIMediator.safeInvokeLater(() -> {
- BTDownloadMediator.instance().updateTableFilters();
- });
+ GUIMediator.safeInvokeLater(() -> BTDownloadMediator.instance().updateTableFilters());
}).start();
}
}
@@ -127,4 +118,43 @@ private void updateButtons() {
playButton.invalidate();
shareButton.invalidate();
}
+
+ public final static class OpenInFolderAction extends AbstractAction {
+ private final TransferDetailFiles.TransferItemHolder transferItemHolder;
+
+ public OpenInFolderAction(TransferDetailFiles.TransferItemHolder itemHolder) {
+ transferItemHolder = itemHolder;
+ putValue(Action.NAME, I18n.tr("Explore"));
+ putValue(LimeAction.SHORT_NAME, I18n.tr("Explore"));
+ putValue(Action.SHORT_DESCRIPTION, I18n.tr("Open Folder Containing the File"));
+ putValue(LimeAction.ICON_NAME, "LIBRARY_EXPLORE");
+ }
+
+ public void actionPerformed(ActionEvent ae) {
+ File selectedFile = transferItemHolder.transferItem.getFile();
+ if (selectedFile.isFile() && selectedFile.getParentFile() != null) {
+ GUIMediator.launchExplorer(selectedFile);
+ }
+ }
+ }
+
+ public final static class PlayAction extends AbstractAction {
+ private final TransferDetailFiles.TransferItemHolder transferItemHolder;
+
+ public PlayAction(TransferDetailFiles.TransferItemHolder itemHolder) {
+ transferItemHolder = itemHolder;
+ putValue(Action.NAME, I18n.tr("Play"));
+ putValue(LimeAction.SHORT_NAME, I18n.tr("Play"));
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ File file = transferItemHolder.transferItem.getFile();
+ if (MediaPlayer.isPlayableFile(file)) {
+ MediaPlayer.instance().asyncLoadMedia(new MediaSource(file), false, false);
+ } else {
+ GUIMediator.launchFile(file);
+ }
+ }
+ }
}
diff --git a/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFiles.java b/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFiles.java
index 6657160b9a..c4dfaf4d86 100644
--- a/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFiles.java
+++ b/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFiles.java
@@ -73,7 +73,7 @@ public void updateData(BittorrentDownload btDownload) {
*
* Also, this is necessary to update the table, since tableMediator.update() doesn't work with plain TransferItems
*/
- public class TransferItemHolder {
+ public static class TransferItemHolder {
public final TransferItem transferItem;
final int fileOffset;
diff --git a/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFilesDataLine.java b/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFilesDataLine.java
index 53b6d42d4c..ea724f3766 100644
--- a/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFilesDataLine.java
+++ b/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFilesDataLine.java
@@ -32,6 +32,7 @@ public final class TransferDetailFilesDataLine extends AbstractDataLine A custom cell renderer for that column that displays a button and it's action listener
static LimeTableColumn ACTIONS_COLUMN;
private static final LimeTableColumn[] columns = new LimeTableColumn[]{
+ // See TransferDetailFilesActionsRenderer for action's code
ACTIONS_COLUMN = new LimeTableColumn(0, "ACTIONS", I18n.tr("Actions"), 80, true, true, true, TransferDetailFiles.TransferItemHolder.class),
new LimeTableColumn(1, "NUMBER", "#", 40, true, true, true, String.class),
new LimeTableColumn(2, "NAME", I18n.tr("Name"), 400, true, true, true, String.class),
@@ -87,6 +88,7 @@ public Object getValueAt(int col) {
case TYPE:
return holder.transferItem.getName().substring(holder.transferItem.getName().lastIndexOf(".") + 1);
case ACTIONS:
+ // See TransferDetailFilesActionsRenderer for action's code
return holder;
}
return null;
diff --git a/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFilesTableMediator.java b/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFilesTableMediator.java
index 7e8fcd045b..39cc6dd36c 100644
--- a/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFilesTableMediator.java
+++ b/desktop/src/com/frostwire/gui/components/transfers/TransferDetailFilesTableMediator.java
@@ -18,6 +18,8 @@
package com.frostwire.gui.components.transfers;
+import com.frostwire.gui.bittorrent.TransferDetailFilesActionsRenderer;
+import com.frostwire.gui.theme.SkinPopupMenu;
import com.limegroup.gnutella.gui.PaddedPanel;
import com.limegroup.gnutella.gui.search.GenericCellEditor;
import com.limegroup.gnutella.gui.tables.AbstractTableMediator;
@@ -45,7 +47,15 @@ protected void setupConstants() {
@Override
protected JPopupMenu createPopupMenu() {
- return null;
+ TransferDetailFilesModel dataModel = getDataModel();
+ TransferDetailFilesDataLine transferDetailFilesDataLine = dataModel.get(TABLE.getSelectedRow());
+ TransferDetailFiles.TransferItemHolder transferItemHolder = transferDetailFilesDataLine.getInitializeObject();
+ JPopupMenu menu = new SkinPopupMenu();
+ menu.add(new TransferDetailFilesActionsRenderer.OpenInFolderAction(transferItemHolder));
+ if (transferItemHolder.transferItem.isComplete()) {
+ menu.add(new TransferDetailFilesActionsRenderer.PlayAction(transferItemHolder));
+ }
+ return menu;
}
@Override
@@ -62,7 +72,7 @@ public void handleNoSelection() {
@Override
protected void setDefaultEditors() {
- super.setDefaultEditors();
TransferDetailFilesDataLine.ACTIONS_COLUMN.setCellEditor(new GenericCellEditor(getTransferDetailFileActionsRenderer()));
+ TransferDetailFilesDataLine.ACTIONS_COLUMN.setCellRenderer(getTransferDetailFileActionsRenderer());
}
-}
+}
\ No newline at end of file
diff --git a/desktop/src/com/limegroup/gnutella/gui/tables/AbstractTableMediator.java b/desktop/src/com/limegroup/gnutella/gui/tables/AbstractTableMediator.java
index 9631324b3e..a4cab5c8fa 100644
--- a/desktop/src/com/limegroup/gnutella/gui/tables/AbstractTableMediator.java
+++ b/desktop/src/com/limegroup/gnutella/gui/tables/AbstractTableMediator.java
@@ -277,7 +277,7 @@ protected void buildSettings() {
/**
* Assigns the listeners to their slots.
* This must be done _before_ the individual components
- * are created, incase any of them want to use a listener.
+ * are created, in case any of them want to use a listener.
* Extending components that want to build extra listeners
* should call super.buildListeners and then build their own.
* DEFAULT_LISTENER, SELECTION_LISTENER, HEADER_LISTENER,