diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java index 0f577d852f..1f3055d40a 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -437,7 +437,7 @@ public class EnvChangeEntrance { @Override public void doOk() { SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(true, SwingUtilities.getWindowAncestor(envListPane)); - if (!saveSomeTemplatePane.showSavePane()) { + if (!saveSomeTemplatePane.showSavePane(true)) { // 用户取消保存时,取消切换目录操作 return; } diff --git a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java index 712dcbd33b..2354007e18 100644 --- a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java +++ b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java @@ -572,7 +572,7 @@ public abstract class DesignTableDataManager { parameter.setValue(parameterMap.get(parameter.getName())); } } - parameterMap.put(SqlNoteConstants.SQL_NOTE_TEMPLATE, HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath()); + addTemplateInfoIfNeed(parameterMap); return DataOperator.getInstance().previewTableData(TableDataSourceTailor.extractTableData(tableDataSource), tabledata, parameterMap, rowCount); } catch (Exception e) { throw new TableDataException(e.getMessage(), e); @@ -592,6 +592,12 @@ public abstract class DesignTableDataManager { } } + private static void addTemplateInfoIfNeed(Map parameterMap) { + if (JTemplate.isValid(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate())) { + parameterMap.put(SqlNoteConstants.SQL_NOTE_TEMPLATE, HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath()); + } + } + private static boolean needInputParams(boolean mustInputParameters, ParameterProvider[] parameters) { if (mustInputParameters && ArrayUtils.isNotEmpty(parameters)) { return true; @@ -669,7 +675,7 @@ public abstract class DesignTableDataManager { if (needLoadingBar) { MultiResultTableDataWrapper.loadingBar.start(); } - parameterMap.put(SqlNoteConstants.SQL_NOTE_TEMPLATE, HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getEditingFILE().getPath()); + addTemplateInfoIfNeed(parameterMap); return DataOperator.getInstance().previewMultiResultTableData(tableData, parameterMap, 0); } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index 0a00f37041..3c5c2b82a8 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -589,7 +589,7 @@ public abstract class DatabaseConnectionPane[] templates = new JTemplate[openedTemplate.size()]; for (int i = 0; i < openedTemplate.size(); i++) { templates[i] = openedTemplate.get(i); } JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - closeTemplate(templates, currentTemplate); + closeTemplate(closeCondition, templates, currentTemplate); if (openedTemplate.size() == 0) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(); } else if (option == CloseOption.All){ - DesignerContext.getDesignerFrame().activateJTemplate(openedTemplate.get(0)); + //openedTemplate(0)是JVirtualTemplate时需重新打开 + openedTemplate.get(0).activeOldJTemplate(); } else { - DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); + currentTemplate.activeOldJTemplate(); } MultiTemplateTabPane.getInstance().repaint(); } } - private void closeTemplate(JTemplate[] templates, JTemplate currentTemplate) { - String operator = currentTemplate.getTemplateTabOperatorType(); + private void closeTemplate(CloseCondition closeCondition, JTemplate[] templates, JTemplate currentTemplate) { for (int i = 0; i < templates.length; i++) { - if (option.shouldClose(tplIndex, i) && ComparatorUtils.equals(operator, templates[i].getTemplateTabOperatorType())) { + if (closeCondition.shouldClose(templates[i], tplIndex, i)) { JTemplate jTemplate = templates[i]; if (jTemplate == currentTemplate) { currentTemplate = option == CloseOption.All ? null : templates[tplIndex]; @@ -725,6 +757,58 @@ public class MultiTemplateTabPane extends JComponent { minPaintIndex = 0; maxPaintIndex = openedTemplate.size() - 1; } + //需要根据每个tab的宽度重新check下实际的maxPaintIndex和minPaintIndex + checkActualPaintIndex(); + } + + /** + * 先计算出需要补充的tab个数 + * @return + */ + private int calTabCountComplemented(){ + int a = 0; + for (int i = minPaintIndex; i <= maxPaintIndex; i++) { + JTemplate template = openedTemplate.get(i); + if (!showJTemplateTab(template)) { + a++; + } + } + return a; + } + + + /** + * 由于可能存在宽度为0的tab,所以这边需要重新check下,先往后补,再往前补 + */ + private void checkActualPaintIndex(){ + int tabCount = calTabCountComplemented(); + if (tabCount == 0){ + return; + } + if (maxPaintIndex < openedTemplate.size() - 1) { + for (int i = maxPaintIndex + 1; i < openedTemplate.size(); i++) { + JTemplate template = openedTemplate.get(i); + if (showJTemplateTab(template)) { + tabCount--; + } + maxPaintIndex++; + if (tabCount == 0){ + return; + } + } + } + if (minPaintIndex > 0){ + for (int i = minPaintIndex - 1; i >= 0; i--) { + JTemplate template = openedTemplate.get(i); + if (showJTemplateTab(template)) { + tabCount--; + } + minPaintIndex--; + if (tabCount == 0){ + return; + } + } + } } @@ -996,9 +1080,12 @@ public class MultiTemplateTabPane extends JComponent { // selectIndex 没有变化,但是对应的模板已经变成了前一张模板 if (closeIconIndex == selectedIndex || isCloseCurrent) { // 如果当前关闭的模板在最右侧,那么预览上一个,防止数组越界 + // 关闭的模板是当前选中的模板时,需要重新计算下一个待展示的模板的index if (selectedIndex >= maxPaintIndex) { // selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true selectedIndex = calNextShowJTemplateIndex(selectedIndex - 1); + } else { + selectedIndex = calNextShowJTemplateIndex(selectedIndex); } isCloseCurrent = false; } @@ -1119,6 +1206,7 @@ public class MultiTemplateTabPane extends JComponent { private class MultiTemplateTabMouseListener implements MouseListener { + private boolean oldLightWeightPopupEnabled; /** * 鼠标进入 @@ -1127,7 +1215,8 @@ public class MultiTemplateTabPane extends JComponent { */ @Override public void mouseEntered(MouseEvent e) { - // do nothing + this.oldLightWeightPopupEnabled = ToolTipManager.sharedInstance().isLightWeightPopupEnabled(); + ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false); } /** @@ -1137,6 +1226,9 @@ public class MultiTemplateTabPane extends JComponent { */ @Override public void mouseExited(MouseEvent e) { + ToolTipManager.sharedInstance().setEnabled(false); + ToolTipManager.sharedInstance().setEnabled(true); + ToolTipManager.sharedInstance().setLightWeightPopupEnabled(this.oldLightWeightPopupEnabled); listDownMode = LIST_DOWN; closeIconIndex = -1; mouseOveredIndex = -1; diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java index fa8e3d385d..0bdd48b359 100644 --- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java @@ -17,6 +17,7 @@ import com.fr.design.mainframe.JTemplate; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.EmptyBorder; @@ -123,8 +124,10 @@ public class SaveSomeTemplatePane extends BasicPane { if (index < 0) { return; } + boolean mustSaveBeforeSwitchEnv = judgeJTemplateMustSave + && unSavedTemplate.get(index).needSaveBeforeSwitchEnv(); UICheckBox checkBox = (UICheckBox) templatesList.getModel().getElementAt(index); - checkBox.setSelected(!checkBox.isSelected()); + checkBox.setSelected(mustSaveBeforeSwitchEnv ||!checkBox.isSelected()); //根据templateCheckBoxes中的选择情况来更新全选框的状态 int selectedCount = calculateSelectedNum(); @@ -162,8 +165,25 @@ public class SaveSomeTemplatePane extends BasicPane { return showSavePane(false); } + /** + * 显示保存模板提醒面板 + * + * @param judgeJTemplateMustSave 模板是否必须保存 + * @return + */ public boolean showSavePane(boolean judgeJTemplateMustSave) { - populate(judgeJTemplateMustSave); + return showSavePane(null, judgeJTemplateMustSave); + } + + /** + * 显示保存模板提醒面板 + * + * @param option 具体关闭操作 + * @param judgeJTemplateMustSave 模板是否必须保存 + * @return + */ + public boolean showSavePane(@Nullable MultiTemplateTabPane.CloseCondition option, boolean judgeJTemplateMustSave) { + initAndPopulate(option, judgeJTemplateMustSave); //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目 if (!unSavedTemplate.isEmpty()) { dialog.setVisible(true); @@ -177,11 +197,14 @@ public class SaveSomeTemplatePane extends BasicPane { return HistoryTemplateListPane.getInstance().getHistoryList(); } - public void populate(boolean judgeJTemplateMustSave) { + private void initAndPopulate(@Nullable MultiTemplateTabPane.CloseCondition option, boolean judgeJTemplateMustSave) { java.util.List> opendedTemplate = getOpenedTemplatesToProcess(); JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + int currentIndex = opendedTemplate.indexOf(currentTemplate); for (int i = 0; i < opendedTemplate.size(); i++) { - if (isneedToAdd(opendedTemplate.get(i), currentTemplate)) { + //满足关闭条件的才继续判断文件是否发生了改动 + boolean needClose = option == null || option.shouldClose(opendedTemplate.get(i), currentIndex, i); + if (needClose && isneedToAdd(opendedTemplate.get(i), currentTemplate)) { unSavedTemplate.add(opendedTemplate.get(i)); } } diff --git a/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java b/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java index 74b1596207..4116f4f1d0 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java @@ -20,6 +20,7 @@ import com.fr.design.javascript.jsapi.JSAPITreeHelper; import com.fr.design.javascript.jsapi.JSAPIUserObject; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralContext; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONException; @@ -70,6 +71,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.concurrent.ExecutionException; public class JSContentWithDescriptionPane extends JSContentPane implements KeyListener { @@ -393,9 +395,13 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi private void updateHelpDocuments(Object value, List helpDocuments) { String url = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT) + value.toString(); try { - String result = HttpToolbox.get(url); - JSONObject jsonObject = new JSONObject(result); - JSONArray jsonArray = jsonObject.optJSONArray("list"); + JSONArray jsonArray = null; + //目前简中繁中之外的语言高级编辑器功能及文档不完善,右侧展示的文档链接列表暂时为空白 + if(GeneralContext.isChineseEnv()) { + String result = HttpToolbox.get(url); + JSONObject jsonObject = new JSONObject(result); + jsonArray = jsonObject.optJSONArray("list"); + } if (jsonArray != null) { for (int i = 0; i < jsonArray.length(); i++) { JSONObject resultJSONObject = jsonArray.optJSONObject(i); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index e88d0c946c..150c4302f4 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -852,7 +852,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta if (jt == null || jt.getEditingFILE() == null) { return; } - if (currentTemplateDeactivateFail()) { + if (currentTemplateDeactivateFail(jt)) { return; } jt.addJTemplateActionListener(this); @@ -877,7 +877,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta if (jt == null || jt.getEditingFILE() == null) { return; } - if (currentTemplateDeactivateFail()) { + if (currentTemplateDeactivateFail(jt)) { return; } getCenterTemplateCardPane().showJTemplate(jt); @@ -939,9 +939,9 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @return 是否停用失败 */ - private boolean currentTemplateDeactivateFail() { + private boolean currentTemplateDeactivateFail(JTemplate jt) { JTemplate currentEditingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - return currentEditingTemplate != null && !currentEditingTemplate.deactivateTemplate(); + return currentEditingTemplate != null && !currentEditingTemplate.deactivateTemplate(jt); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 8cfd263421..fc2f9c658c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -54,6 +54,7 @@ import com.fr.plugin.injectable.PluginModule; import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEventListener; +import com.fr.report.lock.LockInfoOperator; import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; @@ -61,7 +62,6 @@ import com.fr.stable.project.ProjectConstants; import com.fr.third.org.apache.commons.io.FilenameUtils; import com.fr.workspace.WorkContext; -import com.fr.report.lock.LockInfoOperator; import javax.swing.BorderFactory; import javax.swing.JDialog; import javax.swing.JOptionPane; @@ -537,7 +537,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } private boolean pathSupportVcsAction(String path) { - if (FileExtension.CPT.matchExtension(path) || FileExtension.FRM.matchExtension(path)) { + if (FileExtension.CPT.matchExtension(path) || FileExtension.FRM.matchExtension(path) || FileExtension.VIS.matchExtension(path)) { return true; } return false; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 17a5afb2b6..7977b8202a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -1373,6 +1373,17 @@ public abstract class JTemplate> } + /** + * 将要激活打开其他模板,使当前模板灭活 + * 默认 do nothing 返回true + * + * @return true:成功停用当前模板 + */ + public boolean deactivateTemplate(JTemplate jTemplate) { + //兼容调用老的接口 + return deactivateTemplate(); + } + /** * 返回当前支持的超链界面pane * diff --git a/designer-base/src/main/resources/com/fr/design/config/default b/designer-base/src/main/resources/com/fr/design/config/default index f808a82379..b323302824 100644 --- a/designer-base/src/main/resources/com/fr/design/config/default +++ b/designer-base/src/main/resources/com/fr/design/config/default @@ -1 +1,2 @@ Fine-Designer_Login=i7hP48WAcuTrmxfN +Fine-Designer_Reu_Share_CERTIFICATE_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtsz62CPSWXZE/IYZRiAuTSZkw1WOwer8+JFktK0uKLAUuQoBr+UjAMFtRA8W7JgKMDwZy/2liEAiXEOSPU/hrdV8DtT541LnGi1X/hXiRwuttPWYN3L2GYm/d5blU+FBNwghBIrdAxXTzYBc6P4KL/oYXnMdTIrkz8tYkG3QoFQIDAQAB \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java index b32ea4b67c..ba8d24929d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java @@ -58,6 +58,9 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa //将数据列名保存下来,在update时会删除层级名列表,需要用保存的list重新初始化新的层级名列表 private List columnNameList; + //汇总方式求和的索引 + public static final int SUM_INDEX = 2; + public MultiPiePlotTableDataContentPane() { } @@ -241,7 +244,8 @@ public class MultiPiePlotTableDataContentPane extends AbstractTableDataContentPa for (UIComboBox uiComboBox : levelNameList) { clearBoxItems(uiComboBox); } - clearBoxItems(calculateCombox); + //默认选求和 + calculateCombox.setSelectedIndex(SUM_INDEX); refreshCenterPane(); } 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 85436c72fd..1f139bbabf 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 @@ -10,6 +10,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; @@ -25,16 +26,27 @@ 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.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; @@ -236,52 +248,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(); @@ -291,10 +294,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改为选中状态 @@ -306,7 +342,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 0353d53dd0..7ded6ee77e 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 @@ -24,21 +24,25 @@ 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 com.fr.stable.StringUtils; 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; @@ -434,7 +438,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) { @@ -443,4 +447,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/mainframe/share/util/DownloadUtils.java b/designer-form/src/main/java/com/fr/design/mainframe/share/util/DownloadUtils.java index a814dfa0aa..a451a9bee1 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/util/DownloadUtils.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/util/DownloadUtils.java @@ -3,6 +3,7 @@ package com.fr.design.mainframe.share.util; import com.fr.base.theme.FormTheme; import com.fr.design.DesignerEnvManager; import com.fr.design.extra.PluginConstants; +import com.fr.design.login.config.DefaultLoginKeys; import com.fr.form.share.base.CancelCheck; import com.fr.form.share.constants.ShareComponentConstants; import com.fr.ftp.util.Base64; @@ -45,10 +46,7 @@ import java.util.Set; * created by Harrison on 2020/05/27 **/ public class DownloadUtils { - private static final String CERTIFICATE_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtsz62CPSWXZE/IYZRiAuTSZkw\n" + - "1WOwer8+JFktK0uKLAUuQoBr+UjAMFtRA8W7JgKMDwZy/2liEAiXEOSPU/hrdV8D\n" + - "tT541LnGi1X/hXiRwuttPWYN3L2GYm/d5blU+FBNwghBIrdAxXTzYBc6P4KL/oYX\n" + - "nMdTIrkz8tYkG3QoFQIDAQAB"; + private static final String CERTIFICATE_PUBLIC_KEY = DefaultLoginKeys.getInstance().getKey("Fine-Designer_Reu_Share_CERTIFICATE_PUBLIC_KEY"); private static String getReusesUrl() { return StableUtils.pathJoin(OnlineShopUtils.getReuInfoPath(), "file/download"); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java index 22d544c1a6..66ae39cd60 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java @@ -29,7 +29,7 @@ public class WidgetCardTagBoundPane extends WidgetBoundPane { @Override public void initBoundPane() { - cardTagWidth = new UIBoundSpinner(0, Integer.MAX_VALUE, 1); + cardTagWidth = new UIBoundSpinner(0, Integer.MAX_VALUE, 1, 0); cardTagWidth.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Coords_And_Size")); this.add(WidgetBoundsPaneFactory.createCardTagBoundPane(cardTagWidth)); } 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()); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java index bdd5b7d351..b9c84e5be7 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java @@ -22,7 +22,6 @@ import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.design.mainframe.mobile.ui.MobileCollapsedStyleExpandPane; import com.fr.design.mainframe.mobile.ui.MobileComboBoxDialogEditor; import com.fr.form.ui.ElementCaseEditor; - import com.fr.form.ui.mobile.MobileCollapsedStyle; import com.fr.stable.StringUtils; @@ -30,7 +29,9 @@ import javax.swing.BorderFactory; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingConstants; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Container; /** * 报表块-移动端属性面板 @@ -123,7 +124,6 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { panelWrapper.add(panel, BorderLayout.NORTH); UIExpandablePane folderPane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Fit"), 280, 20, panelWrapper); this.add(folderPane, BorderLayout.NORTH); - this.bingListeners2Widgets(); this.setGlobalNames(); this.repaint(); } @@ -165,7 +165,6 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { @Override public void populate(FormDesigner designer) { this.designer = designer; - this.addAttributeChangeListener(changeListener); ElementCaseEditor elementCaseEditor = (ElementCaseEditor) xCreator.toData(); this.hComboBox.setSelectedItem(new Item(elementCaseEditor.getHorziontalAttr().description(), elementCaseEditor.getHorziontalAttr())); this.vComboBox.setSelectedItem(new Item(elementCaseEditor.getVerticalAttr().description(), elementCaseEditor.getVerticalAttr())); @@ -178,6 +177,8 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { this.mobileCollapsedStyleEditor.setStyle(elementCaseEditor.getMobileCollapsedStyle()); fix(elementCaseEditor.getMobileCollapsedStyle()); this.mobileCollapsedStyleEditor.setSelected(elementCaseEditor.getMobileCollapsedStyle().isCollapsedWork()); + this.bingListeners2Widgets(); + this.addAttributeChangeListener(changeListener); } /** @@ -191,7 +192,6 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { @Override public void update() { - DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来 String globalName = this.getGlobalName(); switch (globalName) { case "hComboBox": @@ -220,6 +220,7 @@ public class ElementCaseDefinePane extends MobileWidgetDefinePane { style.setCollapsedWork(this.mobileCollapsedStyleEditor.isSelectedCustom() && !FormDesignerUtils.isInAbsoluteLayout(xCreator)); ((ElementCaseEditor) xCreator.toData()).setMobileCollapsedStyle(style); } + DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来 } private void setGlobalNames() { diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java index de006160dc..3e3010aa4d 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java @@ -39,17 +39,17 @@ public class TextEditorMobileDefinePane extends BaseTextEditorMobileDefinePane { @Override public void populate(FormDesigner designer) { - super.populate(designer); TextEditor textEditor = (TextEditor) getxCreator().toData(); inputSettingPane.populateBean(textEditor.getMobileScanCodeAttr()); + textSettingPane.populateBean(textEditor.getMobileTextEditAttr()); this.bindListeners2Widgets(); } @Override public void update() { - super.update(); TextEditor textEditor = (TextEditor) getxCreator().toData(); inputSettingPane.updateBean(textEditor.getMobileScanCodeAttr()); + textSettingPane.updateBean(textEditor.getMobileTextEditAttr()); DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); } diff --git a/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java b/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java index 12e8ac597a..8432cc819b 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java +++ b/designer-realize/src/main/java/com/fr/grid/GridKeyAction.java @@ -69,28 +69,26 @@ public class GridKeyAction extends AbstractAction { } else if ("right".equals(actionKey)) { selectionMove(ReportConstants.MOVE_DIRECTION_RIGHT); } else if ("up".equals(actionKey)) { - selectionMove(ReportConstants.MOVE_DIRECTION_UP); + directKeyPressed(ReportConstants.MOVE_DIRECTION_UP); } else if ("down".equals(actionKey)) { - selectionMove(ReportConstants.MOVE_DIRECTION_DOWN); + directKeyPressed(ReportConstants.MOVE_DIRECTION_DOWN); } else if ("enter".equals(actionKey)) { - enterKeyPressed(); + directKeyPressed(ReportConstants.MOVE_DIRECTION_DOWN); } else if ("tab".equals(actionKey)) { - tabKeyPressed(); + directKeyPressed(ReportConstants.MOVE_DIRECTION_RIGHT); } } - private void enterKeyPressed() { - if (grid.isCellEditing()) { - grid.stopEditing(); - } - selectionMove(ReportConstants.MOVE_DIRECTION_DOWN); - } - - private void tabKeyPressed() { + /** + * 传入方向进行单元格的方向移动 + * + * @param direction 方向 + */ + private void directKeyPressed(int direction) { if (grid.isCellEditing()) { grid.stopEditing(); } - selectionMove(ReportConstants.MOVE_DIRECTION_RIGHT); + selectionMove(direction); } /**