From baf67a033b5e71eae0ca24109872b1d3963c3c4f Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Wed, 12 Sep 2018 15:21:31 +0800 Subject: [PATCH 1/3] =?UTF-8?q?REPORT-11268=20=E5=85=B3=E9=97=AD=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E4=B8=BB=E5=8A=A8=E9=87=8A=E6=94=BE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E9=94=81=EF=BC=8C=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81=EF=BC=8C?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MutilTempalteTabPane.java | 462 +++++++++--------- .../com/fr/design/file/TemplateTreePane.java | 28 +- .../main/java/com/fr/file/FileNodeFILE.java | 24 +- 3 files changed, 284 insertions(+), 230 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java index b1cb56ede..8d4ae2f2d 100644 --- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java @@ -7,6 +7,7 @@ import com.fr.base.vcs.DesignerMode; import com.fr.design.constants.UIConstants; 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.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.gui.GUICoreUtils; @@ -14,16 +15,34 @@ import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.general.ComparatorUtils; - import com.fr.log.FineLoggerFactory; import com.fr.stable.Constants; -import com.fr.stable.OperatingSystem; import com.fr.stable.ProductConstants; import com.fr.stable.project.ProjectConstants; - -import javax.swing.*; +import com.fr.third.org.apache.commons.io.FilenameUtils; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.lock.TplLockOperator; + +import javax.swing.BorderFactory; +import javax.swing.ButtonModel; +import javax.swing.Icon; +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.plaf.basic.BasicMenuItemUI; -import java.awt.*; +import java.awt.AWTEvent; +import java.awt.AlphaComposite; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.GradientPaint; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; import java.awt.event.AWTEventListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -36,13 +55,15 @@ import java.awt.geom.Line2D; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import java.io.File; +import java.util.List; /** * Author : daisy * Date: 13-8-5 * Time: 下午6:12 */ -public class MutilTempalteTabPane extends JComponent implements MouseListener, MouseMotionListener, Action { +public class MutilTempalteTabPane extends JComponent { + private static Icon LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_normal.png"); private static Icon MOUSE_OVER_LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_pressed.png"); private static Icon MOUSE_PRESS_LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_pressed.png"); @@ -50,13 +71,11 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M private static Icon MOUSE_OVER_CLOSE = BaseUtils.readIcon("/com/fr/design/images/buttonicon/mouseoverclose icon.png"); private static Icon MOUSE_PRESS_CLOSE = BaseUtils.readIcon("/com/fr/design/images/buttonicon/pressclose icon.png"); private static final String ELLIPSIS = "..."; - private static final int GAP_BEFORE_CLOSE = 10; private static final int GAP = 5; private static final int SMALLGAP = 3; private static final int LIST_BUTTON_WIDTH = 34; private static final int HEIGHT = 26; private static final int LIST_DOWN_HEIGHT = 25; - private static final double FOR_CAL_BYTES = 0.5; private static final double CORNOR_RADIUS = 0.0; //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 private static final double SPECIAL_LOCATION_1 = 2.5; @@ -86,19 +105,11 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M private int minPaintIndex = 0; private int maxPaintIndex = 0; - /** - * 鼠标按下时的坐标数组、鼠标放开时的坐标数组 - */ - private int[] xyPressedCoordinate = {0, 0}; - - //每个关闭图标的起始位置 private int[] startX; private boolean[] isNeedToolTips; - private Graphics2D g2d; - //记录关闭按钮的状态 private int closeIconIndex = -1; private boolean isCloseCurrent = false; @@ -112,26 +123,41 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M private JTemplate temTemplate = null; - private AWTEventListener awt = new AWTEventListener() { - public void eventDispatched(AWTEvent event) { - if (event instanceof MouseEvent) { - MouseEvent mv = (MouseEvent) event; - if (mv.getClickCount() > 0 && !ComparatorUtils.equals(mv.getSource(), MutilTempalteTabPane.this)) { - isShowList = false; - } - } - } - - }; - - - public static final MutilTempalteTabPane getInstance() { + public static MutilTempalteTabPane getInstance() { if (THIS == null) { THIS = new MutilTempalteTabPane(); } return THIS; } + + /** + * 多工作簿面板 + */ + public MutilTempalteTabPane() { + this.setLayout(new BorderLayout(0, 0)); + this.addMouseListener(new MultiTemplateTabMouseListener()); + this.addMouseMotionListener(new MultiTemplateTabMouseMotionListener()); + this.setBorder(null); + this.setForeground(new Color(58, 56, 58)); + this.setFont(new Font(Toolkit.i18nText("Fine-Design_Basic_Song_TypeFace"), 0, 12)); + openedTemplate = HistoryTemplateListCache.getInstance().getHistoryList(); + selectedIndex = openedTemplate.size() - 1; + AWTEventListener awt = new AWTEventListener() { + @Override + public void eventDispatched(AWTEvent event) { + if (event instanceof MouseEvent) { + MouseEvent mv = (MouseEvent) event; + if (mv.getClickCount() > 0 && !ComparatorUtils.equals(mv.getSource(), MutilTempalteTabPane.this)) { + isShowList = false; + } + } + } + + }; + java.awt.Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); + } + public JTemplate getSelectedFile() { return openedTemplate.get(selectedIndex); } @@ -152,31 +178,18 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } + @Override public Dimension getPreferredSize() { Dimension dimension = super.getPreferredSize(); dimension.height = HEIGHT; return dimension; } - /** - * 多工作簿面板 - */ - public MutilTempalteTabPane() { - this.setLayout(new BorderLayout(0, 0)); - this.addMouseListener(this); - this.addMouseMotionListener(this); - this.setBorder(null); - this.setForeground(new Color(58, 56, 58)); - this.setFont(new Font(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Song_TypeFace"), 0, 12)); - openedTemplate = HistoryTemplateListPane.getInstance().getHistoryList(); - selectedIndex = openedTemplate.size() - 1; - Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); - } - private UIMenuItem initCloseOther() { - UIMenuItem closeOther = new UIMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FS_Close_Other_Templates")); + UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_FS_Close_Other_Templates")); setListDownItemPreferredSize(closeOther); closeOther.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { if (openedTemplate.size() == 1) { return; @@ -193,11 +206,11 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M //判断关闭的模板是不是格式刷的被参照的模板 openedTemplate.remove(panes[i]); closeFormat(panes[i]); - HistoryTemplateListPane.getInstance().closeSelectedReport(panes[i]); + HistoryTemplateListCache.getInstance().closeSelectedReport(panes[i]); } } - JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - HistoryTemplateListPane.getInstance().removeAllHistory(); + JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + HistoryTemplateListCache.getInstance().removeAllHistory(); DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); THIS.repaint(); } @@ -227,6 +240,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M templates[i].setBackground(UIConstants.SHADOW_CENTER); } templates[i].addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { selectedIndex = index; tem.activeNewJTemplate(); @@ -256,7 +270,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M * * @param history 模板 */ - public void refreshOpenedTemplate(java.util.List> history) { + public void refreshOpenedTemplate(List> history) { openedTemplate = history; } @@ -271,6 +285,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M 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; @@ -278,6 +293,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } }; menu.add(new JPanel() { + @Override public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.height = 1; @@ -287,6 +303,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M separator.setForeground(UIConstants.LINE_COLOR); menu.add(separator); menu.add(new JPanel() { + @Override public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.height = 1; @@ -306,14 +323,16 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } + @Override public void paintComponent(Graphics g) { super.paintComponent(g); double maxWidth = getWidth() - LIST_BUTTON_WIDTH; //最大宽度 - g2d = (Graphics2D) g; + Graphics2D g2d = (Graphics2D) g; paintBackgroundAndLine(g2d, maxWidth); } + @Override public void paint(Graphics g) { //不可见时,按钮.4f透明 AlphaComposite composite = DesignerMode.isVcsMode() @@ -354,7 +373,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M isNeedToolTips[i - minPaintIndex] = false; } - Icon selectedIcon = null; + Icon selectedIcon; if (i == closeIconIndex) { selectedIcon = clodeMode; } else { @@ -370,7 +389,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } if (!DesignerMode.isVcsMode()) { - paintListDown(g2d, maxWidth); + paintListDown(g2d, maxWidth); } paintUnderLine(templateStartX, maxWidth, g2d); } @@ -551,7 +570,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M int closePosition = (int) templateStartX + realWidth - CLOSE.getIconWidth() - SMALLGAP; int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; if (!DesignerMode.isVcsMode()) { - closeIcon.paintIcon(this, g2d, closePosition, closeY); + closeIcon.paintIcon(this, g2d, closePosition, closeY); } return closePosition; @@ -609,7 +628,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; int closePosition = (int) templateStartX + realWidth - CLOSE.getIconWidth() - SMALLGAP; if (!DesignerMode.isVcsMode()) { - closeIcon.paintIcon(this, g2d, closePosition, closeY); + closeIcon.paintIcon(this, g2d, closePosition, closeY); } return closePosition; } @@ -642,72 +661,6 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M generalPath.closePath(); } - /** - * 点击 - * - * @param e 鼠标事件 - */ - public void mouseClicked(MouseEvent e) { - } - - /** - * 按下 - * - * @param e 鼠标事件 - */ - public void mousePressed(MouseEvent e) { - //如果在版本管理情况下,不允许切换tab - if (DesignerMode.isVcsMode()) { - return; - } - - int evtX = e.getX(); - int evtY = e.getY(); - this.setPressedXY(evtX, evtY); - - //是否点击关闭按钮 如果点击了关闭按钮,则将点击的模板关闭,不需要切换,如果没有点击关闭按钮,则切换到点击的模板处 - boolean isOverCloseIcon = isOverCloseIcon(evtX); - if (isOverListDown(evtX)) { - listDownMode = isOverListDown(evtX) ? MOUSE_PRESS_LIST_DOWN : LIST_DOWN; - if (!isShowList) { - showListDown(); - } - isShowList = !isShowList; - - } else if (isOverCloseIcon) { - //关闭按钮的图标变化 - closeIconIndex = getTemplateIndex(evtX); - clodeMode = MOUSE_PRESS_CLOSE; - //关闭close图标所在的模板{ - closeFormat(openedTemplate.get(closeIconIndex)); - closeSpecifiedTemplate(openedTemplate.get(closeIconIndex)); - DesignerContext.getDesignerFrame().getContentFrame().repaint(); - 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)); - JOptionPane.showMessageDialog(this, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") - + "!", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE); - this.repaint(); - return; - } - JTemplate evtXTemplate = openedTemplate.get(getTemplateIndex(evtX)); - evtXTemplate.activeNewJTemplate(); - } - isShowList = false; - } - this.repaint(); - - - } public void setIsCloseCurrent(boolean isCloseCurrent) { this.isCloseCurrent = isCloseCurrent; @@ -730,19 +683,32 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M filename = ((FileNodeFILE) openedTemplate.get(selectedIndex).getEditingFILE()).getEnvPath() + File.separator + filename; } - filename = OperatingSystem.isWindows() ? filename.replaceAll("/", "\\\\") : filename.replaceAll("\\\\", "/"); + filename = FilenameUtils.normalize(filename); if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { specifiedTemplate.stopEditing(); - int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", + int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", ProductConstants.PRODUCT_NAME, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - if (returnVal == JOptionPane.YES_OPTION && specifiedTemplate.saveTemplate()) { + if (returnVal == JOptionPane.YES_OPTION) { specifiedTemplate.saveTemplate(); - FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); + HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); + // release lock + if (!WorkContext.getCurrent().isLocal()) { + WorkContext.getCurrent().get(TplLockOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); + } + activeTemplate(filename); + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); + } + } else { + HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); + // release lock + if (!WorkContext.getCurrent().isLocal()) { + WorkContext.getCurrent().get(TplLockOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); } + activeTemplate(filename); + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); } - HistoryTemplateListPane.getInstance().closeSelectedReport(specifiedTemplate); - activeTemplate(filename); + } /** @@ -767,15 +733,15 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M /** * 关闭掉一个模板之后该激活的Tab * - * @param fileName + * @param fileName 关闭掉一个模板之后该激活的Tab的文件名,绝对路径 */ private void activeTemplate(String fileName) { if (openedTemplate.isEmpty()) { //新建并激活模板 DesignerContext.getDesignerFrame().addAndActivateJTemplate(); selectedIndex = 0; - //此时刚自动新建的模板在HistoryTemplateListPane的editingTemplate - temTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + //此时刚自动新建的模板在HistoryTemplateListCache的editingTemplate + temTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); } else { //如果关闭的模板是当前选中的模板,则重新激活 @@ -794,30 +760,13 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } } else { //如果关闭的模板不是当前选中的模板,则激活的模板不变 - selectedIndex = HistoryTemplateListPane.getInstance().contains(fileName); + selectedIndex = HistoryTemplateListCache.getInstance().contains(fileName); } //如果是已后台关闭的模板,则重新打开文件 openedTemplate.get(selectedIndex).activeOldJTemplate(); } } - /** - * 鼠标释放 - * - * @param e 鼠标事件 - */ - public void mouseReleased(MouseEvent e) { - } - - /** - * 鼠标进入 - * - * @param e 鼠标事件 - */ - public void mouseEntered(MouseEvent e) { - - } - private boolean isOverCloseIcon(int evtX) { boolean isOverCloseIcon = false; @@ -849,76 +798,6 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M return -1; } - /** - * 鼠标离开 - * - * @param e 鼠标事件 - */ - public void mouseExited(MouseEvent e) { - listDownMode = LIST_DOWN; - closeIconIndex = -1; - mouseOveredIndex = -1; - this.repaint(); - } - - /** - * 鼠标拖拽 - * - * @param e 鼠标事件 - */ - public void mouseDragged(MouseEvent e) { - } - - /** - * 鼠标移动 - * - * @param e 鼠标事件 - */ - public void mouseMoved(MouseEvent e) { - int evtX = e.getX(); - mouseOveredIndex = getTemplateIndex(evtX); - - //看是否需要显示toolTip - if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) { - setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); - } else { - setToolTipText(null); - } - - listDownMode = isOverListDown(evtX) ? MOUSE_OVER_LIST_DOWN : LIST_DOWN; - - boolean isOverCloseIcon = isOverCloseIcon(evtX); - clodeMode = isOverCloseIcon ? MOUSE_OVER_CLOSE : CLOSE; - closeIconIndex = isOverCloseIcon ? mouseOveredIndex : -1; - this.repaint(); - } - - - private void setPressedXY(int x, int y) { - this.xyPressedCoordinate[0] = x; - this.xyPressedCoordinate[1] = y; - } - - public Object getValue(String key) { - return null; - } - - /** - * 加入值 - * - * @param key 键 - * @param value 值 - */ - public void putValue(String key, Object value) { - } - - /** - * 动作 - * - * @param e 事件 - */ - public void actionPerformed(ActionEvent e) { - } /** * 处理自动新建的模板 在切换时的处理 @@ -926,7 +805,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M public void doWithtemTemplate() { //temtemplate保存的一定是手动新建的没有编辑或是编辑了没有保存的模板 //没有保存,说明有编辑;已经保存在磁盘里的文件,说明有过处理,并且已经保存,此时切换都不将其自动关闭 - if (temTemplate == null || temTemplate == HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()) { + if (temTemplate == null || temTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) { return; } @@ -936,9 +815,9 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M //自动新建的模板B若没有进行任何编辑(新建模板没有进行任何编辑时saved都是true):还没有存盘 if (temTemplate != null && temTemplate.getEditingFILE().isMemFile() && temTemplate.isSaved()) { - HistoryTemplateListPane.getInstance().closeSelectedReport(temTemplate); + HistoryTemplateListCache.getInstance().closeSelectedReport(temTemplate); temTemplate = null; - setSelectedIndex(HistoryTemplateListPane.getInstance().contains(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate())); + setSelectedIndex(HistoryTemplateListCache.getInstance().contains(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate())); } } @@ -970,5 +849,146 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } } + private class MultiTemplateTabMouseListener implements MouseListener { + + + /** + * 鼠标进入 + * + * @param e 鼠标事件 + */ + @Override + public void mouseEntered(MouseEvent e) { + + } + + /** + * 鼠标离开 + * + * @param e 鼠标事件 + */ + @Override + public void mouseExited(MouseEvent e) { + listDownMode = LIST_DOWN; + closeIconIndex = -1; + mouseOveredIndex = -1; + MutilTempalteTabPane.this.repaint(); + } + + /** + * 鼠标释放 + * + * @param e 鼠标事件 + */ + @Override + public void mouseReleased(MouseEvent e) { + } + + /** + * 点击 + * + * @param e 鼠标事件 + */ + @Override + public void mouseClicked(MouseEvent e) { + } + + /** + * 按下 + * + * @param e 鼠标事件 + */ + @Override + public void mousePressed(MouseEvent e) { + //如果在版本管理情况下,不允许切换tab + if (DesignerMode.isVcsMode()) { + return; + } + + int evtX = e.getX(); + + //是否点击关闭按钮 如果点击了关闭按钮,则将点击的模板关闭,不需要切换,如果没有点击关闭按钮,则切换到点击的模板处 + boolean isOverCloseIcon = isOverCloseIcon(evtX); + if (isOverListDown(evtX)) { + listDownMode = isOverListDown(evtX) ? MOUSE_PRESS_LIST_DOWN : LIST_DOWN; + if (!isShowList) { + showListDown(); + } + isShowList = !isShowList; + + } else if (isOverCloseIcon) { + //关闭按钮的图标变化 + closeIconIndex = getTemplateIndex(evtX); + clodeMode = MOUSE_PRESS_CLOSE; + //关闭close图标所在的模板{ + closeFormat(openedTemplate.get(closeIconIndex)); + closeSpecifiedTemplate(openedTemplate.get(closeIconIndex)); + DesignerContext.getDesignerFrame().getContentFrame().repaint(); + 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)); + JOptionPane.showMessageDialog(MutilTempalteTabPane.this, Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") + + "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE); + MutilTempalteTabPane.this.repaint(); + return; + } + JTemplate evtXTemplate = openedTemplate.get(getTemplateIndex(evtX)); + evtXTemplate.activeNewJTemplate(); + } + isShowList = false; + } + MutilTempalteTabPane.this.repaint(); + + + } + + + } + + private class MultiTemplateTabMouseMotionListener implements MouseMotionListener { + /** + * 鼠标拖拽 + * + * @param e 鼠标事件 + */ + @Override + public void mouseDragged(MouseEvent e) { + } + + /** + * 鼠标移动 + * + * @param e 鼠标事件 + */ + @Override + public void mouseMoved(MouseEvent e) { + int evtX = e.getX(); + mouseOveredIndex = getTemplateIndex(evtX); + + //看是否需要显示toolTip + if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) { + setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); + } else { + setToolTipText(null); + } + + listDownMode = isOverListDown(evtX) ? MOUSE_OVER_LIST_DOWN : LIST_DOWN; + + boolean isOverCloseIcon = isOverCloseIcon(evtX); + clodeMode = isOverCloseIcon ? MOUSE_OVER_CLOSE : CLOSE; + closeIconIndex = isOverCloseIcon ? mouseOveredIndex : -1; + MutilTempalteTabPane.this.repaint(); + } + } + } diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index fbe7d4eca..38c9b1da7 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -22,6 +22,7 @@ import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; +import com.fr.workspace.server.lock.TplLockOperator; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -302,17 +303,28 @@ public class TemplateTreePane extends JPanel implements FileOperations { } private boolean deleteNodes(Collection nodes) { + + boolean isLocal = WorkContext.getCurrent().isLocal(); + boolean success = true; for (ExpandMutableTreeNode treeNode : nodes) { Object node = treeNode.getUserObject(); if (node instanceof FileNode) { FileNodeFILE nodeFILE = new FileNodeFILE((FileNode) node); if (nodeFILE.exists()) { - FileAssistUtilsOperator fileAssistUtils = WorkContext.getCurrent().get(FileAssistUtilsOperator.class); - if (fileAssistUtils.moveToTrash(nodeFILE.getPath())) { - HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); + if (isLocal) { + FileAssistUtilsOperator fileAssistUtils = WorkContext.getCurrent().get(FileAssistUtilsOperator.class); + if (fileAssistUtils.moveToTrash(nodeFILE.getPath())) { + HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); + } else { + success = false; + } } else { - success = false; + if (WorkContext.getCurrent().get(TplLockOperator.class).delete(nodeFILE.getPath())) { + HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); + } else { + success = false; + } } } } @@ -410,8 +422,12 @@ public class TemplateTreePane extends JPanel implements FileOperations { } try { - // com.fr.io.utils.ResourceIOUtils 接收的是WEB-INF下的路径 - return WorkContext.getWorkResource().rename(from, to); + if (WorkContext.getCurrent().isLocal()) { + // com.fr.io.utils.ResourceIOUtils 接收的是WEB-INF下的路径 + return WorkContext.getWorkResource().rename(from, to); + } else { + return WorkContext.getCurrent().get(TplLockOperator.class).rename(from, to); + } } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); return false; diff --git a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java index d077a342e..ab1dfa091 100644 --- a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java +++ b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java @@ -15,6 +15,7 @@ import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; import com.fr.workspace.resource.WorkResourceTempRenameStream; +import com.fr.workspace.server.lock.TplLockOperator; import javax.swing.Icon; import java.io.ByteArrayInputStream; @@ -356,9 +357,26 @@ public class FileNodeFILE implements FILE { if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { return null; } - - InputStream in = new ByteArrayInputStream(WorkContext.getWorkResource().readFully(StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1)))); - + InputStream in; + if (WorkContext.getCurrent().isLocal()) { + in = new ByteArrayInputStream( + WorkContext.getWorkResource().readFully( + StableUtils.pathJoin( + ProjectConstants.REPORTLETS_NAME, + envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1) + ) + ) + ); + } else { + in = new ByteArrayInputStream( + WorkContext.getCurrent().get(TplLockOperator.class).readAndLockFile( + StableUtils.pathJoin( + ProjectConstants.REPORTLETS_NAME, + envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1) + ) + ) + ); + } return envPath.endsWith(".cpt") || envPath.endsWith(".frm") ? XMLEncryptUtils.decodeInputStream(in) : in; } From 366810a296087a7ff8c59e687dc8ba3275ec87f9 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Wed, 12 Sep 2018 17:07:44 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MutilTempalteTabPane.java | 12 ++--- .../com/fr/design/file/TemplateTreePane.java | 26 +++------ .../main/java/com/fr/file/FileNodeFILE.java | 31 ++++------- .../java/com/fr/env/RemoteEnvPaneTest.java | 54 +++++++++++++++++++ 4 files changed, 75 insertions(+), 48 deletions(-) create mode 100644 designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java index 8d4ae2f2d..fc71d031b 100644 --- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java @@ -21,7 +21,7 @@ import com.fr.stable.ProductConstants; import com.fr.stable.project.ProjectConstants; import com.fr.third.org.apache.commons.io.FilenameUtils; import com.fr.workspace.WorkContext; -import com.fr.workspace.server.lock.TplLockOperator; +import com.fr.workspace.server.lock.TplOperator; import javax.swing.BorderFactory; import javax.swing.ButtonModel; @@ -693,18 +693,16 @@ public class MutilTempalteTabPane extends JComponent { specifiedTemplate.saveTemplate(); HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); // release lock - if (!WorkContext.getCurrent().isLocal()) { - WorkContext.getCurrent().get(TplLockOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); - } + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); + activeTemplate(filename); FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); } } else { HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); // release lock - if (!WorkContext.getCurrent().isLocal()) { - WorkContext.getCurrent().get(TplLockOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); - } + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); + activeTemplate(filename); FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); } diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index 38c9b1da7..61d071e00 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -4,7 +4,6 @@ package com.fr.design.file; import com.fr.base.FRContext; -import com.fr.base.io.FileAssistUtilsOperator; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.itree.filetree.TemplateFileTree; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; @@ -22,7 +21,7 @@ import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; -import com.fr.workspace.server.lock.TplLockOperator; +import com.fr.workspace.server.lock.TplOperator; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -312,19 +311,10 @@ public class TemplateTreePane extends JPanel implements FileOperations { if (node instanceof FileNode) { FileNodeFILE nodeFILE = new FileNodeFILE((FileNode) node); if (nodeFILE.exists()) { - if (isLocal) { - FileAssistUtilsOperator fileAssistUtils = WorkContext.getCurrent().get(FileAssistUtilsOperator.class); - if (fileAssistUtils.moveToTrash(nodeFILE.getPath())) { - HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); - } else { - success = false; - } + if (WorkContext.getCurrent().get(TplOperator.class).delete(nodeFILE.getPath())) { + HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); } else { - if (WorkContext.getCurrent().get(TplLockOperator.class).delete(nodeFILE.getPath())) { - HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); - } else { - success = false; - } + success = false; } } } @@ -422,12 +412,8 @@ public class TemplateTreePane extends JPanel implements FileOperations { } try { - if (WorkContext.getCurrent().isLocal()) { - // com.fr.io.utils.ResourceIOUtils 接收的是WEB-INF下的路径 - return WorkContext.getWorkResource().rename(from, to); - } else { - return WorkContext.getCurrent().get(TplLockOperator.class).rename(from, to); - } + // 接收的是WEB-INF下的路径 + return WorkContext.getCurrent().get(TplOperator.class).rename(from, to); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); return false; diff --git a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java index ab1dfa091..84724df35 100644 --- a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java +++ b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java @@ -15,7 +15,7 @@ import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; import com.fr.workspace.resource.WorkResourceTempRenameStream; -import com.fr.workspace.server.lock.TplLockOperator; +import com.fr.workspace.server.lock.TplOperator; import javax.swing.Icon; import java.io.ByteArrayInputStream; @@ -357,26 +357,15 @@ public class FileNodeFILE implements FILE { if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { return null; } - InputStream in; - if (WorkContext.getCurrent().isLocal()) { - in = new ByteArrayInputStream( - WorkContext.getWorkResource().readFully( - StableUtils.pathJoin( - ProjectConstants.REPORTLETS_NAME, - envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1) - ) - ) - ); - } else { - in = new ByteArrayInputStream( - WorkContext.getCurrent().get(TplLockOperator.class).readAndLockFile( - StableUtils.pathJoin( - ProjectConstants.REPORTLETS_NAME, - envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1) - ) - ) - ); - } + InputStream in = new ByteArrayInputStream( + WorkContext.getCurrent().get(TplOperator.class).readAndLockFile( + StableUtils.pathJoin( + ProjectConstants.REPORTLETS_NAME, + envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1) + ) + ) + ); + return envPath.endsWith(".cpt") || envPath.endsWith(".frm") ? XMLEncryptUtils.decodeInputStream(in) : in; } diff --git a/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java b/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java new file mode 100644 index 000000000..bd5ee3379 --- /dev/null +++ b/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java @@ -0,0 +1,54 @@ +package com.fr.env; + +import org.fest.swing.annotation.RunsInEDT; +import org.fest.swing.core.ComponentLookupScope; +import org.fest.swing.core.Robot; +import org.fest.swing.edt.GuiQuery; +import org.fest.swing.fixture.JPanelFixture; +import org.fest.swing.junit.testcase.FestSwingJUnitTestCase; +import org.junit.Test; + +import javax.swing.JFrame; +import javax.swing.WindowConstants; + +import static org.fest.swing.edt.GuiActionRunner.execute; + +public class RemoteEnvPaneTest extends FestSwingJUnitTestCase { + + @Override + protected void onSetUp() { + + } + + @Test + public void test() { + + Robot robot = robot(); + + robot.settings().componentLookupScope(ComponentLookupScope.ALL); + + JPanelFixture rootFixture = new JPanelFixture(robot, createNewEditor()); + rootFixture.checkBox("httpsCheckbox").check(); + + rootFixture.checkBox("httpsCheckbox").requireSelected(); + } + + @RunsInEDT + private static RemoteEnvPane createNewEditor() { + + return execute(new GuiQuery() { + @Override + protected RemoteEnvPane executeInEDT() { + RemoteEnvPane envPane = new RemoteEnvPane(); + JFrame frame = new JFrame(); + frame.getContentPane().add(envPane); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + frame.setResizable(false); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + return envPane; + } + }); + } +} From 5d8a420ca5d8ff2bab69688e9d3533124b3a5876 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Wed, 12 Sep 2018 17:30:28 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E8=BF=98=E6=B2=A1=E5=86=99?= =?UTF-8?q?=E5=AE=8C=EF=BC=8C=E5=85=88=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/env/RemoteEnvPaneTest.java | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java b/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java index bd5ee3379..d2bf95220 100644 --- a/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java +++ b/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java @@ -1,54 +1,54 @@ -package com.fr.env; - -import org.fest.swing.annotation.RunsInEDT; -import org.fest.swing.core.ComponentLookupScope; -import org.fest.swing.core.Robot; -import org.fest.swing.edt.GuiQuery; -import org.fest.swing.fixture.JPanelFixture; -import org.fest.swing.junit.testcase.FestSwingJUnitTestCase; -import org.junit.Test; - -import javax.swing.JFrame; -import javax.swing.WindowConstants; - -import static org.fest.swing.edt.GuiActionRunner.execute; - -public class RemoteEnvPaneTest extends FestSwingJUnitTestCase { - - @Override - protected void onSetUp() { - - } - - @Test - public void test() { - - Robot robot = robot(); - - robot.settings().componentLookupScope(ComponentLookupScope.ALL); - - JPanelFixture rootFixture = new JPanelFixture(robot, createNewEditor()); - rootFixture.checkBox("httpsCheckbox").check(); - - rootFixture.checkBox("httpsCheckbox").requireSelected(); - } - - @RunsInEDT - private static RemoteEnvPane createNewEditor() { - - return execute(new GuiQuery() { - @Override - protected RemoteEnvPane executeInEDT() { - RemoteEnvPane envPane = new RemoteEnvPane(); - JFrame frame = new JFrame(); - frame.getContentPane().add(envPane); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - frame.setResizable(false); - frame.pack(); - frame.setLocationRelativeTo(null); - frame.setVisible(true); - return envPane; - } - }); - } -} +//package com.fr.env; +// +//import org.fest.swing.annotation.RunsInEDT; +//import org.fest.swing.core.ComponentLookupScope; +//import org.fest.swing.core.Robot; +//import org.fest.swing.edt.GuiQuery; +//import org.fest.swing.fixture.JPanelFixture; +//import org.fest.swing.junit.testcase.FestSwingJUnitTestCase; +//import org.junit.Test; +// +//import javax.swing.JFrame; +//import javax.swing.WindowConstants; +// +//import static org.fest.swing.edt.GuiActionRunner.execute; +// +//public class RemoteEnvPaneTest extends FestSwingJUnitTestCase { +// +// @Override +// protected void onSetUp() { +// +// } +// +// @Test +// public void test() { +// +// Robot robot = robot(); +// +// robot.settings().componentLookupScope(ComponentLookupScope.ALL); +// +// JPanelFixture rootFixture = new JPanelFixture(robot, createNewEditor()); +// rootFixture.checkBox("httpsCheckbox").check(); +// +// rootFixture.checkBox("httpsCheckbox").requireSelected(); +// } +// +// @RunsInEDT +// private static RemoteEnvPane createNewEditor() { +// +// return execute(new GuiQuery() { +// @Override +// protected RemoteEnvPane executeInEDT() { +// RemoteEnvPane envPane = new RemoteEnvPane(); +// JFrame frame = new JFrame(); +// frame.getContentPane().add(envPane); +// frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); +// frame.setResizable(false); +// frame.pack(); +// frame.setLocationRelativeTo(null); +// frame.setVisible(true); +// return envPane; +// } +// }); +// } +//}