提交 4919e75a 编写于 作者: R rupashka

6589634: Unable to view focus on "Up one level", "create new folder" etc. of JFileChooser Dialog

Reviewed-by: peterz, loneid
上级 0d06dbab
/* /*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -43,7 +43,6 @@ import java.security.AccessController; ...@@ -43,7 +43,6 @@ import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import sun.awt.shell.ShellFolder; import sun.awt.shell.ShellFolder;
import sun.awt.OSInfo;
import sun.swing.*; import sun.swing.*;
import javax.accessibility.*; import javax.accessibility.*;
...@@ -58,8 +57,6 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { ...@@ -58,8 +57,6 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
// The following are private because the implementation of the // The following are private because the implementation of the
// Windows FileChooser L&F is not complete yet. // Windows FileChooser L&F is not complete yet.
private static final OSInfo.WindowsVersion OS_VERSION = OSInfo.getWindowsVersion();
private JPanel centerPanel; private JPanel centerPanel;
private JLabel lookInLabel; private JLabel lookInLabel;
...@@ -118,18 +115,9 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { ...@@ -118,18 +115,9 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
private String upFolderToolTipText = null; private String upFolderToolTipText = null;
private String upFolderAccessibleName = null; private String upFolderAccessibleName = null;
private String homeFolderToolTipText = null;
private String homeFolderAccessibleName = null;
private String newFolderToolTipText = null; private String newFolderToolTipText = null;
private String newFolderAccessibleName = null; private String newFolderAccessibleName = null;
private String listViewButtonToolTipText = null;
private String listViewButtonAccessibleName = null;
private String detailsViewButtonToolTipText = null;
private String detailsViewButtonAccessibleName = null;
private String viewMenuButtonToolTipText = null; private String viewMenuButtonToolTipText = null;
private String viewMenuButtonAccessibleName = null; private String viewMenuButtonAccessibleName = null;
...@@ -231,9 +219,7 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { ...@@ -231,9 +219,7 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
// Directory manipulation buttons // Directory manipulation buttons
JToolBar topPanel = new JToolBar(); JToolBar topPanel = new JToolBar();
topPanel.setFloatable(false); topPanel.setFloatable(false);
if (OS_VERSION.compareTo(OSInfo.WINDOWS_ME) >= 0) { topPanel.putClientProperty("JToolBar.isRollover", Boolean.TRUE);
topPanel.putClientProperty("JToolBar.isRollover", Boolean.TRUE);
}
// Add the top panel to the fileChooser // Add the top panel to the fileChooser
fc.add(topPanel, BorderLayout.NORTH); fc.add(topPanel, BorderLayout.NORTH);
...@@ -287,218 +273,103 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { ...@@ -287,218 +273,103 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
topPanel.add(Box.createRigidArea(hstrut10)); topPanel.add(Box.createRigidArea(hstrut10));
// Up Button // Up Button
JButton upFolderButton = new JButton(getChangeToParentDirectoryAction()); JButton upFolderButton = createToolButton(getChangeToParentDirectoryAction(), upFolderIcon,
upFolderButton.setText(null); upFolderToolTipText, upFolderAccessibleName);
upFolderButton.setIcon(upFolderIcon);
upFolderButton.setToolTipText(upFolderToolTipText);
upFolderButton.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY,
upFolderAccessibleName);
upFolderButton.putClientProperty(WindowsLookAndFeel.HI_RES_DISABLED_ICON_CLIENT_KEY,
Boolean.TRUE);
upFolderButton.setAlignmentX(JComponent.LEFT_ALIGNMENT);
upFolderButton.setAlignmentY(JComponent.CENTER_ALIGNMENT);
upFolderButton.setMargin(shrinkwrap);
upFolderButton.setFocusPainted(false);
topPanel.add(upFolderButton); topPanel.add(upFolderButton);
if (OS_VERSION.compareTo(OSInfo.WINDOWS_ME) < 0) {
topPanel.add(Box.createRigidArea(hstrut10));
}
JButton b;
if (OS_VERSION == OSInfo.WINDOWS_98) {
// Desktop Button
File homeDir = fsv.getHomeDirectory();
String toolTipText = homeFolderToolTipText;
if (fsv.isRoot(homeDir)) {
toolTipText = getFileView(fc).getName(homeDir); // Probably "Desktop".
}
b = new JButton(getFileView(fc).getIcon(homeDir));
b.setToolTipText(toolTipText);
b.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY,
toolTipText);
b.setAlignmentX(JComponent.LEFT_ALIGNMENT);
b.setAlignmentY(JComponent.CENTER_ALIGNMENT);
b.setMargin(shrinkwrap);
b.setFocusPainted(false);
b.addActionListener(getGoHomeAction());
topPanel.add(b);
topPanel.add(Box.createRigidArea(hstrut10));
}
// New Directory Button // New Directory Button
if (!UIManager.getBoolean("FileChooser.readOnly")) { if (!UIManager.getBoolean("FileChooser.readOnly")) {
b = new JButton(filePane.getNewFolderAction()); JButton newFolderButton = createToolButton(filePane.getNewFolderAction(), newFolderIcon,
b.setText(null); newFolderToolTipText, newFolderAccessibleName);
b.setIcon(newFolderIcon); topPanel.add(newFolderButton);
b.setToolTipText(newFolderToolTipText);
b.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY,
newFolderAccessibleName);
b.putClientProperty(WindowsLookAndFeel.HI_RES_DISABLED_ICON_CLIENT_KEY,
Boolean.TRUE);
b.setAlignmentX(JComponent.LEFT_ALIGNMENT);
b.setAlignmentY(JComponent.CENTER_ALIGNMENT);
b.setMargin(shrinkwrap);
b.setFocusPainted(false);
topPanel.add(b);
} }
if (OS_VERSION.compareTo(OSInfo.WINDOWS_ME) < 0) {
topPanel.add(Box.createRigidArea(hstrut10)); // View button group
ButtonGroup viewButtonGroup = new ButtonGroup();
// View button group
ButtonGroup viewButtonGroup = new ButtonGroup(); // Popup Menu
final JPopupMenu viewTypePopupMenu = new JPopupMenu();
// List Button
final JToggleButton listViewButton = new JToggleButton(listViewIcon); final JRadioButtonMenuItem listViewMenuItem = new JRadioButtonMenuItem(
listViewButton.setToolTipText(listViewButtonToolTipText); filePane.getViewTypeAction(FilePane.VIEWTYPE_LIST));
listViewButton.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY, listViewMenuItem.setSelected(filePane.getViewType() == FilePane.VIEWTYPE_LIST);
listViewButtonAccessibleName); viewTypePopupMenu.add(listViewMenuItem);
listViewButton.putClientProperty(WindowsLookAndFeel.HI_RES_DISABLED_ICON_CLIENT_KEY, viewButtonGroup.add(listViewMenuItem);
Boolean.TRUE);
listViewButton.setFocusPainted(false); final JRadioButtonMenuItem detailsViewMenuItem = new JRadioButtonMenuItem(
listViewButton.setSelected(true); filePane.getViewTypeAction(FilePane.VIEWTYPE_DETAILS));
listViewButton.setAlignmentX(JComponent.LEFT_ALIGNMENT); detailsViewMenuItem.setSelected(filePane.getViewType() == FilePane.VIEWTYPE_DETAILS);
listViewButton.setAlignmentY(JComponent.CENTER_ALIGNMENT); viewTypePopupMenu.add(detailsViewMenuItem);
listViewButton.setMargin(shrinkwrap); viewButtonGroup.add(detailsViewMenuItem);
listViewButton.addActionListener(filePane.getViewTypeAction(FilePane.VIEWTYPE_LIST));
topPanel.add(listViewButton); // Create icon for viewMenuButton
viewButtonGroup.add(listViewButton); BufferedImage image = new BufferedImage(viewMenuIcon.getIconWidth() + 7, viewMenuIcon.getIconHeight(),
BufferedImage.TYPE_INT_ARGB);
// Details Button Graphics graphics = image.getGraphics();
final JToggleButton detailsViewButton = new JToggleButton(detailsViewIcon); viewMenuIcon.paintIcon(filePane, graphics, 0, 0);
detailsViewButton.setToolTipText(detailsViewButtonToolTipText); int x = image.getWidth() - 5;
detailsViewButton.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY, int y = image.getHeight() / 2 - 1;
detailsViewButtonAccessibleName); graphics.setColor(Color.BLACK);
detailsViewButton.putClientProperty(WindowsLookAndFeel.HI_RES_DISABLED_ICON_CLIENT_KEY, graphics.fillPolygon(new int[]{x, x + 5, x + 2}, new int[]{y, y, y + 3}, 3);
Boolean.TRUE);
detailsViewButton.setFocusPainted(false); // Details Button
detailsViewButton.setAlignmentX(JComponent.LEFT_ALIGNMENT); final JButton viewMenuButton = createToolButton(null, new ImageIcon(image), viewMenuButtonToolTipText,
detailsViewButton.setAlignmentY(JComponent.CENTER_ALIGNMENT); viewMenuButtonAccessibleName);
detailsViewButton.setMargin(shrinkwrap);
detailsViewButton.addActionListener(filePane.getViewTypeAction(FilePane.VIEWTYPE_DETAILS)); viewMenuButton.addMouseListener(new MouseAdapter() {
topPanel.add(detailsViewButton); public void mousePressed(MouseEvent e) {
viewButtonGroup.add(detailsViewButton); if (SwingUtilities.isLeftMouseButton(e) && !viewMenuButton.isSelected()) {
viewMenuButton.setSelected(true);
topPanel.add(Box.createRigidArea(new Dimension(60, 0)));
viewTypePopupMenu.show(viewMenuButton, 0, viewMenuButton.getHeight());
filePane.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
if ("viewType".equals(e.getPropertyName())) {
int viewType = filePane.getViewType();
switch (viewType) {
case FilePane.VIEWTYPE_LIST:
listViewButton.setSelected(true);
break;
case FilePane.VIEWTYPE_DETAILS:
detailsViewButton.setSelected(true);
break;
}
}
} }
}); }
} else { // After Windows Me });
// View button group viewMenuButton.addKeyListener(new KeyAdapter() {
ButtonGroup viewButtonGroup = new ButtonGroup(); public void keyPressed(KeyEvent e) {
// Forbid keyboard actions if the button is not in rollover state
// Popup Menu if (e.getKeyCode() == KeyEvent.VK_SPACE && viewMenuButton.getModel().isRollover()) {
final JPopupMenu viewTypePopupMenu = new JPopupMenu(); viewMenuButton.setSelected(true);
final JRadioButtonMenuItem listViewMenuItem = new JRadioButtonMenuItem( viewTypePopupMenu.show(viewMenuButton, 0, viewMenuButton.getHeight());
filePane.getViewTypeAction(FilePane.VIEWTYPE_LIST));
listViewMenuItem.setSelected(filePane.getViewType() == FilePane.VIEWTYPE_LIST);
viewTypePopupMenu.add(listViewMenuItem);
viewButtonGroup.add(listViewMenuItem);
final JRadioButtonMenuItem detailsViewMenuItem = new JRadioButtonMenuItem(
filePane.getViewTypeAction(FilePane.VIEWTYPE_DETAILS));
detailsViewMenuItem.setSelected(filePane.getViewType() == FilePane.VIEWTYPE_DETAILS);
viewTypePopupMenu.add(detailsViewMenuItem);
viewButtonGroup.add(detailsViewMenuItem);
// Create icon for viewMenuButton
BufferedImage image = new BufferedImage(viewMenuIcon.getIconWidth() + 7, viewMenuIcon.getIconHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics graphics = image.getGraphics();
viewMenuIcon.paintIcon(filePane, graphics, 0, 0);
int x = image.getWidth() - 5;
int y = image.getHeight() / 2 - 1;
graphics.setColor(Color.BLACK);
graphics.fillPolygon(new int[]{x, x + 5, x + 2}, new int[]{y, y, y + 3}, 3);
// Details Button
final JButton viewMenuButton = new JButton(new ImageIcon(image));
viewMenuButton.setToolTipText(viewMenuButtonToolTipText);
viewMenuButton.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY, viewMenuButtonAccessibleName);
viewMenuButton.putClientProperty(WindowsLookAndFeel.HI_RES_DISABLED_ICON_CLIENT_KEY, Boolean.TRUE);
viewMenuButton.setFocusable(false);
viewMenuButton.setAlignmentX(JComponent.LEFT_ALIGNMENT);
viewMenuButton.setAlignmentY(JComponent.CENTER_ALIGNMENT);
viewMenuButton.setMargin(shrinkwrap);
viewMenuButton.setModel(new DefaultButtonModel() {
public void setPressed(boolean b) {
} }
}
});
viewTypePopupMenu.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
}
public void setArmed(boolean b) { public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
} SwingUtilities.invokeLater(new Runnable() {
public void run() {
viewMenuButton.setSelected(false);
}
});
}
public void setSelected(boolean b) { public void popupMenuCanceled(PopupMenuEvent e) {
super.setSelected(b); }
});
if (b) { topPanel.add(viewMenuButton);
stateMask |= PRESSED | ARMED;
} else {
stateMask &= ~(PRESSED | ARMED);
}
}
});
viewMenuButton.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
viewMenuButton.setSelected(!viewMenuButton.isSelected());
if (viewMenuButton.isSelected()) {
viewTypePopupMenu.show(viewMenuButton, 0, viewMenuButton.getHeight());
}
}
}
});
viewTypePopupMenu.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { topPanel.add(Box.createRigidArea(new Dimension(80, 0)));
SwingUtilities.invokeLater(new Runnable() {
public void run() {
viewMenuButton.setSelected(false);
}
});
}
public void popupMenuCanceled(PopupMenuEvent e) { filePane.addPropertyChangeListener(new PropertyChangeListener() {
} public void propertyChange(PropertyChangeEvent e) {
}); if ("viewType".equals(e.getPropertyName())) {
topPanel.add(viewMenuButton); switch (filePane.getViewType()) {
case FilePane.VIEWTYPE_LIST:
topPanel.add(Box.createRigidArea(new Dimension(80, 0))); listViewMenuItem.setSelected(true);
break;
filePane.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) { case FilePane.VIEWTYPE_DETAILS:
if ("viewType".equals(e.getPropertyName())) { detailsViewMenuItem.setSelected(true);
switch (filePane.getViewType()) { break;
case FilePane.VIEWTYPE_LIST:
listViewMenuItem.setSelected(true);
break;
case FilePane.VIEWTYPE_DETAILS:
detailsViewMenuItem.setSelected(true);
break;
}
} }
} }
}); }
} });
// ************************************** // // ************************************** //
// ******* Add the directory pane ******* // // ******* Add the directory pane ******* //
...@@ -622,19 +493,18 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { ...@@ -622,19 +493,18 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
// Decide whether to use the ShellFolder class to populate shortcut // Decide whether to use the ShellFolder class to populate shortcut
// panel and combobox. // panel and combobox.
JFileChooser fc = getFileChooser(); JFileChooser fc = getFileChooser();
if (OS_VERSION.compareTo(OSInfo.WINDOWS_ME) >= 0) {
if (FilePane.usesShellFolder(fc)) { if (FilePane.usesShellFolder(fc)) {
if (placesBar == null && !UIManager.getBoolean("FileChooser.noPlacesBar")) { if (placesBar == null && !UIManager.getBoolean("FileChooser.noPlacesBar")) {
placesBar = new WindowsPlacesBar(fc, XPStyle.getXP() != null); placesBar = new WindowsPlacesBar(fc, XPStyle.getXP() != null);
fc.add(placesBar, BorderLayout.BEFORE_LINE_BEGINS); fc.add(placesBar, BorderLayout.BEFORE_LINE_BEGINS);
fc.addPropertyChangeListener(placesBar); fc.addPropertyChangeListener(placesBar);
} }
} else { } else {
if (placesBar != null) { if (placesBar != null) {
fc.remove(placesBar); fc.remove(placesBar);
fc.removePropertyChangeListener(placesBar); fc.removePropertyChangeListener(placesBar);
placesBar = null; placesBar = null;
}
} }
} }
} }
...@@ -673,18 +543,9 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { ...@@ -673,18 +543,9 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
upFolderToolTipText = UIManager.getString("FileChooser.upFolderToolTipText",l); upFolderToolTipText = UIManager.getString("FileChooser.upFolderToolTipText",l);
upFolderAccessibleName = UIManager.getString("FileChooser.upFolderAccessibleName",l); upFolderAccessibleName = UIManager.getString("FileChooser.upFolderAccessibleName",l);
homeFolderToolTipText = UIManager.getString("FileChooser.homeFolderToolTipText",l);
homeFolderAccessibleName = UIManager.getString("FileChooser.homeFolderAccessibleName",l);
newFolderToolTipText = UIManager.getString("FileChooser.newFolderToolTipText",l); newFolderToolTipText = UIManager.getString("FileChooser.newFolderToolTipText",l);
newFolderAccessibleName = UIManager.getString("FileChooser.newFolderAccessibleName",l); newFolderAccessibleName = UIManager.getString("FileChooser.newFolderAccessibleName",l);
listViewButtonToolTipText = UIManager.getString("FileChooser.listViewButtonToolTipText",l);
listViewButtonAccessibleName = UIManager.getString("FileChooser.listViewButtonAccessibleName",l);
detailsViewButtonToolTipText = UIManager.getString("FileChooser.detailsViewButtonToolTipText",l);
detailsViewButtonAccessibleName = UIManager.getString("FileChooser.detailsViewButtonAccessibleName",l);
viewMenuButtonToolTipText = UIManager.getString("FileChooser.viewMenuButtonToolTipText",l); viewMenuButtonToolTipText = UIManager.getString("FileChooser.viewMenuButtonToolTipText",l);
viewMenuButtonAccessibleName = UIManager.getString("FileChooser.viewMenuButtonAccessibleName",l); viewMenuButtonAccessibleName = UIManager.getString("FileChooser.viewMenuButtonAccessibleName",l);
} }
...@@ -1052,6 +913,65 @@ public class WindowsFileChooserUI extends BasicFileChooserUI { ...@@ -1052,6 +913,65 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
return new DirectoryComboBoxRenderer(); return new DirectoryComboBoxRenderer();
} }
private static JButton createToolButton(Action a, Icon defaultIcon, String toolTipText, String accessibleName) {
final JButton result = new JButton(a);
result.setText(null);
result.setIcon(defaultIcon);
result.setToolTipText(toolTipText);
result.setRequestFocusEnabled(false);
result.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY, accessibleName);
result.putClientProperty(WindowsLookAndFeel.HI_RES_DISABLED_ICON_CLIENT_KEY, Boolean.TRUE);
result.setAlignmentX(JComponent.LEFT_ALIGNMENT);
result.setAlignmentY(JComponent.CENTER_ALIGNMENT);
result.setMargin(shrinkwrap);
result.setFocusPainted(false);
result.setModel(new DefaultButtonModel() {
public void setPressed(boolean b) {
// Forbid keyboard actions if the button is not in rollover state
if (!b || isRollover()) {
super.setPressed(b);
}
}
public void setRollover(boolean b) {
if (b && !isRollover()) {
// Reset other buttons
for (Component component : result.getParent().getComponents()) {
if (component instanceof JButton && component != result) {
((JButton) component).getModel().setRollover(false);
}
}
}
super.setRollover(b);
}
public void setSelected(boolean b) {
super.setSelected(b);
if (b) {
stateMask |= PRESSED | ARMED;
} else {
stateMask &= ~(PRESSED | ARMED);
}
}
});
result.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
result.getModel().setRollover(true);
}
public void focusLost(FocusEvent e) {
result.getModel().setRollover(false);
}
});
return result;
}
// //
// Renderer for DirectoryComboBox // Renderer for DirectoryComboBox
// //
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册