source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java@ 1992

Last change on this file since 1992 was 1992, checked in by Gubaer, 15 years ago

fixing ToggleDialog - now uses a JDialog instead of a JFrame. Should make setAlwaysOnTop() obsolete.

  • Property svn:eol-style set to native
File size: 10.4 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.gui.dialogs;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.BorderLayout;
7import java.awt.Dimension;
8import java.awt.EventQueue;
9import java.awt.GridBagLayout;
10import java.awt.Component;
11import java.awt.Image;
12import java.awt.event.ActionEvent;
13import java.awt.event.ActionListener;
14import java.awt.event.ComponentAdapter;
15import java.awt.event.ComponentEvent;
16import java.awt.event.MouseEvent;
17import java.awt.event.MouseListener;
18import java.awt.event.WindowAdapter;
19import java.awt.event.WindowEvent;
20
21import javax.swing.AbstractButton;
22import javax.swing.BorderFactory;
23import javax.swing.Box;
24import javax.swing.JButton;
25import javax.swing.JDialog;
26import javax.swing.JFrame;
27import javax.swing.JLabel;
28import javax.swing.JOptionPane;
29import javax.swing.JPanel;
30import javax.swing.ImageIcon;
31
32import org.openstreetmap.josm.Main;
33import org.openstreetmap.josm.actions.JosmAction;
34import org.openstreetmap.josm.actions.HelpAction.Helpful;
35import org.openstreetmap.josm.tools.GBC;
36import org.openstreetmap.josm.tools.ImageProvider;
37import org.openstreetmap.josm.tools.Shortcut;
38
39/**
40 * This class is a toggle dialog that can be turned on and off. It is attached
41 * to a ButtonModel.
42 *
43 * @author imi
44 */
45public class ToggleDialog extends JPanel implements Helpful {
46
47 public final class ToggleDialogAction extends JosmAction {
48 public final String prefname;
49 public AbstractButton button;
50
51 private ToggleDialogAction(String name, String iconName, String tooltip, Shortcut shortcut, String prefname) {
52 super(name, iconName, tooltip, shortcut, false);
53 this.prefname = prefname;
54 }
55
56 public void actionPerformed(ActionEvent e) {
57 if (e != null && !(e.getSource() instanceof AbstractButton)) {
58 button.setSelected(!button.isSelected());
59 }
60 Boolean selected = button.isSelected();
61 setVisible(selected);
62 Main.pref.put(prefname+".visible", selected);
63 if(!selected && winadapter != null) {
64 winadapter.windowClosing(null);
65 } else if (!Main.pref.getBoolean(action.prefname+".docked", true)) {
66 EventQueue.invokeLater(new Runnable(){
67 public void run() {
68 stickyActionListener.actionPerformed(null);
69 }
70 });
71 }
72 }
73 }
74
75 /**
76 * The action to toggle this dialog.
77 */
78 public ToggleDialogAction action;
79 public final String prefName;
80
81 public JPanel parent;
82 WindowAdapter winadapter;
83 private ActionListener stickyActionListener;
84 private final JPanel titleBar = new JPanel(new GridBagLayout());
85 public JLabel label = new JLabel();
86
87 public ToggleDialog(final String name, String iconName, String tooltip, Shortcut shortcut, int preferredHeight) {
88 super(new BorderLayout());
89 this.prefName = iconName;
90 ToggleDialogInit(name, iconName, tooltip, shortcut, preferredHeight);
91 }
92
93 private void ToggleDialogInit(final String name, String iconName, String tooltip, Shortcut shortcut, final int preferredHeight) {
94 setPreferredSize(new Dimension(330,preferredHeight));
95 action = new ToggleDialogAction(name, "dialogs/"+iconName, tooltip, shortcut, iconName);
96 String helpId = "Dialog/"+getClass().getName().substring(getClass().getName().lastIndexOf('.')+1);
97 action.putValue("help", helpId.substring(0, helpId.length()-6));
98 setLayout(new BorderLayout());
99
100 // show the minimize button
101 final JLabel minimize = new JLabel(ImageProvider.get("misc", "normal"));
102 titleBar.add(minimize);
103
104 // scale down the dialog icon
105 ImageIcon inIcon = ImageProvider.get("dialogs", iconName);
106 ImageIcon smallIcon = new ImageIcon(inIcon.getImage().getScaledInstance(16 , 16, Image.SCALE_SMOOTH));
107 JLabel firstPart = new JLabel(name, smallIcon, JLabel.TRAILING);
108 firstPart.setIconTextGap(8);
109 titleBar.add(firstPart, GBC.std());
110 titleBar.add(Box.createHorizontalGlue(),GBC.std().fill(GBC.HORIZONTAL));
111
112 final ActionListener hideActionListener = new ActionListener(){
113 public void actionPerformed(ActionEvent e) {
114 boolean nowVisible = false;
115 Component comps[] = getComponents();
116 for(int i=0; i<comps.length; i++)
117 {
118 if(comps[i] != titleBar)
119 {
120 if(comps[i].isVisible()) {
121 comps[i].setVisible(false);
122 } else {
123 comps[i].setVisible(true);
124 nowVisible = true;
125 }
126 }
127 }
128
129 Main.pref.put(action.prefname+".minimized", !nowVisible);
130 if(nowVisible == true) {
131 setPreferredSize(new Dimension(330,preferredHeight));
132 setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
133 minimize.setIcon(ImageProvider.get("misc", "normal"));
134 } else {
135 setPreferredSize(new Dimension(330,20));
136 setMaximumSize(new Dimension(330,20));
137 minimize.setIcon(ImageProvider.get("misc", "minimized"));
138 }
139 if(parent != null)
140 {
141 // doLayout() - workaround
142 parent.setVisible(false);
143 parent.setVisible(true);
144 }
145 }
146 };
147 //hide.addActionListener(hideActionListener);
148
149 final MouseListener titleMouseListener = new MouseListener(){
150 public void mouseClicked(MouseEvent e) {
151 hideActionListener.actionPerformed(null);
152 }
153 public void mouseEntered(MouseEvent e) {}
154 public void mouseExited(MouseEvent e) {}
155 public void mousePressed(MouseEvent e) {}
156 public void mouseReleased(MouseEvent e) {}
157 };
158 titleBar.addMouseListener(titleMouseListener);
159
160 // show the sticky button
161 JButton sticky = new JButton(ImageProvider.get("misc", "sticky"));
162 sticky.setToolTipText(tr("Undock the panel"));
163 sticky.setBorder(BorderFactory.createEmptyBorder());
164 stickyActionListener = new ActionListener(){
165 public void actionPerformed(ActionEvent e) {
166 final JDialog f = new JDialog(JOptionPane.getFrameForComponent(Main.parent),false /* not modal*/);
167 parent.remove(ToggleDialog.this);
168 f.getContentPane().add(ToggleDialog.this);
169 f.addWindowListener((winadapter = new WindowAdapter(){
170 @Override public void windowClosing(WindowEvent e) {
171 f.getContentPane().removeAll();
172 f.dispose();
173 winadapter = null;
174
175 // doLayout() - workaround
176 setVisible(false);
177 parent.add(ToggleDialog.this);
178 if(Main.pref.getBoolean(action.prefname+".visible")) {
179 setVisible(true);
180 }
181 titleBar.setVisible(true);
182 if(e != null) {
183 Main.pref.put(action.prefname+".docked", true);
184 }
185 }
186 }));
187 f.addComponentListener(new ComponentAdapter(){
188 @Override public void componentMoved(ComponentEvent e) {
189 Main.pref.put(action.prefname+".bounds", f.getX()+","+f.getY()+","+f.getWidth()+","+f.getHeight());
190 }
191 });
192 String bounds = Main.pref.get(action.prefname+".bounds",null);
193 if (bounds != null) {
194 String[] b = bounds.split(",");
195 f.setBounds(Integer.parseInt(b[0]),Integer.parseInt(b[1]),Integer.parseInt(b[2]),Integer.parseInt(b[3]));
196 } else {
197 f.pack();
198 }
199 Main.pref.put(action.prefname+".docked", false);
200 f.setVisible(true);
201 titleBar.setVisible(false);
202
203 // doLayout() - workaround
204 parent.setVisible(false);
205 parent.setVisible(true);
206 }
207 };
208 sticky.addActionListener(stickyActionListener);
209 titleBar.add(sticky);
210
211 // show the close button
212 JButton close = new JButton(ImageProvider.get("misc", "close"));
213 close.setToolTipText(tr("Close this panel. You can reopen it with the buttons in the left toolbar."));
214 close.setBorder(BorderFactory.createEmptyBorder());
215 final ActionListener closeActionListener = new ActionListener(){
216 public void actionPerformed(ActionEvent e) {
217 // fake an event to toggle dialog
218 action.actionPerformed(new ActionEvent(titleBar, 0, ""));
219 }
220 };
221 close.addActionListener(closeActionListener);
222 titleBar.add(close);
223
224 add(titleBar, BorderLayout.NORTH);
225 titleBar.setToolTipText(tr("Click to minimize/maximize the panel content"));
226
227 setVisible(false);
228 setBorder(BorderFactory.createEtchedBorder());
229
230 if (!Main.pref.getBoolean(action.prefname+".docked", true)) {
231 EventQueue.invokeLater(new Runnable(){
232 public void run() {
233 stickyActionListener.actionPerformed(null);
234 }
235 });
236 }
237 if (Main.pref.getBoolean(action.prefname+".minimized", false)) {
238 EventQueue.invokeLater(new Runnable(){
239 public void run() {
240 titleMouseListener.mouseClicked(null);
241 }
242 });
243 }
244 }
245
246 public void close()
247 {
248 if(winadapter != null) {
249 winadapter.windowClosing(null);
250 }
251 }
252
253 public void setTitle(String title, boolean active) {
254 if(active) {
255 label.setText("<html><b>" + title + "</b>");
256 } else {
257 label.setText(title);
258 }
259 }
260
261 public String helpTopic() {
262 String help = getClass().getName();
263 help = help.substring(help.lastIndexOf('.')+1, help.length()-6);
264 return "Dialog/"+help;
265 }
266}
Note: See TracBrowser for help on using the repository browser.