|
|
|
/*
|
|
|
|
* Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved.
|
|
|
|
*/
|
|
|
|
package com.fr.design.style;
|
|
|
|
|
|
|
|
import com.fine.theme.icon.LazyIcon;
|
|
|
|
import com.fine.theme.utils.FineUIScale;
|
|
|
|
import com.fine.theme.utils.FineUIUtils;
|
|
|
|
import com.formdev.flatlaf.ui.FlatUIUtils;
|
|
|
|
import com.fr.base.BaseUtils;
|
|
|
|
import com.fr.base.CellBorderStyle;
|
|
|
|
import com.fr.base.GraphHelper;
|
|
|
|
import com.fr.base.Style;
|
|
|
|
import com.fr.design.dialog.BasicPane;
|
|
|
|
import com.fr.design.gui.ibutton.UIButton;
|
|
|
|
import com.fr.design.gui.icombobox.LineComboBox;
|
|
|
|
import com.fr.design.gui.ilable.UILabel;
|
|
|
|
import com.fr.design.layout.FRGUIPaneFactory;
|
|
|
|
import com.fr.design.style.color.NewColorSelectBox;
|
|
|
|
import com.fr.log.FineLoggerFactory;
|
|
|
|
import com.fr.stable.Constants;
|
|
|
|
import com.fr.stable.CoreConstants;
|
|
|
|
import com.fr.stable.StringUtils;
|
|
|
|
|
|
|
|
import javax.swing.AbstractButton;
|
|
|
|
import javax.swing.BorderFactory;
|
|
|
|
import javax.swing.Icon;
|
|
|
|
import javax.swing.JComponent;
|
|
|
|
import javax.swing.JPanel;
|
|
|
|
import javax.swing.JToggleButton;
|
|
|
|
import javax.swing.event.ChangeEvent;
|
|
|
|
import javax.swing.event.ChangeListener;
|
|
|
|
import javax.swing.event.EventListenerList;
|
|
|
|
import java.awt.Color;
|
|
|
|
import java.awt.Component;
|
|
|
|
import java.awt.Dimension;
|
|
|
|
import java.awt.Graphics;
|
|
|
|
import java.awt.Graphics2D;
|
|
|
|
import java.awt.event.ActionEvent;
|
|
|
|
import java.awt.event.ActionListener;
|
|
|
|
import java.awt.event.ItemEvent;
|
|
|
|
import java.awt.event.ItemListener;
|
|
|
|
import java.awt.event.MouseAdapter;
|
|
|
|
import java.awt.event.MouseEvent;
|
|
|
|
|
|
|
|
import static com.fine.swing.ui.layout.Layouts.cell;
|
|
|
|
import static com.fine.swing.ui.layout.Layouts.column;
|
|
|
|
import static com.fine.swing.ui.layout.Layouts.flex;
|
|
|
|
import static com.fine.swing.ui.layout.Layouts.row;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* CellBorder Pane.
|
|
|
|
*/
|
|
|
|
public class BorderPane extends BasicPane {
|
|
|
|
// Constants used to set active borders
|
|
|
|
private static final int NO_BORDERS = 0;
|
|
|
|
private static final int EXTERNAL_BORDERS = 1;
|
|
|
|
private static final int INSIDE_BORDERS = 2;
|
|
|
|
|
|
|
|
private static final int TOP_BORDER = 3;
|
|
|
|
private static final int LEFT_BORDER = 4;
|
|
|
|
private static final int BOTTOM_BORDER = 5;
|
|
|
|
private static final int RIGHT_BORDER = 6;
|
|
|
|
private static final int VERTICAL_BORDER = 7;
|
|
|
|
private static final int HORIZONTAL_BORDER = 8;
|
|
|
|
|
|
|
|
private boolean insideMode = false;
|
|
|
|
|
|
|
|
private CellBorderStyle cellBorderStyle = new CellBorderStyle();
|
|
|
|
|
|
|
|
// private BorderButton insideBorderButton;
|
|
|
|
|
|
|
|
private BorderComponent borderComponent;
|
|
|
|
private JToggleButton topToggleButton;
|
|
|
|
private JToggleButton horizontalToggleButton;
|
|
|
|
private JToggleButton bottomToggleButton;
|
|
|
|
private JToggleButton leftToggleButton;
|
|
|
|
private JToggleButton verticalToggleButton;
|
|
|
|
private JToggleButton rightToggleButton;
|
|
|
|
|
|
|
|
private LineComboBox currentLineCombo;
|
|
|
|
private NewColorSelectBox currentLineColorPane;
|
|
|
|
|
|
|
|
private JToggleButton insidebutton;
|
|
|
|
|
|
|
|
public BorderPane() {
|
|
|
|
this.initComponents();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void initComponents() {
|
|
|
|
initBasicComponents();
|
|
|
|
JPanel borderAllControlPane = initButtonPanel();
|
|
|
|
JPanel borderLeftPane = column(5, flex(), cell(topToggleButton), cell(horizontalToggleButton), cell(bottomToggleButton), flex()).getComponent();
|
|
|
|
JPanel borderBottomPane = row(5, flex(), cell(leftToggleButton), cell(verticalToggleButton), cell(rightToggleButton), flex()).getComponent();
|
|
|
|
this.currentLineColorPane.setSelectObject(Color.BLUE);
|
|
|
|
Component northPane1 = initNorthPanel();
|
|
|
|
Component centerPane1 = FineUIUtils.wrapComponentWithTitle(row(5, cell(borderLeftPane),
|
|
|
|
column(5, row(flex(), cell(borderAllControlPane),flex()), cell(borderComponent)
|
|
|
|
.with(it -> it.setPreferredSize(FineUIScale.scale(new Dimension(600, 300)))), cell(borderBottomPane))
|
|
|
|
).getComponent(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview"));
|
|
|
|
this.add(column(10, cell(northPane1), cell(centerPane1)).getComponent());
|
|
|
|
}
|
|
|
|
|
|
|
|
private void initBasicComponents() {
|
|
|
|
borderComponent = new BorderComponent();
|
|
|
|
topToggleButton = new ToggleButton(new LazyIcon("top"), BorderPane.TOP_BORDER, false);
|
|
|
|
horizontalToggleButton = new ToggleButton(new LazyIcon("horizontal"), BorderPane.HORIZONTAL_BORDER, false);
|
|
|
|
bottomToggleButton = new ToggleButton(new LazyIcon("bottom"), BorderPane.BOTTOM_BORDER, false);
|
|
|
|
leftToggleButton = new ToggleButton(new LazyIcon("left"), BorderPane.LEFT_BORDER, true);
|
|
|
|
verticalToggleButton = new ToggleButton(new LazyIcon("vertical"), BorderPane.VERTICAL_BORDER, true);
|
|
|
|
rightToggleButton = new ToggleButton(new LazyIcon("right"), BorderPane.RIGHT_BORDER, true);
|
|
|
|
this.currentLineCombo = new LineComboBox(CoreConstants.UNDERLINE_STYLE_ARRAY);
|
|
|
|
this.currentLineColorPane = new NewColorSelectBox(100);
|
|
|
|
this.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
|
|
|
|
this.setLayout(FRGUIPaneFactory.createBorderLayout());
|
|
|
|
borderComponent.addBorderChangeListener(new ChangeListener() {
|
|
|
|
public void stateChanged(ChangeEvent e) {
|
|
|
|
fireStateChanged();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
private JPanel initButtonPanel() {
|
|
|
|
JToggleButton button1 = createVerButtonPane(NO_BORDERS, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"));
|
|
|
|
JToggleButton button2 = createVerButtonPane(EXTERNAL_BORDERS, "");
|
|
|
|
JToggleButton button3 = createVerButtonPane(INSIDE_BORDERS, "");
|
|
|
|
ItemListener itemListener = e -> {
|
|
|
|
AbstractButton button = (AbstractButton) e.getSource();
|
|
|
|
if (e.getStateChange() == ItemEvent.SELECTED) {
|
|
|
|
if (button == button1) {
|
|
|
|
if (button2.isSelected()) {
|
|
|
|
button2.setSelected(false);
|
|
|
|
}
|
|
|
|
if (button3.isSelected()) {
|
|
|
|
button3.setSelected(false);
|
|
|
|
}
|
|
|
|
} else if (button == button2 || button == button3) {
|
|
|
|
if (button1.isSelected()) {
|
|
|
|
button1.setSelected(false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
button1.addItemListener(itemListener);
|
|
|
|
button2.addItemListener(itemListener);
|
|
|
|
button3.addItemListener(itemListener);
|
|
|
|
return row(5, cell(button1), cell(button2), cell(button3)).getComponent();
|
|
|
|
}
|
|
|
|
|
|
|
|
private Component initNorthPanel() {
|
|
|
|
return FineUIUtils.wrapComponentWithTitle(column(
|
|
|
|
10, row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style"))).weight(0.1),
|
|
|
|
cell(this.currentLineCombo).weight(0.25),
|
|
|
|
flex(0.5)),
|
|
|
|
row(cell(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Color"))).weight(0.1),
|
|
|
|
cell(this.currentLineColorPane).weight(0.25),
|
|
|
|
flex(0.5))
|
|
|
|
).getComponent(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Line"));
|
|
|
|
}
|
|
|
|
|
|
|
|
public void addChangeListener(ChangeListener changeListener) {
|
|
|
|
listenerList.add(ChangeListener.class, changeListener);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
public void fireStateChanged() {
|
|
|
|
Object[] listeners = listenerList.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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private JToggleButton createVerButtonPane(int display, String text) {
|
|
|
|
JPanel verPane = new JPanel();
|
|
|
|
|
|
|
|
BorderButton button = new BorderButton(display);
|
|
|
|
if (StringUtils.isNotEmpty(text)) {
|
|
|
|
button.setText(text);
|
|
|
|
}
|
|
|
|
verPane.add(button);
|
|
|
|
insidebutton = button;
|
|
|
|
return button;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void refreshAllToggleButtons() {
|
|
|
|
topToggleButton.setSelected(this.cellBorderStyle.getTopStyle() != Constants.LINE_NONE);
|
|
|
|
horizontalToggleButton.setSelected(this.cellBorderStyle.getHorizontalStyle() != Constants.LINE_NONE);
|
|
|
|
bottomToggleButton.setSelected(this.cellBorderStyle.getBottomStyle() != Constants.LINE_NONE);
|
|
|
|
leftToggleButton.setSelected(this.cellBorderStyle.getLeftStyle() != Constants.LINE_NONE);
|
|
|
|
verticalToggleButton.setSelected(this.cellBorderStyle.getVerticalStyle() != Constants.LINE_NONE);
|
|
|
|
rightToggleButton.setSelected(this.cellBorderStyle.getRightStyle() != Constants.LINE_NONE);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected String title4PopupWindow() {
|
|
|
|
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Border");
|
|
|
|
}
|
|
|
|
|
|
|
|
// p:populate Style
|
|
|
|
// 在编辑全局style的时候调用这个方法.
|
|
|
|
public void populate(Style style) {
|
|
|
|
if (style == null) {
|
|
|
|
style = Style.DEFAULT_STYLE;
|
|
|
|
}
|
|
|
|
CellBorderStyle cellBorderStyle = new CellBorderStyle();
|
|
|
|
|
|
|
|
cellBorderStyle.setTopStyle(style.getBorderTop());
|
|
|
|
cellBorderStyle.setTopColor(style.getBorderTopColor());
|
|
|
|
cellBorderStyle.setLeftStyle(style.getBorderLeft());
|
|
|
|
cellBorderStyle.setLeftColor(style.getBorderLeftColor());
|
|
|
|
cellBorderStyle.setBottomStyle(style.getBorderBottom());
|
|
|
|
cellBorderStyle.setBottomColor(style.getBorderBottomColor());
|
|
|
|
cellBorderStyle.setRightStyle(style.getBorderRight());
|
|
|
|
cellBorderStyle.setRightColor(style.getBorderRightColor());
|
|
|
|
|
|
|
|
this.populate(cellBorderStyle, false, style.getBorderTop(), style.getBorderTopColor());
|
|
|
|
}
|
|
|
|
|
|
|
|
public void populate(CellBorderStyle cellBorderStyle, boolean insideMode, int currentStyle, Color currentColor) {
|
|
|
|
try {
|
|
|
|
if (cellBorderStyle != null) {
|
|
|
|
this.cellBorderStyle = (CellBorderStyle)cellBorderStyle.clone();
|
|
|
|
}
|
|
|
|
} catch (CloneNotSupportedException e) {
|
|
|
|
FineLoggerFactory.getLogger().error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
this.insideMode = insideMode;
|
|
|
|
// ben 这里也有问题,CellBorderStyle的 linestyle和color很可能不止一种
|
|
|
|
this.currentLineCombo.setSelectedLineStyle(currentStyle == Constants.LINE_NONE ? Constants.LINE_THIN : currentStyle);
|
|
|
|
this.currentLineColorPane.setSelectObject(currentColor);
|
|
|
|
|
|
|
|
this.insidebutton.setEnabled(this.insideMode);
|
|
|
|
this.horizontalToggleButton.setEnabled(this.insideMode);
|
|
|
|
this.verticalToggleButton.setEnabled(this.insideMode);
|
|
|
|
|
|
|
|
this.borderComponent.repaint();
|
|
|
|
}
|
|
|
|
|
|
|
|
// p:update Style
|
|
|
|
// 在编辑全局style的时候调用这个方法,
|
|
|
|
// 通过CellStyle设置Style
|
|
|
|
public Style update(Style style) {
|
|
|
|
if (style == null) {
|
|
|
|
style = Style.DEFAULT_STYLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
CellBorderStyle cellBorderStyle = this.update();
|
|
|
|
|
|
|
|
style = style.deriveBorder(cellBorderStyle.getTopStyle(), cellBorderStyle.getTopColor(), cellBorderStyle.getBottomStyle(), cellBorderStyle.getBottomColor(),
|
|
|
|
cellBorderStyle.getLeftStyle(), cellBorderStyle.getLeftColor(), cellBorderStyle.getRightStyle(), cellBorderStyle.getRightColor());
|
|
|
|
|
|
|
|
return style;
|
|
|
|
}
|
|
|
|
|
|
|
|
public CellBorderStyle update() {
|
|
|
|
return this.cellBorderStyle;
|
|
|
|
}
|
|
|
|
|
|
|
|
private class ToggleButton extends JToggleButton implements ActionListener {
|
|
|
|
private int borderType = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 根据水平 或者 垂直布局设置控件大小
|
|
|
|
*/
|
|
|
|
public ToggleButton(Icon icon, int borderType, boolean horizontal) {
|
|
|
|
super(icon);
|
|
|
|
this.borderType = borderType;
|
|
|
|
|
|
|
|
if (horizontal) {
|
|
|
|
this.setPreferredSize(FineUIScale.scale(new Dimension(40, 24)));
|
|
|
|
} else {
|
|
|
|
this.setPreferredSize(FineUIScale.scale(new Dimension(24, 40)));
|
|
|
|
}
|
|
|
|
this.addActionListener(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void actionPerformed(ActionEvent evt) {
|
|
|
|
if (this.isSelected()) {
|
|
|
|
borderComponent.setActiveBorders(borderType);
|
|
|
|
} else {
|
|
|
|
borderComponent.setActiveBorders(BorderPane.NO_BORDERS);
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (borderType) {
|
|
|
|
case BorderPane.TOP_BORDER: {
|
|
|
|
cellBorderStyle.setTopColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setTopStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BorderPane.HORIZONTAL_BORDER: {
|
|
|
|
cellBorderStyle.setHorizontalColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setHorizontalStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BorderPane.BOTTOM_BORDER: {
|
|
|
|
cellBorderStyle.setBottomColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setBottomStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BorderPane.LEFT_BORDER: {
|
|
|
|
cellBorderStyle.setLeftColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setLeftStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BorderPane.VERTICAL_BORDER: {
|
|
|
|
cellBorderStyle.setVerticalColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setVerticalStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BorderPane.RIGHT_BORDER: {
|
|
|
|
cellBorderStyle.setRightColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setRightStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
borderComponent.repaint();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Shortcut setting button
|
|
|
|
private class BorderButton extends JToggleButton implements ActionListener {
|
|
|
|
private int border;
|
|
|
|
|
|
|
|
private BorderButton(int border) {
|
|
|
|
this.border = border;
|
|
|
|
if (border == BorderPane.EXTERNAL_BORDERS) {
|
|
|
|
this.setIcon(new LazyIcon("out"));
|
|
|
|
} else if(border == BorderPane.INSIDE_BORDERS) {
|
|
|
|
this.setIcon(new LazyIcon("in"));
|
|
|
|
}
|
|
|
|
this.setPreferredSize(FineUIScale.scale(new Dimension(40, 24)));
|
|
|
|
this.addActionListener(this);
|
|
|
|
setFocusPainted(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
|
borderComponent.setActiveBorders(border);
|
|
|
|
|
|
|
|
if (border == NO_BORDERS) {
|
|
|
|
cellBorderStyle.setTopColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setTopStyle(Constants.LINE_NONE);
|
|
|
|
cellBorderStyle.setHorizontalColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setHorizontalStyle(Constants.LINE_NONE);
|
|
|
|
cellBorderStyle.setBottomColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setBottomStyle(Constants.LINE_NONE);
|
|
|
|
cellBorderStyle.setLeftColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setLeftStyle(Constants.LINE_NONE);
|
|
|
|
cellBorderStyle.setVerticalColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setVerticalStyle(Constants.LINE_NONE);
|
|
|
|
cellBorderStyle.setRightColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setRightStyle(Constants.LINE_NONE);
|
|
|
|
} else if (border == EXTERNAL_BORDERS) {
|
|
|
|
cellBorderStyle.setTopColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setTopStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
cellBorderStyle.setBottomColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setBottomStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
cellBorderStyle.setLeftColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setLeftStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
cellBorderStyle.setRightColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setRightStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
} else if (border == INSIDE_BORDERS) {
|
|
|
|
cellBorderStyle.setHorizontalColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setHorizontalStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
cellBorderStyle.setVerticalColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setVerticalStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
}
|
|
|
|
|
|
|
|
refreshAllToggleButtons();
|
|
|
|
borderComponent.repaint();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private class BorderComponent extends JComponent {
|
|
|
|
// Border is active?
|
|
|
|
private boolean topActive = false;
|
|
|
|
private boolean leftActive = false;
|
|
|
|
private boolean bottomActive = false;
|
|
|
|
private boolean rightActive = false;
|
|
|
|
private boolean verticalActive = false;
|
|
|
|
private boolean horizontalActive = false;
|
|
|
|
|
|
|
|
private EventListenerList borderChangeListenerList = new EventListenerList();
|
|
|
|
|
|
|
|
private BorderComponent() {
|
|
|
|
setOpaque(true);
|
|
|
|
|
|
|
|
// Listener allowing to set borders by clicking on component
|
|
|
|
// If the border is already active needs to deactivate and unset it
|
|
|
|
addMouseListener(new MouseAdapter() {
|
|
|
|
public void mouseClicked(MouseEvent me) {
|
|
|
|
if (me.getX() <= 24) {// Left 优先
|
|
|
|
if (cellBorderStyle.getLeftColor() == currentLineColorPane.getSelectObject() && cellBorderStyle.getLeftStyle() == currentLineCombo.getSelectedLineStyle()) {
|
|
|
|
cellBorderStyle.setLeftColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setLeftStyle(Constants.LINE_NONE);
|
|
|
|
setActiveBorders(BorderPane.NO_BORDERS);
|
|
|
|
} else {
|
|
|
|
setActiveBorders(BorderPane.LEFT_BORDER);
|
|
|
|
cellBorderStyle.setLeftColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setLeftStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
}
|
|
|
|
} else if (me.getY() <= 24) {// Top 优先。
|
|
|
|
if (cellBorderStyle.getTopColor() == currentLineColorPane.getSelectObject() && cellBorderStyle.getTopStyle() == currentLineCombo.getSelectedLineStyle()) {
|
|
|
|
cellBorderStyle.setTopColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setTopStyle(Constants.LINE_NONE);
|
|
|
|
setActiveBorders(BorderPane.NO_BORDERS);
|
|
|
|
} else {
|
|
|
|
setActiveBorders(BorderPane.TOP_BORDER);
|
|
|
|
cellBorderStyle.setTopColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setTopStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
}
|
|
|
|
} else if (me.getY() > (getHeight() - 24)) {// Bottom 优先
|
|
|
|
if (cellBorderStyle.getBottomColor() == currentLineColorPane.getSelectObject()
|
|
|
|
&& cellBorderStyle.getBottomStyle() == currentLineCombo.getSelectedLineStyle()) {
|
|
|
|
cellBorderStyle.setBottomColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setBottomStyle(Constants.LINE_NONE);
|
|
|
|
setActiveBorders(BorderPane.NO_BORDERS);
|
|
|
|
} else {
|
|
|
|
setActiveBorders(BorderPane.BOTTOM_BORDER);
|
|
|
|
cellBorderStyle.setBottomColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setBottomStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
}
|
|
|
|
} else if (me.getX() > (getWidth() - 24)) {// Right 最后
|
|
|
|
if (cellBorderStyle.getRightColor() == currentLineColorPane.getSelectObject() && cellBorderStyle.getRightStyle() == currentLineCombo.getSelectedLineStyle()) {
|
|
|
|
cellBorderStyle.setRightColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setRightStyle(Constants.LINE_NONE);
|
|
|
|
setActiveBorders(BorderPane.NO_BORDERS);
|
|
|
|
} else {
|
|
|
|
setActiveBorders(BorderPane.RIGHT_BORDER);
|
|
|
|
cellBorderStyle.setRightColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setRightStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (insideMode) {
|
|
|
|
if (me.getX() > (getWidth() / 2 - 8) && me.getX() < (getWidth() / 2 + 8)) { // 竖线
|
|
|
|
if (cellBorderStyle.getVerticalColor() == currentLineColorPane.getSelectObject()
|
|
|
|
&& cellBorderStyle.getVerticalStyle() == currentLineCombo.getSelectedLineStyle()) {
|
|
|
|
cellBorderStyle.setVerticalColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setVerticalStyle(Constants.LINE_NONE);
|
|
|
|
setActiveBorders(BorderPane.NO_BORDERS);
|
|
|
|
} else {
|
|
|
|
setActiveBorders(BorderPane.VERTICAL_BORDER);
|
|
|
|
cellBorderStyle.setVerticalColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setVerticalStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
}
|
|
|
|
} else if (me.getY() > (getHeight() / 2 - 8) && me.getY() < (getHeight() / 2 + 8)) {// 横线
|
|
|
|
if (cellBorderStyle.getHorizontalColor() == currentLineColorPane.getSelectObject()
|
|
|
|
&& cellBorderStyle.getHorizontalStyle() == currentLineCombo.getSelectedLineStyle()) {
|
|
|
|
cellBorderStyle.setHorizontalColor(Color.BLACK);
|
|
|
|
cellBorderStyle.setHorizontalStyle(Constants.LINE_NONE);
|
|
|
|
setActiveBorders(BorderPane.NO_BORDERS);
|
|
|
|
} else {
|
|
|
|
setActiveBorders(BorderPane.HORIZONTAL_BORDER);
|
|
|
|
cellBorderStyle.setHorizontalColor(currentLineColorPane.getSelectObject());
|
|
|
|
cellBorderStyle.setHorizontalStyle(currentLineCombo.getSelectedLineStyle());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
refreshAllToggleButtons();
|
|
|
|
repaint();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// Paint the background component which depends on cell set case
|
|
|
|
public void paint(Graphics g) {
|
|
|
|
// background
|
|
|
|
g.setColor(Color.WHITE);
|
|
|
|
g.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
|
|
|
|
|
|
|
|
// borders
|
|
|
|
g.setColor(Color.black);
|
|
|
|
g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
|
|
|
|
|
|
|
|
// up left corner
|
|
|
|
if (topActive) {
|
|
|
|
int[] x = { 3, 3, 10 };
|
|
|
|
int[] y = { 7, 13, 10 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(3, 10, 10, 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (leftActive) {
|
|
|
|
int[] x = { 7, 13, 10 };
|
|
|
|
int[] y = { 3, 3, 10 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(10, 3, 10, 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
// up middle
|
|
|
|
if (insideMode) {
|
|
|
|
g.drawLine(getWidth() / 2 - 3, 10, getWidth() / 2 + 3, 10);
|
|
|
|
if (verticalActive) {
|
|
|
|
int[] x = { getWidth() / 2 - 3, getWidth() / 2 + 3, getWidth() / 2 };
|
|
|
|
int[] y = { 3, 3, 10 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(getWidth() / 2, 3, getWidth() / 2, 10);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// up right corner
|
|
|
|
if (topActive) {
|
|
|
|
int[] x = { getWidth() - 3, getWidth() - 11, getWidth() - 3 };
|
|
|
|
int[] y = { 7, 10, 13 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(getWidth() - 11, 10, getWidth() - 4, 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rightActive) {
|
|
|
|
int[] x = { getWidth() - 14, getWidth() - 8, getWidth() - 11 };
|
|
|
|
int[] y = { 3, 3, 10 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(getWidth() - 11, 3, getWidth() - 11, 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
// right middle
|
|
|
|
if (insideMode) {
|
|
|
|
g.drawLine(getWidth() - 11, getHeight() / 2 - 3, getWidth() - 11, getHeight() / 2 + 3);
|
|
|
|
if (horizontalActive) {
|
|
|
|
int[] x = { getWidth() - 3, getWidth() - 11, getWidth() - 3 };
|
|
|
|
int[] y = { getHeight() / 2 - 3, getHeight() / 2, getHeight() / 2 + 3 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(getWidth() - 11, getHeight() / 2, getWidth() - 4, getHeight() / 2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// down left corner
|
|
|
|
if (bottomActive) {
|
|
|
|
int[] x = { 3, 3, 10 };
|
|
|
|
int[] y = { getHeight() - 14, getHeight() - 8, getHeight() - 11 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(3, getHeight() - 11, 10, getHeight() - 11);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (leftActive) {
|
|
|
|
int[] x = { 7, 13, 10 };
|
|
|
|
int[] y = { getHeight() - 3, getHeight() - 3, getHeight() - 11 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(10, getHeight() - 11, 10, getHeight() - 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
// left middle
|
|
|
|
if (insideMode) {
|
|
|
|
g.drawLine(10, getHeight() / 2 - 3, 10, getHeight() / 2 + 3);
|
|
|
|
if (horizontalActive) {
|
|
|
|
int[] x = { 3, 3, 10 };
|
|
|
|
int[] y = { getHeight() / 2 - 3, getHeight() / 2 + 3, getHeight() / 2 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(3, getHeight() / 2, 10, getHeight() / 2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// down right corner
|
|
|
|
if (rightActive) {
|
|
|
|
int[] x = { getWidth() - 14, getWidth() - 8, getWidth() - 11 };
|
|
|
|
int[] y = { getHeight() - 3, getHeight() - 3, getHeight() - 11 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(getWidth() - 11, getHeight() - 11, getWidth() - 11, getHeight() - 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bottomActive) {
|
|
|
|
int[] x = { getWidth() - 3, getWidth() - 11, getWidth() - 3 };
|
|
|
|
int[] y = { getHeight() - 14, getHeight() - 11, getHeight() - 8 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(getWidth() - 11, getHeight() - 11, getWidth() - 4, getHeight() - 11);
|
|
|
|
}
|
|
|
|
|
|
|
|
// bottom middle
|
|
|
|
if (insideMode) {
|
|
|
|
g.drawLine(getWidth() / 2 - 3, getHeight() - 11, getWidth() / 2 + 3, getHeight() - 11);
|
|
|
|
if (verticalActive) {
|
|
|
|
int[] x = { getWidth() / 2 - 3, getWidth() / 2 + 3, getWidth() / 2 };
|
|
|
|
int[] y = { getHeight() - 3, getHeight() - 3, getHeight() - 11 };
|
|
|
|
g.fillPolygon(x, y, 3);
|
|
|
|
} else {
|
|
|
|
g.drawLine(getWidth() / 2, getHeight() - 11, getWidth() / 2, getHeight() - 4);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// inside square(s)
|
|
|
|
if (insideMode) {
|
|
|
|
int pInset = 4;
|
|
|
|
int pWidth = this.getWidth() / 2 - 20 - pInset;
|
|
|
|
int pHeight = this.getHeight() / 2 - 20 - pInset;
|
|
|
|
g.setColor(FlatUIUtils.getUIColor("fill.hover", new Color(230,233,239)));
|
|
|
|
g.fillRect(20, 20, pWidth, pHeight);
|
|
|
|
g.setColor(FlatUIUtils.getUIColor("fill.hover", new Color(230,233,239)));
|
|
|
|
g.fillRect(this.getWidth() / 2 + pInset + 1, 20, pWidth, pHeight);
|
|
|
|
g.setColor(FlatUIUtils.getUIColor("fill.hover", new Color(230,233,239)));
|
|
|
|
g.fillRect(20, this.getHeight() / 2 + pInset + 1, pWidth, pHeight);
|
|
|
|
g.setColor(FlatUIUtils.getUIColor("fill.hover", new Color(230,233,239)));
|
|
|
|
g.fillRect(this.getWidth() / 2 + pInset + 1, this.getHeight() / 2 + pInset + 1, pWidth, pHeight);
|
|
|
|
} else {
|
|
|
|
g.setColor(FlatUIUtils.getUIColor("fill.hover", new Color(230,233,239)));
|
|
|
|
g.fillRect(20, 20, this.getWidth() - 40, this.getHeight() - 40);
|
|
|
|
}
|
|
|
|
updateBorders(g);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public void addBorderChangeListener(ChangeListener changeListener) {
|
|
|
|
borderChangeListenerList.add(ChangeListener.class, changeListener);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*/
|
|
|
|
public void fireBorderStateChanged() {
|
|
|
|
Object[] listeners = borderChangeListenerList.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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Draw the borders which specified color and style on component
|
|
|
|
private void updateBorders(Graphics g) {
|
|
|
|
Graphics2D g2D = (Graphics2D)g;
|
|
|
|
currentLineColorPane.getSelectObject();
|
|
|
|
|
|
|
|
if (cellBorderStyle.getTopColor() != null && cellBorderStyle.getTopStyle() != Constants.LINE_NONE) {
|
|
|
|
g2D.setColor(cellBorderStyle.getTopColor());
|
|
|
|
GraphHelper.drawLine(g2D, 15, 15, getWidth() - 15, 15, cellBorderStyle.getTopStyle());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cellBorderStyle.getLeftColor() != null && cellBorderStyle.getLeftStyle() != Constants.LINE_NONE) {
|
|
|
|
g2D.setColor(cellBorderStyle.getLeftColor());
|
|
|
|
GraphHelper.drawLine(g2D, 15, 15, 15, getHeight() - 15, cellBorderStyle.getLeftStyle());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cellBorderStyle.getBottomColor() != null && cellBorderStyle.getBottomStyle() != Constants.LINE_NONE) {
|
|
|
|
g2D.setColor(cellBorderStyle.getBottomColor());
|
|
|
|
GraphHelper.drawLine(g2D, 15, getHeight() - 15, getWidth() - 15, getHeight() - 15, cellBorderStyle.getBottomStyle());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cellBorderStyle.getRightColor() != null && cellBorderStyle.getRightStyle() != Constants.LINE_NONE) {
|
|
|
|
g2D.setColor(cellBorderStyle.getRightColor());
|
|
|
|
GraphHelper.drawLine(g2D, getWidth() - 15, 15, getWidth() - 15, getHeight() - 15, cellBorderStyle.getRightStyle());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cellBorderStyle.getVerticalColor() != null && cellBorderStyle.getVerticalStyle() != Constants.LINE_NONE) {
|
|
|
|
g2D.setColor(cellBorderStyle.getVerticalColor());
|
|
|
|
GraphHelper.drawLine(g2D, getWidth() / 2, 16, getWidth() / 2, getHeight() - 16, cellBorderStyle.getVerticalStyle());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (cellBorderStyle.getHorizontalColor() != null && cellBorderStyle.getHorizontalStyle() != Constants.LINE_NONE) {
|
|
|
|
g2D.setColor(cellBorderStyle.getHorizontalColor());
|
|
|
|
GraphHelper.drawLine(g2D, 16, getHeight() / 2, getWidth() - 16, getHeight() / 2, cellBorderStyle.getHorizontalStyle());
|
|
|
|
}
|
|
|
|
|
|
|
|
fireBorderStateChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set active the specified border and deactive others
|
|
|
|
private void setActiveBorders(int activeBorders) {
|
|
|
|
switch (activeBorders) {
|
|
|
|
case BorderPane.NO_BORDERS:
|
|
|
|
topActive = leftActive = bottomActive = rightActive = verticalActive = horizontalActive = false;
|
|
|
|
break;
|
|
|
|
case BorderPane.EXTERNAL_BORDERS:
|
|
|
|
topActive = leftActive = bottomActive = rightActive = true;
|
|
|
|
verticalActive = horizontalActive = false;
|
|
|
|
break;
|
|
|
|
case BorderPane.INSIDE_BORDERS:
|
|
|
|
topActive = leftActive = bottomActive = rightActive = false;
|
|
|
|
verticalActive = horizontalActive = true;
|
|
|
|
break;
|
|
|
|
case BorderPane.TOP_BORDER:
|
|
|
|
topActive = true;
|
|
|
|
leftActive = bottomActive = rightActive = verticalActive = horizontalActive = false;
|
|
|
|
break;
|
|
|
|
case BorderPane.LEFT_BORDER:
|
|
|
|
leftActive = true;
|
|
|
|
topActive = bottomActive = rightActive = verticalActive = horizontalActive = false;
|
|
|
|
break;
|
|
|
|
case BorderPane.BOTTOM_BORDER:
|
|
|
|
bottomActive = true;
|
|
|
|
topActive = leftActive = rightActive = verticalActive = horizontalActive = false;
|
|
|
|
break;
|
|
|
|
case BorderPane.RIGHT_BORDER:
|
|
|
|
rightActive = true;
|
|
|
|
topActive = leftActive = bottomActive = verticalActive = horizontalActive = false;
|
|
|
|
break;
|
|
|
|
case BorderPane.VERTICAL_BORDER:
|
|
|
|
verticalActive = true;
|
|
|
|
topActive = leftActive = bottomActive = rightActive = horizontalActive = false;
|
|
|
|
break;
|
|
|
|
case BorderPane.HORIZONTAL_BORDER:
|
|
|
|
horizontalActive = true;
|
|
|
|
topActive = leftActive = bottomActive = rightActive = verticalActive = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|