blob: 0e3c868ef98a7578a527d4c2522bdef03b0c2dee [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25package sun.swing;
26
27import java.awt.*;
28import java.awt.event.*;
29import java.beans.PropertyChangeEvent;
30import java.beans.PropertyChangeListener;
31import java.io.*;
32
33import javax.swing.*;
34import javax.swing.border.*;
35import javax.swing.filechooser.*;
36
37import sun.awt.shell.*;
38import sun.awt.OSInfo;
39
40/**
41 * <b>WARNING:</b> This class is an implementation detail and is only
42 * public so that it can be used by two packages. You should NOT consider
43 * this public API.
44 * <p>
45 *
46 * @author Leif Samuelsson
47 */
48public class WindowsPlacesBar extends JToolBar
49 implements ActionListener, PropertyChangeListener {
50 JFileChooser fc;
51 JToggleButton[] buttons;
52 ButtonGroup buttonGroup;
53 File[] files;
54 final Dimension buttonSize;
55
56 public WindowsPlacesBar(JFileChooser fc, boolean isXPStyle) {
57 super(JToolBar.VERTICAL);
58 this.fc = fc;
59 setFloatable(false);
60 putClientProperty("JToolBar.isRollover", Boolean.TRUE);
61
62 boolean isXPPlatform = (OSInfo.getOSType() == OSInfo.OSType.WINDOWS &&
63 OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP) >= 0);
64
65 if (isXPStyle) {
66 buttonSize = new Dimension(83, 69);
67 putClientProperty("XPStyle.subAppName", "placesbar");
68 setBorder(new EmptyBorder(1, 1, 1, 1));
69 } else {
70 // The button size almost matches the XP style when in Classic style on XP
71 buttonSize = new Dimension(83, isXPPlatform ? 65 : 54);
72 setBorder(new BevelBorder(BevelBorder.LOWERED,
73 UIManager.getColor("ToolBar.highlight"),
74 UIManager.getColor("ToolBar.background"),
75 UIManager.getColor("ToolBar.darkShadow"),
76 UIManager.getColor("ToolBar.shadow")));
77 }
78 Color bgColor = new Color(UIManager.getColor("ToolBar.shadow").getRGB());
79 setBackground(bgColor);
80 FileSystemView fsv = fc.getFileSystemView();
81
82 files = (File[])ShellFolder.get("fileChooserShortcutPanelFolders");
83 buttons = new JToggleButton[files.length];
84 buttonGroup = new ButtonGroup();
85 for (int i = 0; i < files.length; i++) {
86 if (fsv.isFileSystemRoot(files[i])) {
87 // Create special File wrapper for drive path
88 files[i] = fsv.createFileObject(files[i].getAbsolutePath());
89 }
90
91 String folderName = fsv.getSystemDisplayName(files[i]);
92 int index = folderName.lastIndexOf(File.separatorChar);
93 if (index >= 0 && index < folderName.length() - 1) {
94 folderName = folderName.substring(index + 1);
95 }
96 Icon icon = null;
97 if (files[i] instanceof ShellFolder) {
98 // We want a large icon, fsv only gives us a small.
99 ShellFolder sf = (ShellFolder)files[i];
100 icon = new ImageIcon(sf.getIcon(true), sf.getFolderType());
101 } else {
102 icon = fsv.getSystemIcon(files[i]);
103 }
104 buttons[i] = new JToggleButton(folderName, icon);
105 if (isXPPlatform) {
106 buttons[i].setText("<html><center>"+folderName+"</center></html>");
107 }
108 if (isXPStyle) {
109 buttons[i].putClientProperty("XPStyle.subAppName", "placesbar");
110 } else {
111 Color fgColor = new Color(UIManager.getColor("List.selectionForeground").getRGB());
112 buttons[i].setContentAreaFilled(false);
113 buttons[i].setForeground(fgColor);
114 }
115 buttons[i].setMargin(new Insets(3, 2, 1, 2));
116 buttons[i].setIconTextGap(0);
117 buttons[i].setHorizontalTextPosition(JToggleButton.CENTER);
118 buttons[i].setVerticalTextPosition(JToggleButton.BOTTOM);
119 buttons[i].setAlignmentX(JComponent.CENTER_ALIGNMENT);
120 buttons[i].setPreferredSize(buttonSize);
121 buttons[i].setMaximumSize(buttonSize);
122 buttons[i].addActionListener(this);
123 add(buttons[i]);
124 if (i < files.length-1 && isXPStyle) {
125 add(Box.createRigidArea(new Dimension(1, 1)));
126 }
127 buttonGroup.add(buttons[i]);
128 }
129 doDirectoryChanged(fc.getCurrentDirectory());
130 }
131
132 protected void doDirectoryChanged(File f) {
133 for (int i=0; i<buttons.length; i++) {
134 JToggleButton b = buttons[i];
135 if (files[i].equals(f)) {
136 b.setSelected(true);
137 break;
138 } else if (b.isSelected()) {
139 // Remove temporarily from group because it doesn't
140 // allow for no button to be selected.
141 buttonGroup.remove(b);
142 b.setSelected(false);
143 buttonGroup.add(b);
144 }
145 }
146 }
147
148 public void propertyChange(PropertyChangeEvent e) {
149 String prop = e.getPropertyName();
150 if (prop == JFileChooser.DIRECTORY_CHANGED_PROPERTY) {
151 doDirectoryChanged(fc.getCurrentDirectory());
152 }
153 }
154
155 public void actionPerformed(ActionEvent e) {
156 JToggleButton b = (JToggleButton)e.getSource();
157 for (int i=0; i<buttons.length; i++) {
158 if (b == buttons[i]) {
159 fc.setCurrentDirectory(files[i]);
160 break;
161 }
162 }
163 }
164
165 public Dimension getPreferredSize() {
166 Dimension min = super.getMinimumSize();
167 Dimension pref = super.getPreferredSize();
168 int h = min.height;
169 if (buttons != null && buttons.length > 0 && buttons.length < 5) {
170 JToggleButton b = buttons[0];
171 if (b != null) {
172 int bh = 5 * (b.getPreferredSize().height + 1);
173 if (bh > h) {
174 h = bh;
175 }
176 }
177 }
178 if (h > pref.height) {
179 pref = new Dimension(pref.width, h);
180 }
181 return pref;
182 }
183}