Browse Source

Merge pull request #4882 in DESIGN/design from feature/10.0 to feature/big-screen

* commit '24af5d34cd0e21fbb9e9f1b5e3fe5cb995513253':
  REPORT-54604 参数面板放置默认不可见的预定义控件后,修改控件属性,控件在参数面板丢失显示
  CHART-19708 图表块图表标题背景修改
  REPORT-54122 设计器组件悬停/选中/编辑状态优化
feature/big-screen
superman 3 years ago
parent
commit
f62ff0ab86
  1. BIN
      designer-base/src/main/resources/com/fr/design/images/control/show_edit.png
  2. BIN
      designer-base/src/main/resources/com/fr/design/images/control/show_setting.png
  3. 9
      designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java
  4. 12
      designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java
  5. 13
      designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java
  6. 9
      designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java
  7. 14
      designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubbleStylePane.java
  8. 5
      designer-chart/src/main/java/com/fr/van/chart/custom/style/VanChartCustomStylePane.java
  9. 26
      designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartStylePane.java
  10. 25
      designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitlePane.java
  11. 52
      designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java
  12. 15
      designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaPane.java
  13. 47
      designer-form/src/main/java/com/fr/design/designer/creator/SelectedBorderIcon.java
  14. 22
      designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java
  15. 1
      designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java
  16. 82
      designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java
  17. 40
      designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java
  18. 11
      designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java
  19. 39
      designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java
  20. 3
      designer-form/src/main/java/com/fr/design/mainframe/FormSelection.java

BIN
designer-base/src/main/resources/com/fr/design/images/control/show_edit.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

BIN
designer-base/src/main/resources/com/fr/design/images/control/show_setting.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

9
designer-chart/src/main/java/com/fr/design/chart/gui/ChartWidgetOption.java

@ -1,10 +1,12 @@
package com.fr.design.chart.gui;
import com.fr.base.chart.BaseChartGetter;
import com.fr.chart.chartattr.ChartCollection;
import com.fr.design.gui.core.WidgetOption;
import com.fr.form.ui.ChartEditor;
import com.fr.form.ui.Widget;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.vanchart.VanChart;
import javax.swing.Icon;
@ -37,7 +39,12 @@ public class ChartWidgetOption extends WidgetOption {
Class<? extends ChartEditor> clz = widgetClass();
try {
ChartEditor widget = clz.newInstance();
widget.resetChangeChartCollection(BaseChartGetter.createChartCollection(this.chartID));
ChartCollection chartCollection = (ChartCollection) BaseChartGetter.createChartCollection(this.chartID);
VanChart vanChart = chartCollection.getSelectedChartProvider(VanChart.class);
if (vanChart !=null) {
vanChart.resetAttrInForm();
}
widget.resetChangeChartCollection(chartCollection);
return widget;
} catch (InstantiationException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);

12
designer-chart/src/main/java/com/fr/design/mainframe/chart/ChartEditPane.java

@ -22,6 +22,7 @@ import com.fr.design.mainframe.chart.gui.ChartStylePane;
import com.fr.design.mainframe.chart.gui.ChartTypePane;
import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane;
import com.fr.design.mainframe.chart.info.ChartInfoCollector;
import com.fr.form.main.Form;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.vanchart.VanChart;
@ -198,6 +199,7 @@ public class ChartEditPane extends BasicPane implements AttributeChange, Prepare
AbstractChartAttrPane[] otherPaneList = ChartTypeInterfaceManager.getInstance().getAttrPaneArray(chartID, listener);
for (int i = 0; i < otherPaneList.length; i++) {
otherPaneList[i].addAttributeChangeListener(listener);
otherPaneList[i].registerChartEditPane(this);
paneList.add(otherPaneList[i]);
}
this.isDefaultPane = false;
@ -405,4 +407,14 @@ public class ChartEditPane extends BasicPane implements AttributeChange, Prepare
}
});
}
public boolean isInForm() {
if (container != null && container.getEPane() != null) {
Object target = container.getEPane().getTarget();
if (target instanceof Form) {
return true;
}
}
return false;
}
}

13
designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java

@ -67,6 +67,8 @@ public class ChartTypeButtonPane extends BasicBeanPane<ChartCollection> implemen
registerSupportChangeConfigChartClass(VanChart.class);
}
private boolean inForm;
private UIButton addButton;
private UIButton configButton;
private UIButton copyButton;
@ -160,10 +162,17 @@ public class ChartTypeButtonPane extends BasicBeanPane<ChartCollection> implemen
addButton.addActionListener((e) -> {
String name = getNewChartName();
ChartProvider chart = getChangeStateNewChart();
checkInForm(chart);
addNewChart(chart, name, editingCollection.getChartCount());
});
}
private void checkInForm(ChartProvider chart) {
if (inForm) {
chart.resetAttrInForm();
}
}
private void initConfigButton() {
configButton.setPreferredSize(new Dimension(20, 20));
configButton.addActionListener((e) -> showConfigDialog());
@ -680,4 +689,8 @@ public class ChartTypeButtonPane extends BasicBeanPane<ChartCollection> implemen
currentEditingEditor.requestFocus();
}
}
public void refreshChartInForm(boolean inForm) {
this.inForm = inForm;
}
}

9
designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java

@ -49,6 +49,7 @@ public class ChartTypePane extends AbstractChartAttrPane {
private ChartEditPane editPane;
private ChartCollection editingCollection;
private ActionListener autoButtonListener;
private boolean inForm;
@Override
protected JPanel createContentPane() {
@ -56,6 +57,7 @@ public class ChartTypePane extends AbstractChartAttrPane {
JPanel content = new JPanel(new BorderLayout());
buttonPane = new ChartTypeButtonPane(this);
buttonPane.refreshChartInForm(inForm);
content.add(buttonPane, BorderLayout.NORTH);
if (editingCollection != null) {
@ -220,8 +222,10 @@ public class ChartTypePane extends AbstractChartAttrPane {
}
//这一步会替换plot
((AbstractChartTypePane) getSelectedPane()).updateBean(chart);
reLayoutEditPane(chart,lastPlotID);
if (inForm) {
chart.resetAttrInForm();
}
reLayoutEditPane(chart, lastPlotID);
}
protected UIComboBox createComboBox() {
@ -445,5 +449,6 @@ public class ChartTypePane extends AbstractChartAttrPane {
*/
public void registerChartEditPane(ChartEditPane currentEditPane) {
this.editPane = currentEditPane;
this.inForm = editPane.isInForm();
}
}

14
designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubbleStylePane.java

@ -21,9 +21,9 @@ public class VanChartBubbleStylePane extends VanChartScatterStylePane {
super(listener);
}
protected void addVanChartTooltipPane(List<BasicPane> paneList){
protected void addVanChartTooltipPane(List<BasicPane> paneList) {
Plot plot = getChart().getPlot();
if(((VanChartBubblePlot) plot).isForceBubble()){
if (((VanChartBubblePlot) plot).isForceBubble()) {
paneList.add(new VanChartForceBubbleTooltipPane(VanChartBubbleStylePane.this));
} else {
super.addVanChartTooltipPane(paneList);
@ -31,11 +31,11 @@ public class VanChartBubbleStylePane extends VanChartScatterStylePane {
}
@Override
protected void addVanChartAreaPane(List<BasicPane> paneList) {
if (((VanChartBubblePlot)getChart().getPlot()).isForceBubble()){
paneList.add(new VanChartForceBubbleAreaPane(getChart().getPlot(), VanChartBubbleStylePane.this));
}else {
paneList.add(new VanChartAreaPane(getChart().getPlot(), VanChartBubbleStylePane.this));
protected VanChartAreaPane createVanChartAreaPane() {
if (((VanChartBubblePlot) getChart().getPlot()).isForceBubble()) {
return new VanChartForceBubbleAreaPane(getChart().getPlot(), VanChartBubbleStylePane.this);
} else {
return new VanChartAreaPane(getChart().getPlot(), VanChartBubbleStylePane.this);
}
}

5
designer-chart/src/main/java/com/fr/van/chart/custom/style/VanChartCustomStylePane.java

@ -11,6 +11,7 @@ import com.fr.plugin.chart.custom.VanChartCustomPlot;
import com.fr.plugin.chart.custom.type.CustomPlotType;
import com.fr.van.chart.designer.component.richText.VanChartRichEditorPane;
import com.fr.van.chart.designer.style.VanChartStylePane;
import com.fr.van.chart.designer.style.background.VanChartAreaPane;
import java.util.List;
@ -61,8 +62,8 @@ public class VanChartCustomStylePane extends VanChartStylePane {
@Override
protected void addVanChartAreaPane(List<BasicPane> paneList) {
paneList.add(new VanChartCustomAreaPane(getChart().getPlot(), VanChartCustomStylePane.this));
protected VanChartAreaPane createVanChartAreaPane() {
return new VanChartCustomAreaPane(getChart().getPlot(), VanChartCustomStylePane.this);
}
@Override

26
designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartStylePane.java

@ -3,6 +3,7 @@ package com.fr.van.chart.designer.style;
import com.fr.chart.chartattr.Plot;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.frpane.AttributeChangeListener;
import com.fr.design.mainframe.chart.ChartEditPane;
import com.fr.design.mainframe.chart.gui.ChartStylePane;
import com.fr.plugin.chart.attr.plot.VanChartAxisPlot;
import com.fr.van.chart.designer.component.richText.VanChartRichEditorPane;
@ -19,14 +20,20 @@ public class VanChartStylePane extends ChartStylePane {
private static final long serialVersionUID = 186776958263021761L;
private ChartEditPane chartEditPane;
public VanChartStylePane(AttributeChangeListener listener) {
super(listener);
}
protected java.util.List<BasicPane> getPaneList() {
java.util.List<BasicPane> paneList = new ArrayList<BasicPane>();
protected List<BasicPane> getPaneList() {
List<BasicPane> paneList = new ArrayList<BasicPane>();
Plot plot = getChart().getPlot();
paneList.add(createVanChartTitlePane());
boolean inForm = chartEditPane != null ? chartEditPane.isInForm() : false;
VanChartTitlePane vanChartTitlePane = createVanChartTitlePane();
vanChartTitlePane.refreshTooltipLabel(inForm);
paneList.add(vanChartTitlePane);
if (plot.isSupportLegend()) {
paneList.add(new VanChartLegendPane(VanChartStylePane.this));
}
@ -47,7 +54,9 @@ public class VanChartStylePane extends ChartStylePane {
}
}
addVanChartAreaPane(paneList);
VanChartAreaPane vanChartAreaPane = createVanChartAreaPane();
vanChartAreaPane.refreshTooltipLabel(inForm);
paneList.add(vanChartAreaPane);
addVanChartTooltipPane(paneList);
@ -61,8 +70,8 @@ public class VanChartStylePane extends ChartStylePane {
protected void addOtherAxisPane(java.util.List<BasicPane> paneList, Plot plot) {
}
protected void addVanChartAreaPane(List<BasicPane> paneList) {
paneList.add(new VanChartAreaPane(getChart().getPlot(), VanChartStylePane.this));
protected VanChartAreaPane createVanChartAreaPane() {
return new VanChartAreaPane(getChart().getPlot(), VanChartStylePane.this);
}
protected void createVanChartAxisPane(List<BasicPane> paneList, VanChartAxisPlot plot) {
@ -80,4 +89,9 @@ public class VanChartStylePane extends ChartStylePane {
public void refreshTableFieldNames() {
VanChartRichEditorPane.refreshCommonChartFieldNames(getChart());
}
public void registerChartEditPane(ChartEditPane currentEditPane) {
this.chartEditPane = currentEditPane;
}
}

25
designer-chart/src/main/java/com/fr/van/chart/designer/style/VanChartTitlePane.java

@ -13,6 +13,7 @@ import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.gui.ibutton.UIToggleButton;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.chart.PaneTitleConstants;
@ -36,6 +37,7 @@ import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.ActionEvent;
@ -69,6 +71,7 @@ public class VanChartTitlePane extends AbstractVanChartScrollPane<VanChart> {
private JPanel maxProportionPane;
//区域显示策略 恢复用注释。取消注释。
//private LimitPane limitPane;
private UILabel tooltipLabel;
protected VanChartStylePane parent;
@ -88,21 +91,30 @@ public class VanChartTitlePane extends AbstractVanChartScrollPane<VanChart> {
}
private void initComponents() {
isTitleVisible = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Title_Visible"));
titlePane = createTitlePane();
isTitleVisible = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Title_Visible"));
tooltipLabel = new UILabel("<html>" + Toolkit.i18nText("Fine-Design_Chart_Title_Tooltip") + "</html>");
tooltipLabel.setForeground(Color.gray);
tooltipLabel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
tooltipLabel.setVisible(false);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(isTitleVisible, BorderLayout.NORTH);
panel.add(tooltipLabel, BorderLayout.CENTER);
titlePane = createTitlePane();
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double[] columnSize = {f};
double[] rowSize = {p, p, p};
Component[][] components = new Component[][]{
new Component[]{isTitleVisible},
new Component[]{panel},
new Component[]{titlePane}
};
JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
JPanel panel1 = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
this.setLayout(new BorderLayout());
this.add(panel, BorderLayout.CENTER);
this.add(panel1, BorderLayout.CENTER);
isTitleVisible.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
@ -370,4 +382,7 @@ public class VanChartTitlePane extends AbstractVanChartScrollPane<VanChart> {
ChartInfoCollector.getInstance().updateChartConfig(chart, ConfigType.TITLE, chart.getBuryingPointTitleConfig());
}
public void refreshTooltipLabel(boolean inForm) {
tooltipLabel.setVisible(inForm);
}
}

52
designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java

@ -3,6 +3,8 @@ package com.fr.van.chart.designer.style.background;
import com.fr.chart.chartattr.Chart;
import com.fr.chart.chartattr.Plot;
import com.fr.design.gui.frpane.AbstractAttrNoScrollPane;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.chart.PaneTitleConstants;
@ -12,8 +14,10 @@ import com.fr.van.chart.designer.component.background.VanChartBackgroundPane;
import com.fr.van.chart.designer.component.border.VanChartBorderWithRadiusPane;
import com.fr.van.chart.designer.style.background.radar.VanChartRadarAxisAreaPane;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
//图表区|绘图区 边框和背景
@ -25,12 +29,13 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane<Chart
private VanChartAxisAreaPane chartAxisAreaPane;
private JPanel contentPane;
private UILabel tooltipLabel;
private boolean isPlot;//绘图区
private AbstractAttrNoScrollPane parent;
public VanChartAreaBackgroundPane(boolean isPlot, AbstractAttrNoScrollPane parent){
public VanChartAreaBackgroundPane(boolean isPlot, AbstractAttrNoScrollPane parent) {
super();
this.isPlot = isPlot;
this.parent = parent;
@ -50,14 +55,22 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane<Chart
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double[] columnSize = { f };
double[] rowSize = {p,p,p};
double[] columnSize = {f};
double[] rowSize = {p, p, p};
Component[][] components = new Component[][]{
new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Border"),chartBorderPane)},
new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Border"), chartBorderPane)},
new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Background"), chartBackgroundPane)},
};
JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
contentPane.add(panel, BorderLayout.CENTER);
if (!isPlot) {
tooltipLabel = new UILabel("<html>" + Toolkit.i18nText("Fine-Design_Chart_Background_Tooltip") + "</html>");
tooltipLabel.setForeground(Color.gray);
tooltipLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 5, 10));
contentPane.add(tooltipLabel, BorderLayout.NORTH);
tooltipLabel.setVisible(false);
}
return contentPane;
}
@ -68,11 +81,11 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane<Chart
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double[] columnSize = { f };
double[] rowSize = {p,p,p};
double[] columnSize = {f};
double[] rowSize = {p, p, p};
Component[][] components;
if(plot.isSupportBorder()){//有边框和背景
if (plot.isSupportBorder()) {//有边框和背景
chartAxisAreaPane = initAxisAreaPane();
@ -85,7 +98,7 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane<Chart
}
JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
contentPane.add(panel,BorderLayout.CENTER);
contentPane.add(panel, BorderLayout.CENTER);
parent.initAllListeners();
}
@ -96,18 +109,19 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane<Chart
protected Component[][] initComponents() {
return new Component[][]{
new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Border"),chartBorderPane)},
new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Border"), chartBorderPane)},
new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Background"), chartBackgroundPane)},
new Component[]{chartAxisAreaPane}
};
}
/**
* 标题
* @return 标题
* 标题
*
* @return 标题
*/
public String title4PopupWindow() {
if(isPlot){
if (isPlot) {
return PaneTitleConstants.CHART_STYLE_AREA_PLOT_TITLE;
}
return PaneTitleConstants.CHART_STYLE_AREA_AREA_TITLE;
@ -118,11 +132,11 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane<Chart
if (chart == null) {
chart = new Chart();
}
if(isPlot){
if (isPlot) {
Plot plot = chart.getPlot();
chartBorderPane.update(plot);
chartBackgroundPane.update(plot);
if(plot.isSupportIntervalBackground() && chartAxisAreaPane != null){
if (plot.isSupportIntervalBackground() && chartAxisAreaPane != null) {
chartAxisAreaPane.updateBean(plot);
}
} else {
@ -133,12 +147,12 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane<Chart
@Override
public void populateBean(Chart chart) {
if(chart == null) {
if (chart == null) {
return;
}
if(isPlot){
if (isPlot) {
Plot plot = chart.getPlot();
if(plot.isSupportIntervalBackground()){
if (plot.isSupportIntervalBackground()) {
//含有坐标轴相关设置,例如警戒线、网格线、间隔背景
if (chartAxisAreaPane == null) {
refreshContentPane(plot);
@ -157,4 +171,8 @@ public class VanChartAreaBackgroundPane extends AbstractVanChartScrollPane<Chart
public Chart updateBean() {
return null;
}
public void refreshTooltipLabel(boolean inForm) {
tooltipLabel.setVisible(inForm);
}
}

15
designer-chart/src/main/java/com/fr/van/chart/designer/style/background/VanChartAreaPane.java

@ -40,17 +40,18 @@ public class VanChartAreaPane extends ThirdTabPane<VanChart> implements AutoSele
JPanel pane = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0));
if (nameArray.length > 1) {
pane.add(tabPane);
tabPane.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
tabPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
this.add(pane, BorderLayout.NORTH);
}
}
centerPane.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));
centerPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
this.add(centerPane, BorderLayout.CENTER);
}
/**
* 界面 使用标题
* @return 标题
*
* @return 标题
*/
public String title4PopupWindow() {
return PaneTitleConstants.CHART_STYLE_AREA_TITLE;
@ -66,7 +67,7 @@ public class VanChartAreaPane extends ThirdTabPane<VanChart> implements AutoSele
paneList.add(new NamePane(areaPane.title4PopupWindow(), areaPane));
if(plot.isSupportPlotBackground()) {
if (plot.isSupportPlotBackground()) {
paneList.add(new NamePane(plotPane.title4PopupWindow(), plotPane));
}
return paneList;
@ -111,4 +112,10 @@ public class VanChartAreaPane extends ThirdTabPane<VanChart> implements AutoSele
}
}
}
public void refreshTooltipLabel(boolean inForm) {
if (areaPane != null) {
areaPane.refreshTooltipLabel(inForm);
}
}
}

47
designer-form/src/main/java/com/fr/design/designer/creator/SelectedBorderIcon.java

@ -0,0 +1,47 @@
package com.fr.design.designer.creator;
import com.fr.design.form.util.XCreatorConstants;
import com.fr.general.IOUtils;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
/**
* @author hades
* @version 10.0
* Created by hades on 2021/06/30
*/
public class SelectedBorderIcon {
private static final Image EDIT_ICON = IOUtils.readImage("/com/fr/design/images/control/show_edit.png");
private static final Image SETTING_ICON = IOUtils.readImage("/com/fr/design/images/control/show_setting.png");
private static final float ALPHA = 0.7F;
private static final int TIP_WIDTH = 20;
private static final int TIP_HEIGHT = 40;
private static final int ARC_VALUE = 4;
// 组件到整个提示之间的空隙
private static final int CREATOR_TO_TIP_GAP = 5;
// icon在整个提示背景下缩进
private static final int TIP_ICON_GAP = 2;
/**
* 在bounds范围的右上角绘制特定图标
*
* @param g
* @param bounds
*/
public void paint(Graphics g, Rectangle bounds) {
Graphics2D g2d = (Graphics2D) g;
AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, ALPHA);
g2d.setColor(XCreatorConstants.EDIT_COLOR);
g2d.setComposite(alphaComposite);
g2d.fillRoundRect(bounds.x + bounds.width + CREATOR_TO_TIP_GAP, bounds.y, TIP_WIDTH, TIP_HEIGHT, ARC_VALUE, ARC_VALUE);
g2d.drawImage(EDIT_ICON, bounds.x + bounds.width + CREATOR_TO_TIP_GAP + TIP_ICON_GAP, bounds.y + TIP_ICON_GAP, EDIT_ICON.getWidth(null), EDIT_ICON.getHeight(null), null);
g2d.drawImage(SETTING_ICON, bounds.x + bounds.width + CREATOR_TO_TIP_GAP + TIP_ICON_GAP, bounds.y + CREATOR_TO_TIP_GAP + EDIT_ICON.getHeight(null), SETTING_ICON.getWidth(null), SETTING_ICON.getHeight(null), null);
g2d.setColor(Color.WHITE);
g2d.drawLine(bounds.x + bounds.width + CREATOR_TO_TIP_GAP + TIP_ICON_GAP, bounds.y + TIP_WIDTH, bounds.x + bounds.width + CREATOR_TO_TIP_GAP + TIP_ICON_GAP + EDIT_ICON.getWidth(null), bounds.y + TIP_WIDTH);
}
}

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

@ -68,6 +68,9 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
private Rectangle backupBound;
private String shareId = StringUtils.EMPTY;//如果组件是共享的会有这个属性
private boolean isHelpBtnOnFocus = false;//焦点是否在帮助按钮上
// 当前组件是否处在选中状态
private boolean selected;
private SelectedBorderIcon selectedBorderIcon = new SelectedBorderIcon();
private static final int SHORTS_SEPARATOR_POS = 4; // 弹出菜单分割的位置
public XCreator(Widget ob, Dimension initSize) {
@ -760,6 +763,18 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
GraphHelper.draw(g, bounds, Constants.LINE_MEDIUM);
}
/**
* 绘制选中时右上边框图标
*
* @param g
* @param bounds
*/
public void paintSelectedBorderIcon(Graphics g, Rectangle bounds) {
if (selected) {
selectedBorderIcon.paint(g, bounds);
}
}
/**
* 创建右击弹出菜单
*
@ -797,5 +812,12 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
}

1
designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java

@ -91,7 +91,6 @@ public class XNameWidget extends XWidgetCreator {
if (editor != null) {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
add(editor, BorderLayout.CENTER);
this.setVisible(toData().isVisible());
}
}

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

@ -2,15 +2,20 @@ package com.fr.design.mainframe;
import com.fr.design.constants.UIConstants;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.treeview.ComponentTreeCellRenderer;
import com.fr.design.designer.treeview.ComponentTreeModel;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.gui.itree.UITreeUI;
import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ArrayUtils;
import com.fr.stable.StringUtils;
import java.awt.Rectangle;
import java.awt.event.MouseListener;
import java.util.Stack;
import javax.swing.BorderFactory;
import javax.swing.DropMode;
import javax.swing.JPanel;
@ -370,6 +375,81 @@ public class ComponentTree extends JTree {
public void mouseExited(MouseEvent e) {
hidePreviewPane();
}
@Override
public void mouseClicked(MouseEvent e) {
// 鼠标左键 双击
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1 && !designer.isFormParaDesigner()) {
Point p = e.getPoint();
// 解析组件树路径 获取选中的组件
int selRow = tree.getRowForLocation(p.x, p.y);
TreePath path = tree.getPathForRow(selRow);
Rectangle bounds = tree.getPathBounds(path);
if (bounds != null) {
Point point = bounds.getLocation();
SwingUtilities.convertPointToScreen(point, tree);
XCreator comp = (XCreator) path.getLastPathComponent();
startEditing(comp, e);
}
}
}
/**
* 组件进入编辑状态
*
* @param comp
* @param e
*/
private void startEditing(XCreator comp, MouseEvent e) {
designer.getSelectionModel().selectACreator(comp);
Rectangle rectangle = getRelativeBounds(comp);
int x = rectangle.x + rectangle.width / 2;
int y = rectangle.y + rectangle.height / 2;
XCreator creator = comp.getEditingChildCreator();
MouseListener[] listeners = designer.getMouseListeners();
if (ArrayUtils.isNotEmpty(listeners) && listeners[0] instanceof EditingMouseListener) {
responseClickAll(creator, (EditingMouseListener) listeners[0], new MouseEvent(creator, MouseEvent.MOUSE_CLICKED, e.getWhen(), e.getModifiers(), x, y, e.getClickCount(), false));
}
}
/**
* 自父容器到子组件 每一层的都响应click事件
*
*
* @param creator
* @param editingMouseListener
* @param mouseEvent
*/
public void responseClickAll(XCreator creator, EditingMouseListener editingMouseListener, MouseEvent mouseEvent) {
Stack<XCreator> stack = new Stack<>();
stack.push(creator);
while (creator.getParent() instanceof XCreator) {
creator = (XCreator) creator.getParent();
stack.push(creator);
}
while (!stack.isEmpty()) {
stack.pop().respondClick(editingMouseListener, mouseEvent);
}
}
/**
* 获取组件范围坐标
*
* @param creator
* @return
*/
private Rectangle getRelativeBounds(XCreator creator) {
Rectangle bounds = creator.getBounds();
XLayoutContainer parent = XCreatorUtils.getParentXLayoutContainer(creator);
if (parent == null) {
return bounds;
}
Rectangle rec = ComponentUtils.getRelativeBounds(parent);
bounds.x += rec.x;
bounds.y += rec.y;
return bounds;
}
}
private class PopupPreviewPane extends JPopupMenu {

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

@ -21,6 +21,7 @@ import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.creator.cardlayout.XCardSwitchButton;
import com.fr.design.designer.creator.cardlayout.XWCardLayout;
import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout;
import com.fr.design.form.util.XCreatorConstants;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.imenu.UIPopupMenu;
@ -29,6 +30,7 @@ import com.fr.design.icon.IconPathConstants;
import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.general.ComparatorUtils;
import com.fr.stable.Constants;
import javax.swing.BorderFactory;
@ -353,6 +355,15 @@ public class EditingMouseListener extends MouseInputAdapter {
}
private void processCoverPane(XCreator component) {
// selected状态 不展示封面
XCreator xCreator = selectionModel.getSelection().getSelectedCreator();
boolean accept = xCreator == null || !ComparatorUtils.equals(xCreator.toData().getWidgetName(), component.toData().getWidgetName()) ||!xCreator.isSelected();
if (accept) {
component.displayCoverPane(true);
}
}
private boolean isShareConfigButton(MouseEvent e, XCreator component, Insets insets) {
if (component.isShared()) {
int minX = getParentPositionX(component, component.getX()) + component.getWidth() - insets.right - CoverReportPane.SHARE_CONF_BTN_W - designer.getHorizontalScaleValue();
@ -387,7 +398,7 @@ public class EditingMouseListener extends MouseInputAdapter {
private void elementCaseMouseMoved(MouseEvent e, XCreator component) {
xElementCase = (XElementCase) component;
component.displayCoverPane(true);
processCoverPane(component);
processCoverMouseMove(component, e);
}
@ -428,7 +439,7 @@ public class EditingMouseListener extends MouseInputAdapter {
private void processChartEditorMouseMove(XCreator component, MouseEvent e) {
if (component instanceof XChartEditor) {
xChartEditor = (XChartEditor) component;
component.displayCoverPane(true);
processCoverPane(component);
processCoverMouseMove(component, e);
}
@ -608,10 +619,23 @@ public class EditingMouseListener extends MouseInputAdapter {
return;
}
XCreator oldCreator = creator;
creator = processTopLayoutMouseClick(creator);
if (creator != null) {
creator.respondClick(this, e);
if (e.getClickCount() == 1 && designer.getCursor().getType() != Cursor.HAND_CURSOR) {
setCoverPaneNotDisplay(creator, e, false);
selectionModel.selectACreatorAtMouseEvent(e);
refreshTopXCreator();
XCreator[] xCreators = selectionModel.getSelection().getSelectedCreators();
for (XCreator xCreator : xCreators) {
xCreator.setSelected(true);
}
} else if (responseTabLayout(oldCreator, e)) {
// do nothing
} else {
creator.respondClick(this, e);
}
if (e.getButton() == MouseEvent.BUTTON3) {
UIPopupMenu cellPopupMenu = creator.createPopupMenu(designer);
if (cellPopupMenu != UIPopupMenu.EMPTY) {
@ -624,6 +648,16 @@ public class EditingMouseListener extends MouseInputAdapter {
LayoutUtils.layoutRootContainer(designer.getRootComponent());
}
private boolean responseTabLayout(XCreator creator, MouseEvent e) {
if (creator.acceptType(XWCardMainBorderLayout.class) ) {
creator.respondClick(this, e);
return true;
} else if (creator.getParent() instanceof XCreator) {
return responseTabLayout((XCreator) creator.getParent(), e);
}
return false;
}
/**
* 离开

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

@ -49,6 +49,7 @@ import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import javax.swing.SwingUtilities;
/**
* 添加模式下鼠标事件处理器
@ -302,6 +303,16 @@ public class FormCreatorDropTarget extends DropTarget {
public synchronized void drop(DropTargetDropEvent dtde) {
Point loc = dtde.getLocation();
this.adding(designer.getRelativeX(loc.x), designer.getRelativeY(loc.y));
// 放到事件末尾执行
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// 拖拽释放后标记未选中
for (XCreator xCreator : designer.getSelectionModel().getSelection().getSelectedCreators()) {
xCreator.setSelected(true);
}
}
});
//针对在表单中拖入一个控件直接ctrl+s无反应
designer.requestFocus();
}

39
designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java

@ -307,7 +307,10 @@ public class FormDesignerUI extends ComponentUI {
bounds.x -= designer.getHorizontalScaleValue();
bounds.y -= designer.getVerticalScaleValue();
drawResizingThumbs(g, selectionModel.getSelection().getDirections(), bounds.x, bounds.y, bounds.width, bounds.height);
// 绘制调整框线
if (designer.getStateModel().getDirection() != null) {
drawResizingThumbs(g, selectionModel.getSelection().getDirections(), bounds.x, bounds.y, bounds.width, bounds.height, designer.getStateModel().getDirection().getActual());
}
//选中时边框颜色
g.setColor(XCreatorConstants.FORM_BORDER_COLOR);
@ -321,6 +324,10 @@ public class FormDesignerUI extends ComponentUI {
resetCreatorBounds(creatorBounds);
}
creator.paintBorder(g, creatorBounds);
// 拖拽时不绘制
if (!designer.getStateModel().isDragging()) {
creator.paintSelectedBorderIcon(g, creatorBounds);
}
}
}
@ -357,48 +364,60 @@ public class FormDesignerUI extends ComponentUI {
/**
* 画出八个拖拽框
*/
private void drawResizingThumbs(Graphics g, int[] directions, int x, int y, int w, int h) {
private void drawResizingThumbs(Graphics g, int[] directions, int x, int y, int w, int h, int direction) {
int bx = x - XCreatorConstants.RESIZE_BOX_SIZ;
int by = y - XCreatorConstants.RESIZE_BOX_SIZ;
if (ArrayUtils.contains(directions, Direction.LEFT_TOP)) {
if (showBox(Direction.LEFT_TOP, direction, directions)) {
drawBox(g, bx, by);
}
if (ArrayUtils.contains(directions, Direction.TOP)) {
if (showBox(Direction.TOP, direction, directions)) {
bx = x + ((w - XCreatorConstants.RESIZE_BOX_SIZ) / 2);
drawBox(g, bx, by);
}
if (ArrayUtils.contains(directions, Direction.RIGHT_TOP)) {
if (showBox(Direction.RIGHT_TOP, direction, directions)) {
bx = x + w;
drawBox(g, bx, by);
}
if (ArrayUtils.contains(directions, Direction.LEFT)) {
if (showBox(Direction.LEFT, direction, directions)) {
bx = x - XCreatorConstants.RESIZE_BOX_SIZ;
by = y + ((h - XCreatorConstants.RESIZE_BOX_SIZ) / 2);
drawBox(g, bx, by);
}
if (ArrayUtils.contains(directions, Direction.LEFT_BOTTOM)) {
if (showBox(Direction.LEFT_BOTTOM, direction, directions)) {
bx = x - XCreatorConstants.RESIZE_BOX_SIZ;
by = y + h;
drawBox(g, bx, by);
}
if (ArrayUtils.contains(directions, Direction.BOTTOM)) {
if (showBox(Direction.BOTTOM, direction, directions)) {
bx = x + ((w - XCreatorConstants.RESIZE_BOX_SIZ) / 2);
by = y + h;
drawBox(g, bx, by);
}
if (ArrayUtils.contains(directions, Direction.RIGHT_BOTTOM)) {
if (showBox(Direction.RIGHT_BOTTOM, direction, directions)) {
bx = x + w;
by = y + h;
drawBox(g, bx, by);
}
if (ArrayUtils.contains(directions, Direction.RIGHT)) {
if (showBox(Direction.RIGHT, direction, directions)) {
bx = x + w;
by = y + ((h - XCreatorConstants.RESIZE_BOX_SIZ) / 2);
drawBox(g, bx, by);
}
}
/**
* 是否展示某个方位的调整框
*
* @param currentDirection
* @param actualDirection
* @param directions
* @return
*/
private boolean showBox(int currentDirection, int actualDirection, int[] directions) {
return ArrayUtils.contains(directions, currentDirection) && (currentDirection == actualDirection || !designer.getStateModel().isDragging());
}
/**
* 画每一个小拖拽框
*/

3
designer-form/src/main/java/com/fr/design/mainframe/FormSelection.java

@ -40,6 +40,9 @@ public class FormSelection {
* 重置选中的组件
*/
public void reset() {
for (XCreator xCreator : selection) {
xCreator.setSelected(false);
}
selection.clear();
}

Loading…
Cancel
Save