Browse Source

Merge remote-tracking branch 'origin/release/11.0' into release/11.0

release/11.0
obo 2 years ago
parent
commit
be3aee708a
  1. 8
      designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java
  2. 4
      designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java
  3. 2
      designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java
  4. 68
      designer-base/src/main/java/com/fr/design/file/CloseOption.java
  5. 41
      designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java
  6. 351
      designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java
  7. 576
      designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java
  8. 6
      designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java
  9. 6
      designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java
  10. 39
      designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java
  11. 291
      designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java
  12. 129
      designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java
  13. 364
      designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java
  14. 41
      designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java
  15. 124
      designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperate.java
  16. 4
      designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java
  17. 10
      designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java
  18. 24
      designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
  19. 4
      designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java
  20. 8
      designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java
  21. 8
      designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java
  22. 4
      designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java
  23. 8
      designer-base/src/main/java/com/fr/nx/app/designer/toolbar/TemplateTransformer.java
  24. 6
      designer-base/src/main/java/com/fr/start/BaseDesigner.java
  25. 4
      designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java
  26. 4
      designer-form/src/main/java/com/fr/design/fit/common/TemplateTool.java
  27. 5
      designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java
  28. 4
      designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java
  29. 4
      designer-realize/src/main/java/com/fr/start/MainDesigner.java

8
designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java

@ -3,7 +3,7 @@ package com.fr.design.actions.file;
import com.fr.design.actions.UpdateAction; import com.fr.design.actions.UpdateAction;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplate;
import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.KeySetUtils;
@ -28,9 +28,9 @@ public class CloseCurrentTemplateAction extends UpdateAction {
* @param e 事件 * @param e 事件
*/ */
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
TemplateTabManager.getInstance().setCloseCurrent(true); MultiTemplateTabPane.getInstance().setIsCloseCurrent(true);
TemplateTabManager.getInstance().closeFormat(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); MultiTemplateTabPane.getInstance().closeFormat(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate());
TemplateTabManager.getInstance().closeSpecifiedTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate());
} }
@Override @Override

4
designer-base/src/main/java/com/fr/design/actions/file/RenameAction.java

@ -7,7 +7,7 @@ import com.fr.design.actions.UpdateAction;
import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.file.FileOperations; import com.fr.design.file.FileOperations;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.itextfield.UITextField;
@ -88,7 +88,7 @@ public class RenameAction extends UpdateAction {
} }
new FileRenameDialog(node); new FileRenameDialog(node);
TemplateTabManager.getInstance().refresh(); MultiTemplateTabPane.getInstance().repaint();
DesignerFrameFileDealerPane.getInstance().stateChange(); DesignerFrameFileDealerPane.getInstance().stateChange();
} }

2
designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java

@ -68,7 +68,7 @@ public class SwitchExistEnv extends MenuDef {
EnvChangeEntrance.getInstance().chooseEnv(envName); EnvChangeEntrance.getInstance().chooseEnv(envName);
} else { } else {
SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(true); SaveSomeTemplatePane saveSomeTemplatePane = new SaveSomeTemplatePane(true);
if (saveSomeTemplatePane.showSavePane(true)) { if (saveSomeTemplatePane.showSavePane()) {
// 用户模板保存后,才进行切换目录操作 // 用户模板保存后,才进行切换目录操作
EnvChangeEntrance.getInstance().switch2Env(envName); EnvChangeEntrance.getInstance().switch2Env(envName);
} }

68
designer-base/src/main/java/com/fr/design/file/CloseOption.java

@ -1,68 +0,0 @@
package com.fr.design.file;
import com.fr.design.i18n.Toolkit;
/**
* @author kerry
* @since 11.0
* created on 2023-04-14
**/
public enum CloseOption {
/**
* 关闭左侧所有模板
*/
Left(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Left")) {
@Override
public boolean shouldClose(int tplIndex, int i) {
return i < tplIndex;
}
},
/**
* 关闭右侧所有模板
*/
Right(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Right")) {
@Override
public boolean shouldClose(int tplIndex, int i) {
return i > tplIndex;
}
},
/**
* 关闭所有模板
*/
All(Toolkit.i18nText("Fine-Design_Close_All_templates")),
/**
* 关闭其他模板
*/
Others(Toolkit.i18nText("Fine-Design_Close_Other_templates")) {
@Override
public boolean shouldClose(int tplIndex, int i) {
return i != tplIndex;
}
};
private String optionName;
public String getOptionName() {
return this.optionName;
}
CloseOption(String optionName) {
this.optionName = optionName;
}
/**
* 判断指定索引模板是否应该被关闭
* @param tplIndex
* @param i
* @return
*/
public boolean shouldClose(int tplIndex, int i) {
return true;
}
}

41
designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java

@ -75,7 +75,7 @@ public class HistoryTemplateListCache implements CallbackEvent {
historyList.remove(contains(selected)); historyList.remove(contains(selected));
selected.getEditingFILE().closeTemplate(); selected.getEditingFILE().closeTemplate();
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Closed_Warn_Text", selected.getEditingFILE().getName())); FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Closed_Warn_Text", selected.getEditingFILE().getName()));
TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList);
} catch (Exception e) { } catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e); FineLoggerFactory.getLogger().error(e.getMessage(), e);
} }
@ -134,10 +134,10 @@ public class HistoryTemplateListCache implements CallbackEvent {
if (contains(jt) == -1) { if (contains(jt) == -1) {
addHistory(); addHistory();
} }
TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList);
//设置tab栏为当前选中的那一栏 //设置tab栏为当前选中的那一栏
if (editingTemplate != null) { if (editingTemplate != null) {
TemplateTabManager.getInstance().resetSelectIndex(jt); MultiTemplateTabPane.getInstance().setSelectedIndex(contains(jt));
} }
} }
@ -268,14 +268,13 @@ public class HistoryTemplateListCache implements CallbackEvent {
boolean replaceWithJVirtualTemplate = overTemplate.getEditingFILE().exists() boolean replaceWithJVirtualTemplate = overTemplate.getEditingFILE().exists()
&& overTemplate.isALLSaved() && overTemplate.isALLSaved()
&& overTemplate != editingTemplate && overTemplate != editingTemplate
&& overTemplate.checkEnable() && overTemplate.checkEnable();
&& overTemplate.supportCache();
if (replaceWithJVirtualTemplate) { if (replaceWithJVirtualTemplate) {
closeVirtualSelectedReport(overTemplate); closeVirtualSelectedReport(overTemplate);
historyList.set(i, new JVirtualTemplate(overTemplate.getEditingFILE())); historyList.set(i, new JVirtualTemplate(overTemplate.getEditingFILE()));
} }
} }
TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList);
} }
@ -286,27 +285,35 @@ public class HistoryTemplateListCache implements CallbackEvent {
// path like reportlets/xx/xxx/xxx // path like reportlets/xx/xxx/xxx
String path = file.getPath() + suffix; String path = file.getPath() + suffix;
List list = new ArrayList();
for(JTemplate jTemplate : historyList){ ListIterator<JTemplate<?, ?>> iterator = historyList.listIterator();
list.add(jTemplate);
}
ListIterator<JTemplate<?, ?>> iterator = list.listIterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
JTemplate<?, ?> template = iterator.next(); JTemplate<?, ?> template = iterator.next();
String tPath = template.getPath(); String tPath = template.getPath();
if (isDir ? tPath.startsWith(path) : tPath.equals(path)) { if (isDir ? tPath.startsWith(path) : tPath.equals(path)) {
historyList.remove(template); int size = getHistoryCount();
TemplateTabManager.getInstance().deleteOpenedTemplate(template); iterator.remove();
int index = iterator.nextIndex();
if (size == index + 1 && index > 0) {
//如果删除的是后一个Tab,则定位到前一个
MultiTemplateTabPane.getInstance().setSelectedIndex(index - 1);
}
} }
} }
//如果打开过,则删除,实时刷新多tab面板
int openFileCount = getHistoryCount();
if (openFileCount == 0) {
DesignerContext.getDesignerFrame().addAndActivateJTemplate();
}
JTemplate selectedFile = TemplateTabManager.getInstance().getSelectedFile(); JTemplate selectedFile = MultiTemplateTabPane.getInstance().getSelectedFile();
if (!isCurrentEditingFile(selectedFile.getPath())) { if (!isCurrentEditingFile(selectedFile.getPath())) {
//如果此时面板上的实时刷新的selectedIndex得到的和历史的不一样 //如果此时面板上的实时刷新的selectedIndex得到的和历史的不一样
DesignerContext.getDesignerFrame().activateJTemplate(selectedFile); DesignerContext.getDesignerFrame().activateJTemplate(selectedFile);
} }
TemplateTabManager.getInstance().refresh(); MultiTemplateTabPane.getInstance().repaint();
} }
@ -467,7 +474,7 @@ public class HistoryTemplateListCache implements CallbackEvent {
int index = contains(this.editingTemplate); int index = contains(this.editingTemplate);
this.editingTemplate = jt; this.editingTemplate = jt;
historyList.set(index, jt); historyList.set(index, jt);
TemplateTabManager.getInstance().refreshOpenedTemplate(historyList); MultiTemplateTabPane.getInstance().refreshOpenedTemplate(historyList);
TemplateTabManager.getInstance().resetSelectIndex(jt); MultiTemplateTabPane.getInstance().setSelectedIndex(contains(jt));
} }
} }

351
designer-base/src/main/java/com/fr/design/file/MultiTemplateTabMenuFactory.java

@ -1,351 +0,0 @@
package com.fr.design.file;
import com.fr.design.constants.UIConstants;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.imenu.UIMenuItem;
import com.fr.design.gui.imenu.UIScrollPopUpMenu;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.utils.TemplateUtils;
import com.fr.file.FILE;
import com.fr.general.IOUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.collections.CollectionUtils;
import com.fr.third.javax.annotation.Nonnull;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 右侧下拉菜单的工厂类
* @author Carlson
* @since 11.0
* created on 2023-04-14
**/
public class MultiTemplateTabMenuFactory {
private static final Icon CLOSE = IOUtils.readIcon("/com/fr/design/images/buttonicon/close_icon.png");
private static final Icon MOUSE_OVER_CLOSE = IOUtils.readIcon("/com/fr/design/images/buttonicon/mouseoverclose icon.png");
private static final Icon MOUSE_PRESS_CLOSE = IOUtils.readIcon("/com/fr/design/images/buttonicon/pressclose icon.png");
private static final int ITEM_SIZE = 25;
private UIScrollPopUpMenu menu = null;
private static MultiTemplateTabMenuFactory INSTANCE = new MultiTemplateTabMenuFactory();
private MultiTemplateTabMenuFactory() {
}
/**
* 返回右侧下拉菜单的工厂类
* @return
*/
public static MultiTemplateTabMenuFactory getInstance() {
return INSTANCE;
}
/**
* tab上的下拉菜单
*/
public UIScrollPopUpMenu createMenu() {
menu = new UIScrollPopUpMenu();
menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0));
menu.add(initCloseOther());
menu.add(createEmptyRow());
menu.addSeparator();
menu.add(createEmptyRow());
menu.add(createCategory(Toolkit.i18nText("Fine-Design_Basic_Tab_Current_Category_Templates")));
Component[] items = createCurrentCategory();
for (Component item : items) {
menu.add(item);
}
items = createOtherCategory();
if (items.length > 0) {
menu.addSeparator();
menu.add(createEmptyRow());
menu.add(createCategory(Toolkit.i18nText("Fine-Design_Basic_Tab_Other_Category_Templates")));
for (Component item : items) {
menu.add(item);
}
}
Dimension dimension = menu.getPreferredSize();
dimension.width += ITEM_SIZE;
menu.setPreferredSize(dimension);
return menu;
}
/**
* 关闭其它按钮
*/
private UIMenuItem initCloseOther() {
UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_Tab_Close_Other_Templates_Of_Current_Category"));
closeOther.setHorizontalAlignment(SwingConstants.CENTER);
Dimension dimension = closeOther.getPreferredSize();
dimension.height = ITEM_SIZE;
closeOther.setPreferredSize(dimension);
closeOther.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TemplateTabManager.getInstance().closeOthers();
}
});
if (TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size() <= 1) {
closeOther.setEnabled(false);
}
return closeOther;
}
private void closeAndFreeLock(@Nonnull JTemplate<?, ?> template) {
FILE file = template.getEditingFILE();
// 只有是环境内的文件,才执行释放锁
if (file != null && file.isEnvFile()) {
// release lock
TemplateResourceManager.getResource().closeTemplate(file.getPath());
}
}
/**
* 美观用
*/
private JPanel createEmptyRow() {
return new JPanel() {
@Override
public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.height = 1;
return d;
}
};
}
/**
* 模板分类item
*/
private UIButton createCategory(String categoryName) {
UIButton button = new UIButton(categoryName);
button.setBorderPainted(false);
button.setExtraPainted(false);
button.setPreferredSize(new Dimension(menu.getWidth(), ITEM_SIZE));
button.setOpaque(true);
button.setBackground(UIConstants.NORMAL_BACKGROUND);
button.setHorizontalAlignment(SwingConstants.LEFT);
button.setForeground(UIConstants.FLESH_BLUE);
return button;
}
/**
* 创建 当前分类模板 item数组
*/
private Component[] createCurrentCategory() {
return createListDownItem(TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates());
}
/**
* 创建 其它分类模板 item数组
*/
private Component[] createOtherCategory() {
List<JTemplate<?, ?>> openedTemplates = new ArrayList<>();
Map<String, List<JTemplate<?, ?>>> map = TemplateTabManager.getInstance().getAllOpenedTemplateMap();
for (Map.Entry<String, List<JTemplate<?, ?>>> entry : map.entrySet()) {
if (!StringUtils.equals(TemplateTabManager.getInstance().getCurrentOperator().getOperatorType(), entry.getKey())) {
openedTemplates.addAll(entry.getValue());
}
}
return createListDownItem(openedTemplates);
}
/**
* 根据template列表创建多个item
*/
private Component[] createListDownItem(List<JTemplate<?, ?>> openedTemplates) {
if (!CollectionUtils.isEmpty(openedTemplates)) {
Component[] templates = new Component[openedTemplates.size()];
for (int i = 0; i < openedTemplates.size(); i++) {
templates[i] = createListDownMenuItem(openedTemplates.get(i));
}
return templates;
}
return new Component[0];
}
/**
* 根据template对象创建item
*/
private Component createListDownMenuItem(JTemplate<?, ?> template) {
JPanel jPanel = new JPanel();
jPanel.setPreferredSize(new Dimension(menu.getWidth(), ITEM_SIZE));
jPanel.setLayout(new BorderLayout());
MenuItemButtonGroup menuItemButtonGroup = new MenuItemButtonGroup(template);
if (template == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) {
menuItemButtonGroup.templateButton.setForeground(UIConstants.FLESH_BLUE);
}
jPanel.add(menuItemButtonGroup.iconButton, BorderLayout.WEST);
jPanel.add(menuItemButtonGroup.templateButton, BorderLayout.CENTER);
jPanel.add(menuItemButtonGroup.closeButton, BorderLayout.EAST);
return jPanel;
}
/**
* menu的item由模板图标模板名模板关闭按钮组成
*/
private class MenuItemButtonGroup {
private final UIButton iconButton;
private final UIButton templateButton;
private final UIButton closeButton;
public MenuItemButtonGroup(JTemplate<?, ?> template) {
iconButton = createIconButton(template);
templateButton = createTemplateButton(template);
closeButton = createCloseButton();
initListener(template);
}
/**
* item[0] 模板图标按钮初始化
*/
private UIButton createIconButton(JTemplate<?, ?> template) {
UIButton button = new UIButton(template.getIcon(), template.getIcon(), template.getIcon());
button.setPreferredSize(new Dimension(ITEM_SIZE, ITEM_SIZE));
button.setOpaque(true);
button.setBackground(UIConstants.NORMAL_BACKGROUND);
return button;
}
/**
* item[1] 切换模板按钮初始化
*/
private UIButton createTemplateButton(JTemplate<?, ?> template) {
UIButton button = new UIButton(TemplateUtils.createLockeTemplatedName(template, template.getTemplateName()));
button.setBorderPainted(false);
button.setExtraPainted(false);
button.setPreferredSize(new Dimension(menu.getWidth() - ITEM_SIZE * 2, ITEM_SIZE));
button.setOpaque(true);
button.setBackground(UIConstants.NORMAL_BACKGROUND);
button.setHorizontalAlignment(SwingConstants.LEFT);
return button;
}
/**
* item[2] 关闭模板图标按钮初始化
*/
private UIButton createCloseButton() {
UIButton button = new UIButton(CLOSE, MOUSE_OVER_CLOSE, MOUSE_PRESS_CLOSE);
button.setPreferredSize(new Dimension(ITEM_SIZE, ITEM_SIZE));
button.setOpaque(true);
button.setBackground(UIConstants.NORMAL_BACKGROUND);
button.setVisible(false);
return button;
}
private void initListener(JTemplate<?, ?> template) {
initIconButtonListener();
initTemplateButtonListener(template);
initCloseButtonListener(template);
}
/**
* item[0] 模板图标按钮鼠标事件
*/
private void initIconButtonListener() {
iconButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
fireMouseEnteredEvent();
}
@Override
public void mouseExited(MouseEvent e) {
fireMouseExitedEvent();
}
});
}
/**
* item[1] 切换模板按钮鼠标事件
*/
private void initTemplateButtonListener(JTemplate<?, ?> template) {
templateButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
menu.setVisible(false);
TemplateTabManager.getInstance().switchByJTemplate(template);
}
@Override
public void mouseEntered(MouseEvent e) {
fireMouseEnteredEvent();
}
@Override
public void mouseExited(MouseEvent e) {
fireMouseExitedEvent();
}
});
}
/**
* item[2] 关闭模板按钮鼠标事件
*/
private void initCloseButtonListener(JTemplate<?, ?> template) {
closeButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
menu.setVisible(false);
TemplateTabManager.getInstance().closeByJTemplate(template);
}
@Override
public void mouseEntered(MouseEvent e) {
fireMouseEnteredEvent();
}
@Override
public void mouseExited(MouseEvent e) {
fireMouseExitedEvent();
}
});
}
/**
* mouse移入item范围
*/
private void fireMouseEnteredEvent() {
iconButton.setBackground(UIConstants.HOVER_BLUE);
templateButton.setBackground(UIConstants.HOVER_BLUE);
closeButton.setBackground(UIConstants.HOVER_BLUE);
closeButton.setVisible(true);
}
/**
* mouse移出item范围
*/
private void fireMouseExitedEvent() {
iconButton.setBackground(UIConstants.NORMAL_BACKGROUND);
templateButton.setBackground(UIConstants.NORMAL_BACKGROUND);
closeButton.setBackground(UIConstants.NORMAL_BACKGROUND);
closeButton.setVisible(false);
}
}
}

576
designer-base/src/main/java/com/fr/design/file/MultiTemplateTabPane.java

@ -1,25 +1,38 @@
package com.fr.design.file; package com.fr.design.file;
import com.fr.base.BaseUtils;
import com.fr.base.GraphHelper; import com.fr.base.GraphHelper;
import com.fr.base.svg.IconUtils; import com.fr.base.svg.IconUtils;
import com.fr.base.vcs.DesignerMode; import com.fr.base.vcs.DesignerMode;
import com.fr.design.actions.UpdateAction; import com.fr.design.actions.UpdateAction;
import com.fr.design.actions.file.LocateAction; import com.fr.design.actions.file.LocateAction;
import com.fr.design.constants.UIConstants; import com.fr.design.constants.UIConstants;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIMenuItem;
import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.imenu.UIPopupMenu;
import com.fr.design.gui.imenu.UIScrollPopUpMenu; import com.fr.design.gui.imenu.UIScrollPopUpMenu;
import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.DesignSizeI18nManager;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplate;
import com.fr.design.mainframe.TemplateSavingChecker;
import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager;
import com.fr.design.utils.DesignUtils; import com.fr.design.utils.DesignUtils;
import com.fr.design.utils.TemplateUtils;
import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.design.utils.gui.GUIPaintUtils;
import com.fr.design.worker.WorkerManager;
import com.fr.design.worker.save.CallbackSaveWorker;
import com.fr.file.FILE; import com.fr.file.FILE;
import com.fr.file.FileNodeFILE;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.Constants; import com.fr.stable.Constants;
import com.fr.third.javax.annotation.Nonnull;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.lock.TplOperator;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.ButtonModel; import javax.swing.ButtonModel;
@ -28,8 +41,11 @@ import javax.swing.ImageIcon;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JMenu; import javax.swing.JMenu;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator; import javax.swing.JSeparator;
import javax.swing.MenuElement; import javax.swing.MenuElement;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicMenuItemUI; import javax.swing.plaf.basic.BasicMenuItemUI;
import java.awt.AWTEvent; import java.awt.AWTEvent;
@ -43,6 +59,7 @@ import java.awt.Graphics2D;
import java.awt.RenderingHints; import java.awt.RenderingHints;
import java.awt.event.AWTEventListener; import java.awt.event.AWTEventListener;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; import java.awt.event.MouseListener;
@ -54,9 +71,14 @@ import java.awt.geom.Path2D;
import java.awt.geom.RoundRectangle2D; import java.awt.geom.RoundRectangle2D;
import java.util.List; import java.util.List;
import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog;
import static javax.swing.JOptionPane.OK_CANCEL_OPTION;
import static javax.swing.JOptionPane.OK_OPTION;
import static javax.swing.JOptionPane.WARNING_MESSAGE;
/** /**
* 改个名字一个拼写 n 个错误 * 改个名字一个拼写 n 个错误
* 模板tab的操作和ui已拆分后续需要添加模板tab的操作在 TemplateTabManager 中添加 *
* @author daisy * @author daisy
* @version 11.0 * @version 11.0
* <p> * <p>
@ -92,6 +114,10 @@ public class MultiTemplateTabPane extends JComponent {
private static MultiTemplateTabPane THIS; private static MultiTemplateTabPane THIS;
//用于存放工作簿
private java.util.List<JTemplate<?, ?>> openedTemplate;
//选中的Tab项
private int selectedIndex = 0;
// //
private int mouseOveredIndex = -1; private int mouseOveredIndex = -1;
@ -110,11 +136,16 @@ public class MultiTemplateTabPane extends JComponent {
//记录关闭按钮的状态 //记录关闭按钮的状态
private int closeIconIndex = -1; private int closeIconIndex = -1;
private boolean isCloseCurrent = false;
private Icon clodeMode = CLOSE; private Icon clodeMode = CLOSE;
private Icon listDownMode = LIST_DOWN; private Icon listDownMode = LIST_DOWN;
private boolean isShowList = false; private boolean isShowList = false;
//自动新建的模板B若没有进行任何编辑,切换到其他
//
// 模板时,模板B会自动关闭
private JTemplate<?, ?> temTemplate = null;
public static MultiTemplateTabPane getInstance() { public static MultiTemplateTabPane getInstance() {
if (THIS == null) { if (THIS == null) {
@ -134,6 +165,8 @@ public class MultiTemplateTabPane extends JComponent {
this.setBorder(null); this.setBorder(null);
this.setForeground(new Color(58, 56, 58)); this.setForeground(new Color(58, 56, 58));
this.setFont(DesignUtils.getDefaultGUIFont().applySize(12)); this.setFont(DesignUtils.getDefaultGUIFont().applySize(12));
openedTemplate = HistoryTemplateListCache.getInstance().getHistoryList();
selectedIndex = openedTemplate.size() - 1;
AWTEventListener awt = new AWTEventListener() { AWTEventListener awt = new AWTEventListener() {
@Override @Override
public void eventDispatched(AWTEvent event) { public void eventDispatched(AWTEvent event) {
@ -173,13 +206,45 @@ public class MultiTemplateTabPane extends JComponent {
//根据当前i18n语言环境,动态调整popupMenu的宽度 //根据当前i18n语言环境,动态调整popupMenu的宽度
menu.setPreferredSize(new Dimension((int) DesignSizeI18nManager.getInstance(). menu.setPreferredSize(new Dimension((int) DesignSizeI18nManager.getInstance().
i18nDimension("com.fr.design.file.MultiTemplateTabPane.popUpMenu").getWidth(), height)); i18nDimension("com.fr.design.file.MultiTemplateTabPane.popUpMenu").getWidth(), height));
GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.this, e.getX(), MultiTemplateTabPane.this.getY() - 1 + MultiTemplateTabPane.this.getHeight()); GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.getInstance(), e.getX(), MultiTemplateTabPane.getInstance().getY() - 1 + MultiTemplateTabPane.getInstance().getHeight());
} }
} }
} }
}); });
} }
enum CloseOption {
Left(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Left")) {
@Override
boolean shouldClose(int tplIndex, int i) {
return i < tplIndex;
}
},
Right(Toolkit.i18nText("Fine-Design_Close_templates_To_The_Right")) {
@Override
boolean shouldClose(int tplIndex, int i) {
return i > tplIndex;
}
},
All(Toolkit.i18nText("Fine-Design_Close_All_templates")),
Others(Toolkit.i18nText("Fine-Design_Close_Other_templates")) {
@Override
boolean shouldClose(int tplIndex, int i) {
return i != tplIndex;
}
};
String optionName;
CloseOption(String optionName) {
this.optionName = optionName;
}
boolean shouldClose(int tplIndex, int i) {
return true;
}
}
private static class CloseMenuItemJSeparator extends JSeparator { private static class CloseMenuItemJSeparator extends JSeparator {
@Override @Override
@ -207,10 +272,41 @@ public class MultiTemplateTabPane extends JComponent {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
//DefaultTemplateTabOperate.getInstance().locateTemplateInTree(this.tplIndex); //处于搜索模式时,先退出搜索模式,再定位
TemplateTabManager.getInstance().getCurrentOperator().locateTemplateInTree(this.tplIndex); if (TemplateTreeSearchManager.getInstance().isInSearchMode()) {
TemplateTreeSearchManager.getInstance().outOfSearchMode();
TemplateTreePane.getInstance().refreshDockingView();
}
JTemplate<?, ?> template = openedTemplate.get(this.tplIndex);
locateTemplate(template);
} }
private void locateTemplate(JTemplate<?, ?> template) {
FILE currentTemplate = template.getEditingFILE();
//模板不属于当前环境,跟预览一样先提示保存,再定位模板
//如果是拖拽进来的模板单单用exist不能判断,这边参考预览的判断逻辑(browserTemplate),补充一下
if (!currentTemplate.exists() || !(currentTemplate instanceof FileNodeFILE)) {
int selVal = showConfirmDialog(
DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Message"),
Toolkit.i18nText("Fine-Design_Basic_Preview_Tool_Tips"),
OK_CANCEL_OPTION,
WARNING_MESSAGE
);
if (OK_OPTION == selVal) {
CallbackSaveWorker worker = template.saveAs();
worker.start(template.getRuntimeId());
worker.addSuccessCallback(new Runnable() {
@Override
public void run() {
gotoEditingTemplateLeaf(template.getPath());
}
});
}
} else {
gotoEditingTemplateLeaf(template.getPath());
}
}
} }
private class RightMenuCloseAction extends UpdateAction { private class RightMenuCloseAction extends UpdateAction {
@ -220,82 +316,230 @@ public class MultiTemplateTabPane extends JComponent {
public RightMenuCloseAction(CloseOption option, int tplIndex) { public RightMenuCloseAction(CloseOption option, int tplIndex) {
this.option = option; this.option = option;
this.setName(option.getOptionName()); this.setName(option.optionName);
this.tplIndex = tplIndex; this.tplIndex = tplIndex;
} }
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
TemplateTabManager.getInstance().getCurrentOperator().closeAction(option, this.tplIndex); SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false);
MultiTemplateTabPane.this.repaint(); if (saveSomeTempaltePane.showSavePane()) {
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);
if (option == CloseOption.All) {
DesignerContext.getDesignerFrame().addAndActivateJTemplate();
} else {
DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate);
}
MultiTemplateTabPane.getInstance().repaint();
}
}
private void closeTemplate(JTemplate<?, ?>[] templates, JTemplate<?, ?> currentTemplate) {
for (int i = 0; i < templates.length; i++) {
if (option.shouldClose(tplIndex, i)) {
JTemplate<?, ?> jTemplate = templates[i];
if (jTemplate == currentTemplate) {
currentTemplate = option == CloseOption.All ? null : templates[tplIndex];
}
//判断关闭的模板是不是格式刷的被参照的模板
openedTemplate.remove(jTemplate);
if (jTemplate != currentTemplate) {
MultiTemplateTabPane.getInstance().closeFormat(jTemplate);
HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate);
closeAndFreeLock(jTemplate);
}
}
}
} }
private void closeAndFreeLock(@Nonnull JTemplate<?, ?> template) {
FILE file = template.getEditingFILE();
// 只有是环境内的文件,才执行释放锁
if (file != null && file.isEnvFile()) {
// release lock
WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath());
}
}
} }
/**
* 留作兼容
* @return
*/
@Deprecated
public JTemplate getSelectedFile() { public JTemplate getSelectedFile() {
return TemplateTabManager.getInstance().getSelectedFile(); if (openedTemplate.size() == selectedIndex) {
selectedIndex = Math.max(--selectedIndex, 0);
}
return openedTemplate.get(selectedIndex);
} }
/** /**
* 关闭掉当前已打开文件列表中指定的文件 * 关闭掉当前已打开文件列表中指定的文件
* *
* @param file 指定的文件 * @param file 指定的文件
*/ */
@Deprecated
public void closeFileTemplate(FILE file) { public void closeFileTemplate(FILE file) {
TemplateTabManager.getInstance().closeFileTemplate(file); for (JTemplate<?, ?> temp : openedTemplate) {
if (ComparatorUtils.equals(file, temp.getEditingFILE())) {
closeSpecifiedTemplate(temp);
break;
}
}
} }
@Override
public Dimension getPreferredSize() {
Dimension dimension = super.getPreferredSize();
dimension.height = HEIGHT;
return dimension;
}
private UIMenuItem initCloseOther() {
UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_FS_Close_Other_Templates"));
// Yvan: 英文下文本显示不全,后续发现如果将模板名设置的比较短,其它语言也会出现显示不全的问题,所以设置一下文本水平居中
closeOther.setHorizontalAlignment(SwingConstants.CENTER);
setListDownItemPreferredSize(closeOther);
closeOther.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (openedTemplate.size() == 1) {
return;
}
if (!TemplateSavingChecker.check()) {
return;
}
SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false);
//点击关闭其他模板,并且点击确定保存
if (saveSomeTempaltePane.showSavePane()) {
JTemplate<?, ?>[] panes = new JTemplate<?, ?>[openedTemplate.size()];
for (int i = 0; i < openedTemplate.size(); i++) {
panes[i] = openedTemplate.get(i);
}
for (int i = 0; i < panes.length; i++) {
if (i != selectedIndex) {
JTemplate<?, ?> jTemplate = panes[i];
//判断关闭的模板是不是格式刷的被参照的模板
openedTemplate.remove(jTemplate);
closeFormat(jTemplate);
HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate);
closeAndFreeLock(jTemplate);
}
}
JTemplate<?, ?> currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
HistoryTemplateListCache.getInstance().removeAllHistory();
DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate);
THIS.repaint();
}
//如果取消保存了,则不关闭其他模板
}
});
if (openedTemplate.size() == 1) {
closeOther.setEnabled(false);
}
return closeOther;
}
private UIMenuItem[] createListDownTemplate() {
UIMenuItem[] templates = new UIMenuItem[openedTemplate.size()];
for (int i = 0; i < openedTemplate.size(); i++) {
final int index = i;
final JTemplate tem = openedTemplate.get(i);
templates[i] = new UIMenuItem(tempalteShowName(tem), tem.getIcon());
templates[i].setUI(new UIListDownItemUI());
setListDownItemPreferredSize(templates[i]);
if (i == selectedIndex) {
//画选中的高亮
templates[i].setBackground(UIConstants.SHADOW_CENTER);
}
templates[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
selectedIndex = index;
tem.activeNewJTemplate();
}
});
}
return templates;
}
private void setListDownItemPreferredSize(UIMenuItem item) {
Dimension dimension = item.getPreferredSize();
dimension.height = LIST_DOWN_HEIGHT;
item.setPreferredSize(dimension);
}
private String tempalteShowName(JTemplate<?, ?> template) {
String name = TemplateUtils.createLockeTemplatedName(template, template.getTemplateName());
if (!template.isSaved() && !name.endsWith(" *")) {
name += " *";
}
return name;
}
/** /**
* 刷新打开模板 * 刷新打开模板
* *
* @param history 模板 * @param history 模板
*/ */
@Deprecated
public void refreshOpenedTemplate(List<JTemplate<?, ?>> history) { public void refreshOpenedTemplate(List<JTemplate<?, ?>> history) {
TemplateTabManager.getInstance().refreshOpenedTemplate(history); openedTemplate = history;
} }
/**
* 设置临时Template
* @param auotCreate
*/
@Deprecated
public void setTemTemplate(JTemplate<?, ?> auotCreate) { public void setTemTemplate(JTemplate<?, ?> auotCreate) {
TemplateTabManager.getInstance().setTemTemplate(auotCreate); temTemplate = auotCreate;
} }
/**
* 设置选中模板索引
* @param index
*/
@Deprecated
public void setSelectedIndex(int index) {
TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(index);
}
@Override private void showListDown() {
public Dimension getPreferredSize() {
Dimension dimension = super.getPreferredSize();
dimension.height = HEIGHT;
return dimension;
}
private String tempalteShowName(JTemplate<?, ?> template) { UIScrollPopUpMenu menu = new UIScrollPopUpMenu();
return TemplateTabManager.getInstance().getTemplateShowName(template); menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0));
menu.add(initCloseOther());
JSeparator separator = new JSeparator() {
@Override
public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.height = 1;
return d;
}
};
menu.add(new JPanel() {
@Override
public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.height = 1;
return d;
}
});
separator.setForeground(UIConstants.LINE_COLOR);
menu.add(separator);
menu.add(new JPanel() {
@Override
public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.height = 1;
return d;
}
});
UIMenuItem[] items = createListDownTemplate();
for (int i = 0; i < items.length; i++) {
menu.add(items[i]);
}
GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.getInstance(), MultiTemplateTabPane.getInstance().getWidth() - menu.getPreferredSize().width, getY() - 1 + getHeight());
} }
private void showListDown() { public void setSelectedIndex(int index) {
UIScrollPopUpMenu menu = MultiTemplateTabMenuFactory.getInstance().createMenu(); selectedIndex = index;
GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.this, MultiTemplateTabPane.this.getWidth() - menu.getPreferredSize().width, getY() - 1 + getHeight());
} }
@ -322,18 +566,15 @@ public class MultiTemplateTabPane extends JComponent {
paintDefaultBackground(g2d); paintDefaultBackground(g2d);
//最多能画的个数 //最多能画的个数
int maxTemplateNum = (int) (maxWidth) / MINWIDTH; int maxTemplateNum = (int) (maxWidth) / MINWIDTH;
int templateTabCount = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size();
int currentSelectedIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex();
//计算开始画的最小模板index和最大模板index //计算开始画的最小模板index和最大模板index
calMinAndMaxIndex(maxTemplateNum); calMinAndMaxIndex(maxTemplateNum);
calculateRealAverageWidth(maxWidth, maxTemplateNum); calculateRealAverageWidth(maxWidth, maxTemplateNum);
int maxStringlength = calculateStringMaxLength(); int maxStringlength = calculateStringMaxLength();
if ( currentSelectedIndex >= templateTabCount) { if (selectedIndex >= openedTemplate.size()) {
TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex( selectedIndex = openedTemplate.size() - 1;
templateTabCount - 1);
} }
if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() < 0) { if (selectedIndex < 0) {
TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(0); selectedIndex = 0;
} }
double templateStartX = 0; double templateStartX = 0;
startX = new int[maxPaintIndex - minPaintIndex + 1]; startX = new int[maxPaintIndex - minPaintIndex + 1];
@ -341,7 +582,7 @@ public class MultiTemplateTabPane extends JComponent {
//从可以开始展示在tab面板上的tab开始画 //从可以开始展示在tab面板上的tab开始画
for (int i = minPaintIndex; i <= maxPaintIndex; i++) { for (int i = minPaintIndex; i <= maxPaintIndex; i++) {
JTemplate template = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(i); JTemplate template = openedTemplate.get(i);
Icon icon = template.getIcon(); Icon icon = template.getIcon();
String name = tempalteShowName(template); String name = tempalteShowName(template);
//如果tab名字的长度大于最大能显示的英文字符长度,则进行省略号处理 //如果tab名字的长度大于最大能显示的英文字符长度,则进行省略号处理
@ -358,7 +599,7 @@ public class MultiTemplateTabPane extends JComponent {
} else { } else {
selectedIcon = CLOSE; selectedIcon = CLOSE;
} }
if (i == TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex()) { if (i == selectedIndex) {
if (template.isSaving()) { if (template.isSaving()) {
selectedIcon = WHITE_SAVING_CLOSE_ICON; selectedIcon = WHITE_SAVING_CLOSE_ICON;
} }
@ -367,8 +608,8 @@ public class MultiTemplateTabPane extends JComponent {
if (template.isSaving()) { if (template.isSaving()) {
selectedIcon = GREY_SAVING_CLOSE_ICON; selectedIcon = GREY_SAVING_CLOSE_ICON;
} }
boolean left = i < TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); boolean isLeft = i < selectedIndex;
startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, left, mouseOveredIndex, i); startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, isLeft, mouseOveredIndex, i);
} }
templateStartX += realWidth; templateStartX += realWidth;
} }
@ -443,39 +684,38 @@ public class MultiTemplateTabPane extends JComponent {
} }
private void calMinAndMaxIndex(int maxTemplateNum) { private void calMinAndMaxIndex(int maxTemplateNum) {
int templateTabCount = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size();
//如果个数大于最多能容纳的个数,则多余的进行处理 //如果个数大于最多能容纳的个数,则多余的进行处理
if (templateTabCount > maxTemplateNum) { if (openedTemplate.size() > maxTemplateNum) {
//所点击列表中的标签页处在标签页栏最后一个标签页之后,则标签页栏左移至所点击标签页出现 //所点击列表中的标签页处在标签页栏最后一个标签页之后,则标签页栏左移至所点击标签页出现
if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() >= maxPaintIndex) { if (selectedIndex >= maxPaintIndex) {
minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() - maxTemplateNum + 1; minPaintIndex = selectedIndex - maxTemplateNum + 1;
maxPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); maxPaintIndex = selectedIndex;
if (minPaintIndex <= 0) { if (minPaintIndex <= 0) {
minPaintIndex = 0; minPaintIndex = 0;
maxPaintIndex = maxTemplateNum - 1; maxPaintIndex = maxTemplateNum - 1;
} }
} else if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() <= minPaintIndex) { } else if (selectedIndex <= minPaintIndex) {
//所点击列表中的标签页处在标签页栏第一个标签页之前,则标签页栏右移至所点击标签页出现 //所点击列表中的标签页处在标签页栏第一个标签页之前,则标签页栏右移至所点击标签页出现
minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); minPaintIndex = selectedIndex;
maxPaintIndex = minPaintIndex + maxTemplateNum - 1; maxPaintIndex = minPaintIndex + maxTemplateNum - 1;
if (maxPaintIndex > templateTabCount- 1) { if (maxPaintIndex > openedTemplate.size() - 1) {
maxPaintIndex = templateTabCount - 1; maxPaintIndex = openedTemplate.size() - 1;
} }
} else { } else {
if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() >= templateTabCount - 1) { if (selectedIndex >= openedTemplate.size() - 1) {
TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(templateTabCount - 1); selectedIndex = openedTemplate.size() - 1;
maxPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); maxPaintIndex = selectedIndex;
minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() - maxTemplateNum + 1; minPaintIndex = selectedIndex - maxTemplateNum + 1;
} else { } else {
maxPaintIndex = minPaintIndex + maxTemplateNum - 1; maxPaintIndex = minPaintIndex + maxTemplateNum - 1;
if (maxPaintIndex > templateTabCount - 1) { if (maxPaintIndex > openedTemplate.size() - 1) {
maxPaintIndex = templateTabCount - 1; maxPaintIndex = openedTemplate.size() - 1;
} }
} }
} }
} else { } else {
minPaintIndex = 0; minPaintIndex = 0;
maxPaintIndex = templateTabCount - 1; maxPaintIndex = openedTemplate.size() - 1;
} }
} }
@ -483,7 +723,7 @@ public class MultiTemplateTabPane extends JComponent {
//个数小于最多能容纳的个数的情况下,看看宽度每个要画多少 //个数小于最多能容纳的个数的情况下,看看宽度每个要画多少
private void calculateRealAverageWidth(double maxwidth, int templateNum) { private void calculateRealAverageWidth(double maxwidth, int templateNum) {
int num = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size() > templateNum ? templateNum : TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); int num = openedTemplate.size() > templateNum ? templateNum : openedTemplate.size();
realWidth = (int) (maxwidth / (num)); realWidth = (int) (maxwidth / (num));
if (realWidth > MAXWIDTH) { if (realWidth > MAXWIDTH) {
realWidth = MAXWIDTH; realWidth = MAXWIDTH;
@ -647,13 +887,10 @@ public class MultiTemplateTabPane extends JComponent {
generalPath.closePath(); generalPath.closePath();
} }
/**
* 设置是否关闭当前打开的模板
* @param isCloseCurrent
*/
@Deprecated
public void setIsCloseCurrent(boolean isCloseCurrent) { public void setIsCloseCurrent(boolean isCloseCurrent) {
TemplateTabManager.getInstance().setCloseCurrent(isCloseCurrent); this.isCloseCurrent = isCloseCurrent;
} }
/** /**
@ -661,35 +898,57 @@ public class MultiTemplateTabPane extends JComponent {
* *
* @param specifiedTemplate 模板 * @param specifiedTemplate 模板
*/ */
@Deprecated
public void closeSpecifiedTemplate(JTemplate<?, ?> specifiedTemplate) { public void closeSpecifiedTemplate(JTemplate<?, ?> specifiedTemplate) {
TemplateTabManager.getInstance().closeSpecifiedTemplate(specifiedTemplate); if (specifiedTemplate == null) {
} return;
}
private boolean isOverCloseIcon(int evtX) { if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) {
boolean overCloseIcon = false; specifiedTemplate.stopEditing();
for (int i = 0; i < startX.length; i++) { int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?",
if (evtX >= startX[i] && evtX <= startX[i] + CLOSE.getIconWidth()) { Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
overCloseIcon = true; if (returnVal == JOptionPane.YES_OPTION) {
break; CallbackSaveWorker worker = specifiedTemplate.save();
worker.addSuccessCallback(new Runnable() {
@Override
public void run() {
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName()));
closeTpl(specifiedTemplate);
}
});
worker.start(specifiedTemplate.getRuntimeId());
} else if (returnVal == JOptionPane.NO_OPTION) {
closeTpl(specifiedTemplate);
} }
} else {
closeTpl(specifiedTemplate);
} }
return overCloseIcon;
} }
private void closeTpl(@Nonnull JTemplate<?, ?> specifiedTemplate) {
HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate);
closeAndFreeLock(specifiedTemplate);
activePrevTemplateAfterClose();
}
private boolean isOverListDown(int evtX) { private void closeAndFreeLock(@Nonnull JTemplate<?, ?> template) {
int maxWidth = getWidth() - LIST_BUTTON_WIDTH; FILE file = template.getEditingFILE();
return evtX >= (maxWidth + SMALLGAP) && evtX <= (getWidth() - SMALLGAP); // 只有是环境内的文件,才执行释放锁
if (file != null && file.isEnvFile()) {
// release lock
TemplateResourceManager.getResource().closeTemplate(file.getPath());
}
} }
/** /**
* 后台关闭当前编辑模板 * 后台关闭当前编辑模板
*/ */
@Deprecated
public void closeCurrentTpl() { public void closeCurrentTpl() {
TemplateTabManager.getInstance().closeCurrentTpl(); JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
this.setIsCloseCurrent(true);
this.closeFormat(jTemplate);
this.closeSpecifiedTemplate(jTemplate);
} }
/** /**
@ -697,25 +956,71 @@ public class MultiTemplateTabPane extends JComponent {
* *
* @param closedTemplate 模板 * @param closedTemplate 模板
*/ */
@Deprecated
public void closeFormat(JTemplate closedTemplate) { public void closeFormat(JTemplate closedTemplate) {
TemplateTabManager.getInstance().closeFormat(closedTemplate); //表单不需要处理
if (!closedTemplate.isJWorkBook()) {
return;
}
if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_NULL) {
return;
}
//是被参照的模板被关闭,则重置格式刷
closedTemplate.doConditionCancelFormat();
} }
/** /**
* 关闭掉一个模板之后激活新的待显示模板 * 关闭掉一个模板之后激活新的待显示模板
*/ */
@Deprecated
public void activePrevTemplateAfterClose() { public void activePrevTemplateAfterClose() {
TemplateTabManager.getInstance().activePrevTemplateAfterClose(); if (openedTemplate.isEmpty()) {
//新建并激活模板
DesignerContext.getDesignerFrame().addAndActivateJTemplate();
selectedIndex = 0;
//此时刚自动新建的模板在HistoryTemplateListCache的editingTemplate
temTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
} else {
// 如果关闭的模板是当前选中的模板,则重新激活当前 selectIndex 的模板;
// selectIndex 没有变化,但是对应的模板已经变成了前一张模板
if (closeIconIndex == selectedIndex || isCloseCurrent) {
// 如果当前关闭的模板在最右侧,那么预览上一个,防止数组越界
if (selectedIndex >= maxPaintIndex) {
// selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true
selectedIndex--;
}
isCloseCurrent = false;
}
// 如果关闭的模板不是当前选中的模板,那么重新获取一下当前模板的 index,激活该 index
else {
JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
selectedIndex = HistoryTemplateListCache.getInstance().contains(template);
}
if (selectedIndex < openedTemplate.size()) {
//如果是已后台关闭的模板,则重新打开文件
openedTemplate.get(selectedIndex).activeOldJTemplate();
}
}
} }
/**
* 处理自动新建的模板 在切换时的处理 private boolean isOverCloseIcon(int evtX) {
*/ boolean isOverCloseIcon = false;
@Deprecated for (int i = 0; i < startX.length; i++) {
public void doWithtemTemplate() { if (evtX >= startX[i] && evtX <= startX[i] + CLOSE.getIconWidth()) {
TemplateTabManager.getInstance().doWithtemTemplate(); isOverCloseIcon = true;
break;
}
}
return isOverCloseIcon;
}
private boolean isOverListDown(int evtX) {
int maxWidth = getWidth() - LIST_BUTTON_WIDTH;
return evtX >= (maxWidth + SMALLGAP) && evtX <= (getWidth() - SMALLGAP);
} }
@ -731,6 +1036,29 @@ public class MultiTemplateTabPane extends JComponent {
return -1; return -1;
} }
/**
* 处理自动新建的模板 在切换时的处理
*/
public void doWithtemTemplate() {
//temtemplate保存的一定是手动新建的没有编辑或是编辑了没有保存的模板
//没有保存,说明有编辑;已经保存在磁盘里的文件,说明有过处理,并且已经保存,此时切换都不将其自动关闭
if (temTemplate == null || temTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) {
return;
}
if (!temTemplate.isSaved() || !temTemplate.getEditingFILE().isMemFile()) {
temTemplate = null;
}
//自动新建的模板B若没有进行任何编辑(新建模板没有进行任何编辑时saved都是true):还没有存盘
if (temTemplate != null && temTemplate.getEditingFILE().isMemFile() && temTemplate.isSaved()) {
HistoryTemplateListCache.getInstance().closeSelectedReport(temTemplate);
temTemplate = null;
setSelectedIndex(HistoryTemplateListCache.getInstance().contains(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()));
}
}
private class UIListDownItemUI extends BasicMenuItemUI { private class UIListDownItemUI extends BasicMenuItemUI {
@Override @Override
protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) {
@ -833,13 +1161,44 @@ public class MultiTemplateTabPane extends JComponent {
closeIconIndex = getTemplateIndex(evtX); closeIconIndex = getTemplateIndex(evtX);
clodeMode = MOUSE_PRESS_CLOSE; clodeMode = MOUSE_PRESS_CLOSE;
//关闭close图标所在的模板{ //关闭close图标所在的模板{
TemplateTabManager.getInstance().getCurrentOperator().closeByIndex(closeIconIndex); JTemplate<?, ?> template = openedTemplate.get(closeIconIndex);
if (template.isOpening()) {
WorkerManager.getInstance().cancelWorker(template.getPath());
} else if (template.isSaving()) {
boolean completed = WorkerManager.getInstance().isCompleted(template.getTarget().getTemplateID());
if (!completed) {
FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Close_Template_Tip", template.getEditingFILE().getName()));
return;
}
}
//参考CloseCurrentTemplateAction,在closeFormat与closeSpecifiedTemplate之前要先设定isCloseCurrent,这样关闭之后才会自动切换tab
if (checkCurrentClose(template)) {
setIsCloseCurrent(true);
}
closeFormat(template);
closeSpecifiedTemplate(template);
DesignerContext.getDesignerFrame().getContentFrame().repaint();
isShowList = false; isShowList = false;
} else { } else {
//没有点击关闭和ListDown按钮,则切换到点击的模板处 //没有点击关闭和ListDown按钮,则切换到点击的模板处
closeIconIndex = -1; closeIconIndex = -1;
clodeMode = CLOSE; clodeMode = CLOSE;
TemplateTabManager.getInstance().getCurrentOperator().switchTpl(getTemplateIndex(evtX)); int tempSelectedIndex = selectedIndex;
if (selectedIndex != getTemplateIndex(evtX) && getTemplateIndex(evtX) != -1) {
openedTemplate.get(selectedIndex).stopEditing();
selectedIndex = getTemplateIndex(evtX);
//如果在权限编辑情况下,不允许切换到表单类型的工作簿
if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) {
DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex));
FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported")
+ "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE);
MultiTemplateTabPane.this.repaint();
return;
}
JTemplate evtXTemplate = openedTemplate.get(getTemplateIndex(evtX));
evtXTemplate.activeNewJTemplate();
}
isShowList = false; isShowList = false;
} }
MultiTemplateTabPane.this.repaint(); MultiTemplateTabPane.this.repaint();
@ -850,6 +1209,11 @@ public class MultiTemplateTabPane extends JComponent {
} }
private boolean checkCurrentClose(JTemplate template) {
JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
return JTemplate.isValid(currentTemplate) && ComparatorUtils.equals(template.getPath(), currentTemplate.getPath());
}
private class MultiTemplateTabMouseMotionListener implements MouseMotionListener { private class MultiTemplateTabMouseMotionListener implements MouseMotionListener {
/** /**
* 鼠标拖拽 * 鼠标拖拽
@ -873,7 +1237,7 @@ public class MultiTemplateTabPane extends JComponent {
//看是否需要显示toolTip //看是否需要显示toolTip
if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) { if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) {
setToolTipText(TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(mouseOveredIndex).getEditingFILE().getName()); setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName());
} else { } else {
setToolTipText(null); setToolTipText(null);
} }

6
designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java

@ -1,7 +1,5 @@
package com.fr.design.file; package com.fr.design.file;
import com.fr.design.file.impl.DefaultTemplateTabOperate;
/** /**
* @author shine * @author shine
* @version 10.0 * @version 10.0
@ -16,11 +14,11 @@ public class MutilTempalteTabPane {
} }
public void setIsCloseCurrent(boolean b) { public void setIsCloseCurrent(boolean b) {
TemplateTabManager.getInstance().setCloseCurrent(b); MultiTemplateTabPane.getInstance().setIsCloseCurrent(b);
} }
public void activePrevTemplateAfterClose() { public void activePrevTemplateAfterClose() {
DefaultTemplateTabOperate.getInstance().activePrevTemplateAfterClose(true); MultiTemplateTabPane.getInstance().activePrevTemplateAfterClose();
} }
} }

6
designer-base/src/main/java/com/fr/design/file/NewTemplatePane.java

@ -81,15 +81,11 @@ public abstract class NewTemplatePane extends JComponent implements MouseListene
} }
if (isOverNewIcon(evtX) && newWorkBookIconMode != GRAY_NEW_CPT) { if (isOverNewIcon(evtX) && newWorkBookIconMode != GRAY_NEW_CPT) {
newWorkBookIconMode = getMousePressNew(); newWorkBookIconMode = getMousePressNew();
createNewTemplate(); DesignerContext.getDesignerFrame().addAndActivateJTemplate();
} }
this.repaint(); this.repaint();
} }
protected void createNewTemplate() {
DesignerContext.getDesignerFrame().addAndActivateJTemplate();
}
/** /**
*鼠标松开 *鼠标松开
* @param e 事件 * @param e 事件

39
designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java

@ -3,8 +3,8 @@ package com.fr.design.file;
import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.event.StateChangeListener; import com.fr.design.event.StateChangeListener;
import com.fr.design.file.impl.DefaultTemplateTabOperate;
import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
@ -19,10 +19,10 @@ import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import javax.swing.*; import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*; import java.awt.*;
import java.awt.event.*; import java.awt.event.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
/** /**
* Author : daisy * Author : daisy
@ -151,32 +151,8 @@ public class SaveSomeTemplatePane extends BasicPane {
} }
/**
* 显示未保存弹窗
* @return
*/
public boolean showSavePane() { public boolean showSavePane() {
return showSavePane(false); populate();
}
/**
* 显示未保存弹窗
* @param switchEnv
* @return
*/
public boolean showSavePane(boolean switchEnv) {
return switchEnv ?
showSavePane(DefaultTemplateTabOperate.getInstance().getOpenedJTemplates()) :
showSavePane(HistoryTemplateListPane.getInstance().getHistoryList());
}
/**
* 显示未保存弹窗
* @param jTemplates
* @return
*/
public boolean showSavePane(List<JTemplate<?, ?>> jTemplates) {
populate(jTemplates);
//如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目 //如果有未保存的文件 ,则跳出保存对话框,选择要存储的项目
if (!unSavedTemplate.isEmpty()) { if (!unSavedTemplate.isEmpty()) {
dialog.setVisible(true); dialog.setVisible(true);
@ -186,15 +162,8 @@ public class SaveSomeTemplatePane extends BasicPane {
return isAllSaved; return isAllSaved;
} }
/**
* 兼容方法
*/
@Deprecated
public void populate() { public void populate() {
populate(HistoryTemplateListPane.getInstance().getHistoryList()); java.util.List<JTemplate<?, ?>> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList();
}
private void populate(java.util.List<JTemplate<?, ?>> opendedTemplate) {
JTemplate<?, ?> currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); JTemplate<?, ?> currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
for (int i = 0; i < opendedTemplate.size(); i++) { for (int i = 0; i < opendedTemplate.size(); i++) {
if (isneedToAdd(opendedTemplate.get(i), currentTemplate)) { if (isneedToAdd(opendedTemplate.get(i), currentTemplate)) {

291
designer-base/src/main/java/com/fr/design/file/TemplateTabManager.java

@ -1,291 +0,0 @@
package com.fr.design.file;
import com.finebi.cbb.utils.CompareUtils;
import com.fr.design.file.impl.DefaultTemplateTabOperate;
import com.fr.design.file.impl.EmptyTemplateTabOperate;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate;
import com.fr.file.FILE;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 模板tab的操作统一管理类
* @author kerry
* @since 11.0
* created on 2023-04-14
**/
public class TemplateTabManager {
private static class Holder {
private static final TemplateTabManager SINGLETON = new TemplateTabManager();
}
/**
* 返回TemplateTabManager单例对象
* @return
*/
public static TemplateTabManager getInstance() {
return Holder.SINGLETON;
}
private TemplateTabManager() {
list.add(DefaultTemplateTabOperate.getInstance());
}
private List<TemplateTabOperateProvider> list = new ArrayList<>();
/**
* 支持注册新的Operator
* @param templateTabOperateProvider
*/
public void register(TemplateTabOperateProvider templateTabOperateProvider) {
this.list.add(templateTabOperateProvider);
}
/**
* 移除operator
* @param templateTabOperateProvider
*/
public void remove(TemplateTabOperateProvider templateTabOperateProvider) {
this.list.remove(templateTabOperateProvider);
}
private boolean closeCurrent = false;
//自动新建的模板B若没有进行任何编辑,切换到其他
// 模板时,模板B会自动关闭
private JTemplate<?, ?> temTemplate = null;
public boolean isCloseCurrent() {
return closeCurrent;
}
public void setCloseCurrent(boolean closeCurrent) {
this.closeCurrent = closeCurrent;
}
public void setTemTemplate(JTemplate<?, ?> temTemplate) {
this.temTemplate = temTemplate;
}
/**
* 刷新tab栏
*/
public void refresh() {
getCurrentOperator().refresh();
}
/**
* 从模板树删除文件
*/
public void deleteOpenedTemplate(JTemplate<?, ?> template) {
TemplateTabOperateProvider provider = getOperatorByTemplate(template);
provider.deleteOpenedTemplate(template);
this.refresh();
}
public JTemplate getSelectedFile() {
return getCurrentOperator().getSelectedFile();
}
/**
* 关闭掉当前文件列表中指定的文件
*
* @param file 指定的文件
*/
public void closeFileTemplate(FILE file) {
for (TemplateTabOperateProvider provider : list) {
provider.closeFileTemplate(file);
}
}
/**
* 关闭指定模板
*
* @param specifiedTemplate
*/
public void closeSpecifiedTemplate(JTemplate<?, ?> specifiedTemplate) {
getCurrentOperator().closeSpecifiedTemplate(specifiedTemplate);
}
/**
* 刷新打开模板
*
* @param tempalteLsit
*/
public void refreshOpenedTemplate(List<JTemplate<?, ?>> tempalteLsit) {
for (TemplateTabOperateProvider provider : list) {
provider.refreshOpenedTemplate(tempalteLsit);
}
}
/**
* 处理自动新建的模板 在切换时的处理
*/
public void doWithtemTemplate() {
//temtemplate保存的一定是手动新建的没有编辑或是编辑了没有保存的模板
//没有保存,说明有编辑;已经保存在磁盘里的文件,说明有过处理,并且已经保存,此时切换都不将其自动关闭
if (temTemplate == null || temTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) {
return;
}
if (!temTemplate.isSaved() || !temTemplate.getEditingFILE().isMemFile()) {
temTemplate = null;
}
//自动新建的模板B若没有进行任何编辑(新建模板没有进行任何编辑时saved都是true):还没有存盘
if (temTemplate != null && temTemplate.getEditingFILE().isMemFile() && temTemplate.isSaved()) {
HistoryTemplateListCache.getInstance().closeSelectedReport(temTemplate);
temTemplate = null;
resetSelectIndex(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate());
}
}
/**
* 重置选中index
* @param jTemplate
*/
public void resetSelectIndex(JTemplate jTemplate) {
getCurrentOperator().resetSelectIndex(jTemplate);
}
/**
* 激活新模板
*/
public void activeNewTemplate() {
//先看其他模式中是否有已打开的模板,有的话切换过去
for (TemplateTabOperateProvider templateTabOperateProvider : list) {
if (templateTabOperateProvider.getOpenedJTemplates().size() != 0) {
templateTabOperateProvider.getSelectedFile().activeNewJTemplate();
refresh();
return;
}
}
//都没有的话,新建并激活模板
DesignerContext.getDesignerFrame().addAndActivateJTemplate();
//此时刚自动新建的模板在HistoryTemplateListCache的editingTemplate
TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate());
refresh();
}
/**
* 后台关闭当前编辑模板
*/
public void closeCurrentTpl() {
JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
this.setCloseCurrent(true);
this.closeFormat(jTemplate);
this.closeSpecifiedTemplate(jTemplate);
}
/**
* 关闭指定索引值模板
*
* @param index
*/
public void closeByIndex(int index) {
getCurrentOperator().closeByIndex(index);
}
/**
* 关闭指定索引值模板
*
* @param jTemplate
*/
public void closeByJTemplate(JTemplate jTemplate) {
TemplateTabOperateProvider operator = getOperatorByOperatorType(jTemplate.getTemplateTabOperatorType());
operator.closeByIndex(operator.getJTemplateIndex(jTemplate));
}
/**
* 切换到指定tab栏的指定索引值模板
*
* @param jTemplate
*/
public void switchByJTemplate(JTemplate jTemplate) {
TemplateTabOperateProvider operator = getOperatorByOperatorType(jTemplate.getTemplateTabOperatorType());
operator.switchTpl(operator.getJTemplateIndex(jTemplate));
}
/**
* 获取所有打开的模板map
*
* @return
*/
public Map<String, List<JTemplate<?, ?>>> getAllOpenedTemplateMap() {
Map<String, List<JTemplate<?, ?>>> resultMap = new HashMap<>();
for (TemplateTabOperateProvider provider : list) {
resultMap.put(provider.getOperatorType(), provider.getOpenedJTemplates());
}
return resultMap;
}
/**
* 留作兼容
*/
public void activePrevTemplateAfterClose(){
getCurrentOperator().activePrevTemplateAfterClose();
}
/**
* 关闭其他
*/
public void closeOthers() {
TemplateTabOperateProvider currentOperator = getCurrentOperator();
currentOperator.closeAction(CloseOption.Others,
currentOperator.getJTemplateIndex(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()));
}
public String getTemplateShowName(JTemplate temTemplate){
return getCurrentOperator().getTemplateShowName(temTemplate);
}
/**
* 关闭模板
*
* @param closedTemplate 模板
*/
public void closeFormat(JTemplate closedTemplate) {
//表单不需要处理
if (!closedTemplate.isJWorkBook()) {
return;
}
if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_NULL) {
return;
}
//是被参照的模板被关闭,则重置格式刷
closedTemplate.doConditionCancelFormat();
}
public TemplateTabOperateProvider getCurrentOperator() {
return getOperatorByTemplate(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate());
}
private TemplateTabOperateProvider getOperatorByTemplate(JTemplate jTemplate) {
return getOperatorByOperatorType(jTemplate.getTemplateTabOperatorType());
}
private TemplateTabOperateProvider getOperatorByOperatorType(String type) {
for (TemplateTabOperateProvider provider : list) {
if (CompareUtils.isEqual(provider.getOperatorType(), type)) {
return provider;
}
}
return EmptyTemplateTabOperate.getInstance();
}
}

129
designer-base/src/main/java/com/fr/design/file/TemplateTabOperateProvider.java

@ -1,129 +0,0 @@
package com.fr.design.file;
import com.fr.design.mainframe.JTemplate;
import com.fr.file.FILE;
import java.util.List;
/**
* 模板tab的操作接口
* @author kerry
* @since 11.0
* created on 2023-04-14
**/
public interface TemplateTabOperateProvider {
/**
* 找到模板树中的位置
*/
void locateTemplateInTree(int tplIndex);
/**
* 右键一系列关闭操作
*
* @param option closeType
* @param index
*/
void closeAction(CloseOption option, int index);
/**
* 切换模板
*
* @param templateIndex 模板索引值
*/
void switchTpl(int templateIndex);
/**
* 获取打开模板的基本信息
*
* @return
*/
List<JTemplate<?, ?>> getOpenedJTemplates();
/**
* 根据指定索引关闭模板
* @param index
*/
void closeByIndex(int index);
/**
* 关闭指定模板
*
* @param specifiedTemplate
*/
void closeSpecifiedTemplate(JTemplate<?, ?> specifiedTemplate);
/**
* 删除已打开的模板
*/
void deleteOpenedTemplate(JTemplate<?, ?> template);
/**
* 获取选中模板
* @return
*/
JTemplate getSelectedFile();
/**
* 刷新ui
*/
void refresh();
/**
* 重置下选中的Index
* @param jTemplate
*/
void resetSelectIndex(JTemplate jTemplate);
/**
* 刷新下打开的模板list
* @param list
*/
void refreshOpenedTemplate(List<JTemplate<?, ?>> list);
/**
* 关闭指定节点
* @param file
*/
void closeFileTemplate(FILE file);
/**
* 获取操作类型标识
* @return
*/
String getOperatorType();
/**
* 获取当前选中模板的index
* @return
*/
int getSelectIndex();
/**
* 设置当前选中模板的index
* @return
*/
void setSelectIndex(int index);
/**
* 获取指定模板在operator中的索引值
* @param jTemplate
* @return
*/
int getJTemplateIndex(JTemplate jTemplate);
/**
* 获取template在tab中显示的名称
* @param jTemplate
* @return
*/
String getTemplateShowName(JTemplate jTemplate);
/**
* 留作兼容在关闭模板后激活前一个模板
*/
void activePrevTemplateAfterClose();
}

364
designer-base/src/main/java/com/fr/design/file/impl/AbstractTemplateTabOperate.java

@ -1,364 +0,0 @@
package com.fr.design.file.impl;
import com.finebi.cbb.utils.CompareUtils;
import com.fr.base.vcs.DesignerMode;
import com.fr.design.actions.file.LocateAction;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.file.CloseOption;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.SaveSomeTemplatePane;
import com.fr.design.file.TemplateTabManager;
import com.fr.design.file.TemplateTabOperateProvider;
import com.fr.design.file.TemplateTreePane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.mainframe.manager.search.TemplateTreeSearchManager;
import com.fr.design.utils.TemplateUtils;
import com.fr.design.worker.WorkerManager;
import com.fr.design.worker.save.CallbackSaveWorker;
import com.fr.file.FILE;
import com.fr.file.FileNodeFILE;
import com.fr.general.ComparatorUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.third.javax.annotation.Nonnull;
import com.fr.workspace.WorkContext;
import com.fr.workspace.server.lock.TplOperator;
import javax.swing.JOptionPane;
import java.util.ArrayList;
import java.util.List;
import static com.fr.design.dialog.FineJOptionPane.showConfirmDialog;
import static javax.swing.JOptionPane.OK_CANCEL_OPTION;
import static javax.swing.JOptionPane.OK_OPTION;
import static javax.swing.JOptionPane.WARNING_MESSAGE;
/**
* 模板tab的操作抽象类
* @author kerry
* @since 11.0
* created on 2023-04-14
**/
public abstract class AbstractTemplateTabOperate implements TemplateTabOperateProvider {
private static final String UNSAVED_SUFFIX = " *";
//用于存放工作簿
private java.util.List<JTemplate<?, ?>> openedTemplate = new ArrayList<>();
//选中的Tab项
private int selectedIndex = -1;
public AbstractTemplateTabOperate() {
}
@Override
public void locateTemplateInTree(int tplIndex) {
//处于搜索模式时,先退出搜索模式,再定位
if (TemplateTreeSearchManager.getInstance().isInSearchMode()) {
TemplateTreeSearchManager.getInstance().outOfSearchMode();
TemplateTreePane.getInstance().refreshDockingView();
}
JTemplate<?, ?> template = openedTemplate.get(tplIndex);
locateTemplate(template);
}
private void locateTemplate(JTemplate<?, ?> template) {
FILE currentTemplate = template.getEditingFILE();
//模板不属于当前环境,跟预览一样先提示保存,再定位模板
//如果是拖拽进来的模板单单用exist不能判断,这边参考预览的判断逻辑(browserTemplate),补充一下
boolean needSave = (!currentTemplate.exists() || !(currentTemplate instanceof FileNodeFILE)) && template.canBeSaved();
if (needSave) {
int selVal = showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Message"), Toolkit.i18nText("Fine-Design_Basic_Preview_Tool_Tips"), OK_CANCEL_OPTION, WARNING_MESSAGE);
if (OK_OPTION == selVal) {
CallbackSaveWorker worker = template.saveAs();
worker.start(template.getRuntimeId());
worker.addSuccessCallback(new Runnable() {
@Override
public void run() {
LocateAction.gotoEditingTemplateLeaf(template.getPath());
}
});
}
} else {
LocateAction.gotoEditingTemplateLeaf(template.getPath());
}
}
@Override
public void closeAction(CloseOption option, int index) {
SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(true);
if (saveSomeTempaltePane.showSavePane(this.openedTemplate)) {
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, option, index);
if (openedTemplate.isEmpty()) {
TemplateTabManager.getInstance().activeNewTemplate();
selectedIndex = 0;
} else {
DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate);
}
}
}
/**
* 根据指定索引值关闭模板
* @param index
*/
public void closeByIndex(int index) {
//关闭close图标所在的模板{
JTemplate<?, ?> template = openedTemplate.get(index);
if (template.isOpening()) {
WorkerManager.getInstance().cancelWorker(template.getPath());
} else if (template.isSaving()) {
boolean completed = WorkerManager.getInstance().isCompleted(template.getTarget().getTemplateID());
if (!completed) {
FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Close_Template_Tip", template.getEditingFILE().getName()));
return;
}
}
//参考CloseCurrentTemplateAction,在closeFormat与closeSpecifiedTemplate之前要先设定isCloseCurrent,这样关闭之后才会自动切换tab
if (checkCurrentClose(template)) {
TemplateTabManager.getInstance().setCloseCurrent(true);
}
TemplateTabManager.getInstance().closeFormat(template);
closeSpecifiedTemplate(template);
DesignerContext.getDesignerFrame().getContentFrame().repaint();
}
private boolean checkCurrentClose(JTemplate template) {
JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
return JTemplate.isValid(currentTemplate) && ComparatorUtils.equals(template.getPath(), currentTemplate.getPath());
}
private void closeTemplate(JTemplate<?, ?>[] templates, JTemplate<?, ?> currentTemplate, CloseOption option, int tplIndex) {
for (int i = 0; i < templates.length; i++) {
if (option.shouldClose(tplIndex, i)) {
JTemplate<?, ?> jTemplate = templates[i];
if (jTemplate == currentTemplate) {
currentTemplate = option == CloseOption.All ? null : templates[tplIndex];
}
//判断关闭的模板是不是格式刷的被参照的模板
openedTemplate.remove(jTemplate);
if (jTemplate != currentTemplate) {
TemplateTabManager.getInstance().closeFormat(jTemplate);
HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate);
closeAndFreeLock(jTemplate);
}
}
}
}
private void closeAndFreeLock(@Nonnull JTemplate<?, ?> template) {
FILE file = template.getEditingFILE();
// 只有是环境内的文件,才执行释放锁
if (file != null && file.isEnvFile()) {
// release lock
WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(file.getPath());
}
}
@Override
public void switchTpl(int templateIndex) {
int tempSelectedIndex = selectedIndex;
JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
boolean shouldSwitch = (selectedIndex != templateIndex || !this.accept(jTemplate.getTemplateTabOperatorType()))
&& templateIndex != -1;
if (shouldSwitch) {
openedTemplate.get(selectedIndex).stopEditing();
selectedIndex = templateIndex;
//如果在权限编辑情况下,不允许切换到表单类型的工作簿
if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) {
DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex));
FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") + "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), WARNING_MESSAGE);
return;
}
JTemplate evtTemplate = openedTemplate.get(templateIndex);
evtTemplate.activeNewJTemplate();
}
}
@Override
public void deleteOpenedTemplate(JTemplate<?, ?> template) {
if (!openedTemplate.contains(template)) {
return;
}
openedTemplate.remove(template);
if (openedTemplate.size() == 0) {
TemplateTabManager.getInstance().activeNewTemplate();
return;
}
if (openedTemplate.size() == selectedIndex) {
//如果删除的是后一个Tab,则定位到前一个
this.selectedIndex--;
}
}
@Override
public JTemplate getSelectedFile() {
if (openedTemplate.size() == selectedIndex) {
selectedIndex = Math.max(--selectedIndex, 0);
}
return openedTemplate.get(selectedIndex);
}
/**
* 关闭掉当前已打开文件列表中指定的文件
*
* @param file 指定的文件
*/
public void closeFileTemplate(FILE file) {
for (JTemplate<?, ?> temp : openedTemplate) {
if (ComparatorUtils.equals(file, temp.getEditingFILE())) {
closeSpecifiedTemplate(temp);
break;
}
}
}
/**
* 关闭模板
*
* @param specifiedTemplate 模板
*/
public void closeSpecifiedTemplate(JTemplate<?, ?> specifiedTemplate) {
if (specifiedTemplate == null && !openedTemplate.contains(specifiedTemplate)) {
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(new Runnable() {
@Override
public void run() {
FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName()));
closeTpl(specifiedTemplate);
}
});
worker.start(specifiedTemplate.getRuntimeId());
} else if (returnVal == JOptionPane.NO_OPTION) {
closeTpl(specifiedTemplate);
}
} else {
closeTpl(specifiedTemplate);
}
}
private void closeTpl(@Nonnull JTemplate<?, ?> specifiedTemplate) {
HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate);
closeAndFreeLock(specifiedTemplate);
activePrevTemplateAfterClose(specifiedTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate());
}
/**
* 关闭掉一个模板之后激活新的待显示模板
*/
@Override
public void activePrevTemplateAfterClose(){
activePrevTemplateAfterClose(TemplateTabManager.getInstance().isCloseCurrent());
}
/**
* 关闭掉一个模板之后激活新的待显示模板
*/
public void activePrevTemplateAfterClose(boolean isCurrentSelectedTpl) {
if (openedTemplate.isEmpty()) {
TemplateTabManager.getInstance().activeNewTemplate();
selectedIndex = 0;
} else {
// 如果关闭的模板是当前选中的模板,则重新激活当前 selectIndex 的模板;
// selectIndex 没有变化,但是对应的模板已经变成了前一张模板
if (isCurrentSelectedTpl || TemplateTabManager.getInstance().isCloseCurrent()) {
// 如果当前关闭的模板在最右侧,那么预览上一个,防止数组越界
if (selectedIndex >= openedTemplate.size()) {
// selectIndex 不会 <0 因为如果关闭的是打开的最后一个模板,那么关闭之后 openedTemplate.isEmpty() = true
selectedIndex--;
}
TemplateTabManager.getInstance().setCloseCurrent(false);
}
// 如果关闭的模板不是当前选中的模板,那么重新获取一下当前模板的 index,激活该 index
else {
JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
selectedIndex = this.openedTemplate.indexOf(template);
}
if (selectedIndex < openedTemplate.size()) {
//如果是已后台关闭的模板,则重新打开文件
openedTemplate.get(selectedIndex).activeOldJTemplate();
}
}
TemplateTabManager.getInstance().refresh();
}
@Override
public void resetSelectIndex(JTemplate jTemplate) {
this.selectedIndex = openedTemplate.indexOf(jTemplate);
TemplateTabManager.getInstance().refresh();
}
/**
* 刷新已打开的模板
* @param list
*/
public void refreshOpenedTemplate(List<JTemplate<?, ?>> list) {
List<JTemplate<?, ?>> result = new ArrayList<>();
for (JTemplate jTemplate : list) {
if (this.accept(jTemplate.getTemplateTabOperatorType())) {
result.add(jTemplate);
}
}
this.openedTemplate = result;
TemplateTabManager.getInstance().refresh();
}
public List<JTemplate<?, ?>> getOpenedJTemplates() {
return this.openedTemplate;
}
@Override
public void setSelectIndex(int index) {
this.selectedIndex = index;
}
@Override
public int getSelectIndex() {
return this.selectedIndex;
}
@Override
public int getJTemplateIndex(JTemplate jTemplate) {
return this.openedTemplate.indexOf(jTemplate);
}
/**
* 是否支持指定操作类型
* @param type
* @return
*/
public boolean accept(String type) {
return CompareUtils.isEqual(getOperatorType(), type);
}
@Override
public String getTemplateShowName(JTemplate template) {
String name = TemplateUtils.createLockeTemplatedName(template, template.getTemplateName());
if (!template.isSaved() && !name.endsWith(UNSAVED_SUFFIX)) {
name += UNSAVED_SUFFIX;
}
return name;
}
}

41
designer-base/src/main/java/com/fr/design/file/impl/DefaultTemplateTabOperate.java

@ -1,41 +0,0 @@
package com.fr.design.file.impl;
import com.fr.design.file.MultiTemplateTabPane;
/**
* 默认的模板tab的操作类
* @author kerry
* @since 11.0
* created on 2023-04-14
**/
public class DefaultTemplateTabOperate extends AbstractTemplateTabOperate {
public static final String OPERATOR_TYPE = "DEFAULT_TEMPLATE_TAB_OPERATOR";
private static class Holder {
private static final DefaultTemplateTabOperate SINGLETON = new DefaultTemplateTabOperate();
}
private DefaultTemplateTabOperate() {
super();
}
/**
* 返回DefaultTemplateTabOperate 单例
* @return
*/
public static DefaultTemplateTabOperate getInstance() {
return Holder.SINGLETON;
}
@Override
public void refresh() {
MultiTemplateTabPane.getInstance().repaint();
}
@Override
public String getOperatorType() {
return OPERATOR_TYPE;
}
}

124
designer-base/src/main/java/com/fr/design/file/impl/EmptyTemplateTabOperate.java

@ -1,124 +0,0 @@
package com.fr.design.file.impl;
import com.fr.design.file.CloseOption;
import com.fr.design.file.TemplateTabOperateProvider;
import com.fr.design.mainframe.JTemplate;
import com.fr.file.FILE;
import com.fr.stable.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
* 空的模板tab的操作类
* @author kerry
* @since 11.0
* created on 2023-04-14
**/
public class EmptyTemplateTabOperate implements TemplateTabOperateProvider {
private static class Holder {
private static final EmptyTemplateTabOperate SINGLETON = new EmptyTemplateTabOperate();
}
private EmptyTemplateTabOperate() {
}
/**
* 返回空的模板taboperator单例
* @return
*/
public static EmptyTemplateTabOperate getInstance() {
return Holder.SINGLETON;
}
@Override
public void locateTemplateInTree(int tplIndex) {
}
@Override
public void closeAction(CloseOption option, int index) {
}
@Override
public void closeByIndex(int index) {
}
@Override
public void switchTpl(int templateIndex) {
}
@Override
public List<JTemplate<?, ?>> getOpenedJTemplates() {
return new ArrayList<>();
}
@Override
public void closeSpecifiedTemplate(JTemplate<?, ?> specifiedTemplate) {
}
@Override
public void deleteOpenedTemplate(JTemplate<?, ?> template) {
}
@Override
public JTemplate getSelectedFile() {
return null;
}
@Override
public void refresh() {
}
@Override
public void resetSelectIndex(JTemplate jTemplate) {
}
@Override
public void refreshOpenedTemplate(List<JTemplate<?, ?>> list) {
}
@Override
public void closeFileTemplate(FILE file) {
}
@Override
public String getOperatorType() {
return StringUtils.EMPTY;
}
@Override
public int getSelectIndex() {
return 0;
}
@Override
public void setSelectIndex(int index) {
}
@Override
public int getJTemplateIndex(JTemplate jTemplate) {
return 0;
}
@Override
public String getTemplateShowName(JTemplate jTemplate) {
return StringUtils.EMPTY;
}
@Override
public void activePrevTemplateAfterClose() {
}
}

4
designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java

@ -21,8 +21,8 @@ import com.fr.design.event.TargetModifiedEvent;
import com.fr.design.event.TargetModifiedListener; import com.fr.design.event.TargetModifiedListener;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.file.SaveSomeTemplatePane; import com.fr.design.file.SaveSomeTemplatePane;
import com.fr.design.file.TemplateTabManager;
import com.fr.design.file.TemplateTreePane; import com.fr.design.file.TemplateTreePane;
import com.fr.design.fun.OemProcessor; import com.fr.design.fun.OemProcessor;
import com.fr.design.fun.impl.AbstractTemplateTreeShortCutProvider; import com.fr.design.fun.impl.AbstractTemplateTreeShortCutProvider;
@ -1110,7 +1110,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
// 新的form不往前兼容 // 新的form不往前兼容
if (inValidDesigner(jt)) { if (inValidDesigner(jt)) {
this.addAndActivateJTemplate(); this.addAndActivateJTemplate();
TemplateTabManager.getInstance().setTemTemplate( MultiTemplateTabPane.getInstance().setTemTemplate(
HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()); HistoryTemplateListCache.getInstance().getCurrentEditingTemplate());
} else { } else {
this.addAndActivateJTemplate(jt); this.addAndActivateJTemplate(jt);

10
designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java

@ -21,7 +21,7 @@ import com.fr.design.file.FileOperations;
import com.fr.design.file.FileToolbarStateChangeListener; import com.fr.design.file.FileToolbarStateChangeListener;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.file.TemplateTreePane; import com.fr.design.file.TemplateTreePane;
import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
@ -275,7 +275,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt
TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter());
HistoryTemplateListPane.getInstance().setCurrentEditingTemplate(jt); HistoryTemplateListPane.getInstance().setCurrentEditingTemplate(jt);
//处理自动新建的模板 //处理自动新建的模板
TemplateTabManager.getInstance().doWithtemTemplate(); MultiTemplateTabPane.getInstance().doWithtemTemplate();
if (DesignerMode.isAuthorityEditing()) { if (DesignerMode.isAuthorityEditing()) {
RolesAlreadyEditedPane.getInstance().refreshDockingView(); RolesAlreadyEditedPane.getInstance().refreshDockingView();
} }
@ -547,10 +547,10 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt
for (JTemplate jTemplate : HistoryTemplateListCache.getInstance().getHistoryList()) { for (JTemplate jTemplate : HistoryTemplateListCache.getInstance().getHistoryList()) {
if (ComparatorUtils.equals(jTemplate.getEditingFILE().getPath(), path)) { if (ComparatorUtils.equals(jTemplate.getEditingFILE().getPath(), path)) {
if (isCurrentEditing) { if (isCurrentEditing) {
TemplateTabManager.getInstance().setCloseCurrent(true); MultiTemplateTabPane.getInstance().setIsCloseCurrent(true);
} }
TemplateTabManager.getInstance().closeFormat(jTemplate); MultiTemplateTabPane.getInstance().closeFormat(jTemplate);
TemplateTabManager.getInstance().closeSpecifiedTemplate(jTemplate); MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jTemplate);
return; return;
} }
} }

24
designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java

@ -33,7 +33,6 @@ import com.fr.design.dialog.InformationWarnPane;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.TemplateResourceManager; import com.fr.design.file.TemplateResourceManager;
import com.fr.design.file.impl.DefaultTemplateTabOperate;
import com.fr.design.fun.DesignerFrameUpButtonProvider; import com.fr.design.fun.DesignerFrameUpButtonProvider;
import com.fr.design.fun.MenuHandler; import com.fr.design.fun.MenuHandler;
import com.fr.design.fun.PreviewProvider; import com.fr.design.fun.PreviewProvider;
@ -618,7 +617,7 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
* @return 是则返回true * @return 是则返回true
*/ */
public boolean isALLSaved() { public boolean isALLSaved() {
return this.canBeSaved() && this.saved && this.authoritySaved; return this.saved && this.authoritySaved;
} }
@ -2052,10 +2051,6 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
DesignerUIModeConfig.getInstance().setAbsoluteMeasureUIMode(); DesignerUIModeConfig.getInstance().setAbsoluteMeasureUIMode();
} }
public String getTemplateTabOperatorType(){
return DefaultTemplateTabOperate.OPERATOR_TYPE;
}
/** /**
* 判断当前的模板是否是有效的模板 * 判断当前的模板是否是有效的模板
* *
@ -2065,21 +2060,4 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
public static boolean isValid(JTemplate jt) { public static boolean isValid(JTemplate jt) {
return jt != null && jt != JNullTemplate.NULL; return jt != null && jt != JNullTemplate.NULL;
} }
/**
* 当前模板是否可以被保存
* @return /
*/
public boolean canBeSaved(){
return true;
}
/**
* 当前的模板是否支持缓存
*
* @return /
*/
public boolean supportCache(){
return true;
}
} }

4
designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java

@ -416,7 +416,9 @@ public abstract class ToolBarMenuDock {
menuDef.addShortCut(new OpenRecentReportMenuDef()); menuDef.addShortCut(new OpenRecentReportMenuDef());
addCloseCurrentTemplateAction(menuDef); if (!DesignModeContext.isDuchampMode()) {
addCloseCurrentTemplateAction(menuDef);
}
scs = plus.shortcut4FileMenu(); scs = plus.shortcut4FileMenu();
if (!ArrayUtils.isEmpty(scs)) { if (!ArrayUtils.isEmpty(scs)) {

8
designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionCellEditor.java

@ -1,7 +1,7 @@
package com.fr.design.mainframe.vcs.ui; package com.fr.design.mainframe.vcs.ui;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.DesignerFrameFileDealerPane;
import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplate;
@ -57,9 +57,9 @@ public class FileVersionCellEditor extends AbstractCellEditor implements TableCe
jt.stopEditing(); jt.stopEditing();
//只有模板路径一致时关闭当前模板 //只有模板路径一致时关闭当前模板
if (ComparatorUtils.equals(fileOfVersion, jt.getPath())) { if (ComparatorUtils.equals(fileOfVersion, jt.getPath())) {
TemplateTabManager.getInstance().setCloseCurrent(true); MultiTemplateTabPane.getInstance().setIsCloseCurrent(true);
TemplateTabManager.getInstance().closeFormat(jt); MultiTemplateTabPane.getInstance().closeFormat(jt);
TemplateTabManager.getInstance().closeSpecifiedTemplate(jt); MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jt);
} }
//再打开cache中的模板 //再打开cache中的模板

8
designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java

@ -5,7 +5,7 @@ import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.base.mode.DesignerMode; import com.fr.design.base.mode.DesignerMode;
import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.BasicPane;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
@ -115,9 +115,9 @@ public class FileVersionsPanel extends BasicPane {
// 关闭当前打开的版本 // 关闭当前打开的版本
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
TemplateTabManager.getInstance().setCloseCurrent(true); MultiTemplateTabPane.getInstance().setIsCloseCurrent(true);
TemplateTabManager.getInstance().closeFormat(jt); MultiTemplateTabPane.getInstance().closeFormat(jt);
TemplateTabManager.getInstance().closeSpecifiedTemplate(jt); MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jt);
updateDesignerFrame(true); updateDesignerFrame(true);

4
designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java

@ -3,7 +3,7 @@ package com.fr.design.worker.open;
import com.fr.base.chart.exception.ChartNotFoundException; import com.fr.base.chart.exception.ChartNotFoundException;
import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.file.TemplateTreePane; import com.fr.design.file.TemplateTreePane;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.lock.LockInfoDialog; import com.fr.design.lock.LockInfoDialog;
@ -87,7 +87,7 @@ public class OpenWorker<T> extends SwingWorker<T, Void> {
UIManager.getIcon("OptionPane.errorIcon")); UIManager.getIcon("OptionPane.errorIcon"));
} }
if (cause.getCause() instanceof TplLockedException) { if (cause.getCause() instanceof TplLockedException) {
TemplateTabManager.getInstance().closeCurrentTpl(); MultiTemplateTabPane.getInstance().closeCurrentTpl();
TemplateTreePane.getInstance().getFileNode().setLock(UUID.randomUUID().toString()); TemplateTreePane.getInstance().getFileNode().setLock(UUID.randomUUID().toString());
LockInfoDialog.show(null); LockInfoDialog.show(null);
} }

8
designer-base/src/main/java/com/fr/nx/app/designer/toolbar/TemplateTransformer.java

@ -2,7 +2,7 @@ package com.fr.nx.app.designer.toolbar;
import com.fr.base.extension.FileExtension; import com.fr.base.extension.FileExtension;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplate;
import com.fr.file.FILE; import com.fr.file.FILE;
@ -103,9 +103,9 @@ public enum TemplateTransformer {
DesignerContext.getDesignerFrame().openTemplate(file); DesignerContext.getDesignerFrame().openTemplate(file);
return; return;
} }
TemplateTabManager.getInstance().setCloseCurrent(true); MultiTemplateTabPane.getInstance().setIsCloseCurrent(true);
TemplateTabManager.getInstance().closeFormat(jt); MultiTemplateTabPane.getInstance().closeFormat(jt);
TemplateTabManager.getInstance().closeSpecifiedTemplate(jt); MultiTemplateTabPane.getInstance().closeSpecifiedTemplate(jt);
DesignerContext.getDesignerFrame().openTemplate(file); DesignerContext.getDesignerFrame().openTemplate(file);
} }

6
designer-base/src/main/java/com/fr/start/BaseDesigner.java

@ -8,7 +8,7 @@ import com.fr.design.DesignerEnvManager;
import com.fr.design.ExtraDesignClassManager; import com.fr.design.ExtraDesignClassManager;
import com.fr.design.constants.DesignerLaunchStatus; import com.fr.design.constants.DesignerLaunchStatus;
import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.file.TemplateTreePane; import com.fr.design.file.TemplateTreePane;
import com.fr.design.fun.DesignerStartOpenFileProcessor; import com.fr.design.fun.DesignerStartOpenFileProcessor;
import com.fr.design.fun.impl.DesignerStartWithEmptyFile; import com.fr.design.fun.impl.DesignerStartWithEmptyFile;
@ -193,7 +193,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock {
} else { } else {
df.addAndActivateJTemplate(); df.addAndActivateJTemplate();
// 如果没有模板,则需要确认一下 // 如果没有模板,则需要确认一下
TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); MultiTemplateTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate());
} }
} }
@ -253,7 +253,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock {
private boolean createNewTemplate(DesignerFrame df) { private boolean createNewTemplate(DesignerFrame df) {
df.addAndActivateJTemplate(); df.addAndActivateJTemplate();
// 如果没有模板,则需要确认一下 // 如果没有模板,则需要确认一下
TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); MultiTemplateTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate());
return true; return true;
} }

4
designer-base/src/main/java/com/fr/start/common/DesignerOpenEmptyPanel.java

@ -3,7 +3,7 @@ package com.fr.start.common;
import com.fr.base.svg.IconUtils; import com.fr.base.svg.IconUtils;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.DesignSizeI18nManager; import com.fr.design.i18n.DesignSizeI18nManager;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
@ -59,7 +59,7 @@ public class DesignerOpenEmptyPanel extends JPanel {
HistoryTemplateListCache.getInstance().setCurrentEditingTemplate(null); HistoryTemplateListCache.getInstance().setCurrentEditingTemplate(null);
df.addAndActivateJTemplate(); df.addAndActivateJTemplate();
// 如果没有模板,则需要确认一下 // 如果没有模板,则需要确认一下
TemplateTabManager.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); MultiTemplateTabPane.getInstance().setTemTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate());
} }
}); });
createButton.setBorder(new EmptyBorder(0, 10, 0, 10)); createButton.setBorder(new EmptyBorder(0, 10, 0, 10));

4
designer-form/src/main/java/com/fr/design/fit/common/TemplateTool.java

@ -1,7 +1,7 @@
package com.fr.design.fit.common; package com.fr.design.fit.common;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.fit.NewJForm; import com.fr.design.fit.NewJForm;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplate;
@ -86,7 +86,7 @@ public class TemplateTool {
JTemplate oldJTemplate = jTemplateList.get(i); JTemplate oldJTemplate = jTemplateList.get(i);
if (oldJTemplate != null && ComparatorUtils.equals(oldJTemplate.getEditingFILE(), newJTemplate.getEditingFILE())) { if (oldJTemplate != null && ComparatorUtils.equals(oldJTemplate.getEditingFILE(), newJTemplate.getEditingFILE())) {
jTemplateList.set(i, newJTemplate); jTemplateList.set(i, newJTemplate);
TemplateTabManager.getInstance().refreshOpenedTemplate(jTemplateList); MultiTemplateTabPane.getInstance().refreshOpenedTemplate(jTemplateList);
return; return;
} }
} }

5
designer-form/src/main/java/com/fr/design/preview/DeveloperPreview.java

@ -1,8 +1,7 @@
package com.fr.design.preview; package com.fr.design.preview;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.file.TemplateTreePane;
import com.fr.design.fun.impl.AbstractPreviewProvider; import com.fr.design.fun.impl.AbstractPreviewProvider;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.JForm; import com.fr.design.mainframe.JForm;
@ -67,7 +66,7 @@ public class DeveloperPreview extends AbstractPreviewProvider {
} }
private void onPreview(JTemplate<?, ?> jt) { private void onPreview(JTemplate<?, ?> jt) {
TemplateTabManager.getInstance().closeCurrentTpl(); MultiTemplateTabPane.getInstance().closeCurrentTpl();
jt.generateForBiddenTemplate(); jt.generateForBiddenTemplate();
} }

4
designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java

@ -39,7 +39,7 @@ import com.fr.design.designer.TargetComponent;
import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.TemplateTabManager; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.fun.PreviewProvider; import com.fr.design.fun.PreviewProvider;
import com.fr.design.fun.PropertyItemPaneProvider; import com.fr.design.fun.PropertyItemPaneProvider;
import com.fr.design.fun.ReportSupportedFileUIProvider; import com.fr.design.fun.ReportSupportedFileUIProvider;
@ -1175,7 +1175,7 @@ public class JWorkBook extends JTemplate<WorkBook, WorkBookUndoState> {
public boolean saveShareFile() { public boolean saveShareFile() {
FILE newFile = createNewEmptyFile(); FILE newFile = createNewEmptyFile();
//如果文件已经打开, 那么就覆盖关闭掉他 //如果文件已经打开, 那么就覆盖关闭掉他
TemplateTabManager.getInstance().closeFileTemplate(newFile); MultiTemplateTabPane.getInstance().closeFileTemplate(newFile);
final WorkBook tpl = this.getTarget(); final WorkBook tpl = this.getTarget();
// 弹出输入参数 // 弹出输入参数
java.util.Map<String, Object> parameterMap = inputParameters(tpl); java.util.Map<String, Object> parameterMap = inputParameters(tpl);

4
designer-realize/src/main/java/com/fr/start/MainDesigner.java

@ -17,7 +17,6 @@ import com.fr.design.deeplink.DeepLinkManager;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.MultiTemplateTabPane; import com.fr.design.file.MultiTemplateTabPane;
import com.fr.design.file.TemplateTabManager;
import com.fr.design.fun.MenuHandler; import com.fr.design.fun.MenuHandler;
import com.fr.design.fun.OemProcessor; import com.fr.design.fun.OemProcessor;
import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButton;
@ -410,7 +409,8 @@ public class MainDesigner extends BaseDesigner {
return; return;
} }
saveButton.setEnabled(!jt.isSaved() && !DesignModeContext.isVcsMode() && jt.checkEnable()); saveButton.setEnabled(!jt.isSaved() && !DesignModeContext.isVcsMode() && jt.checkEnable());
TemplateTabManager.getInstance().refreshOpenedTemplate(HistoryTemplateListCache.getInstance().getHistoryList()); MultiTemplateTabPane.getInstance().refreshOpenedTemplate(HistoryTemplateListCache.getInstance().getHistoryList());
MultiTemplateTabPane.getInstance().repaint();
if (DesignerEnvManager.getEnvManager().isSupportUndo()) { if (DesignerEnvManager.getEnvManager().isSupportUndo()) {
undo.setEnabled(jt.canUndo()); undo.setEnabled(jt.canUndo());
redo.setEnabled(jt.canRedo()); redo.setEnabled(jt.canRedo());

Loading…
Cancel
Save