|
|
|
@ -1,38 +1,28 @@
|
|
|
|
|
package com.fr.design.file; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.fr.base.BaseUtils; |
|
|
|
|
import com.fr.base.GraphHelper; |
|
|
|
|
import com.fr.base.svg.IconUtils; |
|
|
|
|
import com.fr.base.vcs.DesignerMode; |
|
|
|
|
import com.fr.design.actions.UpdateAction; |
|
|
|
|
import com.fr.design.actions.file.LocateAction; |
|
|
|
|
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.UIPopupMenu; |
|
|
|
|
import com.fr.design.gui.imenu.UIScrollPopUpMenu; |
|
|
|
|
import com.fr.design.i18n.DesignSizeI18nManager; |
|
|
|
|
import com.fr.design.i18n.Toolkit; |
|
|
|
|
import com.fr.design.mainframe.DesignerContext; |
|
|
|
|
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.TemplateUtils; |
|
|
|
|
import com.fr.design.utils.gui.GUICoreUtils; |
|
|
|
|
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.FileNodeFILE; |
|
|
|
|
import com.fr.general.ComparatorUtils; |
|
|
|
|
import com.fr.general.IOUtils; |
|
|
|
|
import com.fr.log.FineLoggerFactory; |
|
|
|
|
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.ButtonModel; |
|
|
|
@ -41,7 +31,6 @@ import javax.swing.ImageIcon;
|
|
|
|
|
import javax.swing.JComponent; |
|
|
|
|
import javax.swing.JMenu; |
|
|
|
|
import javax.swing.JMenuItem; |
|
|
|
|
import javax.swing.JOptionPane; |
|
|
|
|
import javax.swing.JPanel; |
|
|
|
|
import javax.swing.JSeparator; |
|
|
|
|
import javax.swing.MenuElement; |
|
|
|
@ -69,12 +58,6 @@ import java.awt.geom.GeneralPath;
|
|
|
|
|
import java.awt.geom.Line2D; |
|
|
|
|
import java.awt.geom.Path2D; |
|
|
|
|
import java.awt.geom.RoundRectangle2D; |
|
|
|
|
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 个错误 |
|
|
|
@ -114,10 +97,6 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static MultiTemplateTabPane THIS; |
|
|
|
|
//用于存放工作簿
|
|
|
|
|
private java.util.List<JTemplate<?, ?>> openedTemplate; |
|
|
|
|
//选中的Tab项
|
|
|
|
|
private int selectedIndex = 0; |
|
|
|
|
//
|
|
|
|
|
private int mouseOveredIndex = -1; |
|
|
|
|
|
|
|
|
@ -136,16 +115,11 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
|
|
|
|
|
//记录关闭按钮的状态
|
|
|
|
|
private int closeIconIndex = -1; |
|
|
|
|
private boolean isCloseCurrent = false; |
|
|
|
|
|
|
|
|
|
private Icon clodeMode = CLOSE; |
|
|
|
|
private Icon listDownMode = LIST_DOWN; |
|
|
|
|
private boolean isShowList = false; |
|
|
|
|
|
|
|
|
|
//自动新建的模板B若没有进行任何编辑,切换到其他
|
|
|
|
|
//
|
|
|
|
|
// 模板时,模板B会自动关闭
|
|
|
|
|
private JTemplate<?, ?> temTemplate = null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static MultiTemplateTabPane getInstance() { |
|
|
|
|
if (THIS == null) { |
|
|
|
@ -165,8 +139,6 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
this.setBorder(null); |
|
|
|
|
this.setForeground(new Color(58, 56, 58)); |
|
|
|
|
this.setFont(DesignUtils.getDefaultGUIFont().applySize(12)); |
|
|
|
|
openedTemplate = HistoryTemplateListCache.getInstance().getHistoryList(); |
|
|
|
|
selectedIndex = openedTemplate.size() - 1; |
|
|
|
|
AWTEventListener awt = new AWTEventListener() { |
|
|
|
|
@Override |
|
|
|
|
public void eventDispatched(AWTEvent event) { |
|
|
|
@ -206,45 +178,13 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
//根据当前i18n语言环境,动态调整popupMenu的宽度
|
|
|
|
|
menu.setPreferredSize(new Dimension((int) DesignSizeI18nManager.getInstance(). |
|
|
|
|
i18nDimension("com.fr.design.file.MultiTemplateTabPane.popUpMenu").getWidth(), height)); |
|
|
|
|
GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.getInstance(), e.getX(), MultiTemplateTabPane.getInstance().getY() - 1 + MultiTemplateTabPane.getInstance().getHeight()); |
|
|
|
|
GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.this, e.getX(), MultiTemplateTabPane.this.getY() - 1 + MultiTemplateTabPane.this.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 { |
|
|
|
|
@Override |
|
|
|
@ -272,41 +212,10 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void actionPerformed(ActionEvent e) { |
|
|
|
|
//处于搜索模式时,先退出搜索模式,再定位
|
|
|
|
|
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()); |
|
|
|
|
} |
|
|
|
|
//DefaultTemplateTabOperate.getInstance().locateTemplateInTree(this.tplIndex);
|
|
|
|
|
TemplateTabManager.getInstance().getCurrentOperator().locateTemplateInTree(this.tplIndex); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private class RightMenuCloseAction extends UpdateAction { |
|
|
|
@ -316,80 +225,15 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
|
|
|
|
|
public RightMenuCloseAction(CloseOption option, int tplIndex) { |
|
|
|
|
this.option = option; |
|
|
|
|
this.setName(option.optionName); |
|
|
|
|
this.setName(option.getOptionName()); |
|
|
|
|
this.tplIndex = tplIndex; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void actionPerformed(ActionEvent e) { |
|
|
|
|
SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); |
|
|
|
|
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()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
TemplateTabManager.getInstance().getCurrentOperator().closeAction(option, this.tplIndex); |
|
|
|
|
MultiTemplateTabPane.this.repaint(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
@ -409,7 +253,9 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
closeOther.addActionListener(new ActionListener() { |
|
|
|
|
@Override |
|
|
|
|
public void actionPerformed(ActionEvent e) { |
|
|
|
|
if (openedTemplate.size() == 1) { |
|
|
|
|
//int tabSize = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size();
|
|
|
|
|
int tabSize = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); |
|
|
|
|
if (tabSize == 1) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (!TemplateSavingChecker.check()) { |
|
|
|
@ -418,29 +264,28 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
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); |
|
|
|
|
JTemplate<?, ?>[] panes = new JTemplate<?, ?>[tabSize]; |
|
|
|
|
for (int i = 0; i < tabSize; i++) { |
|
|
|
|
panes[i] = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(i); |
|
|
|
|
} |
|
|
|
|
for (int i = 0; i < panes.length; i++) { |
|
|
|
|
if (i != selectedIndex) { |
|
|
|
|
if (i != TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex()) { |
|
|
|
|
JTemplate<?, ?> jTemplate = panes[i]; |
|
|
|
|
//判断关闭的模板是不是格式刷的被参照的模板
|
|
|
|
|
openedTemplate.remove(jTemplate); |
|
|
|
|
closeFormat(jTemplate); |
|
|
|
|
TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().remove(jTemplate); |
|
|
|
|
TemplateTabManager.getInstance().closeFormat(jTemplate); |
|
|
|
|
HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); |
|
|
|
|
closeAndFreeLock(jTemplate); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
JTemplate<?, ?> currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
|
|
|
|
HistoryTemplateListCache.getInstance().removeAllHistory(); |
|
|
|
|
DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); |
|
|
|
|
TemplateTabManager.getInstance().resetSelectIndex(currentTemplate); |
|
|
|
|
THIS.repaint(); |
|
|
|
|
} |
|
|
|
|
//如果取消保存了,则不关闭其他模板
|
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
if (openedTemplate.size() == 1) { |
|
|
|
|
if (TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size() == 1) { |
|
|
|
|
closeOther.setEnabled(false); |
|
|
|
|
} |
|
|
|
|
return closeOther; |
|
|
|
@ -448,21 +293,22 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private UIMenuItem[] createListDownTemplate() { |
|
|
|
|
UIMenuItem[] templates = new UIMenuItem[openedTemplate.size()]; |
|
|
|
|
for (int i = 0; i < openedTemplate.size(); i++) { |
|
|
|
|
int templateTabCount = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); |
|
|
|
|
UIMenuItem[] templates = new UIMenuItem[templateTabCount]; |
|
|
|
|
for (int i = 0; i < templateTabCount; i++) { |
|
|
|
|
final int index = i; |
|
|
|
|
final JTemplate tem = openedTemplate.get(i); |
|
|
|
|
final JTemplate tem = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(i); |
|
|
|
|
templates[i] = new UIMenuItem(tempalteShowName(tem), tem.getIcon()); |
|
|
|
|
templates[i].setUI(new UIListDownItemUI()); |
|
|
|
|
setListDownItemPreferredSize(templates[i]); |
|
|
|
|
if (i == selectedIndex) { |
|
|
|
|
if (i == TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex()) { |
|
|
|
|
//画选中的高亮
|
|
|
|
|
templates[i].setBackground(UIConstants.SHADOW_CENTER); |
|
|
|
|
} |
|
|
|
|
templates[i].addActionListener(new ActionListener() { |
|
|
|
|
@Override |
|
|
|
|
public void actionPerformed(ActionEvent e) { |
|
|
|
|
selectedIndex = index; |
|
|
|
|
TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(index); |
|
|
|
|
tem.activeNewJTemplate(); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
@ -478,68 +324,13 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String tempalteShowName(JTemplate<?, ?> template) { |
|
|
|
|
String name = TemplateUtils.createLockeTemplatedName(template, template.getTemplateName()); |
|
|
|
|
if (!template.isSaved() && !name.endsWith(" *")) { |
|
|
|
|
name += " *"; |
|
|
|
|
} |
|
|
|
|
return name; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 刷新打开模板 |
|
|
|
|
* |
|
|
|
|
* @param history 模板 |
|
|
|
|
*/ |
|
|
|
|
public void refreshOpenedTemplate(List<JTemplate<?, ?>> history) { |
|
|
|
|
openedTemplate = history; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setTemTemplate(JTemplate<?, ?> auotCreate) { |
|
|
|
|
temTemplate = auotCreate; |
|
|
|
|
return TemplateTabManager.getInstance().getTemplateShowName(template); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void showListDown() { |
|
|
|
|
|
|
|
|
|
UIScrollPopUpMenu menu = new UIScrollPopUpMenu(); |
|
|
|
|
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()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setSelectedIndex(int index) { |
|
|
|
|
selectedIndex = index; |
|
|
|
|
UIScrollPopUpMenu menu = MultiTemplateTabMenuFactory.getInstance().createMenu(); |
|
|
|
|
GUICoreUtils.showPopupMenu(menu, MultiTemplateTabPane.this, MultiTemplateTabPane.this.getWidth() - menu.getPreferredSize().width, getY() - 1 + getHeight()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -566,15 +357,18 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
paintDefaultBackground(g2d); |
|
|
|
|
//最多能画的个数
|
|
|
|
|
int maxTemplateNum = (int) (maxWidth) / MINWIDTH; |
|
|
|
|
int templateTabCount = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); |
|
|
|
|
int currentSelectedIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); |
|
|
|
|
//计算开始画的最小模板index和最大模板index
|
|
|
|
|
calMinAndMaxIndex(maxTemplateNum); |
|
|
|
|
calculateRealAverageWidth(maxWidth, maxTemplateNum); |
|
|
|
|
int maxStringlength = calculateStringMaxLength(); |
|
|
|
|
if (selectedIndex >= openedTemplate.size()) { |
|
|
|
|
selectedIndex = openedTemplate.size() - 1; |
|
|
|
|
if ( currentSelectedIndex >= templateTabCount) { |
|
|
|
|
TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex( |
|
|
|
|
templateTabCount - 1); |
|
|
|
|
} |
|
|
|
|
if (selectedIndex < 0) { |
|
|
|
|
selectedIndex = 0; |
|
|
|
|
if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() < 0) { |
|
|
|
|
TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(0); |
|
|
|
|
} |
|
|
|
|
double templateStartX = 0; |
|
|
|
|
startX = new int[maxPaintIndex - minPaintIndex + 1]; |
|
|
|
@ -582,7 +376,7 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
|
|
|
|
|
//从可以开始展示在tab面板上的tab开始画
|
|
|
|
|
for (int i = minPaintIndex; i <= maxPaintIndex; i++) { |
|
|
|
|
JTemplate template = openedTemplate.get(i); |
|
|
|
|
JTemplate template = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(i); |
|
|
|
|
Icon icon = template.getIcon(); |
|
|
|
|
String name = tempalteShowName(template); |
|
|
|
|
//如果tab名字的长度大于最大能显示的英文字符长度,则进行省略号处理
|
|
|
|
@ -599,7 +393,7 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
} else { |
|
|
|
|
selectedIcon = CLOSE; |
|
|
|
|
} |
|
|
|
|
if (i == selectedIndex) { |
|
|
|
|
if (i == TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex()) { |
|
|
|
|
if (template.isSaving()) { |
|
|
|
|
selectedIcon = WHITE_SAVING_CLOSE_ICON; |
|
|
|
|
} |
|
|
|
@ -608,7 +402,7 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
if (template.isSaving()) { |
|
|
|
|
selectedIcon = GREY_SAVING_CLOSE_ICON; |
|
|
|
|
} |
|
|
|
|
boolean isLeft = i < selectedIndex; |
|
|
|
|
boolean isLeft = i < TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); |
|
|
|
|
startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, isLeft, mouseOveredIndex, i); |
|
|
|
|
} |
|
|
|
|
templateStartX += realWidth; |
|
|
|
@ -684,38 +478,39 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void calMinAndMaxIndex(int maxTemplateNum) { |
|
|
|
|
int templateTabCount = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); |
|
|
|
|
//如果个数大于最多能容纳的个数,则多余的进行处理
|
|
|
|
|
if (openedTemplate.size() > maxTemplateNum) { |
|
|
|
|
if (templateTabCount > maxTemplateNum) { |
|
|
|
|
//所点击列表中的标签页处在标签页栏最后一个标签页之后,则标签页栏左移至所点击标签页出现
|
|
|
|
|
if (selectedIndex >= maxPaintIndex) { |
|
|
|
|
minPaintIndex = selectedIndex - maxTemplateNum + 1; |
|
|
|
|
maxPaintIndex = selectedIndex; |
|
|
|
|
if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() >= maxPaintIndex) { |
|
|
|
|
minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() - maxTemplateNum + 1; |
|
|
|
|
maxPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); |
|
|
|
|
if (minPaintIndex <= 0) { |
|
|
|
|
minPaintIndex = 0; |
|
|
|
|
maxPaintIndex = maxTemplateNum - 1; |
|
|
|
|
} |
|
|
|
|
} else if (selectedIndex <= minPaintIndex) { |
|
|
|
|
} else if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() <= minPaintIndex) { |
|
|
|
|
//所点击列表中的标签页处在标签页栏第一个标签页之前,则标签页栏右移至所点击标签页出现
|
|
|
|
|
minPaintIndex = selectedIndex; |
|
|
|
|
minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); |
|
|
|
|
maxPaintIndex = minPaintIndex + maxTemplateNum - 1; |
|
|
|
|
if (maxPaintIndex > openedTemplate.size() - 1) { |
|
|
|
|
maxPaintIndex = openedTemplate.size() - 1; |
|
|
|
|
if (maxPaintIndex > templateTabCount- 1) { |
|
|
|
|
maxPaintIndex = templateTabCount - 1; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (selectedIndex >= openedTemplate.size() - 1) { |
|
|
|
|
selectedIndex = openedTemplate.size() - 1; |
|
|
|
|
maxPaintIndex = selectedIndex; |
|
|
|
|
minPaintIndex = selectedIndex - maxTemplateNum + 1; |
|
|
|
|
if (TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() >= templateTabCount - 1) { |
|
|
|
|
TemplateTabManager.getInstance().getCurrentOperator().setSelectIndex(templateTabCount - 1); |
|
|
|
|
maxPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex(); |
|
|
|
|
minPaintIndex = TemplateTabManager.getInstance().getCurrentOperator().getSelectIndex() - maxTemplateNum + 1; |
|
|
|
|
} else { |
|
|
|
|
maxPaintIndex = minPaintIndex + maxTemplateNum - 1; |
|
|
|
|
if (maxPaintIndex > openedTemplate.size() - 1) { |
|
|
|
|
maxPaintIndex = openedTemplate.size() - 1; |
|
|
|
|
if (maxPaintIndex > templateTabCount - 1) { |
|
|
|
|
maxPaintIndex = templateTabCount - 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
minPaintIndex = 0; |
|
|
|
|
maxPaintIndex = openedTemplate.size() - 1; |
|
|
|
|
maxPaintIndex = templateTabCount - 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -723,7 +518,7 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
//个数小于最多能容纳的个数的情况下,看看宽度每个要画多少
|
|
|
|
|
private void calculateRealAverageWidth(double maxwidth, int templateNum) { |
|
|
|
|
|
|
|
|
|
int num = openedTemplate.size() > templateNum ? templateNum : openedTemplate.size(); |
|
|
|
|
int num = TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size() > templateNum ? templateNum : TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().size(); |
|
|
|
|
realWidth = (int) (maxwidth / (num)); |
|
|
|
|
if (realWidth > MAXWIDTH) { |
|
|
|
|
realWidth = MAXWIDTH; |
|
|
|
@ -888,50 +683,6 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setIsCloseCurrent(boolean isCloseCurrent) { |
|
|
|
|
this.isCloseCurrent = isCloseCurrent; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 关闭模板 |
|
|
|
|
* |
|
|
|
|
* @param specifiedTemplate 模板 |
|
|
|
|
*/ |
|
|
|
|
public void closeSpecifiedTemplate(JTemplate<?, ?> specifiedTemplate) { |
|
|
|
|
if (specifiedTemplate == null) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { |
|
|
|
|
specifiedTemplate.stopEditing(); |
|
|
|
|
int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", |
|
|
|
|
Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); |
|
|
|
|
if (returnVal == JOptionPane.YES_OPTION) { |
|
|
|
|
CallbackSaveWorker worker = specifiedTemplate.save(); |
|
|
|
|
worker.addSuccessCallback(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(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void closeAndFreeLock(@Nonnull JTemplate<?, ?> template) { |
|
|
|
|
FILE file = template.getEditingFILE(); |
|
|
|
|
// 只有是环境内的文件,才执行释放锁
|
|
|
|
@ -941,70 +692,6 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 后台关闭当前编辑模板 |
|
|
|
|
*/ |
|
|
|
|
public void closeCurrentTpl() { |
|
|
|
|
JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
|
|
|
|
this.setIsCloseCurrent(true); |
|
|
|
|
this.closeFormat(jTemplate); |
|
|
|
|
this.closeSpecifiedTemplate(jTemplate); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 关闭模板 |
|
|
|
|
* |
|
|
|
|
* @param closedTemplate 模板 |
|
|
|
|
*/ |
|
|
|
|
public void closeFormat(JTemplate closedTemplate) { |
|
|
|
|
//表单不需要处理
|
|
|
|
|
if (!closedTemplate.isJWorkBook()) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_NULL) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//是被参照的模板被关闭,则重置格式刷
|
|
|
|
|
closedTemplate.doConditionCancelFormat(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 关闭掉一个模板之后激活新的待显示模板 |
|
|
|
|
*/ |
|
|
|
|
public void 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; |
|
|
|
@ -1036,29 +723,6 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
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 { |
|
|
|
|
@Override |
|
|
|
|
protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { |
|
|
|
@ -1161,44 +825,13 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
closeIconIndex = getTemplateIndex(evtX); |
|
|
|
|
clodeMode = MOUSE_PRESS_CLOSE; |
|
|
|
|
//关闭close图标所在的模板{
|
|
|
|
|
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(); |
|
|
|
|
TemplateTabManager.getInstance().getCurrentOperator().closeByIndex(closeIconIndex); |
|
|
|
|
isShowList = false; |
|
|
|
|
} else { |
|
|
|
|
//没有点击关闭和ListDown按钮,则切换到点击的模板处
|
|
|
|
|
closeIconIndex = -1; |
|
|
|
|
clodeMode = CLOSE; |
|
|
|
|
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(); |
|
|
|
|
} |
|
|
|
|
TemplateTabManager.getInstance().getCurrentOperator().switchTpl(getTemplateIndex(evtX)); |
|
|
|
|
isShowList = false; |
|
|
|
|
} |
|
|
|
|
MultiTemplateTabPane.this.repaint(); |
|
|
|
@ -1209,11 +842,6 @@ 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 { |
|
|
|
|
/** |
|
|
|
|
* 鼠标拖拽 |
|
|
|
@ -1237,7 +865,7 @@ public class MultiTemplateTabPane extends JComponent {
|
|
|
|
|
|
|
|
|
|
//看是否需要显示toolTip
|
|
|
|
|
if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) { |
|
|
|
|
setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); |
|
|
|
|
setToolTipText(TemplateTabManager.getInstance().getCurrentOperator().getOpenedJTemplates().get(mouseOveredIndex).getEditingFILE().getName()); |
|
|
|
|
} else { |
|
|
|
|
setToolTipText(null); |
|
|
|
|
} |
|
|
|
|