diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java
index 18bab55287..925ea036d2 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java
@@ -12,6 +12,7 @@ import com.fr.design.designer.beans.models.SelectionModel;
import com.fr.design.designer.creator.XButton;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
+import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.gui.ilable.UILabel;
@@ -27,17 +28,28 @@ import com.fr.form.ui.container.WTabTextDirection;
import com.fr.form.ui.container.cardlayout.WCardTagLayout;
import com.fr.form.ui.container.cardlayout.WTabFitLayout;
import com.fr.general.Background;
-import com.fr.general.act.BorderPacker;
import com.fr.general.ComparatorUtils;
import com.fr.general.FRFont;
+import com.fr.general.act.BorderPacker;
import com.fr.general.act.TitlePacker;
import com.fr.general.cardtag.TemplateStyle;
import com.fr.stable.ProductConstants;
import com.fr.stable.unit.PT;
-import javax.swing.*;
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.JOptionPane;
+import javax.swing.JPopupMenu;
+import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicLabelUI;
-import java.awt.*;
+import java.awt.Color;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
@@ -243,52 +255,43 @@ public class XCardSwitchButton extends XButton {
//SwitchButton对应的XWCardLayout和XWCardTagLayout暂未存到xml中,重新打开时根据父子层关系获取
- private void initRelateLayout(){
- this.tagLayout = (XWCardTagLayout)this.getBackupParent();
+ private void initRelateLayout() {
+ this.tagLayout = (XWCardTagLayout) this.getBackupParent();
XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.tagLayout.getBackupParent();
- XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout)titleLayout.getBackupParent();
+ XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout) titleLayout.getBackupParent();
this.cardLayout = borderLayout.getCardPart();
}
- //是否进入点击关闭按钮区域
- private boolean isSelectedClose(MouseEvent e, FormDesigner designer){
+ /**
+ *
是否进入点击关闭按钮区域
+ *
计算逻辑:
+ *
先得到鼠标的绝对坐标 -> tab布局的绝对坐标 -> 得到鼠标相对tab的坐标(有参数面板时要减去参数面板的高度)
+ *
再计算删除区域位置的相对坐标,通过对比判定鼠标是否在点击关闭按钮区域内,即,鼠标的位置(ex,ey):
+ *
当前点击tag删除区域的x坐标 < ex < 当前点击tag删除区域的x坐标 + 偏移量
+ * 当前点击tag删除区域的y坐标 < ey < 当前点击tag删除区域的y坐标 + 偏移量
+ *
+ * @param e 鼠标事件
+ * @param designer 表单编辑对象
+ * @return true/false 在内/不在
+ */
+ private boolean isSelectedClose(MouseEvent e, FormDesigner designer) {
int diff = designer.getHorizontalScaleValue();
// mouse position
+ // 这里是鼠标的绝对位置
int ex = e.getX() + diff;
int ey = e.getY();
-
- //获取tab布局的位置,鼠标相对于tab按钮的位置
- Container mainLayout = cardLayout.getBackupParent();
- Point point = mainLayout.getLocation();
- int y = 0;
- int x = 0;
- //遍历一下,不然是相对位置,嵌套后位置不对
- while (mainLayout.getParent() != null){
- if(mainLayout instanceof XWCardLayout){
- y += mainLayout.getY();
- }
-
- mainLayout = mainLayout.getParent();
-
- if(mainLayout instanceof XWCardMainBorderLayout){
- x += mainLayout.getX();
- y += mainLayout.getY();
- }
- }
- double mainX = point.getX() + x;
- double mainY = point.getY() + y;
-
+ // 获取tab布局的位置,鼠标相对于tab按钮的位置
+ double[] tabPositionInBody = getTabAbsolutePositionInBody();
// 参数界面对坐标的影响
JForm jform = (JForm) HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
- if(jform.getFormDesign().getParaComponent() != null){
+ if (jform.getFormDesign().getParaComponent() != null) {
ey -= jform.getFormDesign().getParaHeight();
}
-
//减掉tab布局的相对位置
- ex -= mainX;
- ey -= mainY;
+ ex -= tabPositionInBody[0];
+ ey -= tabPositionInBody[1];
XLayoutContainer titleLayout = tagLayout.getBackupParent();
Point titlePoint = titleLayout.getLocation();
@@ -298,10 +301,43 @@ public class XCardSwitchButton extends XButton {
int width = button.getWidth();
// 鼠标进入按钮右侧删除图标区域
- double recX = position.getX() + titlePoint.getX() + (width - CLOSE_ICON_RIGHT_OFFSET);
+ double recX = position.getX() + titlePoint.getX() + (width - CLOSE_ICON_RIGHT_OFFSET);
double recY = position.getY() + titlePoint.getY() + CLOSE_ICON_TOP_OFFSET;
+ // 比较的是相对位置的偏移量是否在一定距离内
+ // 所以要得到鼠标相对于当前tab块的坐标
+ return (recX < ex && ex < recX + CLOSE_ICON_RIGHT_OFFSET && ey < recY && ey > position.getY());
+ }
+
+ /**
+ * 获取tab布局在body内的绝对位置
+ *
+ * @return
+ */
+ private double[] getTabAbsolutePositionInBody() {
+ // 获取tab布局的位置,鼠标相对于tab按钮的位置
+ Container mainLayout = cardLayout.getBackupParent();
+ // 这个point是当前tab布局的相对坐标,是相对于父容器的坐标
+ // 比如父级是一个absolute块,放在左上角,现在得到的point就是(0,0)
+ Point point = mainLayout.getLocation();
+ int y = 0;
+ int x = 0;
+ // 遍历一下,不然是相对位置,嵌套后位置不对
+ // 这里是要得到tab布局的绝对位置,所以要加上父组件的位置
+ while (mainLayout.getParent() != null) {
+ if (mainLayout instanceof XWCardLayout) {
+ y += mainLayout.getY();
+ }
+
+ mainLayout = mainLayout.getParent();
- return (recX < ex && ex < recX + CLOSE_ICON_RIGHT_OFFSET && ey < recY && ey > position.getY());
+ if ((mainLayout instanceof XWCardMainBorderLayout) || (mainLayout instanceof XWAbsoluteLayout)) {
+ x += mainLayout.getX();
+ y += mainLayout.getY();
+ }
+ }
+ double mainX = point.getX() + x;
+ double mainY = point.getY() + y;
+ return new double[]{mainX, mainY};
}
//将当前switchButton改为选中状态
@@ -313,7 +349,7 @@ public class XCardSwitchButton extends XButton {
}
}
- @Override
+ @Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java
index 1bf00c234f..523b07a4b3 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java
@@ -25,20 +25,24 @@ import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.imenu.UIPopupMenu;
import com.fr.design.mainframe.EditingMouseListener;
import com.fr.design.mainframe.FormDesigner;
+import com.fr.design.mainframe.FormHierarchyTreePane;
import com.fr.design.mainframe.WidgetPropertyPane;
+import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.ui.CardSwitchButton;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WCardLayout;
import com.fr.form.ui.container.WTabDisplayPosition;
import com.fr.form.ui.container.cardlayout.WCardTagLayout;
import com.fr.form.ui.container.cardlayout.WTabFitLayout;
-import com.fr.general.act.BorderPacker;
import com.fr.general.ComparatorUtils;
import com.fr.general.FRFont;
+import com.fr.general.act.BorderPacker;
import com.fr.general.cardtag.DefaultTemplateStyle;
import javax.swing.border.Border;
-import java.awt.*;
+import java.awt.Dimension;
+import java.awt.FontMetrics;
+import java.awt.Rectangle;
import java.awt.event.ContainerEvent;
import java.awt.event.MouseEvent;
import java.util.HashMap;
@@ -441,7 +445,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
}
- private void fixTitleLayout(XLayoutContainer parent){
+ private void fixTitleLayout(XLayoutContainer parent) {
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
LayoutAdapter layoutAdapter = AdapterBus.searchLayoutAdapter(formDesigner, parent);
if (layoutAdapter != null) {
@@ -450,4 +454,31 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
}
}
+ /**
+ * 对于tab组件,WCardMainBorderLayout里面有两个子容器:
+ *
WCardTitleLayout,里面包含两个部分,一个是CardAddButton,另一个是WCardTagLayout - tabpane0
+ * WCardLayout,里面放的是WTabFitLayout - tab00、tab10
+ * 在右侧组件树选择删除WCardTagLayout时(tabpane0),按照现在的产品逻辑,应该删除整个tab组件
+ *
+ * @param creator 组件
+ * @param designer 表单设计器
+ */
+ @Override
+ public void deleteRelatedComponent(XCreator creator, FormDesigner designer) {
+ XWCardTagLayout tagLayout = (XWCardTagLayout) creator;
+ // 先删除所有tab按钮
+ tagLayout.removeAll();
+ //逐层回溯找出最外层的XWCardMainBorderLayout
+ XWCardTitleLayout cardTitleLayout = (XWCardTitleLayout) tagLayout.getBackupParent();
+ XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout) cardTitleLayout.getBackupParent();
+ // 删除tab布局
+ SelectionModel selectionModel = designer.getSelectionModel();
+ if (mainLayout != null) {
+ selectionModel.setSelectedCreator(mainLayout);
+ selectionModel.deleteSelection();
+ }
+ LayoutUtils.layoutRootContainer(designer.getRootComponent());
+ FormHierarchyTreePane.getInstance().refreshRoot();
+ selectionModel.setSelectedCreator(designer.getRootComponent());
+ }
}
diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java
index 2278b7b0f8..6276c3c2df 100644
--- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java
+++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java
@@ -7,16 +7,13 @@ import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ispinner.UISpinner;
import com.fr.design.gui.xpane.CardTagLayoutStylePane;
-import com.fr.design.gui.xpane.LayoutStylePane;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayoutHelper;
-import com.fr.design.mainframe.widget.accessibles.AccessibleCardTagWLayoutBorderStyleEditor;
import com.fr.design.widget.ui.designer.AbstractDataModify;
import com.fr.form.ui.LayoutBorderStyle;
import com.fr.form.ui.container.WCardLayout;
import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout;
-
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import java.awt.BorderLayout;
@@ -72,6 +69,9 @@ public class WCardMainLayoutDefinePane extends AbstractDataModify
public void populateBean(WCardTagLayout ob) {
//标题背景和字体属性设置在WCardLayout上做兼容
XLayoutContainer topLayout = creator.getTopLayout();
+ if (topLayout.getComponentCount() == 0) {
+ // 没有子组件,不用做处理
+ return;
+ }
LayoutBorderStyle layoutBorderStyle = (LayoutBorderStyle) ((XWCardMainBorderLayout) topLayout).getCardPart().toData().getBorderStyle();
-
displayPositionGroup.setSelectedIndex(ob.getDisplayPosition().getType());
textDirectionGroup.setSelectedIndex(ob.getTextDirection().getType());
backgroundEditor.setValue(layoutBorderStyle.getTitle().getBackground());