* fixed annoying layout bug
* remember search engine in episodelist and subtitle panel
This commit is contained in:
parent
384e75576a
commit
daa665c00e
|
@ -24,14 +24,19 @@ import javax.swing.JTabbedPane;
|
||||||
import javax.swing.KeyStroke;
|
import javax.swing.KeyStroke;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.SwingWorker;
|
import javax.swing.SwingWorker;
|
||||||
|
import javax.swing.event.ChangeEvent;
|
||||||
|
import javax.swing.event.ChangeListener;
|
||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import net.sourceforge.filebot.ResourceManager;
|
import net.sourceforge.filebot.ResourceManager;
|
||||||
|
import net.sourceforge.filebot.Settings;
|
||||||
import net.sourceforge.filebot.similarity.SeriesNameMatcher;
|
import net.sourceforge.filebot.similarity.SeriesNameMatcher;
|
||||||
import net.sourceforge.filebot.web.SearchResult;
|
import net.sourceforge.filebot.web.SearchResult;
|
||||||
import net.sourceforge.tuned.ExceptionUtilities;
|
import net.sourceforge.tuned.ExceptionUtilities;
|
||||||
|
import net.sourceforge.tuned.ListChangeSynchronizer;
|
||||||
import net.sourceforge.tuned.ui.LabelProvider;
|
import net.sourceforge.tuned.ui.LabelProvider;
|
||||||
import net.sourceforge.tuned.ui.TunedUtilities;
|
import net.sourceforge.tuned.ui.TunedUtilities;
|
||||||
|
import ca.odell.glazedlists.BasicEventList;
|
||||||
import ca.odell.glazedlists.EventList;
|
import ca.odell.glazedlists.EventList;
|
||||||
import ca.odell.glazedlists.matchers.TextMatcherEditor;
|
import ca.odell.glazedlists.matchers.TextMatcherEditor;
|
||||||
import ca.odell.glazedlists.swing.AutoCompleteSupport;
|
import ca.odell.glazedlists.swing.AutoCompleteSupport;
|
||||||
|
@ -73,6 +78,22 @@ public abstract class AbstractSearchPanel<S, E> extends JComponent {
|
||||||
searchTextField.getSelectButton().setModel(createSearchEngines());
|
searchTextField.getSelectButton().setModel(createSearchEngines());
|
||||||
searchTextField.getSelectButton().setLabelProvider(createSearchEngineLabelProvider());
|
searchTextField.getSelectButton().setLabelProvider(createSearchEngineLabelProvider());
|
||||||
|
|
||||||
|
try {
|
||||||
|
// restore selected subtitle client
|
||||||
|
searchTextField.getSelectButton().setSelectedIndex(Integer.parseInt(getSettings().get("search")));
|
||||||
|
} catch (Exception e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
// save selected client on change
|
||||||
|
searchTextField.getSelectButton().getSelectionModel().addChangeListener(new ChangeListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stateChanged(ChangeEvent e) {
|
||||||
|
getSettings().put("search", Integer.toString(searchTextField.getSelectButton().getSelectedIndex()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
AutoCompleteSupport.install(searchTextField.getEditor(), searchHistory).setFilterMode(TextMatcherEditor.CONTAINS);
|
AutoCompleteSupport.install(searchTextField.getEditor(), searchHistory).setFilterMode(TextMatcherEditor.CONTAINS);
|
||||||
|
|
||||||
TunedUtilities.putActionForKeystroke(this, KeyStroke.getKeyStroke("ENTER"), searchAction);
|
TunedUtilities.putActionForKeystroke(this, KeyStroke.getKeyStroke("ENTER"), searchAction);
|
||||||
|
@ -85,7 +106,7 @@ public abstract class AbstractSearchPanel<S, E> extends JComponent {
|
||||||
protected abstract LabelProvider<S> createSearchEngineLabelProvider();
|
protected abstract LabelProvider<S> createSearchEngineLabelProvider();
|
||||||
|
|
||||||
|
|
||||||
protected abstract EventList<String> createSearchHistory();
|
protected abstract Settings getSettings();
|
||||||
|
|
||||||
|
|
||||||
protected abstract RequestProcessor<?, E> createRequestProcessor();
|
protected abstract RequestProcessor<?, E> createRequestProcessor();
|
||||||
|
@ -106,6 +127,24 @@ public abstract class AbstractSearchPanel<S, E> extends JComponent {
|
||||||
new SearchTask(requestProcessor).execute();
|
new SearchTask(requestProcessor).execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected EventList<String> createSearchHistory() {
|
||||||
|
// create in-memory history
|
||||||
|
BasicEventList<String> history = new BasicEventList<String>();
|
||||||
|
|
||||||
|
// get the preferences node that contains the history entries
|
||||||
|
// and get a StringList that read and writes directly from and to the preferences
|
||||||
|
List<String> persistentHistory = getSettings().node("history").asList();
|
||||||
|
|
||||||
|
// add history from the preferences to the current in-memory history (for completion)
|
||||||
|
history.addAll(persistentHistory);
|
||||||
|
|
||||||
|
// perform all insert/add/remove operations on the in-memory history on the preferences node as well
|
||||||
|
ListChangeSynchronizer.syncEventListToList(history, persistentHistory);
|
||||||
|
|
||||||
|
return history;
|
||||||
|
}
|
||||||
|
|
||||||
private final AbstractAction searchAction = new AbstractAction("Find", ResourceManager.getIcon("action.find")) {
|
private final AbstractAction searchAction = new AbstractAction("Find", ResourceManager.getIcon("action.find")) {
|
||||||
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
|
|
@ -37,6 +37,7 @@ import net.sourceforge.filebot.ui.panel.episodelist.EpisodeListPanelBuilder;
|
||||||
import net.sourceforge.filebot.ui.panel.list.ListPanelBuilder;
|
import net.sourceforge.filebot.ui.panel.list.ListPanelBuilder;
|
||||||
import net.sourceforge.filebot.ui.panel.rename.RenamePanelBuilder;
|
import net.sourceforge.filebot.ui.panel.rename.RenamePanelBuilder;
|
||||||
import net.sourceforge.filebot.ui.panel.sfv.SfvPanelBuilder;
|
import net.sourceforge.filebot.ui.panel.sfv.SfvPanelBuilder;
|
||||||
|
import net.sourceforge.filebot.ui.panel.subtitle.SubtitlePanelBuilder;
|
||||||
import net.sourceforge.tuned.PreferencesMap.PreferencesEntry;
|
import net.sourceforge.tuned.PreferencesMap.PreferencesEntry;
|
||||||
import net.sourceforge.tuned.PreferencesMap.SimpleAdapter;
|
import net.sourceforge.tuned.PreferencesMap.SimpleAdapter;
|
||||||
import net.sourceforge.tuned.ui.ArrayListModel;
|
import net.sourceforge.tuned.ui.ArrayListModel;
|
||||||
|
@ -79,7 +80,7 @@ public class MainFrame extends JFrame {
|
||||||
JComponent c = (JComponent) getContentPane();
|
JComponent c = (JComponent) getContentPane();
|
||||||
c.setLayout(new MigLayout("insets 0, fill, hidemode 3", "95px[fill]", "fill"));
|
c.setLayout(new MigLayout("insets 0, fill, hidemode 3", "95px[fill]", "fill"));
|
||||||
|
|
||||||
c.add(selectionListScrollPane, "pos visual.x+6 visual.y+10 n visual.y2-12");
|
c.add(selectionListScrollPane, "pos 6px 10px n 100%-12px");
|
||||||
c.add(headerPanel, "growx, dock north");
|
c.add(headerPanel, "growx, dock north");
|
||||||
|
|
||||||
// show initial panel
|
// show initial panel
|
||||||
|
@ -94,15 +95,6 @@ public class MainFrame extends JFrame {
|
||||||
if (!e.getValueIsAdjusting()) {
|
if (!e.getValueIsAdjusting()) {
|
||||||
persistentSelectedPanel.setValue(selectionList.getSelectedIndex());
|
persistentSelectedPanel.setValue(selectionList.getSelectedIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
// this seems to fix a very annoying layout/render issue, I've got no clue why
|
|
||||||
SwingUtilities.invokeLater(new Runnable() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
getContentPane().validate();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -117,6 +109,7 @@ public class MainFrame extends JFrame {
|
||||||
builders.add(new RenamePanelBuilder());
|
builders.add(new RenamePanelBuilder());
|
||||||
builders.add(new AnalyzePanelBuilder());
|
builders.add(new AnalyzePanelBuilder());
|
||||||
builders.add(new EpisodeListPanelBuilder());
|
builders.add(new EpisodeListPanelBuilder());
|
||||||
|
builders.add(new SubtitlePanelBuilder());
|
||||||
builders.add(new SfvPanelBuilder());
|
builders.add(new SfvPanelBuilder());
|
||||||
|
|
||||||
return builders;
|
return builders;
|
||||||
|
@ -146,15 +139,10 @@ public class MainFrame extends JFrame {
|
||||||
panel.putClientProperty("panelBuilder", selectedBuilder);
|
panel.putClientProperty("panelBuilder", selectedBuilder);
|
||||||
|
|
||||||
contentPane.add(panel);
|
contentPane.add(panel);
|
||||||
} else if (panel.isVisible()) {
|
|
||||||
// no need to do anything
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
headerPanel.setTitle(selectedBuilder.getName());
|
headerPanel.setTitle(selectedBuilder.getName());
|
||||||
panel.setVisible(true);
|
panel.setVisible(true);
|
||||||
|
|
||||||
contentPane.validate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -34,13 +34,10 @@ import net.sourceforge.filebot.web.SearchResult;
|
||||||
import net.sourceforge.filebot.web.TVDotComClient;
|
import net.sourceforge.filebot.web.TVDotComClient;
|
||||||
import net.sourceforge.filebot.web.TVRageClient;
|
import net.sourceforge.filebot.web.TVRageClient;
|
||||||
import net.sourceforge.filebot.web.TheTVDBClient;
|
import net.sourceforge.filebot.web.TheTVDBClient;
|
||||||
import net.sourceforge.tuned.ListChangeSynchronizer;
|
|
||||||
import net.sourceforge.tuned.ui.LabelProvider;
|
import net.sourceforge.tuned.ui.LabelProvider;
|
||||||
import net.sourceforge.tuned.ui.SelectButton;
|
import net.sourceforge.tuned.ui.SelectButton;
|
||||||
import net.sourceforge.tuned.ui.SimpleLabelProvider;
|
import net.sourceforge.tuned.ui.SimpleLabelProvider;
|
||||||
import net.sourceforge.tuned.ui.TunedUtilities;
|
import net.sourceforge.tuned.ui.TunedUtilities;
|
||||||
import ca.odell.glazedlists.BasicEventList;
|
|
||||||
import ca.odell.glazedlists.EventList;
|
|
||||||
|
|
||||||
|
|
||||||
public class EpisodeListPanel extends AbstractSearchPanel<EpisodeListClient, Episode> {
|
public class EpisodeListPanel extends AbstractSearchPanel<EpisodeListClient, Episode> {
|
||||||
|
@ -90,21 +87,8 @@ public class EpisodeListPanel extends AbstractSearchPanel<EpisodeListClient, Epi
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected EventList<String> createSearchHistory() {
|
protected Settings getSettings() {
|
||||||
// create in-memory list
|
return Settings.userRoot().node("episodelist");
|
||||||
BasicEventList<String> searchHistory = new BasicEventList<String>();
|
|
||||||
|
|
||||||
// get the preferences node that contains the history entries
|
|
||||||
// and get a StringList that read and writes directly from and to the preferences
|
|
||||||
List<String> persistentSearchHistory = Settings.userRoot().node("episodelist/history").asList();
|
|
||||||
|
|
||||||
// add history from the preferences to the current in-memory history (for completion)
|
|
||||||
searchHistory.addAll(persistentSearchHistory);
|
|
||||||
|
|
||||||
// perform all insert/add/remove operations on the in-memory history on the preferences node as well
|
|
||||||
ListChangeSynchronizer.syncEventListToList(searchHistory, persistentSearchHistory);
|
|
||||||
|
|
||||||
return searchHistory;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -22,11 +22,8 @@ import net.sourceforge.filebot.web.SubsceneSubtitleClient;
|
||||||
import net.sourceforge.filebot.web.SubtitleClient;
|
import net.sourceforge.filebot.web.SubtitleClient;
|
||||||
import net.sourceforge.filebot.web.SubtitleDescriptor;
|
import net.sourceforge.filebot.web.SubtitleDescriptor;
|
||||||
import net.sourceforge.filebot.web.SubtitleSourceClient;
|
import net.sourceforge.filebot.web.SubtitleSourceClient;
|
||||||
import net.sourceforge.tuned.ListChangeSynchronizer;
|
|
||||||
import net.sourceforge.tuned.ui.LabelProvider;
|
import net.sourceforge.tuned.ui.LabelProvider;
|
||||||
import net.sourceforge.tuned.ui.SimpleLabelProvider;
|
import net.sourceforge.tuned.ui.SimpleLabelProvider;
|
||||||
import ca.odell.glazedlists.BasicEventList;
|
|
||||||
import ca.odell.glazedlists.EventList;
|
|
||||||
|
|
||||||
|
|
||||||
public class SubtitlePanel extends AbstractSearchPanel<SubtitleClient, SubtitlePackage> {
|
public class SubtitlePanel extends AbstractSearchPanel<SubtitleClient, SubtitlePackage> {
|
||||||
|
@ -56,21 +53,8 @@ public class SubtitlePanel extends AbstractSearchPanel<SubtitleClient, SubtitleP
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected EventList<String> createSearchHistory() {
|
protected Settings getSettings() {
|
||||||
// create in-memory history
|
return Settings.userRoot().node("subtitle");
|
||||||
BasicEventList<String> history = new BasicEventList<String>();
|
|
||||||
|
|
||||||
// get the preferences node that contains the history entries
|
|
||||||
// and get a StringList that read and writes directly from and to the preferences
|
|
||||||
List<String> persistentHistory = Settings.userRoot().node("subtitles/history").asList();
|
|
||||||
|
|
||||||
// add history from the preferences to the current in-memory history (for completion)
|
|
||||||
history.addAll(persistentHistory);
|
|
||||||
|
|
||||||
// perform all insert/add/remove operations on the in-memory history on the preferences node as well
|
|
||||||
ListChangeSynchronizer.syncEventListToList(history, persistentHistory);
|
|
||||||
|
|
||||||
return history;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -128,6 +128,11 @@ public class SelectButton<T> extends JButton {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public SingleSelectionModel getSelectionModel() {
|
||||||
|
return selectionModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void spinValue(int spin) {
|
public void spinValue(int spin) {
|
||||||
int size = model.size();
|
int size = model.size();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue