提交 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.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -43,7 +43,6 @@ import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.awt.shell.ShellFolder;
import sun.awt.OSInfo;
import sun.swing.*;
import javax.accessibility.*;
......@@ -58,8 +57,6 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
// The following are private because the implementation of the
// Windows FileChooser L&F is not complete yet.
private static final OSInfo.WindowsVersion OS_VERSION = OSInfo.getWindowsVersion();
private JPanel centerPanel;
private JLabel lookInLabel;
......@@ -118,18 +115,9 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
private String upFolderToolTipText = null;
private String upFolderAccessibleName = null;
private String homeFolderToolTipText = null;
private String homeFolderAccessibleName = null;
private String newFolderToolTipText = 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 viewMenuButtonAccessibleName = null;
......@@ -231,9 +219,7 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
// Directory manipulation buttons
JToolBar topPanel = new JToolBar();
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
fc.add(topPanel, BorderLayout.NORTH);
......@@ -287,218 +273,103 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
topPanel.add(Box.createRigidArea(hstrut10));
// Up Button
JButton upFolderButton = new JButton(getChangeToParentDirectoryAction());
upFolderButton.setText(null);
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);
JButton upFolderButton = createToolButton(getChangeToParentDirectoryAction(), upFolderIcon,
upFolderToolTipText, upFolderAccessibleName);
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
if (!UIManager.getBoolean("FileChooser.readOnly")) {
b = new JButton(filePane.getNewFolderAction());
b.setText(null);
b.setIcon(newFolderIcon);
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);
JButton newFolderButton = createToolButton(filePane.getNewFolderAction(), newFolderIcon,
newFolderToolTipText, newFolderAccessibleName);
topPanel.add(newFolderButton);
}
if (OS_VERSION.compareTo(OSInfo.WINDOWS_ME) < 0) {
topPanel.add(Box.createRigidArea(hstrut10));
// View button group
ButtonGroup viewButtonGroup = new ButtonGroup();
// List Button
final JToggleButton listViewButton = new JToggleButton(listViewIcon);
listViewButton.setToolTipText(listViewButtonToolTipText);
listViewButton.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY,
listViewButtonAccessibleName);
listViewButton.putClientProperty(WindowsLookAndFeel.HI_RES_DISABLED_ICON_CLIENT_KEY,
Boolean.TRUE);
listViewButton.setFocusPainted(false);
listViewButton.setSelected(true);
listViewButton.setAlignmentX(JComponent.LEFT_ALIGNMENT);
listViewButton.setAlignmentY(JComponent.CENTER_ALIGNMENT);
listViewButton.setMargin(shrinkwrap);
listViewButton.addActionListener(filePane.getViewTypeAction(FilePane.VIEWTYPE_LIST));
topPanel.add(listViewButton);
viewButtonGroup.add(listViewButton);
// Details Button
final JToggleButton detailsViewButton = new JToggleButton(detailsViewIcon);
detailsViewButton.setToolTipText(detailsViewButtonToolTipText);
detailsViewButton.putClientProperty(AccessibleContext.ACCESSIBLE_NAME_PROPERTY,
detailsViewButtonAccessibleName);
detailsViewButton.putClientProperty(WindowsLookAndFeel.HI_RES_DISABLED_ICON_CLIENT_KEY,
Boolean.TRUE);
detailsViewButton.setFocusPainted(false);
detailsViewButton.setAlignmentX(JComponent.LEFT_ALIGNMENT);
detailsViewButton.setAlignmentY(JComponent.CENTER_ALIGNMENT);
detailsViewButton.setMargin(shrinkwrap);
detailsViewButton.addActionListener(filePane.getViewTypeAction(FilePane.VIEWTYPE_DETAILS));
topPanel.add(detailsViewButton);
viewButtonGroup.add(detailsViewButton);
topPanel.add(Box.createRigidArea(new Dimension(60, 0)));
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;
}
}
// View button group
ButtonGroup viewButtonGroup = new ButtonGroup();
// Popup Menu
final JPopupMenu viewTypePopupMenu = new JPopupMenu();
final JRadioButtonMenuItem listViewMenuItem = new JRadioButtonMenuItem(
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 = createToolButton(null, new ImageIcon(image), viewMenuButtonToolTipText,
viewMenuButtonAccessibleName);
viewMenuButton.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e) && !viewMenuButton.isSelected()) {
viewMenuButton.setSelected(true);
viewTypePopupMenu.show(viewMenuButton, 0, viewMenuButton.getHeight());
}
});
} else { // After Windows Me
// View button group
ButtonGroup viewButtonGroup = new ButtonGroup();
// Popup Menu
final JPopupMenu viewTypePopupMenu = new JPopupMenu();
final JRadioButtonMenuItem listViewMenuItem = new JRadioButtonMenuItem(
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) {
}
});
viewMenuButton.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
// Forbid keyboard actions if the button is not in rollover state
if (e.getKeyCode() == KeyEvent.VK_SPACE && viewMenuButton.getModel().isRollover()) {
viewMenuButton.setSelected(true);
viewTypePopupMenu.show(viewMenuButton, 0, viewMenuButton.getHeight());
}
}
});
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) {
super.setSelected(b);
public void popupMenuCanceled(PopupMenuEvent e) {
}
});
if (b) {
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) {
}
topPanel.add(viewMenuButton);
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
viewMenuButton.setSelected(false);
}
});
}
topPanel.add(Box.createRigidArea(new Dimension(80, 0)));
public void popupMenuCanceled(PopupMenuEvent e) {
}
});
topPanel.add(viewMenuButton);
topPanel.add(Box.createRigidArea(new Dimension(80, 0)));
filePane.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
if ("viewType".equals(e.getPropertyName())) {
switch (filePane.getViewType()) {
case FilePane.VIEWTYPE_LIST:
listViewMenuItem.setSelected(true);
break;
case FilePane.VIEWTYPE_DETAILS:
detailsViewMenuItem.setSelected(true);
break;
}
filePane.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
if ("viewType".equals(e.getPropertyName())) {
switch (filePane.getViewType()) {
case FilePane.VIEWTYPE_LIST:
listViewMenuItem.setSelected(true);
break;
case FilePane.VIEWTYPE_DETAILS:
detailsViewMenuItem.setSelected(true);
break;
}
}
});
}
}
});
// ************************************** //
// ******* Add the directory pane ******* //
......@@ -622,19 +493,18 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
// Decide whether to use the ShellFolder class to populate shortcut
// panel and combobox.
JFileChooser fc = getFileChooser();
if (OS_VERSION.compareTo(OSInfo.WINDOWS_ME) >= 0) {
if (FilePane.usesShellFolder(fc)) {
if (placesBar == null && !UIManager.getBoolean("FileChooser.noPlacesBar")) {
placesBar = new WindowsPlacesBar(fc, XPStyle.getXP() != null);
fc.add(placesBar, BorderLayout.BEFORE_LINE_BEGINS);
fc.addPropertyChangeListener(placesBar);
}
} else {
if (placesBar != null) {
fc.remove(placesBar);
fc.removePropertyChangeListener(placesBar);
placesBar = null;
}
if (FilePane.usesShellFolder(fc)) {
if (placesBar == null && !UIManager.getBoolean("FileChooser.noPlacesBar")) {
placesBar = new WindowsPlacesBar(fc, XPStyle.getXP() != null);
fc.add(placesBar, BorderLayout.BEFORE_LINE_BEGINS);
fc.addPropertyChangeListener(placesBar);
}
} else {
if (placesBar != null) {
fc.remove(placesBar);
fc.removePropertyChangeListener(placesBar);
placesBar = null;
}
}
}
......@@ -673,18 +543,9 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
upFolderToolTipText = UIManager.getString("FileChooser.upFolderToolTipText",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);
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);
viewMenuButtonAccessibleName = UIManager.getString("FileChooser.viewMenuButtonAccessibleName",l);
}
......@@ -1052,6 +913,65 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
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
//
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册