📄 basictaskpanegroupui.java
字号:
/**
* $ $ License.
*
* Copyright $ L2FProd.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.l2fprod.common.swing.plaf.basic;
import com.l2fprod.common.swing.JCollapsiblePane;
import com.l2fprod.common.swing.JLinkButton;
import com.l2fprod.common.swing.JTaskPaneGroup;
import com.l2fprod.common.swing.icons.EmptyIcon;
import com.l2fprod.common.swing.plaf.TaskPaneGroupUI;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.LookAndFeel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.event.MouseInputAdapter;
import javax.swing.event.MouseInputListener;
import javax.swing.plaf.ActionMapUIResource;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicGraphicsUtils;
/**
* Base implementation of the <code>JTaskPaneGroup</code> UI.
*/
public class BasicTaskPaneGroupUI extends TaskPaneGroupUI {
private static FocusListener focusListener = new RepaintOnFocus();
public static ComponentUI createUI(JComponent c) {
return new BasicTaskPaneGroupUI();
}
protected static int TITLE_HEIGHT = 25;
protected static int ROUND_HEIGHT = 5;
protected JTaskPaneGroup group;
protected boolean mouseOver;
protected MouseInputListener mouseListener;
protected PropertyChangeListener propertyListener;
public void installUI(JComponent c) {
super.installUI(c);
group = (JTaskPaneGroup)c;
installDefaults();
installListeners();
installKeyboardActions();
}
protected void installDefaults() {
group.setOpaque(true);
group.setBorder(createPaneBorder());
((JComponent)group.getContentPane()).setBorder(createContentPaneBorder());
LookAndFeel.installColorsAndFont(
group,
"TaskPaneGroup.background",
"TaskPaneGroup.foreground",
"TaskPaneGroup.font");
LookAndFeel.installColorsAndFont(
(JComponent)group.getContentPane(),
"TaskPaneGroup.background",
"TaskPaneGroup.foreground",
"TaskPaneGroup.font");
}
protected void installListeners() {
mouseListener = createMouseInputListener();
group.addMouseMotionListener(mouseListener);
group.addMouseListener(mouseListener);
group.addFocusListener(focusListener);
propertyListener = createPropertyListener();
group.addPropertyChangeListener(propertyListener);
}
protected void installKeyboardActions() {
InputMap inputMap = (InputMap)UIManager.get("TaskPaneGroup.focusInputMap");
if (inputMap != null) {
SwingUtilities.replaceUIInputMap(
group,
JComponent.WHEN_FOCUSED,
inputMap);
}
ActionMap map = getActionMap();
if (map != null) {
SwingUtilities.replaceUIActionMap(group, map);
}
}
ActionMap getActionMap() {
ActionMap map = new ActionMapUIResource();
map.put("toggleExpanded", new ToggleExpandedAction());
return map;
}
public void uninstallUI(JComponent c) {
uninstallListeners();
super.uninstallUI(c);
}
protected void uninstallListeners() {
group.removeMouseListener(mouseListener);
group.removeMouseMotionListener(mouseListener);
group.removeFocusListener(focusListener);
group.removePropertyChangeListener(propertyListener);
}
protected MouseInputListener createMouseInputListener() {
return new ToggleListener();
}
protected PropertyChangeListener createPropertyListener() {
return new ChangeListener();
}
protected boolean isInBorder(MouseEvent event) {
return event.getY() < getTitleHeight();
}
protected final int getTitleHeight() {
return TITLE_HEIGHT;
}
protected Border createPaneBorder() {
return new PaneBorder();
}
public Dimension getPreferredSize(JComponent c) {
Component component = group.getComponent(0);
if (!(component instanceof JCollapsiblePane)) {
// something wrong in this JTaskPaneGroup
return super.getPreferredSize(c);
}
JCollapsiblePane collapsible = (JCollapsiblePane)component;
Dimension dim = collapsible.getPreferredSize();
Border groupBorder = group.getBorder();
if (groupBorder instanceof PaneBorder) {
Dimension border = ((PaneBorder)groupBorder).getPreferredSize(group);
dim.width = Math.max(dim.width, border.width);
dim.height += border.height;
} else {
dim.height += getTitleHeight();
}
return dim;
}
protected Border createContentPaneBorder() {
Color borderColor = UIManager.getColor("TaskPaneGroup.borderColor");
return new CompoundBorder(new ContentPaneBorder(borderColor), BorderFactory
.createEmptyBorder(10, 10, 10, 10));
}
public Component createAction(Action action) {
JLinkButton button = new JLinkButton(action);
button.setOpaque(false);
button.setBorder(null);
button.setBorderPainted(false);
button.setFocusPainted(true);
button.setForeground(UIManager.getColor("TaskPaneGroup.titleForeground"));
return button;
}
protected void ensureVisible() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
group.scrollRectToVisible(
new Rectangle(group.getWidth(), group.getHeight()));
}
});
}
static class RepaintOnFocus implements FocusListener {
public void focusGained(FocusEvent e) {
e.getComponent().repaint();
}
public void focusLost(FocusEvent e) {
e.getComponent().repaint();
}
}
class ChangeListener implements PropertyChangeListener {
public void propertyChange(PropertyChangeEvent evt) {
// if group is expanded but not animated
// or if animated has reached expanded state
// scroll to visible if scrollOnExpand is enabled
if ((JTaskPaneGroup.EXPANDED_CHANGED_KEY.equals(evt.getPropertyName()) && Boolean.TRUE
.equals(evt.getNewValue()) && !group.isAnimated())
|| (JCollapsiblePane.ANIMATION_STATE_KEY.equals(evt.getPropertyName()) && "expanded"
.equals(evt.getNewValue()))) {
if (group.isScrollOnExpand()) {
ensureVisible();
}
}
}
}
class ToggleListener extends MouseInputAdapter {
public void mouseEntered(MouseEvent e) {
if (isInBorder(e)) {
e.getComponent().setCursor(
Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
} else {
mouseOver = false;
group.repaint();
}
}
public void mouseExited(MouseEvent e) {
e.getComponent().setCursor(Cursor.getDefaultCursor());
mouseOver = false;
group.repaint();
}
public void mouseMoved(MouseEvent e) {
if (isInBorder(e)) {
e.getComponent().setCursor(
Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
mouseOver = true;
group.repaint();
} else {
e.getComponent().setCursor(Cursor.getDefaultCursor());
mouseOver = false;
group.repaint();
}
}
public void mouseReleased(MouseEvent e) {
if (isInBorder(e)) {
group.setExpanded(!group.isExpanded());
}
}
}
class ToggleExpandedAction extends AbstractAction {
public ToggleExpandedAction() {
super("toggleExpanded");
}
public void actionPerformed(ActionEvent e) {
group.setExpanded(!group.isExpanded());
}
public boolean isEnabled() {
return group.isVisible();
}
}
protected static class ChevronIcon implements Icon {
boolean up = true;
public ChevronIcon(boolean up) {
this.up = up;
}
public int getIconHeight() {
return 3;
}
public int getIconWidth() {
return 6;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -