帆软报表设计器源代码。
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.
 
 
 
 

308 lines
11 KiB

package com.fr.design.actions.cell;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.Icon;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSeparator;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;
import com.fr.base.BaseUtils;
import com.fr.base.CellBorderStyle;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ibutton.UICombinationButton;
import com.fr.design.gui.ipoppane.PopupHider;
import com.fr.design.icon.BorderIcon;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.style.BorderUtils;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.general.Inter;
import com.fr.design.mainframe.ElementCasePane;
import com.fr.stable.Constants;
import com.fr.design.style.BorderPane;
import com.fr.design.style.color.TransparentPane;
import com.fr.design.utils.gui.GUICoreUtils;
/**
* 这个Pane用来显示常用边框和设置自定义边框
*
* @author richer
*
*/
public class UIToolbarBorderButton extends UICombinationButton implements PopupHider {
private EventListenerList styleChangeListenerList = new EventListenerList();
private boolean isCanBeNull = false;
private ElementCasePane reportPane;
private JPopupMenu popupWin;
public UIToolbarBorderButton(Icon icon, ElementCasePane reportPane) {
super(new UIButton(icon), new UIButton(BaseUtils.readIcon("/com/fr/design/images/gui/popup.gif")));
this.reportPane = reportPane;
}
public CellBorderStyle getCellBorderStyle() {
return this.cellBorderStyle;
}
public void setCellBorderStyle(CellBorderStyle cellBorderStyle) {
this.cellBorderStyle = cellBorderStyle;
this.leftButton.setIcon(new BorderIcon(cellBorderStyle));
fireStyleStateChanged();
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (!enabled) {
cellBorderStyle = null;
}
leftButton.setEnabled(enabled);
rightButton.setEnabled(enabled);
}
@Override
public void setToolTipText(String tooltipText) {
super.setToolTipText(tooltipText);
leftButton.setToolTipText(tooltipText);
rightButton.setToolTipText(tooltipText);
}
private void showPopupMenu() {
if (popupWin != null && popupWin.isVisible()) {
hidePopupMenu();
return;
}
if (!this.isEnabled()) {
return;
}
popupWin = this.getActionPopupMenu();
GUICoreUtils.showPopupMenu(popupWin, this, 0, this.getSize().height);
}
protected JPopupMenu getActionPopupMenu() {
if (this.popupWin == null) {
this.popupWin = new BorderStyleControlWindow(this.isCanBeNull());
}
return popupWin;
}
protected void leftButtonClickEvent() {
UIToolbarBorderButton.this.cellBorderStyle = ((BorderIcon)getLeftButton().getIcon()).cellBorderStyle;
UIToolbarBorderButton.this.fireStyleStateChanged();
}
@Override
protected void rightButtonClickEvent() {
showPopupMenu();
}
class BorderStyleControlWindow extends JPopupMenu {
/**
* Constructor
*/
public BorderStyleControlWindow(boolean isSupportTransparent) {
this.initComponents(isSupportTransparent);
}
public void initComponents(boolean isSupportTransparent) {
setLightWeightPopupEnabled(JPopupMenu.getDefaultLightWeightPopupEnabled());
this.setLayout(FRGUIPaneFactory.createBorderLayout());
setBorderPainted(true);
setBorder(UIManager.getBorder("PopupMenu.border"));
setOpaque(false);
setDoubleBuffered(true);
setFocusable(false);
this.add(new NormalBorderPane(isSupportTransparent, UIToolbarBorderButton.this), BorderLayout.CENTER);
this.pack();
}
}
// richer:常用边框线类型展现面板
class NormalBorderPane extends TransparentPane {
PopupHider popupHider;
public NormalBorderPane(boolean isSupportTransparent, PopupHider popupHider) {
super(isSupportTransparent);
this.popupHider = popupHider;
}
@Override
public void initCenterPaneChildren(JPanel centerPane) {
JPanel menuColorPane = new /**/JPanel();
centerPane.add(menuColorPane);
menuColorPane.setLayout(new /**/GridLayout(3, 4, 2, 2));
for (int i = 0; i < borderStyleArray.length; i++) {
final UIButton borderStyleCell = new UIButton(new BorderIcon(borderStyleArray[i]));
borderStyleCell.set4ToolbarButton();
borderStyleCell.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
UIButton toolBarButton = (UIButton) e.getSource();
if (toolBarButton.getIcon() instanceof BorderIcon) {
BorderIcon borderIcon = (BorderIcon) toolBarButton.getIcon();
UIToolbarBorderButton.this.setCellBorderStyle(borderIcon.cellBorderStyle);
hidePopupMenu();
} else {
UIToolbarBorderButton.this.setCellBorderStyle(borderStyleArray[0]);
}
}
});
borderStyleCell.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
borderStyleCell.setBorder(BorderFactory.createEtchedBorder());
}
@Override
public void mouseExited(MouseEvent e) {
borderStyleCell.setBorder(null);
}
});
borderStyleCell.setToolTipText(BorderStyleTooltips[i]);
menuColorPane.add(borderStyleCell);
}
centerPane.add(Box.createVerticalStrut(5));
centerPane.add(new JSeparator());
centerPane.add(Box.createVerticalStrut(5));
}
@Override
public void doTransparent() {
UIToolbarBorderButton.this.setCellBorderStyle(null);
popupHider.hidePopupMenu();
}
@Override
public void customButtonPressed() {
popupHider.hidePopupMenu();
final BorderPane borderPane = new BorderPane();
BasicDialog borderDialog = borderPane.showWindow(SwingUtilities.getWindowAncestor(reportPane));
Object[] fourObjectArray = BorderUtils.createCellBorderObject(reportPane);
if (fourObjectArray != null && fourObjectArray.length == 4) {
borderPane.populate((CellBorderStyle) fourObjectArray[0], ((Boolean) fourObjectArray[1]).booleanValue(),
((Integer) fourObjectArray[2]).intValue(), (Color) fourObjectArray[3]);
}
borderDialog.addDialogActionListener(new DialogActionAdapter() {
@Override
public void doOk() {
CellBorderStyle cellBorderStyle = borderPane.update();
UIToolbarBorderButton.this.setCellBorderStyle(cellBorderStyle);
}
});
borderDialog.setVisible(true);
}
@Override
protected String title4PopupWindow() {
return Inter.getLocText("Border");
}
}
/**
* Adds a new StyleChangeListener
*/
public void addStyleChangeListener(ChangeListener changeListener) {
styleChangeListenerList.add(ChangeListener.class, changeListener);
}
/**
* Removes an old StyleChangeListener.
*/
public void removeColorChangeListener(ChangeListener changeListener) {
styleChangeListenerList.remove(ChangeListener.class, changeListener);
}
/**
*
*/
public void fireStyleStateChanged() {
Object[] listeners = styleChangeListenerList.getListenerList();
ChangeEvent e = null;
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == ChangeListener.class) {
if (e == null) {
e = new ChangeEvent(this);
}
((ChangeListener) listeners[i + 1]).stateChanged(e);
}
}
}
public boolean isCanBeNull() {
return this.isCanBeNull;
}
public void setCanBeNull(boolean isCanBeNull) {
this.isCanBeNull = isCanBeNull;
}
private CellBorderStyle cellBorderStyle = new CellBorderStyle();
private static final CellBorderStyle[] borderStyleArray = {
new CellBorderStyle(),
new CellBorderStyle(Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_THIN, Color.black,
Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE),
new CellBorderStyle(Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_THIN, Color.black, Constants.LINE_NONE, Color.black,
Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE),
new CellBorderStyle(Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black,
Constants.LINE_THIN, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE),
new CellBorderStyle(Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_DOUBLE, Color.black,
Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE),
new CellBorderStyle(Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_THICK, Color.black,
Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE),
new CellBorderStyle(Color.black, Constants.LINE_THIN, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_THIN, Color.black,
Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE),
new CellBorderStyle(Color.black, Constants.LINE_THIN, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_DOUBLE, Color.black,
Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE),
new CellBorderStyle(Color.black, Constants.LINE_THIN, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_THICK, Color.black,
Constants.LINE_NONE, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE),
new CellBorderStyle(Color.black, Constants.LINE_THIN, Color.black, Constants.LINE_THIN, Color.black, Constants.LINE_THIN, Color.black,
Constants.LINE_THIN, Color.black, Constants.LINE_THIN, Color.black, Constants.LINE_THIN),
new CellBorderStyle(Color.black, Constants.LINE_THIN, Color.black, Constants.LINE_THIN, Color.black, Constants.LINE_THIN, Color.black,
Constants.LINE_THIN, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE),
new CellBorderStyle(Color.black, Constants.LINE_THICK, Color.black, Constants.LINE_THICK, Color.black, Constants.LINE_THICK, Color.black,
Constants.LINE_THICK, Color.black, Constants.LINE_NONE, Color.black, Constants.LINE_NONE) };
private static final String[] BorderStyleTooltips = { Inter.getLocText("NO_Border_Line"), Inter.getLocText("Bottom_Border_Line"),
Inter.getLocText("Left_Border_Line"), Inter.getLocText("Right_Border_Line"), Inter.getLocText("Double_Bottom_BorderLine"),
Inter.getLocText("Thick_Bottom_Border_Line"), Inter.getLocText("Top_Bottom_Border_Line"),
Inter.getLocText("Top_And_Double_Bottom_Border_Line"), Inter.getLocText("Top_And_Thick_Bottom_Border_Line"),
Inter.getLocText("All_Border_Line"), Inter.getLocText("Out_Border_Line"), Inter.getLocText("Out_Thick_Border_Line") };
@Override
public void hidePopupMenu() {
if (popupWin != null) {
popupWin.setVisible(false);
}
popupWin = null;
}
}