Browse Source

Merge pull request #5103 in DESIGN/design from release/11.0 to feature/x

* commit '05941a3893a257d06420df834a60f8ac3b368a1d':
  REPORT-53175 - 【10.0.18】组件背景分离为标题/背景/边框
  REPORT-53175 - 【10.0.18】组件背景分离为标题/背景/边框
  REPORT-55753 【组件背景分离】组件复用-工具栏的显示位置不超过绘制区域
  REPORT-55748 【组件背景分离】组件复用-组件悬浮状态没有显示蓝色边框
  EPORT-55747 【组件背景分离】组件复用-设计器画布效果,标题背景遮挡边框图片
  REPORT-55743 【组件背景分离】组件复用-在新jar下新建的报表块,放到旧版本jar下设计器显示黑色缩略图
  REPORT-55228 ctrl/shift多选时不出现工具栏 + 老插件管理工具栏不显示
  REPORT-55715 【组件背景分离】组件复用-颜色选择器和设计器里其他地方的颜色选择器不太一样,看起来有点奇怪
  REPORT-55554 【组件背景分离】组件复用-mac上,组件标题的默认字体 和 单元格默认字体 不是一个字体;windows这边是一致的,都是宋体
  REPORT-55669 【组件背景分离】组件复用-线型边框在设计画布里可以看到,标题和组件内容之间是有显示边框线的,但是预览时这里没有显示边框线,不符合所见即所得,这个看下预期是什么样
  REPORT-55719 【组件背景分离】组件复用-报表块在画布内显示问题 REPORT-55737 【组件背景分离】组件复用-主体背景遮挡边框
  REPORT-55658 【稳定共创】组件设置-图表块标题图案-删除后再操作
  REPORT-55715 【组件背景分离】组件复用-颜色选择器和设计器里其他地方的颜色选择器不太一样,看起来有点奇怪
research/11.0
superman 3 years ago
parent
commit
5135ee7da6
  1. 2
      designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java
  2. 38
      designer-base/src/main/java/com/fr/design/style/AbstractSelectBox.java
  3. 105
      designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java
  4. 9
      designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java
  5. 8
      designer-form/src/main/java/com/fr/design/designer/creator/XLabel.java
  6. 54
      designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java
  7. 16
      designer-form/src/main/java/com/fr/design/gui/xpane/BorderLineAndImagePane.java
  8. 28
      designer-form/src/main/java/com/fr/design/gui/xpane/LayoutStylePane.java
  9. 20
      designer-form/src/main/java/com/fr/design/gui/xpane/TitleInsetImagePane.java
  10. 6
      designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java
  11. 10
      designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java
  12. 2
      designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java
  13. 5
      designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java
  14. 12
      designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCaseDesigner.java

2
designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java

@ -399,6 +399,8 @@ public class PluginWebBridge {
if (uiDialog != null) { if (uiDialog != null) {
uiDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); uiDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
uiDialog.setVisible(false); uiDialog.setVisible(false);
}
if (uiDialog == DesignerPluginContext.getPluginDialog()) {
DesignerPluginContext.setPluginDialog(null); DesignerPluginContext.setPluginDialog(null);
} }
} }

38
designer-base/src/main/java/com/fr/design/style/AbstractSelectBox.java

@ -10,16 +10,20 @@ import java.awt.RenderingHints;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; import java.awt.event.MouseListener;
import javax.swing.AbstractButton;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.border.AbstractBorder; import javax.swing.border.AbstractBorder;
import javax.swing.event.AncestorEvent; import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener; import javax.swing.event.AncestorListener;
import javax.swing.plaf.ButtonUI;
import com.fr.design.constants.UIConstants; import com.fr.design.constants.UIConstants;
import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ibutton.UIButtonUI;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.stable.Constants; import com.fr.design.utils.gui.GUIPaintUtils;
import com.fr.design.style.background.BackgroundJComponent; import com.fr.design.style.background.BackgroundJComponent;
import com.fr.stable.Constants;
/** /**
* @author kunsnat E-mail:kunsnat@gmail.com * @author kunsnat E-mail:kunsnat@gmail.com
@ -29,7 +33,7 @@ import com.fr.design.style.background.BackgroundJComponent;
public abstract class AbstractSelectBox<T> extends AbstractPopBox implements MouseListener { public abstract class AbstractSelectBox<T> extends AbstractPopBox implements MouseListener {
private static final long serialVersionUID = 2355250206956896774L; private static final long serialVersionUID = 2355250206956896774L;
private UIToggleButton triggleButton; private UIButton triggleButton;
protected void initBox(int preWidth) { protected void initBox(int preWidth) {
this.setLayout(FRGUIPaneFactory.createBorderLayout()); this.setLayout(FRGUIPaneFactory.createBorderLayout());
@ -37,8 +41,34 @@ public abstract class AbstractSelectBox<T> extends AbstractPopBox implements Mou
displayComponent = new BackgroundJComponent(); displayComponent = new BackgroundJComponent();
displayComponent.setEmptyBackground(); displayComponent.setEmptyBackground();
displayComponent.setBorder(new TriggleLineBorder()); displayComponent.setBorder(new TriggleLineBorder());
triggleButton = new UIToggleButton(UIConstants.ARROW_DOWN_ICON); triggleButton = new UIButton(UIConstants.ARROW_DOWN_ICON) {
public boolean shouldResponseChangeListener() {
return false;
}
@Override
public ButtonUI getUI() {
return new UIButtonUI() {
@Override
protected boolean isPressed(AbstractButton b) {
return model.isArmed() && model.isPressed();
}
@Override
protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) {
if (isPressed(b) && b.isPressedPainted()) {
GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), UIConstants.COMBOBOX_BTN_PRESS);
} else if (isRollOver(b)) {
GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.COMBOBOX_BTN_ROLLOVER);
} else if (b.isNormalPainted()) {
GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.COMBOBOX_BTN_NORMAL);
}
}
};
}
};
triggleButton.setPreferredSize(new Dimension(20, 20)); triggleButton.setPreferredSize(new Dimension(20, 20));
triggleButton.setRoundBorder(true, Constants.LEFT);
JPanel displayPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); JPanel displayPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
displayPane.add(displayComponent, BorderLayout.CENTER); displayPane.add(displayComponent, BorderLayout.CENTER);

105
designer-form/src/main/java/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java

@ -35,6 +35,9 @@ import java.awt.geom.RoundRectangle2D;
public class XBorderStyleWidgetCreator extends XWidgetCreator{ public class XBorderStyleWidgetCreator extends XWidgetCreator{
protected static final Dimension BORDER_PREFERRED_SIZE = new Dimension(250, 150); protected static final Dimension BORDER_PREFERRED_SIZE = new Dimension(250, 150);
protected Background background4Painting; // 设计器预览界面中绘制组件背景图 protected Background background4Painting; // 设计器预览界面中绘制组件背景图
protected double backgroundOpacity4Painting; // 设计器预览界面中绘制组件背景图
protected Background borderImage4Painting; // 设计器预览界面中绘制边框图片
protected double borderImageOpacity4Painting;
public XBorderStyleWidgetCreator(Widget widget, Dimension initSize) { public XBorderStyleWidgetCreator(Widget widget, Dimension initSize) {
super(widget, initSize); super(widget, initSize);
@ -49,9 +52,26 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{
return this.background4Painting; return this.background4Painting;
} }
public void setBackground4Painting(Background background4Painting) { public double getBackgroundOpacity4Painting() {
this.background4Painting = background4Painting; return backgroundOpacity4Painting;
this.repaint(); }
public void setBackground4Painting(Background background, double opacity) {
this.background4Painting = background;
this.backgroundOpacity4Painting = opacity;
}
public Background getBorderImage4Painting() {
return borderImage4Painting;
}
public double getBorderImageOpacity4Painting() {
return borderImageOpacity4Painting;
}
public void setBorderImage4Painting(Background borderImage, double opacity) {
this.borderImage4Painting = borderImage;
this.borderImageOpacity4Painting = opacity;
} }
/** /**
@ -102,8 +122,13 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{
} }
this.setBorder(border); this.setBorder(border);
if (style != null) {
this.setBackground4Painting(style != null ? style.getBackground() : null); this.setBorderImage4Painting(style.getBorderImage(), style.getBorderImageOpacity());
this.setBackground4Painting(style.getBackground(), style.getAlpha());
} else {
this.setBorderImage4Painting(null, 0.0);
this.setBackground4Painting(null, 0.0);
}
} }
private void clearTitleWidget() { private void clearTitleWidget() {
@ -183,10 +208,17 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{
XCreator titleCreator = titleParent.getTitleCreator(); XCreator titleCreator = titleParent.getTitleCreator();
XCreator bodyXCreator = titleParent.getBodyCreator(); XCreator bodyXCreator = titleParent.getBodyCreator();
Border border = bodyXCreator.getBorder(); reshuffleBorderPaintingEffectIfTitleExists(titleParent, titleCreator, bodyXCreator);
reshuffleBackgroundPaintingEffectIfTitleExists(titleParent, titleCreator, bodyXCreator);
}
}
}
private void reshuffleBorderPaintingEffectIfTitleExists(XWTitleLayout parentCreator, XCreator titleCreator, XCreator bodyCreator) {
Border border = bodyCreator.getBorder();
titleParent.setBorder(border); // 容器绘制完整边框 parentCreator.setBorder(border); // 容器绘制完整边框
bodyXCreator.setBorder(BorderFactory.createEmptyBorder()); // body不绘制边框 bodyCreator.setBorder(BorderFactory.createEmptyBorder()); // body不绘制边框
titleCreator.setBorder(BorderFactory.createEmptyBorder()); // title绘制底部边框 titleCreator.setBorder(BorderFactory.createEmptyBorder()); // title绘制底部边框
if (border instanceof LineBorder) { if (border instanceof LineBorder) {
Color color = ((LineBorder) border).getLineColor(); Color color = ((LineBorder) border).getLineColor();
@ -194,15 +226,35 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{
titleCreator.setBorder(new BottomLineBorder(color, thickness)); titleCreator.setBorder(new BottomLineBorder(color, thickness));
} }
// 主体背景的生效范围暂时保持原样,不作用于包含标题区域的整体范围内 if (bodyCreator instanceof XBorderStyleWidgetCreator) {
// if (bodyXCreator instanceof XBorderStyleWidgetCreator) { XBorderStyleWidgetCreator styledBodyXCreator = (XBorderStyleWidgetCreator) bodyCreator;
// XBorderStyleWidgetCreator styledBodyXCreator = (XBorderStyleWidgetCreator) bodyXCreator; Background borderImage= styledBodyXCreator.getBorderImage4Painting();
// Background background4Painting = styledBodyXCreator.getBackground4Painting(); double opacity = styledBodyXCreator.getBorderImageOpacity4Painting();
//
// styledBodyXCreator.setBackground4Painting(null); // body不绘制背景 styledBodyXCreator.setBorderImage4Painting(null, 0.0); // body不绘制图片边框
// titleParent.setBackground4Painting(background4Painting); // 容器绘制完整背景 parentCreator.setBorderImage4Painting(borderImage, opacity); // 容器绘制完整图片边框
// } }
}
private void reshuffleBackgroundPaintingEffectIfTitleExists(XWTitleLayout parentCreator, XCreator titleCreator, XCreator bodyCreator) {
if (titleCreator instanceof XLabel) {
XLabel labelCreator = (XLabel) titleCreator;
Label titleLabel = labelCreator.toData();
Background background = titleLabel.getBackground();
double opacity = titleLabel.getBackgroundOpacity();
labelCreator.setEnabledBackgroundPainting(false); // 标题不绘制背景
parentCreator.setTitleBackground4Painting(background, opacity); // 容器绘制完整背景
} }
if (bodyCreator instanceof XBorderStyleWidgetCreator) {
XBorderStyleWidgetCreator styledBodyXCreator = (XBorderStyleWidgetCreator) bodyCreator;
Background background = styledBodyXCreator.getBackground4Painting();
double opacity = styledBodyXCreator.getBackgroundOpacity4Painting();
styledBodyXCreator.setBackground4Painting(null, 0.0); // body不绘制背景
parentCreator.setBodyBackground4Painting(background, opacity); // 容器绘制完整背景
} }
} }
@ -226,10 +278,22 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{
public void paintBackground(Graphics2D g2d) { public void paintBackground(Graphics2D g2d) {
Background background4Painting = getBackground4Painting(); Background background4Painting = getBackground4Painting();
if (background4Painting != null) { if (background4Painting != null) {
BorderPacker style = toData().getBorderStyle();
Composite oldComposite = g2d.getComposite(); Composite oldComposite = g2d.getComposite();
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, style.getAlpha())); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, (float) backgroundOpacity4Painting));
background4Painting.paint(g2d, new Rectangle2D.Double(0, 0, getWidth(), getHeight()));
Shape shape = new Rectangle2D.Double(0, 0, getWidth(), getHeight());
background4Painting.paint(g2d, shape);
g2d.setComposite(oldComposite);
}
}
public void paintBorderImage(Graphics2D g2d) {
Background borderImage4Painting = getBorderImage4Painting();
if (borderImage4Painting != null) {
Composite oldComposite = g2d.getComposite();
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, (float) borderImageOpacity4Painting));
borderImage4Painting.paint(g2d, new Rectangle2D.Double(0, 0, getWidth(), getHeight()));
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
} }
} }
@ -243,6 +307,7 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{
public void paint(Graphics g) { public void paint(Graphics g) {
this.clipByRoundedBorder((Graphics2D) g); this.clipByRoundedBorder((Graphics2D) g);
this.paintBackground((Graphics2D) g); this.paintBackground((Graphics2D) g);
this.paintBorderImage((Graphics2D) g);
this.paintForeground((Graphics2D) g); this.paintForeground((Graphics2D) g);
} }
@ -293,7 +358,7 @@ public class XBorderStyleWidgetCreator extends XWidgetCreator{
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(getLineColor()); g2d.setColor(getLineColor());
g2d.setStroke(new BasicStroke(getThickness())); g2d.setStroke(new BasicStroke(getThickness() * 2));
g2d.drawLine(0, height, width, height); g2d.drawLine(0, height, width, height);
g2d.setStroke(oldStroke); g2d.setStroke(oldStroke);

9
designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java

@ -776,8 +776,13 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
if (popup == null) { if (popup == null) {
popup = new SelectedPopupDialog(this, designer); popup = new SelectedPopupDialog(this, designer);
} }
int extraX = (int) ((bounds.x + bounds.width + SelectedPopupDialog.OFFSET_X) * designer.getScale()); int creatorRightX = (int) ((bounds.x + bounds.width + SelectedPopupDialog.OFFSET_X) * designer.getScale());
int extraY = (int) (bounds.y * designer.getScale()); int creatorRightY = (int) (bounds.y * designer.getScale());
int formDesignerWidth = designer.getWidth();
int formDesignerHeight = designer.getHeight();
// 不超过可绘制区域
int extraX = Math.min(creatorRightX, formDesignerWidth);
int extraY = creatorRightY < 0 ? 0 : Math.min(creatorRightY, formDesignerHeight);
// 放到事件尾部执行 // 放到事件尾部执行
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override

8
designer-form/src/main/java/com/fr/design/designer/creator/XLabel.java

@ -19,7 +19,6 @@ import com.fr.form.ui.Label;
import com.fr.form.ui.container.WParameterLayout; import com.fr.form.ui.container.WParameterLayout;
import com.fr.general.Background; import com.fr.general.Background;
import com.fr.general.act.BorderPacker;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
import com.fr.stable.Constants; import com.fr.stable.Constants;
import com.fr.stable.core.PropertyChangeAdapter; import com.fr.stable.core.PropertyChangeAdapter;
@ -36,11 +35,16 @@ import java.beans.IntrospectionException;
public class XLabel extends XWidgetCreator { public class XLabel extends XWidgetCreator {
private int cornerSize = 15; private int cornerSize = 15;
private boolean enabledBackgroundPainting = true;
public XLabel(Label widget, Dimension initSize) { public XLabel(Label widget, Dimension initSize) {
super(widget, initSize); super(widget, initSize);
} }
public void setEnabledBackgroundPainting(boolean enable) {
this.enabledBackgroundPainting = enable;
}
/** /**
* 生成creator对应的控件widget * 生成creator对应的控件widget
* *
@ -93,7 +97,7 @@ public class XLabel extends XWidgetCreator {
Dimension size = this.getSize(); Dimension size = this.getSize();
//先画背景,再画标题 //先画背景,再画标题
Background background = label.getBackground(); Background background = label.getBackground();
if (background != null) { if (background != null && enabledBackgroundPainting) {
Graphics2D g2d = (Graphics2D) g; Graphics2D g2d = (Graphics2D) g;
Composite oldComposite = g2d.getComposite(); Composite oldComposite = g2d.getComposite();
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, label.getBackgroundOpacity())); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, label.getBackgroundOpacity()));

54
designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java

@ -12,10 +12,12 @@ import com.fr.form.ui.Widget;
import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.WidgetTitle;
import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget; import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
import com.fr.form.ui.container.WTitleLayout; import com.fr.form.ui.container.WTitleLayout;
import com.fr.general.Background;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import java.awt.*; import java.awt.*;
import java.awt.event.ContainerEvent; import java.awt.event.ContainerEvent;
import java.awt.geom.Rectangle2D;
/** /**
* 一些控件 如图表报表块有标题设置且标题的高度字体等不变 * 一些控件 如图表报表块有标题设置且标题的高度字体等不变
@ -31,6 +33,11 @@ public class XWTitleLayout extends DedicateLayoutContainer {
private static final int INDEX = 0; private static final int INDEX = 0;
protected Background titleBackground4Painting; // 设计器预览界面中绘制title背景图
protected double titleBackgroundOpacity4Painting;
protected Background bodyBackground4Painting; // 设计器预览界面中绘制body背景图
protected double bodyBackgroundOpacity4Painting;
public XWTitleLayout() { public XWTitleLayout() {
super(new WTitleLayout("titlePane"), new Dimension()); super(new WTitleLayout("titlePane"), new Dimension());
} }
@ -45,6 +52,16 @@ public class XWTitleLayout extends DedicateLayoutContainer {
super(widget, initSize); super(widget, initSize);
} }
public void setTitleBackground4Painting(Background background, double opacity) {
this.titleBackground4Painting = background;
this.titleBackgroundOpacity4Painting = opacity;
}
public void setBodyBackground4Painting(Background background, double opacity) {
this.bodyBackground4Painting = background;
this.bodyBackgroundOpacity4Painting = opacity;
}
@Override @Override
protected void initXCreatorProperties() { protected void initXCreatorProperties() {
super.initXCreatorProperties(); super.initXCreatorProperties();
@ -150,6 +167,43 @@ public class XWTitleLayout extends DedicateLayoutContainer {
} }
@Override
public void paintBackground(Graphics2D g2d) {
if (getComponentCount() > 1) {
paintTitleBackground(g2d);
paintBodyBackground(g2d);
}
}
private void paintTitleBackground(Graphics2D g2d) {
if (titleBackground4Painting != null) {
Composite oldComposite = g2d.getComposite();
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, (float) this.titleBackgroundOpacity4Painting));
XCreator titleCreator = getTitleCreator();
int titleHeight = titleCreator != null ? titleCreator.getHeight() : 0;
Shape shape = new Rectangle2D.Double(0, 0, getWidth(), titleHeight);
titleBackground4Painting.paint(g2d, shape);
g2d.setComposite(oldComposite);
}
}
private void paintBodyBackground(Graphics2D g2d) {
if (bodyBackground4Painting != null) {
Composite oldComposite = g2d.getComposite();
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, (float) this.bodyBackgroundOpacity4Painting));
XCreator titleCreator = getTitleCreator();
int titleHeight = titleCreator != null ? titleCreator.getHeight() : 0;
// 兼容性考虑,组件样式背景不作用在标题范围内,只作用在控件整体,但同时不能遮挡作用于整体的边框图片
// 所以考虑样式背景与边框图片都由XWTitleLayout绘制,但样式背景要向下偏移标题栏的高度
Shape shape = new Rectangle2D.Double(0, titleHeight, getWidth(), getHeight() - titleHeight);
bodyBackground4Painting.paint(g2d, shape);
g2d.setComposite(oldComposite);
}
}
/** /**
* 将WLayout转换为XLayoutContainer * 将WLayout转换为XLayoutContainer

16
designer-form/src/main/java/com/fr/design/gui/xpane/BorderLineAndImagePane.java

@ -26,6 +26,7 @@ import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.backgroundpane.ImagePreviewPane; import com.fr.design.mainframe.backgroundpane.ImagePreviewPane;
import com.fr.design.style.background.image.ImageFileChooser; import com.fr.design.style.background.image.ImageFileChooser;
import com.fr.design.style.color.NewColorSelectBox;
import com.fr.env.utils.DesignerInteractionHistory; import com.fr.env.utils.DesignerInteractionHistory;
import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.LayoutBorderStyle;
import com.fr.general.Background; import com.fr.general.Background;
@ -85,7 +86,7 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
private UIObserverListener uiObserverListener; private UIObserverListener uiObserverListener;
private BorderLineAndImageComboBox borderLineCombo; private BorderLineAndImageComboBox borderLineCombo;
private UIColorButton borderColorPane; private NewColorSelectBox borderColorPane;
private ImagePreviewPane imagePreviewPane; private ImagePreviewPane imagePreviewPane;
private UIButton chooseImageButton; private UIButton chooseImageButton;
private UIButton tweakNinePointHelpButton; private UIButton tweakNinePointHelpButton;
@ -104,10 +105,7 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
private void initComponents() { private void initComponents() {
borderLineCombo = new BorderLineAndImageComboBox(); borderLineCombo = new BorderLineAndImageComboBox();
borderColorPane = new UIColorButton(null) {{ borderColorPane = new NewColorSelectBox(145);
setUI(createButtonUI(this));
set4ToolbarButton();
}};
imagePreviewPane = new ImagePreviewPane() {{ imagePreviewPane = new ImagePreviewPane() {{
setImageStyle(Style.DEFAULT_STYLE); setImageStyle(Style.DEFAULT_STYLE);
}}; }};
@ -228,7 +226,7 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
getComponent(2).setVisible(borderLineCombo.isSelectedBorderImage()); getComponent(2).setVisible(borderLineCombo.isSelectedBorderImage());
if (!borderLineCombo.isSelectedBorderLine()) { if (!borderLineCombo.isSelectedBorderLine()) {
borderColorPane.setColor(Color.BLACK); borderColorPane.setSelectObject(Color.BLACK);
} }
if (!borderLineCombo.isSelectedBorderImage()) { if (!borderLineCombo.isSelectedBorderImage()) {
imagePreviewPane.setImageWithSuffix(null); imagePreviewPane.setImageWithSuffix(null);
@ -294,7 +292,7 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
Color borderColor = style.getColor(); Color borderColor = style.getColor();
this.borderLineCombo.setSelectedLineStyle(borderLine); this.borderLineCombo.setSelectedLineStyle(borderLine);
this.borderColorPane.setColor(borderColor); this.borderColorPane.setSelectObject(borderColor);
Background borderImage = style.getBorderImage(); Background borderImage = style.getBorderImage();
if (borderImage instanceof ImageBackground) { if (borderImage instanceof ImageBackground) {
@ -332,13 +330,13 @@ public class BorderLineAndImagePane extends JPanel implements UIObserver {
} }
this.borderLineCombo.setSelectedLineStyle(style.getBorder()); this.borderLineCombo.setSelectedLineStyle(style.getBorder());
this.borderColorPane.setColor(style.getColor()); this.borderColorPane.setSelectObject(style.getColor());
} }
public void updateBean(LayoutBorderStyle style) { public void updateBean(LayoutBorderStyle style) {
style.setBorder(this.borderLineCombo.getSelectedLineStyle()); style.setBorder(this.borderLineCombo.getSelectedLineStyle());
style.setColor(this.borderColorPane.getColor()); style.setColor(this.borderColorPane.getSelectObject());
style.setBorderImage(null); style.setBorderImage(null);
if (this.borderLineCombo.isSelectedBorderImage()) { if (this.borderLineCombo.isSelectedBorderImage()) {

28
designer-form/src/main/java/com/fr/design/gui/xpane/LayoutStylePane.java

@ -138,8 +138,13 @@ public class LayoutStylePane extends BasicBeanPane<LayoutBorderStyle> {
double[] rowSize = {p, p, p, p}; double[] rowSize = {p, p, p, p};
double[] columnSize = {SETTING_LABEL_WIDTH, f}; double[] columnSize = {SETTING_LABEL_WIDTH, f};
UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget-Style_Background_Style"));
Font font = uiLabel.getFont().deriveFont(Font.BOLD);
uiLabel.setFont(font);
uiLabel.setForeground(new Color(143, 143, 146));
JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(new JComponent[][]{ JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(new JComponent[][]{
{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget-Style_Background_Style")), null}, {uiLabel, null},
{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Render_Style")), borderStyleCombo}, {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Render_Style")), borderStyleCombo},
{this.borderLineAndImagePane, null}, {this.borderLineAndImagePane, null},
{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Radius")), cornerSpinner}, {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Radius")), cornerSpinner},
@ -168,8 +173,12 @@ public class LayoutStylePane extends BasicBeanPane<LayoutBorderStyle> {
this.backgroundPane, this.backgroundPane,
this.backgroundOpacityPane); this.backgroundOpacityPane);
UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget-Style_Body_Content"));
Font font = uiLabel.getFont().deriveFont(Font.BOLD);
uiLabel.setFont(font);
uiLabel.setForeground(new Color(143, 143, 146));
JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(new JComponent[][]{ JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(new JComponent[][]{
{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget-Style_Body_Content")), null}, {uiLabel, null},
{bodyBackground, null}, {bodyBackground, null},
}, },
rowSize, columnSize, IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L1); rowSize, columnSize, IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L1);
@ -215,6 +224,15 @@ public class LayoutStylePane extends BasicBeanPane<LayoutBorderStyle> {
titleTextPane = new TinyFormulaPane(); titleTextPane = new TinyFormulaPane();
titleFontFamilyComboBox = new UIComboBox(Utils.getAvailableFontFamilyNames4Report()); titleFontFamilyComboBox = new UIComboBox(Utils.getAvailableFontFamilyNames4Report());
TitlePacker title = style.getTitle();
if (title != null) {
FRFont frFont = title.getFrFont();
if (frFont != null) {
String fontFamily = frFont.getFamily();
// 使用style中默认的字体初始化titleFontFamilyComboBox,保证UI和数据的一致性
this.titleFontFamilyComboBox.setSelectedItem(fontFamily);
}
}
titleFontFamilyComboBox.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Family")); titleFontFamilyComboBox.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_FRFont_Family"));
titleFontSizeComboBox = new UIComboBox(FRFontPane.FONT_SIZES); titleFontSizeComboBox = new UIComboBox(FRFontPane.FONT_SIZES);
@ -289,8 +307,12 @@ public class LayoutStylePane extends BasicBeanPane<LayoutBorderStyle> {
visibleComposedPane.add(titleVisibleCheckbox, BorderLayout.WEST); visibleComposedPane.add(titleVisibleCheckbox, BorderLayout.WEST);
visibleComposedPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Visible")), BorderLayout.CENTER); visibleComposedPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title_Visible")), BorderLayout.CENTER);
UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title"));
Font font = uiLabel.getFont().deriveFont(Font.BOLD);
uiLabel.setFont(font);
uiLabel.setForeground(new Color(143, 143, 146));
JPanel topPane = TableLayoutHelper.createCommonTableLayoutPane( new JComponent[][] { JPanel topPane = TableLayoutHelper.createCommonTableLayoutPane( new JComponent[][] {
{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Style_Title")), null}, {uiLabel, null},
{visibleComposedPane, null} {visibleComposedPane, null}
}, new double[]{p, p}, new double[]{SETTING_LABEL_WIDTH, p}, IntervalConstants.INTERVAL_L1); }, new double[]{p, p}, new double[]{SETTING_LABEL_WIDTH, p}, IntervalConstants.INTERVAL_L1);
topPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); topPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));

20
designer-form/src/main/java/com/fr/design/gui/xpane/TitleInsetImagePane.java

@ -57,6 +57,7 @@ public class TitleInsetImagePane extends JPanel implements UIObserver {
private UIButton imageChooseButton; private UIButton imageChooseButton;
private UIButton imageDeleteButton; private UIButton imageDeleteButton;
private ImagePreviewPane imagePreviewPane; private ImagePreviewPane imagePreviewPane;
private JPanel imagePreviewOverlayPane;
private UIButtonGroup<Integer> imageLocationPane; private UIButtonGroup<Integer> imageLocationPane;
private UISpinner imagePaddingPane; private UISpinner imagePaddingPane;
@ -89,24 +90,24 @@ public class TitleInsetImagePane extends JPanel implements UIObserver {
deletableImagePreviewPane.setLayout(null); deletableImagePreviewPane.setLayout(null);
deletableImagePreviewPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, 5)); deletableImagePreviewPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, 5));
deletableImagePreviewPane.setPreferredSize(new Dimension(IMAGE_PREVIEW_SIZE, IMAGE_PREVIEW_SIZE)); deletableImagePreviewPane.setPreferredSize(new Dimension(IMAGE_PREVIEW_SIZE, IMAGE_PREVIEW_SIZE));
JPanel overlayPane = new JPanel(); imagePreviewOverlayPane = new JPanel();
overlayPane.setPreferredSize(new Dimension(IMAGE_PREVIEW_SIZE - 2, IMAGE_PREVIEW_SIZE - 2)); imagePreviewOverlayPane.setPreferredSize(new Dimension(IMAGE_PREVIEW_SIZE - 2, IMAGE_PREVIEW_SIZE - 2));
overlayPane.setBackground(IMAGE_PREVIEW_OVERLAY_COLOR); imagePreviewOverlayPane.setBackground(IMAGE_PREVIEW_OVERLAY_COLOR);
imagePreviewPane.setBounds(0, 0, IMAGE_PREVIEW_SIZE, IMAGE_PREVIEW_SIZE); imagePreviewPane.setBounds(0, 0, IMAGE_PREVIEW_SIZE, IMAGE_PREVIEW_SIZE);
overlayPane.setBounds(1, 1, IMAGE_PREVIEW_SIZE - 2, IMAGE_PREVIEW_SIZE - 2); imagePreviewOverlayPane.setBounds(1, 1, IMAGE_PREVIEW_SIZE - 2, IMAGE_PREVIEW_SIZE - 2);
imageDeleteButton.setBounds(IMAGE_PREVIEW_SIZE - DELETE_BUTTON_SIZE, 0, DELETE_BUTTON_SIZE, DELETE_BUTTON_SIZE); imageDeleteButton.setBounds(IMAGE_PREVIEW_SIZE - DELETE_BUTTON_SIZE, 0, DELETE_BUTTON_SIZE, DELETE_BUTTON_SIZE);
deletableImagePreviewPane.add(imageDeleteButton, 0); deletableImagePreviewPane.add(imageDeleteButton, 0);
deletableImagePreviewPane.add(overlayPane, 1); deletableImagePreviewPane.add(imagePreviewOverlayPane, 1);
deletableImagePreviewPane.add(imagePreviewPane, 2); deletableImagePreviewPane.add(imagePreviewPane, 2);
overlayPane.setVisible(false); imagePreviewOverlayPane.setVisible(false);
imageDeleteButton.setVisible(false); imageDeleteButton.setVisible(false);
imageDeleteButton.setEnabled(false); imageDeleteButton.setEnabled(false);
deletableImagePreviewPane.addMouseListener(new MouseAdapter() { deletableImagePreviewPane.addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseEntered(MouseEvent e) { public void mouseEntered(MouseEvent e) {
super.mouseEntered(e); super.mouseEntered(e);
overlayPane.setVisible(true); imagePreviewOverlayPane.setVisible(true);
imageDeleteButton.setVisible(true); imageDeleteButton.setVisible(true);
imageDeleteButton.setEnabled(true); imageDeleteButton.setEnabled(true);
} }
@ -117,7 +118,7 @@ public class TitleInsetImagePane extends JPanel implements UIObserver {
int x = e.getX(); int x = e.getX();
int y = e.getY(); int y = e.getY();
if (x <= 0 || getWidth() <= x || y <= 0 || y >= getHeight()) { if (x <= 0 || getWidth() <= x || y <= 0 || y >= getHeight()) {
overlayPane.setVisible(false); imagePreviewOverlayPane.setVisible(false);
imageDeleteButton.setVisible(false); imageDeleteButton.setVisible(false);
imageDeleteButton.setEnabled(false); imageDeleteButton.setEnabled(false);
} }
@ -216,6 +217,9 @@ public class TitleInsetImagePane extends JPanel implements UIObserver {
imagePreviewPane.setImageWithSuffix(null); imagePreviewPane.setImageWithSuffix(null);
imageLocationPane.setSelectedIndex(DEFAULT_INSET_LOCATION_INDEX); imageLocationPane.setSelectedIndex(DEFAULT_INSET_LOCATION_INDEX);
imagePaddingPane.setValue(DEFAULT_INSET_PADDING); imagePaddingPane.setValue(DEFAULT_INSET_PADDING);
imagePreviewOverlayPane.setVisible(false);
imageDeleteButton.setVisible(false);
imageDeleteButton.setEnabled(false);
getComponent(1).setVisible(false); getComponent(1).setVisible(false);
fireStateChanged(); fireStateChanged();

6
designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java

@ -408,6 +408,9 @@ public class ComponentTree extends JTree {
@Override @Override
public void mouseReleased(MouseEvent e) { public void mouseReleased(MouseEvent e) {
if (e.isControlDown() || e.isShiftDown()) {
return;
}
if (e.getButton() == MouseEvent.BUTTON1 && selectedCreator != null) { if (e.getButton() == MouseEvent.BUTTON1 && selectedCreator != null) {
showSelectedPopup(selectedCreator); showSelectedPopup(selectedCreator);
} }
@ -426,6 +429,9 @@ public class ComponentTree extends JTree {
* @param consumer * @param consumer
*/ */
private void onMouseEvent(final MouseEvent e, Consumer<XCreator> consumer) { private void onMouseEvent(final MouseEvent e, Consumer<XCreator> consumer) {
if (e.isControlDown() || e.isShiftDown()) {
return;
}
Point p = e.getPoint(); Point p = e.getPoint();
// 解析组件树路径 获取选中的组件 // 解析组件树路径 获取选中的组件
int selRow = tree.getRowForLocation(p.x, p.y); int selRow = tree.getRowForLocation(p.x, p.y);

10
designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java

@ -2,12 +2,13 @@ package com.fr.design.mainframe;
import com.fr.base.GraphHelper; import com.fr.base.GraphHelper;
import com.fr.design.form.util.XCreatorConstants; import com.fr.design.form.util.XCreatorConstants;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.icon.IconPathConstants; import com.fr.design.icon.IconPathConstants;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import com.fr.stable.Constants; import com.fr.stable.Constants;
import java.awt.BasicStroke;
import java.awt.Stroke;
import javax.swing.JComponent; import javax.swing.JComponent;
import java.awt.AlphaComposite; import java.awt.AlphaComposite;
import java.awt.Color; import java.awt.Color;
@ -32,6 +33,8 @@ public class CoverPane extends JComponent {
protected static final int BORDER_WIDTH = 2; protected static final int BORDER_WIDTH = 2;
public static final int EDIT_BTN_W = 75; public static final int EDIT_BTN_W = 75;
public static final int EDIT_BTN_H = 20; public static final int EDIT_BTN_H = 20;
private static final int BORDER_GAP = 2;
private static final BasicStroke BORDER_STROKE = new BasicStroke(2f);
public static void paintEditButton(Graphics g, Component component) { public static void paintEditButton(Graphics g, Component component) {
int x = 0; int x = 0;
@ -82,6 +85,11 @@ public class CoverPane extends JComponent {
g2d.setColor(XCreatorConstants.COVER_COLOR); g2d.setColor(XCreatorConstants.COVER_COLOR);
g2d.fillRect(0, 0, component.getWidth(), component.getHeight()); g2d.fillRect(0, 0, component.getWidth(), component.getHeight());
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
g2d.setColor(XCreatorConstants.FORM_BORDER_COLOR);
Stroke oldStroke = g2d.getStroke();
g2d.setStroke(BORDER_STROKE);
g2d.drawRect(BORDER_GAP, BORDER_GAP, component.getWidth() - BORDER_GAP * 2, component.getHeight() - BORDER_GAP * 2);
g2d.setStroke(oldStroke);
} }
public CoverPane() { public CoverPane() {

2
designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java

@ -647,7 +647,7 @@ public class EditingMouseListener extends MouseInputAdapter {
@Override @Override
public void run() { public void run() {
for (XCreator xCreator : xCreators) { for (XCreator xCreator : xCreators) {
xCreator.setSelected(!e.isShiftDown()); xCreator.setSelected(!e.isShiftDown() && !e.isControlDown());
} }
} }
}); });

5
designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java

@ -145,6 +145,11 @@ public class FormCreatorDropTarget extends DropTarget {
tabDragInner.tryDragIn(); tabDragInner.tryDragIn();
} else { } else {
Toolkit.getDefaultToolkit().beep(); Toolkit.getDefaultToolkit().beep();
// 拖入失败 取消选中
XCreator creator = addingModel.getXCreator();
if (creator != null) {
creator.setSelected(false);
}
} }
// 取消提示 // 取消提示
designer.setPainter(null); designer.setPainter(null);

12
designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCaseDesigner.java

@ -44,6 +44,7 @@ import javax.swing.JComponent;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollBar; import javax.swing.JScrollBar;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Transparency; import java.awt.Transparency;
@ -133,13 +134,22 @@ public class FormElementCaseDesigner
int width = size.width; int width = size.width;
int height = size.height; int height = size.height;
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); // 使用TYPE_INT_RGB和new Color(255, 255, 255, 1)设置有透明背景buffer image,
// 使得创建出来的透明像素是(255, 255, 255, 1),而不是(0, 0, 0, 0)
// 这样不支持透明通道缩略图的旧设计器打开新设计器创建的模版时,就不会创建出拥有黑色背景的缩略图
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics(); Graphics2D g2d = image.createGraphics();
// 创建一个支持透明背景的buffer image // 创建一个支持透明背景的buffer image
image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
g2d.dispose(); g2d.dispose();
g2d = image.createGraphics(); g2d = image.createGraphics();
// 使用TYPE_INT_RGB和new Color(255, 255, 255, 1)设置有透明背景buffer image,
// 使得创建出来的透明像素是(255, 255, 255, 1),而不是(0, 0, 0, 0)
// 这样不支持透明通道缩略图的旧设计器打开新设计器创建的模版时,就不会创建出拥有黑色背景的缩略图
g2d.setColor(new Color(255, 255, 255, 1));
g2d.fillRect(0, 0, (int) size.getWidth(), (int) size.getHeight());
Grid grid = this.elementCasePane != null ? this.elementCasePane.getGrid() : null; Grid grid = this.elementCasePane != null ? this.elementCasePane.getGrid() : null;
if (grid != null) { if (grid != null) {
boolean oldTranslucent = grid.isTranslucent(); boolean oldTranslucent = grid.isTranslucent();

Loading…
Cancel
Save