X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix_swing%2Fgui%2Fbrowser%2FBasicTab.java;h=86b4a02062ff4da9cf16a2bfa35893fbbedbc4ea;hb=d6c8579cb5debbdf7657d405e6529ba324903fcd;hp=d467a91792ea78d83107dcd1952785e9fe73b9b9;hpb=3cdf3fd8a60d22a592e1cd0634cb108faa1f5f9f;p=fanfix.git diff --git a/src/be/nikiroo/fanfix_swing/gui/browser/BasicTab.java b/src/be/nikiroo/fanfix_swing/gui/browser/BasicTab.java index d467a91..86b4a02 100644 --- a/src/be/nikiroo/fanfix_swing/gui/browser/BasicTab.java +++ b/src/be/nikiroo/fanfix_swing/gui/browser/BasicTab.java @@ -8,14 +8,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import javax.swing.JPanel; -import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.SwingWorker; -import javax.swing.UIDefaults; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; -import javax.swing.plaf.TreeUI; import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; @@ -23,15 +19,16 @@ import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreePath; -import be.nikiroo.fanfix.Instance; import be.nikiroo.fanfix_swing.gui.SearchBar; +import be.nikiroo.fanfix_swing.gui.utils.ListenerPanel; import be.nikiroo.fanfix_swing.gui.utils.TreeCellSpanner; +import be.nikiroo.fanfix_swing.gui.utils.TreeSnapshot; import be.nikiroo.fanfix_swing.gui.utils.UiHelper; import be.nikiroo.fanfix_swing.images.IconGenerator; import be.nikiroo.fanfix_swing.images.IconGenerator.Icon; import be.nikiroo.fanfix_swing.images.IconGenerator.Size; -public abstract class BasicTab extends JPanel { +public abstract class BasicTab extends ListenerPanel { private int totalCount = 0; private List selectedElements = new ArrayList(); private T data; @@ -40,6 +37,7 @@ public abstract class BasicTab extends JPanel { private int index; private JTree tree; + private DefaultMutableTreeNode root; private SearchBar searchBar; public BasicTab(int index, String listenerCommand) { @@ -51,7 +49,7 @@ public abstract class BasicTab extends JPanel { data = createEmptyData(); totalCount = 0; - final DefaultMutableTreeNode root = new DefaultMutableTreeNode(); + root = new DefaultMutableTreeNode(); tree = new JTree(root); tree.setUI(new BasicTreeUI()); @@ -81,7 +79,7 @@ public abstract class BasicTab extends JPanel { BasicTab.this.selectedElements = selectedElements; - fireActionPerformed(); + fireActionPerformed(BasicTab.this.listenerCommand); } }); @@ -92,27 +90,50 @@ public abstract class BasicTab extends JPanel { searchBar.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - root.removeAllChildren(); - loadData(root, data, searchBar.getText()); - ((DefaultTreeModel) tree.getModel()).reload(); - fireActionPerformed(); + reloadData(); } }); + reloadData(); + } + + public void reloadData() { + final TreeSnapshot snapshot = new TreeSnapshot(tree) { + @Override + protected boolean isSamePath(TreePath oldPath, TreePath newPath) { + String oldString = oldPath.toString(); + if (oldString.endsWith("/]")) + oldString = oldString.substring(0, oldString.length() - 2) + "]"; + + String newString = newPath.toString(); + if (newString.endsWith("/]")) + newString = newString.substring(0, newString.length() - 2) + "]"; + + return oldString.equals(newString); + } + }; SwingWorker>, Integer> worker = new SwingWorker>, Integer>() { @Override protected Map> doInBackground() throws Exception { - return Instance.getInstance().getLibrary().getSourcesGrouped(); + fillData(data); + return null; } @Override protected void done() { - fillData(data); + try { + get(); + } catch (Exception e) { + // TODO: error + } + root.removeAllChildren(); totalCount = loadData(root, data, searchBar.getText()); ((DefaultTreeModel) tree.getModel()).reload(); - fireActionPerformed(); + snapshot.apply(); + + fireActionPerformed(listenerCommand); } }; worker.execute(); @@ -158,39 +179,6 @@ public abstract class BasicTab extends JPanel { tree.clearSelection(); } - /** - * Adds the specified action listener to receive action events from this - * {@link SearchBar}. - * - * @param listener the action listener to be added - */ - public synchronized void addActionListener(ActionListener listener) { - listenerList.add(ActionListener.class, listener); - } - - /** - * Removes the specified action listener so that it no longer receives action - * events from this {@link SearchBar}. - * - * @param listener the action listener to be removed - */ - public synchronized void removeActionListener(ActionListener listener) { - listenerList.remove(ActionListener.class, listener); - } - - /** - * Notify the listeners of an action. - */ - protected void fireActionPerformed() { - ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, listenerCommand); - Object[] listeners = listenerList.getListenerList(); - for (int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == ActionListener.class) { - ((ActionListener) listeners[i + 1]).actionPerformed(e); - } - } - } - protected boolean checkFilter(String filter, String value) { return (filter == null || filter.isEmpty() || value.toLowerCase().contains(filter.toLowerCase())); } @@ -228,8 +216,7 @@ public abstract class BasicTab extends JPanel { } String display = value == null ? "" : value.toString(); - if (!display.isEmpty()) - display = keyToDisplay(display); + display = keyToDisplay(display); return super.getTreeCellRendererComponent(tree, display, selected, expanded, leaf, row, hasFocus); }