帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

200 lines
6.8 KiB

package com.fr.design.style;
import com.fine.theme.utils.FineUIScale;
import com.formdev.flatlaf.ui.FlatArrowButton;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.fr.design.event.HoverAware;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.style.background.BackgroundJComponent;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.UIManager;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import javax.swing.SwingConstants;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
/**
* @author kunsnat E-mail:kunsnat@gmail.com
* @version 创建时间:2011-10-31 下午03:28:31 类说明: 抽象出来的弹出box. 可以弹出颜色选择, 图案选择, 纹理选择.
* 主要是 弹出界面的不同
*/
public abstract class AbstractSelectBox<T> extends AbstractPopBox implements MouseListener, HoverAware {
private static final String UI_CLASS_ID = "SelectBoxUI";
private static final long serialVersionUID = 2355250206956896774L;
private boolean rollOver;
private JButton triggerButton;
protected void initBox(int preWidth) {
// 初始化面板布局
this.setLayout(FRGUIPaneFactory.createBorderLayout());
// 初始化组件
displayComponent = new BackgroundJComponent();
triggerButton = new SelectBoxButton();
// 初始化组件布局
JPanel displayPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
displayPane.setBorder(null);
displayPane.setOpaque(false);
displayPane.add(displayComponent, BorderLayout.CENTER);
displayComponent.setSize(new Dimension(FineUIScale.scale(preWidth), displayPane.getPreferredSize().height));
// 添加事件监听
displayComponent.addMouseListener(mouseListener);
triggerButton.addMouseListener(mouseListener);
displayComponent.addMouseListener(this);
triggerButton.addMouseListener(this);
this.add(displayPane, BorderLayout.CENTER);
this.add(triggerButton, BorderLayout.EAST);
this.addAncestorListener(new AncestorListener() {
public void ancestorAdded(AncestorEvent event) {
}
public void ancestorRemoved(AncestorEvent evt) {
hidePopupMenu();
}
public void ancestorMoved(AncestorEvent event) {
hidePopupMenu();
}
});
displayComponent.addMouseListener(new MouseAdapter() {
@Override
public void mouseExited(MouseEvent e) {
if (!isPopupVisible()) {
//如果弹出框==null 或者 弹出框不可见 直接return
return;
}
Point popMenuP = getControlWindow().getLocation();
Point displayComponentP = displayComponent.getLocationOnScreen();
if (popMenuP.getX() < displayComponentP.getX() - 1) {
//如果 弹出框横向超出屏幕 往左调整了 和displayComponent横向错开 就不处理了
return;
}
Rectangle rectangle = displayComponent.getBounds();
boolean bottomPopAndExitTop = displayComponentP.getY() < popMenuP.getY() && e.getY() <= rectangle.y;
boolean topPopAndExitBottom = displayComponentP.getY() > popMenuP.getY() && e.getY() >= rectangle.y + rectangle.getHeight();
boolean exitLeftOrRight = rectangle.x > e.getX() || rectangle.x + rectangle.getWidth() < e.getX();
if (bottomPopAndExitTop || topPopAndExitBottom || exitLeftOrRight) {
//弹出框在displayComponent下面 且 鼠标是从displayComponent上面离开的,隐藏弹出界面。
//弹出框在displayComponent上面 且 鼠标是从displayComponent下面离开的,隐藏弹出界面。
//鼠标从displayComponent左边 或者 右边 离开,隐藏弹出界面。
hidePopupMenu();
}
}
});
}
@Override
public String getUIClassID() {
return UI_CLASS_ID;
}
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
displayComponent.setEnabled(enabled);
triggerButton.setEnabled(enabled);
}
@Override
public JPanel initWindowPane(double preWidth) {
return null;
}
@Override
public void paint(Graphics g) {
super.paint(g);
triggerButton.setSelected(isPopupVisible());
}
/**
* 应用于SelectBox的右侧按钮
*/
protected class SelectBoxButton extends FlatArrowButton {
protected SelectBoxButton() {
this(SwingConstants.SOUTH,
UIManager.getString("Component.arrowType"),
UIManager.getColor("ComboBox.buttonArrowColor"),
UIManager.getColor("ComboBox.buttonDisabledArrowColor"),
null, null, null, null);
}
protected SelectBoxButton(int direction, String type, Color foreground, Color disabledForeground,
Color hoverForeground, Color hoverBackground, Color pressedForeground, Color pressedBackground) {
super(direction, type, foreground, disabledForeground,
hoverForeground, hoverBackground, pressedForeground, pressedBackground);
}
@Override
protected void paintArrow(Graphics2D g) {
if (isPopupVisible()) {
setDirection(SwingConstants.NORTH);
} else {
setDirection(SwingConstants.SOUTH);
}
super.paintArrow(g);
}
@Override
public Dimension getPreferredSize() {
int outerHeight = FlatUIUtils.getUIInt("ComboBox.height", 24);
int buttonSize = FineUIScale.scale(outerHeight -
2 * FlatUIUtils.getUIInt("Component.borderWidth", 1));
return new Dimension(buttonSize, buttonSize);
}
}
public abstract T getSelectObject();
public abstract void setSelectObject(T t);
@Override
public void mouseEntered(MouseEvent e) {
rollOver = true;
repaint();
}
@Override
public void mouseExited(MouseEvent e) {
rollOver = false;
repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public boolean isHovered() {
return rollOver;
}
}