/* Copyright (C) 2003-2011 JabRef contributors.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package net.sf.jabref;
import java.util.*;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
* Manages visibility of SideShowComponents in a given newly constructed
* sidePane.
*
* @version $Revision$ ($Date$)
*
*/
public class SidePaneManager {
JabRefFrame frame;
BasePanel panel;
SidePane sidep;
Map<String, SidePaneComponent> components = new LinkedHashMap<String, SidePaneComponent>();
List<SidePaneComponent> visible = new LinkedList<SidePaneComponent>();
public SidePaneManager(JabRefFrame frame) {
this.frame = frame;
/*
* Change by Morten Alver 2005.12.04: By postponing the updating of the
* side pane components, we get rid of the annoying latency when
* switching tabs:
*/
frame.tabbedPane.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent event) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setActiveBasePanel((BasePanel) SidePaneManager.this.frame.tabbedPane
.getSelectedComponent());
}
});
}
});
sidep = new SidePane();
sidep.setVisible(false);
}
public SidePane getPanel() {
return sidep;
}
public synchronized boolean hasComponent(String name) {
return (components.get(name) != null);
}
public boolean isComponentVisible(String name) {
Object o = components.get(name);
if (o != null) {
return visible.contains(o);
} else {
return false;
}
}
public synchronized void toggle(String name) {
if (isComponentVisible(name)) {
hide(name);
} else {
show(name);
}
}
public void show(String name) {
Object o = components.get(name);
if (o != null) {
show((SidePaneComponent) o);
} else
System.err.println("Side pane component '" + name + "' unknown.");
}
public void hide(String name) {
Object o = components.get(name);
if (o != null) {
hideComponent((SidePaneComponent) o);
} else
System.err.println("Side pane component '" + name + "' unknown.");
}
public synchronized void register(String name, SidePaneComponent comp) {
components.put(name, comp);
}
public synchronized void registerAndShow(String name, SidePaneComponent comp) {
register(name, comp);
show(name);
}
private synchronized void show(SidePaneComponent component) {
if (!visible.contains(component)) {
// Put the new component at the top of the group
visible.add(0, component);
updateView();
component.componentOpening();
}
}
public SidePaneComponent getComponent(String name) {
return components.get(name);
}
public synchronized void hideComponent(SidePaneComponent comp) {
if (visible.contains(comp)) {
comp.componentClosing();
visible.remove(comp);
updateView();
}
}
public synchronized void hideComponent(String name) {
SidePaneComponent comp = components.get(name);
if (comp == null)
return;
if (visible.contains(comp)) {
comp.componentClosing();
visible.remove(comp);
updateView();
}
}
public synchronized void unregisterComponent(String name) {
components.remove(name);
}
/**
* Update all side pane components to show information from the given
* BasePanel.
*
* @param panel
*/
public void setActiveBasePanel(BasePanel panel) {
for (Iterator<String> i = components.keySet().iterator(); i.hasNext();) {
Object key = i.next();
components.get(key).setActiveBasePanel(panel);
}
}
public void updateView() {
sidep.setComponents(visible);
if (visible.size() > 0) {
boolean wasVisible = sidep.isVisible();
sidep.setVisible(true);
if (!wasVisible) {
int width = Globals.prefs.getInt("sidePaneWidth");
if (width > 0)
frame.contentPane.setDividerLocation(width);
else
frame.contentPane.setDividerLocation(getPanel().getPreferredSize().width);
}
} else {
if (sidep.isVisible())
Globals.prefs.putInt("sidePaneWidth", frame.contentPane.getDividerLocation());
sidep.setVisible(false);
}
}
public void revalidate() {
sidep.revalidate();
sidep.repaint();
}
}