34b2ad68519d5a11e39d0f60837efcf3866cf6bc
[debian/jabref.git] / src / java / net / sf / jabref / SidePaneManager.java
1 /*
2  Copyright (C) 2003  Nizar N. Batada, Morten O. Alver
3
4  All programs in this directory and
5  subdirectories are published under the GNU General Public License as
6  described below.
7
8  This program is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or (at
11  your option) any later version.
12
13  This program is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21  USA
22
23  Further information about the GNU GPL is available at:
24  http://www.gnu.org/copyleft/gpl.ja.html
25
26  */
27 package net.sf.jabref;
28
29 import java.util.Iterator;
30 import java.util.LinkedHashMap;
31 import java.util.LinkedList;
32 import java.util.List;
33 import java.util.Map;
34
35 import javax.swing.SwingUtilities;
36 import javax.swing.event.ChangeEvent;
37 import javax.swing.event.ChangeListener;
38
39 /**
40  * Manages visibility of SideShowComponents in a given newly constructed
41  * sidePane.
42  * 
43  * @version $Revision: 1.20 $ ($Date: 2006/08/30 00:04:12 $)
44  * 
45  */
46 public class SidePaneManager {
47
48         JabRefFrame frame;
49
50         BasePanel panel;
51
52         SidePane sidep;
53
54         Map components = new LinkedHashMap();
55
56         List visible = new LinkedList();
57
58         public SidePaneManager(JabRefFrame frame) {
59                 this.frame = frame;
60                 /*
61                  * Change by Morten Alver 2005.12.04: By postponing the updating of the
62                  * side pane components, we get rid of the annoying latency when
63                  * switching tabs:
64                  */
65                 frame.tabbedPane.addChangeListener(new ChangeListener() {
66                         public void stateChanged(ChangeEvent event) {
67                                 SwingUtilities.invokeLater(new Runnable() {
68                                         public void run() {
69                                                 setActiveBasePanel((BasePanel) SidePaneManager.this.frame.tabbedPane
70                                                         .getSelectedComponent());
71                                         }
72                                 });
73                         }
74                 });
75                 sidep = new SidePane();
76         }
77
78         public SidePane getPanel() {
79                 return sidep;
80         }
81
82         public synchronized boolean hasComponent(String name) {
83                 return (components.get("name") != null);
84         }
85
86         public boolean isComponentVisible(String name) {
87                 Object o = components.get(name);
88                 if (o != null) {
89                         return visible.contains(o);
90                 } else {
91                         return false;
92                 }
93         }
94
95         public synchronized void toggle(String name) {
96                 if (isComponentVisible(name)) {
97                         hide(name);
98                 } else {
99                         show(name);
100                 }
101         }
102
103         public void show(String name) {
104                 Object o = components.get(name);
105                 if (o != null) {
106                         show((SidePaneComponent) o);
107                 } else
108                         System.err.println("Side pane component '" + name + "' unknown.");
109         }
110
111         public void hide(String name) {
112                 Object o = components.get(name);
113                 if (o != null) {
114                         hideComponent((SidePaneComponent) o);
115                 } else
116                         System.err.println("Side pane component '" + name + "' unknown.");
117         }
118
119         public synchronized void register(String name, SidePaneComponent comp) {
120                 components.put(name, comp);
121         }
122
123         public synchronized void registerAndShow(String name, SidePaneComponent comp) {
124                 register(name, comp);
125                 show(name);
126         }
127
128         private synchronized void show(SidePaneComponent component) {
129                 if (!visible.contains(component)) {
130                         // Put the new component at the top of the group
131                         visible.add(0, component);
132                         updateView();
133                         component.componentOpening();
134                 }
135         }
136
137         public synchronized void hideComponent(SidePaneComponent comp) {
138                 if (visible.contains(comp)) {
139                         comp.componentClosing();
140                         visible.remove(comp);
141                         updateView();
142                 }
143         }
144
145         /**
146          * Update all side pane components to show information from the given
147          * BasePanel.
148          * 
149          * @param panel
150          */
151         public void setActiveBasePanel(BasePanel panel) {
152                 for (Iterator i = components.keySet().iterator(); i.hasNext();) {
153                         Object key = i.next();
154                         ((SidePaneComponent) components.get(key)).setActiveBasePanel(panel);
155                 }
156         }
157
158         public void updateView() {
159                 sidep.setComponents(visible);
160                 if (visible.size() > 0) {
161                         boolean wasVisible = sidep.isVisible();
162                         sidep.setVisible(true);
163                         if (!wasVisible)
164                                 frame.contentPane.setDividerLocation(getPanel().getPreferredSize().width);
165                 } else
166                         sidep.setVisible(false);
167         }
168
169         public void revalidate() {
170                 sidep.revalidate();
171                 sidep.repaint();
172         }
173 }