dirs = !filePath.isEmpty() ? List.of(Path.of(filePath)) : this.settings.defaultFolders;
/* Scan directories for video files */
/* Tell Action where to send progressUpdates */
- this.filelistAction.setIndexingProgressListener(this.getIndexingProgressListener());
+ this.filelistAction.indexingProgressListener = this.indexingProgressListener;
/* Start the getFileListing Action */
return dirs.stream()
- .flatMap(dir -> this.filelistAction.getFileListing(dir, recursive, language, overwriteExistingSubtitles).stream())
- .toList();
+ .flatMap(dir -> this.filelistAction.getFileListing(dir, recursive, language, overwriteExistingSubtitles)
+ .stream())
+ .toList();
}
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java
index 8990188b..bb2183ed 100644
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/GuiSearchAction.java
@@ -1,7 +1,11 @@
package org.lodder.subtools.multisubdownloader.gui.actions.search;
+import static manifold.ext.props.rt.api.PropOption.*;
+
import java.util.List;
+import manifold.ext.props.rt.api.get;
+import manifold.ext.props.rt.api.override;
import org.lodder.subtools.multisubdownloader.GUI;
import org.lodder.subtools.multisubdownloader.UserInteractionHandlerGUI;
import org.lodder.subtools.multisubdownloader.actions.SearchAction;
@@ -15,28 +19,23 @@
import org.lodder.subtools.multisubdownloader.settings.model.Settings;
import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore;
import org.lodder.subtools.sublibrary.Language;
-import org.lodder.subtools.sublibrary.Manager;
import org.lodder.subtools.sublibrary.model.Release;
import org.lodder.subtools.sublibrary.model.Subtitle;
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.NonNull;
-
-@Getter(value = AccessLevel.PROTECTED)
-public abstract class GuiSearchAction extends SearchAction {
+public abstract sealed class GuiSearchAction
extends SearchAction
+ permits FileGuiSearchAction, TextGuiSearchAction {
- private final @NonNull GUI mainWindow;
- private final @NonNull SearchPanel
searchPanel;
- private final SubtitleFiltering filtering;
- private final @NonNull ReleaseFactory releaseFactory;
- private final IndexingProgressListener indexingProgressListener;
- private final SearchProgressListener searchProgressListener;
- private final UserInteractionHandlerGUI userInteractionHandler;
+ @get(Protected) GUI mainWindow;
+ @get(Protected) SearchPanel
searchPanel;
+ @get(Protected) SubtitleFiltering filtering;
+ @get(Protected) ReleaseFactory releaseFactory;
+ @get(Protected) @override IndexingProgressListener indexingProgressListener;
+ @get(Protected) @override SearchProgressListener searchProgressListener;
+ @get(Protected) @override UserInteractionHandlerGUI userInteractionHandler;
- public GuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore,
- GUI mainWindow, SearchPanel
searchPanel, ReleaseFactory releaseFactory) {
- super(manager, settings, subtitleProviderStore);
+ GuiSearchAction(Settings settings, SubtitleProviderStore subtitleProviderStore,
+ GUI mainWindow, SearchPanel
searchPanel, ReleaseFactory releaseFactory) {
+ super(settings, subtitleProviderStore);
this.mainWindow = mainWindow;
this.searchPanel = searchPanel;
this.filtering = new SubtitleFiltering(settings);
@@ -53,12 +52,12 @@ public GuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore
}
protected P getInputPanel() {
- return this.getSearchPanel().getInputPanel();
+ return this.searchPanel.inputPanel;
}
@Override
protected Language getLanguage() {
- return this.searchPanel.getInputPanel().getSelectedLanguage();
+ return this.searchPanel.inputPanel.selectedLanguage;
}
@Override
@@ -67,15 +66,19 @@ public void onFound(Release release, List subtitles) {
return;
}
- VideoTableModel model = (VideoTableModel) this.searchPanel.getResultPanel().getTable().getModel();
+ VideoTableModel model = (VideoTableModel) this.searchPanel.resultPanel.table.model;
if (model.getRowCount() > 0) {
- searchPanel.getResultPanel().enableButtons();
+ searchPanel.resultPanel.enableButtons();
}
- if (this.getSearchManager().getProgress() == 100) {
- this.getSearchProgressListener().completed();
- searchPanel.getInputPanel().enableSearchButton();
+ if (this.searchManager.progress == 100) {
+ this.searchProgressListener.completed();
+ searchPanel.inputPanel.enableSearchButton();
}
}
+
+ public void reset() {
+ searchProgressListener.reset();
+ }
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java
index 8a15c8fe..082ebb5d 100644
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/actions/search/TextGuiSearchAction.java
@@ -3,9 +3,6 @@
import java.nio.file.Path;
import java.util.List;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.experimental.Accessors;
import org.lodder.subtools.multisubdownloader.GUI;
import org.lodder.subtools.multisubdownloader.Messages;
import org.lodder.subtools.multisubdownloader.exceptions.SearchSetupException;
@@ -15,71 +12,24 @@
import org.lodder.subtools.multisubdownloader.lib.ReleaseFactory;
import org.lodder.subtools.multisubdownloader.settings.model.Settings;
import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore;
-import org.lodder.subtools.sublibrary.Manager;
+import org.lodder.subtools.sublibrary.control.VideoPatterns.VideoExtensions;
import org.lodder.subtools.sublibrary.model.MovieRelease;
import org.lodder.subtools.sublibrary.model.Release;
import org.lodder.subtools.sublibrary.model.Subtitle;
import org.lodder.subtools.sublibrary.model.TvRelease;
import org.lodder.subtools.sublibrary.model.VideoSearchType;
-public class TextGuiSearchAction extends GuiSearchAction {
+public final class TextGuiSearchAction extends GuiSearchAction {
- public interface FileGuiSearchActionBuilderManager {
- TextGuiSearchActionBuilderSubtitleProviderStore manager(Manager manager);
- }
-
- public interface TextGuiSearchActionBuilderSubtitleProviderStore {
- TextGuiSearchActionBuilderGUI subtitleProviderStore(SubtitleProviderStore subtitleProviderStore);
- }
-
- public interface TextGuiSearchActionBuilderGUI {
- TextGuiSearchActionBuilderSearchPanel mainWindow(GUI mainWindow);
- }
-
- public interface TextGuiSearchActionBuilderSearchPanel {
- TextGuiSearchActionBuilderReleaseFactory searchPanel(SearchPanel searchPanel);
- }
-
- public interface TextGuiSearchActionBuilderReleaseFactory {
- TextGuiSearchActionBuilderBuild releaseFactory(ReleaseFactory releaseFactory);
- }
-
- public interface TextGuiSearchActionBuilderBuild {
- TextGuiSearchAction build();
- }
-
- public static FileGuiSearchActionBuilderManager createWithSettings(Settings settings) {
- return new TextGuiSearchActionBuilder(settings);
- }
-
- @RequiredArgsConstructor
- @Setter
- @Accessors(chain = true, fluent = true)
- public static class TextGuiSearchActionBuilder
- implements TextGuiSearchActionBuilderBuild, TextGuiSearchActionBuilderReleaseFactory, TextGuiSearchActionBuilderSearchPanel,
- TextGuiSearchActionBuilderGUI, TextGuiSearchActionBuilderSubtitleProviderStore, FileGuiSearchActionBuilderManager {
- private final Settings settings;
- private Manager manager;
- private SubtitleProviderStore subtitleProviderStore;
- private GUI mainWindow;
- private SearchPanel searchPanel;
- private ReleaseFactory releaseFactory;
-
- @Override
- public TextGuiSearchAction build() {
- return new TextGuiSearchAction(manager, settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory);
- }
- }
-
- private TextGuiSearchAction(Manager manager, Settings settings, SubtitleProviderStore subtitleProviderStore, GUI mainWindow,
- SearchPanel searchPanel, ReleaseFactory releaseFactory) {
- super(manager, settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory);
+ public TextGuiSearchAction(Settings settings, SubtitleProviderStore subtitleProviderStore, GUI mainWindow,
+ SearchPanel searchPanel, ReleaseFactory releaseFactory) {
+ super(settings, subtitleProviderStore, mainWindow, searchPanel, releaseFactory);
}
@Override
protected void validate() throws SearchSetupException {
if (getInputPanel().getReleaseName().isEmpty()) {
- throw new SearchSetupException(Messages.getString("App.NoReleaseEntered"));
+ throw new SearchSetupException(Messages.getText("App.NoReleaseEntered"));
}
}
@@ -88,36 +38,31 @@ protected List createReleases() {
String name = getInputPanel().getReleaseName();
VideoSearchType type = getInputPanel().getType();
- VideoTableModel model = (VideoTableModel) this.getSearchPanel().getResultPanel().getTable().getModel();
+ VideoTableModel model = (VideoTableModel) this.searchPanel.resultPanel.getTable().getModel();
model.clearTable();
// TODO: Redefine what a "release" is.
Release release = switch (type) {
- case EPISODE -> TvRelease.builder()
- .name(name)
- .season(getInputPanel().getSeason())
- .episode(getInputPanel().getEpisode())
- .quality(getInputPanel().getQuality())
- .build();
- case MOVIE -> MovieRelease.builder()
- .name(name)
- .quality(getInputPanel().getQuality())
- .build();
- default -> getReleaseFactory().createRelease(Path.of(name), getUserInteractionHandler());
+ case EPISODE ->
+ new TvRelease(name:name, season:inputPanel.season, episode:inputPanel.episode, quality:inputPanel.quality);
+ case MOVIE -> new MovieRelease(name:name, quality:inputPanel.quality);
+ default -> releaseFactory.createRelease(Path.of(
+ name + (VideoExtensions.values().stream().anyMatch(ext -> name.endsWith("." + ext)) ? "" : ".")),
+ userInteractionHandler);
};
return release != null ? List.of(release) : List.of();
}
@Override
public void onFound(Release release, List subtitles) {
- VideoTableModel model = (VideoTableModel) this.getSearchPanel().getResultPanel().getTable().getModel();
+ VideoTableModel model = (VideoTableModel) this.searchPanel.resultPanel.getTable().getModel();
- List subtitlesFiltered =
- getFiltering() != null ? subtitles.stream().filter(subtitle -> getFiltering().useSubtitle(subtitle, release)).toList() : subtitles;
+ List subtitlesFiltered = filtering != null ?
+ subtitles.stream().filter(subtitle -> filtering.useSubtitle(subtitle, release)).toList() : subtitles;
subtitlesFiltered.forEach(release::addMatchingSub);
// use automatic selection to reduce the selection for the user
- List subtitlesFilteredAutomatic = getUserInteractionHandler().getAutomaticSelection(subtitlesFiltered);
+ List subtitlesFilteredAutomatic = userInteractionHandler.getAutomaticSelection(subtitlesFiltered);
subtitlesFilteredAutomatic.forEach(model::addRow);
/* Let GuiSearchAction also make some decisions */
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java
index df12e22a..b8fd6b7a 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MappingEpisodeNameDialog.java
@@ -1,5 +1,13 @@
package org.lodder.subtools.multisubdownloader.gui.dialog;
+import static org.lodder.subtools.multisubdownloader.Messages.*;
+
+import javax.swing.*;
+import javax.swing.RowSorter.SortKey;
+import javax.swing.border.EmptyBorder;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableRowSorter;
+import java.awt.*;
import java.io.Serial;
import java.util.Arrays;
import java.util.Comparator;
@@ -9,28 +17,13 @@
import java.util.function.BiFunction;
import java.util.function.Function;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.RowSorter;
-import javax.swing.RowSorter.SortKey;
-import javax.swing.border.EmptyBorder;
-import javax.swing.table.DefaultTableModel;
-import javax.swing.table.TableModel;
-import javax.swing.table.TableRowSorter;
-
+import lombok.AllArgsConstructor;
+import manifold.ext.props.rt.api.val;
+import manifold.ext.props.rt.api.var;
+import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.tuple.Pair;
-import org.lodder.subtools.multisubdownloader.Messages;
+import org.jspecify.annotations.Nullable;
import org.lodder.subtools.multisubdownloader.UserInteractionHandlerGUI;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.JButtonExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension;
-import org.lodder.subtools.multisubdownloader.settings.SettingsControl;
import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProvider;
import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProviderStore;
import org.lodder.subtools.sublibrary.Manager;
@@ -39,86 +32,145 @@
import org.lodder.subtools.sublibrary.model.TvRelease;
import org.lodder.subtools.sublibrary.settings.model.SerieMapping;
-import java.awt.BorderLayout;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.experimental.ExtensionMethod;
-import net.miginfocom.swing.MigLayout;
-
-@ExtensionMethod({ JButtonExtension.class, AbstractButtonExtension.class, JComponentExtension.class })
public class MappingEpisodeNameDialog extends MultiSubDialog {
- @Serial
- private static final long serialVersionUID = 1L;
- private final JPanel contentPanel = new JPanel();
- private JTable table;
- private final Manager manager;
+ @Serial private static final long serialVersionUID = 1L;
+
private final MappingTableModel mappingTableModel;
private final SubtitleProviderStore subtitleProviderStore;
- private final UserInteractionHandlerGUI userInteractionHandler;
- private Optional selectedSubtitleProvider;
private final JButton btnAddCustomMapping;
+ private final JTable table;
+ private Optional selectedSubtitleProvider;
private MappingType selectedMappingType;
- /**
- * Create the dialog.
- */
- public MappingEpisodeNameDialog(JFrame frame, final SettingsControl prefCtrl, Manager manager, SubtitleProviderStore subtitleProviderStore,
- UserInteractionHandlerGUI userInteractionHandler) {
- super(frame, Messages.getString("MappingEpisodeNameDialog.Title"), true);
- this.manager = manager;
+ public MappingEpisodeNameDialog(@Nullable JFrame frame=null, Manager manager,
+ SubtitleProviderStore subtitleProviderStore,
+ UserInteractionHandlerGUI userInteractionHandler) {
+ super(frame, getText("MappingEpisodeNameDialog.Title"), true);
this.subtitleProviderStore = subtitleProviderStore;
- this.userInteractionHandler = userInteractionHandler;
- this.btnAddCustomMapping = new JButton(Messages.getString("MappingEpisodeNameDialog.ChangeMapping"));
this.mappingTableModel = new MappingTableModel(manager);
- initialize();
+ setResizable(true);
+ setBounds(150, 150, 650, 400);
+
+ table = new JTable().model(mappingTableModel).rowSorter(TableRowSorter::new);
+
+ contentPane
+ .layout(new BorderLayout())
+ .addComponent(BorderLayout.CENTER, new JPanel()
+ .border(new EmptyBorder(5, 5, 5, 5))
+ .layout(new GridBagLayout()
+ .columnWidths(new int[]{0, 0})
+ .rowHeights(new int[]{0, 40, 0})
+ .columnWeights(new double[]{1.0, Double.MIN_VALUE})
+ .rowWeights(new double[]{0.0, 1.0, Double.MIN_VALUE}))
+ // select provider panel
+ .addComponent(new JPanel()
+ .addComponent(new JLabel(getText("MappingEpisodeNameDialog.SelectProvider")))
+ .addComponent(new JComboBox<>()
+ .model(new DefaultComboBoxModel<>(MappingType.values()))
+ .itemListener(event -> selectMappingType((MappingType) event.getItem()))))
+ .addComponent(new JPanel(),
+ new GridBagConstraints().insets(new Insets(0, 0, 5, 0))
+ .fill(GridBagConstraints.BOTH).gridx(0).gridy(0))
+ .addComponent(new JScrollPane().viewportView(table),
+ new GridBagConstraints().fill(GridBagConstraints.BOTH).gridx(0).gridy(1)))
+ // button panel
+ .addComponent(BorderLayout.SOUTH, new JPanel()
+ .layout(new MigLayout("", "[25px][50px][grow][50px][grow][50px][25px]",
+ "[][25px,grow,fill]"))
+ .addComponent("skip", new JButton(getText("MappingEpisodeNameDialog.DeleteRow"))
+ .actionListener(_ -> {
+ int rowNbr = table.convertRowIndexToModel(table.getSelectedRow());
+ MappingTableModel model = (MappingTableModel) table.getModel();
+ Row row = (Row) model.getDataVector().get(rowNbr);
+ manager.getCache(CacheType.DISK, row.key).remove();
+ if (row.selectionForKeyPrefix.deleteOtherFunction() != null) {
+ manager.getCache(CacheType.DISK,
+ row.selectionForKeyPrefix.deleteOtherFunction().apply(row.key)).remove();
+ }
+ model.removeRow(rowNbr);
+ }))
+ .addComponent("skip", btnAddCustomMapping =
+ new JButton(getText("MappingEpisodeNameDialog.ChangeMapping"))
+ .actionListener(() -> {
+ int rowNbr = table.convertRowIndexToModel(table.getSelectedRow());
+ MappingTableModel model = (MappingTableModel) table.getModel();
+
+ Row row = (Row) model.getDataVector().get(rowNbr);
+ String currentName = row.serieMapping.name;
+
+ String message = getText("MappingEpisodeNameDialog.enterNewNameForSerie",
+ currentName);
+ selectedSubtitleProvider.ifPresent(provider ->
+ userInteractionHandler.enter(message).ifPresent(newName -> {
+ TvRelease tvRelease = new TvRelease(
+ name:currentName,
+ season:row.serieMapping.season,
+ episode:1,
+ originalName:currentName,
+ customName:newName);
+ try {
+ provider.getProviderSerieId(tvRelease).ifPresentOrElse(serieId -> {
+ row.serieMapping =
+ new SerieMapping(currentName, serieId.providerId, serieId.providerName,
+ serieId.season);
+ List extends SortKey> sortKeys = table.rowSorter.sortKeys;
+ selectMappingType(selectedMappingType);
+ table.rowSorter.sortKeys = sortKeys;
+ }, () -> userInteractionHandler.message(
+ getText("MappingEpisodeNameDialog.NoResultsFoundForSerieName", newName),
+ getText("App.Info")));
+ } catch (Exception e) {
+ userInteractionHandler.message(getText("App.ErrorOccurred", e.getMessage()),
+ getText("App.Error"));
+ }
+ }));
+ }))
+ .addComponent("skip", new JButton(getText("App.Close"))
+ .defaultButtonFor(getRootPane())
+ .actionListener(() -> setVisible(false))
+ .actionCommand(getText("App.Close"))));
+ selectMappingType(MappingType.values()[0]);
}
private void selectMappingType(MappingType mappingType) {
this.selectedMappingType = mappingType;
- this.selectedSubtitleProvider = subtitleProviderStore.getAllProviders().stream()
- .filter(subtitleProvider -> subtitleProvider.getProviderName().equals(mappingType.getProviderName()))
- .findAny();
- btnAddCustomMapping.setEnabled(selectedSubtitleProvider.isPresent());
- mappingTableModel.setMappingType(mappingType);
+ this.selectedSubtitleProvider = subtitleProviderStore.getAllProviders()
+ .stream()
+ .filter(subtitleProvider -> subtitleProvider.providerName.equals(mappingType.providerName))
+ .findAny();
+ btnAddCustomMapping.enabled = selectedSubtitleProvider.isPresent();
+ mappingTableModel.mappingType = mappingType;
repaint();
}
- @Getter
public enum MappingType {
TVDB("TVDB", "TVDB",
- new SelectionForKeyPrefix("", "TVDB-serieId-", k -> k.replace("-serieId-", "-tvdbSerie-"))),
- ADDIC7ED("Addic7ed", SubtitleSource.ADDIC7ED,
- new SelectionForKeyPrefix("", "ADDIC7ED-serieName-name:"),
- new SelectionForKeyPrefix("", "ADDIC7ED-serieName-tvdbId:")),
+ new SelectionForKeyPrefix("", "TVDB-serieId-", k -> k.replace("-serieId-", "-tvdbSerie-"))),
+ ADDIC7ED("Addic7ed", SubtitleSource.ADDIC7ED, new SelectionForKeyPrefix("", "ADDIC7ED-serieName-name:"),
+ new SelectionForKeyPrefix("", "ADDIC7ED-serieName-tvdbId:")),
ADDIC7ED_PROXY("Addic7ed (Proxy)", SubtitleSource.ADDIC7ED.name() + "-GESTDOWN",
- new SelectionForKeyPrefix("", "ADDIC7ED-GESTDOWN-serieName-name:"),
- new SelectionForKeyPrefix("", "ADDIC7ED-GESTDOWN-serieName-tvdbId:")),
- SUBSCENE("Subscene", SubtitleSource.SUBSCENE,
- new SelectionForKeyPrefix("", "SUBSCENE-serieName-name:"),
- new SelectionForKeyPrefix("", "SUBSCENE-serieName-tvdbId:")),
+ new SelectionForKeyPrefix("", "ADDIC7ED-GESTDOWN-serieName-name:"),
+ new SelectionForKeyPrefix("", "ADDIC7ED-GESTDOWN-serieName-tvdbId:")),
+ SUBSCENE("Subscene", SubtitleSource.SUBSCENE, new SelectionForKeyPrefix("", "SUBSCENE-serieName-name:"),
+ new SelectionForKeyPrefix("", "SUBSCENE-serieName-tvdbId:")),
TV_SUBTITLES("TVSubtitles", SubtitleSource.TVSUBTITLES,
- new SelectionForKeyPrefix("", "TVSUBTITLES-serieName-name:"),
- new SelectionForKeyPrefix("", "TVSUBTITLES-serieName-tvdbId:")),
+ new SelectionForKeyPrefix("", "TVSUBTITLES-serieName-name:"),
+ new SelectionForKeyPrefix("", "TVSUBTITLES-serieName-tvdbId:")),
OPEN_SUBTITLES("OpenSubtitles", SubtitleSource.OPENSUBTITLES,
- new SelectionForKeyPrefix("", "OPENSUBTITLES-serieName-name:"),
- new SelectionForKeyPrefix("", "OPENSUBTITLES-serieName-tvdbId:")),
- PODNAPISI("Podnapisi", SubtitleSource.PODNAPISI,
- new SelectionForKeyPrefix("", "PODNAPISI-serieName-name:"),
- new SelectionForKeyPrefix("", "PODNAPISI-serieName-tvdbId:"));
-
- public static final BiFunction>> MAPPING_SUPPLIER;
- private final String name;
- private final String providerName;
- private final String nameColumn;
- private final String mappingColumn;
- private final String providerNameColumn;
- private final SelectionForKeyPrefix[] selectionForKeyPrefixList;
+ new SelectionForKeyPrefix("", "OPENSUBTITLES-serieName-name:"),
+ new SelectionForKeyPrefix("", "OPENSUBTITLES-serieName-tvdbId:")),
+ PODNAPISI("Podnapisi", SubtitleSource.PODNAPISI, new SelectionForKeyPrefix("", "PODNAPISI-serieName-name:"),
+ new SelectionForKeyPrefix("", "PODNAPISI-serieName-tvdbId:"));
+
+ public static final BiFunction>>
+ MAPPING_SUPPLIER;
+ @val String name;
+ @val String providerName;
+ @val String nameColumn;
+ @val String mappingColumn;
+ @val String providerNameColumn;
+ @val SelectionForKeyPrefix[] selectionForKeyPrefixList;
@Override
public String toString() {
@@ -126,11 +178,8 @@ public String toString() {
}
static {
- MAPPING_SUPPLIER = (manager, selectionForKeyPrefix) -> manager.valueBuilder()
- .cacheType(CacheType.DISK)
- .keyFilter(k -> k.startsWith(selectionForKeyPrefix.keyPrefix))
- .returnType(SerieMapping.class)
- .getEntries();
+ MAPPING_SUPPLIER = (manager, selectionForKeyPrefix) ->
+ manager.getCache(CacheType.DISK, k -> k.startsWith(selectionForKeyPrefix.keyPrefix)).getEntries();
}
MappingType(String name, SubtitleSource subtitleSource, SelectionForKeyPrefix... selectionForKeyPrefixList) {
@@ -140,9 +189,9 @@ public String toString() {
MappingType(String name, String providerName, SelectionForKeyPrefix... selectionForKeyPrefixList) {
this.name = name;
this.providerName = providerName;
- this.nameColumn = Messages.getString("MappingEpisodeNameDialog.SceneShowName");
- this.mappingColumn = Messages.getString("MappingEpisodeNameDialog.ProviderId");
- this.providerNameColumn = Messages.getString("MappingEpisodeNameDialog.ProviderName");
+ this.nameColumn = getText("MappingEpisodeNameDialog.SceneShowName");
+ this.mappingColumn = getText("MappingEpisodeNameDialog.ProviderId");
+ this.providerNameColumn = getText("MappingEpisodeNameDialog.ProviderName");
this.selectionForKeyPrefixList = selectionForKeyPrefixList;
}
}
@@ -153,18 +202,14 @@ public SelectionForKeyPrefix(String name, String keyPrefix) {
}
}
- @Getter
- @Setter
- @RequiredArgsConstructor
private static class Row extends Vector {
- @Serial
- private static final long serialVersionUID = 8620670431074648999L;
- private final String key;
- private SerieMapping serieMapping;
- private final SelectionForKeyPrefix selectionForKeyPrefix;
+ @Serial private static final long serialVersionUID = 8620670431074648999L;
+ @val String key;
+ @val SelectionForKeyPrefix selectionForKeyPrefix;
+ @var SerieMapping serieMapping;
public Row(String key, String name, String providerId, String providerName, SerieMapping serieMapping,
- SelectionForKeyPrefix selectionForKeyPrefix) {
+ SelectionForKeyPrefix selectionForKeyPrefix) {
this.key = key;
this.serieMapping = serieMapping;
this.selectionForKeyPrefix = selectionForKeyPrefix;
@@ -174,30 +219,31 @@ public Row(String key, String name, String providerId, String providerName, Seri
}
}
- @RequiredArgsConstructor
+ @AllArgsConstructor
private static class MappingTableModel extends DefaultTableModel {
- @Serial
- private static final long serialVersionUID = 7860605766969472980L;
- private final Manager manager;
+ @Serial private static final long serialVersionUID = 7860605766969472980L;
+ @val Manager manager;
void setMappingType(MappingType mappingType) {
- setDataVector(null, new String[] { mappingType.getNameColumn(), mappingType.getMappingColumn(), mappingType.getProviderNameColumn() });
- Arrays.stream(mappingType.getSelectionForKeyPrefixList())
- .flatMap(selectionForKeyPrefix -> MappingType.MAPPING_SUPPLIER.apply(manager, selectionForKeyPrefix).stream()
- .map(serieMappingPair -> {
- SerieMapping serieMapping = serieMappingPair.getValue();
- String name = serieMapping.getName();
- String providerId = serieMapping.getProviderId() == null ? "" : serieMapping.getProviderId();
- String providerName = serieMapping.getProviderName();
- if (providerId.contains("/")) {
- providerId = providerId.substring(providerId.lastIndexOf("/") + 1);
- }
- providerId = providerId.replace(".html", "");
- return new Row(serieMappingPair.getKey(), name, providerId, providerName, serieMapping, selectionForKeyPrefix);
- }))
- .sorted(Comparator.comparing(row -> row.getSerieMapping() == null || row.getSerieMapping().getProviderName() == null ? "zzz"
- : row.getSerieMapping().getName()))
- .forEach(this::addRow);
+ setDataVector(null,
+ new String[]{mappingType.nameColumn, mappingType.mappingColumn, mappingType.providerNameColumn});
+ Arrays.stream(mappingType.selectionForKeyPrefixList)
+ .flatMap(selectionForKeyPrefix -> MappingType.MAPPING_SUPPLIER.apply(manager, selectionForKeyPrefix)
+ .stream()
+ .map(serieMappingPair -> {
+ SerieMapping serieMapping = serieMappingPair.getValue();
+ String providerId = serieMapping.providerId == null ? "" : serieMapping.providerId;
+ if (providerId.contains("/")) {
+ providerId = providerId.substring(providerId.lastIndexOf("/") + 1);
+ }
+ providerId = providerId.replace(".html", "");
+ return new Row(serieMappingPair.getKey(), serieMapping.name, providerId,
+ serieMapping.providerName, serieMapping, selectionForKeyPrefix);
+ }))
+ .sorted(Comparator.comparing(
+ row -> row.serieMapping == null || row.serieMapping.providerName == null ? "zzz" :
+ row.serieMapping.name))
+ .forEach(this::addRow);
}
@Override
@@ -205,131 +251,4 @@ public boolean isCellEditable(int row, int col) {
return false;
}
}
-
- private void initialize() {
- setResizable(true);
- setBounds(150, 150, 650, 400);
- getContentPane().setLayout(new BorderLayout());
- contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
- getContentPane().add(contentPanel, BorderLayout.CENTER);
- GridBagLayout gbl_contentPanel = new GridBagLayout();
- gbl_contentPanel.columnWidths = new int[] { 0, 0 };
- gbl_contentPanel.rowHeights = new int[] { 0, 40, 0 };
- gbl_contentPanel.columnWeights = new double[] { 1.0, Double.MIN_VALUE };
- gbl_contentPanel.rowWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE };
- contentPanel.setLayout(gbl_contentPanel);
- {
- JPanel selectionPane = new JPanel();
- contentPanel.add(selectionPane);
-
- JLabel lblDefaultIncomingFolder = new JLabel(Messages.getString("MappingEpisodeNameDialog.SelectProvider"));
- selectionPane.add(lblDefaultIncomingFolder);
-
- JComboBox mappingTypeList = new JComboBox<>();
- mappingTypeList.setModel(new DefaultComboBoxModel<>(MappingType.values()));
- mappingTypeList.addItemListener(arg0 -> selectMappingType((MappingType) arg0.getItem()));
- selectMappingType(MappingType.values()[0]);
- selectionPane.add(mappingTypeList);
- }
- {
- JPanel pnlButtons = new JPanel();
- GridBagConstraints gbc_pnlButtons = new GridBagConstraints();
- gbc_pnlButtons.insets = new Insets(0, 0, 5, 0);
- gbc_pnlButtons.fill = GridBagConstraints.BOTH;
- gbc_pnlButtons.gridx = 0;
- gbc_pnlButtons.gridy = 0;
- contentPanel.add(pnlButtons, gbc_pnlButtons);
- }
- {
- JScrollPane scrollPane = new JScrollPane();
- GridBagConstraints gbc_scrollPane = new GridBagConstraints();
- gbc_scrollPane.fill = GridBagConstraints.BOTH;
- gbc_scrollPane.gridx = 0;
- gbc_scrollPane.gridy = 1;
- contentPanel.add(scrollPane, gbc_scrollPane);
- {
- table = new JTable();
-
- table.setModel(mappingTableModel);
- RowSorter sorter = new TableRowSorter<>(table.getModel());
- table.setRowSorter(sorter);
- scrollPane.setViewportView(table);
- }
- }
- {
- JPanel buttonPane = new JPanel();
- getContentPane().add(buttonPane, BorderLayout.SOUTH);
- buttonPane.setLayout(new MigLayout("", "[25px][50px][grow][50px][grow][50px][25px]", "[][25px,grow,fill]"));
-
- {
- JButton btnDeleteSelectedRow = new JButton(Messages.getString("MappingEpisodeNameDialog.DeleteRow"));
- btnDeleteSelectedRow.addActionListener(arg0 -> {
- int rowNbr = table.convertRowIndexToModel(table.getSelectedRow());
- MappingTableModel model = (MappingTableModel) table.getModel();
-
- Row row = (Row) model.getDataVector().get(rowNbr);
- String key = row.getKey();
- manager.valueBuilder()
- .cacheType(CacheType.DISK)
- .key(key)
- .remove();
- if (row.getSelectionForKeyPrefix().deleteOtherFunction() != null) {
- manager.valueBuilder()
- .cacheType(CacheType.DISK)
- .key(row.getSelectionForKeyPrefix().deleteOtherFunction().apply(key))
- .remove();
- }
- model.removeRow(rowNbr);
- });
- buttonPane.add(btnDeleteSelectedRow, "skip");
- }
-
- {
- btnAddCustomMapping.withActionListener(() -> {
- int rowNbr = table.convertRowIndexToModel(table.getSelectedRow());
- MappingTableModel model = (MappingTableModel) table.getModel();
-
- Row row = (Row) model.getDataVector().get(rowNbr);
- String currentName = row.getSerieMapping().getName();
-
- String message = Messages.getString("MappingEpisodeNameDialog.enterNewNameForSerie", currentName);
- selectedSubtitleProvider.ifPresent(provider -> {
- userInteractionHandler.enter(message, message).ifPresent(newName -> {
- TvRelease tvRelease = TvRelease.builder()
- .name(currentName)
- .season(row.getSerieMapping().getSeason())
- .episode(1)
- .originalName(currentName)
- .customName(newName).build();
- try {
- provider.getProviderSerieId(tvRelease).ifPresentOrElse(providerSerieId -> {
- SerieMapping newSerieMapping =
- new SerieMapping(currentName, providerSerieId.getProviderId(), providerSerieId.getProviderName(),
- providerSerieId.getSeason());
- row.setSerieMapping(newSerieMapping);
- List extends SortKey> sortKeys = table.getRowSorter().getSortKeys();
- selectMappingType(selectedMappingType);
- table.getRowSorter().setSortKeys(sortKeys);
- }, () -> userInteractionHandler.message(
- Messages.getString("MappingEpisodeNameDialog.NoResultsFoundForSerieName", newName),
- Messages.getString("App.Info")));
- } catch (Exception e) {
- userInteractionHandler.message(
- Messages.getString("App.ErrorOccurred", e.getMessage()), Messages.getString("App.Error"));
- }
- });
- });
- });
- buttonPane.add(btnAddCustomMapping, "skip");
- }
-
- {
- new JButton(Messages.getString("App.Close"))
- .defaultButtonFor(getRootPane())
- .withActionListener(() -> setVisible(false))
- .withActionCommand(Messages.getString("App.Close"))
- .addTo(buttonPane, "skip");
- }
- }
- }
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MultiSubDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MultiSubDialog.java
index 93057c77..b23b9895 100644
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MultiSubDialog.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/MultiSubDialog.java
@@ -1,33 +1,26 @@
package org.lodder.subtools.multisubdownloader.gui.dialog;
-import javax.swing.JDialog;
-import javax.swing.JFrame;
-
-import java.awt.Frame;
-import java.awt.Rectangle;
+import javax.swing.*;
+import java.awt.*;
import java.io.Serial;
+import org.jspecify.annotations.Nullable;
+
public class MultiSubDialog extends JDialog {
@Serial
private static final long serialVersionUID = -2357021997104425566L;
- public MultiSubDialog(JFrame frame, String title, boolean modal) {
+ public MultiSubDialog(@Nullable JFrame frame=null, String title, boolean modal) {
super(frame);
setTitle(title);
setModal(modal);
}
- public MultiSubDialog(String title, boolean modal) {
- super();
- setTitle(title);
- setModal(modal);
- }
-
protected void setDialogLocation(Frame f) {
Rectangle r = f.getBounds();
- int x = r.x + (r.width - getSize().width) / 2;
- int y = r.y + (r.height - getSize().height) / 2;
+ int x = r.x + (r.width - size.width) / 2;
+ int y = r.y + (r.height - size.height) / 2;
setLocation(x, y);
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java
index 01a1be45..878cf48f 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/PreferenceDialog.java
@@ -1,23 +1,16 @@
package org.lodder.subtools.multisubdownloader.gui.dialog;
+import static org.lodder.subtools.multisubdownloader.Messages.*;
+
+import javax.swing.*;
+import javax.swing.border.*;
+import java.awt.*;
import java.io.Serial;
import java.util.concurrent.atomic.AtomicInteger;
-import javax.swing.JButton;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JTabbedPane;
-import javax.swing.SwingConstants;
-import javax.swing.border.EmptyBorder;
-
import org.lodder.subtools.multisubdownloader.GUI;
-import org.lodder.subtools.multisubdownloader.Messages;
import org.lodder.subtools.multisubdownloader.framework.event.Emitter;
import org.lodder.subtools.multisubdownloader.framework.event.Event;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.JButtonExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.container.ContainerExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension;
import org.lodder.subtools.multisubdownloader.gui.panels.preference.EpisodeLibraryPanel;
import org.lodder.subtools.multisubdownloader.gui.panels.preference.GeneralPanel;
import org.lodder.subtools.multisubdownloader.gui.panels.preference.MovieLibraryPanel;
@@ -28,95 +21,76 @@
import org.lodder.subtools.sublibrary.Manager;
import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler;
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-
-import lombok.experimental.ExtensionMethod;
-
-@ExtensionMethod({ JComponentExtension.class, ContainerExtension.class, AbstractButtonExtension.class, JButtonExtension.class })
public class PreferenceDialog extends MultiSubDialog {
- @Serial
- private static final long serialVersionUID = -4910124272966075979L;
+ @Serial private static final long serialVersionUID = -4910124272966075979L;
private final SettingsControl settingsCtrl;
private final Emitter eventEmitter;
-
private final GeneralPanel pnlGeneral;
private final EpisodeLibraryPanel pnlEpisodeLibrary;
private final MovieLibraryPanel pnlMovieLibrary;
private final OptionsPanel pnlOptions;
private final SerieProvidersPanel pnlSerieSources;
- public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eventEmitter,
- Manager manager, UserInteractionHandler userInteractionHandler) {
- super(gui, Messages.getString("PreferenceDialog.Title"), true);
+ public PreferenceDialog(GUI gui, final SettingsControl settingsCtrl, Emitter eventEmitter, Manager manager,
+ UserInteractionHandler userInteractionHandler) {
+ super(gui, getText("PreferenceDialog.Title"), true);
this.settingsCtrl = settingsCtrl;
this.eventEmitter = eventEmitter;
setResizable(false);
setModalityType(ModalityType.APPLICATION_MODAL);
setBounds(100, 100, 650, 700);
- getContentPane().setLayout(new BorderLayout());
-
- JPanel contentPanel = new JPanel().addTo(getContentPane(), BorderLayout.CENTER);
- contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
- contentPanel.setLayout(new BorderLayout(0, 0));
- {
- JTabbedPane tabbedPane = new JTabbedPane(SwingConstants.TOP);
- AtomicInteger selectedIndex = new AtomicInteger();
- tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
- tabbedPane.addChangeListener(l -> {
- if (tabbedPane.getSelectedIndex() != selectedIndex.get()) {
- PreferencePanelIntf sourcePanel = (PreferencePanelIntf) tabbedPane.getComponentAt(selectedIndex.get());
- if (!sourcePanel.hasValidSettings()) {
- tabbedPane.setSelectedIndex(selectedIndex.get());
- JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), "Error", JOptionPane.ERROR_MESSAGE);
- } else {
- selectedIndex.set(tabbedPane.getSelectedIndex());
- }
- }
- });
- contentPanel.add(tabbedPane);
-
- this.pnlGeneral = new GeneralPanel(gui, settingsCtrl);
- tabbedPane.addTab(Messages.getString("PreferenceDialog.TabGeneral"), null, pnlGeneral, null);
- this.pnlEpisodeLibrary =
- new EpisodeLibraryPanel(settingsCtrl.getSettings().getEpisodeLibrarySettings(), manager, false, userInteractionHandler);
- tabbedPane.addTab(Messages.getString("PreferenceDialog.SerieLibrary"), null, pnlEpisodeLibrary, null);
-
- this.pnlMovieLibrary =
- new MovieLibraryPanel(settingsCtrl.getSettings().getMovieLibrarySettings(), manager, false, userInteractionHandler);
- tabbedPane.addTab(Messages.getString("PreferenceDialog.MovieLibrary"), null, pnlMovieLibrary, null);
-
- this.pnlOptions = new OptionsPanel(settingsCtrl);
- tabbedPane.addTab(Messages.getString("PreferenceDialog.Options"), null, pnlOptions, null);
-
- this.pnlSerieSources = new SerieProvidersPanel(settingsCtrl);
- tabbedPane.addTab(Messages.getString("PreferenceDialog.SerieSources"), null, pnlSerieSources, null);
- }
-
- {
- new JPanel().layout(new FlowLayout(FlowLayout.RIGHT)).addTo(getContentPane(), BorderLayout.SOUTH)
- .addComponent(
- new JButton(Messages.getString("App.OK"))
- .defaultButtonFor(getRootPane())
- .withActionListener(this::testAndSaveValues)
- .actionCommand(Messages.getString("App.OK")))
- .addComponent(
- new JButton(Messages.getString("App.Cancel"))
- .withActionListener(() -> setVisible(false))
- .actionCommand("Cancel"));
- }
+ AtomicInteger selectedIdx = new AtomicInteger();
+ contentPane
+ .layout(new BorderLayout())
+ .addComponent(BorderLayout.CENTER, new JLabel()
+ .border(new EmptyBorder(5, 5, 5, 5))
+ .layout(new BorderLayout(0, 0))
+ .addComponent(new JTabbedPane(SwingConstants.TOP)
+ .tabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT)
+ .changeListener(tabbedPane -> {
+ if (tabbedPane.selectedIndex != selectedIdx.get()) {
+ var sourcePanel = (PreferencePanelIntf) tabbedPane.getComponentAt(selectedIdx.get());
+ if (!sourcePanel.hasValidSettings()) {
+ tabbedPane.selectedIndex = selectedIdx.get();
+ JOptionPane.showMessageDialog(this, getText("PreferenceDialog.invalidInput"),
+ "Error", JOptionPane.ERROR_MESSAGE);
+ } else {
+ selectedIdx.set(tabbedPane.selectedIndex);
+ }
+ }
+ })
+ .withTab(getText("PreferenceDialog.TabGeneral"),
+ pnlGeneral = new GeneralPanel(gui, settingsCtrl))
+ .withTab(getText("PreferenceDialog.SerieLibrary"),
+ pnlEpisodeLibrary = new EpisodeLibraryPanel(settingsCtrl.settings.episodeLibrarySettings,
+ manager, false, userInteractionHandler))
+ .withTab(getText("PreferenceDialog.MovieLibrary"),
+ pnlMovieLibrary = new MovieLibraryPanel(settingsCtrl.settings.movieLibrarySettings,
+ manager, false, userInteractionHandler))
+ .withTab(getText("PreferenceDialog.Options"),
+ pnlOptions = new OptionsPanel(settingsCtrl))
+ .withTab(getText("PreferenceDialog.SerieSources"),
+ pnlSerieSources = new SerieProvidersPanel(settingsCtrl)))
+ )
+ .addComponent(BorderLayout.SOUTH, new JPanel()
+ .layout(new FlowLayout(FlowLayout.RIGHT))
+ .addComponent(new JButton(getText("App.OK"))
+ .defaultButtonFor(getRootPane())
+ .actionListener(this::testAndSaveValues)
+ .actionCommand(getText("App.OK")))
+ .addComponent(new JButton(getText("App.Cancel"))
+ .actionListener(() -> setVisible(false))
+ .actionCommand("Cancel")));
}
private void testAndSaveValues() {
- if (pnlGeneral.hasValidSettings() &&
- pnlEpisodeLibrary.hasValidSettings() &&
- pnlMovieLibrary.hasValidSettings() &&
- pnlOptions.hasValidSettings() &&
- pnlSerieSources.hasValidSettings()) {
+ if (pnlGeneral.hasValidSettings() && pnlEpisodeLibrary.hasValidSettings() &&
+ pnlMovieLibrary.hasValidSettings() && pnlOptions.hasValidSettings() &&
+ pnlSerieSources.hasValidSettings()) {
pnlGeneral.savePreferenceSettings();
pnlEpisodeLibrary.savePreferenceSettings();
pnlMovieLibrary.savePreferenceSettings();
@@ -126,7 +100,8 @@ private void testAndSaveValues() {
settingsCtrl.store();
this.eventEmitter.fire(new Event("providers.settings.change"));
} else {
- JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), "Error", JOptionPane.ERROR_MESSAGE);
+ JOptionPane.showMessageDialog(this, getText("PreferenceDialog.invalidInput"), "Error",
+ JOptionPane.ERROR_MESSAGE);
}
}
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java
index 129000c0..8ddb05e2 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/ProgressDialog.java
@@ -5,8 +5,8 @@
import java.awt.event.WindowEvent;
import java.io.Serial;
-import lombok.Getter;
import net.miginfocom.swing.MigLayout;
+import org.jspecify.annotations.Nullable;
import org.lodder.subtools.multisubdownloader.Messages;
import org.lodder.subtools.multisubdownloader.gui.extra.progress.Messenger;
import org.lodder.subtools.multisubdownloader.gui.extra.progress.StatusMessenger;
@@ -15,29 +15,21 @@ public class ProgressDialog extends MultiSubDialog implements Messenger {
@Serial
private static final long serialVersionUID = -2320149791421648965L;
- @Getter
+
private JProgressBar progressBar;
private JLabel label;
- private final Cancelable worker;
-
- public ProgressDialog(JFrame frame, Cancelable sft) {
- super(frame, Messages.getString("ProgressDialog.Title"), false);
- worker = sft;
- StatusMessenger.instance.addListener(this);
- initialize_ui();
- setDialogLocation(frame);
- repaint();
- }
- public ProgressDialog(Cancelable sft) {
- super(Messages.getString("ProgressDialog.Title"), false);
- worker = sft;
+ public ProgressDialog(@Nullable JFrame frame=null, Cancelable sft) {
+ super(frame, Messages.getText("ProgressDialog.Title"), false);
StatusMessenger.instance.addListener(this);
- initialize_ui();
+ initializeUi(sft);
+ if (frame != null) {
+ setDialogLocation(frame);
+ }
repaint();
}
- private void initialize_ui() {
+ private void initializeUi(Cancelable worker) {
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
@@ -45,41 +37,37 @@ public void windowClosing(WindowEvent e) {
}
});
setBounds(100, 100, 501, 151);
- getContentPane().setLayout(new MigLayout("", "[][475px,center][]", "[][40px:n][][]"));
-
- label = new JLabel("");
- getContentPane().add(label, "cell 1 0 2 1,alignx left");
-
- progressBar = new JProgressBar(0, 100);
- progressBar.setIndeterminate(true);
- getContentPane().add(progressBar, "cell 1 1,grow");
- JButton btnStop = new JButton("Stop!");
- btnStop.addActionListener(arg0 -> worker.cancel(true));
- getContentPane().add(btnStop, "cell 1 2 1 2,alignx left");
+ contentPane
+ .layout(new MigLayout("", "[][475px,center][]", "[][40px:n][][]"))
+ .addComponent("cell 1 0 2 1,alignx left", label = new JLabel(""))
+ .addComponent("cell 1 1,grow", progressBar = new JProgressBar(0, 100).indeterminate((true)))
+ .addComponent("cell 1 2 1 2,alignx left", new JButton("Stop!")
+ .actionListener(_ -> worker.cancel(true))
+ );
}
public void setMessage(String message) {
- label.setText(message);
+ label.text = message;
repaint();
}
public String getMessage() {
- return label.getText();
+ return label.text;
}
@Override
public void message(String message) {
- setMessage(message);
+ this.message = message;
}
public void updateProgress(int progress) {
if (progress == 0) {
- getProgressBar().setIndeterminate(true);
+ progressBar.setIndeterminate(true);
} else {
- getProgressBar().setIndeterminate(false);
- getProgressBar().setValue(progress);
- getProgressBar().setString(Integer.toString(progress));
+ progressBar.setIndeterminate(false);
+ progressBar.setValue(progress);
+ progressBar.setString(Integer.toString(progress));
}
}
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java
index 0fcefca6..a3cb6c2a 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/RenameDialog.java
@@ -1,5 +1,9 @@
package org.lodder.subtools.multisubdownloader.gui.dialog;
+import static org.lodder.subtools.multisubdownloader.Messages.*;
+
+import javax.swing.*;
+import java.awt.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
@@ -11,24 +15,16 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.SwingWorker;
-
-import org.lodder.subtools.multisubdownloader.Messages;
+import com.google.common.collect.Streams;
+import lombok.experimental.ExtensionMethod;
+import manifold.ext.props.rt.api.set;
+import net.miginfocom.swing.MigLayout;
+import org.jspecify.annotations.Nullable;
import org.lodder.subtools.multisubdownloader.actions.RenameAction;
+import org.lodder.subtools.multisubdownloader.gui.extra.BoxModelProperties;
import org.lodder.subtools.multisubdownloader.gui.extra.MemoryFolderChooser;
import org.lodder.subtools.multisubdownloader.gui.extra.TitlePanel;
import org.lodder.subtools.multisubdownloader.gui.extra.progress.StatusMessenger;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.JButtonExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.container.ContainerExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension;
import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.MyTextFieldPath;
import org.lodder.subtools.multisubdownloader.gui.panels.preference.EpisodeLibraryPanel;
import org.lodder.subtools.multisubdownloader.gui.panels.preference.MovieLibraryPanel;
@@ -41,64 +37,55 @@
import org.lodder.subtools.sublibrary.model.Release;
import org.lodder.subtools.sublibrary.model.VideoType;
import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler;
-import org.lodder.subtools.sublibrary.util.FileUtils;
-import org.lodder.subtools.sublibrary.util.StreamExtension;
-
-import com.google.common.collect.Streams;
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-
-import lombok.Setter;
-import lombok.experimental.ExtensionMethod;
-import net.miginfocom.swing.MigLayout;
-
-@ExtensionMethod({ JTextFieldExtension.class, ContainerExtension.class, JButtonExtension.class, AbstractButtonExtension.class,
- JComponentExtension.class })
public class RenameDialog extends MultiSubDialog implements PropertyChangeListener {
- @Serial
- private static final long serialVersionUID = 1L;
+ @Serial private static final long serialVersionUID = 1L;
+
private final VideoLibraryPanel pnlLibrary;
private final MyTextFieldPath txtFolder;
private final JCheckBox chkRecursive;
+
private ProgressDialog progressDialog;
- public RenameDialog(JFrame frame, Settings settings, VideoType videoType, String title, Manager manager,
- UserInteractionHandler userInteractionHandler) {
+ public RenameDialog(@Nullable JFrame frame=null, Settings settings, VideoType videoType, String title,
+ Manager manager, UserInteractionHandler userInteractionHandler) {
super(frame, title, false);
setResizable(false);
setBounds(100, 100, 650, 680);
- getContentPane().setLayout(new MigLayout("fill, nogrid", "[]", "[][]20:push[]"));
- TitlePanel.title(Messages.getString("PreferenceDialog.Settings"))
- .padding(0).paddingLeft(20).fillContents(true).addTo(getContentPane(), "span, grow, wrap")
- .addComponent("shrink", new JLabel(Messages.getString("PreferenceDialog.Location")))
- .addComponent("grow", this.txtFolder = MyTextFieldPath.builder().requireValue().build().withColumns(20))
- .addComponent("shrink, wrap", new JButton(Messages.getString("App.Browse"))
- .withActionListener(() -> MemoryFolderChooser.getInstance()
- .selectDirectory(getContentPane(), Messages.getString("PreferenceDialog.SelectFolderForRenameReplace"))
- .ifPresent(txtFolder::setObject)))
- .addComponent("wrap", this.chkRecursive = new JCheckBox(Messages.getString("RenameDialog.RecursiveSearch")));
+ contentPane.setLayout(new MigLayout("fill, nogrid", "[]", "[][]20:push[]"));
+
+ new TitlePanel(
+ title:getText("PreferenceDialog.Settings"),
+ padding:new BoxModelProperties(0, 20, 0, 0),
+ fillContents:true)
+ .addToPanel(contentPane, "span, grow, wrap")
+ .addComponent("shrink", new JLabel(getText("PreferenceDialog.Location")))
+ .addComponent("grow", this.txtFolder = MyTextFieldPath.builder().requireValue().build().columns(20))
+ .addComponent("shrink, wrap", new JButton(getText("App.Browse")).actionListener(
+ () -> MemoryFolderChooser.getInstance()
+ .selectDirectory(contentPane,
+ getText("PreferenceDialog.SelectFolderForRenameReplace"))
+ .ifPresent(txtFolder::setObject)))
+ .addComponent("wrap",
+ this.chkRecursive = new JCheckBox(getText("RenameDialog.RecursiveSearch")));
if (videoType == VideoType.EPISODE) {
- pnlLibrary = new EpisodeLibraryPanel(settings.getEpisodeLibrarySettings(), manager, true, userInteractionHandler)
- .addTo(getContentPane(), "grow");
+ pnlLibrary = new EpisodeLibraryPanel(settings.episodeLibrarySettings, manager, true,
+ userInteractionHandler).addTo(contentPane, "grow");
} else {
- pnlLibrary = new MovieLibraryPanel(settings.getMovieLibrarySettings(), manager, true, userInteractionHandler)
- .addTo(getContentPane(), "grow");
+ pnlLibrary =
+ new MovieLibraryPanel(settings.movieLibrarySettings, manager, true, userInteractionHandler).addTo(
+ contentPane, "grow");
}
- new JPanel().layout(new FlowLayout(FlowLayout.RIGHT)).addTo(getContentPane(), BorderLayout.SOUTH)
- .addComponent(
- new JButton(Messages.getString("RenameDialog.Rename"))
- .defaultButtonFor(getRootPane())
- .withActionListener(() -> rename(videoType, settings, manager, userInteractionHandler))
- .withActionCommand("Rename"))
- .addComponent(
- new JButton(Messages.getString("App.Cancel"))
- .withActionListener(() -> setVisible(false))
- .actionCommand("Cancel"));
-
+ new JPanel().layout(new FlowLayout(FlowLayout.RIGHT))
+ .addTo(contentPane, BorderLayout.SOUTH)
+ .addComponent(new JButton(getText("RenameDialog.Rename")).defaultButtonFor(getRootPane())
+ .actionListener(() -> rename(videoType, settings, manager, userInteractionHandler))
+ .actionCommand("Rename"))
+ .addComponent(new JButton(getText("App.Cancel")).actionListener(() -> setVisible(false))
+ .actionCommand("Cancel"));
}
private boolean hasValidSettings() {
@@ -106,18 +93,20 @@ private boolean hasValidSettings() {
}
private void rename(VideoType videoType, Settings settings, Manager manager,
- UserInteractionHandler userInteractionHandler) {
+ UserInteractionHandler userInteractionHandler) {
if (!hasValidSettings()) {
- JOptionPane.showMessageDialog(this, Messages.getString("PreferenceDialog.invalidInput"), "Error", JOptionPane.ERROR_MESSAGE);
+ JOptionPane.showMessageDialog(this, getText("PreferenceDialog.invalidInput"), "Error",
+ JOptionPane.ERROR_MESSAGE);
return;
}
setVisible(false);
pnlLibrary.savePreferenceSettings();
- TypedRenameWorker renameWorker = new TypedRenameWorker(txtFolder.getObject(), pnlLibrary.getLibrarySettings(), videoType,
+ TypedRenameWorker renameWorker =
+ new TypedRenameWorker(txtFolder.getObject(), pnlLibrary.librarySettings, videoType,
this.chkRecursive.isSelected(), manager, userInteractionHandler);
renameWorker.addPropertyChangeListener(this);
- renameWorker.setReleaseFactory(new ReleaseFactory(settings, manager));
+ renameWorker.releaseFactory = new ReleaseFactory(settings, manager);
progressDialog = new ProgressDialog(renameWorker);
progressDialog.setVisible(true);
renameWorker.execute();
@@ -131,12 +120,12 @@ public void propertyChange(PropertyChangeEvent event) {
} else {
final int progress = renameWorker.getProgress();
progressDialog.updateProgress(progress);
- StatusMessenger.instance.message(Messages.getString("RenameDialog.StatusRename"));
+ StatusMessenger.instance.message(getText("RenameDialog.StatusRename"));
}
}
}
- @ExtensionMethod({ FileUtils.class, Files.class, StreamExtension.class })
+ @ExtensionMethod({ Files.class })
private static class TypedRenameWorker extends SwingWorker implements Cancelable {
private final UserInteractionHandler userInteractionHandler;
@@ -144,14 +133,14 @@ private static class TypedRenameWorker extends SwingWorker impleme
private final VideoType videoType;
private final Set extensions;
private final boolean isRecursive;
- @Setter
- private ReleaseFactory releaseFactory;
private final RenameAction renameAction;
+ @set ReleaseFactory releaseFactory;
- public TypedRenameWorker(Path dir, LibrarySettings librarySettings, VideoType videoType,
- boolean isRecursive, Manager manager, UserInteractionHandler userInteractionHandler) {
+ public TypedRenameWorker(Path dir, LibrarySettings librarySettings, VideoType videoType, boolean isRecursive,
+ Manager manager, UserInteractionHandler userInteractionHandler) {
this.userInteractionHandler = userInteractionHandler;
- this.extensions = Streams.concat(VideoPatterns.EXTENSIONS.stream(), Stream.of("srt")).collect(Collectors.toUnmodifiableSet());
+ this.extensions = Streams.concat(VideoPatterns.EXTENSIONS.stream(), Stream.of("srt"))
+ .collect(Collectors.toUnmodifiableSet());
this.dir = dir;
this.videoType = videoType;
this.isRecursive = isRecursive;
@@ -170,8 +159,8 @@ private void rename(Path dir) throws IOException {
if (!file.fileNameContainsIgnoreCase("sample") && extensions.contains(file.getExtension())) {
Release release = releaseFactory.createRelease(file, userInteractionHandler);
if (release != null) {
- publish(release.getFileName());
- if (release.getVideoType() == videoType) {
+ publish(release.fileName);
+ if (release.videoType == videoType) {
renameAction.rename(file, release);
}
}
@@ -184,7 +173,7 @@ private void rename(Path dir) throws IOException {
@Override
protected void process(List data) {
- data.forEach(s -> StatusMessenger.instance.message(Messages.getString("MainWindow.RenamingFile", s)));
+ data.forEach(s -> StatusMessenger.instance.message(getText("MainWindow.RenamingFile", s)));
}
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java
index 3442170c..c562a64a 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/SelectDialog.java
@@ -1,124 +1,105 @@
package org.lodder.subtools.multisubdownloader.gui.dialog;
+import static org.lodder.subtools.multisubdownloader.Messages.*;
+
import javax.swing.*;
-import javax.swing.table.*;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableRowSorter;
import java.awt.*;
import java.io.Serial;
import java.util.Comparator;
import java.util.List;
import java.util.stream.IntStream;
-import lombok.experimental.ExtensionMethod;
import net.miginfocom.swing.MigLayout;
-import org.lodder.subtools.multisubdownloader.Messages;
+import org.jspecify.annotations.Nullable;
import org.lodder.subtools.multisubdownloader.gui.extra.table.CustomTable;
import org.lodder.subtools.multisubdownloader.gui.extra.table.SubtitleTableColumnName;
import org.lodder.subtools.multisubdownloader.gui.extra.table.SubtitleTableModel;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.JButtonExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension;
import org.lodder.subtools.sublibrary.model.Release;
import org.lodder.subtools.sublibrary.model.Subtitle;
-@ExtensionMethod({ JButtonExtension.class, AbstractButtonExtension.class, JComponentExtension.class })
public class SelectDialog extends MultiSubDialog {
- @Serial
- private static final long serialVersionUID = -4092909537478305235L;
- private List selectedSubtitleIdxs;
+ @Serial private static final long serialVersionUID = -4092909537478305235L;
+
private final List subtitles;
- private final Release release;
- private CustomTable customTable;
+ private final CustomTable customTable;
+
+ private List selectedSubtitleIdxs;
/**
* Create the dialog.
*/
- public SelectDialog(JFrame frame, List subtitles, Release release) {
- super(frame, Messages.getString("SelectDialog.SelectCorrectSubtitle"), true);
- this.subtitles = subtitles.stream().distinct().sorted(Comparator.comparing(Subtitle::getScore).reversed()).toList();
- this.release = release;
- initialize();
- pack();
- setDialogLocation(frame);
- setVisible(true);
- }
-
- private void initialize() {
- getContentPane().setLayout(new MigLayout("", "[1000px:n,grow,fill]", "[][::100px,fill][grow]"));
- JLabel lblNewLabel =
- new JLabel(Messages.getString("SelectDialog.SelectCorrectSubtitleThisRelease")
- + release.getFileName());
- getContentPane().add(lblNewLabel, "cell 0 0");
- {
- JScrollPane scrollPane = new JScrollPane();
- getContentPane().add(scrollPane, "cell 0 1,grow");
- customTable = createCustomTable();
- scrollPane.setViewportView(customTable);
- JPanel buttonPane = new JPanel();
- buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
- getContentPane().add(buttonPane, "cell 0 2,grow");
-
- new JButton(Messages.getString("App.OK"))
+ public SelectDialog(@Nullable JFrame frame = null, List subtitles, Release release) {
+ super(frame, getText("SelectDialog.SelectCorrectSubtitle"), true);
+ this.subtitles =
+ subtitles.stream().distinct().sorted(Comparator.comparing(Subtitle::getScore).reversed()).toList();
+ contentPane
+ .layout(new MigLayout("", "[1000px:n,grow,fill]", "[][::100px,fill][grow]"))
+ .addComponent("cell 0 0",
+ new JLabel(getText("SelectDialog.SelectCorrectSubtitleThisRelease") + release.fileName))
+ .addComponent("cell 0 1,grow", new JScrollPane().viewportView(customTable = createCustomTable()))
+ .addComponent("cell 0 2,grow", new JPanel()
+ .layout(new FlowLayout(FlowLayout.RIGHT))
+ .addComponent(new JButton(getText("App.OK"))
.defaultButtonFor(getRootPane())
- .withActionListener(() -> {
+ .actionListener(() -> {
selectedSubtitleIdxs = getSelectedIdxs();
setVisible(false);
})
- .withActionCommand(Messages.getString("App.OK"))
- .addTo(buttonPane);
-
- new JButton(Messages.getString("SelectDialog.Everything"))
- .withActionListener(() -> {
+ .actionCommand(getText("App.OK")))
+ .addComponent(new JButton(getText("SelectDialog.Everything"))
+ .actionListener(() -> {
selectedSubtitleIdxs = IntStream.range(0, release.getMatchingSubs().size()).boxed().toList();
setVisible(false);
})
- .withActionCommand(Messages.getString("App.All"))
- .addTo(buttonPane);
-
- new JButton(Messages.getString("App.Cancel"))
- .withActionListener(() -> {
+ .actionCommand(getText("App.All")))
+ .addComponent(new JButton(getText("App.Cancel"))
+ .actionListener(() -> {
selectedSubtitleIdxs = List.of();
setVisible(false);
})
- .withActionCommand(Messages.getString("App.Cancel"))
- .addTo(buttonPane);
- }
+ .actionCommand(getText("App.Cancel"))));
+ pack();
+ setDialogLocation(frame);
+ setVisible(true);
}
private CustomTable createCustomTable() {
- CustomTable customTable = new CustomTable();
- customTable.setModel(SubtitleTableModel.getDefaultSubtitleTableModel());
- final RowSorter sorter = new TableRowSorter<>(customTable.getModel());
- customTable.setRowSorter(sorter);
- customTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
-
- SubtitleTableModel subtitleTableModel = (SubtitleTableModel) customTable.getModel();
-
- int columnId = customTable.getColumnIdByName(SubtitleTableColumnName.SELECT);
- customTable.getColumnModel().getColumn(columnId).setResizable(false);
- customTable.getColumnModel().getColumn(columnId).setPreferredWidth(55);
- customTable.getColumnModel().getColumn(columnId).setMaxWidth(55);
-
- columnId = customTable.getColumnIdByName(SubtitleTableColumnName.SCORE);
- customTable.getColumnModel().getColumn(columnId).setResizable(false);
- customTable.getColumnModel().getColumn(columnId).setPreferredWidth(60);
- customTable.getColumnModel().getColumn(columnId).setMaxWidth(60);
-
- columnId = customTable.getColumnIdByName(SubtitleTableColumnName.FILENAME);
- customTable.getColumnModel().getColumn(columnId).setResizable(true);
- customTable.getColumnModel().getColumn(columnId).setMinWidth(500);
-
- for (Subtitle subtitle : subtitles) {
- subtitleTableModel.addRow(subtitle);
- }
-
- return customTable;
+ SubtitleTableModel subtitleTableModel = SubtitleTableModel.createDefaultSubtitleTableModel();
+ CustomTable table = new CustomTable()
+ .model(subtitleTableModel)
+ .rowSorter(TableRowSorter::new)
+ .autoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
+
+ TableColumnModel columnModel = table.getColumnModel();
+
+ TableColumn column = columnModel.getColumn(table.getColumnIdByName(SubtitleTableColumnName.SELECT));
+ column.resizable = false;
+ column.preferredWidth = 55;
+ column.maxWidth = 55;
+
+ column = columnModel.getColumn(table.getColumnIdByName(SubtitleTableColumnName.SCORE));
+ column.resizable = false;
+ column.preferredWidth = 60;
+ column.maxWidth = 60;
+
+ column = columnModel.getColumn(table.getColumnIdByName(SubtitleTableColumnName.FILENAME));
+ column.resizable = true;
+ column.minWidth = 500;
+
+ subtitles.forEach(subtitleTableModel::addRow);
+ return table;
}
private List getSelectedIdxs() {
return IntStream.range(0, customTable.getModel().getRowCount())
- .filter(i -> (boolean) customTable.getModel().getValueAt(i, customTable.getColumnIdByName(SubtitleTableColumnName.SELECT)))
- .boxed().toList();
+ .filter(i -> (boolean) customTable.getModel()
+ .getValueAt(i, customTable.getColumnIdByName(SubtitleTableColumnName.SELECT)))
+ .boxed()
+ .toList();
}
public List getSelection() {
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java
index 7906d5f7..8c802b84 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/StructureBuilderDialog.java
@@ -1,25 +1,20 @@
package org.lodder.subtools.multisubdownloader.gui.dialog;
+import static org.lodder.subtools.multisubdownloader.Messages.*;
+
import javax.swing.*;
-import javax.swing.event.*;
-import javax.swing.text.*;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.Serial;
import java.nio.file.Path;
-import java.util.Arrays;
import java.util.function.Function;
-import lombok.experimental.ExtensionMethod;
import net.miginfocom.swing.MigLayout;
-import org.lodder.subtools.multisubdownloader.Messages;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.AbstractButtonExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.button.JButtonExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.component.ComponentExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.container.ContainerExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jtextfield.JTextFieldExtension;
+import org.jspecify.annotations.Nullable;
import org.lodder.subtools.multisubdownloader.lib.ReleaseFactory;
import org.lodder.subtools.multisubdownloader.lib.library.LibraryBuilder;
import org.lodder.subtools.multisubdownloader.settings.model.Settings;
@@ -34,17 +29,15 @@
import org.lodder.subtools.sublibrary.model.VideoType;
import org.lodder.subtools.sublibrary.userinteraction.UserInteractionHandler;
-@ExtensionMethod({ JButtonExtension.class, AbstractButtonExtension.class, JComponentExtension.class, ContainerExtension.class,
- ComponentExtension.class, JTextFieldExtension.class })
public class StructureBuilderDialog extends MultiSubDialog implements DocumentListener {
- @Serial
- private static final long serialVersionUID = -5174968778375028124L;
+ @Serial private static final long serialVersionUID = -5174968778375028124L;
+
private final VideoType videoType;
private final StructureType structureType;
- private final Manager manager;
private final UserInteractionHandler userInteractionHandler;
private final Function libraryBuilder;
+
private JTextField txtStructure;
private JLabel lblPreview;
private TvRelease tvRelease;
@@ -56,86 +49,80 @@ public enum StructureType {
FILE, FOLDER
}
- public StructureBuilderDialog(JFrame frame, String title, boolean modal, VideoType videoType,
- StructureType structureType, Manager manager, UserInteractionHandler userInteractionHandler,
- Function filenameLibraryBuilder) {
+ public StructureBuilderDialog(@Nullable JFrame frame=null, String title, boolean modal, VideoType videoType,
+ StructureType structureType, Manager manager, UserInteractionHandler userInteractionHandler,
+ Function filenameLibraryBuilder) {
super(frame, title, modal);
this.videoType = videoType;
this.structureType = structureType;
- this.manager = manager;
this.userInteractionHandler = userInteractionHandler;
this.libraryBuilder = filenameLibraryBuilder;
- initializeUi();
- generateVideoFiles();
+ initializeUI();
+ generateVideoFiles(manager);
}
- private void initializeUi() {
+ private void initializeUI() {
setBounds(100, 100, 600, 300);
setMinimumSize(new Dimension(600, 300));
- Container panel = getContentPane().layout(new MigLayout("insets 10, nogrid"));
-
- new JLabel(Messages.getString("StructureBuilderDialog.AvailableTagsClickToAdd")).addTo(panel, "wrap");
-
- this.tagPanel = new JPanel(new MigLayout("flowy, wrap 5", "[150px][150px][150px]")).addTo(panel, "grow, wrap");
- {
- if (videoType == VideoType.EPISODE) {
- // add tv show tags
- buildLabelTable(SerieStructureTag.values());
- } else if (videoType == VideoType.MOVIE) {
- // add movie tags
- buildLabelTable(MovieStructureTag.values());
- }
- if (structureType == StructureType.FOLDER) {
- buildLabelTable(FolderStructureTag.values());
- }
- }
- new JLabel(Messages.getString("StructureBuilderDialog.Structure")).addTo(panel);
- this.txtStructure = new JTextField().withColumns(100).addTo(panel, "span, wrap");
- this.txtStructure.getDocument().addDocumentListener(this);
-
- new JLabel(Messages.getString("StructureBuilderDialog.Preview")).addTo(panel);
- this.lblPreview = new JLabel("").addTo(panel);
-
- new JPanel(new FlowLayout(FlowLayout.RIGHT)).addTo(panel, BorderLayout.SOUTH)
- .addComponent(
- new JButton(Messages.getString("App.OK"))
- .defaultButtonFor(getRootPane())
- .withActionListener(e -> {
- setVisible(false);
- dispose(); // this is needed to dispose the dialog and return the control to the window
- })
- .withActionCommand("OK"))
- .addComponent(new JButton(Messages.getString("App.Cancel"))
- .withActionListener(e -> {
- setVisible(false);
- txtStructure.setText(oldStructure);
- dispose(); // this is needed to dispose the dialog and return the control to the window
- })
- .withActionCommand("Cancel"));
+ contentPane
+ .layout(new MigLayout("insets 10, nogrid"))
+ .addComponent("wrap", new JLabel(getText("StructureBuilderDialog.AvailableTagsClickToAdd")))
+ .addComponent("grow, wrap",
+ tagPanel = new JPanel(new MigLayout("flowy, wrap 5", "[150px][150px][150px]")))
+ .addComponent(new JLabel(getText("StructureBuilderDialog.Structure")))
+ .addComponent("span, wrap",
+ txtStructure = new JTextField()
+ .columns(100)
+ .documentListener(this))
+ .addComponent(new JLabel(getText("StructureBuilderDialog.Preview")))
+ .addComponent(lblPreview = new JLabel())
+ .addComponent(BorderLayout.SOUTH, new JPanel(new FlowLayout(FlowLayout.RIGHT))
+ .addComponent(new JButton(getText("App.OK"))
+ .defaultButtonFor(rootPane)
+ .actionListener(_ -> {
+ setVisible(false);
+ dispose(); // this is needed to dispose the dialog and return the control to the window
+ })
+ .actionCommand("OK"))
+ .addComponent(new JButton(getText("App.Cancel"))
+ .actionListener(_ -> {
+ setVisible(false);
+ txtStructure.setText(oldStructure);
+ dispose(); // this is needed to dispose the dialog and return the control to the window
+ })
+ .actionCommand("Cancel")));
+
+ switch (videoType) {
+ case EPISODE -> buildLabelTable(SerieStructureTag.values());
+ case MOVIE -> buildLabelTable(MovieStructureTag.values());
+ }
+ if (structureType == StructureType.FOLDER) {
+ buildLabelTable(FolderStructureTag.values());
+ }
}
- private void generateVideoFiles() {
+ private void generateVideoFiles(Manager manager) {
ReleaseFactory releaseFactory = new ReleaseFactory(new Settings(), manager);
- if (videoType == VideoType.EPISODE) {
- tvRelease = (TvRelease) releaseFactory.createRelease(
- Path.of("Terra.Nova.S01E01E02.Genesis.720p.HDTV.x264-ORENJI.mkv"),
- userInteractionHandler);
- } else if (videoType == VideoType.MOVIE) {
- movieRelease = (MovieRelease) releaseFactory.createRelease(Path.of("Final.Destination.5.720p.Bluray.x264-TWiZTED"),
- userInteractionHandler);
+ switch (videoType) {
+ case EPISODE -> tvRelease = (TvRelease) releaseFactory.createRelease(
+ Path.of("Terra.Nova.S01E01E02.Genesis.720p.HDTV.x264-ORENJI.mkv"),
+ userInteractionHandler, false);
+ case MOVIE -> movieRelease = (MovieRelease) releaseFactory.createRelease(
+ Path.of("Final.Destination.5.2011.720p.Bluray.x264-TWiZTED.mkv"),
+ userInteractionHandler, false);
}
}
private void buildLabelTable(StructureTag[] structureTags) {
- Arrays.stream(structureTags).forEach(this::addTag);
+ structureTags.forEach(this::addTag);
}
private void addTag(StructureTag structureTag) {
- new JLabel(structureTag.getLabel())
- .withToolTipText(structureTag.getDescription())
- .addTo(tagPanel)
- .withMouseListener(new InsertTag());
+ new JLabel(structureTag.label)
+ .withToolTipText(structureTag.description)
+ .addTo(tagPanel)
+ .mouseListener(new InsertTag());
}
public String showDialog(String structure) {
@@ -192,7 +179,7 @@ public void mouseClicked(MouseEvent e) {
beforeCaret = txtStructure.getText();
afterCaret = "";
}
- txtStructure.setText(String.format("%s%s%s", beforeCaret, clickedTag, afterCaret));
+ txtStructure.setText("%s%s%s".formatted(beforeCaret, clickedTag, afterCaret));
}
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java
index 6df020aa..a52e3f5b 100644
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressDialog.java
@@ -1,12 +1,15 @@
package org.lodder.subtools.multisubdownloader.gui.dialog.progress.search;
-import javax.swing.JButton;
-import javax.swing.JProgressBar;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
+import static org.lodder.subtools.multisubdownloader.Messages.*;
+import javax.swing.*;
+import javax.swing.table.TableColumn;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.Serial;
+
+import net.miginfocom.swing.MigLayout;
import org.lodder.subtools.multisubdownloader.GUI;
-import org.lodder.subtools.multisubdownloader.Messages;
import org.lodder.subtools.multisubdownloader.actions.ActionException;
import org.lodder.subtools.multisubdownloader.gui.dialog.Cancelable;
import org.lodder.subtools.multisubdownloader.gui.dialog.MultiSubDialog;
@@ -14,29 +17,43 @@
import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProvider;
import org.lodder.subtools.sublibrary.model.Release;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.Serial;
-
-import net.miginfocom.swing.MigLayout;
-
public class SearchProgressDialog extends MultiSubDialog implements SearchProgressListener {
@Serial
private static final long serialVersionUID = -1331536352530988442L;
- private final Cancelable searchAction;
private final GUI window;
- private SearchProgressTableModel tableModel;
- private JProgressBar progressBar;
+ private final SearchProgressTableModel tableModel;
+ private final JProgressBar progressBar;
private boolean completed;
public SearchProgressDialog(GUI window, Cancelable searchAction) {
- super(window, Messages.getString("SearchProgressDialog.Title"), false);
- this.searchAction = searchAction;
+ super(window, getText("SearchProgressDialog.Title"), false);
this.window = window;
this.completed = false;
- initialize_ui();
+ addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent e) {
+ searchAction.cancel(true);
+ }
+ });
+ setBounds(100, 100, 601, 300);
+
+ JTable table = new JTable(this.tableModel = new SearchProgressTableModel());
+ TableColumn column1 = table.getColumnModel().getColumn(0);
+ column1.minWidth = 120;
+ column1.maxWidth = 150;
+ TableColumn column2 = table.getColumnModel().getColumn(1);
+ column2.minWidth = 50;
+ column2.maxWidth = 50;
+
+ contentPane
+ .layout(new MigLayout("", "[grow,fill][]", "[][][]"))
+ .addComponent("cell 0 0 2 1", new JScrollPane(table).viewportView(table))
+ .addComponent("cell 0 1 2 1,grow", progressBar = new JProgressBar(0, 100).indeterminate(true))
+ .addComponent("cell 1 2,alignx left",
+ new JButton(getText("SearchProgressDialog.Stop"))
+ .actionListener(_ -> searchAction.cancel(true)));
setDialogLocation(window);
repaint();
}
@@ -44,8 +61,7 @@ public SearchProgressDialog(GUI window, Cancelable searchAction) {
@Override
public void progress(SubtitleProvider provider, int jobsLeft, Release release) {
this.setVisible();
- this.tableModel.update(provider.getName(), jobsLeft,
- release == null ? "Done" : release.getFileName());
+ this.tableModel.update(provider.name, jobsLeft, release == null ? "Done" : release.fileName);
}
@Override
@@ -69,6 +85,7 @@ public void completed() {
@Override
public void reset() {
this.completed = false;
+ tableModel.clear();
}
@Override
@@ -82,36 +99,6 @@ public void onStatus(String message) {
this.window.setStatusMessage(message);
}
- private void initialize_ui() {
- addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(WindowEvent e) {
- searchAction.cancel(true);
- }
- });
- setBounds(100, 100, 601, 300);
- getContentPane().setLayout(new MigLayout("", "[grow,fill][]", "[][][]"));
-
- this.tableModel = new SearchProgressTableModel();
- JTable table = new JTable(tableModel);
-
- table.getColumnModel().getColumn(0).setMinWidth(120);
- table.getColumnModel().getColumn(0).setMaxWidth(150);
- table.getColumnModel().getColumn(0).setMinWidth(50);
- table.getColumnModel().getColumn(1).setMaxWidth(50);
-
- JScrollPane tablePane = new JScrollPane(table);
- tablePane.setViewportView(table);
- getContentPane().add(tablePane, "cell 0 0 2 1");
-
- progressBar = new JProgressBar(0, 100);
- progressBar.setIndeterminate(true);
- getContentPane().add(progressBar, "cell 0 1 2 1,grow");
-
- JButton btnStop = new JButton(Messages.getString("SearchProgressDialog.Stop"));
- btnStop.addActionListener(arg0 -> searchAction.cancel(true));
- getContentPane().add(btnStop, "cell 1 2,alignx left");
- }
private void setVisible() {
if (this.completed || this.isVisible()) {
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java
index 63a5ab1a..c604098c 100644
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/dialog/progress/search/SearchProgressTableModel.java
@@ -1,12 +1,12 @@
package org.lodder.subtools.multisubdownloader.gui.dialog.progress.search;
-import javax.swing.table.*;
+import static org.lodder.subtools.multisubdownloader.Messages.*;
+
+import javax.swing.table.DefaultTableModel;
import java.io.Serial;
import java.util.HashMap;
import java.util.Map;
-import org.lodder.subtools.multisubdownloader.Messages;
-
public class SearchProgressTableModel extends DefaultTableModel {
@Serial
@@ -17,9 +17,9 @@ public SearchProgressTableModel() {
super();
this.setColumnCount(3);
this.setColumnIdentifiers(new String[]{
- Messages.getString("SearchProgressTableModel.Source"),
- Messages.getString("SearchProgressTableModel.Queue"),
- Messages.getString("SearchProgressTableModel.Release")});
+ getText("SearchProgressTableModel.Source"),
+ getText("SearchProgressTableModel.Queue"),
+ getText("SearchProgressTableModel.Release") });
}
public void update(String source, int queue, String release) {
@@ -42,7 +42,12 @@ private void updateRow(int rowNr, int queue, String release) {
private void createRow(String source, int queue, String release) {
this.rowMap.put(source, this.getRowCount());
- Object[] row = {source, queue, release};
+ Object[] row = { source, queue, release };
this.addRow(row);
}
+
+ public void clear() {
+ rowMap.clear();
+ dataVector.removeAllElements();
+ }
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java
index fad3084e..538b5cea 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ArrowButton.java
@@ -4,25 +4,19 @@
import java.awt.*;
import java.io.Serial;
-import lombok.Getter;
-import lombok.Setter;
+import manifold.ext.props.rt.api.var;
-@Getter
-@Setter
public class ArrowButton extends JButton {
- @Serial
- private static final long serialVersionUID = -4630720317499130016L;
+ @Serial private static final long serialVersionUID = -4630720317499130016L;
/**
- * The cardinal direction of the arrow(s),
- * any of {@link SwingConstants#NORTH}, {@link SwingConstants#SOUTH}, {@link SwingConstants#WEST} or {@link SwingConstants#EAST}
+ * The cardinal direction of the arrow(s), any of {@link SwingConstants#NORTH}, {@link SwingConstants#SOUTH},
+ * {@link SwingConstants#WEST} or {@link SwingConstants#EAST}
*/
- private int direction;
-
- private int arrowCount;
-
- private int arrowSize;
+ @var int direction;
+ @var int arrowCount;
+ @var int arrowSize;
public ArrowButton(int direction, int arrowCount, int arrowSize) {
setMargin(new Insets(0, 2, 0, 2));
@@ -39,13 +33,10 @@ public Dimension getPreferredSize() {
@Override
public Dimension getMinimumSize() {
- return new Dimension(arrowSize
- * (direction == SwingConstants.EAST || direction == SwingConstants.WEST ? arrowCount : 3)
- + getBorder().getBorderInsets(this).left + getBorder().getBorderInsets(this).right,
- arrowSize
- * (direction == SwingConstants.NORTH || direction == SwingConstants.SOUTH ? arrowCount : 3)
- + getBorder().getBorderInsets(this).top
- + getBorder().getBorderInsets(this).bottom);
+ return new Dimension(arrowSize * (direction == EAST || direction == WEST ? arrowCount : 3) +
+ getBorder().getBorderInsets(this).left + getBorder().getBorderInsets(this).right,
+ arrowSize * (direction == NORTH || direction == SOUTH ? arrowCount : 3) +
+ getBorder().getBorderInsets(this).top + getBorder().getBorderInsets(this).bottom);
}
@Override
@@ -65,18 +56,10 @@ protected void paintComponent(Graphics g) {
int w = getSize().width;
int h = getSize().height;
for (int i = 0; i < arrowCount; i++) {
- paintArrow(g,
- (w - arrowSize
- * (direction == SwingConstants.EAST || direction == SwingConstants.WEST ? arrowCount : 1))
- / 2
- + arrowSize
- * (direction == SwingConstants.EAST || direction == SwingConstants.WEST ? i : 0),
- (h - arrowSize
- * (direction == SwingConstants.EAST || direction == SwingConstants.WEST ? 1 : arrowCount))
- / 2
- + arrowSize
- * (direction == SwingConstants.EAST || direction == SwingConstants.WEST ? 0 : i),
- g.getColor());
+ paintArrow(g, (w - arrowSize * (direction == EAST || direction == WEST ? arrowCount : 1)) / 2 +
+ arrowSize * (direction == EAST || direction == WEST ? i : 0),
+ (h - arrowSize * (direction == EAST || direction == WEST ? 1 : arrowCount)) / 2 +
+ arrowSize * (direction == EAST || direction == WEST ? 0 : i), g.getColor());
}
g.setColor(oldColor);
@@ -86,7 +69,7 @@ private void paintArrow(Graphics g, int x, int y, Color highlight) {
int mid, i, j;
Color oldColor = g.getColor();
- boolean isEnabled = isEnabled();
+ boolean enabled = isEnabled();
j = 0;
arrowSize = Math.max(arrowSize, 2);
@@ -99,13 +82,13 @@ private void paintArrow(Graphics g, int x, int y, Color highlight) {
for (i = 0; i < arrowSize; i++) {
g.drawLine(mid - i, i, mid + i, i);
}
- if (!isEnabled) {
+ if (!enabled) {
g.setColor(highlight);
g.drawLine(mid - i + 2, i, mid + i, i);
}
}
case SOUTH -> {
- if (!isEnabled) {
+ if (!enabled) {
g.translate(1, 1);
g.setColor(highlight);
for (i = arrowSize - 1; i >= 0; i--) {
@@ -125,13 +108,13 @@ private void paintArrow(Graphics g, int x, int y, Color highlight) {
for (i = 0; i < arrowSize; i++) {
g.drawLine(i, mid - i, i, mid + i);
}
- if (!isEnabled) {
+ if (!enabled) {
g.setColor(highlight);
g.drawLine(i, mid - i + 2, i, mid + i);
}
}
case EAST -> {
- if (!isEnabled) {
+ if (!enabled) {
g.translate(1, 1);
g.setColor(highlight);
for (i = arrowSize - 1; i >= 0; i--) {
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/BoxModelProperties.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/BoxModelProperties.java
new file mode 100644
index 00000000..e269b6b4
--- /dev/null
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/BoxModelProperties.java
@@ -0,0 +1,29 @@
+package org.lodder.subtools.multisubdownloader.gui.extra;
+
+import manifold.ext.props.rt.api.val;
+
+public class BoxModelProperties {
+ @val Integer top;
+ @val Integer left;
+ @val Integer bottom;
+ @val Integer right;
+
+ public BoxModelProperties(Integer top=null, Integer left=null, Integer bottom=null, Integer right=null) {
+ this.top = top;
+ this.left = left;
+ this.bottom = bottom;
+ this.right = right;
+ }
+
+ public BoxModelProperties(int padding) {
+ this(padding, padding, padding, padding);
+ }
+
+ public String getInsets() {
+ return "insets %s %s %s %s".formatted(getPadding(top), getPadding(left), getPadding(bottom), getPadding(right));
+ }
+
+ private String getPadding(Integer padding) {
+ return padding == null ? "n" : String.valueOf(padding);
+ }
+}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java
index 30e7c4e7..81d8b515 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/ImageListCellRenderer.java
@@ -13,26 +13,22 @@ public class ImageListCellRenderer extends JLabel implements ListCellRendererSource:
- *
- * Return a component that has been configured to display the specified value.
- * That component's paint method is then called to "render" the cell.
- * If it is necessary to compute the dimensions of a list because the list cells do not have a fixed size,
- * this method is called to generate a component on which getPreferredSize can be invoked.
- *
- * jlist - the jlist we're painting
- * value - the value returned by list.getModel().getElementAt(index).
- * cellIndex - the cell index
- * isSelected - true if the specified cell is currently selected
- * cellHasFocus - true if the cell has focus
- */
- @Override
- public Component getListCellRendererComponent(JList> jlist, Object value, int cellIndex,
- boolean isSelected, boolean cellHasFocus) {
- if (value instanceof JPanel) {
- Component component = (Component) value;
- if (isSelected) {
+ /**
+ * Source:
+ *
+ * Return a component that has been configured to display the specified value. That component's paint method is then
+ * called to "render" the cell. If it is necessary to compute the dimensions of a list because the list cells do not
+ * have a fixed size, this method is called to generate a component on which getPreferredSize can be invoked.
+ *
+ * jlist - the jlist we're painting value - the value returned by list.getModel().getElementAt(index). cellIndex -
+ * the cell index selected - true if the specified cell is currently selected cellHasFocus - true if the cell has
+ * focus
+ */
+ @Override
+ public Component getListCellRendererComponent(JList> jlist, Object value, int cellIndex,
+ boolean selected, boolean cellHasFocus) {
+ if (value instanceof JPanel component) {
+ if (selected) {
component.setBackground(jlist.getSelectionBackground());
component.setForeground(jlist.getSelectionForeground());
} else {
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java
index db84b9f7..6625fd40 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/JListWithImages.java
@@ -10,13 +10,8 @@
import java.util.stream.Stream;
import com.google.common.base.Objects;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.experimental.Accessors;
-import lombok.experimental.ExtensionMethod;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension;
+import manifold.ext.props.rt.api.val;
-@ExtensionMethod({ JComponentExtension.class })
public class JListWithImages extends JList> {
@Serial
@@ -25,43 +20,21 @@ public class JListWithImages extends JList> {
private final Function toStringMapper;
private final boolean distinctValues;
- private JListWithImages(Function toStringMapper, boolean distinctValues) {
- this.toStringMapper = toStringMapper == null ? Object::toString : toStringMapper;
+ public JListWithImages(Function toStringMapper=Object::toString, boolean distinctValues=true) {
+ this.toStringMapper = toStringMapper;
this.distinctValues = distinctValues;
setCellRenderer(new ImageListCellRenderer());
setModel(new DefaultListModel<>());
}
- public static JListWithImages forType(Class type) {
- return createForType(type).build();
- }
-
- public static JListWithImagesBuilder createForType(Class type) {
- return new JListWithImagesBuilder<>();
- }
-
- @Setter
- @Accessors(chain = true, fluent = true)
- public static class JListWithImagesBuilder {
- private Function toStringMapper;
- private boolean distinctValues;
-
- public JListWithImagesBuilder distinctValues() {
- return distinctValues(true);
- }
-
- public JListWithImages build() {
- return new JListWithImages<>(toStringMapper, distinctValues);
- }
- }
-
public void addItems(Image image, Collection values) {
values.forEach(value -> addItem(image, value));
}
public void addItem(Image image, T value) {
if (!distinctValues || !contains(value)) {
- ((DefaultListModel>) getModel()).addElement(new LabelPanel<>(image, value, toStringMapper, SwingConstants.LEFT));
+ ((DefaultListModel>) getModel()).addElement(
+ new LabelPanel<>(image, value, toStringMapper, SwingConstants.LEFT));
}
}
@@ -93,11 +66,10 @@ private Optional> getLabelPanel(int index) {
return Optional.ofNullable(getModel().getElementAt(index));
}
- @Getter
public static class LabelPanel extends JPanel {
- private static final long serialVersionUID = 1L;
- private final Label label;
+ @Serial private static final long serialVersionUID = 1L;
+ @val Label label;
LabelPanel(Image image, T object, Function toStringMapper, int horizontalAlignment) {
this.label = new Label<>(image, object, toStringMapper, horizontalAlignment);
@@ -106,19 +78,18 @@ public static class LabelPanel extends JPanel {
}
public T getObject() {
- return label.getObject();
+ return label.object;
}
public Image getImage() {
- return label.getImage();
+ return label.image;
}
}
- @Getter
private static class Label extends JLabel {
- private static final long serialVersionUID = 1L;
- private final T object;
- private final Image image;
+ @Serial private static final long serialVersionUID = 1L;
+ @val T object;
+ @val Image image;
Label(Image image, T object, Function toStringMapper, int horizontalAlignment) {
super(toStringMapper.apply(object), getImageIcon(image), horizontalAlignment);
@@ -131,7 +102,7 @@ private static ImageIcon getImageIcon(Image image) {
}
private static ImageIcon resizeIcon(ImageIcon icon, int width, int height) {
- return new ImageIcon( icon.getImage().getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH));
+ return new ImageIcon(icon.getImage().getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH));
}
}
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/LogTextAppender.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/LogTextAppender.java
index fcb428d8..71e6bf63 100644
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/LogTextAppender.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/LogTextAppender.java
@@ -1,20 +1,17 @@
package org.lodder.subtools.multisubdownloader.gui.extra;
+import javax.swing.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
-import javax.swing.JTextArea;
-import javax.swing.SwingUtilities;
-
-import org.slf4j.LoggerFactory;
-
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.core.encoder.EchoEncoder;
import ch.qos.logback.core.encoder.Encoder;
+import org.slf4j.LoggerFactory;
public class LogTextAppender extends AppenderBase {
private final Encoder encoder = new EchoEncoder<>();
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/MemoryFolderChooser.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/MemoryFolderChooser.java
index bda17fb2..77fba6e4 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/MemoryFolderChooser.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/MemoryFolderChooser.java
@@ -7,13 +7,14 @@
import java.util.Objects;
import java.util.Optional;
+import manifold.ext.props.rt.api.var;
import org.apache.commons.lang3.StringUtils;
public class MemoryFolderChooser {
- private final JFileChooser chooser;
private static MemoryFolderChooser instance;
- private File memory;
+ private final JFileChooser chooser;
+ @var Path memory;
private MemoryFolderChooser() {
chooser = new JFileChooser();
@@ -35,14 +36,14 @@ public Optional selectDirectory(Component c, String title, Path path) {
public Optional selectDirectory(Component c, String title, File file) {
chooser.setDialogTitle(title);
if (file == null || !StringUtils.isBlank(file.getAbsolutePath())) {
- chooser.setCurrentDirectory(Objects.requireNonNullElseGet(memory, () -> new File(".")));
+ chooser.setCurrentDirectory(Objects.requireNonNullElseGet(memory.toFile(), () -> new File(".")));
} else {
chooser.setCurrentDirectory(file);
}
int result = chooser.showOpenDialog(c);
if (result == JFileChooser.APPROVE_OPTION) {
- memory = chooser.getSelectedFile();
+ memory = chooser.getSelectedFile().toPath();
return Optional.of(chooser.getSelectedFile().toPath());
}
return Optional.empty();
@@ -51,12 +52,4 @@ public Optional selectDirectory(Component c, String title, File file) {
public Optional selectDirectory(Component c, String title) {
return selectDirectory(c, title, memory);
}
-
- public void setMemory(Path memory) {
- this.memory = memory.toFile();
- }
-
- public Path getMemory() {
- return memory.toPath();
- }
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java
index dc7db710..52ae5c4d 100644
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PanelCheckBox.java
@@ -1,43 +1,32 @@
package org.lodder.subtools.multisubdownloader.gui.extra;
-import java.io.Serial;
-
-import javax.swing.JCheckBox;
-import javax.swing.JComponent;
-import javax.swing.JPanel;
-import javax.swing.JSeparator;
-import javax.swing.SwingConstants;
-
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.LayoutManager;
+import javax.swing.*;
+import java.awt.*;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
+import java.io.Serial;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.experimental.Accessors;
-import lombok.experimental.ExtensionMethod;
+import manifold.ext.props.rt.api.val;
import net.miginfocom.swing.MigLayout;
+import org.jspecify.annotations.Nullable;
-@ExtensionMethod({ JComponentExtension.class, JCheckBoxExtension.class })
public class PanelCheckBox extends JPanel {
@Serial
private static final long serialVersionUID = 1L;
private final JCheckBox checkbox;
- @Getter
- private final JPanel panel;
+ @val JPanel panel;
+
+ public PanelCheckBox(JCheckBox checkbox,
+ boolean panelOnNewLine,
+ LayoutManager panelLayout=new MigLayout("insets 0, novisualpadding, fillx"),
+ boolean addVerticalSeparator=false,
+ int leftGap=20) {
- private PanelCheckBox(JCheckBox checkbox, boolean panelOnNewLine, LayoutManager panelLayout, boolean addVerticalSeparator, int leftGap) {
super(new MigLayout("insets 0, novisualpadding, fillx"));
this.checkbox = checkbox;
this.panel = new JPanel(panelLayout) {
- private static final long serialVersionUID = 1L;
+ @Serial private static final long serialVersionUID = 1L;
@Override
protected void addImpl(Component comp, Object constraints, int index) {
@@ -52,7 +41,7 @@ protected void addImpl(Component comp, Object constraints, int index) {
super.addImpl(checkbox, panelOnNewLine ? "span" : "", -1);
super.addImpl(panel, "span, growx, " + (addVerticalSeparator ? "" : "gapx " + leftGap), -1);
checkbox.addCheckedChangeListener(selected -> setEnabledChildren(panel, selected));
- JComponentExtension.setRecursive(this, this::addContainerListener);
+ this.setRecursive(this::addContainerListener);
setEnabledChildren(panel, isSelected());
}
@@ -81,78 +70,6 @@ public void componentAdded(ContainerEvent e) {
}
}
- public static BuilderPanelNewLineIntf checkbox(JCheckBox checkbox) {
- return new Builder(checkbox);
- }
-
- public interface BuilderPanelNewLineIntf {
- BuilderSeparatorIntf panelOnNewLine();
-
- BuilderOtherIntf panelOnSameLine();
- }
-
- public interface BuilderSeparatorIntf extends BuilderOtherIntf {
- BuilderOtherIntf addVerticalSeparator();
- }
-
- public interface BuilderOtherIntf {
- BuilderOtherIntf leftGap(int leftGap);
-
- BuilderOtherIntf panelLayout(LayoutManager panelLayout);
-
- JPanel addTo(JComponent component);
-
- JPanel addTo(JComponent component, Object constraints);
-
- PanelCheckBox build();
- }
-
- @RequiredArgsConstructor
- @Setter
- @Accessors(chain = true, fluent = true)
- public static class Builder implements
- BuilderPanelNewLineIntf,
- BuilderSeparatorIntf,
- BuilderOtherIntf {
- private final JCheckBox checkbox;
- private boolean panelOnNewLine;
- private LayoutManager panelLayout = new MigLayout("insets 0, novisualpadding, fillx");
- private boolean addVerticalSeparator;
- private int leftGap = 20;
-
- @Override
- public Builder panelOnNewLine() {
- return panelOnNewLine(true);
- }
-
- @Override
- public Builder panelOnSameLine() {
- return panelOnNewLine(false);
- }
-
- @Override
- public Builder addVerticalSeparator() {
- return addVerticalSeparator(true);
- }
-
- @Override
- public JPanel addTo(JComponent component) {
- return addTo(component, "");
- }
-
- @Override
- public JPanel addTo(JComponent component, Object constraints) {
- PanelCheckBox panelCheckBox = build();
- component.add(panelCheckBox, constraints);
- return panelCheckBox.getPanel();
- }
-
- @Override
- public PanelCheckBox build() {
- return new PanelCheckBox(checkbox, panelOnNewLine, panelLayout, addVerticalSeparator, leftGap);
- }
- }
-
@Override
protected void addImpl(Component comp, Object constraints, int index) {
panel.add(comp, constraints, index);
@@ -178,4 +95,9 @@ public void setEnabled(boolean enabled) {
public boolean isSelected() {
return checkbox.isSelected();
}
+
+ public JPanel addToPanel(Container parent, @Nullable Object constraints=null) {
+ parent.addComponent(this, constraints);
+ return panel;
+ }
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java
index 10bcfa4d..e27317f4 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PartialDisableComboBox.java
@@ -1,7 +1,7 @@
package org.lodder.subtools.multisubdownloader.gui.extra;
import javax.swing.*;
-import javax.swing.plaf.basic.*;
+import javax.swing.plaf.basic.BasicComboBoxRenderer;
import java.awt.*;
import java.io.Serial;
import java.util.ArrayList;
@@ -10,7 +10,6 @@
import java.util.stream.IntStream;
/**
- *
* @author author
*/
public class PartialDisableComboBox extends JComboBox {
@@ -27,7 +26,8 @@ public PartialDisableComboBox(T[] items) {
private static final long serialVersionUID = -2774241371293899669L;
@Override
- public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
+ boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
boolean disabled = index >= 0 && index < itemsState.size() && !itemsState.get(index);
c.setEnabled(!disabled);
@@ -37,6 +37,7 @@ public Component getListCellRendererComponent(JList list, Object value, int inde
});
}
+ @SafeVarargs
public static PartialDisableComboBox of(T... items) {
return new PartialDisableComboBox<>(items);
}
@@ -102,4 +103,9 @@ private int requireValidIndex(int index) {
}
return index;
}
+
+ @Override
+ public T getSelectedItem() {
+ return (T) super.getSelectedItem();
+ }
}
\ No newline at end of file
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PopupListener.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PopupListener.java
index 2e3174e6..4f96a4e1 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PopupListener.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/PopupListener.java
@@ -24,8 +24,8 @@ public void mouseReleased(MouseEvent e) {
private synchronized void showPopup(MouseEvent e) {
if (e.isPopupTrigger()
- && e.getComponent() instanceof CustomTable customTable
- && customTable.getModel().getRowCount() > 0) {
+ && e.getComponent() instanceof CustomTable customTable
+ && customTable.getModel().getRowCount() > 0) {
popupMenu.show(e.getComponent(), e.getX(), e.getY());
}
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java
index 6c981d25..083413ff 100644
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/TitlePanel.java
@@ -1,161 +1,38 @@
package org.lodder.subtools.multisubdownloader.gui.extra;
+import javax.swing.*;
+import java.awt.*;
import java.io.Serial;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JSeparator;
-
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcheckbox.JCheckBoxExtension;
-import org.lodder.subtools.multisubdownloader.gui.jcomponent.jcomponent.JComponentExtension;
-
-import java.awt.Container;
-import java.awt.LayoutManager;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import lombok.experimental.Accessors;
-import lombok.experimental.ExtensionMethod;
+import manifold.ext.props.rt.api.val;
import net.miginfocom.swing.MigLayout;
+import org.jspecify.annotations.Nullable;
-@ExtensionMethod({ JComponentExtension.class, JCheckBoxExtension.class })
public class TitlePanel extends JPanel {
@Serial
private static final long serialVersionUID = 1L;
- @Getter
- private final JPanel panel;
+ @val JPanel panel;
- private TitlePanel(String title, LayoutManager panelLayout, int marginTop, int marginLeft, int marginBottom, int marginRight) {
- super(new MigLayout("fillx, nogrid, insets %s %s %s %s".formatted(getPadding(marginTop),
- getPadding(marginLeft), getPadding(marginBottom), getPadding(marginRight))));
+ public TitlePanel(String title,
+ boolean useGrid=false,
+ boolean fillContents=true,
+ BoxModelProperties margin=new BoxModelProperties(),
+ BoxModelProperties padding=new BoxModelProperties(),
+ LayoutManager panelLayout=null,
+ String panelColumnConstraints="") {
+
+ super(new MigLayout("fillx, nogrid, " + margin.getInsets()));
super.add(new JLabel(title));
super.add(new JSeparator(), "growx, gapy 6, wrap");
- super.add(this.panel = new JPanel(panelLayout), "growx, span");
- }
-
- private static String getPadding(int padding) {
- return padding == -1 ? "n" : String.valueOf(padding);
- }
-
- public static BuilderOtherIntf title(String title) {
- return new Builder(title);
- }
-
- public interface BuilderOtherIntf {
- BuilderOtherIntf useGrid();
-
- BuilderOtherIntf fillContents(boolean fillContents);
-
- BuilderOtherIntf margin(int margin);
-
- BuilderOtherIntf margin(int top, int left, int bottom, int right);
-
- BuilderOtherIntf marginTop(int top);
-
- BuilderOtherIntf marginLeft(int left);
-
- BuilderOtherIntf marginBottom(int bottom);
-
- BuilderOtherIntf marginRight(int right);
-
- BuilderOtherIntf marginSides(int marginSide);
-
- BuilderOtherIntf panelLayout(LayoutManager panelLayout);
- BuilderOtherIntf panelColumnConstraints(String panelColumnConstraints);
-
- BuilderOtherIntf padding(int padding);
-
- BuilderOtherIntf padding(int top, int left, int bottom, int right);
-
- BuilderOtherIntf paddingTop(int top);
-
- BuilderOtherIntf paddingLeft(int left);
-
- BuilderOtherIntf paddingBottom(int bottom);
-
- BuilderOtherIntf paddingRight(int right);
-
- BuilderOtherIntf paddingSides(int paddingSide);
-
- JPanel addTo(Container component);
-
- JPanel addTo(Container component, Object constraints);
+ LayoutManager panelLayoutNew = panelLayout != null ? panelLayout : new MigLayout(
+ (fillContents ? "fill," : "") + (useGrid ? "" : "nogrid,") + padding.getInsets(),
+ panelColumnConstraints);
+ super.add(this.panel = new JPanel(panelLayoutNew), "growx, span");
}
- @RequiredArgsConstructor
- @Setter
- @Accessors(chain = true, fluent = true)
- public static class Builder implements
- BuilderOtherIntf {
- private final String title;
- private boolean useGrid;
- private boolean fillContents = true;
- private int marginTop = -1;
- private int marginLeft = -1;
- private int marginBottom = -1;
- private int marginRight = -1;
- private int paddingTop = -1;
- private int paddingLeft = -1;
- private int paddingBottom = -1;
- private int paddingRight = -1;
- private LayoutManager panelLayout;
- private String panelColumnConstraints = "";
-
- @Override
- public Builder useGrid() {
- this.useGrid = true;
- return this;
- }
-
- @Override
- public Builder margin(int margin) {
- return margin(margin, margin, margin, margin);
- }
-
- @Override
- public Builder margin(int top, int left, int bottom, int right) {
- return marginTop(top).marginLeft(left).marginBottom(bottom).marginRight(right);
- }
-
- @Override
- public Builder marginSides(int marginSide) {
- return marginLeft(marginSide).marginRight(marginSide);
- }
-
- @Override
- public Builder padding(int padding) {
- return padding(padding, padding, padding, padding);
- }
-
- @Override
- public Builder padding(int top, int left, int bottom, int right) {
- return paddingTop(top).paddingLeft(left).paddingBottom(bottom).paddingRight(right);
- }
-
- @Override
- public Builder paddingSides(int paddingSide) {
- return paddingLeft(paddingSide).paddingRight(paddingSide);
- }
-
- @Override
- public JPanel addTo(Container component) {
- return addTo(component, "");
- }
-
- @Override
- public JPanel addTo(Container component, Object constraints) {
- if (panelLayout == null) {
- panelLayout = new MigLayout(
- (fillContents ? "fill," : "") + (useGrid ? "" : "nogrid,") + "insets %s %s %s %s".formatted(getPadding(paddingTop),
- getPadding(paddingLeft), getPadding(paddingBottom), getPadding(paddingRight)),
- panelColumnConstraints);
- }
- TitlePanel titlePanel = new TitlePanel(title, panelLayout, marginTop, marginLeft, marginBottom, marginRight);
- component.add(titlePanel, constraints);
- return titlePanel.getPanel();
-
- }
+ public JPanel addToPanel(Container parent, @Nullable Object constraints=null) {
+ parent.addComponent(this, constraints);
+ return panel;
}
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusLabel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusLabel.java
index 03ab0cca..cee0d2b1 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusLabel.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusLabel.java
@@ -1,6 +1,6 @@
package org.lodder.subtools.multisubdownloader.gui.extra.progress;
-import javax.swing.JLabel;
+import javax.swing.*;
import java.io.Serial;
public class StatusLabel extends JLabel implements Messenger {
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusMessenger.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusMessenger.java
index 769aa2f6..41f334d4 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusMessenger.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/progress/StatusMessenger.java
@@ -3,11 +3,17 @@
import java.util.LinkedList;
import java.util.List;
-public enum StatusMessenger implements Messenger {
- instance;
+import manifold.ext.props.rt.api.val;
+
+public class StatusMessenger implements Messenger {
+ @val static StatusMessenger instance = new StatusMessenger();
private final List statusMessengers = new LinkedList<>();
+ private StatusMessenger() {
+ // private constructor to prevent instantiation
+ }
+
public void addListener(Messenger sm) {
synchronized (statusMessengers) {
statusMessengers.add(sm);
@@ -23,7 +29,7 @@ public void removeListener(Messenger sm) {
@Override
public void message(String message) {
synchronized (statusMessengers) {
- statusMessengers.forEach(sm -> sm.message(message));
+ statusMessengers.forEach(sm -> sm.message(message));
}
}
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomColumnName.java
index 160cce7b..08e657df 100644
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomColumnName.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomColumnName.java
@@ -1,10 +1,10 @@
package org.lodder.subtools.multisubdownloader.gui.extra.table;
-public interface CustomColumnName {
-
- String getColumnName();
+import manifold.ext.props.rt.api.val;
- boolean isEditable();
+public interface CustomColumnName {
- Class> getC();
+ @val String columnName;
+ @val boolean editable;
+ @val Class> clazz;
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java
index 63ab5120..e22f5519 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/CustomTable.java
@@ -1,30 +1,31 @@
package org.lodder.subtools.multisubdownloader.gui.extra.table;
+import javax.swing.table.*;
+import java.awt.event.MouseEvent;
import java.io.Serial;
-import java.util.HashMap;
+import java.util.EnumMap;
import java.util.Map;
import java.util.stream.IntStream;
-import java.awt.event.MouseEvent;
-
public class CustomTable extends ZebraJTable {
@Serial
private static final long serialVersionUID = -3889524906608098585L;
- private final Map columnSettings = new HashMap<>();
private static final int MAX_WIDTH = 2147483647;
private static final int MIN_WIDTH = 15;
private static final int PREFERRED_WIDTH = 75;
+ private final Map columnSettings = new EnumMap<>(SearchColumnName.class);
+
public int getColumnIdByName(CustomColumnName customColumnName) {
return IntStream.range(0, this.getColumnCount())
- .filter(i -> this.getColumnName(i).equals(customColumnName.getColumnName())).findFirst()
- .orElse(-1);
+ .filter(i -> this.getColumnName(i).equals(customColumnName.columnName)).findFirst()
+ .orElse(-1);
}
public void setColumnVisibility(SearchColumnName searchColumnName, boolean visible) {
if (visible) {
- unhideColumn(searchColumnName);
+ showColumn(searchColumnName);
} else {
hideColumn(searchColumnName);
}
@@ -33,28 +34,27 @@ public void setColumnVisibility(SearchColumnName searchColumnName, boolean visib
public void hideColumn(SearchColumnName searchColumnName) {
int columnId = getColumnIdByName(searchColumnName);
if (columnId > -1) {
- columnSettings.put(searchColumnName, new int[] {
- getColumnModel().getColumn(columnId).getMaxWidth(),
- getColumnModel().getColumn(columnId).getMinWidth(),
- getColumnModel().getColumn(columnId).getPreferredWidth() });
- getColumnModel().getColumn(columnId).setMaxWidth(0);
- getColumnModel().getColumn(columnId).setMinWidth(0);
- getColumnModel().getColumn(columnId).setPreferredWidth(0);
+ TableColumn column = columnModel.getColumn(columnId);
+ columnSettings.put(searchColumnName, new int[]{ column.maxWidth, column.minWidth, column.preferredWidth });
+ column.maxWidth = 0;
+ column.minWidth = 0;
+ column.preferredWidth = 0;
}
}
- public void unhideColumn(SearchColumnName searchColumnName) {
+ public void showColumn(SearchColumnName searchColumnName) {
int columnId = getColumnIdByName(searchColumnName);
if (columnId > -1) {
+ TableColumn column = getColumnModel().getColumn(columnId);
if (columnSettings.containsKey(searchColumnName)) {
- getColumnModel().getColumn(columnId).setMaxWidth(columnSettings.get(searchColumnName)[0]);
- getColumnModel().getColumn(columnId).setMinWidth(columnSettings.get(searchColumnName)[1]);
- getColumnModel().getColumn(columnId).setPreferredWidth(
- columnSettings.get(searchColumnName)[2]);
+ int[] columnSetting = columnSettings.get(searchColumnName);
+ column.maxWidth = columnSetting[0];
+ column.minWidth = columnSetting[1];
+ column.preferredWidth = columnSetting[2];
} else {
- getColumnModel().getColumn(columnId).setMaxWidth(MAX_WIDTH);
- getColumnModel().getColumn(columnId).setMinWidth(MIN_WIDTH);
- getColumnModel().getColumn(columnId).setPreferredWidth(PREFERRED_WIDTH);
+ column.maxWidth = MAX_WIDTH;
+ column.minWidth = MIN_WIDTH;
+ column.preferredWidth = PREFERRED_WIDTH;
}
}
}
@@ -62,8 +62,8 @@ public void unhideColumn(SearchColumnName searchColumnName) {
public boolean isHideColumn(SearchColumnName searchColumnName) {
int columnId = getColumnIdByName(searchColumnName);
if (columnId > -1) {
- return getColumnModel().getColumn(columnId).getMinWidth() == 0
- && getColumnModel().getColumn(columnId).getPreferredWidth() == 0;
+ TableColumn column = getColumnModel().getColumn(columnId);
+ return column.minWidth == 0 && column.preferredWidth == 0;
}
return true;
}
@@ -79,5 +79,4 @@ public String getToolTipText(MouseEvent e) {
}
return null;
}
-
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java
index 576603ba..3139f1b7 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SearchColumnName.java
@@ -1,17 +1,14 @@
package org.lodder.subtools.multisubdownloader.gui.extra.table;
-import java.util.Arrays;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
+import manifold.ext.props.rt.api.override;
+import manifold.ext.props.rt.api.val;
import org.lodder.subtools.multisubdownloader.Messages;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
public enum SearchColumnName implements CustomColumnName {
RELEASE("App.Release", String.class, false),
@@ -27,17 +24,17 @@ public enum SearchColumnName implements CustomColumnName {
SCORE("SearchColumnName.Score", Integer.class, false);
private static final Map MAP =
- Arrays.stream(SearchColumnName.values()).collect(Collectors.toMap(SearchColumnName::getColumnName, Function.identity()));
+ SearchColumnName.values().stream()
+ .collect(Collectors.toMap(SearchColumnName::getColumnName, Function.identity()));
- private final String columnNameCode;
- @Getter
- private final Class> c;
- @Getter
- private final boolean editable;
+ @val @override String columnName;
+ @val @override Class> clazz;
+ @val @override boolean editable;
- @Override
- public String getColumnName() {
- return Messages.getString(columnNameCode);
+ SearchColumnName(String columnNameCode, Class> clazz, boolean editable) {
+ this.columnName = Messages.getText(columnNameCode);
+ this.clazz = clazz;
+ this.editable = editable;
}
public static Optional getForColumnName(String columnName) {
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java
index d50b005f..00ba4652 100644
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableColumnName.java
@@ -1,40 +1,41 @@
package org.lodder.subtools.multisubdownloader.gui.extra.table;
-import java.util.Arrays;
import java.util.function.Function;
+import manifold.ext.props.rt.api.override;
+import manifold.ext.props.rt.api.val;
import org.lodder.subtools.multisubdownloader.Messages;
import org.lodder.subtools.sublibrary.model.Subtitle;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
public enum SubtitleTableColumnName implements CustomColumnName {
- SELECT("App.Select", Boolean.class, true, subtitle -> false),
+ SELECT("App.Select", Boolean.class, true, _ -> false),
SCORE("SubtitleTableColumnName.Score", Integer.class, false, Subtitle::getScore),
FILENAME("SubtitleTableColumnName.Filename", String.class, false, Subtitle::getFileName),
SOURCE("SubtitleTableColumnName.Source", String.class, false, Subtitle::getSubtitleSource),
UPLOADER("SubtitleTableColumnName.Uploader", String.class, false, Subtitle::getUploader),
- HEARINGIMPAIRED("SubtitleTableColumnName.hearingimpaired", Boolean.class, false, Subtitle::isHearingImpaired),
+ HEARINGIMPAIRED("SubtitleTableColumnName.hearingImpaired", Boolean.class, false, Subtitle::isHearingImpaired),
QUALITY("SubtitleTableColumnName.Quality", String.class, false, Subtitle::getQuality),
RELEASEGROUP("SubtitleTableColumnName.Releasegroup", String.class, false, Subtitle::getReleaseGroup);
- private final String columnNameCode;
- @Getter
- private final Class> c;
- @Getter
- private final boolean editable;
- @Getter
- private final Function valueFunction;
-
- @Override
- public String getColumnName() {
- return Messages.getString(columnNameCode);
+
+ @val @override String columnName;
+ @val @override Class> clazz;
+ @val @override boolean editable;
+ @val Function valueFunction;
+
+ SubtitleTableColumnName(String columnNameCode, Class> clazz, boolean editable,
+ Function valueFunction) {
+ this.columnName = Messages.getText(columnNameCode);
+ this.clazz = clazz;
+ this.editable = editable;
+ this.valueFunction = valueFunction;
}
public static SubtitleTableColumnName forColumnName(String columnName) {
- return Arrays.stream(SubtitleTableColumnName.values()).filter(stcn -> stcn.getColumnName().equals(columnName)).findAny().orElseThrow();
+ return SubtitleTableColumnName.values().stream()
+ .filter(stcn -> stcn.columnName.equals(columnName))
+ .findAny()
+ .orElseThrow();
}
public Object getValue(Subtitle subtitle) {
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java
index 8a591737..19f7487f 100644
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/SubtitleTableModel.java
@@ -2,48 +2,47 @@
import static org.lodder.subtools.multisubdownloader.gui.extra.table.SubtitleTableColumnName.*;
+import javax.swing.table.*;
import java.io.Serial;
-import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;
-import javax.swing.table.DefaultTableModel;
-
import org.lodder.subtools.sublibrary.model.Subtitle;
-import lombok.experimental.ExtensionMethod;
-
-@ExtensionMethod({ Arrays.class })
public class SubtitleTableModel extends DefaultTableModel {
@Serial
private static final long serialVersionUID = 4205143311042280620L;
- private final static SubtitleTableColumnName[] COLUMNS =
- Stream.of(SELECT, SCORE, FILENAME, RELEASEGROUP, QUALITY, SOURCE, UPLOADER, HEARINGIMPAIRED).toArray(SubtitleTableColumnName[]::new);
+ private static final SubtitleTableColumnName[] COLUMNS =
+ Stream.of(SELECT, SCORE, FILENAME, RELEASEGROUP, QUALITY, SOURCE, UPLOADER, HEARINGIMPAIRED)
+ .toArray(SubtitleTableColumnName[]::new);
public SubtitleTableModel(Object[][] data, String[] columnNames) {
super(data, columnNames);
}
- public static SubtitleTableModel getDefaultSubtitleTableModel() {
- String[] columnNames = Arrays.stream(COLUMNS).map(SubtitleTableColumnName::getColumnName).toArray(String[]::new);
- return new SubtitleTableModel(new Object[][] {}, columnNames);
+ public static SubtitleTableModel createDefaultSubtitleTableModel() {
+ String[] columnNames = COLUMNS.stream().map(SubtitleTableColumnName::getColumnName).toArray(String[]::new);
+ return new SubtitleTableModel(new Object[][]{}, columnNames);
}
public void addRow(Subtitle subtitle) {
- Object[] row = IntStream.range(0, getColumnCount()).mapToObj(this::getColumnName).map(SubtitleTableColumnName::forColumnName)
- .map(stcn -> stcn.getValue(subtitle)).toArray(Object[]::new);
+ Object[] row = IntStream.range(0, getColumnCount())
+ .mapToObj(this::getColumnName)
+ .map(SubtitleTableColumnName::forColumnName)
+ .map(stcn -> stcn.getValue(subtitle))
+ .toArray(Object[]::new);
this.addRow(row);
}
@Override
public Class> getColumnClass(int columnIndex) {
- return COLUMNS[columnIndex].getC();
+ return COLUMNS[columnIndex].clazz;
}
@Override
public boolean isCellEditable(int row, int column) {
- return COLUMNS[column].isEditable();
+ return COLUMNS[column].editable;
}
}
diff --git a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java
index bed205f3..06b5f89b 100755
--- a/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java
+++ b/MultiSubDownloader/src/main/java/org/lodder/subtools/multisubdownloader/gui/extra/table/VideoTableModel.java
@@ -1,6 +1,8 @@
package org.lodder.subtools.multisubdownloader.gui.extra.table;
-import javax.swing.table.*;
+import static org.lodder.subtools.multisubdownloader.gui.extra.table.SearchColumnName.*;
+
+import javax.swing.table.DefaultTableModel;
import java.io.Serial;
import java.util.ArrayList;
import java.util.EnumMap;
@@ -13,8 +15,8 @@
import java.util.stream.Collectors;
import java.util.stream.IntStream;
-import lombok.Getter;
-import lombok.Setter;
+import manifold.ext.props.rt.api.get;
+import manifold.ext.props.rt.api.var;
import org.lodder.subtools.multisubdownloader.UserInteractionHandler;
import org.lodder.subtools.sublibrary.model.MovieRelease;
import org.lodder.subtools.sublibrary.model.Release;
@@ -23,31 +25,29 @@
public class VideoTableModel extends DefaultTableModel {
- @Serial
- private static final long serialVersionUID = 4205143311042280620L;
+ @Serial private static final long serialVersionUID = 4205143311042280620L;
private static final List SHOW_COLUMNS =
- List.of(SearchColumnName.TYPE, SearchColumnName.RELEASE, SearchColumnName.FILENAME, SearchColumnName.TITLE, SearchColumnName.SEASON,
- SearchColumnName.EPISODE, SearchColumnName.FOUND, SearchColumnName.SELECT, SearchColumnName.OBJECT);
+ List.of(TYPE, RELEASE, FILENAME, TITLE, SEASON, EPISODE, FOUND, SELECT, OBJECT);
- private static final List SUBTITLE_COLUMNS =
- List.of(SearchColumnName.FILENAME, SearchColumnName.SOURCE, SearchColumnName.SCORE, SearchColumnName.SELECT, SearchColumnName.OBJECT);
+ private static final List SUBTITLE_COLUMNS = List.of(FILENAME, SOURCE, SCORE, SELECT, OBJECT);
private static final Map SHOW_COLUMNS_INDEX = IntStream.range(0, SHOW_COLUMNS.size())
- .collect(() -> new EnumMap<>(SearchColumnName.class), (map, i) -> map.put(SHOW_COLUMNS.get(i), i), (l, r) -> {
- throw new IllegalArgumentException("Duplicate keys [%s] and [%s]".formatted(l, r));
- });
+ .collect(() -> new EnumMap<>(SearchColumnName.class), (map, i) -> map.put(SHOW_COLUMNS.get(i), i),
+ (l, r) -> {
+ throw new IllegalArgumentException("Duplicate keys [$l] and [$r]");
+ });
private final Class>[] columnTypes;
private final Boolean[] columnEditables;
private final Map rowMap = new LinkedHashMap<>();
+
private boolean showOnlyFound = false;
- @Setter
- private UserInteractionHandler userInteractionHandler;
+ @var UserInteractionHandler userInteractionHandler;
private VideoTableModel(List searchColumnNames) {
- super(new Object[][] {}, searchColumnNames.stream().map(SearchColumnName::getColumnName).toArray(String[]::new));
- this.columnTypes = searchColumnNames.stream().map(SearchColumnName::getC).toArray(Class>[]::new);
+ super(new Object[][]{}, searchColumnNames.stream().map(SearchColumnName::getColumnName).toArray(String[]::new));
+ this.columnTypes = searchColumnNames.stream().map(SearchColumnName::getClazz).toArray(Class>[]::new);
this.columnEditables = searchColumnNames.stream().map(SearchColumnName::isEditable).toArray(Boolean[]::new);
}
@@ -77,7 +77,7 @@ public void addRow(Release release) {
if (!showOnlyFound || release.getMatchingSubCount() != 0) {
Row row = createRow(release);
rowMap.put(release, row);
- this.addRow(row.getRowObject());
+ this.addRow(row.rowObject);
}
}
}
@@ -89,38 +89,32 @@ private Row createRow(Release release) {
private static class Row {
private final Release release;
private final UserInteractionHandler userInteractionHandler;
- @Getter
- public final Vector