From aadf904a33cf040818c3e51431922f307ef465f9 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 27 Jul 2023 11:36:49 +0800 Subject: [PATCH 01/20] =?UTF-8?q?REPORT-101605=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=B8=89=E6=9C=9F=E3=80=91=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=B8=AD=E5=BF=83=E8=BF=9B=E5=85=A5=E7=9A=84=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E8=AF=A6=E6=83=85=E5=85=A5=E5=8F=A3=EF=BC=8C=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=A8=A1=E6=9D=BF=E6=89=80=E6=9C=89=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E7=89=88=E6=9C=AC=E4=B8=AD=E5=BF=83=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vcs/VcsTableOperatorListener.java | 19 ++++++++++++++ .../design/mainframe/vcs/ui/RecyclePane.java | 25 +++++++++++++++++++ .../mainframe/vcs/ui/VcsCenterPane.java | 7 ++++++ .../design/mainframe/vcs/ui/VcsNewPane.java | 1 + 4 files changed, 52 insertions(+) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsTableOperatorListener.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsTableOperatorListener.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsTableOperatorListener.java new file mode 100644 index 000000000..831efc85e --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsTableOperatorListener.java @@ -0,0 +1,19 @@ +package com.fr.design.mainframe.vcs; + +import java.util.List; + +/** + * 版本管理表格操作事件 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2023/7/27 + */ +public interface VcsTableOperatorListener { + + + /** + * 处理操作 + */ + void doOperator(List entityList); +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java index 4b0f8e976..186e6b849 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java @@ -11,6 +11,7 @@ import com.fr.design.mainframe.vcs.VcsOperatorWorker; import com.fr.design.mainframe.vcs.TableEntity; import com.fr.design.mainframe.vcs.TableValueOperator; import com.fr.design.mainframe.vcs.VcsTableEntity; +import com.fr.design.mainframe.vcs.VcsTableOperatorListener; import com.fr.report.entity.VcsEntity; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; @@ -25,7 +26,9 @@ import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import static com.fr.design.i18n.Toolkit.i18nText; @@ -44,6 +47,8 @@ public class RecyclePane extends AbstractSupportSelectTablePane public static final Icon ICON_DELETE = IconUtils.readSVGIcon("/com/fr/design/standard/vcslist/vcs_recycle_delete", IconUtils.ICON_TYPE_NORMAL); public static final Icon ICON_DELETE_DISABLE = IconUtils.readSVGIcon("/com/fr/design/standard/vcslist/vcs_recycle_delete", IconUtils.ICON_TYPE_DISABLED); + private Set listenerSet = new HashSet<>(); + protected UITextField searchTextField; protected UILabel deleteLabel; @@ -214,6 +219,7 @@ public class RecyclePane extends AbstractSupportSelectTablePane model.setList(tableEntities); model.fireTableDataChanged(); listener.doAfterChooseYes(selectList); + fireVcsListener(model.getList()); } } } @@ -274,6 +280,25 @@ public class RecyclePane extends AbstractSupportSelectTablePane this.parentDialog = parentDialog; } + + /** + * 添加版本管理表格操作事件 + * + * @param listener 版本管理表格操作事件 + */ + public void addVcsListener(VcsTableOperatorListener listener) { + listenerSet.add(listener); + } + + /** + * 触发版本管理表格操作事件 + */ + public void fireVcsListener(List tableEntities) { + for (VcsTableOperatorListener listener : listenerSet) { + listener.doOperator(tableEntities); + } + } + /** * 删除范围 * diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java index 5a2f20cf1..e50ef2c4d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java @@ -10,6 +10,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.vcs.VcsOperatorWorker; import com.fr.design.mainframe.vcs.VcsTableEntity; +import com.fr.design.mainframe.vcs.VcsTableOperatorListener; import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; import com.fr.report.entity.VcsEntity; @@ -160,6 +161,12 @@ public class VcsCenterPane extends VcsNewPane { return entity.getFilename()+Toolkit.i18nText("Fine-Design_Vcs_Version_Tips"); } }; + pane.addVcsListener(entities -> { + if (entities.size() == 0) { + model.getList().remove(o); + model.fireTableDataChanged(); + } + }); pane.showDialog(getDialog()); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java index baafe5686..484453a8d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java @@ -216,6 +216,7 @@ public class VcsNewPane extends RecyclePane { model.getList().remove(o); model.fireTableDataChanged(); VcsOperatorWorker.createDeleteWorker().deleteTargetVersion(entity); + fireVcsListener(model.getList()); } } } From ee7d91a269f46867481be4cc8de8a1ffd004e766 Mon Sep 17 00:00:00 2001 From: "Coral.Chen" Date: Thu, 27 Jul 2023 13:57:03 +0800 Subject: [PATCH 02/20] =?UTF-8?q?REPORT-99740=20FRM=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E5=9D=97=EF=BC=8Cget=20(-1,-1)=E7=B1=BB=E5=9E=8B=E7=9A=84Colum?= =?UTF-8?q?nRow=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/sort/common/SortColumnRowPane.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/sort/common/SortColumnRowPane.java b/designer-realize/src/main/java/com/fr/design/sort/common/SortColumnRowPane.java index 19b8ad50a..0db7af4a1 100644 --- a/designer-realize/src/main/java/com/fr/design/sort/common/SortColumnRowPane.java +++ b/designer-realize/src/main/java/com/fr/design/sort/common/SortColumnRowPane.java @@ -24,13 +24,16 @@ import com.fr.stable.ColumnRow; import com.fr.stable.EssentialUtils; import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.Icon; +import javax.swing.JPanel; +import javax.swing.JTextField; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; public class SortColumnRowPane extends JPanel implements UIObserver { @@ -260,8 +263,10 @@ public class SortColumnRowPane extends JPanel implements UIObserver { disableHeaderCellsStyleMap = new HashMap<>(); tempHeaderCells = new ArrayList<>(); for (ColumnRow columnRow : notSelectables) { - TemplateCellElement templateCellElement - = elementCase.getTemplateCellElement(columnRow.column, columnRow.row); + TemplateCellElement templateCellElement = null; + if (columnRow != ColumnRow.ERROR) { + templateCellElement = elementCase.getTemplateCellElement(columnRow.column, columnRow.row); + } if (templateCellElement == null) { templateCellElement = new DefaultTemplateCellElement(columnRow.column, columnRow.row); elementCase.addCellElement(templateCellElement); @@ -280,8 +285,11 @@ public class SortColumnRowPane extends JPanel implements UIObserver { if (cellSelectionManager != null) { try { for (ColumnRow headerColumnRow : disableHeaderCellsStyleMap.keySet()) { - TemplateCellElement headerTemplateCellElement - = elementCase.getTemplateCellElement(headerColumnRow.column, headerColumnRow.row); + TemplateCellElement headerTemplateCellElement = null; + if (headerColumnRow != ColumnRow.ERROR) { + headerTemplateCellElement + = elementCase.getTemplateCellElement(headerColumnRow.column, headerColumnRow.row); + } if (headerTemplateCellElement != null) { headerTemplateCellElement.setStyle(disableHeaderCellsStyleMap.get(headerColumnRow)); } From fbbb35df2c5097f240725dfe14b9696368086f9e Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 27 Jul 2023 14:27:36 +0800 Subject: [PATCH 03/20] =?UTF-8?q?REPORT-101026=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=B8=89=E6=9C=9F=E3=80=91=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E7=89=88=E6=9C=AC=E6=96=87=E4=BB=B6=EF=BC=8C=E6=9C=89?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java | 1 - 1 file changed, 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java index 484453a8d..ac8e0a06b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java @@ -232,7 +232,6 @@ public class VcsNewPane extends RecyclePane { if (o instanceof VcsTableEntity) { VcsEntity entity = ((VcsTableEntity) o).getEntity(); previewEntity(entity); - VcsNewPane.this.saveSettingAndCloseDialog(); } } }); From 444c9ce4bd269995f780bddc1a0093be8384a382 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 27 Jul 2023 16:09:42 +0800 Subject: [PATCH 04/20] =?UTF-8?q?REPORT-101608=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=B8=89=E6=9C=9F=E3=80=91=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E7=89=88=E6=9C=AC=E4=B8=AD=E5=BF=83=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E8=BF=9B=E5=85=A5=E7=89=88=E6=9C=AC=E8=AF=A6=E6=83=85=EF=BC=8C?= =?UTF-8?q?=E6=9C=AA=E4=BF=9D=E5=AD=98=E7=9A=84=E6=A8=A1=E6=9D=BF=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E8=BF=98=E5=8E=9F=EF=BC=8C=E9=80=89=E6=8B=A9=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E8=BF=98=E5=8E=9F=E4=BC=9A=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesignerFrameFileDealerPane.java | 77 +---------- .../vcs/common/VcsCloseTemplateHelper.java | 122 ++++++++++++++++++ .../mainframe/vcs/ui/VcsCenterPane.java | 12 +- 3 files changed, 132 insertions(+), 79 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java 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 747cf6aef..16c8ef46c 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 @@ -36,9 +36,9 @@ import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager; import com.fr.design.mainframe.manager.search.searcher.control.pane.TemplateTreeSearchToolbarPane; import com.fr.design.mainframe.vcs.RecycleAction; +import com.fr.design.mainframe.vcs.common.VcsCloseTemplateHelper; import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.design.mainframe.vcs.ui.FileVersionsPanel; -import com.fr.design.mainframe.vcs.ui.VcsNewPane; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; @@ -46,7 +46,6 @@ import com.fr.design.roleAuthority.RolesAlreadyEditedPane; import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.design.worker.save.CallbackSaveWorker; import com.fr.event.Event; import com.fr.file.filetree.FileNode; import com.fr.general.ComparatorUtils; @@ -392,15 +391,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } } - private boolean isCurrentEditing(String path) { - JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - if (JTemplate.isValid(jt)) { - String editing = jt.getEditingFILE().getPath(); - return ComparatorUtils.equals(editing, path); - } - return false; - } - /** * 按钮状态改变 */ @@ -505,7 +495,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt public void actionPerformed(ActionEvent e) { String path = DesignerFrameFileDealerPane.getInstance().getSelectedOperation().getFilePath(); path = StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, path); - boolean currentEditing = isCurrentEditing(path); + boolean currentEditing = VcsCloseTemplateHelper.isCurrentEditing(path); if (VcsHelper.getInstance().isLegacyMode()) { // 如果模板已经打开了,关掉,避免出现2个同名tab(1个是模板,1个是版本) closeOpenedTemplate(path, currentEditing); @@ -513,16 +503,10 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt fileVersionTablePanel.showFileVersionsPane(); stateChange(); } else { - checkTemplateSavedAndShowVcsNewPane(path, currentEditing); + VcsCloseTemplateHelper.checkTemplateSavedAndShowVcsNewPane(path, currentEditing); } - - } - private void showVcsNewPane(String path) { - VcsNewPane panel = new VcsNewPane(path); - panel.showDialog(); - } /** * 版本管理可用状态的监控 @@ -577,61 +561,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } } - /** - * 如果指定模板已经打开: - *

1.如果该模板已保存,则正常打开新版本管理弹窗 - *

2.如果该模板未保存,触发保存逻辑 - *

  • a.如果用户选择保存,则保存并不关闭模板,弹出新版本管理弹窗 - *
  • b.如果用户选择不保存,则关闭当前模板,弹出新版本管理弹窗 - *
  • c.如果用户选择取消, 则啥操作都不做 - * - * @param path - * @param isCurrentEditing - */ - private void checkTemplateSavedAndShowVcsNewPane(String path, boolean isCurrentEditing) { - for (JTemplate jTemplate : HistoryTemplateListCache.getInstance().getHistoryList()) { - if (ComparatorUtils.equals(jTemplate.getEditingFILE().getPath(), path)) { - if (!jTemplate.isALLSaved()) { - MultiTemplateTabPane.getInstance().setIsCloseCurrent(isCurrentEditing); - MultiTemplateTabPane.getInstance().closeFormat(jTemplate); - confirmCloseAndShowVcsNewPane(jTemplate, path); - return; - } - } - } - showVcsNewPane(path); - } - - private void confirmCloseAndShowVcsNewPane(JTemplate specifiedTemplate, String path) { - if (specifiedTemplate == null) { - return; - } - if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { - specifiedTemplate.stopEditing(); - int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", - Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - if (returnVal == JOptionPane.YES_OPTION) { - CallbackSaveWorker worker = specifiedTemplate.save(); - worker.addSuccessCallback(() -> { - FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); - showVcsNewPane(path); - }); - worker.start(specifiedTemplate.getRuntimeId()); - } else if (returnVal == JOptionPane.NO_OPTION) { - closeTpl(specifiedTemplate); - showVcsNewPane(path); - } - } else { - showVcsNewPane(path); - } - } - - private void closeTpl(JTemplate specifiedTemplate) { - HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); - MultiTemplateTabPane.getInstance().closeAndFreeLock(specifiedTemplate); - MultiTemplateTabPane.getInstance().activePrevTemplateAfterClose(); - } - } /** diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java new file mode 100644 index 000000000..93fde383d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java @@ -0,0 +1,122 @@ +package com.fr.design.mainframe.vcs.common; + +import com.fr.base.vcs.DesignerMode; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.vcs.ui.VcsNewPane; +import com.fr.design.worker.save.CallbackSaveWorker; +import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; + +import javax.swing.JOptionPane; + +/** + * 版本管理关闭模板辅助类 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2023/7/27 + */ +public class VcsCloseTemplateHelper { + + /** + * 根据传入的pane与dialog生成指定面板的Vcs模板关闭的处理方法 + * 如果指定模板已经打开: + *

    1.如果该模板已保存,则正常打开新版本管理弹窗 + *

    2.如果该模板未保存,触发保存逻辑 + *

  • a.如果用户选择保存,则保存并不关闭模板,弹出新版本管理弹窗 + *
  • b.如果用户选择不保存,则关闭当前模板,弹出新版本管理弹窗 + *
  • c.如果用户选择取消, 则啥操作都不做 + * + * @param path 对应模板路径 + * @param isCurrentEditing 是否是正在编辑的模板 + * @param dialog 生成的新版本管理的详情面板的父面板 + */ + public static void checkTemplateSavedAndShowVcsNewPane(String path, boolean isCurrentEditing, BasicDialog dialog, VcsNewPane pane) { + for (JTemplate jTemplate : HistoryTemplateListCache.getInstance().getHistoryList()) { + if (ComparatorUtils.equals(jTemplate.getEditingFILE().getPath(), path)) { + if (!jTemplate.isALLSaved()) { + MultiTemplateTabPane.getInstance().setIsCloseCurrent(isCurrentEditing); + MultiTemplateTabPane.getInstance().closeFormat(jTemplate); + confirmCloseAndShowVcsNewPane(jTemplate, path, dialog, pane); + return; + } + } + } + showVcsNewPane(path, dialog, pane); + } + + + /** + * 自己生成新的VcsNewPane的Vcs模板关闭的处理方法 + */ + public static void checkTemplateSavedAndShowVcsNewPane(String path, boolean isCurrentEditing) { + checkTemplateSavedAndShowVcsNewPane(path, isCurrentEditing, null, null); + } + + + /** + * 是否是当前编辑的模板 + * + * @param path 对应模板路径 + * @return 是则返回true + */ + public static boolean isCurrentEditing(String path) { + JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (JTemplate.isValid(jt)) { + String editing = jt.getEditingFILE().getPath(); + return ComparatorUtils.equals(editing, path); + } + return false; + } + + + + + private static void confirmCloseAndShowVcsNewPane(JTemplate specifiedTemplate, String path, BasicDialog dialog, VcsNewPane pane) { + if (specifiedTemplate == null) { + return; + } + if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { + specifiedTemplate.stopEditing(); + int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", + Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (returnVal == JOptionPane.YES_OPTION) { + CallbackSaveWorker worker = specifiedTemplate.save(); + worker.addSuccessCallback(() -> { + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); + showVcsNewPane(path, dialog, pane); + }); + worker.start(specifiedTemplate.getRuntimeId()); + } else if (returnVal == JOptionPane.NO_OPTION) { + closeTpl(specifiedTemplate); + showVcsNewPane(path, dialog, pane); + } + } else { + showVcsNewPane(path, dialog, pane); + } + } + + private static void showVcsNewPane(String path, BasicDialog dialog, VcsNewPane pane) { + if (pane != null) { + pane.showDialog(dialog); + } else { + VcsNewPane newPane = new VcsNewPane(path); + newPane.showDialog(dialog); + } + + + + } + + private static void closeTpl(JTemplate specifiedTemplate) { + HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); + MultiTemplateTabPane.getInstance().closeAndFreeLock(specifiedTemplate); + MultiTemplateTabPane.getInstance().activePrevTemplateAfterClose(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java index e50ef2c4d..c363e346a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java @@ -10,7 +10,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.vcs.VcsOperatorWorker; import com.fr.design.mainframe.vcs.VcsTableEntity; -import com.fr.design.mainframe.vcs.VcsTableOperatorListener; +import com.fr.design.mainframe.vcs.common.VcsCloseTemplateHelper; import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; import com.fr.report.entity.VcsEntity; @@ -155,7 +155,8 @@ public class VcsCenterPane extends VcsNewPane { Object o = table.getValueAt(table.getEditingRow(), table.getEditingColumn()); if (o instanceof VcsTableEntity) { VcsEntity entity = ((VcsTableEntity) o).getEntity(); - VcsNewPane pane = new VcsNewPane(getTemplateTruePath(entity.getFilename())) { + String path = getTemplateTruePath(entity.getFilename()); + VcsNewPane pane = new VcsNewPane(path) { @Override protected String title4PopupWindow() { return entity.getFilename()+Toolkit.i18nText("Fine-Design_Vcs_Version_Tips"); @@ -167,7 +168,7 @@ public class VcsCenterPane extends VcsNewPane { model.fireTableDataChanged(); } }); - pane.showDialog(getDialog()); + VcsCloseTemplateHelper.checkTemplateSavedAndShowVcsNewPane(path, VcsCloseTemplateHelper.isCurrentEditing(path), getDialog(), pane); } } }); @@ -189,8 +190,9 @@ public class VcsCenterPane extends VcsNewPane { dialog.addDialogActionListener(new DialogActionAdapter() { @Override public void doOk() { - getParentDialog().doOK(); - getParentDialog().dispose(); + BasicDialog parent = getParentDialog(); + parent.doOK(); + parent.dispose(); } }); } From 423b921befa19d640968b7256d4f1351672972b3 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 27 Jul 2023 16:51:15 +0800 Subject: [PATCH 05/20] =?UTF-8?q?REPORT-101482=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=BA=8C=E6=9C=9F=E3=80=91=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E5=A4=B1=E8=B4=A5/=E6=88=90=E5=8A=9F=E7=9A=84?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=EF=BC=8C=E9=83=BD=E6=9C=89=E4=B8=AA=E5=B8=AE?= =?UTF-8?q?=E5=8A=A9=E6=96=87=E6=A1=A3=E7=9A=84=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/vcs/ui/VcsMovePanel.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java index 0479ee68e..28cb3f244 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsMovePanel.java @@ -11,6 +11,7 @@ import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.iprogressbar.ModernUIProgressBarUI; import com.fr.design.gui.ispinner.UISpinner; +import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.VerticalFlowLayout; @@ -18,6 +19,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.vcs.VcsExceptionUtils; import com.fr.design.mainframe.vcs.common.VcsHelper; +import com.fr.design.utils.BrowseUtils; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.ThemeUtils; import com.fr.design.widget.FRWidgetFactory; @@ -74,6 +76,12 @@ public class VcsMovePanel extends BasicPane { private static final int DEFAULT_VALUE = 5; + private static final String HELP_KEY = "Fine-Design_Vcs_Move_Help_Link"; + + private static final String HELP_KEY_DEFAULT = "Fine-Design_Vcs_Move_Help_Link_Default"; + + private static final String HELP_URL = LocaleLinkProvider.getInstance().getLink(HELP_KEY, HELP_KEY_DEFAULT); + public static final String SETTING = "SETTING"; public static final String PROCESS = "PROCESS"; @@ -121,6 +129,8 @@ public class VcsMovePanel extends BasicPane { private boolean visible = false; + private UILabel seeLabel; + private UILabel helpLabel; public VcsMovePanel(CardLayout cardLayout, JPanel parentPane, MoveCallBack callBack, BasicDialog parentDialog) { this.parentCard = cardLayout; @@ -407,6 +417,9 @@ public class VcsMovePanel extends BasicPane { body.add(new UILabel(StringUtils.BLANK)); body.add(tipLabel); body.add(new UILabel(StringUtils.BLANK)); + JPanel panel = createHelpPane(); + body.add(panel); + body.add(new UILabel(StringUtils.BLANK)); body.add(button); statusPane.add(body); statusPane.setLayout(FRGUIPaneFactory.createCenterLayout(body, 0.5f, 0.5f)); @@ -417,6 +430,24 @@ public class VcsMovePanel extends BasicPane { tipLabel.setAlignmentX(CENTER_ALIGNMENT); } + private JPanel createHelpPane() { + JPanel panel = new JPanel(); + seeLabel = new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Move_See")); + seeLabel.setForeground(TIP_COLOR); + helpLabel = new UILabel(Toolkit.i18nText("Fine-Design_Vcs_Move_Help")); + helpLabel.setForeground(LABEL_COLOR); + helpLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); + helpLabel.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + BrowseUtils.browser(HELP_URL); + } + }); + panel.add(seeLabel); + panel.add(helpLabel); + return panel; + } + private class MoveWorker extends SwingWorker { From e50cafdd968ff91ffd318f39c63564498e9f3743 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 27 Jul 2023 18:16:01 +0800 Subject: [PATCH 06/20] =?UTF-8?q?REPORT-101608=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=B8=89=E6=9C=9F=E3=80=91=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E7=89=88=E6=9C=AC=E4=B8=AD=E5=BF=83=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E8=BF=9B=E5=85=A5=E7=89=88=E6=9C=AC=E8=AF=A6=E6=83=85=EF=BC=8C?= =?UTF-8?q?=E6=9C=AA=E4=BF=9D=E5=AD=98=E7=9A=84=E6=A8=A1=E6=9D=BF=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E8=BF=98=E5=8E=9F=EF=BC=8C=E9=80=89=E6=8B=A9=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E8=BF=98=E5=8E=9F=E4=BC=9A=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vcs/common/VcsCloseTemplateHelper.java | 29 ++++++--------- .../vcs/common/VcsNewPaneWrapper.java | 36 +++++++++++++++++++ 2 files changed, 46 insertions(+), 19 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsNewPaneWrapper.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java index 93fde383d..a2f43d213 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java @@ -14,6 +14,7 @@ import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; /** * 版本管理关闭模板辅助类 @@ -38,17 +39,18 @@ public class VcsCloseTemplateHelper { * @param dialog 生成的新版本管理的详情面板的父面板 */ public static void checkTemplateSavedAndShowVcsNewPane(String path, boolean isCurrentEditing, BasicDialog dialog, VcsNewPane pane) { + VcsNewPaneWrapper wrapper = new VcsNewPaneWrapper(path, dialog, pane); for (JTemplate jTemplate : HistoryTemplateListCache.getInstance().getHistoryList()) { if (ComparatorUtils.equals(jTemplate.getEditingFILE().getPath(), path)) { if (!jTemplate.isALLSaved()) { MultiTemplateTabPane.getInstance().setIsCloseCurrent(isCurrentEditing); MultiTemplateTabPane.getInstance().closeFormat(jTemplate); - confirmCloseAndShowVcsNewPane(jTemplate, path, dialog, pane); + confirmCloseAndShowVcsNewPane(jTemplate, wrapper); return; } } } - showVcsNewPane(path, dialog, pane); + wrapper.show(); } @@ -78,42 +80,31 @@ public class VcsCloseTemplateHelper { - private static void confirmCloseAndShowVcsNewPane(JTemplate specifiedTemplate, String path, BasicDialog dialog, VcsNewPane pane) { + private static void confirmCloseAndShowVcsNewPane(JTemplate specifiedTemplate, VcsNewPaneWrapper wrapper) { if (specifiedTemplate == null) { return; } if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { specifiedTemplate.stopEditing(); - int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", + int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), + String.format("%s\"%s\" ?",Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save"), specifiedTemplate.getEditingFILE()), Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (returnVal == JOptionPane.YES_OPTION) { CallbackSaveWorker worker = specifiedTemplate.save(); worker.addSuccessCallback(() -> { FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); - showVcsNewPane(path, dialog, pane); + SwingUtilities.invokeLater(wrapper::show); }); worker.start(specifiedTemplate.getRuntimeId()); } else if (returnVal == JOptionPane.NO_OPTION) { closeTpl(specifiedTemplate); - showVcsNewPane(path, dialog, pane); + wrapper.show(); } } else { - showVcsNewPane(path, dialog, pane); + wrapper.show(); } } - private static void showVcsNewPane(String path, BasicDialog dialog, VcsNewPane pane) { - if (pane != null) { - pane.showDialog(dialog); - } else { - VcsNewPane newPane = new VcsNewPane(path); - newPane.showDialog(dialog); - } - - - - } - private static void closeTpl(JTemplate specifiedTemplate) { HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); MultiTemplateTabPane.getInstance().closeAndFreeLock(specifiedTemplate); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsNewPaneWrapper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsNewPaneWrapper.java new file mode 100644 index 000000000..179b7c940 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsNewPaneWrapper.java @@ -0,0 +1,36 @@ +package com.fr.design.mainframe.vcs.common; + +import com.fr.design.dialog.BasicDialog; +import com.fr.design.mainframe.vcs.ui.VcsNewPane; + +/** + * 构建VcsNewPane的包装类 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2023/7/27 + */ +public class VcsNewPaneWrapper { + + private String path; + private BasicDialog dialog; + private VcsNewPane pane; + + public VcsNewPaneWrapper(String path, BasicDialog dialog, VcsNewPane pane) { + this.path = path; + this.dialog = dialog; + this.pane = pane; + } + + /** + * 显示面板 + */ + public void show() { + if (pane != null) { + pane.showDialog(dialog); + } else { + VcsNewPane newPane = new VcsNewPane(path); + newPane.showDialog(dialog); + } + } +} From a007b71ca75d6d07832da3d27e871c841805154d Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 28 Jul 2023 12:19:49 +0800 Subject: [PATCH 07/20] =?UTF-8?q?REPORT-101773=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=B8=89=E6=9C=9F=E3=80=91=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E8=AF=A6=E6=83=85=E9=A1=B5=E9=9D=A2=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=88=A0=E9=99=A4=EF=BC=8C=E5=88=A0=E5=AE=8C?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E6=93=8D=E4=BD=9C=E6=A1=86=E7=9A=84=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=B0=B1=E7=82=B9=E4=B8=8D=E5=8A=A8=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/vcs/ui/RecyclePane.java | 4 ++-- .../java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java | 6 ++++-- .../java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java | 7 ++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java index 186e6b849..ef84c059e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java @@ -216,7 +216,7 @@ public class RecyclePane extends AbstractSupportSelectTablePane JOptionPane.QUESTION_MESSAGE); if (selVal == JOptionPane.YES_OPTION) { tableEntities = model.getList().stream().filter(tableEntity -> !tableEntity.isSelect()).collect(Collectors.toList()); - model.setList(tableEntities); + model.setList(new ArrayList<>(tableEntities)); model.fireTableDataChanged(); listener.doAfterChooseYes(selectList); fireVcsListener(model.getList()); @@ -365,7 +365,7 @@ public class RecyclePane extends AbstractSupportSelectTablePane * @param entities */ public void updateTableList(List entities) { - tableEntities = entities; + tableEntities = new ArrayList<>(entities); } /** diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java index c363e346a..354e02bd5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java @@ -105,7 +105,8 @@ public class VcsCenterPane extends VcsNewPane { @Override public void mouseClicked(MouseEvent e) { JTable table = tableContentPane.getEditTable(); - Object o = table.getValueAt(table.getEditingRow(), table.getEditingColumn()); + int row = table.getEditingRow(); + Object o = table.getValueAt(row, table.getEditingColumn()); if (o instanceof VcsTableEntity) { VcsEntity entity = ((VcsTableEntity) o).getEntity(); String fileName = entity.getFilename(); @@ -118,7 +119,8 @@ public class VcsCenterPane extends VcsNewPane { if (selVal == JOptionPane.YES_OPTION) { VcsOperatorWorker.createDeleteWorker().doDelete(entity); removeTarget((VcsTableEntity) o); - model.getList().remove(o); + model.fireTableRowsDeleted(row, row); + model.removeRow(row); model.fireTableDataChanged(); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java index ac8e0a06b..638bc3a59 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java @@ -202,8 +202,8 @@ public class VcsNewPane extends RecyclePane { @Override public void mouseClicked(MouseEvent e) { JTable table = tableContentPane.getEditTable(); - int row = table.getEditingColumn(); - Object o = table.getValueAt(table.getEditingRow(), row); + int row = table.getEditingRow(); + Object o = table.getValueAt(row, table.getEditingColumn()); if (o instanceof VcsTableEntity) { VcsEntity entity = ((VcsTableEntity) o).getEntity(); int selVal = FineJOptionPane.showConfirmDialog( @@ -213,7 +213,8 @@ public class VcsNewPane extends RecyclePane { JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (selVal == JOptionPane.YES_OPTION) { - model.getList().remove(o); + model.fireTableRowsDeleted(row, row); + model.removeRow(row); model.fireTableDataChanged(); VcsOperatorWorker.createDeleteWorker().deleteTargetVersion(entity); fireVcsListener(model.getList()); From 0e318971e0bbea8f167ed6927993e5ad083737ca Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 28 Jul 2023 12:21:44 +0800 Subject: [PATCH 08/20] =?UTF-8?q?REPORT-101608=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=B8=89=E6=9C=9F=E3=80=91=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E7=89=88=E6=9C=AC=E4=B8=AD=E5=BF=83=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E8=BF=9B=E5=85=A5=E7=89=88=E6=9C=AC=E8=AF=A6=E6=83=85=EF=BC=8C?= =?UTF-8?q?=E6=9C=AA=E4=BF=9D=E5=AD=98=E7=9A=84=E6=A8=A1=E6=9D=BF=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E8=BF=98=E5=8E=9F=EF=BC=8C=E9=80=89=E6=8B=A9=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E8=BF=98=E5=8E=9F=E4=BC=9A=E5=A4=B1=E8=B4=A5=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/vcs/common/VcsCloseTemplateHelper.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java index a2f43d213..587779558 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCloseTemplateHelper.java @@ -36,10 +36,10 @@ public class VcsCloseTemplateHelper { * * @param path 对应模板路径 * @param isCurrentEditing 是否是正在编辑的模板 - * @param dialog 生成的新版本管理的详情面板的父面板 + * @param parent 生成的新版本管理的详情面板的父面板 */ - public static void checkTemplateSavedAndShowVcsNewPane(String path, boolean isCurrentEditing, BasicDialog dialog, VcsNewPane pane) { - VcsNewPaneWrapper wrapper = new VcsNewPaneWrapper(path, dialog, pane); + public static void checkTemplateSavedAndShowVcsNewPane(String path, boolean isCurrentEditing, BasicDialog parent, VcsNewPane pane) { + VcsNewPaneWrapper wrapper = new VcsNewPaneWrapper(path, parent, pane); for (JTemplate jTemplate : HistoryTemplateListCache.getInstance().getHistoryList()) { if (ComparatorUtils.equals(jTemplate.getEditingFILE().getPath(), path)) { if (!jTemplate.isALLSaved()) { From 707f936f5c608ca40e0689a82f61fe426d85742c Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 28 Jul 2023 18:27:52 +0800 Subject: [PATCH 09/20] =?UTF-8?q?REPORT-101409=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=B8=89=E6=9C=9F=E3=80=91=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A0=E6=9D=83=E9=99=90=E7=9A=84=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=A4=B1=E8=B4=A5=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/vcs/VcsOperatorWorker.java | 91 +++++++++---------- .../vcs/VcsProcessFailedWrapper.java | 60 ++++++++++++ .../vcs/VcsTableOperatorListener.java | 15 ++- .../mainframe/vcs/common/VcsHelper.java | 13 +++ .../design/mainframe/vcs/ui/RecyclePane.java | 25 +++-- .../mainframe/vcs/ui/VcsCenterPane.java | 26 ++++-- .../design/mainframe/vcs/ui/VcsNewPane.java | 65 +++++++++---- 7 files changed, 213 insertions(+), 82 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsProcessFailedWrapper.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsOperatorWorker.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsOperatorWorker.java index b59ac3c12..799abcf17 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsOperatorWorker.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsOperatorWorker.java @@ -10,7 +10,9 @@ import com.fr.report.entity.VcsEntity; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.server.vcs.VcsOperator; +import com.fr.workspace.server.vcs.v2.VcsTaskResult; +import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import java.util.ArrayList; import java.util.List; @@ -26,7 +28,7 @@ import java.util.concurrent.ExecutionException; public class VcsOperatorWorker { private int count = 0; - private static final int FREQ = 5; + private static final int FREQ = 6; private String successStr; @@ -102,21 +104,16 @@ public class VcsOperatorWorker { * * @param vcsEntities 需要还原的版本 */ - public void batchRestore(List vcsEntities) { - List failedList = new ArrayList<>(); - startProcess(vcsEntities, failedList, (vcsEntity, operator) -> { + public void batchRestore(List vcsEntities, VcsTableOperatorListener listener) { + VcsProcessFailedWrapper wrapper = new VcsProcessFailedWrapper(); + startProcess(vcsEntities, wrapper, (vcsEntity, operator) -> { String fileName = vcsEntity.getFilename(); - boolean result = true; - try { - operator.restoreVersion(fileName); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - result = false; + VcsTaskResult result = operator.restoreVersion(fileName); + if (!result.isSuccess()) { + wrapper.addFailedEntity(vcsEntity); } - if (!result) { - failedList.add(fileName+PREFIX+vcsEntity.getVersion()+TAIL); - } - }); + return result; + }, listener); } @@ -126,25 +123,21 @@ public class VcsOperatorWorker { * @param vcsEntities 需要删除的版本 * @param all 是否需要删除所有版本 */ - public void batchDelete(List vcsEntities, boolean all) { - List failedList = new ArrayList<>(); - startProcess(vcsEntities, failedList, (vcsEntity, operator) -> { + public void batchDelete(List vcsEntities, boolean all, VcsTableOperatorListener listener) { + VcsProcessFailedWrapper wrapper = new VcsProcessFailedWrapper(); + startProcess(vcsEntities, wrapper, (vcsEntity, operator) -> { String fileName = vcsEntity.getFilename(); - boolean result = true; - try { - if (all) { - operator.deleteVersionForRecycle(fileName); - } else { - operator.deleteVersion(fileName, vcsEntity.getVersion()); - } - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - result = false; + VcsTaskResult result; + if (all) { + result = operator.deleteVersionForRecycle(fileName); + } else { + result = operator.deleteVersion(fileName, vcsEntity.getVersion(), VcsEntity.CommitType.TYPE_DEFAULT); } - if (!result) { - failedList.add(fileName+PREFIX+vcsEntity.getVersion()+TAIL); + if (!result.isSuccess()) { + wrapper.addFailedEntity(vcsEntity); } - }); + return result; + }, listener); } @@ -153,9 +146,9 @@ public class VcsOperatorWorker { * * @param entity VcsEntity */ - public void doDelete(VcsEntity entity) { + public void doDelete(VcsEntity entity, VcsTableOperatorListener listener) { String fileName = entity.getFilename(); - start4Single(entity, (vcsEntity, operator) -> operator.deleteVersionForRecycle(fileName), fileName + everyFailedStr); + start4Single(entity, (vcsEntity, operator) -> operator.deleteVersionForRecycle(fileName), fileName + everyFailedStr, listener); } /** @@ -163,12 +156,11 @@ public class VcsOperatorWorker { * * @param entity 版本 */ - public void deleteTargetVersion(VcsEntity entity) { + public void deleteTargetVersion(VcsEntity entity, VcsTableOperatorListener listener) { String fileName = entity.getFilename(); int version = entity.getVersion(); - start4Single(entity, (vcsEntity, operator) -> { - operator.deleteVersion(fileName, version); - }, fileName + everyFailedStr); + VcsEntity.CommitType commitType = entity.getCommitType(); + start4Single(entity, (vcsEntity, operator) -> operator.deleteVersion(fileName, version, commitType), fileName + everyFailedStr, listener); } @@ -177,16 +169,17 @@ public class VcsOperatorWorker { * * @param entity 版本 */ - public void updateEntityAnnotation(VcsEntity entity) { + public void updateEntityAnnotation(VcsEntity entity, VcsTableOperatorListener listener) { start4Single(entity, (vcsEntity, operator) -> { operator.updateVersion(entity); - }, everyFailedStr); + return new VcsTaskResult(true); + }, everyFailedStr, listener); } - private void startProcess(List vcsEntities, List failedList, VcsWorkerOperator workerOperator) { + private void startProcess(List vcsEntities, VcsProcessFailedWrapper wrapper, VcsWorkerOperator workerOperator, VcsTableOperatorListener listener) { try { dialog.getProgressBar().setMaximum(vcsEntities.size()); - start4Batch(vcsEntities, failedList, workerOperator); + start4Batch(vcsEntities, wrapper, workerOperator, listener); dialog.showDialog(); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); @@ -202,13 +195,15 @@ public class VcsOperatorWorker { return (count > FREQ && count % FREQ == 0) || count < FREQ; } - private void start4Single(VcsEntity entity, VcsWorkerOperator vcsWorkerOperator, String failedTip) { + private void start4Single(VcsEntity entity, VcsWorkerOperator vcsWorkerOperator, String failedTip, VcsTableOperatorListener listener) { new SwingWorker() { @Override protected void done() { try { if (!get()) { - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), failedTip); + FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(DesignerContext.getDesignerFrame()), failedTip); + } else { + listener.updateUI(); } } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); @@ -218,16 +213,16 @@ public class VcsOperatorWorker { protected Boolean doInBackground() throws Exception { try { VcsOperator operator = WorkContext.getCurrent().get(VcsOperator.class); - vcsWorkerOperator.process(entity, operator); + VcsTaskResult result = vcsWorkerOperator.process(entity, operator); + return result.isSuccess(); } catch (Exception e) { return false; } - return true; } }.execute(); } - private void start4Batch(List vcsEntities, List failedList, VcsWorkerOperator workerOperator) { + private void start4Batch(List vcsEntities, VcsProcessFailedWrapper wrapper, VcsWorkerOperator workerOperator, VcsTableOperatorListener listener) { new SwingWorker() { @Override protected Boolean doInBackground() throws Exception { @@ -239,7 +234,7 @@ public class VcsOperatorWorker { publish(count); } } - return failedList.isEmpty(); + return wrapper.isAllSuccess(); } @Override protected void process(List chunks) { @@ -249,7 +244,9 @@ public class VcsOperatorWorker { protected void done() { dialog.closeDialog(); try { + List failedList = wrapper.getDetailFailedList(); showErrorDetailPane(get(), failedList, failedList.size(), vcsEntities.size() - failedList.size()); + listener.updateUI(wrapper); } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); } @@ -286,6 +283,6 @@ public class VcsOperatorWorker { * @param vcsEntity 版本 * @param operator 操作类 */ - void process(VcsEntity vcsEntity, VcsOperator operator) throws Exception; + VcsTaskResult process(VcsEntity vcsEntity, VcsOperator operator) throws Exception; } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsProcessFailedWrapper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsProcessFailedWrapper.java new file mode 100644 index 000000000..0a257ce2e --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsProcessFailedWrapper.java @@ -0,0 +1,60 @@ +package com.fr.design.mainframe.vcs; + +import com.fr.report.entity.VcsEntity; + +import java.util.ArrayList; +import java.util.List; + +/** + * 版本管理处理失败列表的包装类 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2023/7/28 + */ +public class VcsProcessFailedWrapper { + private static final String PREFIX = "(v."; + private static final String TAIL = ")"; + + private List failedList = new ArrayList<>(); + + + /** + * 添加处理失败的VcsEntity + * + * @param entity entity + */ + public void addFailedEntity(VcsEntity entity) { + failedList.add(entity); + } + + + /** + * 获取用于展示的详细失败信息列表 + */ + public List getDetailFailedList() { + List detailList = new ArrayList<>(); + for (VcsEntity entity : failedList) { + detailList.add(entity.getFilename()+PREFIX+entity.getVersion()+TAIL); + } + return detailList; + } + + /** + * 获取处理失败的vcsEntity的名称列表 + */ + public List getFailedNameList() { + List detailList = new ArrayList<>(); + for (VcsEntity entity : failedList) { + detailList.add(entity.getFilename()); + } + return detailList; + } + + /** + * 处理是否全部成功 + */ + public boolean isAllSuccess() { + return failedList.isEmpty(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsTableOperatorListener.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsTableOperatorListener.java index 831efc85e..a6f19572e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsTableOperatorListener.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/VcsTableOperatorListener.java @@ -15,5 +15,18 @@ public interface VcsTableOperatorListener { /** * 处理操作 */ - void doOperator(List entityList); + default void doOperator(List entityList){} + + /** + * 更新界面 + */ + default void updateUI(){} + + + /** + * 根据处理失败的内容来更新界面 + * + * @param wrapper 失败内容 + */ + default void updateUI(VcsProcessFailedWrapper wrapper){} } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java index 49054f651..07007604d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java @@ -22,6 +22,7 @@ import com.fr.log.FineLoggerFactory; import com.fr.plugin.context.PluginContext; import com.fr.plugin.manage.PluginManager; import com.fr.report.entity.VcsEntity; +import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; @@ -64,6 +65,8 @@ public class VcsHelper implements JTemplateActionListener { private final static String VCS_PLUGIN_ID = "com.fr.plugin.vcs.v10"; private final static String VCS_FILE_SLASH = "/"; private final static String SERVICE_NAME_MOVE = "moveVcs"; + private static final String VCS_VERSIONS = "reportlets_versions"; + private static final String VERSION_MARK = ".v"; private static final VcsHelper INSTANCE = new VcsHelper(); private static ScheduledExecutorService saveSchedule; @@ -398,4 +401,14 @@ public class VcsHelper implements JTemplateActionListener { public boolean checkAutoSaveSupport() { return VcsConfigManager.getInstance().isUseAutoSave() && !VcsHelper.getInstance().isLegacyMode(); } + + /** + * 获取文件路径 + * + * @param entity + * @return + */ + public String getFilePath(VcsEntity entity) { + return StableUtils.pathJoin(VCS_VERSIONS, entity.getFilename() + VERSION_MARK + entity.getVersion()); + } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java index ef84c059e..98e7bae07 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/RecyclePane.java @@ -10,6 +10,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.vcs.VcsOperatorWorker; import com.fr.design.mainframe.vcs.TableEntity; import com.fr.design.mainframe.vcs.TableValueOperator; +import com.fr.design.mainframe.vcs.VcsProcessFailedWrapper; import com.fr.design.mainframe.vcs.VcsTableEntity; import com.fr.design.mainframe.vcs.VcsTableOperatorListener; import com.fr.report.entity.VcsEntity; @@ -165,7 +166,12 @@ public class RecyclePane extends AbstractSupportSelectTablePane fireListener(new VcsResponseListener() { @Override public void doAfterChooseYes(List selectList) { - VcsOperatorWorker.createDeleteWorker().batchDelete(selectList, isNeedDeleteAllVersion()); + VcsOperatorWorker.createDeleteWorker(). batchDelete(selectList, isNeedDeleteAllVersion(), new VcsTableOperatorListener() { + @Override + public void updateUI(VcsProcessFailedWrapper wrapper) { + updateVcsUI(wrapper); + } + }); } }, true); } @@ -182,7 +188,12 @@ public class RecyclePane extends AbstractSupportSelectTablePane fireListener(new VcsResponseListener() { @Override public void doAfterChooseYes(List selectList) { - VcsOperatorWorker.createRestoreWorker().batchRestore(selectList); + VcsOperatorWorker.createRestoreWorker().batchRestore(selectList, new VcsTableOperatorListener() { + @Override + public void updateUI(VcsProcessFailedWrapper wrapper) { + updateVcsUI(wrapper); + } + }); } }, false); } @@ -215,15 +226,17 @@ public class RecyclePane extends AbstractSupportSelectTablePane JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (selVal == JOptionPane.YES_OPTION) { - tableEntities = model.getList().stream().filter(tableEntity -> !tableEntity.isSelect()).collect(Collectors.toList()); - model.setList(new ArrayList<>(tableEntities)); - model.fireTableDataChanged(); listener.doAfterChooseYes(selectList); - fireVcsListener(model.getList()); } } } + private void updateVcsUI(VcsProcessFailedWrapper wrapper) { + tableEntities = model.getList().stream().filter(tableEntity -> !tableEntity.isSelect() || wrapper.getFailedNameList().contains(tableEntity.getFilename())).collect(Collectors.toList()); + model.setList(new ArrayList<>(tableEntities)); + model.fireTableDataChanged(); + fireVcsListener(model.getList()); + } /** * 显示弹窗 diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java index 354e02bd5..9efb268a0 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java @@ -10,6 +10,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.vcs.VcsOperatorWorker; import com.fr.design.mainframe.vcs.VcsTableEntity; +import com.fr.design.mainframe.vcs.VcsTableOperatorListener; import com.fr.design.mainframe.vcs.common.VcsCloseTemplateHelper; import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; @@ -117,11 +118,15 @@ public class VcsCenterPane extends VcsNewPane { JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (selVal == JOptionPane.YES_OPTION) { - VcsOperatorWorker.createDeleteWorker().doDelete(entity); - removeTarget((VcsTableEntity) o); - model.fireTableRowsDeleted(row, row); - model.removeRow(row); - model.fireTableDataChanged(); + VcsOperatorWorker.createDeleteWorker().doDelete(entity, new VcsTableOperatorListener() { + @Override + public void updateUI() { + removeTarget((VcsTableEntity) o); + model.fireTableRowsDeleted(row, row); + model.removeRow(row); + model.fireTableDataChanged(); + } + }); } } } @@ -164,10 +169,13 @@ public class VcsCenterPane extends VcsNewPane { return entity.getFilename()+Toolkit.i18nText("Fine-Design_Vcs_Version_Tips"); } }; - pane.addVcsListener(entities -> { - if (entities.size() == 0) { - model.getList().remove(o); - model.fireTableDataChanged(); + pane.addVcsListener(new VcsTableOperatorListener() { + @Override + public void doOperator(List entityList) { + if (entities.size() == 0) { + model.getList().remove(o); + model.fireTableDataChanged(); + } } }); VcsCloseTemplateHelper.checkTemplateSavedAndShowVcsNewPane(path, VcsCloseTemplateHelper.isCurrentEditing(path), getDialog(), pane); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java index 638bc3a59..b924228fd 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java @@ -11,15 +11,18 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.vcs.TableValueOperator; import com.fr.design.mainframe.vcs.VcsOperatorWorker; import com.fr.design.mainframe.vcs.VcsTableEntity; +import com.fr.design.mainframe.vcs.VcsTableOperatorListener; import com.fr.design.mainframe.vcs.common.VcsCacheFileNodeFile; import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; +import com.fr.io.utils.ResourceIOUtils; import com.fr.report.entity.VcsEntity; import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.server.vcs.VcsFileUtils; import com.fr.workspace.server.vcs.VcsOperator; +import com.fr.workspace.server.vcs.v2.VcsTaskResult; import javax.swing.Icon; import javax.swing.JComponent; @@ -30,6 +33,7 @@ import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; @@ -51,6 +55,7 @@ public class VcsNewPane extends RecyclePane { protected static int EDIT_COL = 4; + private static final String PATH = "path"; private static final int DOUBLE_CLICK_COUNT = 2; protected VcsOperatorPane operatorPane; @@ -170,28 +175,42 @@ public class VcsNewPane extends RecyclePane { private void restoreEntity(VcsEntity entity) { - new SwingWorker() { + new SwingWorker() { @Override - protected Void doInBackground() throws Exception { + protected VcsTaskResult doInBackground() throws Exception { + String path = VcsHelper.getInstance().getFilePath(entity); + if (!ResourceIOUtils.exist(path)) { + return new VcsTaskResult(false, new FileNotFoundException()); + } //step1.设置还原的用户名 entity.setUsername(VcsHelper.getInstance().getCurrentUsername()); //step2.rollback到指定版本 WorkContext.getCurrent().get(VcsOperator.class).rollbackTo(entity); - return null; + //最里面的文件系统的write会吞异常,这边就一直默认成功吧,日志里会体现失败的情况 + return new VcsTaskResult(true); } @Override protected void done() { - //step3.如果原来原模板已经打开则关闭原模板,打开rollback后的新模板 - List> templateList = HistoryTemplateListCache.getInstance().getHistoryList(); - for (JTemplate template : templateList) { - if (StringUtils.equals(filePath, template.getPath())) { - MultiTemplateTabPane.getInstance().setIsCloseCurrent(HistoryTemplateListCache.getInstance().isCurrentEditingFile(filePath)); - MultiTemplateTabPane.getInstance().closeFormat(template); - MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(template); - break; + try { + VcsTaskResult result = get(); + if (result.isSuccess()) { + //step3.如果原来原模板已经打开则关闭原模板,打开rollback后的新模板 + List> templateList = HistoryTemplateListCache.getInstance().getHistoryList(); + for (JTemplate template : templateList) { + if (StringUtils.equals(filePath, template.getPath())) { + MultiTemplateTabPane.getInstance().setIsCloseCurrent(HistoryTemplateListCache.getInstance().isCurrentEditingFile(filePath)); + MultiTemplateTabPane.getInstance().closeFormat(template); + MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(template); + break; + } + } + DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(filePath, false))); + } else { + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Warning_Template_Do_Not_Exsit")); } + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); } - DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(filePath, false))); } }.execute(); } @@ -213,10 +232,14 @@ public class VcsNewPane extends RecyclePane { JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (selVal == JOptionPane.YES_OPTION) { - model.fireTableRowsDeleted(row, row); - model.removeRow(row); - model.fireTableDataChanged(); - VcsOperatorWorker.createDeleteWorker().deleteTargetVersion(entity); + VcsOperatorWorker.createDeleteWorker().deleteTargetVersion(entity, new VcsTableOperatorListener() { + @Override + public void updateUI() { + model.fireTableRowsDeleted(row, row); + model.removeRow(row); + model.fireTableDataChanged(); + } + }); fireVcsListener(model.getList()); } } @@ -337,9 +360,13 @@ public class VcsNewPane extends RecyclePane { @Override public void doOK() { entity.setCommitMsg(getMsgTestArea().getText()); - VcsOperatorWorker.createUpdateWorker().updateEntityAnnotation(entity); - setVisible(false); - model.fireTableDataChanged(); + VcsOperatorWorker.createUpdateWorker().updateEntityAnnotation(entity, new VcsTableOperatorListener() { + @Override + public void updateUI() { + setVisible(false); + model.fireTableDataChanged(); + } + }); } }; dialog.setVisible(true); From 323171db3251a9eccf84d57daca7ac44c1df670c Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 31 Jul 2023 17:04:10 +0800 Subject: [PATCH 10/20] =?UTF-8?q?REPORT-87551=20=E5=AF=B9=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E8=BF=9B=E8=A1=8C=E9=87=8D=E5=91=BD=E5=90=8D=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E7=89=88=E6=9C=AC=E7=AE=A1=E7=90=86=E4=BB=8D=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=EF=BC=8C=E4=BD=86=E6=98=AF=E6=AF=8F=E4=B8=AA=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=86=85=E5=AE=B9=E9=83=BD=E6=98=AF=E4=B8=80=E6=A0=B7?= =?UTF-8?q?=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/vcs/common/VcsHelper.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java index 07007604d..15787348f 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsHelper.java @@ -255,13 +255,17 @@ public class VcsHelper implements JTemplateActionListener { VcsOperator operator = WorkContext.getCurrent().get(VcsOperator.class); String oldPath = oldName.replaceFirst(VCS_FILE_SLASH, StringUtils.EMPTY); List oldVcsEntities = operator.getVersions(oldPath); - + String replaceName = newName.replaceFirst(VCS_FILE_SLASH, StringUtils.EMPTY); for (VcsEntity oldVcsEntity : oldVcsEntities) { - operator.saveVersion(oldVcsEntity.getUsername(), newName.replaceFirst(VCS_FILE_SLASH, StringUtils.EMPTY), oldVcsEntity.getCommitMsg(), oldVcsEntity.getVersion()); - operator.deleteVersion(oldPath, oldVcsEntity.getVersion()); + if (!VcsHelper.getInstance().isLegacyMode()) { + operator.renameVersion(oldVcsEntity, replaceName); + } else { + operator.saveVersion(oldVcsEntity.getUsername(), replaceName, oldVcsEntity.getCommitMsg(), oldVcsEntity.getVersion()); + operator.deleteVersion(oldPath, oldVcsEntity.getVersion()); + } } - FineLoggerFactory.getLogger().debug("moveVcs success. from {} to {}", oldName, newName); - if (GcConfig.getInstance().isGcEnable()) { + FineLoggerFactory.getLogger().debug("moveVcs success. from {} to {}", oldName, replaceName); + if (GcConfig.getInstance().isGcEnable() && VcsHelper.getInstance().isLegacyMode()) { operator.gc(); } } From f025058d0ea1444f2c59250d867a0f24a3b58dee Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 31 Jul 2023 18:11:07 +0800 Subject: [PATCH 11/20] =?UTF-8?q?REPORT-101740=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=B8=89=E6=9C=9F=E3=80=91=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=B8=AD=E5=BF=83=E6=89=93=E5=BC=80=E8=A2=AB=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/vcs/ui/VcsCenterPane.java | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java index 9efb268a0..20b31d9c2 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java @@ -6,6 +6,7 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; +import com.fr.design.lock.LockInfoUtils; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.vcs.VcsOperatorWorker; @@ -15,6 +16,7 @@ import com.fr.design.mainframe.vcs.common.VcsCloseTemplateHelper; import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; import com.fr.report.entity.VcsEntity; +import com.fr.report.lock.LockInfoOperator; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; @@ -25,10 +27,13 @@ import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.JTable; +import javax.swing.SwingWorker; +import javax.swing.UIManager; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutionException; /** @@ -148,12 +153,39 @@ public class VcsCenterPane extends VcsNewPane { if (o instanceof VcsTableEntity) { VcsEntity entity = ((VcsTableEntity) o).getEntity(); saveSettingAndCloseDialog(); - DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(getTemplateTruePath(entity.getFilename()), false))); + showTemplate(entity.getFilename(), new FileNode(getTemplateTruePath(entity.getFilename()), false)); } } }); } + private void showTemplate(String filename, FileNode node) { + new SwingWorker() { + @Override + protected Boolean doInBackground() throws Exception { + String selectedFilePath = getTemplateTruePath(filename); + String lock = node.getLock(); + return LockInfoUtils.isCompatibleOperator() + || LockInfoUtils.unableGetLockInfo() + || WorkContext.getCurrent().get(LockInfoOperator.class).isTplUnLocked(selectedFilePath) + ? (lock != null && !lock.equals(node.getUserID())) + : WorkContext.getCurrent().get(LockInfoOperator.class).isTplLocked(selectedFilePath); + } + @Override + protected void done() { + try { + if (!get()) { + DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(node)); + } else { + FineJOptionPane.showMessageDialog(VcsCenterPane.this, Toolkit.i18nText("Fine-Design_Vcs_Open_Lock_Tip"), UIManager.getString("OptionPane.messageDialogTitle"), JOptionPane.ERROR_MESSAGE); + } + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } + } + }.execute(); + } + private void initManagerListener() { manager.addMouseListener(new MouseAdapter() { @Override From 612c4a6fe0ef2ed604453ea32d18bd38dd43f23a Mon Sep 17 00:00:00 2001 From: Carlson Date: Tue, 1 Aug 2023 09:55:21 +0800 Subject: [PATCH 12/20] =?UTF-8?q?REPORT-79271=20feat:FVS=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E5=8D=95=E5=85=83=E6=A0=BC=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=9D=A5=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/chart/gui/data/NormalChartDataPane.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java index 86f7e4da8..c4b1e69b3 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java @@ -7,7 +7,6 @@ import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.gui.frpane.UIComboBoxPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.chart.gui.ChartDataPane; -import com.fr.design.mainframe.chart.mode.ChartEditContext; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.van.chart.designer.AbstractVanChartScrollPane; @@ -68,9 +67,7 @@ public class NormalChartDataPane extends DataContentsPane { label1.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH,ChartDataPane.LABEL_HEIGHT)); northPane.add(GUICoreUtils.createBorderLayoutPane(new Component[]{jcb, null, null, label1, null})); northPane.setBorder(BorderFactory.createEmptyBorder(0,5,0,8)); - if (ChartEditContext.normalMode()) { - this.add(northPane, BorderLayout.NORTH); - } + this.add(northPane, BorderLayout.NORTH); this.add(cardPane, BorderLayout.CENTER); } From b59f1ccce489e0d44aff1f72a6233bc7b6803e59 Mon Sep 17 00:00:00 2001 From: "Leo.Qin" Date: Tue, 1 Aug 2023 10:02:52 +0800 Subject: [PATCH 13/20] =?UTF-8?q?REPORT-101800=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=A0=BC=E5=86=85=E5=AE=B9=E7=9A=84=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E5=8D=95=E5=85=83=E6=A0=BC=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E4=BC=9A=E6=B8=85=E7=A9=BA=20=E3=80=90=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=8E=9F=E5=9B=A0=E3=80=91=E7=BC=96=E8=BE=91=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E5=8D=95=E5=85=83=E6=A0=BC=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E5=AF=B9=E5=8D=95=E5=85=83=E6=A0=BC=E5=B1=9E=E6=80=A7=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E4=BF=AE=E6=94=B9=EF=BC=8C=E4=B9=8B=E5=89=8D=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=20getCellElements=20=E6=8B=BF=E5=88=B0?= =?UTF-8?q?=E7=9A=84=E5=B9=B6=E4=B8=8D=E6=98=AF=E5=AE=9E=E9=99=85=E6=AD=A3?= =?UTF-8?q?=E5=9C=A8=E7=BC=96=E8=BE=91=E7=9A=84=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=EF=BC=8C=E6=8B=BF=E5=88=B0=E7=9A=84=E6=98=AF=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=89=8B=E5=8A=A8=E5=88=9B=E5=BB=BA=E7=9A=84=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?(=E5=8D=95=E5=85=83=E6=A0=BC=E5=86=85=E5=AE=B9=E4=B8=BAnull)?= =?UTF-8?q?=EF=BC=8C=E5=90=8E=E7=BB=AD=E5=AF=B9=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E6=9B=B4=E6=96=B0=E6=97=B6=EF=BC=8C=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=A0=BC=E7=9A=84=E5=86=85=E5=AE=B9=E8=A2=AB=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E6=9B=B4=E6=96=B0=E4=B8=BAnull=E3=80=82=20=E3=80=90?= =?UTF-8?q?=E6=94=B9=E5=8A=A8=E6=80=9D=E8=B7=AF=E3=80=91=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E7=BC=96=E8=BE=91=E7=9A=84=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=A0=BC=E5=9D=87=E4=BD=BF=E7=94=A8=20getAll?= =?UTF-8?q?CellElements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/grid/selection/CellSelection.java | 4 ---- .../src/main/java/com/fr/quickeditor/CellQuickEditor.java | 2 +- .../com/fr/quickeditor/cellquick/CellDSColumnEditor.java | 6 +++--- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java b/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java index b5419cf39..4d5fe8a62 100644 --- a/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java +++ b/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java @@ -815,10 +815,6 @@ public class CellSelection extends Selection { return cellElements; } - public Set getCellElements() { - return cellElements; - } - @Override public void populatePropertyPane(ElementCasePane ePane) { CellElementPropertyPane.getInstance().reInit(ePane); diff --git a/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java index 7c3c15876..4419392f9 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/CellQuickEditor.java @@ -442,7 +442,7 @@ public abstract class CellQuickEditor extends QuickEditor { CellSelection cs = (CellSelection) tc.getSelection(); TemplateElementCase editingElementCase = tc.getEditingElementCase(); - Set allCellElements = cs.getCellElements(); + Set allCellElements = cs.getAllCellElements(editingElementCase); Style oldStyle = cellElement == null ? Style.DEFAULT_STYLE : cellElement.getStyle(); Style style = formatPane.update(oldStyle); for (TemplateCellElement cellElement : allCellElements) { diff --git a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java index e9917d2c2..f93cbfc3d 100644 --- a/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java +++ b/designer-realize/src/main/java/com/fr/quickeditor/cellquick/CellDSColumnEditor.java @@ -241,7 +241,7 @@ public class CellDSColumnEditor extends CellQuickEditor { dataPane.update(cellElement); CellSelection selection = (CellSelection) tc.getSelection(); - Set allCellElements = selection.getCellElements(); + Set allCellElements = selection.getAllCellElements(tc.getEditingElementCase()); groupPane.update(allCellElements); } @@ -319,7 +319,7 @@ public class CellDSColumnEditor extends CellQuickEditor { @Override public void itemStateChanged(ItemEvent e) { CellSelection selection = (CellSelection) tc.getSelection(); - Set allCellElements = selection.getCellElements(); + Set allCellElements = selection.getAllCellElements(tc.getEditingElementCase()); if (e == null || e.getStateChange() == ItemEvent.DESELECTED) { //分组-高级-自定义点确定的时候传进来null的e,但是这时候应该触发保存 groupPane.update(allCellElements); @@ -351,7 +351,7 @@ public class CellDSColumnEditor extends CellQuickEditor { if (!selectedOneCell) { // 只有在批量操作的时候才需要判断是否隐藏条件面板 CellSelection selection = (CellSelection) tc.getSelection(); - boolean sameDSName = checkSameDSName(selection.getCellElements()); + boolean sameDSName = checkSameDSName(selection.getAllCellElements(tc.getEditingElementCase())); conditionPane.setVisible(sameDSName); } else { conditionPane.setVisible(true); From 9ef4cb3b40ec2de48905b1280d41f1ec52a29ec8 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 1 Aug 2023 13:42:13 +0800 Subject: [PATCH 14/20] =?UTF-8?q?REPORT-101740=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=B8=89=E6=9C=9F=E3=80=91=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=B8=AD=E5=BF=83=E6=89=93=E5=BC=80=E8=A2=AB=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/file/TemplateTreePane.java | 17 ++++++++++++----- .../design/mainframe/vcs/ui/VcsCenterPane.java | 7 ++----- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index 58d9b0e88..8da6b7a3b 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -239,11 +239,7 @@ public class TemplateTreePane extends JPanel implements FileOperations { String reportPath = reportletsTree.getSelectedTemplatePath(); final String selectedFilePath = StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, reportPath); String lock = node.getLock(); - boolean showLockInfo = LockInfoUtils.isCompatibleOperator() - || LockInfoUtils.unableGetLockInfo() - || WorkContext.getCurrent().get(LockInfoOperator.class).isTplUnLocked(selectedFilePath) - ? (lock != null && !lock.equals(node.getUserID())) - : WorkContext.getCurrent().get(LockInfoOperator.class).isTplLocked(selectedFilePath); + boolean showLockInfo = needShowLockInfo(lock, selectedFilePath, node); if (showLockInfo) { UserInfo userInfo = WorkContext.getCurrent().get(LockInfoOperator.class).getUserInfo(selectedFilePath); node.setLock(UUID.randomUUID().toString()); @@ -257,6 +253,17 @@ public class TemplateTreePane extends JPanel implements FileOperations { DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(selectedFilePath, false))); } + /** + * 是否需要展示锁定信息 + */ + public static boolean needShowLockInfo(String lock, String selectedFilePath, FileNode node) { + return LockInfoUtils.isCompatibleOperator() + || LockInfoUtils.unableGetLockInfo() + || WorkContext.getCurrent().get(LockInfoOperator.class).isTplUnLocked(selectedFilePath) + ? (lock != null && !lock.equals(node.getUserID())) + : WorkContext.getCurrent().get(LockInfoOperator.class).isTplLocked(selectedFilePath); + } + private void checkDevelopForBiddenTemplate(String selectedFilePath) { JTemplate template = getOpenedTemplate(selectedFilePath); if (template != null && template.isForbidden()) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java index 20b31d9c2..080edb4a2 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java @@ -4,6 +4,7 @@ import com.fr.base.svg.IconUtils; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.file.TemplateTreePane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.lock.LockInfoUtils; @@ -165,11 +166,7 @@ public class VcsCenterPane extends VcsNewPane { protected Boolean doInBackground() throws Exception { String selectedFilePath = getTemplateTruePath(filename); String lock = node.getLock(); - return LockInfoUtils.isCompatibleOperator() - || LockInfoUtils.unableGetLockInfo() - || WorkContext.getCurrent().get(LockInfoOperator.class).isTplUnLocked(selectedFilePath) - ? (lock != null && !lock.equals(node.getUserID())) - : WorkContext.getCurrent().get(LockInfoOperator.class).isTplLocked(selectedFilePath); + return TemplateTreePane.needShowLockInfo(lock, selectedFilePath, node); } @Override protected void done() { From 22a75e42c8070238c48bdcf2283360ce8e0d7438 Mon Sep 17 00:00:00 2001 From: Carlson Date: Tue, 1 Aug 2023 15:52:09 +0800 Subject: [PATCH 15/20] =?UTF-8?q?REPORT-79271=20feat:=E8=80=83=E8=99=91?= =?UTF-8?q?=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/mode/ChartEditContext.java | 27 +++++++++++++++++++ .../chart/mode/ChartEditSupportDataType.java | 13 +++++++++ .../chart/gui/data/NormalChartDataPane.java | 5 +++- 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditSupportDataType.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditContext.java b/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditContext.java index 51fe2f816..2aa862292 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditContext.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditContext.java @@ -13,8 +13,28 @@ public class ChartEditContext { private static ChartEditMode current = ChartEditMode.NORMAL; + private static ChartEditSupportDataType supportDataType = ChartEditSupportDataType.BOTH; + + /** + * 切换图表编辑模式 + * @param mode 图表编辑模式 + */ public static void switchTo(ChartEditMode mode) { + if (mode == ChartEditMode.NORMAL) { + switchTo(mode, ChartEditSupportDataType.BOTH); + } else if (mode == ChartEditMode.DUCHAMP) { + switchTo(mode, ChartEditSupportDataType.TABLE_DATA); + } + } + + /** + * 切换图表编辑模式 + * @param mode 图表编辑模式 + * @param type 图表支持的数据来源 + */ + public static void switchTo(ChartEditMode mode, ChartEditSupportDataType type) { current = mode; + supportDataType = type; } public static boolean duchampMode() { @@ -33,4 +53,11 @@ public class ChartEditContext { public static boolean supportTheme() { return !DesignModeContext.isDuchampMode(); } + + /** + * 当前模式下是否支持单元格数据来源 + */ + public static boolean supportReportData() { + return supportDataType == ChartEditSupportDataType.REPORT || supportDataType == ChartEditSupportDataType.BOTH; + } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditSupportDataType.java b/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditSupportDataType.java new file mode 100644 index 000000000..5c8236133 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditSupportDataType.java @@ -0,0 +1,13 @@ +package com.fr.design.mainframe.chart.mode; + +/** + * @author Carlson + * @version 11.0 + * Created by Carlson on 2023/8/1 14:25 + * @description 图表数据来源,兼容用 + **/ +public enum ChartEditSupportDataType { + TABLE_DATA, // 数据集数据 + REPORT, // 单元格数据 + BOTH // 包含二者 +} diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java index c4b1e69b3..ba1701710 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java @@ -7,6 +7,7 @@ import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.gui.frpane.UIComboBoxPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.mainframe.chart.mode.ChartEditContext; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.van.chart.designer.AbstractVanChartScrollPane; @@ -67,7 +68,9 @@ public class NormalChartDataPane extends DataContentsPane { label1.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH,ChartDataPane.LABEL_HEIGHT)); northPane.add(GUICoreUtils.createBorderLayoutPane(new Component[]{jcb, null, null, label1, null})); northPane.setBorder(BorderFactory.createEmptyBorder(0,5,0,8)); - this.add(northPane, BorderLayout.NORTH); + if (ChartEditContext.supportReportData()) { + this.add(northPane, BorderLayout.NORTH); + } this.add(cardPane, BorderLayout.CENTER); } From 0c4d4294887ee33f577956ba647c58862b4ddd48 Mon Sep 17 00:00:00 2001 From: Carlson Date: Wed, 2 Aug 2023 10:29:30 +0800 Subject: [PATCH 16/20] =?UTF-8?q?REPORT-79271=20feat:=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E5=A4=84=E7=90=86=E8=B0=83=E6=95=B4=E4=B8=BA=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/mode/ChartEditContext.java | 45 ++++++++++++------- .../chart/mode/ChartEditSupportDataType.java | 13 ------ 2 files changed, 29 insertions(+), 29 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditSupportDataType.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditContext.java b/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditContext.java index 2aa862292..30ff6c891 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditContext.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditContext.java @@ -3,6 +3,9 @@ package com.fr.design.mainframe.chart.mode; import com.fr.common.annotations.Open; import com.fr.design.base.mode.DesignModeContext; +import java.util.HashSet; +import java.util.Set; + /** * @author shine * @version 10.0 @@ -13,28 +16,21 @@ public class ChartEditContext { private static ChartEditMode current = ChartEditMode.NORMAL; - private static ChartEditSupportDataType supportDataType = ChartEditSupportDataType.BOTH; + private static final Set features = new HashSet<>(); + + /** + * 功能点枚举 + */ + public enum DuchampFeature { + SUPPORT_REPORT_DATA + } /** * 切换图表编辑模式 * @param mode 图表编辑模式 */ public static void switchTo(ChartEditMode mode) { - if (mode == ChartEditMode.NORMAL) { - switchTo(mode, ChartEditSupportDataType.BOTH); - } else if (mode == ChartEditMode.DUCHAMP) { - switchTo(mode, ChartEditSupportDataType.TABLE_DATA); - } - } - - /** - * 切换图表编辑模式 - * @param mode 图表编辑模式 - * @param type 图表支持的数据来源 - */ - public static void switchTo(ChartEditMode mode, ChartEditSupportDataType type) { current = mode; - supportDataType = type; } public static boolean duchampMode() { @@ -54,10 +50,27 @@ public class ChartEditContext { return !DesignModeContext.isDuchampMode(); } + /** + * 注册功能点 + */ + public static void addDuchampFeature(DuchampFeature feature) { + features.add(feature); + } + + /** + * 移除功能点 + */ + public static void removeDuchampFeature(DuchampFeature feature) { + features.remove(feature); + } + /** * 当前模式下是否支持单元格数据来源 */ public static boolean supportReportData() { - return supportDataType == ChartEditSupportDataType.REPORT || supportDataType == ChartEditSupportDataType.BOTH; + if (normalMode()) { + return true; + } + return features.contains(DuchampFeature.SUPPORT_REPORT_DATA); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditSupportDataType.java b/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditSupportDataType.java deleted file mode 100644 index 5c8236133..000000000 --- a/designer-base/src/main/java/com/fr/design/mainframe/chart/mode/ChartEditSupportDataType.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fr.design.mainframe.chart.mode; - -/** - * @author Carlson - * @version 11.0 - * Created by Carlson on 2023/8/1 14:25 - * @description 图表数据来源,兼容用 - **/ -public enum ChartEditSupportDataType { - TABLE_DATA, // 数据集数据 - REPORT, // 单元格数据 - BOTH // 包含二者 -} From 9ad3ea3549e1d1160b46f3257516017bc2ed2ab5 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" <3166887LjL> Date: Wed, 2 Aug 2023 15:00:28 +0800 Subject: [PATCH 17/20] =?UTF-8?q?REPORT-101409=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=B8=89=E6=9C=9F=E3=80=91=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A0=E6=9D=83=E9=99=90=E7=9A=84=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=A4=B1=E8=B4=A5=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/vcs/ui/VcsCenterPane.java | 6 ---- .../design/mainframe/vcs/ui/VcsNewPane.java | 36 +++++++++++++++---- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java index 080edb4a2..4ca132ea5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsCenterPane.java @@ -241,12 +241,6 @@ public class VcsCenterPane extends VcsNewPane { return TITLE; } - - private String getTemplateTruePath(String filename) { - return StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, filename); - } - - @Override protected String getDeleteTip(int size) { return Toolkit.i18nText("Fine-Design_Vcs_Delete_Select_All_Version"); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java index b924228fd..0ffa32ef1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java @@ -4,6 +4,7 @@ import com.fr.base.svg.IconUtils; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.MultiTemplateTabPane; +import com.fr.design.file.TemplateTreePane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; @@ -16,19 +17,20 @@ import com.fr.design.mainframe.vcs.common.VcsCacheFileNodeFile; import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; +import com.fr.file.filetree.FileNodes; import com.fr.io.utils.ResourceIOUtils; +import com.fr.report.InconsistentLockException; import com.fr.report.entity.VcsEntity; +import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; +import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; +import com.fr.workspace.resource.WorkResource; import com.fr.workspace.server.vcs.VcsFileUtils; import com.fr.workspace.server.vcs.VcsOperator; import com.fr.workspace.server.vcs.v2.VcsTaskResult; -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JOptionPane; -import javax.swing.JTable; -import javax.swing.SwingWorker; +import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -179,9 +181,12 @@ public class VcsNewPane extends RecyclePane { @Override protected VcsTaskResult doInBackground() throws Exception { String path = VcsHelper.getInstance().getFilePath(entity); - if (!ResourceIOUtils.exist(path)) { + if (!WorkContext.getCurrent().get(WorkResource.class).exist(path)) { return new VcsTaskResult(false, new FileNotFoundException()); } + if (checkLock(entity.getFilename())) { + return new VcsTaskResult(false, new InconsistentLockException()); + } //step1.设置还原的用户名 entity.setUsername(VcsHelper.getInstance().getCurrentUsername()); //step2.rollback到指定版本 @@ -206,7 +211,11 @@ public class VcsNewPane extends RecyclePane { } DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(filePath, false))); } else { - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Warning_Template_Do_Not_Exsit")); + if (result.getException() instanceof FileNotFoundException) { + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Warning_Template_Do_Not_Exsit")); + } else { + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Vcs_Open_Lock_Tip"), UIManager.getString("OptionPane.messageDialogTitle"), JOptionPane.ERROR_MESSAGE); + } } } catch (InterruptedException | ExecutionException e) { throw new RuntimeException(e); @@ -215,6 +224,19 @@ public class VcsNewPane extends RecyclePane { }.execute(); } + private boolean checkLock(String filename) { + String selectedFilePath = getTemplateTruePath(filename); + FileNode node = new FileNode(getTemplateTruePath(filename), false); + String lock = node.getLock(); + return TemplateTreePane.needShowLockInfo(lock, selectedFilePath, node); + } + + /** + * 获取模板的路径 + */ + public String getTemplateTruePath(String filename) { + return StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, filename); + } private void initDeleteListener() { delete.addMouseListener(new MouseAdapter() { From 8c13453363af4835d211f855ff4a7e3899376bfe Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" <3166887LjL> Date: Wed, 2 Aug 2023 15:04:19 +0800 Subject: [PATCH 18/20] =?UTF-8?q?REPORT-101409=20=E3=80=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E4=B8=89=E6=9C=9F=E3=80=91=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A0=E6=9D=83=E9=99=90=E7=9A=84=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=A4=B1=E8=B4=A5=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java index 0ffa32ef1..8e5e22c47 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/VcsNewPane.java @@ -30,7 +30,12 @@ import com.fr.workspace.server.vcs.VcsFileUtils; import com.fr.workspace.server.vcs.VcsOperator; import com.fr.workspace.server.vcs.v2.VcsTaskResult; -import javax.swing.*; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.SwingWorker; +import javax.swing.UIManager; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; From 77632dba9fd91e42b0756b5b99b2b2015ca33c6c Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 3 Aug 2023 14:13:41 +0800 Subject: [PATCH 19/20] =?UTF-8?q?REPORT-102243=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E5=AF=8C=E6=96=87=E6=9C=AC=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=99=A8=E8=87=AA=E5=AE=9A=E4=B9=89=E6=A0=B7=E5=BC=8F=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/jxbrowser/MimeType.java | 11 +++++------ .../jxbrowser/NxInterceptRequestCallback.java | 14 ++++++++++---- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/MimeType.java b/designer-base/src/main/java/com/fr/design/jxbrowser/MimeType.java index c843dfebd..654de0d72 100644 --- a/designer-base/src/main/java/com/fr/design/jxbrowser/MimeType.java +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/MimeType.java @@ -83,21 +83,20 @@ public enum MimeType { * 如果没有,尝试使用 Files.probeContentType 检测 * 如果没有,默认返回 text/html * - * @param url url路径 + * @param resourcePath 资源路径 * @return MimeType */ - public static String parseMimeType(String url) { - if (StringUtils.isBlank(url)) { + public static String parseMimeType(String resourcePath) { + if (StringUtils.isBlank(resourcePath)) { return HTML.mimeType; } - String finalPath = url.split("\\?")[0]; Optional mimeType = Arrays.stream(values()) - .filter(type -> finalPath.endsWith(type.suffix)) + .filter(type -> resourcePath.endsWith(type.suffix)) .findFirst(); if (mimeType.isPresent()) { return mimeType.get().mimeType; } else { - return getFileMimeType(finalPath); + return getFileMimeType(resourcePath); } } diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java b/designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java index ada7b2fff..58d45a61f 100644 --- a/designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java @@ -20,6 +20,7 @@ import com.teamdev.jxbrowser.net.callback.InterceptUrlRequestCallback; import org.jetbrains.annotations.NotNull; import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.Map; @@ -80,8 +81,9 @@ public class NxInterceptRequestCallback implements InterceptUrlRequestCallback { protected Optional generateFileProtocolUrlRequestJob(Params params, String path) { try { - InputStream inputStream = getResourceStream(path); - String mimeType = MimeType.parseMimeType(path); + String resourcePath = getResourcePath(path); + InputStream inputStream = getResourceStream(resourcePath); + String mimeType = MimeType.parseMimeType(resourcePath); byte[] bytes; if (isHtml(mimeType)) { String text = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); @@ -104,7 +106,11 @@ public class NxInterceptRequestCallback implements InterceptUrlRequestCallback { * @return 输入流 * @throws Exception IO异常 */ - private InputStream getResourceStream(String path) throws Exception { + private InputStream getResourceStream(String path) { + return IOUtils.readResource(path); + } + + private static String getResourcePath(String path) throws UnsupportedEncodingException { int index = path.indexOf("="); if (index > 0) { path = path.substring(index + 1); @@ -115,7 +121,7 @@ public class NxInterceptRequestCallback implements InterceptUrlRequestCallback { // 通过自定义协议之后的url会自动encode一些中文字符,这里做一个decode,否则会导致路径访问失败 path = URLDecoder.decode(path, StandardCharsets.UTF_8.name()); } - return IOUtils.readResource(path); + return path; } private boolean isHtml(String mimeType) { From 3a7fce0b20dcd86a7679fe898ff03b368905fa67 Mon Sep 17 00:00:00 2001 From: vito Date: Thu, 3 Aug 2023 15:24:49 +0800 Subject: [PATCH 20/20] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/com/fr/design/jxbrowser/MimeTypeTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/designer-base/src/test/java/com/fr/design/jxbrowser/MimeTypeTest.java b/designer-base/src/test/java/com/fr/design/jxbrowser/MimeTypeTest.java index 6a5fcf7f4..abfdb6fcf 100644 --- a/designer-base/src/test/java/com/fr/design/jxbrowser/MimeTypeTest.java +++ b/designer-base/src/test/java/com/fr/design/jxbrowser/MimeTypeTest.java @@ -13,9 +13,10 @@ public class MimeTypeTest { @Test public void getMimeType() { Assert.assertEquals("text/html", MimeType.parseMimeType("http://a.html")); - Assert.assertEquals("text/html", MimeType.parseMimeType("http://a.html?a=ji")); - Assert.assertEquals("text/html", MimeType.parseMimeType("http://a.xml?a=ji")); - Assert.assertEquals("image/jpeg", MimeType.parseMimeType("http://a.jpg?a=ji")); - Assert.assertEquals("image/jpeg", MimeType.parseMimeType("http://a.jpeg?a=ji")); + Assert.assertEquals("truetype", + MimeType.parseMimeType("emb://com/fr/web/ui/resources?path=/com/fr/web/ui/font/iconfont.ttf")); + Assert.assertEquals("font/woff", + MimeType.parseMimeType("http://a.html?path=com/fr/ui/a.woff")); + // 对资源来说不存在http://a.jpg?a=ji这种情况,之前多虑了 } } \ No newline at end of file