From a1b118d0f6dc324766d1a70d75bc3ae598fdf3ff Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Mon, 24 Mar 2008 15:41:10 +0000 Subject: [PATCH] * rename panel file list will now display file name and file type * some minor refactoring --- .../net/sourceforge/filebot/FileFormat.java | 49 +++++++---- .../filebot/ui/FileBotPanelSelectionList.java | 2 +- .../list/FileListTransferablePolicy.java | 8 +- .../panel/rename/RenameListCellRenderer.java | 83 +++++++++++++++++-- .../panel/rename/SelectionSynchronizer.java | 12 +-- .../ui/panel/rename/SimilarityPanel.java | 2 +- .../ui/panel/rename/ValidateNamesDialog.java | 2 +- .../ui/panel/rename/ViewPortSynchronizer.java | 19 ++--- .../panel/rename/entry/AbstractFileEntry.java | 10 ++- .../ui/panel/rename/entry/FileEntry.java | 2 +- .../ui/panel/rename/entry/TorrentEntry.java | 3 +- .../ui/panel/sfv/ChecksumTableModel.java | 2 +- .../filebot/ui/panel/sfv/SfvPanel.java | 4 +- .../filebot/ui/panel/sfv/SfvTable.java | 2 +- .../tuned/PausableThreadPoolExecutor.java | 64 -------------- .../ui/DefaultFancyListCellRenderer.java | 13 +-- .../sourceforge/tuned/ui/SelectButton.java | 6 +- .../tuned/ui/TextFieldWithSelect.java | 2 +- 18 files changed, 154 insertions(+), 131 deletions(-) delete mode 100644 source/net/sourceforge/tuned/PausableThreadPoolExecutor.java diff --git a/source/net/sourceforge/filebot/FileFormat.java b/source/net/sourceforge/filebot/FileFormat.java index 41da5a98..d931d10a 100644 --- a/source/net/sourceforge/filebot/FileFormat.java +++ b/source/net/sourceforge/filebot/FileFormat.java @@ -31,16 +31,6 @@ public class FileFormat { } - public static String formatName(File file) { - String name = file.getName(); - - if (file.isDirectory()) - return name; - - return getNameWithoutExtension(name); - } - - public static String formatNumberOfFiles(int n) { if (n == 1) return n + " file"; @@ -50,7 +40,7 @@ public class FileFormat { public static boolean hasExtension(File file, String... extensions) { - if (!file.isFile()) + if (file.isDirectory()) return false; String extension = getExtension(file); @@ -70,10 +60,14 @@ public class FileFormat { public static String getExtension(File file, boolean includeDot) { - String name = file.getName(); + return getExtension(file.getName(), includeDot); + } + + + public static String getExtension(String name, boolean includeDot) { int dotIndex = name.lastIndexOf("."); - // .config -> no extension + // .config -> no extension, just hidden if (dotIndex >= 1) { int startIndex = dotIndex; @@ -99,15 +93,15 @@ public class FileFormat { } - public static String getNameWithoutExtension(File file) { + public static String getFileName(File file) { + if (file.isDirectory()) + return getFolderName(file); + return getNameWithoutExtension(file.getName()); } - public static String getName(File file) { - if (file == null) - return ""; - + public static String getFolderName(File file) { String name = file.getName(); if (!name.isEmpty()) @@ -117,4 +111,23 @@ public class FileFormat { return file.toString(); } + + public static String getFileType(File file) { + if (file.isDirectory()) + return "Folder"; + + return getFileType(file.getName()); + } + + + public static String getFileType(String name) { + String extension = getExtension(name, false); + + if (!extension.isEmpty()) + return extension; + + // some file with no suffix + return "File"; + } + } diff --git a/source/net/sourceforge/filebot/ui/FileBotPanelSelectionList.java b/source/net/sourceforge/filebot/ui/FileBotPanelSelectionList.java index 4285764e..2c486a02 100644 --- a/source/net/sourceforge/filebot/ui/FileBotPanelSelectionList.java +++ b/source/net/sourceforge/filebot/ui/FileBotPanelSelectionList.java @@ -49,7 +49,7 @@ class FileBotPanelSelectionList extends JList { private class PanelCellRenderer extends DefaultFancyListCellRenderer { public PanelCellRenderer() { - super(BorderLayout.CENTER, 10, 0, Color.decode("#163264")); + super(BorderLayout.CENTER, 10, 0, new Color(0x163264)); setHighlightingEnabled(false); diff --git a/source/net/sourceforge/filebot/ui/panel/list/FileListTransferablePolicy.java b/source/net/sourceforge/filebot/ui/panel/list/FileListTransferablePolicy.java index e20ac162..4ef262ee 100644 --- a/source/net/sourceforge/filebot/ui/panel/list/FileListTransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/panel/list/FileListTransferablePolicy.java @@ -41,7 +41,7 @@ class FileListTransferablePolicy extends FileTransferablePolicy { @Override protected void load(List files) { if (files.size() > 1) { - list.setTitle(FileFormat.getName(files.get(0).getParentFile())); + list.setTitle(FileFormat.getFolderName(files.get(0).getParentFile())); } if (FileBotUtil.containsOnlyFolders(files)) { @@ -56,12 +56,12 @@ class FileListTransferablePolicy extends FileTransferablePolicy { private void loadFolderList(List folders) { if (folders.size() == 1) { - list.setTitle(FileFormat.getName(folders.get(0))); + list.setTitle(FileFormat.getFolderName(folders.get(0))); } for (File folder : folders) { for (File file : folder.listFiles()) { - list.getModel().add(FileFormat.formatName(file)); + list.getModel().add(FileFormat.getFolderName(file)); } } } @@ -93,7 +93,7 @@ class FileListTransferablePolicy extends FileTransferablePolicy { @Override protected void load(File file) { - list.getModel().add(FileFormat.formatName(file)); + list.getModel().add(FileFormat.getFileName(file)); } diff --git a/source/net/sourceforge/filebot/ui/panel/rename/RenameListCellRenderer.java b/source/net/sourceforge/filebot/ui/panel/rename/RenameListCellRenderer.java index b72be468..c22a7ee0 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/RenameListCellRenderer.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/RenameListCellRenderer.java @@ -2,12 +2,24 @@ package net.sourceforge.filebot.ui.panel.rename; +import java.awt.AlphaComposite; import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.RenderingHints; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; +import javax.swing.Box; +import javax.swing.BoxLayout; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListModel; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import net.sourceforge.filebot.ui.panel.rename.entry.AbstractFileEntry; import net.sourceforge.tuned.ui.DefaultFancyListCellRenderer; @@ -16,7 +28,7 @@ class RenameListCellRenderer extends DefaultFancyListCellRenderer { private final ListModel names; private final ListModel files; - private final JLabel extension = new JLabel(".png"); + private final ExtensionLabel extension = new ExtensionLabel(); public RenameListCellRenderer(ListModel names, ListModel files) { @@ -25,23 +37,36 @@ class RenameListCellRenderer extends DefaultFancyListCellRenderer { setHighlightingEnabled(false); - this.add(extension); + setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); + add(Box.createHorizontalGlue()); + add(extension); } - private final Color noMatchGradientBeginColor = Color.decode("#B7B7B7"); - private final Color noMatchGradientEndColor = Color.decode("#9A9A9A"); + private final Color noMatchGradientBeginColor = new Color(0xB7B7B7); + private final Color noMatchGradientEndColor = new Color(0x9A9A9A); @Override public void configureListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.configureListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if ((list.getModel() == files) && (value instanceof AbstractFileEntry)) { + AbstractFileEntry entry = (AbstractFileEntry) value; + + extension.setText(entry.getType()); + extension.setVisible(true); + } else { + extension.setVisible(false); + } + + extension.setAlpha(1.0f); + if (index >= getMinLength()) { if (isSelected) { - setForeground(Color.WHITE); setGradientColors(noMatchGradientBeginColor, noMatchGradientEndColor); } else { setForeground(noMatchGradientBeginColor); + extension.setAlpha(0.5f); } } } @@ -57,4 +82,52 @@ class RenameListCellRenderer extends DefaultFancyListCellRenderer { return Math.min(n1, n2); } + + private class ExtensionLabel extends JLabel { + + private final Insets margin = new Insets(0, 10, 0, 0); + private final Insets padding = new Insets(1, 6, 1, 5); + private final int arc = 10; + + private Color gradientBeginColor = new Color(0xFFCC00); + private Color gradientEndColor = new Color(0xFF9900); + + private float alpha = 1.0f; + + + public ExtensionLabel() { + setOpaque(false); + setForeground(new Color(42, 42, 42)); + + setBorder(new CompoundBorder(new EmptyBorder(margin), new EmptyBorder(padding))); + } + + + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + RoundRectangle2D shape = new RoundRectangle2D.Float(margin.left, margin.top, getWidth() - (margin.left + margin.right), getHeight(), arc, arc); + + g2d.setComposite(AlphaComposite.SrcOver.derive(alpha)); + + g2d.setPaint(getGradientStyle().getGradientPaint(shape, gradientBeginColor, gradientEndColor)); + g2d.fill(shape); + + g2d.setFont(getFont()); + g2d.setPaint(getForeground()); + + Rectangle2D textBounds = g2d.getFontMetrics().getStringBounds(getText(), g2d); + + g2d.drawString(getText(), (float) (shape.getCenterX() - textBounds.getX() - (textBounds.getWidth() / 2f)), (float) (shape.getCenterY() - textBounds.getY() - (textBounds.getHeight() / 2))); + } + + + public void setAlpha(float alpha) { + this.alpha = alpha; + } + } + } diff --git a/source/net/sourceforge/filebot/ui/panel/rename/SelectionSynchronizer.java b/source/net/sourceforge/filebot/ui/panel/rename/SelectionSynchronizer.java index 3cd155c2..ded6eee2 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/SelectionSynchronizer.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/SelectionSynchronizer.java @@ -9,11 +9,11 @@ import javax.swing.event.ListSelectionListener; class SelectionSynchronizer { - private JList list1; - private JList list2; + private final JList list1; + private final JList list2; - private SelectionSynchronizeListener selectionSynchronizeListener1; - private SelectionSynchronizeListener selectionSynchronizeListener2; + private final SelectionSynchronizeListener selectionSynchronizeListener1; + private final SelectionSynchronizeListener selectionSynchronizeListener2; public SelectionSynchronizer(JList list1, JList list2) { @@ -45,8 +45,8 @@ class SelectionSynchronizer { private JList target; - public SelectionSynchronizeListener(JList to) { - this.target = to; + public SelectionSynchronizeListener(JList target) { + this.target = target; } diff --git a/source/net/sourceforge/filebot/ui/panel/rename/SimilarityPanel.java b/source/net/sourceforge/filebot/ui/panel/rename/SimilarityPanel.java index 5191ea59..0e054eb3 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/SimilarityPanel.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/SimilarityPanel.java @@ -40,7 +40,7 @@ class SimilarityPanel extends Box { private Border labelMarginBorder = BorderFactory.createEmptyBorder(0, 3, 0, 0); - private Border separatorBorder = new SeparatorBorder(1, Color.decode("#ACA899"), SeparatorBorder.Position.TOP); + private Border separatorBorder = new SeparatorBorder(1, new Color(0xACA899), SeparatorBorder.Position.TOP); public SimilarityPanel(JList nameList, JList fileList) { diff --git a/source/net/sourceforge/filebot/ui/panel/rename/ValidateNamesDialog.java b/source/net/sourceforge/filebot/ui/panel/rename/ValidateNamesDialog.java index 83c94e2c..7fb7d5e3 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/ValidateNamesDialog.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/ValidateNamesDialog.java @@ -53,7 +53,7 @@ public class ValidateNamesDialog extends JDialog { JList list = new JList(new SimpleListModel(entries)); list.setEnabled(false); - list.setCellRenderer(new HighlightListCellRenderer(FileBotUtil.INVALID_CHARACTERS_PATTERN, new CharacterHighlightPainter(Color.decode("#FF4200"), Color.decode("#FF1200")), 4)); + list.setCellRenderer(new HighlightListCellRenderer(FileBotUtil.INVALID_CHARACTERS_PATTERN, new CharacterHighlightPainter(new Color(0xFF4200), new Color(0xFF1200)), 4)); JLabel label = new JLabel("Some names contain invalid characters:"); diff --git a/source/net/sourceforge/filebot/ui/panel/rename/ViewPortSynchronizer.java b/source/net/sourceforge/filebot/ui/panel/rename/ViewPortSynchronizer.java index c125a25a..f36aa4a6 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/ViewPortSynchronizer.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/ViewPortSynchronizer.java @@ -11,11 +11,11 @@ import javax.swing.event.ChangeListener; class ViewPortSynchronizer { - private JViewport viewport1; - private JViewport viewport2; + private final JViewport viewport1; + private final JViewport viewport2; - private ViewPortSynchronizeListener viewPortSynchronizeListener1; - private ViewPortSynchronizeListener viewPortSynchronizeListener2; + private final ViewPortSynchronizeListener viewPortSynchronizeListener1; + private final ViewPortSynchronizeListener viewPortSynchronizeListener2; public ViewPortSynchronizer(JViewport viewport1, JViewport viewport2) { @@ -44,7 +44,7 @@ class ViewPortSynchronizer { private static class ViewPortSynchronizeListener implements ChangeListener { - private JViewport target; + private final JViewport target; public ViewPortSynchronizeListener(JViewport target) { @@ -59,11 +59,10 @@ class ViewPortSynchronizer { Point viewPosition = source.getViewPosition(); // return if both viewports have the same view position - if (viewPosition.equals(target.getViewPosition())) - return; - - target.setViewPosition(viewPosition); - target.repaint(); + if (!viewPosition.equals(target.getViewPosition())) { + target.setViewPosition(viewPosition); + target.repaint(); + } } } diff --git a/source/net/sourceforge/filebot/ui/panel/rename/entry/AbstractFileEntry.java b/source/net/sourceforge/filebot/ui/panel/rename/entry/AbstractFileEntry.java index 49a96982..49f48910 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/entry/AbstractFileEntry.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/entry/AbstractFileEntry.java @@ -6,10 +6,13 @@ public abstract class AbstractFileEntry extends ListEntry { private final long length; + private final String type; - public AbstractFileEntry(String name, T value, long length) { + + public AbstractFileEntry(String name, T value, String type, long length) { super(name, value); this.length = length; + this.type = type; } @@ -17,4 +20,9 @@ public abstract class AbstractFileEntry extends ListEntry { return length; } + + public String getType() { + return type; + } + } diff --git a/source/net/sourceforge/filebot/ui/panel/rename/entry/FileEntry.java b/source/net/sourceforge/filebot/ui/panel/rename/entry/FileEntry.java index b3e47f3c..6c069dce 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/entry/FileEntry.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/entry/FileEntry.java @@ -10,7 +10,7 @@ import net.sourceforge.filebot.FileFormat; public class FileEntry extends AbstractFileEntry { public FileEntry(File file) { - super(FileFormat.formatName(file), file, file.length()); + super(FileFormat.getFileName(file), file, FileFormat.getFileType(file), file.length()); } } diff --git a/source/net/sourceforge/filebot/ui/panel/rename/entry/TorrentEntry.java b/source/net/sourceforge/filebot/ui/panel/rename/entry/TorrentEntry.java index 8a8ed54d..064999e9 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/entry/TorrentEntry.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/entry/TorrentEntry.java @@ -10,7 +10,6 @@ import net.sourceforge.filebot.torrent.Torrent.Entry; public class TorrentEntry extends AbstractFileEntry { public TorrentEntry(Entry value) { - super(FileFormat.getNameWithoutExtension(value.getName()), value, value.getLength()); + super(FileFormat.getNameWithoutExtension(value.getName()), value, FileFormat.getFileType(value.getName()), value.getLength()); } - } diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableModel.java b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableModel.java index eb890862..b1c01125 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableModel.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableModel.java @@ -38,7 +38,7 @@ class ChecksumTableModel extends AbstractTableModel { if (columnIndex >= checksumColumnsOffset) { File columnRoot = checksumColumnRoots.get(columnIndex - checksumColumnsOffset); - return FileFormat.getName(columnRoot); + return FileFormat.getFolderName(columnRoot); } return null; diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanel.java b/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanel.java index ef8f01ab..ee01f5fe 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanel.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanel.java @@ -110,7 +110,7 @@ public class SfvPanel extends FileBotPanel { @Override protected String convertValueToString(Object value) { File columnRoot = (File) value; - return FileFormat.getName(columnRoot); + return FileFormat.getFolderName(columnRoot); } }; @@ -125,7 +125,7 @@ public class SfvPanel extends FileBotPanel { return; index = options.indexOf(selected); - name = FileFormat.getNameWithoutExtension(selected); + name = FileFormat.getFileName(selected); if (name.isEmpty()) name = "name"; diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/SfvTable.java b/source/net/sourceforge/filebot/ui/panel/sfv/SfvTable.java index 1f4c3ab0..67e78757 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/SfvTable.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/SfvTable.java @@ -113,7 +113,7 @@ class SfvTable extends JTable implements TransferablePolicySupport, Saveable { String name = ""; if (columnRoot != null) - name = FileFormat.getNameWithoutExtension(columnRoot); + name = FileFormat.getFileName(columnRoot); if (name.isEmpty()) name = "name"; diff --git a/source/net/sourceforge/tuned/PausableThreadPoolExecutor.java b/source/net/sourceforge/tuned/PausableThreadPoolExecutor.java deleted file mode 100644 index ae4393f4..00000000 --- a/source/net/sourceforge/tuned/PausableThreadPoolExecutor.java +++ /dev/null @@ -1,64 +0,0 @@ - -package net.sourceforge.tuned; - - -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; - - -public class PausableThreadPoolExecutor extends ThreadPoolExecutor { - - private boolean paused; - private ReentrantLock pauseLock = new ReentrantLock(); - private Condition unpaused = pauseLock.newCondition(); - - - @SuppressWarnings("unchecked") - public PausableThreadPoolExecutor(int nThreads, BlockingQueue workQueue) { - super(nThreads, nThreads, 0, TimeUnit.MILLISECONDS, (BlockingQueue) workQueue); - } - - - @Override - protected void beforeExecute(Thread t, Runnable r) { - super.beforeExecute(t, r); - pauseLock.lock(); - try { - while (paused) - unpaused.await(); - } catch (InterruptedException ie) { - t.interrupt(); - } finally { - pauseLock.unlock(); - } - } - - - public void pause() { - pauseLock.lock(); - try { - paused = true; - } finally { - pauseLock.unlock(); - } - } - - - public void resume() { - pauseLock.lock(); - try { - paused = false; - unpaused.signalAll(); - } finally { - pauseLock.unlock(); - } - } - - - public boolean isPaused() { - return paused; - } -} diff --git a/source/net/sourceforge/tuned/ui/DefaultFancyListCellRenderer.java b/source/net/sourceforge/tuned/ui/DefaultFancyListCellRenderer.java index e6138b72..de77f36e 100644 --- a/source/net/sourceforge/tuned/ui/DefaultFancyListCellRenderer.java +++ b/source/net/sourceforge/tuned/ui/DefaultFancyListCellRenderer.java @@ -17,25 +17,18 @@ public class DefaultFancyListCellRenderer extends AbstractFancyListCellRenderer public DefaultFancyListCellRenderer() { - this.add(label, BorderLayout.WEST); - initializeLabel(BorderLayout.WEST); + add(label, BorderLayout.WEST); } public DefaultFancyListCellRenderer(int padding) { super(new Insets(padding, padding, padding, padding)); - initializeLabel(BorderLayout.WEST); + add(label, BorderLayout.WEST); } protected DefaultFancyListCellRenderer(Object constraint, int padding, int margin, Color selectedBorderColor) { super(new Insets(padding, padding, padding, padding), new Insets(margin, margin, margin, margin), selectedBorderColor); - initializeLabel(constraint); - } - - - private void initializeLabel(Object constraint) { - label.setOpaque(false); add(label, constraint); } @@ -44,6 +37,8 @@ public class DefaultFancyListCellRenderer extends AbstractFancyListCellRenderer protected void configureListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.configureListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + label.setOpaque(false); + setText(value.toString()); } diff --git a/source/net/sourceforge/tuned/ui/SelectButton.java b/source/net/sourceforge/tuned/ui/SelectButton.java index d56c3c72..accff8a8 100644 --- a/source/net/sourceforge/tuned/ui/SelectButton.java +++ b/source/net/sourceforge/tuned/ui/SelectButton.java @@ -30,11 +30,11 @@ public class SelectButton extends JButton implements ActionListener { private boolean hover = false; - private Color beginColor = Color.decode("#F0EEE4"); - private Color endColor = Color.decode("#E0DED4"); + private Color beginColor = new Color(0xF0EEE4); + private Color endColor = new Color(0xE0DED4); private Color beginColorHover = beginColor; - private Color endColorHover = Color.decode("#D8D7CD"); + private Color endColorHover = new Color(0xD8D7CD); private Entry selectedEntry = null; diff --git a/source/net/sourceforge/tuned/ui/TextFieldWithSelect.java b/source/net/sourceforge/tuned/ui/TextFieldWithSelect.java index 83dd9c51..d9952093 100644 --- a/source/net/sourceforge/tuned/ui/TextFieldWithSelect.java +++ b/source/net/sourceforge/tuned/ui/TextFieldWithSelect.java @@ -21,7 +21,7 @@ public class TextFieldWithSelect extends JPanel { private SelectButton selectButton; private JTextField textfield = new JTextField(); - private Color borderColor = Color.decode("#A4A4A4"); + private Color borderColor = new Color(0xA4A4A4); public TextFieldWithSelect(Collection> options) {