|
|
|
@ -20,13 +20,13 @@ import com.fr.design.gui.ibutton.UIButtonUI;
|
|
|
|
|
import com.fr.design.gui.ibutton.UIColorButton; |
|
|
|
|
import com.fr.design.gui.icombobox.LineComboBox; |
|
|
|
|
import com.fr.design.gui.ilable.UILabel; |
|
|
|
|
import com.fr.design.gui.itextfield.UIIntNumberField; |
|
|
|
|
import com.fr.design.layout.FRGUIPaneFactory; |
|
|
|
|
import com.fr.design.layout.TableLayout; |
|
|
|
|
import com.fr.design.layout.TableLayoutHelper; |
|
|
|
|
import com.fr.design.mainframe.DesignerContext; |
|
|
|
|
import com.fr.design.mainframe.backgroundpane.ImagePreviewPane; |
|
|
|
|
import com.fr.design.style.background.image.ImageFileChooser; |
|
|
|
|
import com.fr.design.style.color.NewColorSelectBox; |
|
|
|
|
import com.fr.env.utils.DesignerInteractionHistory; |
|
|
|
|
import com.fr.form.ui.LayoutBorderStyle; |
|
|
|
|
import com.fr.general.Background; |
|
|
|
@ -38,15 +38,28 @@ import com.fr.stable.StableUtils;
|
|
|
|
|
import com.fr.stable.StringUtils; |
|
|
|
|
import com.fr.stable.project.ProjectConstants; |
|
|
|
|
|
|
|
|
|
import javax.swing.*; |
|
|
|
|
import javax.swing.BorderFactory; |
|
|
|
|
import javax.swing.JComponent; |
|
|
|
|
import javax.swing.JFileChooser; |
|
|
|
|
import javax.swing.JPanel; |
|
|
|
|
import javax.swing.SwingUtilities; |
|
|
|
|
import javax.swing.event.ChangeEvent; |
|
|
|
|
import javax.swing.event.ChangeListener; |
|
|
|
|
import javax.swing.plaf.basic.BasicButtonUI; |
|
|
|
|
import java.awt.*; |
|
|
|
|
import java.awt.BorderLayout; |
|
|
|
|
import java.awt.Color; |
|
|
|
|
import java.awt.Cursor; |
|
|
|
|
import java.awt.Desktop; |
|
|
|
|
import java.awt.Dimension; |
|
|
|
|
import java.awt.FlowLayout; |
|
|
|
|
import java.awt.FontMetrics; |
|
|
|
|
import java.awt.Graphics; |
|
|
|
|
import java.awt.Graphics2D; |
|
|
|
|
import java.awt.Image; |
|
|
|
|
import java.awt.Point; |
|
|
|
|
import java.awt.Toolkit; |
|
|
|
|
import java.awt.event.ActionEvent; |
|
|
|
|
import java.awt.event.ActionListener; |
|
|
|
|
import java.awt.event.FocusAdapter; |
|
|
|
|
import java.awt.event.FocusEvent; |
|
|
|
|
import java.awt.event.MouseEvent; |
|
|
|
|
import java.awt.event.MouseListener; |
|
|
|
|
import java.awt.event.MouseMotionListener; |
|
|
|
@ -73,7 +86,7 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
private UIObserverListener uiObserverListener; |
|
|
|
|
|
|
|
|
|
private BorderLineAndImageComboBox borderLineCombo; |
|
|
|
|
private UIColorButton borderColorPane; |
|
|
|
|
private NewColorSelectBox borderColorPane; |
|
|
|
|
private ImagePreviewPane imagePreviewPane; |
|
|
|
|
private UIButton chooseImageButton; |
|
|
|
|
private UIButton tweakNinePointHelpButton; |
|
|
|
@ -85,17 +98,14 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
|
|
|
|
|
private int[] ninePoint = new int[] {-1, -1, -1, -1}; |
|
|
|
|
|
|
|
|
|
public BorderLineAndImagePane() { |
|
|
|
|
this.initComponents(); |
|
|
|
|
public BorderLineAndImagePane(boolean supportBorderImage) { |
|
|
|
|
this.initComponents(supportBorderImage); |
|
|
|
|
this.initLayout(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void initComponents() { |
|
|
|
|
borderLineCombo = new BorderLineAndImageComboBox(); |
|
|
|
|
borderColorPane = new UIColorButton(null) {{ |
|
|
|
|
setUI(createButtonUI(this)); |
|
|
|
|
set4ToolbarButton(); |
|
|
|
|
}}; |
|
|
|
|
private void initComponents(boolean supportBorderImage) { |
|
|
|
|
borderLineCombo = new BorderLineAndImageComboBox(supportBorderImage); |
|
|
|
|
borderColorPane = new NewColorSelectBox(145); |
|
|
|
|
imagePreviewPane = new ImagePreviewPane() {{ |
|
|
|
|
setImageStyle(Style.DEFAULT_STYLE); |
|
|
|
|
}}; |
|
|
|
@ -216,7 +226,7 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
getComponent(2).setVisible(borderLineCombo.isSelectedBorderImage()); |
|
|
|
|
|
|
|
|
|
if (!borderLineCombo.isSelectedBorderLine()) { |
|
|
|
|
borderColorPane.setColor(Color.BLACK); |
|
|
|
|
borderColorPane.setSelectObject(Color.BLACK); |
|
|
|
|
} |
|
|
|
|
if (!borderLineCombo.isSelectedBorderImage()) { |
|
|
|
|
imagePreviewPane.setImageWithSuffix(null); |
|
|
|
@ -282,7 +292,7 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
Color borderColor = style.getColor(); |
|
|
|
|
|
|
|
|
|
this.borderLineCombo.setSelectedLineStyle(borderLine); |
|
|
|
|
this.borderColorPane.setColor(borderColor); |
|
|
|
|
this.borderColorPane.setSelectObject(borderColor); |
|
|
|
|
|
|
|
|
|
Background borderImage = style.getBorderImage(); |
|
|
|
|
if (borderImage instanceof ImageBackground) { |
|
|
|
@ -320,13 +330,13 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
this.borderLineCombo.setSelectedLineStyle(style.getBorder()); |
|
|
|
|
this.borderColorPane.setColor(style.getColor()); |
|
|
|
|
this.borderColorPane.setSelectObject(style.getColor()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void updateBean(LayoutBorderStyle style) { |
|
|
|
|
|
|
|
|
|
style.setBorder(this.borderLineCombo.getSelectedLineStyle()); |
|
|
|
|
style.setColor(this.borderColorPane.getColor()); |
|
|
|
|
style.setColor(this.borderColorPane.getSelectObject()); |
|
|
|
|
style.setBorderImage(null); |
|
|
|
|
|
|
|
|
|
if (this.borderLineCombo.isSelectedBorderImage()) { |
|
|
|
@ -376,16 +386,25 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
|
|
|
|
|
protected static class BorderLineAndImageComboBox extends LineComboBox { |
|
|
|
|
public static final int LINE_PICTURE = -1; |
|
|
|
|
public final static int[] BORDER_LINE_STYLE_ARRAY = new int[] { |
|
|
|
|
public final static int[] BORDER_LINE_AND_IMAGE_STYLE_ARRAY = new int[] { |
|
|
|
|
Constants.LINE_NONE, |
|
|
|
|
LINE_PICTURE, |
|
|
|
|
Constants.LINE_THIN, //1px
|
|
|
|
|
Constants.LINE_MEDIUM, //2px
|
|
|
|
|
Constants.LINE_THICK, //3px
|
|
|
|
|
}; |
|
|
|
|
public final static int[] BORDER_LINE_STYLE_ARRAY = new int[] { |
|
|
|
|
Constants.LINE_NONE, |
|
|
|
|
Constants.LINE_THIN, //1px
|
|
|
|
|
Constants.LINE_MEDIUM, //2px
|
|
|
|
|
Constants.LINE_THICK, //3px
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
private boolean supportBorderImage = false; |
|
|
|
|
|
|
|
|
|
public BorderLineAndImageComboBox() { |
|
|
|
|
super(BORDER_LINE_STYLE_ARRAY); |
|
|
|
|
public BorderLineAndImageComboBox(boolean supportBorderImage) { |
|
|
|
|
super(supportBorderImage ? BORDER_LINE_AND_IMAGE_STYLE_ARRAY : BORDER_LINE_STYLE_ARRAY); |
|
|
|
|
this.supportBorderImage = supportBorderImage; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@ -397,15 +416,27 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean isSelectedBorderLine() { |
|
|
|
|
return getSelectedIndex() > 1; |
|
|
|
|
Object object = getSelectedItem(); |
|
|
|
|
if (object != null) { |
|
|
|
|
int value = (int) object; |
|
|
|
|
return value > 0; |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean isSelectedBorderImage() { |
|
|
|
|
return getSelectedIndex() == 1; |
|
|
|
|
Object object = getSelectedItem(); |
|
|
|
|
if (object != null) { |
|
|
|
|
int value = (int) object; |
|
|
|
|
return value == LINE_PICTURE; |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void selectBorderImage() { |
|
|
|
|
this.setSelectedIndex(1); |
|
|
|
|
if (supportBorderImage) { |
|
|
|
|
this.setSelectedIndex(1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -434,13 +465,36 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
private class NinePointLinePreviewPane extends JPanel implements MouseMotionListener, MouseListener { |
|
|
|
|
public final Color BACKGROUND_PANE_COLOR = Color.WHITE; |
|
|
|
|
public final Color BACKGROUND_IMG_COLOR = Color.lightGray; |
|
|
|
|
public final Color DIVIDER_BACKGROUND_COLOR = Color.WHITE; |
|
|
|
|
public final Color DIVIDER_FOREGROUND_COLOR = Color.BLACK; |
|
|
|
|
public final Color HINT_BACKGROUND_COLOR = new Color(255, 255, 255, 100); |
|
|
|
|
public final Color HINT_FOREGROUND_COLOR = Color.RED; |
|
|
|
|
public final Color HINT_LINE_BACKGROUND_COLOR = Color.WHITE; |
|
|
|
|
public final Color HINT_LINE_FOREGROUND_COLOR = Color.RED; |
|
|
|
|
public final Color DIVIDER_BACKGROUND_COLOR = new Color(235, 29, 31); |
|
|
|
|
public final Color DIVIDER_FOREGROUND_COLOR = Color.WHITE; |
|
|
|
|
public final Color HINT_BACKGROUND_COLOR = new Color(0, 215, 215); |
|
|
|
|
public final Color HINT_FOREGROUND_COLOR = Color.WHITE; |
|
|
|
|
public final int HINT_GAP = 5; |
|
|
|
|
public final int PADDING = 20; |
|
|
|
|
public final Cursor E_DRAG_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( |
|
|
|
|
IOUtils.readImage("/com/fr/design/images/control/icon_cursor_drag_e.png"), |
|
|
|
|
new Point(8, 8), "E_DRAG_CURSOR"); |
|
|
|
|
public final Cursor S_DRAG_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( |
|
|
|
|
IOUtils.readImage("/com/fr/design/images/control/icon_cursor_drag_s.png"), |
|
|
|
|
new Point(8, 8), "S_DRAG_CURSOR"); |
|
|
|
|
public final Cursor W_DRAG_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( |
|
|
|
|
IOUtils.readImage("/com/fr/design/images/control/icon_cursor_drag_w.png"), |
|
|
|
|
new Point(8, 8), "W_DRAG_CURSOR"); |
|
|
|
|
public final Cursor N_DRAG_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( |
|
|
|
|
IOUtils.readImage("/com/fr/design/images/control/icon_cursor_drag_n.png"), |
|
|
|
|
new Point(8, 8), "N_DRAG_CURSOR"); |
|
|
|
|
public final Cursor NE_DRAG_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( |
|
|
|
|
IOUtils.readImage("/com/fr/design/images/control/icon_cursor_drag_ne.png"), |
|
|
|
|
new Point(8, 8), "NE_DRAG_CURSOR"); |
|
|
|
|
public final Cursor NW_DRAG_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( |
|
|
|
|
IOUtils.readImage("/com/fr/design/images/control/icon_cursor_drag_nw.png"), |
|
|
|
|
new Point(8, 8), "NW_DRAG_CURSOR"); |
|
|
|
|
public final Cursor SE_DRAG_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( |
|
|
|
|
IOUtils.readImage("/com/fr/design/images/control/icon_cursor_drag_se.png"), |
|
|
|
|
new Point(8, 8), "SE_DRAG_CURSOR"); |
|
|
|
|
public final Cursor SW_DRAG_CURSOR = Toolkit.getDefaultToolkit().createCustomCursor( |
|
|
|
|
IOUtils.readImage("/com/fr/design/images/control/icon_cursor_drag_sw.png"), |
|
|
|
|
new Point(8, 8), "SW_DRAG_CURSOR"); |
|
|
|
|
|
|
|
|
|
private int ninePointLeft = -1; |
|
|
|
|
private int ninePointTop = -1; |
|
|
|
@ -455,54 +509,17 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
private int scaleImgHeight; |
|
|
|
|
private int scaleImgX; |
|
|
|
|
private int scaleImgY; |
|
|
|
|
private double scale = 1.0; |
|
|
|
|
private double imageScale = 1.0; |
|
|
|
|
|
|
|
|
|
private final UIIntNumberField topField = createNumberField(); |
|
|
|
|
private final UIIntNumberField bottomField = createNumberField(); |
|
|
|
|
private final UIIntNumberField leftField = createNumberField(); |
|
|
|
|
private final UIIntNumberField rightField = createNumberField(); |
|
|
|
|
private boolean draggingLeftDivider = false; |
|
|
|
|
private boolean draggingRightDivider = false; |
|
|
|
|
private boolean draggingTopDivider = false; |
|
|
|
|
private boolean draggingBottomDivider = false; |
|
|
|
|
|
|
|
|
|
public NinePointLinePreviewPane() { |
|
|
|
|
this.setLayout(null); |
|
|
|
|
this.addMouseMotionListener(this); |
|
|
|
|
this.addMouseListener(this); |
|
|
|
|
this.setFocusable(true); |
|
|
|
|
this.add(topField); |
|
|
|
|
this.add(bottomField); |
|
|
|
|
this.add(leftField); |
|
|
|
|
this.add(rightField); |
|
|
|
|
|
|
|
|
|
topField.addFocusListener(new FocusAdapter() { |
|
|
|
|
@Override |
|
|
|
|
public void focusLost(FocusEvent e) { |
|
|
|
|
int value = (int) topField.getValue(); |
|
|
|
|
onNinePointTopChanged(value); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
bottomField.addFocusListener(new FocusAdapter() { |
|
|
|
|
@Override |
|
|
|
|
public void focusLost(FocusEvent e) { |
|
|
|
|
int value = (int) bottomField.getValue(); |
|
|
|
|
onNinePointBottomChanged(value); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
leftField.addFocusListener(new FocusAdapter() { |
|
|
|
|
@Override |
|
|
|
|
public void focusLost(FocusEvent e) { |
|
|
|
|
int value = (int) leftField.getValue(); |
|
|
|
|
onNinePointLeftChanged(value); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
rightField.addFocusListener(new FocusAdapter() { |
|
|
|
|
@Override |
|
|
|
|
public void focusLost(FocusEvent e) { |
|
|
|
|
int value = (int) rightField.getValue(); |
|
|
|
|
onNinePointRightChanged(value); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@ -528,68 +545,115 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
scaleImgHeight = (int) (1.0F * scaleImgWidth * imgHeight / imgWidth); |
|
|
|
|
scaleImgX = autoFixAreaX; |
|
|
|
|
scaleImgY = (autoFixAreaHeight - scaleImgHeight) / 2 + autoFixAreaY; // 垂直居中
|
|
|
|
|
scale = 1.0 * scaleImgWidth / imgWidth; |
|
|
|
|
imageScale = 1.0 * scaleImgWidth / imgWidth; |
|
|
|
|
} else { |
|
|
|
|
scaleImgHeight = autoFixAreaHeight; |
|
|
|
|
scaleImgWidth = (int) (1.0F * scaleImgHeight * imgWidth / imgHeight); |
|
|
|
|
scaleImgX = (autoFixAreaWidth - scaleImgWidth) / 2 + autoFixAreaX; // 水平居中
|
|
|
|
|
scaleImgY = autoFixAreaY; |
|
|
|
|
scale = 1.0 * scaleImgHeight / imgHeight; |
|
|
|
|
imageScale = 1.0 * scaleImgHeight / imgHeight; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
g2d.setColor(BACKGROUND_IMG_COLOR); |
|
|
|
|
g2d.fillRect(scaleImgX, scaleImgY, scaleImgWidth, scaleImgHeight); |
|
|
|
|
g2d.drawImage(image, scaleImgX, scaleImgY, scaleImgWidth, scaleImgHeight, null); |
|
|
|
|
|
|
|
|
|
int scaleLeft = (int) (ninePointLeft * scale); |
|
|
|
|
int scaleTop = (int) (ninePointTop * scale); |
|
|
|
|
int scaleRight = (int) (ninePointRight * scale); |
|
|
|
|
int scaleBottom = (int) (ninePointBottom * scale); |
|
|
|
|
int scaleLeft = (int) (ninePointLeft * imageScale); |
|
|
|
|
int scaleTop = (int) (ninePointTop * imageScale); |
|
|
|
|
int scaleRight = (int) (ninePointRight * imageScale); |
|
|
|
|
int scaleBottom = (int) (ninePointBottom * imageScale); |
|
|
|
|
|
|
|
|
|
double topYInPane = scaleImgY + scaleTop; |
|
|
|
|
double bottomYInPane = scaleImgY + scaleImgHeight - scaleBottom; |
|
|
|
|
double leftXInPane = scaleImgX + scaleLeft; |
|
|
|
|
double rightXInPane = scaleImgX + scaleImgWidth - scaleRight; |
|
|
|
|
|
|
|
|
|
// 绘制分割线
|
|
|
|
|
// 顶部
|
|
|
|
|
drawLine(g2d, DIVIDER_BACKGROUND_COLOR, DIVIDER_FOREGROUND_COLOR, scaleImgX, topYInPane, scaleImgX + scaleImgWidth, topYInPane); |
|
|
|
|
// 底部
|
|
|
|
|
drawLine(g2d, DIVIDER_BACKGROUND_COLOR, DIVIDER_FOREGROUND_COLOR, scaleImgX, bottomYInPane, scaleImgX + scaleImgWidth, bottomYInPane); |
|
|
|
|
// 左侧
|
|
|
|
|
drawLine(g2d, DIVIDER_BACKGROUND_COLOR, DIVIDER_FOREGROUND_COLOR, leftXInPane, scaleImgY, leftXInPane, scaleImgY + scaleImgHeight); |
|
|
|
|
// 右侧
|
|
|
|
|
drawLine(g2d, DIVIDER_BACKGROUND_COLOR, DIVIDER_FOREGROUND_COLOR, rightXInPane, scaleImgY, rightXInPane, scaleImgY + scaleImgHeight); |
|
|
|
|
|
|
|
|
|
// 绘制分割线位置提示
|
|
|
|
|
// 顶部
|
|
|
|
|
drawLine(g2d, HINT_LINE_BACKGROUND_COLOR, HINT_LINE_FOREGROUND_COLOR, (leftXInPane + rightXInPane) / 2.0F, scaleImgY, (leftXInPane + rightXInPane) / 2.0F, topYInPane); |
|
|
|
|
drawHint(g2d, Integer.toString(ninePointTop), (leftXInPane + rightXInPane) / 2.0F, (scaleImgY + topYInPane) / 2.0, topField); |
|
|
|
|
// 底部
|
|
|
|
|
drawLine(g2d, HINT_LINE_BACKGROUND_COLOR, HINT_LINE_FOREGROUND_COLOR, (leftXInPane + rightXInPane) / 2.0F, bottomYInPane, (leftXInPane + rightXInPane) / 2.0F, scaleImgY + scaleImgHeight); |
|
|
|
|
drawHint(g2d, Integer.toString(ninePointBottom), (leftXInPane + rightXInPane) / 2.0F, (bottomYInPane + scaleImgY + scaleImgHeight) / 2.0, bottomField); |
|
|
|
|
// 左侧
|
|
|
|
|
drawLine(g2d, HINT_LINE_BACKGROUND_COLOR, HINT_LINE_FOREGROUND_COLOR, scaleImgX, (topYInPane + bottomYInPane) / 2.0, leftXInPane, (topYInPane + bottomYInPane) / 2.0); |
|
|
|
|
drawHint(g2d, Integer.toString(ninePointLeft), (scaleImgX + leftXInPane) / 2.0, (topYInPane + bottomYInPane) / 2.0, leftField); |
|
|
|
|
// 右侧
|
|
|
|
|
drawLine(g2d, HINT_LINE_BACKGROUND_COLOR, HINT_LINE_FOREGROUND_COLOR, rightXInPane, (topYInPane + bottomYInPane) / 2.0, scaleImgX + scaleImgWidth, (topYInPane + bottomYInPane) / 2.0); |
|
|
|
|
drawHint(g2d, Integer.toString(ninePointRight), (rightXInPane + scaleImgX + scaleImgWidth) / 2.0, (topYInPane + bottomYInPane) / 2.0, rightField); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void drawHint(Graphics2D g2d, String hint, double centerX, double centerY, UIIntNumberField hintField) { |
|
|
|
|
// 顶部分割线
|
|
|
|
|
drawDivider(g2d, scaleImgX, topYInPane, scaleImgX + scaleImgWidth, topYInPane, draggingTopDivider); |
|
|
|
|
if (draggingTopDivider) { |
|
|
|
|
// 顶部提示
|
|
|
|
|
drawHint(g2d, ninePointTop + "px", leftXInPane, scaleImgY, scaleImgWidth - scaleLeft - scaleRight, scaleTop, false); |
|
|
|
|
} |
|
|
|
|
// 底部分割线
|
|
|
|
|
drawDivider(g2d, scaleImgX, bottomYInPane, scaleImgX + scaleImgWidth, bottomYInPane, draggingBottomDivider); |
|
|
|
|
if (draggingBottomDivider) { |
|
|
|
|
// 底部提示
|
|
|
|
|
drawHint(g2d, ninePointBottom + "px", leftXInPane, bottomYInPane, scaleImgWidth - scaleLeft - scaleRight, scaleBottom, false); |
|
|
|
|
} |
|
|
|
|
// 左侧分割线
|
|
|
|
|
drawDivider(g2d, leftXInPane, scaleImgY, leftXInPane, scaleImgY + scaleImgHeight, draggingLeftDivider); |
|
|
|
|
if (draggingLeftDivider) { |
|
|
|
|
// 左侧提示
|
|
|
|
|
drawHint(g2d, ninePointLeft + "px", scaleImgX, topYInPane, scaleLeft, scaleImgHeight - scaleTop - scaleBottom, true); |
|
|
|
|
} |
|
|
|
|
// 右侧分割线
|
|
|
|
|
drawDivider(g2d, rightXInPane, scaleImgY, rightXInPane, scaleImgY + scaleImgHeight, draggingRightDivider); |
|
|
|
|
if (draggingRightDivider) { |
|
|
|
|
// 右侧提示
|
|
|
|
|
drawHint(g2d, ninePointRight + "px", rightXInPane, topYInPane, scaleRight, scaleImgHeight - scaleTop - scaleBottom, true); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void drawHint(Graphics2D g2d, String hint, double x, double y, double width, double height, boolean horizontal) { |
|
|
|
|
FontMetrics metrics = GraphDrawHelper.getFontMetrics(g2d.getFont()); |
|
|
|
|
double height = metrics.getAscent() + metrics.getDescent(); |
|
|
|
|
double width = Math.max(metrics.stringWidth(" " + hint + " "), metrics.stringWidth(" 123 ")); |
|
|
|
|
double hintTextHeight = Math.max(metrics.getAscent() + metrics.getDescent(), 16); |
|
|
|
|
double hintTextWidth = Math.max(metrics.stringWidth(hint), metrics.stringWidth("123")); |
|
|
|
|
double hintFrameRadius = hintTextHeight / 2; |
|
|
|
|
double hintFrameHeight = hintTextHeight; |
|
|
|
|
double hintFrameWidth = hintTextWidth + 2 * hintFrameRadius; |
|
|
|
|
|
|
|
|
|
double centerX = x + width / 2; |
|
|
|
|
double centerY = y + height / 2; |
|
|
|
|
|
|
|
|
|
double indent = 1.0; |
|
|
|
|
double shortLine = 4.0; |
|
|
|
|
|
|
|
|
|
if (horizontal) { |
|
|
|
|
if (width > hintFrameWidth) { |
|
|
|
|
g2d.setColor(HINT_BACKGROUND_COLOR); |
|
|
|
|
GraphDrawHelper.draw(g2d, new Line2D.Double(x + indent, centerY, x + width - indent, centerY), Constants.LINE_THIN, 1.0F); |
|
|
|
|
GraphDrawHelper.draw(g2d, new Line2D.Double(x + indent, centerY - shortLine, x + indent, centerY + shortLine), Constants.LINE_THIN, 1.0F); |
|
|
|
|
GraphDrawHelper.draw(g2d, new Line2D.Double(x + width - indent, centerY - shortLine, x + width - indent, centerY + shortLine), Constants.LINE_THIN, 1.0F); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
double hintFrameX = centerX - hintFrameWidth / 2; |
|
|
|
|
double hintFrameY = centerY + HINT_GAP; |
|
|
|
|
|
|
|
|
|
g2d.setColor(HINT_BACKGROUND_COLOR); |
|
|
|
|
GraphDrawHelper.fill(g2d, new RoundRectangle2D.Double(hintFrameX, hintFrameY, hintFrameWidth, hintFrameHeight, hintFrameRadius * 2, hintFrameRadius * 2)); |
|
|
|
|
|
|
|
|
|
g2d.setColor(HINT_FOREGROUND_COLOR); |
|
|
|
|
GraphDrawHelper.drawString(g2d, hint, hintFrameX + (hintFrameWidth - hintTextWidth) / 2, hintFrameY + (hintFrameHeight + hintTextHeight) / 2.0 - metrics.getDescent()); |
|
|
|
|
} else { |
|
|
|
|
if (height > hintFrameHeight) { |
|
|
|
|
g2d.setColor(HINT_BACKGROUND_COLOR); |
|
|
|
|
GraphDrawHelper.draw(g2d, new Line2D.Double(centerX, y + indent, centerX, y + height - indent), Constants.LINE_THIN, 1.0F); |
|
|
|
|
GraphDrawHelper.draw(g2d, new Line2D.Double(centerX - shortLine, y + indent, centerX + shortLine, y + indent), Constants.LINE_THIN, 1.0F); |
|
|
|
|
GraphDrawHelper.draw(g2d, new Line2D.Double(centerX - shortLine, y + height - indent, centerX + shortLine, y + height - indent), Constants.LINE_THIN, 1.0F); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
double hintFrameX = centerX + HINT_GAP; |
|
|
|
|
double hintFrameY = centerY - hintFrameHeight / 2; |
|
|
|
|
|
|
|
|
|
g2d.setColor(HINT_BACKGROUND_COLOR); |
|
|
|
|
GraphDrawHelper.fill(g2d, new RoundRectangle2D.Double(hintFrameX, hintFrameY, hintFrameWidth, hintFrameHeight, hintFrameRadius * 2, hintFrameRadius * 2)); |
|
|
|
|
|
|
|
|
|
hintField.setBounds((int) (centerX - width / 2.0), (int) (centerY - height / 2.0), (int) width, (int) height); |
|
|
|
|
g2d.setColor(HINT_FOREGROUND_COLOR); |
|
|
|
|
GraphDrawHelper.drawString(g2d, hint, hintFrameX + (hintFrameWidth - hintTextWidth) / 2, hintFrameY + (hintFrameHeight + hintTextHeight) / 2.0 - metrics.getDescent()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void drawLine(Graphics2D g2d, Color backgroundColor, Color foregroundColor, double x1, double y1, double x2, double y2) { |
|
|
|
|
g2d.setColor(backgroundColor); |
|
|
|
|
GraphDrawHelper.draw(g2d, new Line2D.Double(x1, y1, x2, y2), Constants.LINE_THIN, 2.0F); |
|
|
|
|
private void drawDivider(Graphics2D g2d, double x1, double y1, double x2, double y2, boolean dragging) { |
|
|
|
|
if (dragging) { |
|
|
|
|
g2d.setColor(DIVIDER_BACKGROUND_COLOR); |
|
|
|
|
GraphDrawHelper.draw(g2d, new Line2D.Double(x1, y1, x2, y2), Constants.LINE_THIN, 2.0F); |
|
|
|
|
|
|
|
|
|
g2d.setColor(foregroundColor); |
|
|
|
|
GraphDrawHelper.draw(g2d, new Line2D.Double(x1, y1, x2, y2), Constants.LINE_DASH, 1.0F); |
|
|
|
|
g2d.setColor(DIVIDER_FOREGROUND_COLOR); |
|
|
|
|
GraphDrawHelper.draw(g2d, new Line2D.Double(x1, y1, x2, y2), Constants.LINE_THIN, 1.0F); |
|
|
|
|
} else { |
|
|
|
|
g2d.setColor(DIVIDER_BACKGROUND_COLOR); |
|
|
|
|
GraphDrawHelper.draw(g2d, new Line2D.Double(x1, y1, x2, y2), Constants.LINE_DASH, 1.0F); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@ -597,28 +661,22 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
int x = e.getX(); |
|
|
|
|
int y = e.getY(); |
|
|
|
|
|
|
|
|
|
int cursorType = getCursor().getType(); |
|
|
|
|
Cursor cursor = getCursor(); |
|
|
|
|
|
|
|
|
|
switch (cursorType) { |
|
|
|
|
case Cursor.W_RESIZE_CURSOR: { |
|
|
|
|
int nextLeft = (int) ((x - scaleImgX) / scale); |
|
|
|
|
this.onNinePointLeftChanged(nextLeft); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
case Cursor.E_RESIZE_CURSOR: { |
|
|
|
|
int nextRight = (int) ((scaleImgX + scaleImgWidth - x) / scale); |
|
|
|
|
this.onNinePointRightChanged(nextRight); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
case Cursor.N_RESIZE_CURSOR: { |
|
|
|
|
int nextTop = (int) ((y - scaleImgY) / scale); |
|
|
|
|
this.onNinePointTopChanged(nextTop); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
case Cursor.S_RESIZE_CURSOR: { |
|
|
|
|
int nextBottom = (int) ((scaleImgY + scaleImgHeight - y) / scale); |
|
|
|
|
this.onNinePointBottomChanged(nextBottom); |
|
|
|
|
} |
|
|
|
|
if (cursor == W_DRAG_CURSOR || cursor == NW_DRAG_CURSOR || cursor == SW_DRAG_CURSOR) { |
|
|
|
|
int nextLeft = (int) ((x - scaleImgX) / imageScale); |
|
|
|
|
this.onNinePointLeftChanged(nextLeft); |
|
|
|
|
} else if (cursor == E_DRAG_CURSOR || cursor == NE_DRAG_CURSOR || cursor == SE_DRAG_CURSOR) { |
|
|
|
|
int nextRight = (int) ((scaleImgX + scaleImgWidth - x) / imageScale); |
|
|
|
|
this.onNinePointRightChanged(nextRight); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (cursor == N_DRAG_CURSOR || cursor == NE_DRAG_CURSOR || cursor == NW_DRAG_CURSOR) { |
|
|
|
|
int nextTop = (int) ((y - scaleImgY) / imageScale); |
|
|
|
|
this.onNinePointTopChanged(nextTop); |
|
|
|
|
} else if (cursor == S_DRAG_CURSOR || cursor == SE_DRAG_CURSOR || cursor == SW_DRAG_CURSOR) { |
|
|
|
|
int nextBottom = (int) ((scaleImgY + scaleImgHeight - y) / imageScale); |
|
|
|
|
this.onNinePointBottomChanged(nextBottom); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -629,13 +687,13 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
int x = e.getX(); |
|
|
|
|
int y = e.getY(); |
|
|
|
|
|
|
|
|
|
double scaleLeft = ninePointLeft * scale; |
|
|
|
|
double scaleTop = ninePointTop * scale; |
|
|
|
|
double scaleRight = ninePointRight * scale; |
|
|
|
|
double scaleBottom = ninePointBottom * scale; |
|
|
|
|
double scaleLeft = ninePointLeft * imageScale; |
|
|
|
|
double scaleTop = ninePointTop * imageScale; |
|
|
|
|
double scaleRight = ninePointRight * imageScale; |
|
|
|
|
double scaleBottom = ninePointBottom * imageScale; |
|
|
|
|
|
|
|
|
|
// determine cursor
|
|
|
|
|
int cursorType = Cursor.DEFAULT_CURSOR; |
|
|
|
|
Cursor cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); |
|
|
|
|
|
|
|
|
|
boolean hoveringLeftDivider = false; |
|
|
|
|
boolean hoveringRightDivider = false; |
|
|
|
@ -649,18 +707,31 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
hoveringBottomDivider = Math.abs(y - (scaleImgY + scaleImgHeight - scaleBottom)) < 2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (hoveringLeftDivider) { |
|
|
|
|
cursorType = Cursor.W_RESIZE_CURSOR; |
|
|
|
|
if (hoveringLeftDivider && hoveringTopDivider) { |
|
|
|
|
cursor = NW_DRAG_CURSOR; |
|
|
|
|
} else if (hoveringLeftDivider && hoveringBottomDivider) { |
|
|
|
|
cursor = SW_DRAG_CURSOR; |
|
|
|
|
} else if (hoveringRightDivider && hoveringTopDivider) { |
|
|
|
|
cursor = NE_DRAG_CURSOR; |
|
|
|
|
} else if (hoveringRightDivider && hoveringBottomDivider) { |
|
|
|
|
cursor = SE_DRAG_CURSOR; |
|
|
|
|
} else if (hoveringLeftDivider) { |
|
|
|
|
cursor = W_DRAG_CURSOR; |
|
|
|
|
} else if (hoveringRightDivider) { |
|
|
|
|
cursorType = Cursor.E_RESIZE_CURSOR; |
|
|
|
|
cursor = E_DRAG_CURSOR; |
|
|
|
|
} else if (hoveringTopDivider) { |
|
|
|
|
cursorType = Cursor.N_RESIZE_CURSOR; |
|
|
|
|
cursor = N_DRAG_CURSOR; |
|
|
|
|
} else if (hoveringBottomDivider) { |
|
|
|
|
cursorType = Cursor.S_RESIZE_CURSOR; |
|
|
|
|
cursor = S_DRAG_CURSOR; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
needRepaint = getCursor().getType() != cursorType; |
|
|
|
|
this.setCursor(Cursor.getPredefinedCursor(cursorType)); |
|
|
|
|
draggingLeftDivider = hoveringLeftDivider; |
|
|
|
|
draggingRightDivider = hoveringRightDivider; |
|
|
|
|
draggingTopDivider = hoveringTopDivider; |
|
|
|
|
draggingBottomDivider = hoveringBottomDivider; |
|
|
|
|
|
|
|
|
|
needRepaint = getCursor() != cursor; |
|
|
|
|
this.setCursor(cursor); |
|
|
|
|
|
|
|
|
|
if (needRepaint) { |
|
|
|
|
repaint(); |
|
|
|
@ -680,6 +751,10 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
@Override |
|
|
|
|
public void mouseReleased(MouseEvent e) { |
|
|
|
|
this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
|
|
|
|
this.draggingLeftDivider = false; |
|
|
|
|
this.draggingRightDivider = false; |
|
|
|
|
this.draggingTopDivider = false; |
|
|
|
|
this.draggingBottomDivider = false; |
|
|
|
|
|
|
|
|
|
repaint(); |
|
|
|
|
} |
|
|
|
@ -701,7 +776,6 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
value = imgHeight - ninePointBottom - MIN_NINE_POINT; |
|
|
|
|
} |
|
|
|
|
this.ninePointTop = value; |
|
|
|
|
topField.setText(Integer.toString(value)); |
|
|
|
|
repaint(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -712,7 +786,6 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
value = imgHeight - ninePointTop - MIN_NINE_POINT; |
|
|
|
|
} |
|
|
|
|
this.ninePointBottom = value; |
|
|
|
|
bottomField.setText(Integer.toString(value)); |
|
|
|
|
repaint(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -723,7 +796,6 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
value = imgWidth - ninePointRight - MIN_NINE_POINT; |
|
|
|
|
} |
|
|
|
|
this.ninePointLeft = value; |
|
|
|
|
leftField.setText(Integer.toString(value)); |
|
|
|
|
repaint(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -734,32 +806,14 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
|
|
|
|
|
value = imgWidth - ninePointLeft - MIN_NINE_POINT; |
|
|
|
|
} |
|
|
|
|
this.ninePointRight = value; |
|
|
|
|
rightField.setText(Integer.toString(value)); |
|
|
|
|
repaint(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private UIIntNumberField createNumberField() { |
|
|
|
|
UIIntNumberField field = new UIIntNumberField(); |
|
|
|
|
field.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1)); |
|
|
|
|
field.setOpaque(true); |
|
|
|
|
field.setMinValue(MIN_NINE_POINT); |
|
|
|
|
field.setForeground(HINT_FOREGROUND_COLOR); |
|
|
|
|
field.setBackground(HINT_BACKGROUND_COLOR); |
|
|
|
|
field.setHorizontalAlignment(SwingConstants.CENTER); |
|
|
|
|
return field; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setNinePoint(int[] ninePoint) { |
|
|
|
|
ninePointLeft = ninePoint[0]; |
|
|
|
|
ninePointTop = ninePoint[1]; |
|
|
|
|
ninePointRight = ninePoint[2]; |
|
|
|
|
ninePointBottom = ninePoint[3]; |
|
|
|
|
|
|
|
|
|
leftField.setValue(ninePointLeft); |
|
|
|
|
rightField.setValue(ninePointRight); |
|
|
|
|
topField.setValue(ninePointTop); |
|
|
|
|
bottomField.setValue(ninePointBottom); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public int[] getNinePoint() { |
|
|
|
|