diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java index 0a464aa6d..16c1a7e8a 100644 --- a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -413,7 +413,7 @@ public class EnvChangeEntrance { @Override public void doOk() { SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(true, SwingUtilities.getWindowAncestor(envListPane)); - if (!saveSomeTemplatePane.showSavePane()) { + if (!saveSomeTemplatePane.showSavePane(true)) { // 用户取消保存时,取消切换目录操作 return; } diff --git a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java index 9b4b57fc4..2bac8fcad 100644 --- a/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java @@ -212,6 +212,35 @@ public class MultiTemplateTabPane extends JComponent { }); } + + /** + * 模板可以关闭的条件 + */ + class CloseCondition { + private CloseOption closeOption; + + public CloseCondition(CloseOption closeOption) { + this.closeOption = closeOption; + } + + /** + * 判断模板是否可以关闭,两个条件:1、是否满足CloseOption里面的条件(在左侧、在右侧等)2、是否和当前正在编辑模板属于同一种模板tab操作类型 + * @param closeJTemplate + * @param tplIndex + * @param i + * @return + */ + public boolean shouldClose(JTemplate closeJTemplate, int tplIndex, int i) { + boolean matchOption = this.closeOption.shouldClose(tplIndex, i); + JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (!JTemplate.isValid(currentTemplate)) { + return matchOption; + } + return matchOption && ComparatorUtils.equals(closeJTemplate.getTemplateTabOperatorType(), + currentTemplate.getTemplateTabOperatorType()); + } + } + enum CloseOption { Left(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Left")) { @Override @@ -324,14 +353,15 @@ public class MultiTemplateTabPane extends JComponent { public void actionPerformed(ActionEvent e) { //只有关闭所有模板才需要判断当前模板,关闭左侧、右侧、其他都不需要 SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(option == CloseOption.All); - if (saveSomeTemplatePane.showSavePane(option, false)) { + CloseCondition closeCondition = new CloseCondition(option); + if (saveSomeTemplatePane.showSavePane(closeCondition, false)) { JTemplate[] templates = new JTemplate[openedTemplate.size()]; for (int i = 0; i < openedTemplate.size(); i++) { templates[i] = openedTemplate.get(i); } JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - closeTemplate(templates, currentTemplate); + closeTemplate(closeCondition, templates, currentTemplate); if (openedTemplate.size() == 0) { DesignerContext.getDesignerFrame().addAndActivateJTemplate(); @@ -346,10 +376,9 @@ public class MultiTemplateTabPane extends JComponent { } } - private void closeTemplate(JTemplate[] templates, JTemplate currentTemplate) { - String operator = currentTemplate.getTemplateTabOperatorType(); + private void closeTemplate(CloseCondition closeCondition, JTemplate[] templates, JTemplate currentTemplate) { for (int i = 0; i < templates.length; i++) { - if (option.shouldClose(tplIndex, i) && ComparatorUtils.equals(operator, templates[i].getTemplateTabOperatorType())) { + if (closeCondition.shouldClose(templates[i], tplIndex, i)) { JTemplate jTemplate = templates[i]; if (jTemplate == currentTemplate) { currentTemplate = option == CloseOption.All ? null : templates[tplIndex]; @@ -727,6 +756,58 @@ public class MultiTemplateTabPane extends JComponent { minPaintIndex = 0; maxPaintIndex = openedTemplate.size() - 1; } + //需要根据每个tab的宽度重新check下实际的maxPaintIndex和minPaintIndex + checkActualPaintIndex(); + } + + /** + * 先计算出需要补充的tab个数 + * @return + */ + private int calTabCountComplemented(){ + int a = 0; + for (int i = minPaintIndex; i <= maxPaintIndex; i++) { + JTemplate template = openedTemplate.get(i); + if (!showJTemplateTab(template)) { + a++; + } + } + return a; + } + + + /** + * 由于可能存在宽度为0的tab,所以这边需要重新check下,先往后补,再往前补 + */ + private void checkActualPaintIndex(){ + int tabCount = calTabCountComplemented(); + if (tabCount == 0){ + return; + } + if (maxPaintIndex < openedTemplate.size() - 1) { + for (int i = maxPaintIndex + 1; i < openedTemplate.size(); i++) { + JTemplate template = openedTemplate.get(i); + if (showJTemplateTab(template)) { + tabCount--; + } + maxPaintIndex++; + if (tabCount == 0){ + return; + } + } + } + if (minPaintIndex > 0){ + for (int i = minPaintIndex - 1; i >= 0; i--) { + JTemplate template = openedTemplate.get(i); + if (showJTemplateTab(template)) { + tabCount--; + } + minPaintIndex--; + if (tabCount == 0){ + return; + } + } + } } @@ -998,9 +1079,12 @@ public class MultiTemplateTabPane extends JComponent { // selectIndex 没有变化,但是对应的模板已经变成了前一张模板 if (closeIconIndex == selectedIndex || isCloseCurrent) { // 如果当前关闭的模板在最右侧,那么预览上一个,防止数组越界 + // 关闭的模板是当前选中的模板时,需要重新计算下一个待展示的模板的index if (selectedIndex >= maxPaintIndex) { // selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true selectedIndex = calNextShowJTemplateIndex(selectedIndex - 1); + } else { + selectedIndex = calNextShowJTemplateIndex(selectedIndex); } isCloseCurrent = false; } diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java index e371f6ce2..0bdd48b35 100644 --- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java @@ -124,8 +124,10 @@ public class SaveSomeTemplatePane extends BasicPane { if (index < 0) { return; } + boolean mustSaveBeforeSwitchEnv = judgeJTemplateMustSave + && unSavedTemplate.get(index).needSaveBeforeSwitchEnv(); UICheckBox checkBox = (UICheckBox) templatesList.getModel().getElementAt(index); - checkBox.setSelected(!checkBox.isSelected()); + checkBox.setSelected(mustSaveBeforeSwitchEnv ||!checkBox.isSelected()); //根据templateCheckBoxes中的选择情况来更新全选框的状态 int selectedCount = calculateSelectedNum(); @@ -180,7 +182,7 @@ public class SaveSomeTemplatePane extends BasicPane { * @param judgeJTemplateMustSave 模板是否必须保存 * @return */ - public boolean showSavePane(@Nullable MultiTemplateTabPane.CloseOption option, boolean judgeJTemplateMustSave) { + public boolean showSavePane(@Nullable MultiTemplateTabPane.CloseCondition option, boolean judgeJTemplateMustSave) { initAndPopulate(option, judgeJTemplateMustSave); //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目 if (!unSavedTemplate.isEmpty()) { @@ -195,13 +197,13 @@ public class SaveSomeTemplatePane extends BasicPane { return HistoryTemplateListPane.getInstance().getHistoryList(); } - private void initAndPopulate(@Nullable MultiTemplateTabPane.CloseOption option, boolean judgeJTemplateMustSave) { + private void initAndPopulate(@Nullable MultiTemplateTabPane.CloseCondition option, boolean judgeJTemplateMustSave) { java.util.List> opendedTemplate = getOpenedTemplatesToProcess(); JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); int currentIndex = opendedTemplate.indexOf(currentTemplate); for (int i = 0; i < opendedTemplate.size(); i++) { //满足关闭条件的才继续判断文件是否发生了改动 - boolean needClose = option == null || option.shouldClose(currentIndex, i); + boolean needClose = option == null || option.shouldClose(opendedTemplate.get(i), currentIndex, i); if (needClose && isneedToAdd(opendedTemplate.get(i), currentTemplate)) { unSavedTemplate.add(opendedTemplate.get(i)); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 0efb1de62..7977b8202 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -1380,7 +1380,8 @@ public abstract class JTemplate> * @return true:成功停用当前模板 */ public boolean deactivateTemplate(JTemplate jTemplate) { - return true; + //兼容调用老的接口 + return deactivateTemplate(); } /**