From 0ca79cdb531e97a952188a1b6da742c6358b33af Mon Sep 17 00:00:00 2001 From: "Qinghui.Liu" Date: Thu, 25 Feb 2021 09:55:46 +0800 Subject: [PATCH 01/49] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/images/bbs/bbs_normal.svg | 2 +- .../images/buttonicon/prewidget_normal.svg | 8 ++++++++ .../images/buttonicon/widget/files_up_normal.svg | 7 +++++++ .../design/images/control/addPopup_disabled.svg | 16 ++++++++++++++++ .../fr/design/images/control/addPopup_normal.svg | 14 ++++++++++++++ .../fr/design/images/control/edit_disabled.svg | 8 ++++++++ .../com/fr/design/images/control/edit_normal.svg | 8 ++++++++ .../fr/design/images/control/remove_disabled.svg | 11 +++++++++++ .../fr/design/images/control/remove_normal.svg | 9 +++++++++ .../fr/design/images/m_file/preview_disabled.svg | 11 +++++++++++ .../fr/design/images/m_file/preview_normal.svg | 9 +++++++++ 11 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 designer-base/src/main/resources/com/fr/design/images/buttonicon/prewidget_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/buttonicon/widget/files_up_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/control/addPopup_disabled.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/control/addPopup_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/control/edit_disabled.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/control/edit_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/control/remove_disabled.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/control/remove_normal.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/m_file/preview_disabled.svg create mode 100644 designer-base/src/main/resources/com/fr/design/images/m_file/preview_normal.svg diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/bbs_normal.svg b/designer-base/src/main/resources/com/fr/design/images/bbs/bbs_normal.svg index ae72bfa4db..4a9711e356 100644 --- a/designer-base/src/main/resources/com/fr/design/images/bbs/bbs_normal.svg +++ b/designer-base/src/main/resources/com/fr/design/images/bbs/bbs_normal.svg @@ -4,4 +4,4 @@ - + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/buttonicon/prewidget_normal.svg b/designer-base/src/main/resources/com/fr/design/images/buttonicon/prewidget_normal.svg new file mode 100644 index 0000000000..542c02c268 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/buttonicon/prewidget_normal.svg @@ -0,0 +1,8 @@ + + + icon_控件管理 有小箭头_normal + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/buttonicon/widget/files_up_normal.svg b/designer-base/src/main/resources/com/fr/design/images/buttonicon/widget/files_up_normal.svg new file mode 100644 index 0000000000..34cd6083a8 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/buttonicon/widget/files_up_normal.svg @@ -0,0 +1,7 @@ + + + icon_控件_文件控件_normal + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/control/addPopup_disabled.svg b/designer-base/src/main/resources/com/fr/design/images/control/addPopup_disabled.svg new file mode 100644 index 0000000000..d48e1a27bb --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/control/addPopup_disabled.svg @@ -0,0 +1,16 @@ + + + 编组 + + + + + + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/control/addPopup_normal.svg b/designer-base/src/main/resources/com/fr/design/images/control/addPopup_normal.svg new file mode 100644 index 0000000000..8cec802fee --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/control/addPopup_normal.svg @@ -0,0 +1,14 @@ + + + 编组备份 + + + + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/control/edit_disabled.svg b/designer-base/src/main/resources/com/fr/design/images/control/edit_disabled.svg new file mode 100644 index 0000000000..9b001cfc5f --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/control/edit_disabled.svg @@ -0,0 +1,8 @@ + + + icon_编辑_disable + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/control/edit_normal.svg b/designer-base/src/main/resources/com/fr/design/images/control/edit_normal.svg new file mode 100644 index 0000000000..2917194523 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/control/edit_normal.svg @@ -0,0 +1,8 @@ + + + icon_编辑_normal + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/control/remove_disabled.svg b/designer-base/src/main/resources/com/fr/design/images/control/remove_disabled.svg new file mode 100644 index 0000000000..b57f9a853d --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/control/remove_disabled.svg @@ -0,0 +1,11 @@ + + + icon_删除_normal + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/control/remove_normal.svg b/designer-base/src/main/resources/com/fr/design/images/control/remove_normal.svg new file mode 100644 index 0000000000..b09268f454 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/control/remove_normal.svg @@ -0,0 +1,9 @@ + + + icon_删除_normal备份 + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/m_file/preview_disabled.svg b/designer-base/src/main/resources/com/fr/design/images/m_file/preview_disabled.svg new file mode 100644 index 0000000000..3edcffdc6d --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/m_file/preview_disabled.svg @@ -0,0 +1,11 @@ + + + icon_报表web属性_打印预览_normal + + + + + + + + \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/m_file/preview_normal.svg b/designer-base/src/main/resources/com/fr/design/images/m_file/preview_normal.svg new file mode 100644 index 0000000000..a290737122 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/m_file/preview_normal.svg @@ -0,0 +1,9 @@ + + + icon_报表web属性_打印预览_normal备份 + + + + + + \ No newline at end of file From bf9b0880d38b98ce4c7d06328e91a0fa27774dd9 Mon Sep 17 00:00:00 2001 From: "Qinghui.Liu" Date: Thu, 25 Feb 2021 10:20:47 +0800 Subject: [PATCH 02/49] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../submit/SmartInsertDBManipulationPane.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java index d306bb1793..3fe1268793 100644 --- a/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java +++ b/designer-realize/src/main/java/com/fr/design/write/submit/SmartInsertDBManipulationPane.java @@ -310,9 +310,9 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { // 单元格组要记录下之前的选中情况 private CellSelection oriCellSelection = null; - private List newAdd = new ArrayList(); + private List newAdd = new ArrayList<>(); - private List oldAdd = new ArrayList(); + private List oldAdd = new ArrayList<>(); public SmartJTablePane4DB(KeyColumnTableModel model, ElementCasePane actionReportPane) { this(model, actionReportPane, false); @@ -433,7 +433,8 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { if (!allColumnRow.contains(columnRow.toString())) { add.addColumnRow(columnRow); } - + // 重新更换区域框选单元格后 清理历史框选 + oldAdd.clear(); } if (add.getSize() > 0) { @@ -459,10 +460,11 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { TemplateCellElement cellElement = ePane.getEditingElementCase().getTemplateCellElement(c + i, r + j); if (cellElement != null && ((i + c) != 0 || (r + j) != 0)) { String value = cellElement.toString(); - if (!newAdd.contains(value) && !allColumnRow.contains(value)) { - add.addColumnRow(ColumnRow.valueOf(value)); + ColumnRow columnRow = ColumnRow.valueOf(value); + if (!newAdd.contains(columnRow) && !allColumnRow.contains(value)) { + add.addColumnRow(columnRow); } - newAdd.add(value); + newAdd.add(columnRow); } if (cellElement == null) { @@ -470,16 +472,14 @@ public class SmartInsertDBManipulationPane extends DBManipulationPane { if (!allColumnRow.contains(columnRow.toString())) { add.addColumnRow(columnRow); } - newAdd.add(columnRow.toString()); + newAdd.add(columnRow); } } } - int oldSize = oldAdd.size(); - int newSize = newAdd.size(); - if (oldSize > newSize && oldAdd.containsAll(newAdd)) { - int diff = oldSize - newSize; - newValue.splice(newValue.getSize() - diff, diff); - } + // 计算出前后两次选中的差值 + oldAdd.removeAll(newAdd); + // 移除差值部分 + newValue.removeAll(oldAdd); oldAdd.clear(); oldAdd.addAll(newAdd); } From bc700703fc98f626511dc746f2e060a2eed2942b Mon Sep 17 00:00:00 2001 From: Yvan Date: Fri, 26 Mar 2021 17:13:42 +0800 Subject: [PATCH 03/49] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/images/m_file/preview_disable.svg | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 designer-base/src/main/resources/com/fr/design/images/m_file/preview_disable.svg diff --git a/designer-base/src/main/resources/com/fr/design/images/m_file/preview_disable.svg b/designer-base/src/main/resources/com/fr/design/images/m_file/preview_disable.svg deleted file mode 100644 index 2d64f68f70..0000000000 --- a/designer-base/src/main/resources/com/fr/design/images/m_file/preview_disable.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - icon_报表web属性_打印预览_normal - - - - - - - - From bf587d0af4d2b454b58f3be7f4c46abd02de87fa Mon Sep 17 00:00:00 2001 From: xiqiu Date: Fri, 9 Apr 2021 14:49:57 +0800 Subject: [PATCH 04/49] =?UTF-8?q?REPORT-49023=20=20=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E7=95=8C=E9=9D=A2=E6=8A=A5=E9=94=99=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connect/DatabaseConnectionPane.java | 307 +++++++++++++----- .../java/com/fr/design/gui/UILookAndFeel.java | 8 +- .../lookandfeel/Icon_Narrow_Down_16x16.png | Bin 0 -> 162 bytes .../lookandfeel/Icon_Narrow_Right_16x16.png | Bin 0 -> 153 bytes .../Information_Icon_Error_32x32.png | Bin 752 -> 760 bytes 5 files changed, 225 insertions(+), 90 deletions(-) create mode 100644 designer-base/src/main/resources/com/fr/design/images/lookandfeel/Icon_Narrow_Down_16x16.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/lookandfeel/Icon_Narrow_Right_16x16.png diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index f6bfdd29a7..436849936e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -7,6 +7,9 @@ import com.fr.data.impl.Connection; import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.impl.JNDIDatabaseConnection; import com.fr.data.operator.DataOperator; +import com.fr.data.solution.ExceptionSolutionSelector; +import com.fr.data.solution.processor.ClassNotFoundExceptionSolutionProcessor; +import com.fr.data.solution.processor.SolutionProcessor; import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; @@ -15,7 +18,6 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.scrollruler.ModLineBorder; import com.fr.design.utils.gui.GUICoreUtils; - import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; import com.fr.stable.EncodeConstants; @@ -25,19 +27,28 @@ import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JDialog; import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.UIManager; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Desktop; import java.awt.Dialog; import java.awt.Dimension; import java.awt.FlowLayout; +import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.util.HashMap; -import java.util.Map; +import java.net.URI; import java.util.concurrent.ExecutionException; /** @@ -50,6 +61,11 @@ public abstract class DatabaseConnectionPane connectionThread = new SwingWorker() { + @Override + protected Void doInBackground() throws Exception { + Connection database = DatabaseConnectionPane.this.updateBean(); + // 返回连接结果 + DataOperator.getInstance().testConnectionWithException(database); + return null; + } + + @Override + protected void done() { + try { + get(); + dialog.setSize(new Dimension(380, 118)); + okButton.setEnabled(true); + uiLabel.setIcon(UIManager.getIcon("OptionPane.informationIcon")); + message.setText(Toolkit.i18nText("Fine-Design_Basic_Datasource_Connection_Successfully")); + } catch (InterruptedException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } catch (ExecutionException e) { + dialog.setSize(new Dimension(380, 142)); + midPane.setVisible(true); + hiddenPanel.setVisible(false); + okButton.setEnabled(true); + uiLabel.setIcon(UIManager.getIcon("OptionPane.errorIcon")); + message.setText(Toolkit.i18nText("Fine-Design_Basic_Connection_Failed")); + + SolutionProcessor select = ExceptionSolutionSelector.get().select(e); + if (select instanceof ClassNotFoundExceptionSolutionProcessor) { + JPanel gridJpanel = new JPanel(); + gridJpanel.setLayout(new GridLayout(5, 1, 0, 5)); + UILabel driverTips = new UILabel(); + driverTips.setText(Toolkit.i18nText("Fine_Designer_Not_Found_Driver")); + gridJpanel.add(driverTips); + UILabel deatail = new UILabel(); + String content = Toolkit.i18nText("Fine_Designer_Not_Found") + select.getResultException().getDetailMessage() + Toolkit.i18nText("Fine_Designer_Driver"); + deatail.setText(content); + deatail.setToolTipText(content); + gridJpanel.add(deatail); + UILabel redirect = new UILabel(); + redirect.setText(Toolkit.i18nText("Fine_Designer_Download_Driver")); + redirect.setForeground(Color.BLUE); + + redirect.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + try { + Desktop.getDesktop().browse(new URI(select.getResultException().getSolution())); + } catch (Exception clickException) { + FineLoggerFactory.getLogger().warn("can not open browser with {}", select.getResultException().getSolution()); + } + } + + @Override + public void mouseEntered(MouseEvent e) { + redirect.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + } + + @Override + public void mouseExited(MouseEvent e) { + redirect.setCursor(Cursor.getDefaultCursor()); + } + }); + gridJpanel.add(redirect); + hiddenPanel.add(gridJpanel); + gridJpanel.setBackground(Color.WHITE); + } else { + JPanel borderPanel = new JPanel(); + borderPanel.setLayout(new BorderLayout()); + JTextArea jta = new JTextArea(); + JScrollPane jsp = new JScrollPane(jta); + jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + jta.append(select.getResultException().getDetailMessage() + "\n"); + jta.append(select.getResultException().getSolution()); + jta.setCaretPosition(0); + jta.setEditable(false); + jta.getCaret().addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + jta.getCaret().setVisible(true); + } + }); + borderPanel.add(jsp, BorderLayout.CENTER); + hiddenPanel.add(borderPanel); + } + okButton.setEnabled(true); + } + } + }; + midPane.setVisible(false); + hiddenPanel.setVisible(false); + initDialogPane(); + connectionThread.execute(); + // 老bug,initDialogPane 中的 dialog每次都是new的,所以可以重新添加 listener,但是其他的对象不行,会多次添加listener + if (firstCreate) { + okButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + hiddenPanel.removeAll(); + dialog.dispose(); + } + }); + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + hiddenPanel.removeAll(); + dialog.dispose(); + connectionThread.cancel(true); + } + }); + detailLabel.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (hiddenPanel.isVisible()) { + hiddenPanel.setVisible(false); + dialog.setSize(new Dimension(380, 142)); + detailLabel.setText(Toolkit.i18nText("Fine_Designer_Look_Detail")); + directUiLabel.setIcon(UIManager.getIcon("OptionPane.narrow.right")); + } else { + dialog.setSize(new Dimension(380, 260)); + hiddenPanel.setVisible(true); + detailLabel.setText(Toolkit.i18nText("Fine_Designer_Hide_Detail")); + directUiLabel.setIcon(UIManager.getIcon("OptionPane.narrow.down")); + } + } + + @Override + public void mouseEntered(MouseEvent e) { + detailLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + } + + @Override + public void mouseExited(MouseEvent e) { + detailLabel.setCursor(Cursor.getDefaultCursor()); + } + }); + firstCreate = false; + } + dialog.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + connectionThread.cancel(true); + } + }); + dialog.setVisible(true); + hiddenPanel.removeAll(); + dialog.dispose(); + } + }; protected abstract JPanel mainPanel(); @@ -127,83 +270,72 @@ public abstract class DatabaseConnectionPane connectionThread = new SwingWorker() { - @Override - protected Boolean doInBackground() throws Exception { - Connection database = DatabaseConnectionPane.this.updateBean(); - // 返回连接结果 - return DataOperator.getInstance().testConnection(database); - } - - @Override - protected void done() { - try { - boolean connect = get(); - okButton.setEnabled(true); - if (connect) { - uiLabel.setIcon(UIManager.getIcon("OptionPane.informationIcon")); - message.setText(Toolkit.i18nText("Fine-Design_Basic_Datasource_Connection_Successfully")); - }else{ - uiLabel.setIcon(UIManager.getIcon("OptionPane.errorIcon")); - message.setText(Toolkit.i18nText("Fine-Design_Basic_Connection_Failed")); - } - } catch (InterruptedException | ExecutionException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - }; - - connectionThread.execute(); - initDialogPane(); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - dialog.dispose(); - } - }); - cancelButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - dialog.dispose(); - connectionThread.cancel(true); - } - }); + protected void initComponents() { + message = new UILabel(); + uiLabel = new UILabel(); + detailLabel = new UILabel(); + directUiLabel = new UILabel(); + hiddenPanel = new JPanel(); + midPane = new JPanel(); + midPane.add(directUiLabel); + midPane.add(detailLabel); + okButton = new UIButton(Toolkit.i18nText("Fine-Design_Report_OK")); + cancelButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Cancel")); + String[] defaultEncode = new String[]{Toolkit.i18nText("Fine-Design_Encode_Auto")}; + charSetComboBox = new UIComboBox(ArrayUtils.addAll(defaultEncode, EncodeConstants.ENCODING_ARRAY)); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel northPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + this.add(northPane, BorderLayout.NORTH); - dialog.addWindowListener(new WindowAdapter() { - public void windowClosed(WindowEvent e) { - connectionThread.cancel(true); - } - }); + // 按钮. + JPanel testPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); + northPane.add(testPane, BorderLayout.NORTH); + UIButton testButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Datasource_Test_Connection")); + testPane.add(testButton); + testButton.addActionListener(testConnectionActionListener); + testPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 3, 4)); - dialog.setVisible(true); - dialog.dispose(); - } - }; + // Center + northPane.add(mainPanel(), BorderLayout.CENTER); + // ChartSet + JPanel chartSetPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); + northPane.add(chartSetPane); + chartSetPane.setBorder(BorderFactory.createTitledBorder( + new ModLineBorder(ModLineBorder.TOP), + Toolkit.i18nText("Fine-Design_Basic_Advanced") + )); + chartSetPane.add(GUICoreUtils.createNamedPane(charSetComboBox, Toolkit.i18nText("Fine-Design_Basic_Datasource_Charset") + ":")); + } private void initDialogPane() { message.setText(Toolkit.i18nText("Fine-Design_Basic_Datasource_Test_Connection") + "..."); message.setBorder(BorderFactory.createEmptyBorder(8, 5, 0, 0)); okButton.setEnabled(false); - dialog = new JDialog((Dialog) SwingUtilities.getWindowAncestor(DatabaseConnectionPane.this), Toolkit.i18nText("Fine-Design_Basic_Datasource_Test_Connection"), true); - dialog.setSize(new Dimension(268, 118)); + dialog.setSize(new Dimension(380, 118)); okButton.setEnabled(false); JPanel jp = new JPanel(); JPanel upPane = new JPanel(); JPanel downPane = new JPanel(); uiLabel = new UILabel(UIManager.getIcon("OptionPane.informationIcon")); - upPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10)); upPane.add(uiLabel); upPane.add(message); - downPane.setLayout(new FlowLayout(FlowLayout.CENTER, 6, 0)); + midPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 0)); + directUiLabel.setIcon(UIManager.getIcon("OptionPane.narrow.right")); + detailLabel.setText(Toolkit.i18nText("Fine_Designer_Look_Detail")); + detailLabel.setForeground(Color.BLUE); + hiddenPanel.setLayout(new BorderLayout(10, 0)); + hiddenPanel.add(new JPanel(), BorderLayout.WEST); + hiddenPanel.add(new JPanel(), BorderLayout.EAST); + downPane.setLayout(new FlowLayout(FlowLayout.CENTER, 6, 9)); downPane.add(okButton); downPane.add(cancelButton); jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS)); jp.add(upPane); + jp.add(midPane); + jp.add(hiddenPanel); jp.add(downPane); dialog.add(jp); dialog.setResizable(false); @@ -268,5 +400,4 @@ public abstract class DatabaseConnectionPanez8=w2-`T z-(It&u`$tfVxmw~#Ek81OT<)pe*IRzZfx);|3E%RvU6f$p0W?Go5CY=mQdq1?u2DY z<}AU+e#{O+E7}sS_grUaQRLw{QRl`#|KXGg9X<{cr!@GO8P4k}3a0T^=K(Ec@O1Ta JS?83{1OTdcG0Xq} literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/lookandfeel/Icon_Narrow_Right_16x16.png b/designer-base/src/main/resources/com/fr/design/images/lookandfeel/Icon_Narrow_Right_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ac42cfea737bcdea8089102f4c1157e8b2b5c6 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`37#&FAr}70DGLM)f>z9DT+R6R z?_?(~?$6f*k}dR@{}~$?n2CrzGZQjm>1R|}+rq1uz>w(NVZg9o(M77^wm_9+gSA0t z0pq_J3sOyl{FomsI6Cc;hTo}{N&1^?j_wp>IHF}G82u_W5@;8Lr>mdKI;Vst0CD0k AO#lD@ literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/lookandfeel/Information_Icon_Error_32x32.png b/designer-base/src/main/resources/com/fr/design/images/lookandfeel/Information_Icon_Error_32x32.png index 8c8831e6dd9a5bc0c3be913f2392ef6ab16e667b..b5df7646ed1833a5c5fb1dfe94e402021c5b5718 100644 GIT binary patch delta 691 zcmV;k0!;nz1^5M!BoPE>K}|sb0I`n?{9y$E00OU(GBJN@^rRPW_#@oZgZc*mjW?=> zR9l1?BtpAO$N46i?R0lrx3h_O;7gjBdGp@)-oAPBri=t$zx~KD{wvH}I>(f+gqrNv zco4ur1}qfc_=&OoszLfck6^FSpmJqBc2>Xvu1*MKz;*Yi{C%BvcWa&OBJF_#T;Obn zKmgT^O>%!6$J1Z^vPSp;-OgbHE^xMkY>A&%zk010(SED`kcM%K69L<{O~;0hl4bRH zF`OPh-o6z>adc#e(&?0EU^)Q@xOC@!E_n_8!k$EeMl(Zxao6i89Dy3>+DlA>&bgaM5R0_)uyN)`&lHrrP_ z9~`85K2Pq&%cK`!>KDB!@q`!;8OGR#OBH^y0L0Net87vx<>@Nmd##MGV=h$ znIr8U#LclMC%vUUNlr}>iG2mpoeR}mt{>~BRP9C_QE>X1CnqLoAgWzQeQAk)J$^!mZr}2PfOD)Ncb1oRb>f_^LSS5kxN3g< zy#GLo;52pi3?VCUuH-HHjLVc5X8`v+3~*LoS&_~$hB}vq><9+q0MKN@fVAVwRS^D~ zXxi`%%#8y;hx0=}^UBPXKuxshb5_LKH~@dNR~@)&s^C=GF{;A!Us1+r0ruvtSoDFu z+3U@#h&~{$n!noN1kRnJ_+ZfhBp9ot`}~X zIrhv05XN{|>T`F%6B*DSE0vxrgIEE8#F@Q8HSx&cwd(}zLl62o%xger!MuzA1Ns+p Z{0B3bB#&7v#@7G<002ovPDHLkV1g$}TE+kX delta 683 zcmV;c0#yC@1@HxsBn|;{Qb$4nuFf3k00082ku@=YV)P^zZU}~(dQkrWpz%i4kZOw% zgG6X|={VouZ1zXDc4rguz?Z-hAK~{}m>#U1BO$LQM{9JQ8q} z0RzQ1d}ipdYLNcVPq5!;P`R=ZJ1gJ-S1SZEVB7mt{rDNRUgkaM&=~VwoGK>yK!};OU z;jI`O2M78nolZFpx)X4K%N^X$C6A%s*pW!kV5ZM+j=XM%BTxg8qr`M*ngK1&-CZ)4 zmdJSjjuM|r#J0DI_w-QXY?kcHSI8b8C+h5f3{VG(FtDQygYot?B?|>&TjABtdwZ## z&y#)iI=PE5b_UGZ7nFQD^H-S=mztg?HdXfQja38k&D#j>jtH^q+3YQ4(-$DVInwTd zI6da*sK=xh$+0ma@f;A{xlqmJx-r)lfP(XX^W?|~4J^K-@g?Tb_xdR)2 z=b75hue(_23lP=rM}2vjem;9n$L`;AL?AfUuv;rDjtl2>6ASGk#8GR8ACI3%GlHfr zULa%z!IjZ%NmF%VojvJ)7z1)#}<0cppZD-r&hIPl|}7_|kU z!!?8Zn^z`o1Zu+Z;jDAOK#Wz=-CgJUi^U!74B%oxZ}&iuHw%tE(vIK)LT4Vq@{){TgtyU>@Q3fcrZB4f6sLB#)t{ Rwj}@n002ovPDHLkV1j1eQBD8= From b29d0419b6a370b54ec792d37f7a5356b7ed837b Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Fri, 9 Apr 2021 15:13:45 +0800 Subject: [PATCH 05/49] =?UTF-8?q?KERNEL-7376=20=E4=BC=98=E5=8C=96=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=B8=8A=E4=B8=80=E4=BA=9B=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/base/svg/SVGIcon.java | 24 ++- .../gui/chart/BaseChartPropertyPane.java | 7 +- .../com/fr/design/mainframe/JTemplate.java | 68 ++++-- .../design/selection/SelectableElement.java | 14 +- .../design/mainframe/ChartPropertyPane.java | 197 ++++++++++++++---- .../mainframe/MiddleChartPropertyPane.java | 165 --------------- .../fr/design/mainframe/ElementCasePane.java | 3 +- .../mainframe/ElementCasePaneDelegate.java | 9 +- .../com/fr/grid/selection/CellSelection.java | 14 +- .../com/fr/grid/selection/FloatSelection.java | 11 +- .../fr/start/module/DesignerActivator.java | 5 +- 11 files changed, 269 insertions(+), 248 deletions(-) delete mode 100644 designer-chart/src/main/java/com/fr/design/mainframe/MiddleChartPropertyPane.java diff --git a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java index aebb22ae14..680e2ddebc 100644 --- a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java +++ b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java @@ -7,6 +7,8 @@ import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; +import java.util.HashMap; +import java.util.Map; /** * SVG转化而来的Icon @@ -28,6 +30,8 @@ public class SVGIcon implements Icon { this.image = image; } + private static Map iconCache = new HashMap<>(); + @Override public void paintIcon(Component c, Graphics g, int x, int y) { if (HI_DPI_SURPORT) { @@ -58,11 +62,23 @@ public class SVGIcon implements Icon { * @return */ public static Icon readSVGIcon(String url) { - if (!url.startsWith(ICON_PREFIX)) { - url = ICON_PREFIX + url; + return readSVGIconWithCache(url, true); + } + + public static Icon readSVGIconWithCache(String url, boolean cacheRead) { + Icon icon = null; + if (cacheRead) { + icon = iconCache.get(url); } - BufferedImage image = (BufferedImage) SVGLoader.load(url); - return image == null ? IOUtils.readIcon(url) : new SVGIcon(image); + if (icon == null) { + if (!url.startsWith(ICON_PREFIX)) { + url = ICON_PREFIX + url; + } + BufferedImage image = (BufferedImage) SVGLoader.load(url); + icon = image == null ? IOUtils.readIcon(url) : new SVGIcon(image); + iconCache.put(url, icon); + } + return icon; } /** diff --git a/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java b/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java index 503b9472cd..d4be14dcdd 100644 --- a/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/chart/BaseChartPropertyPane.java @@ -10,9 +10,6 @@ import com.fr.design.mainframe.DockingView; * @version 创建时间:2013-7-10 上午09:12:11 */ public abstract class BaseChartPropertyPane extends DockingView { - - public abstract void setSureProperty(); - /** * 设置是否支持单元格数据. */ @@ -22,7 +19,5 @@ public abstract class BaseChartPropertyPane extends DockingView { public abstract ChartEditPaneProvider getChartEditPane(); - public abstract void addChartEditPane(String plotID); - - //public abstract void clear(); + public abstract void updateChartEditPane(String plotID); } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 483e74d9d7..60cd13ee65 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -82,9 +82,7 @@ import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.undo.UndoManager; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Set; +import java.util.*; import java.util.regex.Pattern; import java.awt.BorderLayout; @@ -846,33 +844,61 @@ public abstract class JTemplate> TemplateFileTree tt = TemplateTreePane.getInstance().getTemplateFileTree(); DefaultMutableTreeNode gen = (DefaultMutableTreeNode) tt.getModel().getRoot(); String[] str = new String[gen.getChildCount()]; - ArrayList al = new ArrayList(); + + List reportNum = new ArrayList<>(); for (int j = 0; j < gen.getChildCount(); j++) { str[j] = gen.getChildAt(j).toString(); - if (str[j].contains(prefix) && str[j].contains(".")) { - for (int i = 0; i < PREFIX_NUM; i++) { - if (ComparatorUtils.equals(str[j].split("[.]")[0], (prefix + i))) { - al.add(str[j]); - } - - } + //返回文件名中的index(算法中没有再匹配文件后缀了,因为DefaultMutableTreeNode中已经匹配过了) + Integer index = getFileNameIndex(prefix, str[j]); + if (index != null) { + reportNum.add(index); } } + Collections.sort(reportNum); + int idx = reportNum.size() > 0 ? reportNum.get(reportNum.size() - 1) + 1 : 1; - int[] reportNum = new int[al.size()]; - for (int i = 0; i < al.size(); i++) { - Pattern pattern = Pattern.compile("[" + prefix + ".]+"); - String[] strs = pattern.split(al.get(i).toString()); - reportNum[i] = Integer.parseInt(strs[1]); - } - - Arrays.sort(reportNum); - int idx = reportNum.length > 0 ? reportNum[reportNum.length - 1] + 1 : 1; idx = idx + currentIndex; currentIndex++; return prefix + idx; } + /** + * @Description 返回文件名中的index + * @param: prefix 前缀 + * @param: fileName 文件名称全名 + * @return java.lang.Integer WorkBook11.cpt则返回11,如果没有找到index返回null + * @Author Henry.Wang + * @Date 2021/4/9 11:13 + **/ + private static Integer getFileNameIndex(String prefix, String fileName) { + char[] chars = new char[fileName.length()]; + int i = 0; + for (; i < fileName.length(); i++) { + char c = fileName.charAt(i); + //匹配前缀 + if (i < prefix.length()) { + if (c != prefix.charAt(i)) { + return null; + } + } else { + if (c == '.') { + break; + } else { + //匹配0~9 + if (c < 48 || c > 57) { + return null; + } + chars[i - prefix.length()] = c; + } + } + } + String s = new String(chars).substring(0, i - prefix.length()); + if (StringUtils.isBlank(s)) { + return null; + } + return Integer.valueOf(s); + } + // /////////////////////////////toolbarMenuDock////////////////////////////////// /** @@ -1355,7 +1381,7 @@ public abstract class JTemplate> return getEditingFILE().getName(); } - public String getTemplatePredefinedStyle(){ + public String getTemplatePredefinedStyle() { return StringUtils.EMPTY; } diff --git a/designer-base/src/main/java/com/fr/design/selection/SelectableElement.java b/designer-base/src/main/java/com/fr/design/selection/SelectableElement.java index 083cd4cb57..bd6a5d401a 100644 --- a/designer-base/src/main/java/com/fr/design/selection/SelectableElement.java +++ b/designer-base/src/main/java/com/fr/design/selection/SelectableElement.java @@ -14,7 +14,17 @@ public interface SelectableElement { * * @return */ - @SuppressWarnings("rawtypes") - public QuickEditor getQuickEditor(TargetComponent tc); + QuickEditor getQuickEditor(TargetComponent tc); + + /** + * @Description 有些实现类中getQuickEditor会在获取editor后,再填充面板。这个方法只会获取editor,不会填充面板 + * @param: tc + * @return com.fr.design.selection.QuickEditor + * @Author Henry.Wang + * @Date 2021/4/2 15:02 + **/ + default QuickEditor getQuickEditorWithoutPopulate(TargetComponent tc){ + return null; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java index a58f7e8880..190f43864f 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java @@ -3,48 +3,165 @@ */ package com.fr.design.mainframe; -import com.fr.design.gui.ilable.UILabel; + +import com.fr.base.BaseUtils; +import com.fr.base.chart.BaseChartCollection; +import com.fr.chart.chartattr.ChartCollection; +import com.fr.chartx.attr.ChartProvider; +import com.fr.design.ChartTypeInterfaceManager; +import com.fr.design.designer.TargetComponent; +import com.fr.design.gui.chart.BaseChartPropertyPane; +import com.fr.design.gui.chart.ChartEditPaneProvider; +import com.fr.design.gui.frpane.UITitlePanel; +import com.fr.design.mainframe.chart.ChartEditPane; import javax.swing.*; import java.awt.*; -public class ChartPropertyPane extends MiddleChartPropertyPane{ - - /** - * 创建图表属性表实例. - */ - private synchronized static ChartPropertyPane getInstance() { - //todo - //创建新图表时,创建属性表配置面板 - singleton = new ChartPropertyPane(); - return singleton; - } - - private static ChartPropertyPane singleton; - - @Override - protected void createNameLabel() { - nameLabel = new UILabel() { - @Override - public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, 18); - } - }; - nameLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 1, 0)); - nameLabel.setHorizontalAlignment(SwingConstants.CENTER); - } - - @Override - protected void createMainPane() { - this.add(chartEditPane, BorderLayout.CENTER); - } - - @Override - protected JComponent createNorthComponent() { - return nameLabel; - } - - public synchronized static void clear() { - singleton = null; - } +public class ChartPropertyPane extends BaseChartPropertyPane { + + /** + * 创建图表属性表实例. + */ + private synchronized static ChartPropertyPane getInstance() { + //创建新图表时,创建属性表配置面板 + if (singleton == null) { + singleton = new ChartPropertyPane(); + } + return singleton; + } + + private static ChartPropertyPane singleton; + + protected TargetComponentContainer container = new TargetComponentContainer(); + + protected ChartEditPane chartEditPane; + + private ChartPropertyPane() { + initComponent(); + } + + protected void initComponent() { + this.setLayout(new BorderLayout()); + this.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); + } + + @Override + public void updateChartEditPane(String plotID) { + chartEditPane = ChartTypeInterfaceManager.getInstance().getChartEditPane(plotID); + chartEditPane.setContainer(container); + resetChartEditPane(); + } + + @Override + public ChartEditPaneProvider getChartEditPane() { + return chartEditPane; + } + + + protected void resetChartEditPane() { + removeChartEditPane(); + addChartEditPane(this.chartEditPane); + validate(); + repaint(); + revalidate(); + } + + /** + * @Description 去除BorderLayout.CENTER位置的元素 + * @return void + * @Author Henry.Wang + * @Date 2021/4/9 13:54 + **/ + private void removeChartEditPane() { + BorderLayout layout = (BorderLayout) this.getLayout(); + Component component = layout.getLayoutComponent(BorderLayout.CENTER); + if (component != null) + this.remove(component); + } + + /** + * @Description 把chartEditPane加到BorderLayout.CENTER中 + * @param: chartEditPane + * @return void + * @Author Henry.Wang + * @Date 2021/4/9 13:55 + **/ + private void addChartEditPane(ChartEditPane chartEditPane) { + this.add(chartEditPane, BorderLayout.CENTER); + } + + /** + * 感觉ChartCollection加载图表属性界面. + * @param collection 收集图表 + * @param ePane 面板 + */ + public void populateChartPropertyPane(ChartCollection collection, TargetComponent ePane) { + updateChartEditPane(collection.getSelectedChartProvider(ChartProvider.class).getID()); + setSupportCellData(true); + this.container.setEPane(ePane); + chartEditPane.populate(collection); + } + + /** + * 感觉ChartCollection加载图表属性界面. + * @param collection 收集图表 + * @param ePane 面板 + */ + public void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane) { + if (collection instanceof ChartCollection) { + populateChartPropertyPane((ChartCollection) collection, ePane); + } + } + + /** + * 返回View的标题. + */ + public String getViewTitle() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Cell_Element_Property_Table"); + } + + /** + * 返回View的Icon地址. + */ + public Icon getViewIcon() { + return BaseUtils.readIcon("/com/fr/design/images/m_report/qb.png"); + } + + /** + * 预定义定位 + * @return 定位 + */ + public Location preferredLocation() { + return Location.WEST_BELOW; + } + + /** + * 创建标题Panel + * @return 标题panel + */ + public UITitlePanel createTitlePanel() { + return new UITitlePanel(this); + } + + /** + * 刷新Dockview + */ + public void refreshDockingView() { + // TODO Auto-generated method stub + + } + + /** + * 设置是否支持单元格数据. + */ + public void setSupportCellData(boolean supportCellData) { + if (chartEditPane != null) { + chartEditPane.setSupportCellData(supportCellData); + } + } + + public synchronized static void clear() { + singleton = null; + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/MiddleChartPropertyPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/MiddleChartPropertyPane.java deleted file mode 100644 index 39832c3777..0000000000 --- a/designer-chart/src/main/java/com/fr/design/mainframe/MiddleChartPropertyPane.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright(c) 2001-2011, FineReport Inc, All Rights Reserved. - */ -package com.fr.design.mainframe; - -import com.fr.base.BaseUtils; -import com.fr.base.chart.BaseChartCollection; -import com.fr.chart.chartattr.ChartCollection; -import com.fr.chartx.attr.ChartProvider; -import com.fr.design.ChartTypeInterfaceManager; -import com.fr.design.designer.TargetComponent; -import com.fr.design.gui.chart.BaseChartPropertyPane; -import com.fr.design.gui.chart.ChartEditPaneProvider; -import com.fr.design.gui.frpane.UITitlePanel; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.itabpane.TitleChangeListener; -import com.fr.design.mainframe.chart.ChartEditPane; -import com.fr.stable.StableUtils; - -import javax.swing.BorderFactory; -import javax.swing.Icon; -import javax.swing.JComponent; -import java.awt.BorderLayout; - -public abstract class MiddleChartPropertyPane extends BaseChartPropertyPane{ - - protected TargetComponentContainer container = new TargetComponentContainer(); - protected UILabel nameLabel; - - protected ChartEditPane chartEditPane; - - public MiddleChartPropertyPane() { - initComponenet(); - } - - protected void initComponenet() { - this.setLayout(new BorderLayout()); - this.setBorder(BorderFactory.createEmptyBorder(10,0,0,0)); - - createNameLabel(); - //去掉上方名字,先注释掉 -// this.add(createNorthComponent(), BorderLayout.NORTH); - chartEditPane = StableUtils.construct(ChartEditPane.class); - chartEditPane.setSupportCellData(true); - } - - public void addChartEditPane(String plotID){ - chartEditPane = ChartTypeInterfaceManager.getInstance().getChartEditPane(plotID); - chartEditPane.setSupportCellData(true); - this.createMainPane(); - setSureProperty(); - } - - protected abstract void createNameLabel(); - - protected abstract JComponent createNorthComponent(); - - protected abstract void createMainPane(); - - - @Override - public ChartEditPaneProvider getChartEditPane() { - return chartEditPane; - } - - public void setSureProperty() { - chartEditPane.setContainer(container); - chartEditPane.addTitleChangeListener(titleListener); - String tabname = chartEditPane.getSelectedTabName(); - nameLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Property_Table") + (tabname != null ? ('-' + chartEditPane.getSelectedTabName()) : "")); - resetChartEditPane(); - } - - protected void resetChartEditPane() { - remove(chartEditPane); - add(chartEditPane, BorderLayout.CENTER); - validate(); - repaint(); - revalidate(); - } - - protected TitleChangeListener titleListener = new TitleChangeListener() { - - @Override - public void fireTitleChange(String addName) { - nameLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Property_Table") + '-' + addName); - } - }; - - /** - * 感觉ChartCollection加载图表属性界面. - * @param collection 收集图表 - * @param ePane 面板 - */ - public void populateChartPropertyPane(ChartCollection collection, TargetComponent ePane) { - addChartEditPane(collection.getSelectedChartProvider(ChartProvider.class).getID()); - setSupportCellData(true); - this.container.setEPane(ePane); - chartEditPane.populate(collection); - } - - /** - * 感觉ChartCollection加载图表属性界面. - * @param collection 收集图表 - * @param ePane 面板 - */ - public void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane) { - if (collection instanceof ChartCollection) { - populateChartPropertyPane((ChartCollection)collection, ePane); - } - } - -// public void clear() { -// this.container.setEPane(null); -// chartEditPane.clear(); -// getParent().remove(this); -// } - - /** - * 返回View的标题. - */ - public String getViewTitle() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Cell_Element_Property_Table"); - } - - /** - * 返回View的Icon地址. - */ - public Icon getViewIcon() { - return BaseUtils.readIcon("/com/fr/design/images/m_report/qb.png"); - } - - /** - * 预定义定位 - * @return 定位 - */ - public Location preferredLocation() { - return Location.WEST_BELOW; - } - - /** - * 创建标题Panel - * @return 标题panel - */ - public UITitlePanel createTitlePanel() { - return new UITitlePanel(this); - } - - /** - * 刷新Dockview - */ - public void refreshDockingView() { - // TODO Auto-generated method stub - - } - - /** - * 设置是否支持单元格数据. - */ - public void setSupportCellData(boolean supportCellData) { - if(chartEditPane != null) { - chartEditPane.setSupportCellData(supportCellData); - } - } -} \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java index 30f7b15461..e58f7bd08c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java @@ -149,6 +149,7 @@ public abstract class ElementCasePane extends Tar public static final int HORIZONTAL_OVER = 1; public static final int VERTICAL_OVER = 2; + public static int C = 0; // alex:既可以是选中一片单元格,也可以是选中一个悬浮元素 //august:默认是个不存在的选择。方便初始化时触发GridSelectionChangeListener事件 private Selection selection = new CellSelection(-1, -1, -1, -1); @@ -529,7 +530,7 @@ public abstract class ElementCasePane extends Tar || DesignModeContext.isAuthorityEditing()) { try { //旧选中内容编辑器释放模板对象 - QuickEditor editor = this.getCurrentEditor(); + QuickEditor editor = this.selection.getQuickEditorWithoutPopulate(this); if (editor != null) { editor.release(); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java index 44992a84b2..2e65c9815e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java @@ -26,6 +26,7 @@ import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; import com.fr.design.present.ConditionAttributesGroupPane; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; +import com.fr.design.selection.QuickEditor; import com.fr.design.selection.SelectionEvent; import com.fr.design.selection.SelectionListener; import com.fr.grid.selection.FloatSelection; @@ -81,8 +82,10 @@ public class ElementCasePaneDelegate extends ElementCasePane { } CellWidgetPropertyPane.getInstance().populate(ElementCasePaneDelegate.this); CellElementPropertyPane.getInstance().populate(ElementCasePaneDelegate.this); - - QuickEditorRegion.getInstance().populate(getCurrentEditor()); + long s = System.currentTimeMillis(); + QuickEditor quickEditor = getCurrentEditor(); + QuickEditorRegion.getInstance().populate(quickEditor); + System.out.println("getAndPopulate:"+(System.currentTimeMillis()-s)); JTemplate editingTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); // 模板初始化完成后,才能初始化超级链接面板 if (editingTemplate != null && !editingTemplate.isUpMode()) { @@ -102,7 +105,9 @@ public class ElementCasePaneDelegate extends ElementCasePane { EastRegionContainerPane.getInstance().replaceFloatElementPane(ReportFloatPane.getInstance()); EastRegionContainerPane.getInstance().switchMode(EastRegionContainerPane.PropertyMode.REPORT); + s = System.currentTimeMillis(); EastRegionContainerPane.getInstance().replaceCellAttrPane(CellElementPropertyPane.getInstance()); + System.out.println("EastRegionContainerPane.getInstance().replaceCellAttrPane:"+(System.currentTimeMillis()-s)); EastRegionContainerPane.getInstance().replaceCellElementPane(QuickEditorRegion.getInstance()); EastRegionContainerPane.getInstance().replaceConditionAttrPane(conditionAttributesGroupPane); EastRegionContainerPane.getInstance().replaceWidgetSettingsPane(CellWidgetPropertyPane.getInstance()); diff --git a/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java b/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java index 7f5d86ef1f..fe24109ad7 100644 --- a/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java +++ b/designer-realize/src/main/java/com/fr/grid/selection/CellSelection.java @@ -733,6 +733,16 @@ public class CellSelection extends Selection { @Override public QuickEditor getQuickEditor(TargetComponent tc) { + QuickEditor editor = getQuickEditorWithoutPopulate(tc); + if (editor == null) { + return null; + } + editor.populate(tc); + return editor; + } + + @Override + public QuickEditor getQuickEditorWithoutPopulate(TargetComponent tc) { ElementCasePane ePane = (ElementCasePane) tc; TemplateElementCase tplEC = ePane.getEditingElementCase(); TemplateCellElement cellElement = tplEC.getTemplateCellElement(column, row); @@ -744,10 +754,6 @@ public class CellSelection extends Selection { value = value == null ? StringUtils.EMPTY : value; //之前是少了个bigInteger,刚kunsnat又发现少了个bigDecimal,数字类型的都用stringEditor,没必要那个样子 QuickEditor editor = ActionFactory.getCellEditor((value instanceof Number) ? (Number.class) : (value.getClass())); - if (editor == null) { - return null; - } - editor.populate(tc); return editor; } diff --git a/designer-realize/src/main/java/com/fr/grid/selection/FloatSelection.java b/designer-realize/src/main/java/com/fr/grid/selection/FloatSelection.java index 4ea3e41dec..d225a239c7 100644 --- a/designer-realize/src/main/java/com/fr/grid/selection/FloatSelection.java +++ b/designer-realize/src/main/java/com/fr/grid/selection/FloatSelection.java @@ -236,6 +236,15 @@ public class FloatSelection extends Selection { @Override public QuickEditor getQuickEditor(TargetComponent tc) { + QuickEditor editor = getQuickEditorWithoutPopulate(tc); + if (editor == null) + return null; + editor.populate(tc); + return editor; + } + + @Override + public QuickEditor getQuickEditorWithoutPopulate(TargetComponent tc) { ElementCasePane ePane = (ElementCasePane) tc; FloatElement selectedFloat = ePane.getEditingElementCase().getFloatElement(selectedFloatName); Object value = null; @@ -246,10 +255,10 @@ public class FloatSelection extends Selection { value = value == null ? "" : value; value = value instanceof Number ? value.toString() : value; QuickEditor editor = ActionFactory.getFloatEditor(value.getClass()); - editor.populate(tc); return editor; } + @Override public void populatePropertyPane(ElementCasePane ePane) { CellElementPropertyPane.getInstance().removeAll(); diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index 3f1aa26636..8c607f9ed5 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -160,6 +160,9 @@ public class DesignerActivator extends Activator { @Override public void afterAllStart() { DesignerLaunchStatus.setStatus(DesignerLaunchStatus.DESIGNER_INIT_COMPLETE); + //生成BasicChartQuickEditor对象,需要用到ChartDesignerActivator的注册信息(DesignModuleFactory.registerChartPropertyPaneClass(ChartPropertyPane.class);) + //所以不能在registerCellEditor函数中进行注册 + ActionFactory.registerCellEditor(ChartCollection.class, new BasicChartQuickEditor()); } private void loadLogAppender() { @@ -344,8 +347,6 @@ public class DesignerActivator extends Activator { ActionFactory.registerCellEditor(BiasTextPainter.class, new CellBiasTextPainterEditor()); ActionFactory.registerCellEditor(BufferedImage.class, new CellImageQuickEditor()); ActionFactory.registerCellEditor(CellImagePainter.class, new CellImageQuickEditor()); - //todo 图表编辑器populate没能实现刷新面板显示 - ActionFactory.registerCellEditorClass(ChartCollection.class, BasicChartQuickEditor.class); Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); for (ElementUIProvider provider : providers) { From 258b8e9cccfbd8876a7dfb42ab0c2fdb945b540a Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Fri, 9 Apr 2021 15:27:41 +0800 Subject: [PATCH 06/49] =?UTF-8?q?KERNEL-7376=20=E4=BC=98=E5=8C=96=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=B8=8A=E4=B8=80=E4=BA=9B=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/selection/SelectableElement.java | 2 +- .../java/com/fr/design/mainframe/ElementCasePane.java | 1 - .../com/fr/design/mainframe/ElementCasePaneDelegate.java | 9 ++------- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/selection/SelectableElement.java b/designer-base/src/main/java/com/fr/design/selection/SelectableElement.java index bd6a5d401a..8ecb1dcf2d 100644 --- a/designer-base/src/main/java/com/fr/design/selection/SelectableElement.java +++ b/designer-base/src/main/java/com/fr/design/selection/SelectableElement.java @@ -14,7 +14,7 @@ public interface SelectableElement { * * @return */ - + @SuppressWarnings("rawtypes") QuickEditor getQuickEditor(TargetComponent tc); /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java index e58f7bd08c..ca24adc3cc 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java @@ -149,7 +149,6 @@ public abstract class ElementCasePane extends Tar public static final int HORIZONTAL_OVER = 1; public static final int VERTICAL_OVER = 2; - public static int C = 0; // alex:既可以是选中一片单元格,也可以是选中一个悬浮元素 //august:默认是个不存在的选择。方便初始化时触发GridSelectionChangeListener事件 private Selection selection = new CellSelection(-1, -1, -1, -1); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java index 2e65c9815e..44992a84b2 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePaneDelegate.java @@ -26,7 +26,6 @@ import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; import com.fr.design.present.ConditionAttributesGroupPane; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; -import com.fr.design.selection.QuickEditor; import com.fr.design.selection.SelectionEvent; import com.fr.design.selection.SelectionListener; import com.fr.grid.selection.FloatSelection; @@ -82,10 +81,8 @@ public class ElementCasePaneDelegate extends ElementCasePane { } CellWidgetPropertyPane.getInstance().populate(ElementCasePaneDelegate.this); CellElementPropertyPane.getInstance().populate(ElementCasePaneDelegate.this); - long s = System.currentTimeMillis(); - QuickEditor quickEditor = getCurrentEditor(); - QuickEditorRegion.getInstance().populate(quickEditor); - System.out.println("getAndPopulate:"+(System.currentTimeMillis()-s)); + + QuickEditorRegion.getInstance().populate(getCurrentEditor()); JTemplate editingTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); // 模板初始化完成后,才能初始化超级链接面板 if (editingTemplate != null && !editingTemplate.isUpMode()) { @@ -105,9 +102,7 @@ public class ElementCasePaneDelegate extends ElementCasePane { EastRegionContainerPane.getInstance().replaceFloatElementPane(ReportFloatPane.getInstance()); EastRegionContainerPane.getInstance().switchMode(EastRegionContainerPane.PropertyMode.REPORT); - s = System.currentTimeMillis(); EastRegionContainerPane.getInstance().replaceCellAttrPane(CellElementPropertyPane.getInstance()); - System.out.println("EastRegionContainerPane.getInstance().replaceCellAttrPane:"+(System.currentTimeMillis()-s)); EastRegionContainerPane.getInstance().replaceCellElementPane(QuickEditorRegion.getInstance()); EastRegionContainerPane.getInstance().replaceConditionAttrPane(conditionAttributesGroupPane); EastRegionContainerPane.getInstance().replaceWidgetSettingsPane(CellWidgetPropertyPane.getInstance()); From 61fee165a42c262ab0257f0445f6a171a9095945 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Fri, 9 Apr 2021 15:57:11 +0800 Subject: [PATCH 07/49] =?UTF-8?q?KERNEL-7376=20=E4=BC=98=E5=8C=96=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=B8=8A=E4=B8=80=E4=BA=9B=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-base/src/main/java/com/fr/base/svg/SVGIcon.java | 4 ++-- .../src/main/java/com/fr/design/mainframe/JTemplate.java | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java index 680e2ddebc..deca059a99 100644 --- a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java +++ b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java @@ -7,8 +7,8 @@ import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * SVG转化而来的Icon @@ -30,7 +30,7 @@ public class SVGIcon implements Icon { this.image = image; } - private static Map iconCache = new HashMap<>(); + private static Map iconCache = new ConcurrentHashMap<>(); @Override public void paintIcon(Component c, Graphics g, int x, int y) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 60cd13ee65..caeb32f49f 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -82,8 +82,10 @@ import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.undo.UndoManager; -import java.util.*; -import java.util.regex.Pattern; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; import java.awt.BorderLayout; /** From 635742912da8a49815364fa45d502c35d11a3cc8 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Mon, 12 Apr 2021 09:43:17 +0800 Subject: [PATCH 08/49] =?UTF-8?q?KERNEL-7376=20=E4=BC=98=E5=8C=96=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=B8=8A=E4=B8=80=E4=BA=9B=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-base/src/main/java/com/fr/base/svg/SVGIcon.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java index deca059a99..970f8c9784 100644 --- a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java +++ b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java @@ -76,7 +76,10 @@ public class SVGIcon implements Icon { } BufferedImage image = (BufferedImage) SVGLoader.load(url); icon = image == null ? IOUtils.readIcon(url) : new SVGIcon(image); - iconCache.put(url, icon); + //只缓存svg图表 + if (image != null){ + iconCache.put(url, icon); + } } return icon; } From 66bbd54f45db034d8ffaa82ff3022d687b61f1b7 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Mon, 12 Apr 2021 09:44:01 +0800 Subject: [PATCH 09/49] =?UTF-8?q?KERNEL-7376=20=E4=BC=98=E5=8C=96=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=B8=8A=E4=B8=80=E4=BA=9B=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-base/src/main/java/com/fr/base/svg/SVGIcon.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java index 970f8c9784..9667895eec 100644 --- a/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java +++ b/designer-base/src/main/java/com/fr/base/svg/SVGIcon.java @@ -76,7 +76,7 @@ public class SVGIcon implements Icon { } BufferedImage image = (BufferedImage) SVGLoader.load(url); icon = image == null ? IOUtils.readIcon(url) : new SVGIcon(image); - //只缓存svg图表 + //只缓存svg图标 if (image != null){ iconCache.put(url, icon); } From 4ddd6b5efef03e30ee14a6e05c31efbb7fdf4719 Mon Sep 17 00:00:00 2001 From: xiqiu Date: Mon, 12 Apr 2021 18:06:34 +0800 Subject: [PATCH 10/49] =?UTF-8?q?REPORT-49023=20=20=20=E6=A0=B9=E6=8D=AEpr?= =?UTF-8?q?=E6=9D=A5=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connect/DatabaseConnectionPane.java | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index 436849936e..16c992b0f3 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -8,6 +8,7 @@ import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.impl.JNDIDatabaseConnection; import com.fr.data.operator.DataOperator; import com.fr.data.solution.ExceptionSolutionSelector; +import com.fr.data.solution.entity.DriverPage; import com.fr.data.solution.processor.ClassNotFoundExceptionSolutionProcessor; import com.fr.data.solution.processor.SolutionProcessor; import com.fr.design.beans.BasicBeanPane; @@ -87,6 +88,7 @@ public abstract class DatabaseConnectionPane Date: Tue, 13 Apr 2021 09:50:23 +0800 Subject: [PATCH 11/49] =?UTF-8?q?CHART-18859=20=E6=96=87=E4=BB=B6=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=B7=AF=E5=BE=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/series/PlotSeries/MapCustomPane.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/MapCustomPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/MapCustomPane.java index d3c8cc41ce..8cd0743dab 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/MapCustomPane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/MapCustomPane.java @@ -23,6 +23,9 @@ import org.apache.batik.swing.svg.SVGFileFilter; import javax.swing.JFileChooser; import javax.swing.JPanel; import javax.swing.SwingConstants; +import java.io.File; +import java.util.ArrayList; +import java.util.List; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; @@ -30,9 +33,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -import java.io.File; -import java.util.ArrayList; -import java.util.List; /** * 自定义地图界面. @@ -117,7 +117,11 @@ refreshAreaNameBox(); int returnVal = svgFileChooser.showOpenDialog(DesignerContext.getDesignerFrame()); if (returnVal != JFileChooser.CANCEL_OPTION) { File selectedFile = svgFileChooser.getSelectedFile(); - lastSelectPath = selectedFile.getAbsolutePath(); + try { + lastSelectPath = selectedFile.getCanonicalPath(); + } catch (Exception ex) { + FineLoggerFactory.getLogger().error(ex.getMessage(), ex); + } if (selectedFile != null && selectedFile.isFile()) { imageShowPane.setSvgMap(selectedFile.getPath()); imageShowPane.repaint(); @@ -133,7 +137,7 @@ refreshAreaNameBox(); String colName = Utils.objectToString(areaString.getSelectedItem()); TableDataWrapper tableDataWrappe = tableDataNameBox.getTableDataWrapper(); - + imageShowPane.refreshFromDataList(getColValuesInData(tableDataWrappe, colName)); } } From fb1534f3eaf83f757770648cbde845c75d78e9fe Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Tue, 13 Apr 2021 16:27:22 +0800 Subject: [PATCH 12/49] =?UTF-8?q?CHART-18881=20=E5=8D=95=E5=85=83=E6=A0=BC?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E6=9C=89=E6=97=B6=E5=80=99=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E7=82=B9=E5=87=BA=E5=9B=BE=E8=A1=A8=E5=B1=9E=E6=80=A7=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/ChartPropertyPane.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java index 190f43864f..c5c2a3fe4d 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java @@ -24,15 +24,9 @@ public class ChartPropertyPane extends BaseChartPropertyPane { * 创建图表属性表实例. */ private synchronized static ChartPropertyPane getInstance() { - //创建新图表时,创建属性表配置面板 - if (singleton == null) { - singleton = new ChartPropertyPane(); - } - return singleton; + return new ChartPropertyPane(); } - private static ChartPropertyPane singleton; - protected TargetComponentContainer container = new TargetComponentContainer(); protected ChartEditPane chartEditPane; @@ -160,8 +154,4 @@ public class ChartPropertyPane extends BaseChartPropertyPane { chartEditPane.setSupportCellData(supportCellData); } } - - public synchronized static void clear() { - singleton = null; - } } \ No newline at end of file From 4e7266377e50d91ed06895ee7dbb9893925c427c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Tue, 13 Apr 2021 17:16:56 +0800 Subject: [PATCH 13/49] =?UTF-8?q?CHART-18846=20&&=20CHART-18865=20?= =?UTF-8?q?=E4=BB=AA=E8=A1=A8=E7=9B=98=E9=9D=A2=E6=9D=BF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tooltip/RefreshTooltipContentPaneWithOutSeries.java | 7 ++++++- .../component/tooltip/TooltipContentPaneWithOutSeries.java | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/RefreshTooltipContentPaneWithOutSeries.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/RefreshTooltipContentPaneWithOutSeries.java index 810b4235d8..8512f6cabf 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/RefreshTooltipContentPaneWithOutSeries.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/RefreshTooltipContentPaneWithOutSeries.java @@ -23,7 +23,12 @@ public class RefreshTooltipContentPaneWithOutSeries extends TooltipContentPaneWi protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { super.initFormatPane(parent, showOnPane); - setChangedValueFormatPane(new ChangedValueFormatPaneWithCheckBox(parent, showOnPane)); + setChangedValueFormatPane(new ChangedValueFormatPaneWithCheckBox(parent, showOnPane) { + @Override + protected String getCheckBoxText() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Pointer_Change_Value"); + } + }); setChangedPercentFormatPane(new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane)); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java index f8d238d3af..9c7ea0eb7a 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java @@ -134,6 +134,7 @@ public class TooltipContentPaneWithOutSeries extends VanChartTooltipContentPane protected AttrTooltipContent createAttrTooltip() { GaugeValueTooltipContent gaugeValueTooltipContent = new GaugeValueTooltipContent(); + gaugeValueTooltipContent.setCustom(false); gaugeValueTooltipContent.getTargetValueFormat().setEnable(true); gaugeValueTooltipContent.getRichTextTargetValueFormat().setEnable(true); return gaugeValueTooltipContent; From 1698c22c07eaf28cfcbce16cdc18de04b3213ff0 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Wed, 14 Apr 2021 09:39:47 +0800 Subject: [PATCH 14/49] =?UTF-8?q?REPORT-49067=20=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=E5=AD=97=E4=BD=93=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/DesignerFrame.java | 16 +- .../com/fr/design/mainframe/JTemplate.java | 7 +- .../design/mainframe/check/CheckButton.java | 173 ++++++++++++++++++ .../mainframe/check/CheckFontInfoDialog.java | 139 ++++++++++++++ .../com/fr/design/images/buttonicon/check.png | Bin 0 -> 386 bytes .../com/fr/design/images/correct.png | Bin 0 -> 785 bytes .../resources/com/fr/design/images/error.png | Bin 0 -> 768 bytes .../com/fr/design/images/waiting.png | Bin 0 -> 1011 bytes .../fr/design/images/warnings/warning32.png | Bin 0 -> 942 bytes 9 files changed, 333 insertions(+), 2 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java create mode 100644 designer-base/src/main/resources/com/fr/design/images/buttonicon/check.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/correct.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/error.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/waiting.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/warnings/warning32.png diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index b826931b61..eec902c4c1 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -84,13 +84,13 @@ import javax.swing.UIManager; import javax.swing.WindowConstants; import javax.swing.border.MatteBorder; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; -import java.awt.Component; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.dnd.DnDConstants; @@ -701,6 +701,8 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } } } + //添加检测按钮 + addCheckButton(); //添加分享按钮 addShareButton(); //添加插件中的按钮 @@ -724,6 +726,18 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } } + private void addCheckButton() { + JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (jt == null) { + return; + } + combineUp.addSeparator(new Dimension(2, 16)); + UIButton[] checkButtons = jt.createCheckButton(); + for (UIButton checkButton : checkButtons) { + combineUp.add(checkButton); + } + } + private void addShareButton() { JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index caeb32f49f..0ff728580a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -38,6 +38,7 @@ import com.fr.design.gui.itree.filetree.TemplateFileTree; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.chart.info.ChartInfoCollector; +import com.fr.design.mainframe.check.CheckButton; import com.fr.design.mainframe.template.info.TemplateInfoCollector; import com.fr.design.mainframe.template.info.TemplateProcessInfo; import com.fr.design.mainframe.template.info.TimeConsumeTimer; @@ -82,11 +83,11 @@ import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.undo.UndoManager; +import java.awt.BorderLayout; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; -import java.awt.BorderLayout; /** * 报表设计和表单设计的编辑区域(设计器编辑的IO文件) @@ -1360,6 +1361,10 @@ public abstract class JTemplate> return uiButtons; } + public UIButton[] createCheckButton() { + return new UIButton[]{new CheckButton()}; + } + /** * 由于老版本的模板没有模板ID,当勾选使用参数模板时候,就加一个模板ID attr * diff --git a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java new file mode 100644 index 0000000000..f42d18d404 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java @@ -0,0 +1,173 @@ +package com.fr.design.mainframe.check; + +import com.fr.base.BaseUtils; +import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; +import com.fr.file.FILE; +import com.fr.file.FileNodeFILE; +import com.fr.log.FineLoggerFactory; +import com.fr.rpc.ExceptionHandler; +import com.fr.rpc.RPCInvokerExceptionInfo; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.check.TemplateChecker; + +import javax.swing.BoxLayout; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.Set; +import java.util.concurrent.ExecutionException; + +import static javax.swing.JOptionPane.OK_CANCEL_OPTION; +import static javax.swing.JOptionPane.OK_OPTION; +import static javax.swing.JOptionPane.WARNING_MESSAGE; + +public class CheckButton extends UIButton { + + private UILabel message; + private UIButton okButton; + private JDialog dialog; + private UILabel uiLabel; + + public CheckButton() { + this.setIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/check.png")); + this.setToolTipText(Toolkit.i18nText("Fine_Designer_Check_Font")); + this.set4ToolbarButton(); + this.addActionListener(checkListener); + } + + private ActionListener checkListener = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + + // Try check + final SwingWorker, Void> checkThread = new SwingWorker, Void>() { + @Override + protected Set doInBackground() throws Exception { + // 返回校验结果 + return check(DesignerContext.getDesignerFrame().getSelectedJTemplate()); + } + + @Override + protected void done() { + try { + Set set = get(); + if (set == null) { + return; + } + if(set.isEmpty()) { + okButton.setEnabled(true); + uiLabel.setIcon(BaseUtils.readIcon("com/fr/design/images/correct.png")); + message.setText("" + Toolkit.i18nText("Fine_Designer_Check_Font_Success") + ""); + } else { + dialog.dispose(); + StringBuilder textBuilder = new StringBuilder(); + textBuilder.append(Toolkit.i18nText("Fine_Designer_Check_Font_Missing_Font")).append("\n"); + for (String font : set) { + textBuilder.append(font).append("\n"); + } + String areaText = textBuilder.toString(); + CheckFontInfoDialog dialog = new CheckFontInfoDialog(DesignerContext.getDesignerFrame(), areaText); + dialog.setVisible(true); + } + } catch (InterruptedException | ExecutionException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + }; + + JTemplate jtemplate = DesignerContext.getDesignerFrame().getSelectedJTemplate(); + if (jtemplate == null || jtemplate.getEditingFILE() == null) { + return; + } + FILE currentTemplate = jtemplate.getEditingFILE(); + if(currentTemplate instanceof FileNodeFILE){ + checkThread.execute(); + }else { + //模板不在报表环境下,提示保存 + int selVal = FineJOptionPane.showConfirmDialog( + DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Message"), + Toolkit.i18nText("Fine_Designer_Check_Font"), + OK_CANCEL_OPTION, + WARNING_MESSAGE); + + if (OK_OPTION == selVal) { + //保存成功才执行检测 + if (jtemplate.saveAsTemplate2Env()) { + checkThread.execute(); + } + } + } + initDialogPane(); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + dialog.dispose(); + } + }); + + dialog.addWindowListener(new WindowAdapter() { + public void windowClosed(WindowEvent e) { + checkThread.cancel(true); + } + }); + + dialog.setVisible(true); + dialog.dispose(); + } + }; + + private Set check(JTemplate jtemplate) { + String path = jtemplate.getEditingFILE().getEnvFullName(); + Set fontSet = WorkContext.getCurrent().get(TemplateChecker.class, new ExceptionHandler() { + + @Override + public Void callHandler(RPCInvokerExceptionInfo rpcInvokerExceptionInfo) { + uiLabel.setIcon(BaseUtils.readIcon("com/fr/design/images/error.png")); + message.setText("" + Toolkit.i18nText("Fine_Designer_Check_Font_Upgrade") + ""); + okButton.setEnabled(true); + return null; + } + }).checkFont(path); + return fontSet; + } + + private void initDialogPane() { + message = new UILabel(); + message.setText(Toolkit.i18nText("Fine-Designer_Check_Font_Checking") + "..."); + uiLabel = new UILabel(); + okButton = new UIButton(Toolkit.i18nText("Fine-Design_Report_OK")); + okButton.setEnabled(false); + dialog = new JDialog(); + dialog.setTitle(Toolkit.i18nText("Fine_Designer_Check_Font")); + dialog.setModal(true); + dialog.setSize(new Dimension(268, 118)); + JPanel jp = new JPanel(); + JPanel upPane = new JPanel(); + JPanel downPane = new JPanel(); + uiLabel = new UILabel(BaseUtils.readIcon("com/fr/design/images/waiting.png")); + upPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10)); + upPane.add(uiLabel); + upPane.add(message); + downPane.setLayout(new FlowLayout(FlowLayout.CENTER, 6, 0)); + downPane.add(okButton); + jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS)); + jp.add(upPane); + jp.add(downPane); + dialog.add(jp); + dialog.setResizable(false); + dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor(this)); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java new file mode 100644 index 0000000000..837d48b288 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java @@ -0,0 +1,139 @@ +package com.fr.design.mainframe.check; + +import com.fr.design.dialog.link.MessageWithLink; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.CloudCenter; +import com.fr.general.GeneralContext; +import com.fr.general.IOUtils; + +import javax.swing.BorderFactory; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.UIManager; +import java.awt.BorderLayout; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.Locale; + +/** + * 字体缺失检测的具体结果对话框 + * + */ +public class CheckFontInfoDialog extends JDialog implements ActionListener { + + private JPanel topPanel; + private JPanel upInTopPanel; + private JPanel downInTopPanel; + private JPanel hiddenPanel; + private JPanel bottomPanel; + + private UILabel imageLabel; + private UILabel directUiLabel; + private UILabel detailLabel; + + public CheckFontInfoDialog(Frame parent, String areaText) { + super(parent,true); + //提示信息 + JPanel imagePanel = new JPanel(); + imageLabel = new UILabel(IOUtils.readIcon("com/fr/design/images/warnings/warning32.png")); + imagePanel.add(imageLabel); + + JPanel messagePanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); + MessageWithLink linkMessage = new MessageWithLink(Toolkit.i18nText("Fine_Designer_Check_Font_Message"), + Toolkit.i18nText("Fine_Designer_Check_Font_Install_Font"), + CloudCenter.getInstance().acquireUrlByKind("help.install.font", "https://help.fanruan.com/finereport/doc-view-3999.html")); + linkMessage.setPreferredSize(new Dimension(380, 31)); + messagePanel.add(linkMessage); + + // 查看详情按钮 + directUiLabel = new UILabel(); + directUiLabel.setIcon(UIManager.getIcon("OptionPane.narrow.right")); + detailLabel = new UILabel(); + detailLabel.setText(Toolkit.i18nText("Fine_Designer_Look_Detail")); + + upInTopPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); + upInTopPanel.add(imageLabel, BorderLayout.WEST); + upInTopPanel.add(messagePanel, BorderLayout.CENTER); + + downInTopPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); + downInTopPanel.add(directUiLabel, BorderLayout.WEST); + downInTopPanel.add(detailLabel, BorderLayout.CENTER); + + topPanel = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); + topPanel.add(upInTopPanel, BorderLayout.NORTH); + topPanel.add(downInTopPanel, BorderLayout.SOUTH); + + //中间的详情展示(可隐藏) + hiddenPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); + hiddenPanel.setBorder(BorderFactory.createEmptyBorder(0,12,0,12)); + JScrollPane scrollPane = new JScrollPane(); + JTextArea checkArea = new JTextArea(areaText); + scrollPane.setViewportView(checkArea); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + checkArea.setEnabled(false); + hiddenPanel.add(scrollPane); + hiddenPanel.setVisible(false); + + downInTopPanel.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (hiddenPanel.isVisible()) { + hiddenPanel.setVisible(false); + CheckFontInfoDialog.this.setSize(new Dimension(380, 185)); + detailLabel.setText(Toolkit.i18nText("Fine_Designer_Look_Detail")); + directUiLabel.setIcon(UIManager.getIcon("OptionPane.narrow.right")); + } else { + CheckFontInfoDialog.this.setSize(new Dimension(380, 280)); + hiddenPanel.setVisible(true); + detailLabel.setText(Toolkit.i18nText("Fine_Designer_Hide_Detail")); + directUiLabel.setIcon(UIManager.getIcon("OptionPane.narrow.down")); + } + } + + @Override + public void mouseEntered(MouseEvent e) { + detailLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + } + + @Override + public void mouseExited(MouseEvent e) { + detailLabel.setCursor(Cursor.getDefaultCursor()); + } + }); + + //底部的按钮面板 + UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Report_OK")); + JPanel buttonPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); + buttonPanel.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); + buttonPanel.add(okButton, BorderLayout.EAST); + okButton.addActionListener(this); + bottomPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); + bottomPanel.add(buttonPanel); + + this.setTitle(Toolkit.i18nText("Fine_Designer_Check_Font")); + this.setResizable(false); + + this.add(topPanel, BorderLayout.NORTH); + this.add(hiddenPanel, BorderLayout.CENTER); + this.add(bottomPanel, BorderLayout.SOUTH); + this.setSize(new Dimension(GeneralContext.getLocale().equals(Locale.US)? 400:380, 185)); + + GUICoreUtils.centerWindow(this); + } + + @Override + public void actionPerformed(ActionEvent e) { + this.dispose(); + } +} diff --git a/designer-base/src/main/resources/com/fr/design/images/buttonicon/check.png b/designer-base/src/main/resources/com/fr/design/images/buttonicon/check.png new file mode 100644 index 0000000000000000000000000000000000000000..36c4238a288e7bf5a1336e54a728f898b3bbb197 GIT binary patch literal 386 zcmV-|0e$|7P)FUn!XycSU0!EZqEZJ-?t4KQ-GIIfuX0oY*H0NjFTwbsT=!Ph4mf%nd!3r@6C z!$?%Z+#*o>yVsqKD*n|(Gq%{>NY zqA>6>K+PXeU_J!YS&}45*Uc7)b{Kpa$x&QzG literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/correct.png b/designer-base/src/main/resources/com/fr/design/images/correct.png new file mode 100644 index 0000000000000000000000000000000000000000..90f74f7a93b6190568e17fdd1f50d580e230322a GIT binary patch literal 785 zcmV+s1Md8ZP)eg96ue-AJx$?*HUpr{)7l2%4b4wNeu z%p?VLcZT8dxR)es9&QOBBjzAUMR>hD!l8BT1<-XJ@tI!;hk_8&A~y9#YGokbk#JHL z+YTtDGBVj5db>L@`#Xhz-)Hm!iF8&Z^5|F}Y}pmt0I7@!j%5*Cy9T5Y<)VVF4ILoa zPbZQ9boBK^K+|+f5S9RvTr`A8C`!r5o@H5Rnud5HiH$v7C|6X7xdK?00mreZR_6^U zGgyW}$if**09CDmbUq1&ror=`+KYvB7H$`Za#@Aj?J}Ot(#*RwjLM%dQJF>#GQLv@ z_-GyjTm-v3Te0821Adw}-etQ4i+wFBC1k~%kuhK+fF-Q#rc8+j$`2EdAyT9<7)Pi zZSlW9)Q$_$5#yji;^Z!nGzG_!S1fIBN~R;Ds`P-k`)S@Wz>~rl?&M$C&VIP>2ntmh z_hv_pGa99zPY*u7=@{Uga2sFBlePdZ_n*L--b1+d<1uc;pBZO#3S+6k*pOp@gEJQ~ zXVLX0nJIoZ@e-G&9@YbAg=j3~7+~n}-gWlhsr-#yJM4cYxIQ z!ser>&(b1ulP@DgV;znG7WY8CAWZbCD&w%-MfEG15~_`ie<430YHY{U7)Pc?ZidHbZCq P00000NkvXXu0mjfA?{=j literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/error.png b/designer-base/src/main/resources/com/fr/design/images/error.png new file mode 100644 index 0000000000000000000000000000000000000000..89601dfb13cc1eca9b46ff255be52404329d7af7 GIT binary patch literal 768 zcmV+b1ONPqP)>wmS%m@J!s9hL%jI=`+ zkf4AB;vs>Us2aB=^pQACow#ulUvyoZDs71pS4tRqhQyJt{eSmA=iCzx07hQErR=*= z5$ij`*;>}c7QmJRO?TkOgwoJ1*xM7S?1KLuU`flu=ktE;`726m5yleE&w>e1wnvmnoy<_=vj`huiHczj$sT1z8f2&le!el67sT#$75v7#)TD{vBLX3W%`_tV!7pi^BVHKyWldJf2M-^{m5S)K&ijq zIlxL+Bp`_*+QT7BOdKA9G(1#u4H)MyV9$-~&X3~7j0RC8@VMO|V`FgLzE!ihz0fr2 zx!u$8$5tD&4@a{=)8ILKX4Q5=ARRmav6$jjWNNa{F@Wb}4BXPvI=gLAiYW1bV*u~5qkw5{Sb*V? z7nV4Kn2nv-a1BRkv3n{mItJLR0~~0wTZso912nw`n%)Iy_Bmh;tEQfWe`~wpvtXm1 yVoo$<8djY;ng(HX1j6_@_=%t3ve}yc5BvdIrr9u~MbMi70000M4-XxpL zqpAW;Q?V@DgQ}Y<1Rbj=vnqgTTDYC>n(+Au2K5EU)3X@@ehtGg2?YG!eZ4dx%_1`W zE0O##VKap)%Qzy88S1ATeUL)eQ%E)9`C4-cZq>C^u8_&*yo_BXgbF`9uJ=U}55L#=D!!R7plO0o zFi2?T44q@|F9r`p(RRIzh(C%Fj3Fy&?8&p3e}4%^X5l$05+$5KmS@2+7F7{C{(UD9UH4HQIsk^dKitga@z7xML;zu)5GZ+(**k!LiPU z0haW@o;MKvN2m<#2dlIqg3_`Rb@!{7!*6d+4=kAie;dJrr?Ar_%wKp5?CM$KnFyc+ zyOD)dZR%^s_(rGT);*v^ccVY@1=6vwul|HnoWK`OAa*>9G%^^cpIe05j6L9bTeb=P zZD_k*!WSPv(L0fqSsZs0{__>g=N14qWfRuDHT^7Dsl!|)nsOT6X2z;rZ56!lfnfGL hS}BRoF0Sc&;9q-O{V<0rcHjU2002ovPDHLkV1oEO;voP4 literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/warnings/warning32.png b/designer-base/src/main/resources/com/fr/design/images/warnings/warning32.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2a189b6eba699ce052ec50c27625148f3fb5f8 GIT binary patch literal 942 zcmV;f15x~mP)fKNK>p-v1rJH z@j*neD!!Ri-Pxigp@^-zv$kn4M57p#D%gO8qAiMX=g*Pdi8aaYWM(!Sa$o11@B7_z z&$)L9bG&Gd{V^keY%d0lnh|%>K*`X`%z)G8G$E&w#1 z&kS&rqGgP*5TOB>K~_r5m3+k{GeV#Ie!7te90npZfR&7GWTKyu^ zFQdez+d&`#SHRL^KQidUAff=DP&DJCAhCe}%u~^|5OnVO*a2escK}JQ2itJ^cTVuj z%?g^8xN+VO!WV#dKv?x^KY;p)Vp7W)(7YF2|0n;#?s<2L7hjeKj1{y4&U6sI0G6(9 zV&KqJ5oui)sPZ)z;Njn}&wgCs!>~6;v`asf48T7(&bPDjFaxg?0IWF-T2SKx+`j?) z{O3h{_?{fGtLdHJ|MP;FwgRTEb^zE~ELp_%K`eAHLud3)IL4R7J%~D#_{Fb71B|7j zRT7J<0Ol11SouA~qGlIhmm>uVBC6PHhHK@RV zyCGST*kyp;n6`VXKZUexb3Vkreh575_XhD5IcvO08(>e=EdaMo>T!-kM0G8yRBJUPN$+}zA6A1OQ|(7^B{vFfxH*gLcH$Ye$K5f;Qmmc zG=Q@LJp#Yi@K)!A*ik9i6@z-t;Ky4U+GQ Date: Wed, 14 Apr 2021 10:42:49 +0800 Subject: [PATCH 15/49] =?UTF-8?q?KERNEL-7376=20=E4=BC=98=E5=8C=96=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E4=B8=8A=E4=B8=80=E4=BA=9B=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/file/HistoryTemplateListCache.java | 2 -- .../java/com/fr/design/module/DesignModuleFactory.java | 8 -------- 2 files changed, 10 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index f6b8f07d52..8742a894f2 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -64,7 +64,6 @@ public class HistoryTemplateListCache implements CallbackEvent { * @param selected 选择的 */ public void closeSelectedReport(JTemplate selected) { - DesignModuleFactory.clearChartPropertyPane(); DesignTableDataManager.closeTemplate(selected); //直接关闭模板的时候(当且仅当设计器tab上只剩一个模板)退出权限编辑 if (DesignModeContext.isAuthorityEditing() && historyList.size() <= 1) { @@ -92,7 +91,6 @@ public class HistoryTemplateListCache implements CallbackEvent { * @param selected 选择的 */ public void closeVirtualSelectedReport(JTemplate selected) { - DesignModuleFactory.clearChartPropertyPane(); DesignTableDataManager.closeTemplate(selected); if (contains(selected) == -1) { return; diff --git a/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java b/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java index f3e8c4ebd2..5ff882f642 100644 --- a/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java +++ b/designer-base/src/main/java/com/fr/design/module/DesignModuleFactory.java @@ -243,14 +243,6 @@ public class DesignModuleFactory { return bp; } - - public static void clearChartPropertyPane() { - if (instance.chartPropertyPaneClass != null) { - StableUtils.clearInstance(instance.chartPropertyPaneClass); - } - } - - public static void registerButtonDetailPaneClass(Class clazz) { instance.buttonDetailPaneClass = clazz; } From 7247a789a97ccbb34d0bcad0a5f3ea2701531ee2 Mon Sep 17 00:00:00 2001 From: pengda Date: Wed, 14 Apr 2021 14:13:35 +0800 Subject: [PATCH 16/49] =?UTF-8?q?REPORT-49055=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=95=B0=E6=8D=AE=E8=BF=9E=E6=8E=A5=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/connect/DBCPAttrPane.java | 118 ++++++ .../connect/DatabaseConnectionPane.java | 60 ++- .../data/datapane/connect/JDBCDefPane.java | 392 ++++++++++++------ .../fr/design/layout/TableLayoutHelper.java | 2 +- 4 files changed, 426 insertions(+), 146 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/data/datapane/connect/DBCPAttrPane.java diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DBCPAttrPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DBCPAttrPane.java new file mode 100644 index 0000000000..01af972931 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DBCPAttrPane.java @@ -0,0 +1,118 @@ +package com.fr.design.data.datapane.connect; + +import com.fr.data.impl.JDBCDatabaseConnection; +import com.fr.data.pool.DBCPConnectionPoolAttr; +import com.fr.design.constants.UIConstants; +import com.fr.design.dialog.BasicPane; +import com.fr.design.editor.editor.IntegerEditor; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import java.awt.BorderLayout; +import java.awt.Component; +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.SwingConstants; + +public class DBCPAttrPane extends BasicPane { + public static final int TIME_MULTIPLE = 1000; + // carl:DBCP的一些属性 + private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_ACTIVE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_IDLE = new IntegerEditor(); + private IntegerEditor DBCP_MIN_IDLE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_WAIT = new IntegerEditor(); + private UITextField DBCP_VALIDATION_QUERY = new UITextField(); + + private UIComboBox DBCP_TESTONBORROW = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Basic_No"), Toolkit.i18nText("Fine-Design_Basic_Yes")}); + private UIComboBox DBCP_TESTONRETURN = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Basic_No"), Toolkit.i18nText("Fine-Design_Basic_Yes")}); + private UIComboBox DBCP_TESTWHILEIDLE = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Basic_No"), Toolkit.i18nText("Fine-Design_Basic_Yes")}); + + private IntegerEditor DBCP_TIMEBETWEENEVICTIONRUNSMILLS = new IntegerEditor(); + private IntegerEditor DBCP_NUMTESTSPEREVICTIONRUN = new IntegerEditor(); + private IntegerEditor DBCP_MINEVICTABLEIDLETIMEMILLIS = new IntegerEditor(); + + public DBCPAttrPane() { + JPanel defaultPane = this; + + // JPanel northFlowPane + JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + defaultPane.add(northFlowPane, BorderLayout.NORTH); + + DBCP_VALIDATION_QUERY.setColumns(15); + // ContextPane + + double f = TableLayout.FILL; + // double p = TableLayout.PREFERRED; + double[] rowSize = {f, f, f, f, f, f, f, f, f, f, f, f}; + double[] columnSize = {f, f}; + Component[][] comps = { + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Initial_Size") + ":", SwingConstants.RIGHT), DBCP_INITIAL_SIZE}, + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Active") + ":", SwingConstants.RIGHT), DBCP_MAX_ACTIVE}, + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Idle") + ":", SwingConstants.RIGHT), DBCP_MAX_IDLE}, + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Min_Idle") + ":", SwingConstants.RIGHT), DBCP_MIN_IDLE}, + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Max_Wait_Time") + ":", SwingConstants.RIGHT), DBCP_MAX_WAIT}, + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Validation_Query") + ":", SwingConstants.RIGHT), DBCP_VALIDATION_QUERY}, + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Borrow") + ":", SwingConstants.RIGHT), DBCP_TESTONBORROW}, + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Return") + ":", SwingConstants.RIGHT), DBCP_TESTONRETURN}, + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_While_Idle") + ":", SwingConstants.RIGHT), DBCP_TESTWHILEIDLE}, + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Evictionruns_millis") + ":", SwingConstants.RIGHT), + DBCP_TIMEBETWEENEVICTIONRUNSMILLS}, + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Num_Test_Per_Evction_Run") + ":", SwingConstants.RIGHT), DBCP_NUMTESTSPEREVICTIONRUN}, + {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Mix_Evictable_Idle_Time_Millis") + ":", SwingConstants.RIGHT), + DBCP_MINEVICTABLEIDLETIMEMILLIS}}; + + JPanel contextPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSize, columnSize, 10, 4); + contextPane.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, UIConstants.LINE_COLOR)); + northFlowPane.add(contextPane); + } + + public void populate(JDBCDatabaseConnection jdbcDatabase) { + DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); + if (dbcpAttr == null) { + dbcpAttr = new DBCPConnectionPoolAttr(); + jdbcDatabase.setDbcpAttr(dbcpAttr); + } + this.DBCP_INITIAL_SIZE.setValue(dbcpAttr.getInitialSize()); + this.DBCP_MAX_ACTIVE.setValue(dbcpAttr.getMaxActive()); + this.DBCP_MAX_IDLE.setValue(dbcpAttr.getMaxIdle()); + this.DBCP_MAX_WAIT.setValue(dbcpAttr.getMaxWait()); + this.DBCP_MIN_IDLE.setValue(dbcpAttr.getMinIdle()); + this.DBCP_VALIDATION_QUERY.setText(dbcpAttr.getValidationQuery()); + this.DBCP_TESTONBORROW.setSelectedIndex(dbcpAttr.isTestOnBorrow() ? 1 : 0); + this.DBCP_TESTONRETURN.setSelectedIndex(dbcpAttr.isTestOnReturn() ? 1 : 0); + this.DBCP_TESTWHILEIDLE.setSelectedIndex(dbcpAttr.isTestWhileIdle() ? 1 : 0); + this.DBCP_MINEVICTABLEIDLETIMEMILLIS.setValue(dbcpAttr.getMinEvictableIdleTimeMillis() / TIME_MULTIPLE); + this.DBCP_NUMTESTSPEREVICTIONRUN.setValue(dbcpAttr.getNumTestsPerEvictionRun()); + this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.setValue(dbcpAttr.getTimeBetweenEvictionRunsMillis()); + } + + public void update(JDBCDatabaseConnection jdbcDatabase) { + DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); + if (dbcpAttr == null) { + dbcpAttr = new DBCPConnectionPoolAttr(); + jdbcDatabase.setDbcpAttr(dbcpAttr); + } + dbcpAttr.setInitialSize(this.DBCP_INITIAL_SIZE.getValue().intValue()); + dbcpAttr.setMaxActive(this.DBCP_MAX_ACTIVE.getValue().intValue()); + dbcpAttr.setMaxIdle(this.DBCP_MAX_IDLE.getValue().intValue()); + dbcpAttr.setMaxWait(this.DBCP_MAX_WAIT.getValue().intValue()); + dbcpAttr.setMinIdle(this.DBCP_MIN_IDLE.getValue().intValue()); + dbcpAttr.setValidationQuery(this.DBCP_VALIDATION_QUERY.getText()); + dbcpAttr.setTestOnBorrow(this.DBCP_TESTONBORROW.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setTestOnReturn(this.DBCP_TESTONRETURN.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setTestWhileIdle(this.DBCP_TESTWHILEIDLE.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setMinEvictableIdleTimeMillis(((Number) this.DBCP_MINEVICTABLEIDLETIMEMILLIS.getValue()).intValue() * TIME_MULTIPLE); + dbcpAttr.setNumTestsPerEvictionRun(((Number) this.DBCP_NUMTESTSPEREVICTIONRUN.getValue()).intValue()); + dbcpAttr.setTimeBetweenEvictionRunsMillis(((Number) this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.getValue()).intValue()); + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr"); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index 16c992b0f3..d58b4d727e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -12,8 +12,10 @@ import com.fr.data.solution.entity.DriverPage; import com.fr.data.solution.processor.ClassNotFoundExceptionSolutionProcessor; import com.fr.data.solution.processor.SolutionProcessor; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; @@ -245,14 +247,16 @@ public abstract class DatabaseConnectionPane { private static JDBCDefPane jdbcDefPane = new JDBCDefPane(); + private static DBCPAttrPane dbcpAttrPane = new DBCPAttrPane(); @Override protected JPanel mainPanel() { @@ -362,14 +393,21 @@ public abstract class DatabaseConnectionPane jdbcMap = new HashMap(); static { @@ -59,45 +64,38 @@ public class JDBCDefPane extends JPanel { new DriverURLName("COM.cloudscape.JDBCDriver", "jdbc:cloudscape:/cloudscape/"), new DriverURLName("com.internetcds.jdbc.tds.Driver", "jdbc:freetds:sqlserver://localhost/"), new DriverURLName("com.fr.swift.jdbc.Driver", "jdbc:swift:emb://default")}); - jdbcMap.put("Inceptor", new DriverURLName[]{new DriverURLName("org.apache.hive.jdbc.HiveDriver", "jdbc:inceptor2://localhost:10000/default"), - new DriverURLName("org.apache.hadoop.hive.jdbc.HiveDriver", "jdbc:inceptor://localhost:10000/default")}); - jdbcMap.put("Oracle", new DriverURLName[]{new DriverURLName("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:1521:databaseName")}); - jdbcMap.put("DB2", new DriverURLName[]{new DriverURLName("com.ibm.db2.jcc.DB2Driver", "jdbc:db2://localhost:50000/")}); - jdbcMap.put("SQL Server", new DriverURLName[]{new DriverURLName("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://localhost:1433;" + "databaseName=")}); - jdbcMap.put("MySQL", new DriverURLName[]{new DriverURLName("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/"), - new DriverURLName("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost/")}); - jdbcMap.put("Sybase", new DriverURLName[]{new DriverURLName("com.sybase.jdbc2.jdbc.SybDriver", "jdbc:sybase:Tds:localhost:5000/")}); + jdbcMap.put("Inceptor", new DriverURLName[]{new DriverURLName("org.apache.hive.jdbc.HiveDriver", "jdbc:inceptor2://localhost:port/databaseName"), + new DriverURLName("org.apache.hadoop.hive.jdbc.HiveDriver", "jdbc:inceptor://localhost:port/databaseName")}); + jdbcMap.put("Oracle", new DriverURLName[]{new DriverURLName("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:port:databaseName")}); + jdbcMap.put("DB2", new DriverURLName[]{new DriverURLName("com.ibm.db2.jcc.DB2Driver", "jdbc:db2://localhost:port/databaseName")}); + jdbcMap.put("SQL Server", new DriverURLName[]{new DriverURLName("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://localhost:port;databaseName=databaseName")}); + jdbcMap.put("MySQL", new DriverURLName[]{new DriverURLName("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:port/databaseName"), + new DriverURLName("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost:port/databaseName")}); + jdbcMap.put("Sybase", new DriverURLName[]{new DriverURLName("com.sybase.jdbc2.jdbc.SybDriver", "jdbc:sybase:Tds:localhost:port/databaseName")}); + jdbcMap.put("Derby", new DriverURLName[]{new DriverURLName("org.apache.derby.jdbc.ClientDriver", "jdbc:derby://localhost:port/databaseName")}); + jdbcMap.put("Postgre", new DriverURLName[]{new DriverURLName("org.postgresql.Driver", "jdbc:postgresql://localhost:port/databaseName")}); + jdbcMap.put("Access", new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=")}); - jdbcMap.put("Derby", new DriverURLName[]{new DriverURLName("org.apache.derby.jdbc.ClientDriver", "jdbc:derby://localhost:1527/")}); - jdbcMap.put("Postgre", new DriverURLName[]{new DriverURLName("org.postgresql.Driver", "jdbc:postgresql://localhost:5432/")}); jdbcMap.put("SQLite", new DriverURLName[]{new DriverURLName("org.sqlite.JDBC", "jdbc:sqlite://${ENV_HOME}/../help/FRDemo.db")}); } private UIButton dbtypeButton; private UIComboBox dbtypeComboBox; private UIComboBox driverComboBox; + private UITextField dbNameTextField; + private UITextField hostTextField; + private UITextField portTextField; private UITextField urlTextField; private UITextField userNameTextField; private JPasswordField passwordTextField; + private UIComboBox charSetComboBox; private ActionLabel odbcTipsLink; + private JPanel centerPanel; + private Component[][] allComponents; + private Component[][] partComponents; // 请不要改动dbtype,只应该最后添加 private final String[] dbtype = {"Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre", "SQLite", "Inceptor", OTHER_DB}; - // carl:DBCP的一些属性 - private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor(); - private IntegerEditor DBCP_MAX_ACTIVE = new IntegerEditor(); - private IntegerEditor DBCP_MAX_IDLE = new IntegerEditor(); - private IntegerEditor DBCP_MIN_IDLE = new IntegerEditor(); - private IntegerEditor DBCP_MAX_WAIT = new IntegerEditor(); - private UITextField DBCP_VALIDATION_QUERY = new UITextField(); - - private UIComboBox DBCP_TESTONBORROW = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Basic_No"), Toolkit.i18nText("Fine-Design_Basic_Yes")}); - private UIComboBox DBCP_TESTONRETURN = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Basic_No"), Toolkit.i18nText("Fine-Design_Basic_Yes")}); - private UIComboBox DBCP_TESTWHILEIDLE = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Basic_No"), Toolkit.i18nText("Fine-Design_Basic_Yes")}); - - private IntegerEditor DBCP_TIMEBETWEENEVICTIONRUNSMILLS = new IntegerEditor(); - private IntegerEditor DBCP_NUMTESTSPEREVICTIONRUN = new IntegerEditor(); - private IntegerEditor DBCP_MINEVICTABLEIDLETIMEMILLIS = new IntegerEditor(); private JDBCDatabaseConnection jdbcDatabase; @@ -118,7 +116,14 @@ public class JDBCDefPane extends JPanel { driverComboBox = new UIComboBox(); driverComboBox.setEditable(true); driverComboBox.addActionListener(driverListener); + dbNameTextField = new UITextField(15); + hostTextField = new UITextField(15); + portTextField = new UITextField(15); + portTextField.addInputMethodListener(portInputMethodListener); + portTextField.addKeyListener(portKeyListener); urlTextField = new UITextField(15); + urlTextField.getDocument().addDocumentListener(updateParaListener); + enableSubDocListener(); userNameTextField = new UITextField(15); userNameTextField.setName(USER_NAME); passwordTextField = new UIPasswordFieldWithFixedLength(15); @@ -130,11 +135,10 @@ public class JDBCDefPane extends JPanel { double f = TableLayout.FILL; JPanel dbtypePane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); dbtypePane.add(new UILabel((Toolkit.i18nText("Fine-Design_Basic_Database") + ":"))); - JPanel dbtypeComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); Component[][] dbtypeComComponents = {{dbtypeComboBox}}; double[] dbtypeRowSize = {p}; double[] dbtypeColumnSize = {p}; - dbtypeComPane = TableLayoutHelper.createTableLayoutPane(dbtypeComComponents, dbtypeRowSize, dbtypeColumnSize); + JPanel dbtypeComPane = TableLayoutHelper.createTableLayoutPane(dbtypeComComponents, dbtypeRowSize, dbtypeColumnSize); JPanel driverPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); driverPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Driver") + ":")); @@ -161,43 +165,61 @@ public class JDBCDefPane extends JPanel { driverComboBoxAndTips.add(driverComboBox, BorderLayout.WEST); driverComboBoxAndTips.add(odbcTipsPane, BorderLayout.CENTER); + JPanel hostPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + hostPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Host") + ":")); + Component[][] hostComComponents = {{hostTextField}}; + double[] hostRowSize = {p}; + double[] hostColumnSize = {p}; + JPanel hostComPane = TableLayoutHelper.createTableLayoutPane(hostComComponents, hostRowSize, hostColumnSize); + + JPanel portPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + portPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Port") + ":")); + Component[][] portComComponents = {{portTextField}}; + double[] portRowSize = {p}; + double[] portColumnSize = {p}; + JPanel portComPane = TableLayoutHelper.createTableLayoutPane(portComComponents, portRowSize, portColumnSize); + + JPanel dbNamePane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + dbNamePane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_DatabaseName") + ":")); + Component[][] dbNameComComponents = {{dbNameTextField}}; + double[] dbNameRowSize = {p}; + double[] dbNameColumnSize = {p}; + JPanel dbNameComPane = TableLayoutHelper.createTableLayoutPane(dbNameComComponents, dbNameRowSize, dbNameColumnSize); + JPanel urlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); urlPane.add(new UILabel("URL:")); - JPanel urlComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); Component[][] urlComComponents = {{urlTextField, dbtypeButton}}; double[] urlRowSize = {p}; double[] urlColumnSize = {f, 21}; - urlComPane = TableLayoutHelper.createCommonTableLayoutPane(urlComComponents, urlRowSize, urlColumnSize, 4); + JPanel urlComPane = TableLayoutHelper.createCommonTableLayoutPane(urlComComponents, urlRowSize, urlColumnSize, 4); JPanel userPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); userPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Report_UserName") + ":")); - JPanel userComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); Component[][] userComComponents = {{userNameTextField, new UILabel(Toolkit.i18nText("Fine-Design_Basic_Password") + ":"), passwordTextField}}; double[] userRowSize = {p}; double[] userColumnSize = {f, p, f}; - userComPane = TableLayoutHelper.createCommonTableLayoutPane(userComComponents, userRowSize, userColumnSize, 4); - - JPanel passwordPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - passwordPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Password") + ":")); - - Component[][] components = {{dbtypePane, dbtypeComPane}, {driverPane, driverComboBoxAndTips}, {urlPane, urlComPane}, {userPane, userComPane},}; - - double[] rowSize = {p, p, p, p}; + JPanel userComPane = TableLayoutHelper.createCommonTableLayoutPane(userComComponents, userRowSize, userColumnSize, 4); + + String[] defaultEncode = new String[]{Toolkit.i18nText("Fine-Design_Encode_Auto")}; + charSetComboBox = new UIComboBox(ArrayUtils.addAll(defaultEncode, EncodeConstants.ENCODING_ARRAY)); + JPanel chartSetPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + chartSetPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Datasource_Charset") + ":")); + Component[][] charSetComComponents = {{charSetComboBox}}; + double[] charSetRowSize = {p}; + double[] charSetColumnSize = {f}; + JPanel charSetComPane = TableLayoutHelper.createTableLayoutPane(charSetComComponents, charSetRowSize, charSetColumnSize); + + //这边调整的话注意下面的changePane + allComponents = new Component[][]{{dbtypePane, dbtypeComPane}, {driverPane, driverComboBoxAndTips}, {hostPane, hostComPane}, + {portPane, portComPane}, {dbNamePane, dbNameComPane}, {userPane, userComPane}, + {chartSetPane, charSetComPane}, {urlPane, urlComPane}}; + partComponents = new Component[][]{{dbtypePane, dbtypeComPane}, {driverPane, driverComboBoxAndTips}, {urlPane, urlComPane}, + {userPane, userComPane}, {chartSetPane, charSetComPane}}; + double[] rowSize = {p, p, p, p, p, p, p, p}; double[] columnSize = {p, f, 22}; // REPORT-41450 Windows环境的jdk11下dpi为125%时会因为缩放导致显示问题,因此加个水平gap值 - JPanel centerPanel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 6, 6); + centerPanel = TableLayoutHelper.createGapTableLayoutPane(allComponents, rowSize, columnSize, 6, 6); innerthis.add(centerPanel); - JPanel southPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - innerthis.add(southPanel); - southPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 4, 20)); - ActionLabel actionLabel = new ActionLabel(Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr")); - southPanel.add(actionLabel, BorderLayout.EAST); - actionLabel.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - JDialog wDialog = createJDialog(); - wDialog.setVisible(true); - } - }); } public void populate(JDBCDatabaseConnection jdbcDatabase) { @@ -231,29 +253,36 @@ public class JDBCDefPane extends JPanel { } } this.dbtypeComboBox.addActionListener(dbtypeActionListener); + this.dbtypeComboBox.setSelectedItem(this.dbtypeComboBox.getSelectedItem()); this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver()); this.urlTextField.setText(jdbcDatabase.getURL()); this.userNameTextField.setText(jdbcDatabase.getUser()); this.passwordTextField.setText(jdbcDatabase.getPassword()); + this.originalCharSet = jdbcDatabase.getOriginalCharsetName(); + if (StringUtils.isBlank(originalCharSet)) { + this.charSetComboBox.setSelectedItem(Toolkit.i18nText("Fine-Design_Encode_Auto")); + } else { + this.charSetComboBox.setSelectedItem(jdbcDatabase.getOriginalCharsetName()); + } + } + + protected JDBCDatabaseConnection getJDBCDatabase() { + return this.jdbcDatabase; + } - DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); - if (dbcpAttr == null) { - dbcpAttr = new DBCPConnectionPoolAttr(); - jdbcDatabase.setDbcpAttr(dbcpAttr); - this.jdbcDatabase.setDbcpAttr(dbcpAttr); + private void changePane(Object dbType) { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f, 22}; + if (ComparatorUtils.equals(dbType, OTHER_DB) || ComparatorUtils.equals(dbType, "Access") || ComparatorUtils.equals(dbType, "SQLite")) { + if (this.centerPanel.getComponentCount() != partComponents.length * 2) { + centerPanel.removeAll(); + TableLayoutHelper.addComponent2ResultPane(partComponents, new double[]{p, p, p, p, p}, columnSize, centerPanel); + } + } else if (this.centerPanel.getComponentCount() != allComponents.length * 2) { + centerPanel.removeAll(); + TableLayoutHelper.addComponent2ResultPane(allComponents, new double[]{p, p, p, p, p, p, p, p}, columnSize, centerPanel); } - this.DBCP_INITIAL_SIZE.setValue(dbcpAttr.getInitialSize()); - this.DBCP_MAX_ACTIVE.setValue(dbcpAttr.getMaxActive()); - this.DBCP_MAX_IDLE.setValue(dbcpAttr.getMaxIdle()); - this.DBCP_MAX_WAIT.setValue(dbcpAttr.getMaxWait()); - this.DBCP_MIN_IDLE.setValue(dbcpAttr.getMinIdle()); - this.DBCP_VALIDATION_QUERY.setText(dbcpAttr.getValidationQuery()); - this.DBCP_TESTONBORROW.setSelectedIndex(dbcpAttr.isTestOnBorrow() ? 1 : 0); - this.DBCP_TESTONRETURN.setSelectedIndex(dbcpAttr.isTestOnReturn() ? 1 : 0); - this.DBCP_TESTWHILEIDLE.setSelectedIndex(dbcpAttr.isTestWhileIdle() ? 1 : 0); - this.DBCP_MINEVICTABLEIDLETIMEMILLIS.setValue(dbcpAttr.getMinEvictableIdleTimeMillis() / TIME_MULTIPLE); - this.DBCP_NUMTESTSPEREVICTIONRUN.setValue(dbcpAttr.getNumTestsPerEvictionRun()); - this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.setValue(dbcpAttr.getTimeBetweenEvictionRunsMillis()); } public JDBCDatabaseConnection update() { @@ -265,25 +294,14 @@ public class JDBCDefPane extends JPanel { jdbcDatabase.setURL(this.urlTextField.getText().trim()); jdbcDatabase.setUser(this.userNameTextField.getText().trim()); jdbcDatabase.setPassword(new String(this.passwordTextField.getPassword()).trim()); - - DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); - if (dbcpAttr == null) { - dbcpAttr = new DBCPConnectionPoolAttr(); - jdbcDatabase.setDbcpAttr(dbcpAttr); + jdbcDatabase.setOriginalCharsetName(this.originalCharSet); + if (this.charSetComboBox.getSelectedIndex() == 0) { + jdbcDatabase.setNewCharsetName(null); + jdbcDatabase.setOriginalCharsetName(null); + } else { + jdbcDatabase.setNewCharsetName(EncodeConstants.ENCODING_GBK); + jdbcDatabase.setOriginalCharsetName(((String) this.charSetComboBox.getSelectedItem())); } - dbcpAttr.setInitialSize(this.DBCP_INITIAL_SIZE.getValue().intValue()); - dbcpAttr.setMaxActive(this.DBCP_MAX_ACTIVE.getValue().intValue()); - dbcpAttr.setMaxIdle(this.DBCP_MAX_IDLE.getValue().intValue()); - dbcpAttr.setMaxWait(this.DBCP_MAX_WAIT.getValue().intValue()); - dbcpAttr.setMinIdle(this.DBCP_MIN_IDLE.getValue().intValue()); - dbcpAttr.setValidationQuery(this.DBCP_VALIDATION_QUERY.getText()); - dbcpAttr.setTestOnBorrow(this.DBCP_TESTONBORROW.getSelectedIndex() == 0 ? false : true); - dbcpAttr.setTestOnReturn(this.DBCP_TESTONRETURN.getSelectedIndex() == 0 ? false : true); - dbcpAttr.setTestWhileIdle(this.DBCP_TESTWHILEIDLE.getSelectedIndex() == 0 ? false : true); - dbcpAttr.setMinEvictableIdleTimeMillis(((Number) this.DBCP_MINEVICTABLEIDLETIMEMILLIS.getValue()).intValue() * TIME_MULTIPLE); - dbcpAttr.setNumTestsPerEvictionRun(((Number) this.DBCP_NUMTESTSPEREVICTIONRUN.getValue()).intValue()); - dbcpAttr.setTimeBetweenEvictionRunsMillis(((Number) this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.getValue()).intValue()); - return jdbcDatabase; } @@ -307,6 +325,7 @@ public class JDBCDefPane extends JPanel { } // 更改数据库类型后 数据库名称置空和之前逻辑保持一致 jdbcDatabase.setDatabase(StringUtils.EMPTY); + changePane(dbtypeComboBox.getSelectedItem()); } }; @@ -365,49 +384,154 @@ public class JDBCDefPane extends JPanel { } }; - private JDialog createJDialog() { - return new DBCPAttrPane().showWindow(SwingUtilities.getWindowAncestor(JDBCDefPane.this)); + InputMethodListener portInputMethodListener = new InputMethodListener() { + @Override + public void inputMethodTextChanged(InputMethodEvent event) { + char ch = event.getText().current(); + if (!(ch >= '0' && ch <= '9')) { + event.consume(); + } + } + + @Override + public void caretPositionChanged(InputMethodEvent event) { + + } + }; + + DocumentListener updateParaListener = new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + updatePara(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + updatePara(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + updatePara(); + } + }; + + private void updatePara() { + String dbType = dbtypeComboBox.getSelectedItem().toString(); + if (ComparatorUtils.equals(dbType, OTHER_DB) || ComparatorUtils.equals(dbType, "Access") || ComparatorUtils.equals(dbType, "SQLite")) { + return; + } + disableSubDocListener(); + String url = urlTextField.getText().trim(); + Matcher matcher = ORACLE_URL.matcher(url); + if (matcher.find()) { + if (matcher.group(1) != null) { + hostTextField.setText(matcher.group(1)); + } else { + hostTextField.setText(StringUtils.EMPTY); + } + if (matcher.group(3) != null) { + portTextField.setText(matcher.group(3)); + } else { + portTextField.setText(StringUtils.EMPTY); + } + if (matcher.group(5) != null) { + dbNameTextField.setText(matcher.group(5)); + } else { + dbNameTextField.setText(StringUtils.EMPTY); + } + enableSubDocListener(); + return; + } + matcher = GENERAL_URL.matcher(url); + if (matcher.find()) { + if (matcher.group(2) != null) { + hostTextField.setText(matcher.group(2)); + } else { + hostTextField.setText(StringUtils.EMPTY); + } + if (matcher.group(4) != null) { + portTextField.setText(matcher.group(4)); + } else { + portTextField.setText(StringUtils.EMPTY); + } + if (matcher.group(7) != null) { + dbNameTextField.setText(matcher.group(7)); + } else { + dbNameTextField.setText(StringUtils.EMPTY); + } + enableSubDocListener(); + } + } + + private void enableSubDocListener() { + this.dbNameTextField.getDocument().addDocumentListener(updateURLListener); + this.hostTextField.getDocument().addDocumentListener(updateURLListener); + } + + private void disableSubDocListener() { + this.dbNameTextField.getDocument().removeDocumentListener(updateURLListener); + this.hostTextField.getDocument().removeDocumentListener(updateURLListener); + } + + KeyListener portKeyListener = new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + String port = portTextField.getText().trim(); + if (isPortValid(port)) { + updateURL(); + } else { + portTextField.setText(port.replaceAll(e.getKeyChar() + "", "")); + } + } + }; + + private boolean isPortValid(String port) { + return PORT.matcher(port).find(); } - class DBCPAttrPane extends BasicPane { - public DBCPAttrPane() { - JPanel defaultPane = this; - - // JPanel northFlowPane - JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - defaultPane.add(northFlowPane, BorderLayout.NORTH); - - DBCP_VALIDATION_QUERY.setColumns(15); - // ContextPane - - double f = TableLayout.FILL; - // double p = TableLayout.PREFERRED; - double[] rowSize = {f, f, f, f, f, f, f, f, f, f, f, f}; - double[] columnSize = {f, f}; - Component[][] comps = { - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Initial_Size") + ":", SwingConstants.RIGHT), DBCP_INITIAL_SIZE}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Active") + ":", SwingConstants.RIGHT), DBCP_MAX_ACTIVE}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Idle") + ":", SwingConstants.RIGHT), DBCP_MAX_IDLE}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Min_Idle") + ":", SwingConstants.RIGHT), DBCP_MIN_IDLE}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Max_Wait_Time") + ":", SwingConstants.RIGHT), DBCP_MAX_WAIT}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Validation_Query") + ":", SwingConstants.RIGHT), DBCP_VALIDATION_QUERY}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Borrow") + ":", SwingConstants.RIGHT), DBCP_TESTONBORROW}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Return") + ":", SwingConstants.RIGHT), DBCP_TESTONRETURN}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_While_Idle") + ":", SwingConstants.RIGHT), DBCP_TESTWHILEIDLE}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Evictionruns_millis") + ":", SwingConstants.RIGHT), - DBCP_TIMEBETWEENEVICTIONRUNSMILLS}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Dbcp_Num_Test_Per_Evction_Run") + ":", SwingConstants.RIGHT), DBCP_NUMTESTSPEREVICTIONRUN}, - {new UILabel(Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Mix_Evictable_Idle_Time_Millis") + ":", SwingConstants.RIGHT), - DBCP_MINEVICTABLEIDLETIMEMILLIS}}; - - JPanel contextPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSize, columnSize, 10, 4); - contextPane.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, UIConstants.LINE_COLOR)); - northFlowPane.add(contextPane); + DocumentListener updateURLListener = new DocumentListener() { + + @Override + public void insertUpdate(DocumentEvent e) { + updateURL(); } @Override - protected String title4PopupWindow() { - return Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr"); + public void removeUpdate(DocumentEvent e) { + updateURL(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + updateURL(); + } + }; + + private void updateURL() { + String dbType = dbtypeComboBox.getSelectedItem().toString(); + if (!ComparatorUtils.equals(dbType, OTHER_DB) && !ComparatorUtils.equals(dbType, "Access") && !ComparatorUtils.equals(dbType, "SQLite")) { + urlTextField.getDocument().removeDocumentListener(updateParaListener); + DriverURLName[] driverURLNames = jdbcMap.get(dbType); + String defaultURL = null; + for (DriverURLName driverURLName : driverURLNames) { + if (ComparatorUtils.equals(driverURLName.getDriver(), driverComboBox.getSelectedItem().toString())) { + defaultURL = driverURLName.getURL(); + } + } + if (defaultURL != null) { + String host = hostTextField.getText().trim(); + String port = portTextField.getText().trim(); + String dbName = dbNameTextField.getText().trim(); + defaultURL = defaultURL.replace("localhost", host).replace(":port", ComparatorUtils.equals(port, "") ? "" : ":" + port); + if (defaultURL.startsWith("jdbc:sqlserver")) { + defaultURL = defaultURL.replace("=databaseName", "=" + dbName); + } else { + defaultURL = defaultURL.replace("databaseName", dbName); + } + } + urlTextField.setText(defaultURL); + urlTextField.getDocument().addDocumentListener(updateParaListener); } } diff --git a/designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java b/designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java index d394f43ee7..e664524026 100644 --- a/designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java +++ b/designer-base/src/main/java/com/fr/design/layout/TableLayoutHelper.java @@ -233,7 +233,7 @@ public class TableLayoutHelper { container.repaint(); } - private static void addComponent2ResultPane(Component[][] components, double[] rowSize, double[] columnSize, JPanel resultPane) { + public static void addComponent2ResultPane(Component[][] components, double[] rowSize, double[] columnSize, JPanel resultPane) { for (int i = 0; i < components.length; i++) { if (i >= rowSize.length) { From a0f2067b79232c0931003a11ce82b7e2ef8e2920 Mon Sep 17 00:00:00 2001 From: pengda Date: Wed, 14 Apr 2021 14:24:52 +0800 Subject: [PATCH 17/49] =?UTF-8?q?REPORT-49055=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=95=B0=E6=8D=AE=E8=BF=9E=E6=8E=A5=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/data/datapane/connect/JDBCDefPane.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java index 22c3ac82e9..d999962021 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java @@ -482,6 +482,9 @@ public class JDBCDefPane extends JPanel { updateURL(); } else { portTextField.setText(port.replaceAll(e.getKeyChar() + "", "")); + if (!isPortValid(portTextField.getText())) { + portTextField.setText(""); + } } } }; From 6ad9bceeeb925141cd3fc03e2a60166ac1a9de5d Mon Sep 17 00:00:00 2001 From: pengda Date: Wed, 14 Apr 2021 15:33:26 +0800 Subject: [PATCH 18/49] =?UTF-8?q?REPORT-49055=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=95=B0=E6=8D=AE=E8=BF=9E=E6=8E=A5=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/data/datapane/connect/JDBCDefPane.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java index d999962021..3490341f2f 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java @@ -227,7 +227,6 @@ public class JDBCDefPane extends JPanel { jdbcDatabase = new JDBCDatabaseConnection(); } this.jdbcDatabase = jdbcDatabase; - this.dbtypeComboBox.removeActionListener(dbtypeActionListener); if (ComparatorUtils.equals(jdbcDatabase.getDriver(), "sun.jdbc.odbc.JdbcOdbcDriver") && jdbcDatabase.getURL().startsWith("jdbc:odbc:Driver={Microsoft")) { this.dbtypeComboBox.setSelectedItem("Access"); @@ -252,8 +251,6 @@ public class JDBCDefPane extends JPanel { this.dbtypeComboBox.setSelectedItem(OTHER_DB); } } - this.dbtypeComboBox.addActionListener(dbtypeActionListener); - this.dbtypeComboBox.setSelectedItem(this.dbtypeComboBox.getSelectedItem()); this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver()); this.urlTextField.setText(jdbcDatabase.getURL()); this.userNameTextField.setText(jdbcDatabase.getUser()); From 15c3770f546e4d302afa2a8fceffce23ee5244cd Mon Sep 17 00:00:00 2001 From: hades Date: Thu, 15 Apr 2021 09:33:39 +0800 Subject: [PATCH 19/49] =?UTF-8?q?REPORT-49986=20=E3=80=9010.0.16=E3=80=91?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96=E4=B9=8B=E9=98=BB=E5=A1=9E?= =?UTF-8?q?EDT=E7=BA=BF=E7=A8=8B=E6=97=B6=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/DesignModelAdapter.java | 16 ++ .../design/actions/ForbiddenUpdateAction.java | 26 ++ .../fr/design/actions/edit/RedoAction.java | 3 +- .../fr/design/actions/edit/UndoAction.java | 5 +- .../actions/file/SaveAsTemplateAction.java | 8 +- .../actions/file/SaveTemplateAction.java | 5 +- .../design/actions/file/WebPreviewUtils.java | 20 +- .../design/data/BasicTableDataTreePane.java | 3 +- .../data/datapane/TableDataTreePane.java | 5 +- .../design/env/DesignerWorkspaceLoader.java | 21 ++ .../com/fr/design/env/RemoteWorkspace.java | 44 +++- .../env/WorkspaceChangeLoadingDialog.java | 47 ++++ .../design/file/HistoryTemplateListCache.java | 31 +++ .../fr/design/file/MutilTempalteTabPane.java | 29 ++- .../fr/design/file/SaveSomeTemplatePane.java | 2 +- .../design/gui/ibutton/UIForbiddenButton.java | 52 ++++ .../gui/ibutton/UIForbiddenButtonUI.java | 25 ++ .../gui/ibutton/UISaveForbiddenButton.java | 44 ++++ .../gui/ibutton/UISaveForbiddenButtonUI.java | 25 ++ .../design/gui/imenu/UIForBiddenHeadMenu.java | 18 ++ .../design/gui/imenu/UIForbiddenMenuUI.java | 25 ++ .../com/fr/design/gui/itoolbar/UIToolbar.java | 17 +- .../fr/design/mainframe/DesignerFrame.java | 45 +--- .../DesignerFrameFileDealerPane.java | 27 +- .../fr/design/mainframe/DesktopCardPane.java | 46 +++- .../mainframe/EastRegionContainerPane.java | 10 +- .../com/fr/design/mainframe/JTemplate.java | 245 +++++++++++++++--- .../fr/design/mainframe/JTemplateSave.java | 40 +++ .../fr/design/mainframe/OpenLoadingPane.java | 60 +++++ .../fr/design/mainframe/TransparentPane.java | 102 ++++++++ .../main/java/com/fr/design/menu/MenuDef.java | 37 ++- .../com/fr/design/worker/WorkerManager.java | 49 ++++ .../com/fr/design/worker/open/OpenResult.java | 28 ++ .../com/fr/design/worker/open/OpenWorker.java | 115 ++++++++ .../worker/save/CallbackSaveWorker.java | 75 ++++++ .../worker/save/EmptyCallBackSaveWorker.java | 37 +++ .../com/fr/design/worker/save/SaveWorker.java | 82 ++++++ .../java/com/fr/file/FILEChooserPane.java | 5 +- .../fr/design/mainframe/FormModelAdapter.java | 4 + .../java/com/fr/design/mainframe/JForm.java | 8 + .../fr/design/mainframe/ToolBarButton.java | 12 +- .../fr/design/mainframe/ElementCasePane.java | 3 + .../com/fr/design/mainframe/JWorkBook.java | 9 + .../mainframe/WorkBookModelAdapter.java | 3 + .../mainframe/app/AbstractWorkBookApp.java | 29 ++- .../com/fr/design/mainframe/app/CptApp.java | 8 +- .../com/fr/design/mainframe/app/FormApp.java | 34 ++- .../main/java/com/fr/start/MainDesigner.java | 7 +- .../fr/start/module/DesignerActivator.java | 2 + .../module/DesignerWorkspaceActivator.java | 3 + 50 files changed, 1462 insertions(+), 134 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/actions/ForbiddenUpdateAction.java create mode 100644 designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceLoader.java create mode 100644 designer-base/src/main/java/com/fr/design/env/WorkspaceChangeLoadingDialog.java create mode 100644 designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButton.java create mode 100644 designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java create mode 100644 designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButton.java create mode 100644 designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButtonUI.java create mode 100644 designer-base/src/main/java/com/fr/design/gui/imenu/UIForBiddenHeadMenu.java create mode 100644 designer-base/src/main/java/com/fr/design/gui/imenu/UIForbiddenMenuUI.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/JTemplateSave.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/TransparentPane.java create mode 100644 designer-base/src/main/java/com/fr/design/worker/WorkerManager.java create mode 100644 designer-base/src/main/java/com/fr/design/worker/open/OpenResult.java create mode 100644 designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java create mode 100644 designer-base/src/main/java/com/fr/design/worker/save/CallbackSaveWorker.java create mode 100644 designer-base/src/main/java/com/fr/design/worker/save/EmptyCallBackSaveWorker.java create mode 100644 designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java diff --git a/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java b/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java index 7a237ffb59..f48efa15ba 100644 --- a/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java +++ b/designer-base/src/main/java/com/fr/design/DesignModelAdapter.java @@ -75,6 +75,12 @@ public abstract class DesignModelAdapter model) { currentModelAdapter = model; } @@ -244,6 +250,16 @@ public abstract class DesignModelAdapter undoComponent = getEditingComponent(); if (DesignerEnvManager.getEnvManager().isSupportUndo()) { - this.setEnabled(undoComponent != null && undoComponent.canRedo()); + boolean enable = undoComponent != null && undoComponent.canRedo() && !undoComponent.isOpening() && !undoComponent.isSaving(); + this.setEnabled(enable); } else { this.setEnabled(false); } diff --git a/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java b/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java index ff337620c9..53e5ed7c5a 100644 --- a/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java @@ -28,7 +28,7 @@ public class UndoAction extends UpdateAction implements TemplateComponentActionI @Override public JTemplate getEditingComponent() { - return t; + return t; } /** @@ -49,7 +49,8 @@ public class UndoAction extends UpdateAction implements TemplateComponentActionI public void update() { JTemplate undoComponent = getEditingComponent(); if (DesignerEnvManager.getEnvManager().isSupportUndo()) { - this.setEnabled(undoComponent != null && undoComponent.canUndo()); + boolean enable = undoComponent != null && undoComponent.canUndo() && !undoComponent.isOpening() && !undoComponent.isSaving(); + this.setEnabled(enable); } else { this.setEnabled(false); } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SaveAsTemplateAction.java b/designer-base/src/main/java/com/fr/design/actions/file/SaveAsTemplateAction.java index a60b397628..07b8a8024b 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SaveAsTemplateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SaveAsTemplateAction.java @@ -31,7 +31,7 @@ public class SaveAsTemplateAction extends JTemplateAction> { JTemplate jt = this.getEditingComponent(); // kunsnat: 保存前停止编辑状态,保存属性. jt.stopEditing(); - jt.saveAsTemplate(); + jt.saveAsDirectly(); this.setEnabled(true); jt.requestFocus(); @@ -40,9 +40,7 @@ public class SaveAsTemplateAction extends JTemplateAction> { @Override public void update() { super.update(); - -// this.setEnabled(!this.getEditingComponent().isSaved()); -// 另存为按钮应该一直可用使用 - this.setEnabled(true); + boolean enable = !this.getEditingComponent().isSaving() && !this.getEditingComponent().isOpening(); + this.setEnabled(enable); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java b/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java index 920f5b41ae..dfc2071b11 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java @@ -31,14 +31,15 @@ public class SaveTemplateAction extends JTemplateAction> { public void actionPerformed(ActionEvent e) { JTemplate jt = this.getEditingComponent(); jt.stopEditing(); - jt.saveTemplate(); + jt.saveDirectly(); jt.requestFocus(); } @Override public void update() { super.update(); - this.setEnabled(!this.getEditingComponent().isSaved()); + boolean enable = !this.getEditingComponent().isSaved() && !this.getEditingComponent().isSaving() && !this.getEditingComponent().isOpening(); + this.setEnabled(enable); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java b/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java index 9f87943e10..52ce8dd50b 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java @@ -6,6 +6,7 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.DesignUtils; +import com.fr.design.worker.save.CallbackSaveWorker; import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.general.GeneralUtils; @@ -83,15 +84,18 @@ public final class WebPreviewUtils { WARNING_MESSAGE ); if (OK_OPTION == selVal) { - if (!jt.saveAsTemplate()) { - return; - } - } else { - return; + CallbackSaveWorker worker = jt.saveAs(); + worker.start(jt.getTarget().getTemplateID()); + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + browseUrl(jt.getEditingFILE(), baseRoute, map, actionType, jt); + } + }); } - currentTemplate = jt.getEditingFILE(); + return; } - browseUrl(currentTemplate, baseRoute, map, actionType, jt); + browseUrl(jt.getEditingFILE(), baseRoute, map, actionType, jt); } else { // 说明模板没有保存在报表运行环境下面,提示用户 int selVal = showConfirmDialog( @@ -150,7 +154,7 @@ public final class WebPreviewUtils { WARNING_MESSAGE ); if (OK_OPTION == selVal) { - jt.saveAsTemplate(); + jt.saveAsDirectly(); } } } diff --git a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java index 34482d0d20..bfdd11bd46 100644 --- a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java @@ -6,6 +6,7 @@ import com.fr.data.TableDataSource; import com.fr.data.api.StoreProcedureAssist; import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.design.DesignModelAdapter; +import com.fr.design.actions.ForbiddenUpdateAction; import com.fr.design.actions.UpdateAction; import com.fr.design.data.datapane.TableDataCreatorProducer; import com.fr.design.data.datapane.TableDataNameObjectCreator; @@ -398,7 +399,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp return prefix + count; } - protected class PreviewTableDataAction extends UpdateAction { + protected class PreviewTableDataAction extends ForbiddenUpdateAction { private TableDataTree dataTree; public PreviewTableDataAction(TableDataTree dataTree) { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 230bf8a47c..36cd0a4fe6 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -6,6 +6,7 @@ import com.fr.data.TableDataSource; import com.fr.data.impl.TableDataSourceDependent; import com.fr.design.DesignModelAdapter; import com.fr.design.ExtraDesignClassManager; +import com.fr.design.actions.ForbiddenUpdateAction; import com.fr.design.actions.UpdateAction; import com.fr.design.constants.UIConstants; import com.fr.design.data.BasicTableDataTreePane; @@ -243,7 +244,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { dg.setVisible(true); } - private class EditAction extends UpdateAction { + private class EditAction extends ForbiddenUpdateAction { public EditAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Edit")); this.setMnemonic('E'); @@ -260,7 +261,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { } } - private class RemoveAction extends UpdateAction { + private class RemoveAction extends ForbiddenUpdateAction { public RemoveAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove")); diff --git a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceLoader.java b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceLoader.java new file mode 100644 index 0000000000..c910c7db42 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceLoader.java @@ -0,0 +1,21 @@ +package com.fr.design.env; + +import com.fr.workspace.WorkContext; +import com.fr.workspace.Workspace; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/11 + */ +public class DesignerWorkspaceLoader { + + public static void init() { + Workspace workspace = WorkContext.getCurrent(); + if (workspace.isLocal()) { + return; + } + workspace.isWarDeploy(); + workspace.isCluster(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java index 6d1685e74f..c3c5a34a3e 100644 --- a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java +++ b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java @@ -14,6 +14,7 @@ import com.fr.workspace.connect.WorkspaceConnectionInfo; import com.fr.workspace.server.authority.decision.DecisionOperator; import com.fr.workspace.engine.rpc.WorkspaceProxyPool; import com.fr.workspace.pool.WorkObjectPool; +import javax.swing.SwingWorker; /** * Created by juhaoyu on 2018/6/14. @@ -29,6 +30,10 @@ public class RemoteWorkspace implements Workspace { private volatile Boolean isRoot = null; + private volatile Boolean cluster; + + private volatile Boolean warDeploy; + RemoteWorkspace(WorkspaceClient client, WorkspaceConnectionInfo connection) { this.client = client; @@ -50,12 +55,15 @@ public class RemoteWorkspace implements Workspace { @Override public boolean isWarDeploy() { - return WorkContext.getCurrent().get(CommonOperator.class, new ExceptionHandler() { - @Override - public Boolean callHandler(RPCInvokerExceptionInfo rpcInvokerExceptionInfo) { - return false; - } - }).isWarDeploy(); + if (warDeploy == null) { + warDeploy = WorkContext.getCurrent().get(CommonOperator.class, new ExceptionHandler() { + @Override + public Boolean callHandler(RPCInvokerExceptionInfo rpcInvokerExceptionInfo) { + return false; + } + }).isWarDeploy(); + } + return warDeploy; } @Override @@ -79,12 +87,15 @@ public class RemoteWorkspace implements Workspace { @Override public boolean isCluster() { - return WorkContext.getCurrent().get(ClusterOperator.class, new ExceptionHandler() { - @Override - public Boolean callHandler(RPCInvokerExceptionInfo rpcInvokerExceptionInfo) { - return false; - } - }).isCluster(); + if (cluster == null) { + cluster = WorkContext.getCurrent().get(ClusterOperator.class, new ExceptionHandler() { + @Override + public Boolean callHandler(RPCInvokerExceptionInfo rpcInvokerExceptionInfo) { + return false; + } + }).isCluster(); + } + return cluster; } @Override @@ -114,8 +125,13 @@ public class RemoteWorkspace implements Workspace { @Override public void close() { - - client.close(); + new SwingWorker() { + @Override + protected Void doInBackground() throws Exception { + client.close(); + return null; + } + }.execute(); } @Override diff --git a/designer-base/src/main/java/com/fr/design/env/WorkspaceChangeLoadingDialog.java b/designer-base/src/main/java/com/fr/design/env/WorkspaceChangeLoadingDialog.java new file mode 100644 index 0000000000..91dc3fcd7b --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/env/WorkspaceChangeLoadingDialog.java @@ -0,0 +1,47 @@ +package com.fr.design.env; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.utils.gui.GUICoreUtils; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import javax.swing.ImageIcon; +import javax.swing.JDialog; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/10 + */ +public class WorkspaceChangeLoadingDialog extends JDialog { + + private static final ImageIcon LOADING_ICON = new ImageIcon(WorkspaceChangeLoadingDialog.class.getResource("/com/fr/web/images/loading-local.gif")); + + private static WorkspaceChangeLoadingDialog dialog; + + public WorkspaceChangeLoadingDialog() { + super(DesignerContext.getDesignerFrame()); + setLayout(new BorderLayout()); + this.getContentPane().setBackground(Color.WHITE); + this.setResizable(false); + this.setUndecorated(true); + this.setAlwaysOnTop(true); + this.setModal(false); + this.setSize(new Dimension(400, 100)); + this.add(new UILabel(LOADING_ICON, UILabel.CENTER), BorderLayout.NORTH); + this.add(new UILabel(Toolkit.i18nText("Fine-Design_Change_Workspace_Tip"), UILabel.CENTER), BorderLayout.CENTER); + GUICoreUtils.centerWindow(this); + } + + + public static void showDialog() { + dialog = new WorkspaceChangeLoadingDialog(); + dialog.setVisible(true); + } + + public static void hideDialog() { + dialog.dispose(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index 8742a894f2..4487a2bbfc 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -33,6 +33,7 @@ import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Set; +import javax.swing.SwingWorker; /** * 历史模板缓存 @@ -45,6 +46,7 @@ public class HistoryTemplateListCache implements CallbackEvent { private static final int DEAD_LINE = DesignerEnvManager.getEnvManager().getCachingTemplateLimit(); private List> historyList; private JTemplate editingTemplate; + private SwingWorker stashWorker; public static HistoryTemplateListCache getInstance() { return Holder.INSTANCE; @@ -338,6 +340,17 @@ public class HistoryTemplateListCache implements CallbackEvent { * @see HistoryTemplateListCache#load() */ public void stash() { + stashWorker = new SwingWorker() { + @Override + protected Boolean doInBackground() throws Exception { + _stash(); + return true; + } + }; + stashWorker.execute(); + + } + private void _stash() { FineLoggerFactory.getLogger().info("Env Change Template Stashing..."); if (stashFILEMap == null) { stashFILEMap = new HashMap(); @@ -363,6 +376,14 @@ public class HistoryTemplateListCache implements CallbackEvent { FineLoggerFactory.getLogger().info("Env Change Template Stashed."); } + private boolean checkStash() { + try { + return stashWorker.get(); + } catch (Exception e) { + return false; + } + } + /** * 切换环境前将正在编辑的模板暂存起来后,在新环境重新读取一遍 *

@@ -371,6 +392,9 @@ public class HistoryTemplateListCache implements CallbackEvent { * @see HistoryTemplateListCache#stash() */ public void load() { + if (!checkStash()) { + return; + } FineLoggerFactory.getLogger().info("Env Change Template Loading..."); if (stashFILEMap != null && stashFILEMap.size() != 0) { int size = historyList.size(); @@ -488,4 +512,11 @@ public class HistoryTemplateListCache implements CallbackEvent { return false; } + public void replaceCurrentEditingTemplate(JTemplate jt) { + int index = contains(this.editingTemplate); + this.editingTemplate = jt; + historyList.set(index, jt); + MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList); + MutilTempalteTabPane.getInstance().setSelectedIndex(contains(jt)); + } } 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 99cd179169..b5f6b2ffda 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 @@ -14,6 +14,8 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.DesignUtils; 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.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; @@ -682,9 +684,15 @@ public class MutilTempalteTabPane extends JComponent { 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) { - specifiedTemplate.saveTemplate(); - FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); - closeTpl(specifiedTemplate); + 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.getTarget().getTemplateID()); } else if (returnVal == JOptionPane.NO_OPTION) { closeTpl(specifiedTemplate); } @@ -919,8 +927,19 @@ public class MutilTempalteTabPane extends JComponent { closeIconIndex = getTemplateIndex(evtX); clodeMode = MOUSE_PRESS_CLOSE; //关闭close图标所在的模板{ - closeFormat(openedTemplate.get(closeIconIndex)); - closeSpecifiedTemplate(openedTemplate.get(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; + } + } + closeFormat(template); + closeSpecifiedTemplate(template); DesignerContext.getDesignerFrame().getContentFrame().repaint(); isShowList = false; } else { diff --git a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java index e331d296ef..7fef2e379b 100644 --- a/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/file/SaveSomeTemplatePane.java @@ -195,7 +195,7 @@ public class SaveSomeTemplatePane extends BasicPane { specifiedTemplate.stopEditing(); int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Confirm"), 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())); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButton.java new file mode 100644 index 0000000000..f447749113 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButton.java @@ -0,0 +1,52 @@ +package com.fr.design.gui.ibutton; + +import com.fr.base.CellBorderStyle; +import javax.swing.Action; +import javax.swing.Icon; +import javax.swing.plaf.ButtonUI; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/9 + */ +public class UIForbiddenButton extends UIButton { + + public UIForbiddenButton() { + super(); + } + + public UIForbiddenButton(String string) { + super(string); + } + + public UIForbiddenButton(Icon icon) { + super(icon); + } + + public UIForbiddenButton(Action action) { + super(action); + } + + public UIForbiddenButton(String text, Icon icon) { + super(text, icon); + } + + public UIForbiddenButton(Icon normal, Icon rollOver, Icon pressed) { + super(normal, rollOver, pressed); + } + + public UIForbiddenButton(String resource, boolean needSetDisabledIcon) { + super(resource, needSetDisabledIcon); + } + + @Override + public CellBorderStyle getBorderStyle() { + return super.getBorderStyle(); + } + + @Override + public ButtonUI getUI() { + return new UIForbiddenButtonUI(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java new file mode 100644 index 0000000000..94353deea7 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java @@ -0,0 +1,25 @@ +package com.fr.design.gui.ibutton; + +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.JTemplate; +import java.awt.Graphics; +import javax.swing.JComponent; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/11 + */ +public class UIForbiddenButtonUI extends UIButtonUI { + + @Override + public void paint(Graphics g, JComponent c) { + super.paint(g, c); + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + boolean flag = true; + if (template != null) { + flag = c.isEnabled() && !template.isSaving() && !template.isOpening(); + } + c.setEnabled(flag); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButton.java new file mode 100644 index 0000000000..7e55c1b35e --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButton.java @@ -0,0 +1,44 @@ +package com.fr.design.gui.ibutton; + +import javax.swing.Action; +import javax.swing.Icon; +import javax.swing.plaf.ButtonUI; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/10 + */ +public class UISaveForbiddenButton extends UIButton { + public UISaveForbiddenButton() { + } + + public UISaveForbiddenButton(String string) { + super(string); + } + + public UISaveForbiddenButton(Icon icon) { + super(icon); + } + + public UISaveForbiddenButton(Action action) { + super(action); + } + + public UISaveForbiddenButton(String text, Icon icon) { + super(text, icon); + } + + public UISaveForbiddenButton(Icon normal, Icon rollOver, Icon pressed) { + super(normal, rollOver, pressed); + } + + public UISaveForbiddenButton(String resource, boolean needSetDisabledIcon) { + super(resource, needSetDisabledIcon); + } + + @Override + public ButtonUI getUI() { + return new UISaveForbiddenButtonUI(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButtonUI.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButtonUI.java new file mode 100644 index 0000000000..7a830c39fd --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButtonUI.java @@ -0,0 +1,25 @@ +package com.fr.design.gui.ibutton; + +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.JTemplate; +import java.awt.Graphics; +import javax.swing.JComponent; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/14 + */ +public class UISaveForbiddenButtonUI extends UIButtonUI { + + @Override + public void paint(Graphics g, JComponent c) { + super.paint(g, c); + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + boolean flag = true; + if (template != null) { + flag = !template.isSaving(); + } + c.setEnabled(flag); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIForBiddenHeadMenu.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIForBiddenHeadMenu.java new file mode 100644 index 0000000000..14a12b58c5 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIForBiddenHeadMenu.java @@ -0,0 +1,18 @@ +package com.fr.design.gui.imenu; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/11 + */ +public class UIForBiddenHeadMenu extends UIHeadMenu { + + public UIForBiddenHeadMenu(String name) { + super(name); + } + + @Override + public void updateUI() { + setUI(new UIForbiddenMenuUI()); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIForbiddenMenuUI.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIForbiddenMenuUI.java new file mode 100644 index 0000000000..7a28513400 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/imenu/UIForbiddenMenuUI.java @@ -0,0 +1,25 @@ +package com.fr.design.gui.imenu; + +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.JTemplate; +import java.awt.Graphics; +import javax.swing.JComponent; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/11 + */ +public class UIForbiddenMenuUI extends UIMenuUI { + + @Override + public void paint(Graphics g, JComponent c) { +// JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); +// boolean flag = true; +// if (template != null) { +// flag = !template.isSaving() && !template.isOpening(); +// } +// c.setEnabled(flag); + super.paint(g, c); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java b/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java index d2cca4b482..1740c6d3b4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java +++ b/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java @@ -1,8 +1,11 @@ package com.fr.design.gui.itoolbar; -import javax.swing.*; -import java.awt.*; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.JTemplate; +import java.awt.Component; +import java.awt.FlowLayout; import java.util.ArrayList; +import javax.swing.JToolBar; public class UIToolbar extends JToolBar { @@ -31,4 +34,14 @@ public class UIToolbar extends JToolBar { } } } + + public void refreshUIToolBar() { + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (template != null) { + for (int i = 0; i < getComponentCount(); i++) { + Component component = getComponents()[i]; + component.setEnabled(!template.isSaving() && !template.isOpening()); + } + } + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index eec902c4c1..7ebf3ebe05 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -404,7 +404,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta designerOpenedListenerList.clear(); } - protected DesktopCardPane getCenterTemplateCardPane() { + public DesktopCardPane getCenterTemplateCardPane() { return centerTemplateCardPane; } @@ -811,6 +811,13 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta layeredPane.repaint(); } + public void refreshUIToolBar() { + if (toolbarComponent instanceof UIToolbar) { + ((UIToolbar ) toolbarComponent).refreshUIToolBar(); + } + combineUp.refreshUIToolBar(); + } + public JComponent getToolbarComponent() { return this.toolbarComponent; @@ -940,42 +947,6 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta return this.centerTemplateCardPane.getSelectedJTemplate(); } - /** - * 保存当前编辑的模板 - */ - - public void saveCurrentEditingTemplate() { - - JTemplate editingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - if (editingTemplate == null) { - return; - } - if (editingTemplate.isSaved()) {// isSaved == true表示已经保存过,或者新建的一张模板 - if (editingTemplate.getEditingFILE().exists()) {// 表示磁盘上的某一张已经保存过的模板,要添加到历史中 - // HistoryTemplateListPane.getInstance().addHistory(); - } - } else { - editingTemplate.stopEditing(); - if (!editingTemplate.getEditingFILE().exists()) { - int returnVal = FineJOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), - Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + editingTemplate.getEditingFILE() - + "\" ?", Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - if (returnVal == JOptionPane.YES_OPTION && editingTemplate.saveTemplate()) { - editingTemplate.saveTemplate(); - FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", - editingTemplate.getEditingFILE().getName())); - } - } else { - if (editingTemplate.saveTemplate()) { - editingTemplate.saveTemplate(); - FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", - editingTemplate.getEditingFILE().getName())); - } - } - } - } - /** * 添加新建模板, 并激活. */ diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index fb8f9a2da2..ad4726d664 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -289,16 +289,18 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt // 新建文件夹,重命名操作,在explorer中打开三个操作在选中单个文件夹或者文件时可用,其他情况不可用 boolean singleSelected = selectedPathNum == 1; + // 打开和保存中 需要禁用相关操作 + boolean enable = isEnable(); newFolderAction.setEnabled(singleSelected); - renameAction.setEnabled(singleSelected); + renameAction.setEnabled(singleSelected && enable); showInExplorerAction.setEnabled(singleSelected); // 删除操作在至少选中一个时可用 boolean selected = selectedPathNum > 0; - delFileAction.setEnabled(selected); + delFileAction.setEnabled(selected && enable); // 刷新操作始终可用 refreshTreeAction.setEnabled(true); //触发vcsAction变化 - vcsAction.fireVcsActionChange(); + vcsAction.fireVcsActionChange(enable); // 其他状态 otherStateChange(); @@ -363,7 +365,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt /** * 版本管理可用状态的监控 */ - private void fireVcsActionChange() { + private void fireVcsActionChange(boolean enable) { if (!DesignerEnvManager.getEnvManager().getVcsConfigManager().isVcsEnable() || VcsHelper.getInstance().isUnSelectedTemplate() || WorkContext.getCurrent().isCluster()) { @@ -381,14 +383,14 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt if (node.getLock() != null && !ComparatorUtils.equals(node.getUserID(), node.getLock())) { setEnabled(false); } else { - setEnabled(true); + setEnabled(enable); } } else { setEnabled(false); } } else { //当前环境为本地环境时 - setEnabled(pathSupportVcsAction); + setEnabled(pathSupportVcsAction && enable); } } } @@ -915,5 +917,18 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } } + private boolean isEnable() { + List> templates = HistoryTemplateListCache.getInstance().getHistoryList(); + for (JTemplate template : templates) { + if (template.isSaving() || template.isOpening()) { + FileNode node = TemplateTreePane.getInstance().getFileNode(); + if (node != null && ComparatorUtils.equals(template.getEditingFILE().getPath(), node.getEnvPath())) { + return false; + } + } + } + return true; + } + } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java index 8b32d14273..d32d14cf23 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java @@ -11,6 +11,8 @@ import com.fr.design.event.TargetModifiedEvent; import com.fr.design.event.TargetModifiedListener; import java.awt.BorderLayout; +import java.awt.Component; +import javax.swing.JLayeredPane; /** @@ -21,9 +23,21 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener private static final long serialVersionUID = 1L; private JTemplate component; + private TransparentPane transparentPane = new TransparentPane(); + private OpenLoadingPane loadingPane = new OpenLoadingPane(); + private JLayeredPane layeredPane = new JLayeredPane() { + @Override + public void doLayout() { + for (Component comp : getComponents()) { + comp.setBounds(0, 0, getWidth(), getHeight()); + } + } + }; protected DesktopCardPane() { setLayout(new BorderLayout()); + layeredPane.add(transparentPane, 1); + layeredPane.add(loadingPane, 2); } protected void showJTemplate(final JTemplate jt) { @@ -36,10 +50,12 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener DesignerFrameFileDealerPane.getInstance().setCurrentEditingTemplate(jt); if (component != null) { component.onLostFocus(); - remove(component); + layeredPane.remove(component); } component = jt; - add(component, BorderLayout.CENTER); + layeredPane.add(component, 0); + checkSavingAndOpening(jt); + add(layeredPane, BorderLayout.CENTER); validate(); repaint(); revalidate(); @@ -47,6 +63,32 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener component.onGetFocus(); } + + private void checkSavingAndOpening(JTemplate jt) { + if (jt.isSaving()) { + showCover(); + } else if (jt.isOpening()) { + showOpenStatus(); + } else { + hideCover(); + } + } + + private void showOpenStatus() { + DesignerContext.getDesignerFrame().refreshUIToolBar(); + EastRegionContainerPane.getInstance().updateAllPropertyPane(); + layeredPane.moveToFront(loadingPane); + } + + public void showCover() { + layeredPane.moveToFront(transparentPane); + DesignerContext.getDesignerFrame().refreshUIToolBar(); + } + + public void hideCover() { + layeredPane.moveToFront(component); + } + protected JTemplate getSelectedJTemplate() { return component; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 8827d6a857..8097d02f40 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -6,6 +6,7 @@ import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.constants.UIConstants; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.fun.PropertyItemPaneProvider; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButtonUI; @@ -791,8 +792,13 @@ public class EastRegionContainerPane extends UIEastResizableContainer { // 选项不可用 public void setEnabled(boolean isEnabled) { - this.isEnabled = isEnabled; - button.setEnabled(isEnabled); + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (template != null) { + this.isEnabled = isEnabled && !template.isOpening() && !template.isSaving(); + } else { + this.isEnabled = isEnabled; + } + button.setEnabled(this.isEnabled); } public void setIconBaseDir(String iconBaseDir) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 0ff728580a..dd2a05a2a4 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe; import com.fr.base.BaseUtils; -import com.fr.base.FRContext; import com.fr.base.Parameter; import com.fr.base.io.BaseBook; import com.fr.base.iofile.attr.DesignBanCopyAttrMark; @@ -22,6 +21,7 @@ import com.fr.design.designer.DesignerProxy; import com.fr.design.designer.TargetComponent; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.InformationWarnPane; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.TemplateResourceManager; import com.fr.design.file.TemplateTreePane; @@ -49,6 +49,8 @@ import com.fr.design.menu.NameSeparator; import com.fr.design.menu.ShortCut; import com.fr.design.preview.PagePreview; import com.fr.design.ui.util.UIUtil; +import com.fr.design.worker.save.CallbackSaveWorker; +import com.fr.design.worker.save.EmptyCallBackSaveWorker; import com.fr.design.write.submit.DBManipulationInWidgetEventPane; import com.fr.design.write.submit.DBManipulationPane; import com.fr.event.EventDispatcher; @@ -77,6 +79,7 @@ import com.fr.stable.core.UUID; import com.fr.workspace.WorkContext; import com.fr.workspace.server.lock.TplOperator; +import java.util.concurrent.Callable; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JComponent; @@ -92,10 +95,10 @@ import java.util.Set; /** * 报表设计和表单设计的编辑区域(设计器编辑的IO文件) */ -public abstract class JTemplate> extends TargetComponent implements ToolBarMenuDockPlus, DesignerProxy { +public abstract class JTemplate> extends TargetComponent implements ToolBarMenuDockPlus, DesignerProxy, JTemplateSave { // TODO ALEX_SEP editingFILE这个属性一定要吗?如果非要不可,有没有可能保证不为null private static final int PREFIX_NUM = 3000; - private FILE editingFILE = null; + protected FILE editingFILE = null; // alex:初始状态为saved,这样不管是新建模板,还是打开模板,如果未做任何操作直接关闭,不提示保存 private boolean saved = true; private boolean authoritySaved = true; @@ -110,6 +113,8 @@ public abstract class JTemplate> private DesignModelAdapter designModel; private PreviewProvider previewType; protected TimeConsumeTimer consumeTimer = new TimeConsumeTimer(); + private volatile boolean saving = false; + private volatile boolean opening = false; private PluginEventListener pluginListener; @@ -125,7 +130,15 @@ public abstract class JTemplate> this(t, file, false); } + public JTemplate(T t, FILE file, Parameter[] parameters) { + this(t, file, false, parameters); + } + public JTemplate(T t, FILE file, boolean isNewFile) { + this(t, file, isNewFile, null); + } + + public JTemplate(T t, FILE file, boolean isNewFile, Parameter[] parameters) { super(t); beforeInit(); // 判断是否切换设计器状态到禁止拷贝剪切 @@ -139,7 +152,11 @@ public abstract class JTemplate> this.editingFILE = file; this.setLayout(FRGUIPaneFactory.createBorderLayout()); this.setBorder(BorderFactory.createEmptyBorder()); - designModel = createDesignModel(); + if (parameters == null) { + designModel = createDesignModel(); + } else { + designModel = createDesignModel(parameters); + } addCenterPane(); this.undoState = createUndoState(); @@ -397,6 +414,12 @@ public abstract class JTemplate> protected abstract DesignModelAdapter createDesignModel(); + protected DesignModelAdapter createDesignModel(Parameter[] parameters) { + // 空实现 兼容下 + return null; + } + + /** * 创建菜单项Preview * @@ -614,6 +637,7 @@ public abstract class JTemplate> * * @return 保存模板 */ + @Deprecated public boolean saveTemplate() { return this.saveTemplate(true); } @@ -623,6 +647,7 @@ public abstract class JTemplate> * * @return 保存成功返回true */ + @Deprecated public boolean saveTemplate2Env() { return this.saveTemplate(false); } @@ -632,6 +657,7 @@ public abstract class JTemplate> * * @return 保存成功返回true */ + @Deprecated public boolean saveAsTemplate() { return this.saveAsTemplate(true); } @@ -641,6 +667,7 @@ public abstract class JTemplate> * * @return 保存成功返回true */ + @Deprecated public boolean saveAsTemplate2Env() { return this.saveAsTemplate(false); } @@ -651,6 +678,7 @@ public abstract class JTemplate> * @param isShowLoc 是否本地 * @return 保存成功返回true */ + @Deprecated public boolean saveTemplate(boolean isShowLoc) { FILE editingFILE = this.getEditingFILE(); // carl:editingFILE没有,当然不存了,虽然不会有这种情况 @@ -662,17 +690,6 @@ public abstract class JTemplate> if (!editingFILE.exists()) { return saveAsTemplate(isShowLoc); } - boolean access = false; - - try { - access = FRContext.getOrganizationOperator().canAccess(this.getEditingFILE().getPath()); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - if (!access) { - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Permission_Denied") + "!", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE); - return false; - } collectInfo(); return this.saveFile(); } @@ -702,6 +719,7 @@ public abstract class JTemplate> * @param fileName 保存文件名 * @return */ + @Deprecated public boolean saveAsTemplate(boolean isShowLoc, String fileName) { String oldName = this.getPath(); // alex:如果是SaveAs的话需要让用户来选择路径了 @@ -717,20 +735,6 @@ public abstract class JTemplate> FILE sourceFile = editingFILE; if (isOkOperation(chooseResult)) { - boolean access = false; - try { - access = FRContext.getOrganizationOperator().canAccess(fileChooser.getSelectedFILE().getPath()); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - if (!access) { - FineJOptionPane.showMessageDialog( - DesignerContext.getDesignerFrame(), - Toolkit.i18nText("Fine-Design_Basic_Template_Permission_Denied") + "!", - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Alert"), - JOptionPane.WARNING_MESSAGE); - return false; - } // 目标文件 editingFILE = fileChooser.getSelectedFILE(); } @@ -1392,4 +1396,187 @@ public abstract class JTemplate> return StringUtils.EMPTY; } + private CallbackSaveWorker save(boolean showLoc) { + FILE editingFILE = this.getEditingFILE(); + // carl:editingFILE没有,当然不存了,虽然不会有这种情况 + if (editingFILE == null) { + return new EmptyCallBackSaveWorker(); + } + // 检查一下editingFILE是不是已存在的文件,如果不存在则用saveAs + if (!editingFILE.exists()) { + return saveAs(showLoc); + } + + CallbackSaveWorker worker = new CallbackSaveWorker(new Callable() { + @Override + public Boolean call() throws Exception { + collectInfo(); + return JTemplate.this.saveRealFile(); + } + }, this); + + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + callBackForSave(); + } + }); + + return worker; + } + + private void callBackForSave() { + JTemplate.this.saved = true; + JTemplate.this.authoritySaved = true; + DesignerContext.getDesignerFrame().setTitle(); + JTemplate.this.fireJTemplateSaved(); + } + + private boolean saveRealFile() throws Exception { + FILE editingFILE = this.getEditingFILE(); + if (editingFILE == null || editingFILE instanceof MemFILE) { + return false; + } + this.getTarget().export(TemplateResourceManager.getResource().saveTemplate(editingFILE)); + this.editingFILE = editingFILE; + return true; + } + + private CallbackSaveWorker saveAs(boolean showLoc) { + FILE editingFILE = this.getEditingFILE(); + if (editingFILE == null) { + return new EmptyCallBackSaveWorker(); + } + String oldName = this.getPath(); + // alex:如果是SaveAs的话需要让用户来选择路径了 + FILEChooserPane fileChooser = getFILEChooserPane(showLoc); + addChooseFILEFilter(fileChooser); + fileChooser.setFileNameTextField(editingFILE.getName(), this.suffix()); + int chooseResult = fileChooser.showSaveDialog(DesignerContext.getDesignerFrame(), this.suffix()); + if (isCancelOperation(chooseResult)) { + return new EmptyCallBackSaveWorker(); + } + // 源文件 + FILE sourceFile = editingFILE; + + if (isOkOperation(chooseResult)) { + // 目标文件 + editingFILE = fileChooser.getSelectedFILE(); + } + + // 在保存之前,初始化 templateID + if (StringUtils.isEmpty(this.template.getTemplateID())) { + generateTemplateId(); + } + + FILE finalEditingFILE = editingFILE; + CallbackSaveWorker worker = new CallbackSaveWorker(new Callable() { + @Override + public Boolean call() throws Exception { + return saveAs(finalEditingFILE, sourceFile, oldName); + } + }, this); + + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + callBackForSave(); + // 当前打开的是正在保存的模板才刷新 + if (ComparatorUtils.equals(JTemplate.this.template.getTemplateID(), + HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().template.getTemplateID())) { + refreshToolArea(); + } + DesignerFrameFileDealerPane.getInstance().refresh(); + } + }); + + return worker; + + } + + private boolean saveAs(FILE editingFILE, FILE sourceFile, String oldName) throws Exception { + boolean lockedTarget = + // 目标本地文件 + !editingFILE.isEnvFile() || + // 目标远程文件 + WorkContext.getCurrent().get(TplOperator.class).saveAs(editingFILE.getPath()); + if (lockedTarget) { + boolean saved = saveNewRealFile(editingFILE, oldName); + // 目标文件保存成功并且源文件不一致的情况下,把源文件锁释放掉 + if (saved && !ComparatorUtils.equals(editingFILE.getPath(), sourceFile.getPath())) { + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(sourceFile.getPath()); + } + return saved; + } else { + return false; + } + } + + private boolean saveNewRealFile(FILE editingFILE, String oldName) throws Exception { + consumeTimer.setEnabled(true); + consumeTimer.start(); + this.editingFILE = editingFILE; + boolean result = this.saveToNewRealFile(oldName); + if (result) { + collectInfo(this.template.getTemplateID()); + } + return result; + } + + private boolean saveToNewRealFile(String oldName) throws Exception { + boolean result = false; + Set providers = ExtraDesignClassManager.getInstance().getArray(ReportSupportedFileUIProvider.XML_TAG); + for (ReportSupportedFileUIProvider provider : providers) { + result = result || provider.saveToNewFile(this.editingFILE.getPath(), this); + } + if (!result) { + result = this.saveRealFile(); + // 更换最近打开 + DesignerEnvManager.getEnvManager().replaceRecentOpenedFilePath(oldName, this.getPath()); + } + return result; + } + + @Override + public CallbackSaveWorker save() { + return save(true); + } + + @Override + public CallbackSaveWorker saveAs() { + return saveAs(true); + } + + @Override + public void saveDirectly() { + CallbackSaveWorker worker = save(); + worker.start(this.template.getTemplateID()); + } + + @Override + public void saveAsDirectly() { + CallbackSaveWorker worker = saveAs(); + worker.start(this.template.getTemplateID()); + } + + public boolean isSaving() { + return saving; + } + + public void setSaving(boolean saving) { + this.saving = saving; + } + + public boolean isOpening() { + return opening; + } + + public void setOpening(boolean opening) { + this.opening = opening; + } + + public boolean checkEnable() { + return !isSaving() && !isOpening(); + } + } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplateSave.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplateSave.java new file mode 100644 index 0000000000..2b96a471b5 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplateSave.java @@ -0,0 +1,40 @@ +package com.fr.design.mainframe; + +import com.fr.design.worker.save.CallbackSaveWorker; + +/** + * 模板保存接口 + * + * @author hades + * @version 10.0 + * Created by hades on 2021/4/9 + */ +public interface JTemplateSave { + + /** + * 直接保存后需要根据是否成功做外部回调 + * + * @return + */ + CallbackSaveWorker save(); + + + /** + * 另存为后需要根据是否成功做外部回调 + * + * @return + */ + CallbackSaveWorker saveAs(); + + /**D + * 直接保存 + */ + void saveDirectly(); + + + /** + * 直接另存为 + */ + void saveAsDirectly(); + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java b/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java new file mode 100644 index 0000000000..5a81319739 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java @@ -0,0 +1,60 @@ +package com.fr.design.mainframe; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.general.IOUtils; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.LayoutManager; +import javax.swing.ImageIcon; +import javax.swing.JPanel; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/9 + */ +public class OpenLoadingPane extends JPanel { + + private UILabel loadingLabel; + + public OpenLoadingPane() { + + setLayout(new LayoutManager() { + + @Override + public void removeLayoutComponent(Component comp) { + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return parent.getPreferredSize(); + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + @Override + public void layoutContainer(Container parent) { + int width = parent.getParent().getWidth(); + int height = parent.getParent().getHeight(); + int loadingLabelWidth = loadingLabel.getPreferredSize().width; + int loadingLabelHeight = loadingLabel.getPreferredSize().height; + int loadingLabelX = (width - loadingLabelWidth) / 2; + int loadingLabelY = (height - loadingLabelHeight) / 2; + loadingLabel.setBounds(loadingLabelX, loadingLabelY, loadingLabelWidth, loadingLabelHeight); + } + + @Override + public void addLayoutComponent(String name, Component comp) { + } + }); + setBackground(Color.WHITE); + loadingLabel = new UILabel(new ImageIcon(IOUtils.readImage("com/fr/plugin/chart/vanchart/export/loading.png"))); + add(loadingLabel); + + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/TransparentPane.java b/designer-base/src/main/java/com/fr/design/mainframe/TransparentPane.java new file mode 100644 index 0000000000..100ab04f63 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/TransparentPane.java @@ -0,0 +1,102 @@ +package com.fr.design.mainframe; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Component; +import java.awt.Composite; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.LayoutManager; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import javax.swing.ImageIcon; +import javax.swing.JComponent; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/12 + */ +public class TransparentPane extends JComponent { + + private static final ImageIcon LOADING_ICON = new ImageIcon(TransparentPane.class.getResource("/com/fr/web/images/loading-local.gif")); + + private UILabel loadingLabel; + private UILabel label; + private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); + + public TransparentPane() { + + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + // do nothing + } + }); + + setLayout(getCoverLayout()); + setBackground(null); + setOpaque(false); + + loadingLabel = new UILabel(LOADING_ICON); + label = new UILabel(Toolkit.i18nText("Fine-Design_Saving_Template_Tip")); + add(loadingLabel); + add(label); + } + + protected LayoutManager getCoverLayout() { + return new LayoutManager() { + + @Override + public void removeLayoutComponent(Component comp) { + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return parent.getPreferredSize(); + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + @Override + public void layoutContainer(Container parent) { + int width = parent.getParent().getWidth(); + int height = parent.getParent().getHeight(); + int loadingLabelWidth = loadingLabel.getPreferredSize().width; + int loadingLabelHeight = loadingLabel.getPreferredSize().height; + int buttonX = (width - loadingLabelWidth) / 2; + int buttonY = (height - loadingLabelHeight) / 2; + int labelWidth = label.getPreferredSize().width; + int labelHeight = label.getPreferredSize().height; + int labelX = (width - labelWidth) / 2; + int labelY = (height - labelHeight) / 2 + loadingLabelHeight; + label.setBounds(labelX, labelY, labelWidth, labelHeight); + loadingLabel.setBounds(buttonX, buttonY, loadingLabelWidth, loadingLabelHeight); + } + + @Override + public void addLayoutComponent(String name, Component comp) { + } + }; + } + + + @Override + public void paint(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + Composite oldComposite = g2d.getComposite(); + g2d.setComposite(composite); + g2d.setColor(Color.BLACK); + g2d.fillRect(0, 0, getWidth(), getHeight()); + g2d.setComposite(oldComposite); + super.paint(g); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java index f2ed81394b..55b80c0ec8 100644 --- a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java @@ -1,12 +1,17 @@ package com.fr.design.menu; import com.fr.base.svg.IconUtils; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.imenu.*; import com.fr.design.gui.iscrollbar.UIScrollBar; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.StringUtils; +import java.util.HashSet; +import java.util.Set; import javax.swing.*; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; @@ -25,6 +30,17 @@ public class MenuDef extends ShortCut { private static final int MENU_DEFAULTWDITH = 156; private static final int BLANK_WIDTH = 30; + + private static final Set FORBIDDEN_SET = new HashSet<>(); + + { + FORBIDDEN_SET.add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Template")); + FORBIDDEN_SET.add(Toolkit.i18nText("Fine-Design_Report_M_Insert")); + FORBIDDEN_SET.add(Toolkit.i18nText("Fine-Design_Basic_Action_Add")); + FORBIDDEN_SET.add(KeySetUtils.CELL.getMenuKeySetName()); + FORBIDDEN_SET.add(KeySetUtils.INSERT_FLOAT.getMenuKeySetName()); + } + protected String name; //右侧属性表弹出框重绘 protected Boolean isEastAttr = false; @@ -390,6 +406,21 @@ public class MenuDef extends ShortCut { toolBar.add(this.createUIButton()); } + private boolean checkEnable(JComponent component) { + if (FORBIDDEN_SET.contains(component.getName())) { + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + boolean flag = true; + if (template != null) { + flag = !template.isSaving() && !template.isOpening(); + } + component.setEnabled(flag); + if (!flag) { + return false; + } + } + return true; + } + protected MenuListener createMenuListener() { return menuDefListener; @@ -411,7 +442,9 @@ public class MenuDef extends ShortCut { if (!(source instanceof JMenu)) { return; } - + if (!checkEnable(createJMenu())) { + return; + } MenuDef.this.updateMenu(); } }; @@ -421,7 +454,7 @@ public class MenuDef extends ShortCut { public void mouseReleased(MouseEvent evt) { Object source = evt.getSource(); UIButton button = (UIButton) source; - if (!button.isEnabled()) { + if (!checkEnable(button)) { return; } if (isEastAttr) { diff --git a/designer-base/src/main/java/com/fr/design/worker/WorkerManager.java b/designer-base/src/main/java/com/fr/design/worker/WorkerManager.java new file mode 100644 index 0000000000..1346da453f --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/worker/WorkerManager.java @@ -0,0 +1,49 @@ +package com.fr.design.worker; + +import java.util.HashMap; +import java.util.Map; +import javax.swing.SwingWorker; +import org.jetbrains.annotations.Nullable; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/2 + */ +public class WorkerManager { + + private static final WorkerManager INSTANCE = new WorkerManager(); + + private Map workerMap = new HashMap<>(); + + public static WorkerManager getInstance() { + return INSTANCE; + } + + @Nullable + public SwingWorker getWorker(String taskName) { + return workerMap.get(taskName); + } + + public boolean isCompleted(String taskName) { + SwingWorker worker = getWorker(taskName); + return worker == null || worker.isDone(); + } + + public void registerWorker(String taskName, SwingWorker worker) { + workerMap.put(taskName, worker); + } + + public void removeWorker(String taskName) { + workerMap.remove(taskName); + } + + public void cancelWorker(String taskName) { + SwingWorker worker = getWorker(taskName); + if (worker != null && !worker.isDone()) { + worker.cancel(true); + removeWorker(taskName); + } + } + +} diff --git a/designer-base/src/main/java/com/fr/design/worker/open/OpenResult.java b/designer-base/src/main/java/com/fr/design/worker/open/OpenResult.java new file mode 100644 index 0000000000..a8b6f0c579 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/worker/open/OpenResult.java @@ -0,0 +1,28 @@ +package com.fr.design.worker.open; + +import com.fr.base.io.BaseBook; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/13 + */ +public class OpenResult { + + private final T baseBook; + + private final R ref; + + public OpenResult(T baseBook, R r) { + this.baseBook = baseBook; + this.ref = r; + } + + public T getBaseBook() { + return baseBook; + } + + public R getRef() { + return ref; + } +} diff --git a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java new file mode 100644 index 0000000000..97f13a0e30 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java @@ -0,0 +1,115 @@ +package com.fr.design.worker.open; + +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.EastRegionContainerPane; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.worker.WorkerManager; +import com.fr.file.FILE; +import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; +import java.util.concurrent.Callable; +import java.util.concurrent.CancellationException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import javax.swing.SwingWorker; + +/** + * 模板打开的worker + * + * @author hades + * @version 10.0 + * Created by hades on 2021/4/9 + */ +public class OpenWorker extends SwingWorker { + + private static final int TIME_OUT = 400; + + private final Callable callable; + + private final JTemplate template; + + private Callable> templateCallable; + + private boolean slowly = false; + + private String taskName; + + private T result; + + public OpenWorker(Callable callable, JTemplate template) { + this.callable = callable; + this.template = template; + } + + @Override + protected T doInBackground() throws Exception { + return this.callable.call(); + } + + @Override + protected void done() { + try { + result = get(); + } catch (CancellationException ignored) { + return; + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + this.template.setOpening(false); + // 后续动作 + if (slowly && templateCallable != null) { + try { + JTemplate book = templateCallable.call(); + FILE tplFile = book.getEditingFILE(); + JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + // 当前tab页是正在打开的模板 + if (ComparatorUtils.equals(currentTemplate.getEditingFILE(), tplFile)) { + currentTemplate.whenClose(); + DesignerContext.getDesignerFrame().addAndActivateJTemplate(book); + HistoryTemplateListCache.getInstance().replaceCurrentEditingTemplate(book); + EastRegionContainerPane.getInstance().updateAllPropertyPane(); + return; + } + // 当前tab页是其他模板 + for (int i = 0, len = HistoryTemplateListCache.getInstance().getHistoryCount(); i < len; i++) { + JTemplate template = HistoryTemplateListCache.getInstance().get(i); + if (ComparatorUtils.equals(template.getEditingFILE(), book.getEditingFILE())) { + template.whenClose(); + HistoryTemplateListCache.getInstance().getHistoryList().set(i, book); + return; + } + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + WorkerManager.getInstance().removeWorker(taskName); + } + + public void addCallBack(Callable> templateCallable) { + this.templateCallable = templateCallable; + } + + public void start(String taskName) { + this.taskName = taskName; + this.template.setOpening(true); + this.execute(); + WorkerManager.getInstance().registerWorker(taskName, this); + } + + public T getResult() { + if (result != null) { + return result; + } + try { + return this.get(TIME_OUT, TimeUnit.MILLISECONDS); + } catch (TimeoutException e) { + slowly = true; + } catch (Exception exception) { + FineLoggerFactory.getLogger().error(exception.getMessage(), exception); + WorkerManager.getInstance().removeWorker(taskName); + } + return null; + } +} diff --git a/designer-base/src/main/java/com/fr/design/worker/save/CallbackSaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/CallbackSaveWorker.java new file mode 100644 index 0000000000..f8a0f5d4fa --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/worker/save/CallbackSaveWorker.java @@ -0,0 +1,75 @@ +package com.fr.design.worker.save; + +import com.fr.common.util.Collections; +import com.fr.design.mainframe.JTemplate; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.Callable; + +/** + * 保存之后需要做些外部回调 + * + * @author hades + * @version 10.0 + * Created by hades on 2021/4/8 + */ +public class CallbackSaveWorker extends SaveWorker { + + private List successRunnableList; + + private List failRunnableList; + + public CallbackSaveWorker(Callable callable, JTemplate template) { + super(callable, template); + } + + @Override + protected void done() { + super.done(); + + if (success) { + fireRunnable(successRunnableList); + } else { + fireRunnable(failRunnableList); + } + successRunnableList = null; + failRunnableList = null; + } + + private void fireRunnable(List list) { + if (Collections.isEmpty(list)) { + return; + } + for (Runnable runnable : list) { + runnable.run(); + } + } + + private void addCallback(List runnableList, Runnable runnable) { + if (runnableList == null) { + runnableList = new LinkedList<>(); + } + if (runnable != null) { + runnableList.add(runnable); + } + } + + public void addSuccessCallback(Runnable successRunnable) { + if (successRunnableList == null) { + successRunnableList = new LinkedList<>(); + } + if (successRunnable != null) { + successRunnableList.add(successRunnable); + } + } + + public void addFailCallback(Runnable failRunnable) { + if (failRunnableList == null) { + failRunnableList = new LinkedList<>(); + } + if (failRunnable != null) { + failRunnableList.add(failRunnable); + } + } + +} diff --git a/designer-base/src/main/java/com/fr/design/worker/save/EmptyCallBackSaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/EmptyCallBackSaveWorker.java new file mode 100644 index 0000000000..27e85f5ec6 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/worker/save/EmptyCallBackSaveWorker.java @@ -0,0 +1,37 @@ +package com.fr.design.worker.save; + +import com.fr.design.mainframe.JTemplate; +import java.util.concurrent.Callable; + +/** + * 空实现 + * + * @author hades + * @version 10.0 + * Created by hades on 2021/4/9 + */ +public class EmptyCallBackSaveWorker extends CallbackSaveWorker { + + public EmptyCallBackSaveWorker(Callable callable, JTemplate template) { + super(callable, template); + } + + public EmptyCallBackSaveWorker() { + this(null, null); + } + + @Override + protected Boolean doInBackground() throws Exception { + return false; + } + + @Override + protected void done() { + // do nothing + } + + @Override + public void start(String taskName) { + // do nothing + } +} diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java new file mode 100644 index 0000000000..f3baa98f7a --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java @@ -0,0 +1,82 @@ +package com.fr.design.worker.save; + +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrame; +import com.fr.design.mainframe.DesignerFrameFileDealerPane; +import com.fr.design.mainframe.EastRegionContainerPane; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.worker.WorkerManager; +import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import javax.swing.SwingWorker; + +/** + * 模板保存的worker + * + * @author hades + * @version 10.0 + * Created by hades on 2021/4/1 + */ +public class SaveWorker extends SwingWorker { + + private static final int TIME_OUT = 400; + + private final Callable callable; + + private String taskName; + + private final JTemplate template; + + protected boolean success; + + public SaveWorker(Callable callable, JTemplate template) { + this.callable = callable; + this.template = template; + } + + @Override + protected Boolean doInBackground() throws Exception { + return callable.call(); + } + + @Override + protected void done() { + try { + success = get(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + this.template.setSaving(false); + // 恢复界面 + if (ComparatorUtils.equals(this.template.getName(), HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getName())) { + EastRegionContainerPane.getInstance().updateAllPropertyPane(); + DesignerContext.getDesignerFrame().refreshUIToolBar(); + DesignerContext.getDesignerFrame().getCenterTemplateCardPane().hideCover(); + } + DesignerFrameFileDealerPane.getInstance().stateChange(); + WorkerManager.getInstance().removeWorker(taskName); + } + + public void start(String taskName) { + this.taskName = taskName; + this.template.setSaving(true); + this.execute(); + // worker纳入管理 + WorkerManager.getInstance().registerWorker(taskName, this); + try { + this.get(TIME_OUT, TimeUnit.MILLISECONDS); + } catch (TimeoutException timeoutException) { + // 开始禁用 + EastRegionContainerPane.getInstance().updateAllPropertyPane(); + DesignerContext.getDesignerFrame().getCenterTemplateCardPane().showCover(); + DesignerFrameFileDealerPane.getInstance().stateChange(); + } catch (Exception exception) { + FineLoggerFactory.getLogger().error(exception.getMessage(), exception); + WorkerManager.getInstance().removeWorker(taskName); + } + } +} diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index 1f4f331d83..4bacf9a85b 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -892,7 +892,7 @@ public class FILEChooserPane extends BasicPane { if (access(selectedFile) && access(currentDirectory)) { if (selectedFile.exists()) { int selVal = FineJOptionPane.showConfirmDialog(dialog, Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Cover_The_Current_File") + " ?", - Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (selVal == JOptionPane.YES_OPTION) { option = JOPTIONPANE_OK_OPTION; saveDictionary(); @@ -913,9 +913,8 @@ public class FILEChooserPane extends BasicPane { private boolean access(FILE selectedFile) { - boolean access = false; + boolean access = true; try { - access = FRContext.getOrganizationOperator().canAccess(selectedFile.getPath()); if (selectedFile.isEnvFile() && selectedFile instanceof FileNodeFILE) { FileNodeFILE fileNodeFILE = ((FileNodeFILE) selectedFile); access = access && fileNodeFILE.hasFullAuth() && NodeAuthProcessor.getInstance().checkFileNodeAuth(new FileNode(fileNodeFILE.getPath(), fileNodeFILE.isDirectory())); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormModelAdapter.java b/designer-form/src/main/java/com/fr/design/mainframe/FormModelAdapter.java index e5617c9462..bf047a3bee 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormModelAdapter.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormModelAdapter.java @@ -27,6 +27,10 @@ public class FormModelAdapter extends DesignModelAdapter> super(jForm); } + public FormModelAdapter(BaseJForm

jTemplate, Parameter[] parameters) { + super(jTemplate, parameters); + } + /** * 环境改变. */ diff --git a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java index d39de1d447..a851074be1 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java @@ -127,6 +127,9 @@ public class JForm extends JTemplate implements BaseJForm implements BaseJForm extends Tar @Override public void mouseClicked(MouseEvent e) { //如果没有格式刷,点击时就是想使用格式刷 + if (!formatBrush.isEnabled()) { + return; + } if (e.getClickCount() == 1) { if (!formatBrush.isSelected()) { DesignerContext.setFormatState(DesignerContext.FORMAT_STATE_ONCE); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java index ff14d54f40..0f1ced3797 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java @@ -145,6 +145,10 @@ public class JWorkBook extends JTemplate { super(workBook, fileName); populateReportParameterAttr(); } + public JWorkBook(WorkBook workBook, FILE file, Parameter[] parameters) { + super(workBook, file, parameters); + populateReportParameterAttr(); + } public JWorkBook(WorkBook workBook, FILE file) { super(workBook, file); @@ -871,6 +875,11 @@ public class JWorkBook extends JTemplate { return new WorkBookModelAdapter(this); } + @Override + protected WorkBookModelAdapter createDesignModel(Parameter[] parameters) { + return new WorkBookModelAdapter(this, parameters); + } + /** * 表单的工具栏 * diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/WorkBookModelAdapter.java b/designer-realize/src/main/java/com/fr/design/mainframe/WorkBookModelAdapter.java index 87391a5a05..53f193be74 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/WorkBookModelAdapter.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/WorkBookModelAdapter.java @@ -36,6 +36,9 @@ public class WorkBookModelAdapter extends DesignModelAdapter { @Override public JTemplate openTemplate(FILE tplFile) { - - return new JWorkBook(asIOFile(tplFile), tplFile); + JWorkBook emptyTemplate = new JWorkBook(new WorkBook(new WorkSheet()), tplFile); + OpenWorker> worker = new OpenWorker<>( + new Callable>() { + @Override + public OpenResult call() { + WorkBook workBook = asIOFile(tplFile); + return new OpenResult<>(workBook, workBook.getParameters()); + } + }, emptyTemplate); + worker.addCallBack(new Callable>() { + @Override + public JTemplate call() throws Exception { + OpenResult result = worker.getResult(); + return new JWorkBook(result.getBaseBook(), tplFile, result.getRef()); + } + }); + worker.start(tplFile.getPath()); + OpenResult result = worker.getResult(); + if (result != null) { + return new JWorkBook(result.getBaseBook(), tplFile); + } + return emptyTemplate; } @Override diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java index adadab36d4..3e9b43e8ed 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java @@ -12,6 +12,7 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DecodeDialog; +import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.exception.DecryptTemplateException; import com.fr.exception.RemoteDesignPermissionDeniedException; @@ -85,7 +86,12 @@ class CptApp extends AbstractWorkBookApp { al.add((String) it.next()); } if (!al.isEmpty()) { - showConfirmDialog(al); + UIUtil.invokeLaterIfNeeded(new Runnable() { + @Override + public void run() { + showConfirmDialog(al); + } + }); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java index 046451337e..f9e19dd64b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java @@ -1,22 +1,28 @@ package com.fr.design.mainframe.app; +import com.fr.base.Parameter; import com.fr.base.io.XMLEncryptUtils; import com.fr.design.DesignerEnvManager; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.AbstractAppProvider; import com.fr.design.mainframe.BaseJForm; import com.fr.design.mainframe.DecodeDialog; +import com.fr.design.mainframe.JForm; import com.fr.design.mainframe.JTemplate; +import com.fr.design.worker.open.OpenResult; +import com.fr.design.worker.open.OpenWorker; import com.fr.exception.DecryptTemplateException; import com.fr.exception.RemoteDesignPermissionDeniedException; import com.fr.exception.TplLockedException; import com.fr.file.FILE; import com.fr.form.main.Form; +import com.fr.form.ui.container.WBorderLayout; import com.fr.log.FineLoggerFactory; import com.fr.stable.Constants; import com.fr.stable.bridge.StableFactory; import java.util.HashMap; +import java.util.concurrent.Callable; /** * Created by juhaoyu on 2018/6/27. @@ -36,9 +42,31 @@ class FormApp extends AbstractAppProvider { HashMap classType = new HashMap(); classType.put(Constants.ARG_0, Form.class); classType.put(Constants.ARG_1, FILE.class); - - return (JTemplate) StableFactory.getMarkedInstanceObjectFromClass(BaseJForm.XML_TAG, - new Object[]{asIOFile(tplFile), tplFile}, classType, BaseJForm.class); + classType.put(Constants.ARG_2, Parameter[].class); + JForm emptyForm = new JForm(new Form(new WBorderLayout("form")), tplFile); + OpenWorker> worker = new OpenWorker<>( + new Callable>() { + @Override + public OpenResult call() throws Exception { + Form form = asIOFile(tplFile); + return new OpenResult<>(form, form.getParameters()); + } + }, emptyForm); + worker.addCallBack(new Callable>() { + @Override + public JTemplate call() throws Exception { + OpenResult result = worker.getResult(); + return (JTemplate) StableFactory.getMarkedInstanceObjectFromClass(BaseJForm.XML_TAG, + new Object[]{result.getBaseBook(), tplFile, result.getRef()}, classType, BaseJForm.class); + } + }); + worker.start(tplFile.getPath()); + OpenResult result = worker.getResult(); + if (result != null) { + return (JTemplate) StableFactory.getMarkedInstanceObjectFromClass(BaseJForm.XML_TAG, + new Object[]{result.getBaseBook(), tplFile, new Parameter[0]}, classType, BaseJForm.class); + } + return emptyForm; } @Override diff --git a/designer-realize/src/main/java/com/fr/start/MainDesigner.java b/designer-realize/src/main/java/com/fr/start/MainDesigner.java index 162a2044f4..5d39647714 100644 --- a/designer-realize/src/main/java/com/fr/start/MainDesigner.java +++ b/designer-realize/src/main/java/com/fr/start/MainDesigner.java @@ -17,6 +17,7 @@ import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.fun.MenuHandler; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIPreviewButton; +import com.fr.design.gui.ibutton.UISaveForbiddenButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.itoolbar.UILargeToolbar; @@ -232,7 +233,7 @@ public class MainDesigner extends BaseDesigner { public void actionPerformed(ActionEvent e) { JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); jt.stopEditing(); - jt.saveTemplate(); + jt.saveDirectly(); jt.requestFocus(); } }); @@ -270,12 +271,12 @@ public class MainDesigner extends BaseDesigner { } private void createRunButton(UILargeToolbar largeToolbar) { - run = new UIPreviewButton(new UIButton(UIConstants.PAGE_BIG_ICON) { + run = new UIPreviewButton(new UISaveForbiddenButton(UIConstants.PAGE_BIG_ICON) { @Override public Dimension getPreferredSize() { return new Dimension(34, 34); } - }, new UIButton(UIConstants.PREVIEW_DOWN) { + }, new UISaveForbiddenButton(UIConstants.PREVIEW_DOWN) { @Override public Dimension getPreferredSize() { return new Dimension(34, 10); diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index 8c607f9ed5..eb3f577cc9 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -27,6 +27,7 @@ import com.fr.design.actions.insert.flot.ImageFloatAction; import com.fr.design.actions.insert.flot.TextBoxFloatAction; import com.fr.design.bridge.DesignToolbarProvider; import com.fr.design.constants.DesignerLaunchStatus; +import com.fr.design.env.DesignerWorkspaceLoader; import com.fr.design.form.parameter.FormParaDesigner; import com.fr.design.fun.ElementUIProvider; import com.fr.design.gui.controlpane.NameObjectCreator; @@ -145,6 +146,7 @@ public class DesignerActivator extends Activator { designerModuleStart(); loadLogAppender(); DesignerSocketIO.update(); + DesignerWorkspaceLoader.init(); OSSupportCenter.buildAction(new OSBasedAction() { @Override public void execute(Object... objects) { diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java index 7154de982f..e43cd6cbb3 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceActivator.java @@ -2,6 +2,7 @@ package com.fr.start.module; import com.fr.concurrent.NamedThreadFactory; import com.fr.design.PluginClassRefreshManager; +import com.fr.design.env.WorkspaceChangeLoadingDialog; import com.fr.design.file.HistoryTemplateListCache; import com.fr.event.Event; import com.fr.event.Listener; @@ -51,6 +52,7 @@ public class DesignerWorkspaceActivator extends Activator { @Override public void on(Event event, Workspace workspace) { + WorkspaceChangeLoadingDialog.showDialog(); PluginClassRefreshManager.getInstance().removePluginListener(); HistoryTemplateListCache.getInstance().stash(); } @@ -64,6 +66,7 @@ public class DesignerWorkspaceActivator extends Activator { HistoryTemplateListCache.getInstance().load(); PluginClassRefreshManager.getInstance().addPluginListener(); + WorkspaceChangeLoadingDialog.hideDialog(); } }); } From 46bfdaf2b3aa1afba84aa6e4d36c71c819789dc9 Mon Sep 17 00:00:00 2001 From: hades Date: Thu, 15 Apr 2021 11:05:25 +0800 Subject: [PATCH 20/49] =?UTF-8?q?REPORT-49986=20=E3=80=9010.0.16=E3=80=91?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96=E4=B9=8B=E9=98=BB=E5=A1=9E?= =?UTF-8?q?EDT=E7=BA=BF=E7=A8=8B=E6=97=B6=E4=BC=98=E5=8C=96=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/actions/edit/RedoAction.java | 2 +- .../fr/design/actions/edit/UndoAction.java | 2 +- .../file/CloseCurrentTemplateAction.java | 2 +- .../actions/file/ExitDesignerAction.java | 4 +++ .../actions/file/SaveAsTemplateAction.java | 3 +-- .../actions/file/SaveTemplateAction.java | 2 +- .../file/export/AbstractExportAction.java | 6 +++++ .../design/file/HistoryTemplateListCache.java | 1 + .../fr/design/file/MutilTempalteTabPane.java | 4 +++ .../gui/ibutton/UIForbiddenButtonUI.java | 2 +- .../design/gui/imenu/UIForBiddenHeadMenu.java | 18 ------------- .../design/gui/imenu/UIForbiddenMenuUI.java | 25 ------------------- .../com/fr/design/gui/itoolbar/UIToolbar.java | 2 +- .../fr/design/mainframe/DesignerFrame.java | 4 +++ .../com/fr/design/worker/save/SaveWorker.java | 9 ++++++- 15 files changed, 34 insertions(+), 52 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/gui/imenu/UIForBiddenHeadMenu.java delete mode 100644 designer-base/src/main/java/com/fr/design/gui/imenu/UIForbiddenMenuUI.java diff --git a/designer-base/src/main/java/com/fr/design/actions/edit/RedoAction.java b/designer-base/src/main/java/com/fr/design/actions/edit/RedoAction.java index 8b8ffde4a0..b00aff1a61 100644 --- a/designer-base/src/main/java/com/fr/design/actions/edit/RedoAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/edit/RedoAction.java @@ -49,7 +49,7 @@ public class RedoAction extends UpdateAction implements TemplateComponentActionI public void update() { JTemplate undoComponent = getEditingComponent(); if (DesignerEnvManager.getEnvManager().isSupportUndo()) { - boolean enable = undoComponent != null && undoComponent.canRedo() && !undoComponent.isOpening() && !undoComponent.isSaving(); + boolean enable = undoComponent != null && undoComponent.canRedo() && undoComponent.checkEnable(); this.setEnabled(enable); } else { this.setEnabled(false); diff --git a/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java b/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java index 53e5ed7c5a..d8ed5b9da1 100644 --- a/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/edit/UndoAction.java @@ -49,7 +49,7 @@ public class UndoAction extends UpdateAction implements TemplateComponentActionI public void update() { JTemplate undoComponent = getEditingComponent(); if (DesignerEnvManager.getEnvManager().isSupportUndo()) { - boolean enable = undoComponent != null && undoComponent.canUndo() && !undoComponent.isOpening() && !undoComponent.isSaving(); + boolean enable = undoComponent != null && undoComponent.canUndo() && undoComponent.checkEnable(); this.setEnabled(enable); } else { this.setEnabled(false); diff --git a/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java b/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java index 9e8be9f51b..e7c83ce47b 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java @@ -1 +1 @@ -package com.fr.design.actions.file; import com.fr.design.actions.UpdateAction; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.menu.KeySetUtils; import java.awt.event.ActionEvent; /** * Author : daisy * Date: 13-8-16 * Time: 下午3:23 */ public class CloseCurrentTemplateAction extends UpdateAction { public CloseCurrentTemplateAction() { this.setMenuKeySet(KeySetUtils.CLOSE_CURRENT_TEMPLATE); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); this.setAccelerator(getMenuKeySet().getKeyStroke()); } /** * 动作 * @param e 事件 */ public void actionPerformed(ActionEvent e) { MutilTempalteTabPane.getInstance().setIsCloseCurrent(true); MutilTempalteTabPane.getInstance().closeFormat(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); MutilTempalteTabPane.getInstance().closeSpecifiedTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); } } \ No newline at end of file +package com.fr.design.actions.file; import com.fr.design.actions.UpdateAction; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.mainframe.JTemplate; import com.fr.design.menu.KeySetUtils; import java.awt.event.ActionEvent; /** * Author : daisy * Date: 13-8-16 * Time: 下午3:23 */ public class CloseCurrentTemplateAction extends UpdateAction { public CloseCurrentTemplateAction() { this.setMenuKeySet(KeySetUtils.CLOSE_CURRENT_TEMPLATE); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); this.setAccelerator(getMenuKeySet().getKeyStroke()); } /** * 动作 * @param e 事件 */ public void actionPerformed(ActionEvent e) { MutilTempalteTabPane.getInstance().setIsCloseCurrent(true); MutilTempalteTabPane.getInstance().closeFormat(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); MutilTempalteTabPane.getInstance().closeSpecifiedTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); } @Override public void update() { super.update(); JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); if (template != null) { this.setEnabled(!template.isSaving()); } } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/actions/file/ExitDesignerAction.java b/designer-base/src/main/java/com/fr/design/actions/file/ExitDesignerAction.java index 070b9df221..1ca29a0425 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/ExitDesignerAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/ExitDesignerAction.java @@ -3,6 +3,7 @@ */ package com.fr.design.actions.file; +import com.fr.design.mainframe.TemplateSavingChecker; import java.awt.event.ActionEvent; import com.fr.design.actions.UpdateAction; @@ -27,6 +28,9 @@ public class ExitDesignerAction extends UpdateAction { * @param e 事件 */ public void actionPerformed(ActionEvent e) { + if (!TemplateSavingChecker.check()) { + return; + } DesignerContext.getDesignerFrame().exit(); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SaveAsTemplateAction.java b/designer-base/src/main/java/com/fr/design/actions/file/SaveAsTemplateAction.java index 07b8a8024b..b957e15630 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SaveAsTemplateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SaveAsTemplateAction.java @@ -40,7 +40,6 @@ public class SaveAsTemplateAction extends JTemplateAction> { @Override public void update() { super.update(); - boolean enable = !this.getEditingComponent().isSaving() && !this.getEditingComponent().isOpening(); - this.setEnabled(enable); + this.setEnabled(this.getEditingComponent().checkEnable()); } } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java b/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java index dfc2071b11..072a127aa9 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SaveTemplateAction.java @@ -38,7 +38,7 @@ public class SaveTemplateAction extends JTemplateAction> { @Override public void update() { super.update(); - boolean enable = !this.getEditingComponent().isSaved() && !this.getEditingComponent().isSaving() && !this.getEditingComponent().isOpening(); + boolean enable = !this.getEditingComponent().isSaved() && this.getEditingComponent().checkEnable(); this.setEnabled(enable); } diff --git a/designer-base/src/main/java/com/fr/design/actions/file/export/AbstractExportAction.java b/designer-base/src/main/java/com/fr/design/actions/file/export/AbstractExportAction.java index 5277d2ebf1..094915a858 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/export/AbstractExportAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/export/AbstractExportAction.java @@ -226,4 +226,10 @@ public abstract class AbstractExportAction> extends JT } } + @Override + public void update() { + super.update(); + this.setEnabled(this.getEditingComponent().checkEnable()); + } + } diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index 4487a2bbfc..f7d4d1f571 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -380,6 +380,7 @@ public class HistoryTemplateListCache implements CallbackEvent { try { return stashWorker.get(); } catch (Exception e) { + FineLoggerFactory.getLogger().debug(e.getMessage(), e); return false; } } 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 b5f6b2ffda..0e81485849 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 @@ -11,6 +11,7 @@ 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.mainframe.TemplateSavingChecker; import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; @@ -197,6 +198,9 @@ public class MutilTempalteTabPane extends JComponent { if (openedTemplate.size() == 1) { return; } + if (!TemplateSavingChecker.check()) { + return; + } SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); //点击关闭其他模板,并且点击确定保存 if (saveSomeTempaltePane.showSavePane()) { diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java index 94353deea7..df3b6a86e0 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java @@ -18,7 +18,7 @@ public class UIForbiddenButtonUI extends UIButtonUI { JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); boolean flag = true; if (template != null) { - flag = c.isEnabled() && !template.isSaving() && !template.isOpening(); + flag = c.isEnabled() && template.checkEnable(); } c.setEnabled(flag); } diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIForBiddenHeadMenu.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIForBiddenHeadMenu.java deleted file mode 100644 index 14a12b58c5..0000000000 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIForBiddenHeadMenu.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fr.design.gui.imenu; - -/** - * @author hades - * @version 10.0 - * Created by hades on 2021/4/11 - */ -public class UIForBiddenHeadMenu extends UIHeadMenu { - - public UIForBiddenHeadMenu(String name) { - super(name); - } - - @Override - public void updateUI() { - setUI(new UIForbiddenMenuUI()); - } -} diff --git a/designer-base/src/main/java/com/fr/design/gui/imenu/UIForbiddenMenuUI.java b/designer-base/src/main/java/com/fr/design/gui/imenu/UIForbiddenMenuUI.java deleted file mode 100644 index 7a28513400..0000000000 --- a/designer-base/src/main/java/com/fr/design/gui/imenu/UIForbiddenMenuUI.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.fr.design.gui.imenu; - -import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.mainframe.JTemplate; -import java.awt.Graphics; -import javax.swing.JComponent; - -/** - * @author hades - * @version 10.0 - * Created by hades on 2021/4/11 - */ -public class UIForbiddenMenuUI extends UIMenuUI { - - @Override - public void paint(Graphics g, JComponent c) { -// JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); -// boolean flag = true; -// if (template != null) { -// flag = !template.isSaving() && !template.isOpening(); -// } -// c.setEnabled(flag); - super.paint(g, c); - } -} diff --git a/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java b/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java index 1740c6d3b4..347dd768f5 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java +++ b/designer-base/src/main/java/com/fr/design/gui/itoolbar/UIToolbar.java @@ -40,7 +40,7 @@ public class UIToolbar extends JToolBar { if (template != null) { for (int i = 0; i < getComponentCount(); i++) { Component component = getComponents()[i]; - component.setEnabled(!template.isSaving() && !template.isOpening()); + component.setEnabled(template.checkEnable()); } } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index 7ebf3ebe05..4434131813 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -185,6 +185,10 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta @Override public void windowClosing(WindowEvent e) { + // 关闭前check + if (!TemplateSavingChecker.check()) { + return; + } //关闭前当前模板 停止编辑 HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().stopEditing(); SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(true); diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java index f3baa98f7a..d9f511cc70 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java @@ -1,8 +1,9 @@ package com.fr.design.worker.save; +import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.DesignerFrame; import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.JTemplate; @@ -12,6 +13,7 @@ import com.fr.log.FineLoggerFactory; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import javax.swing.JOptionPane; import javax.swing.SwingWorker; /** @@ -49,6 +51,11 @@ public class SaveWorker extends SwingWorker { success = get(); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineJOptionPane.showMessageDialog( + DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design-Basic_Save_Failure"), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), + JOptionPane.ERROR_MESSAGE); } this.template.setSaving(false); // 恢复界面 From d2e5f1f454d1febb136dd23405cad49d426fcc5f Mon Sep 17 00:00:00 2001 From: hades Date: Thu, 15 Apr 2021 11:06:26 +0800 Subject: [PATCH 21/49] =?UTF-8?q?REPORT-49986=20=E3=80=9010.0.16=E3=80=91?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96=E4=B9=8B=E9=98=BB=E5=A1=9E?= =?UTF-8?q?EDT=E7=BA=BF=E7=A8=8B=E6=97=B6=E4=BC=98=E5=8C=96=20add?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/TemplateSavingChecker.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/TemplateSavingChecker.java diff --git a/designer-base/src/main/java/com/fr/design/mainframe/TemplateSavingChecker.java b/designer-base/src/main/java/com/fr/design/mainframe/TemplateSavingChecker.java new file mode 100644 index 0000000000..11ffc6e917 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/TemplateSavingChecker.java @@ -0,0 +1,41 @@ +package com.fr.design.mainframe; + +import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.i18n.Toolkit; +import com.fr.stable.StableUtils; +import java.util.ArrayList; +import java.util.List; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/12 + */ +public class TemplateSavingChecker { + + + public static boolean check() { + List list = getSavingTemplate(); + if (!list.isEmpty()) { + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Close_Template_Tip", StableUtils.join(list, "、")), + Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), + FineJOptionPane.INFORMATION_MESSAGE); + return false; + } + return true; + } + + + private static List getSavingTemplate() { + List result = new ArrayList<>(); + for (JTemplate template : HistoryTemplateListCache.getInstance().getHistoryList()) { + if (template.isSaving()) { + result.add(template.getEditingFILE().getName()); + } + } + return result; + } + +} From 39a68171c3dd260c9b5dc83cc012e0c1798afa6e Mon Sep 17 00:00:00 2001 From: hades Date: Thu, 15 Apr 2021 11:08:29 +0800 Subject: [PATCH 22/49] =?UTF-8?q?REPORT-49986=20CloseCurrentTemplateAction?= =?UTF-8?q?=20=E6=8D=A2=E8=A1=8C=E6=A0=BC=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/CloseCurrentTemplateAction.java | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java b/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java index e7c83ce47b..58fe5666a4 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/CloseCurrentTemplateAction.java @@ -1 +1,44 @@ -package com.fr.design.actions.file; import com.fr.design.actions.UpdateAction; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.mainframe.JTemplate; import com.fr.design.menu.KeySetUtils; import java.awt.event.ActionEvent; /** * Author : daisy * Date: 13-8-16 * Time: 下午3:23 */ public class CloseCurrentTemplateAction extends UpdateAction { public CloseCurrentTemplateAction() { this.setMenuKeySet(KeySetUtils.CLOSE_CURRENT_TEMPLATE); this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); this.setAccelerator(getMenuKeySet().getKeyStroke()); } /** * 动作 * @param e 事件 */ public void actionPerformed(ActionEvent e) { MutilTempalteTabPane.getInstance().setIsCloseCurrent(true); MutilTempalteTabPane.getInstance().closeFormat(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); MutilTempalteTabPane.getInstance().closeSpecifiedTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); } @Override public void update() { super.update(); JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); if (template != null) { this.setEnabled(!template.isSaving()); } } } \ No newline at end of file +package com.fr.design.actions.file; + +import com.fr.design.actions.UpdateAction; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.file.MutilTempalteTabPane; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.menu.KeySetUtils; + +import java.awt.event.ActionEvent; + +/** + * Author : daisy + * Date: 13-8-16 + * Time: 下午3:23 + */ +public class CloseCurrentTemplateAction extends UpdateAction { + + public CloseCurrentTemplateAction() { + this.setMenuKeySet(KeySetUtils.CLOSE_CURRENT_TEMPLATE); + this.setName(getMenuKeySet().getMenuKeySetName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setAccelerator(getMenuKeySet().getKeyStroke()); + } + + /** + * 动作 + * @param e 事件 + */ + public void actionPerformed(ActionEvent e) { + MutilTempalteTabPane.getInstance().setIsCloseCurrent(true); + MutilTempalteTabPane.getInstance().closeFormat(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + MutilTempalteTabPane.getInstance().closeSpecifiedTemplate(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + } + + @Override + public void update() { + super.update(); + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (template != null) { + this.setEnabled(!template.isSaving()); + } + } +} \ No newline at end of file From 0fa461fb72fcf8ce054353ea4ee3f49eb9b23baa Mon Sep 17 00:00:00 2001 From: xiqiu Date: Thu, 15 Apr 2021 16:21:36 +0800 Subject: [PATCH 23/49] =?UTF-8?q?REPORT-51103=20=E5=8A=A0=E4=B8=8A?= =?UTF-8?q?=E9=81=97=E6=BC=8F=E7=9A=84mysql=E5=8F=A6=E4=B8=80=E7=A7=8D?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=EF=BC=9B=E4=BC=98=E5=8C=96=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/datapane/connect/DatabaseConnectionPane.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index 16c992b0f3..0a6b10d077 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -332,10 +332,10 @@ public abstract class DatabaseConnectionPane Date: Thu, 15 Apr 2021 19:23:18 +0800 Subject: [PATCH 24/49] =?UTF-8?q?REPORT-49986=20=E3=80=9010.0.16=E3=80=91?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96=E4=B9=8B=E9=98=BB=E5=A1=9E?= =?UTF-8?q?EDT=E7=BA=BF=E7=A8=8B=E6=97=B6=E4=BC=98=E5=8C=96=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/file/WebPreviewUtils.java | 27 ++++++++++++++----- .../design/gui/ibutton/UIForbiddenButton.java | 12 +++++++++ .../gui/ibutton/UIForbiddenButtonUI.java | 9 +------ .../fr/design/mainframe/DesktopCardPane.java | 1 + .../com/fr/design/mainframe/JTemplate.java | 10 +++++++ .../fr/design/mainframe/JTemplateSave.java | 21 +++++++++++++-- .../com/fr/design/worker/open/OpenWorker.java | 20 +++++++------- .../com/fr/design/worker/save/SaveWorker.java | 5 +++- .../fr/design/mainframe/ToolBarButton.java | 11 ++++++++ .../com/fr/design/mainframe/app/FormApp.java | 2 +- 10 files changed, 91 insertions(+), 27 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java b/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java index 52ce8dd50b..8f8d4ae139 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java @@ -68,9 +68,21 @@ public final class WebPreviewUtils { * * 如果保存失败,不执行下面的WebPreview */ - if (!jt.isSaved() && !jt.saveTemplate2Env()) { + if (!jt.isSaved()) { + CallbackSaveWorker worker = jt.save2Env(); + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + browserTemplate(jt, baseRoute, map, actionType); + } + }); + worker.start(jt.getTarget().getTemplateID()); return; } + browserTemplate(jt, baseRoute, map, actionType); + } + + private static void browserTemplate(JTemplate jt, String baseRoute, Map map, String actionType) { FILE currentTemplate = jt.getEditingFILE(); // carl:是否是保存在运行环境下的模板,不是就不能被预览 if (currentTemplate instanceof FileNodeFILE) { @@ -106,11 +118,14 @@ public final class WebPreviewUtils { WARNING_MESSAGE); if (OK_OPTION == selVal) { - if (!jt.saveAsTemplate2Env()) { - return; - } - currentTemplate = jt.getEditingFILE(); - browseUrl(currentTemplate, baseRoute, map, actionType, jt); + CallbackSaveWorker worker = jt.saveAs2Env(); + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + browseUrl(jt.getEditingFILE(), baseRoute, map, actionType, jt); + } + }); + worker.start(jt.getTarget().getTemplateID()); } } } diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButton.java index f447749113..d7173d5f47 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButton.java @@ -1,6 +1,8 @@ package com.fr.design.gui.ibutton; import com.fr.base.CellBorderStyle; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.JTemplate; import javax.swing.Action; import javax.swing.Icon; import javax.swing.plaf.ButtonUI; @@ -45,6 +47,16 @@ public class UIForbiddenButton extends UIButton { return super.getBorderStyle(); } + @Override + public boolean isEnabled() { + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + boolean enabled = true; + if (template != null) { + enabled = super.isEnabled() && template.checkEnable(); + } + return enabled; + } + @Override public ButtonUI getUI() { return new UIForbiddenButtonUI(); diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java index df3b6a86e0..d8f51f62bc 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UIForbiddenButtonUI.java @@ -1,7 +1,5 @@ package com.fr.design.gui.ibutton; -import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.mainframe.JTemplate; import java.awt.Graphics; import javax.swing.JComponent; @@ -15,11 +13,6 @@ public class UIForbiddenButtonUI extends UIButtonUI { @Override public void paint(Graphics g, JComponent c) { super.paint(g, c); - JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - boolean flag = true; - if (template != null) { - flag = c.isEnabled() && template.checkEnable(); - } - c.setEnabled(flag); + c.setEnabled(c.isEnabled()); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java index d32d14cf23..f940f89045 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java @@ -76,6 +76,7 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener private void showOpenStatus() { DesignerContext.getDesignerFrame().refreshUIToolBar(); + DesignerFrameFileDealerPane.getInstance().stateChange(); EastRegionContainerPane.getInstance().updateAllPropertyPane(); layeredPane.moveToFront(loadingPane); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index dd2a05a2a4..b374dbbf97 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -1559,6 +1559,16 @@ public abstract class JTemplate> worker.start(this.template.getTemplateID()); } + @Override + public CallbackSaveWorker save2Env() { + return save(false); + } + + @Override + public CallbackSaveWorker saveAs2Env() { + return saveAs(false); + } + public boolean isSaving() { return saving; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplateSave.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplateSave.java index 2b96a471b5..005dadac2a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplateSave.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplateSave.java @@ -12,7 +12,7 @@ import com.fr.design.worker.save.CallbackSaveWorker; public interface JTemplateSave { /** - * 直接保存后需要根据是否成功做外部回调 + * 保存后需要根据是否成功做外部回调,可选保存位置 * * @return */ @@ -20,12 +20,29 @@ public interface JTemplateSave { /** - * 另存为后需要根据是否成功做外部回调 + * 另存为后需要根据是否成功做外部回调,可选保存位置 * * @return */ CallbackSaveWorker saveAs(); + + /** + * 保存到当前工作目录(reportlets)后需要根据是否成功做外部回调 + * + * + * @return + */ + CallbackSaveWorker save2Env(); + + + /** + * 另存为到当前工作目录(reportlets)后需要根据是否成功做外部回调 + * + * @return + */ + CallbackSaveWorker saveAs2Env(); + /**D * 直接保存 */ diff --git a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java index 97f13a0e30..f166020513 100644 --- a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java @@ -2,6 +2,7 @@ package com.fr.design.worker.open; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.JTemplate; import com.fr.design.worker.WorkerManager; @@ -69,21 +70,22 @@ public class OpenWorker extends SwingWorker { DesignerContext.getDesignerFrame().addAndActivateJTemplate(book); HistoryTemplateListCache.getInstance().replaceCurrentEditingTemplate(book); EastRegionContainerPane.getInstance().updateAllPropertyPane(); - return; - } - // 当前tab页是其他模板 - for (int i = 0, len = HistoryTemplateListCache.getInstance().getHistoryCount(); i < len; i++) { - JTemplate template = HistoryTemplateListCache.getInstance().get(i); - if (ComparatorUtils.equals(template.getEditingFILE(), book.getEditingFILE())) { - template.whenClose(); - HistoryTemplateListCache.getInstance().getHistoryList().set(i, book); - return; + } else { + // 当前tab页是其他模板 + for (int i = 0, len = HistoryTemplateListCache.getInstance().getHistoryCount(); i < len; i++) { + JTemplate template = HistoryTemplateListCache.getInstance().get(i); + if (ComparatorUtils.equals(template.getEditingFILE(), book.getEditingFILE())) { + template.whenClose(); + HistoryTemplateListCache.getInstance().getHistoryList().set(i, book); + break; + } } } } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } + DesignerFrameFileDealerPane.getInstance().stateChange(); WorkerManager.getInstance().removeWorker(taskName); } diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java index d9f511cc70..2ce5089705 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java @@ -35,6 +35,8 @@ public class SaveWorker extends SwingWorker { protected boolean success; + private boolean slowly; + public SaveWorker(Callable callable, JTemplate template) { this.callable = callable; this.template = template; @@ -59,7 +61,7 @@ public class SaveWorker extends SwingWorker { } this.template.setSaving(false); // 恢复界面 - if (ComparatorUtils.equals(this.template.getName(), HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getName())) { + if (slowly && ComparatorUtils.equals(this.template.getName(), HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getName())) { EastRegionContainerPane.getInstance().updateAllPropertyPane(); DesignerContext.getDesignerFrame().refreshUIToolBar(); DesignerContext.getDesignerFrame().getCenterTemplateCardPane().hideCover(); @@ -77,6 +79,7 @@ public class SaveWorker extends SwingWorker { try { this.get(TIME_OUT, TimeUnit.MILLISECONDS); } catch (TimeoutException timeoutException) { + slowly = true; // 开始禁用 EastRegionContainerPane.getInstance().updateAllPropertyPane(); DesignerContext.getDesignerFrame().getCenterTemplateCardPane().showCover(); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/ToolBarButton.java b/designer-form/src/main/java/com/fr/design/mainframe/ToolBarButton.java index b336a3ac02..4c18ba4750 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/ToolBarButton.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/ToolBarButton.java @@ -2,6 +2,7 @@ package com.fr.design.mainframe; import com.fr.base.vcs.DesignerMode; import com.fr.design.designer.creator.XCreator; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.form.util.FormDesignerUtils; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.core.WidgetOption; @@ -174,4 +175,14 @@ public class ToolBarButton extends UIButton implements MouseListener, MouseMotio public ButtonUI getUI() { return new UIForbiddenButtonUI(); } + + @Override + public boolean isEnabled() { + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + boolean enable = true; + if (template != null) { + enable = super.isEnabled() && template.checkEnable(); + } + return enable; + } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java index f9e19dd64b..6f83a35ddf 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java @@ -83,7 +83,7 @@ class FormApp extends AbstractAppProvider { // peter:打开新报表. Form tpl = new Form(); // richer:打开报表通知 - FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("file.getName()", file.getName()) + "..."); + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Report_Template_Opening_And_Waiting", file.getName()) + "..."); try { tpl.readStream(file.asInputStream()); } catch (DecryptTemplateException e) { From 7026cd45683e9f84e6ec4da025c3d2baff6acbde Mon Sep 17 00:00:00 2001 From: hades Date: Thu, 15 Apr 2021 19:28:03 +0800 Subject: [PATCH 25/49] =?UTF-8?q?REPORT-49986=20=E3=80=9010.0.16=E3=80=91?= =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96=E4=B9=8B=E9=98=BB=E5=A1=9E?= =?UTF-8?q?EDT=E7=BA=BF=E7=A8=8B=E6=97=B6=E4=BC=98=E5=8C=96=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/gui/ibutton/UISaveForbiddenButton.java | 12 ++++++++++++ .../design/gui/ibutton/UISaveForbiddenButtonUI.java | 9 +-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButton.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButton.java index 7e55c1b35e..7d65df421d 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButton.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButton.java @@ -1,5 +1,7 @@ package com.fr.design.gui.ibutton; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.JTemplate; import javax.swing.Action; import javax.swing.Icon; import javax.swing.plaf.ButtonUI; @@ -37,6 +39,16 @@ public class UISaveForbiddenButton extends UIButton { super(resource, needSetDisabledIcon); } + @Override + public boolean isEnabled() { + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + boolean enabled = true; + if (template != null) { + enabled = !template.isSaving(); + } + return enabled; + } + @Override public ButtonUI getUI() { return new UISaveForbiddenButtonUI(); diff --git a/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButtonUI.java b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButtonUI.java index 7a830c39fd..47be051248 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButtonUI.java +++ b/designer-base/src/main/java/com/fr/design/gui/ibutton/UISaveForbiddenButtonUI.java @@ -1,7 +1,5 @@ package com.fr.design.gui.ibutton; -import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.mainframe.JTemplate; import java.awt.Graphics; import javax.swing.JComponent; @@ -15,11 +13,6 @@ public class UISaveForbiddenButtonUI extends UIButtonUI { @Override public void paint(Graphics g, JComponent c) { super.paint(g, c); - JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); - boolean flag = true; - if (template != null) { - flag = !template.isSaving(); - } - c.setEnabled(flag); + c.setEnabled(c.isEnabled()); } } From 93b3afe33a721f0aa0443a3aa7549c9828cf98b0 Mon Sep 17 00:00:00 2001 From: xiqiu Date: Thu, 15 Apr 2021 20:46:39 +0800 Subject: [PATCH 26/49] =?UTF-8?q?REPORT-51103=20=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/connect/DatabaseConnectionPane.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index 743b2b2868..3e1e1f5315 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -99,7 +99,7 @@ public abstract class DatabaseConnectionPane Date: Thu, 15 Apr 2021 23:15:43 +0800 Subject: [PATCH 27/49] =?UTF-8?q?REPORT-51103=20=20=E6=94=B9=E4=B8=AA?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=96=B9=E4=BE=BF=E5=AE=9A=E4=BD=8D=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/gui/UILookAndFeel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java b/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java index 90bc60a290..b93953a99e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java +++ b/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java @@ -205,7 +205,7 @@ public class UILookAndFeel extends MetalLookAndFeel { "com/fr/design/images/lookandfeel/" + fileName, UILookAndFeel.class); if (url == null) { - FineLoggerFactory.getLogger().error("Icon directory could not be resolved."); + FineLoggerFactory.getLogger().error(fileName + " :Icon directory could not be resolved."); return null; } } From af08d02b120c1912802df0f9d5f3c0ed7ff99548 Mon Sep 17 00:00:00 2001 From: xiqiu Date: Fri, 16 Apr 2021 13:55:43 +0800 Subject: [PATCH 28/49] =?UTF-8?q?REPORT-51103=20=20=E6=94=B9=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=90=8D=E7=9A=84=E5=A4=A7=E5=B0=8F=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/gui/UILookAndFeel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java b/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java index b93953a99e..4dbbc1af32 100644 --- a/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java +++ b/designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java @@ -173,8 +173,8 @@ public class UILookAndFeel extends MetalLookAndFeel { table.put("FileChooser.upFolderIcon", loadIcon("ParentDirectoryIcon.png", this)); table.put("OptionPane.errorIcon", loadIcon("Information_Icon_Error_32x32.png", this)); table.put("OptionPane.informationIcon", loadIcon("Information_Icon_OK_32x32.png", this)); - table.put("OptionPane.narrow.right", loadIcon("icon_narrow_right_16x16.png", this)); - table.put("OptionPane.narrow.down", loadIcon("icon_narrow_down_16x16.png", this)); + table.put("OptionPane.narrow.right", loadIcon("Icon_Narrow_Right_16x16.png", this)); + table.put("OptionPane.narrow.down", loadIcon("Icon_Narrow_Down_16x16.png", this)); table.put("OptionPane.warningIcon", loadIcon("WarningIcon.png", this)); table.put("OptionPane.questionIcon", loadIcon("QuestionIcon.png", this)); table.put("ScrollPane.border", new UIScrollPaneBorder()); From 711ad1cfb6c1da0a113d2e02325a8abce40ebeeb Mon Sep 17 00:00:00 2001 From: pengda Date: Fri, 16 Apr 2021 15:04:02 +0800 Subject: [PATCH 29/49] =?UTF-8?q?REPORT-51126=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96-?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3=E7=9A=84=E8=81=94=E5=8A=A8=E6=9C=89=E7=82=B9?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/data/datapane/connect/JDBCDefPane.java | 1 + 1 file changed, 1 insertion(+) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java index 3490341f2f..d188e8cfd3 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java @@ -481,6 +481,7 @@ public class JDBCDefPane extends JPanel { portTextField.setText(port.replaceAll(e.getKeyChar() + "", "")); if (!isPortValid(portTextField.getText())) { portTextField.setText(""); + updateURL(); } } } From d8c5f2481e93bf24005d6d8cc12860b12d628806 Mon Sep 17 00:00:00 2001 From: pengda Date: Fri, 16 Apr 2021 15:35:59 +0800 Subject: [PATCH 30/49] =?UTF-8?q?REPORT-51153=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E7=95=8C=E9=9D=A2=E4=BC=98=E5=8C=96-url?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E5=88=A0=E9=99=A4=E5=90=8E=EF=BC=8C=E5=90=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E9=A1=B9=E4=B8=8D=E4=BC=9A=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=B8=85=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/data/datapane/connect/JDBCDefPane.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java index 38e42f7d89..18681ca186 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java @@ -463,7 +463,12 @@ public class JDBCDefPane extends JPanel { dbNameTextField.setText(StringUtils.EMPTY); } enableSubDocListener(); + return; } + hostTextField.setText(StringUtils.EMPTY); + portTextField.setText(StringUtils.EMPTY); + dbNameTextField.setText(StringUtils.EMPTY); + enableSubDocListener(); } private void enableSubDocListener() { From 972c696008436eb07c9e0053fbb6311c3315e803 Mon Sep 17 00:00:00 2001 From: shine Date: Fri, 16 Apr 2021 15:48:08 +0800 Subject: [PATCH 31/49] conflict --- .../com/fr/design/mainframe/DesignerFrame.java | 11 +++++++++++ .../fr/design/mainframe/ChartPropertyPane.java | 16 +++++++++++++--- .../java/com/fr/design/mainframe/app/CptApp.java | 3 ++- .../com/fr/design/mainframe/app/CptxApp.java | 3 ++- .../com/fr/design/mainframe/app/FormApp.java | 3 ++- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index 4434131813..c6a8c2c77d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -4,6 +4,7 @@ package com.fr.design.mainframe; import com.fr.base.BaseUtils; +import com.fr.chart.exception.ChartNotFoundException; import com.fr.design.DesignModelAdapter; import com.fr.design.DesignState; import com.fr.design.DesignerEnvManager; @@ -1074,6 +1075,16 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta JOptionPane.WARNING_MESSAGE, UIManager.getIcon("OptionPane.errorIcon") ); + if (this.getSelectedJTemplate() == null) { + addAndActivateJTemplate(); + } + } catch (ChartNotFoundException e) { + JOptionPane.showMessageDialog(this, + Toolkit.i18nText("Fine-Design_Chart_Not_Found_Exception"), + Toolkit.i18nText("Fine-Design_Basic_Error"), + JOptionPane.ERROR_MESSAGE, + UIManager.getIcon("OptionPane.errorIcon")); + if (this.getSelectedJTemplate() == null) { addAndActivateJTemplate(); } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java index c5c2a3fe4d..4efe977ff3 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/ChartPropertyPane.java @@ -7,6 +7,7 @@ package com.fr.design.mainframe; import com.fr.base.BaseUtils; import com.fr.base.chart.BaseChartCollection; import com.fr.chart.chartattr.ChartCollection; +import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chartx.attr.ChartProvider; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.designer.TargetComponent; @@ -14,9 +15,12 @@ import com.fr.design.gui.chart.BaseChartPropertyPane; import com.fr.design.gui.chart.ChartEditPaneProvider; import com.fr.design.gui.frpane.UITitlePanel; import com.fr.design.mainframe.chart.ChartEditPane; +import com.fr.design.utils.gui.GUICoreUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.Icon; +import java.awt.BorderLayout; +import java.awt.Component; public class ChartPropertyPane extends BaseChartPropertyPane { @@ -91,10 +95,16 @@ public class ChartPropertyPane extends BaseChartPropertyPane { * @param ePane 面板 */ public void populateChartPropertyPane(ChartCollection collection, TargetComponent ePane) { + String chartID = collection.getSelectedChartProvider(ChartProvider.class).getID(); updateChartEditPane(collection.getSelectedChartProvider(ChartProvider.class).getID()); setSupportCellData(true); this.container.setEPane(ePane); - chartEditPane.populate(collection); + + if (ChartTypeManager.getInstance().chartExit(chartID)) { + chartEditPane.populate(collection); + } else { + GUICoreUtils.setEnabled(chartEditPane, false); + } } /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java index 3e9b43e8ed..b55640990a 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java @@ -5,6 +5,7 @@ import com.fr.base.Style; import com.fr.base.TempNameStyle; import com.fr.base.extension.FileExtension; import com.fr.base.io.XMLEncryptUtils; +import com.fr.chart.exception.ChartNotFoundException; import com.fr.config.ServerPreferenceConfig; import com.fr.design.DesignerEnvManager; import com.fr.design.actions.server.StyleListAction; @@ -63,7 +64,7 @@ class CptApp extends AbstractWorkBookApp { namestyle.clear(); try { tpl.readStream(file.asInputStream()); - } catch (DecryptTemplateException e) { + } catch (DecryptTemplateException | ChartNotFoundException e) { throw e; } catch (RemoteDesignPermissionDeniedException exp) { FineLoggerFactory.getLogger().error(Toolkit.i18nText("Fine-Design_Basic_Template_Permission_Denied") + file, exp); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptxApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptxApp.java index a59ead41d2..c7411e942f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptxApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptxApp.java @@ -3,6 +3,7 @@ package com.fr.design.mainframe.app; import com.fr.base.extension.FileExtension; import com.fr.base.frpx.exception.FRPackageRunTimeException; import com.fr.base.frpx.exception.InvalidWorkBookException; +import com.fr.chart.exception.ChartNotFoundException; import com.fr.design.i18n.Toolkit; import com.fr.exception.DecryptTemplateException; import com.fr.exception.RemoteDesignPermissionDeniedException; @@ -37,7 +38,7 @@ class CptxApp extends AbstractWorkBookApp { long time = System.currentTimeMillis(); tpl = new WorkBookX(inputStream); FineLoggerFactory.getLogger().error("cost: " + (System.currentTimeMillis() - time) + " ms"); - } catch (DecryptTemplateException e) { + } catch (DecryptTemplateException | ChartNotFoundException e) { throw e; } catch (RemoteDesignPermissionDeniedException exp) { FineLoggerFactory.getLogger().error(Toolkit.i18nText("Fine-Design_Basic_Template_Permission_Denied") + file, exp); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java index 6f83a35ddf..6f801e058c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java @@ -2,6 +2,7 @@ package com.fr.design.mainframe.app; import com.fr.base.Parameter; import com.fr.base.io.XMLEncryptUtils; +import com.fr.chart.exception.ChartNotFoundException; import com.fr.design.DesignerEnvManager; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.AbstractAppProvider; @@ -86,7 +87,7 @@ class FormApp extends AbstractAppProvider { FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Report_Template_Opening_And_Waiting", file.getName()) + "..."); try { tpl.readStream(file.asInputStream()); - } catch (DecryptTemplateException e) { + } catch (DecryptTemplateException | ChartNotFoundException e) { throw e; } catch (RemoteDesignPermissionDeniedException exp) { FineLoggerFactory.getLogger().error(Toolkit.i18nText("Fine-Design_Basic_Template_Permission_Denied") + file, exp); From 73fdd9a70298ffb16cc5ec1b9a9eefd628852741 Mon Sep 17 00:00:00 2001 From: shine Date: Mon, 19 Apr 2021 09:35:20 +0800 Subject: [PATCH 32/49] FineJOptionPane --- .../src/main/java/com/fr/design/mainframe/DesignerFrame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index c6a8c2c77d..b66e6046bf 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -1079,7 +1079,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta addAndActivateJTemplate(); } } catch (ChartNotFoundException e) { - JOptionPane.showMessageDialog(this, + FineJOptionPane.showMessageDialog(this, Toolkit.i18nText("Fine-Design_Chart_Not_Found_Exception"), Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE, From ebf7b3a9353581f2871dce01c1de4ffccd33729a Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Tue, 20 Apr 2021 15:45:43 +0800 Subject: [PATCH 33/49] =?UTF-8?q?KERNEL-7542=20=E4=BC=98=E5=8C=96=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E5=8F=91=E7=8E=B0=E7=9A=84=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/EastRegionContainerPane.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 8827d6a857..984edd38de 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -837,8 +837,10 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } public void replaceContentPane(JComponent pane) { - contentArea.remove(this.contentPane); - contentArea.add(this.contentPane = pane); + if (pane != this.contentPane) { + contentArea.remove(this.contentPane); + contentArea.add(this.contentPane = pane); + } if (popupDialog != null && isPoppedOut) { popupDialog.replaceContentPane(this); } From 95f3f7f12050ea5d884bab17c9eb330f04996934 Mon Sep 17 00:00:00 2001 From: pengda Date: Tue, 20 Apr 2021 16:27:55 +0800 Subject: [PATCH 34/49] =?UTF-8?q?REPORT-51162=20=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E8=BE=93=E5=85=A5=E9=99=90=E5=88=B6=E5=A4=B1=E6=95=88=20&=20RE?= =?UTF-8?q?PORT-51260=20redshift=E7=9A=84=E7=89=B9=E5=AE=9Aurl=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E6=97=A0=E6=B3=95=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/connect/JDBCDefPane.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java index 18681ca186..4331828238 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java @@ -51,9 +51,10 @@ public class JDBCDefPane extends JPanel { public static final String DRIVER_TYPE = "driver_type"; public static final String USER_NAME = "user_name"; private static final String OTHER_DB = "Others"; - private static final Pattern ORACLE_URL = Pattern.compile("^jdbc:oracle:thin:@[/]*([0-9a-zA-Z_\\.]+)(:([0-9]+|port))?([:/](.*))?.*", Pattern.CASE_INSENSITIVE); - private static final Pattern GENERAL_URL = Pattern.compile("^jdbc:(mysql|sqlserver|db2|derby|postgresql|inceptor|inceptor2|hive2)://([0-9a-zA-Z_\\.]+)(:([0-9]+|port))?((/|;DatabaseName=)(.*))?.*", Pattern.CASE_INSENSITIVE); + private static final Pattern ORACLE_URL = Pattern.compile("^jdbc:oracle:thin:@[/]*([-0-9a-zA-Z_\\.]+)(:([0-9]+|port))?([:/](.*))?.*", Pattern.CASE_INSENSITIVE); + private static final Pattern GENERAL_URL = Pattern.compile("^jdbc:(mysql|sqlserver|db2|derby|postgresql|inceptor|inceptor2|hive2)://([-0-9a-zA-Z_\\.]+)(:([0-9]+|port))?((/|;DatabaseName=)(.*))?.*", Pattern.CASE_INSENSITIVE); private static final Pattern PORT = Pattern.compile("^0$|^[1-9][\\d]*[\\d]*$"); + private static final Pattern CHAR_NEED_ESCAPE = Pattern.compile("[?|$^*\\\\\\[\\](){}.+]"); // 编码转换. private String originalCharSet = null; private static Map jdbcMap = new HashMap(); @@ -389,6 +390,9 @@ public class JDBCDefPane extends JPanel { InputMethodListener portInputMethodListener = new InputMethodListener() { @Override public void inputMethodTextChanged(InputMethodEvent event) { + if (null == event.getText()) { + return; + } char ch = event.getText().current(); if (!(ch >= '0' && ch <= '9')) { event.consume(); @@ -484,13 +488,13 @@ public class JDBCDefPane extends JPanel { KeyListener portKeyListener = new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { - String port = portTextField.getText().trim(); + String port = portTextField.getText(); if (isPortValid(port)) { updateURL(); } else { - portTextField.setText(port.replaceAll(e.getKeyChar() + "", "")); + portTextField.setText(port.replaceAll(getCharNeedReplace(e.getKeyChar()) , "")); if (!isPortValid(portTextField.getText())) { - portTextField.setText(""); + portTextField.setText(StringUtils.EMPTY); updateURL(); } } @@ -501,6 +505,15 @@ public class JDBCDefPane extends JPanel { return PORT.matcher(port).find(); } + private String getCharNeedReplace(char c) { + String charNeedReplace = c + ""; + Matcher matcher = CHAR_NEED_ESCAPE.matcher(charNeedReplace); + if (matcher.find()) { + charNeedReplace = "\\" + charNeedReplace; + } + return charNeedReplace; + } + DocumentListener updateURLListener = new DocumentListener() { @Override From 9abed876cd2355a8cda9ab917b4749f616e721cc Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 20 Apr 2021 19:59:28 +0800 Subject: [PATCH 35/49] =?UTF-8?q?CHART-18997=20=E5=A4=84=E7=90=86=E4=B8=8B?= =?UTF-8?q?=E6=89=93=E5=BC=80=E6=A8=A1=E6=9D=BF=E5=87=BA=E9=94=99=E6=97=B6?= =?UTF-8?q?=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/actions/file/EditEnvAction.java | 11 +++++ .../design/actions/file/SwitchExistEnv.java | 12 ++++- .../design/dialog/link/MessageWithLink.java | 49 ++++++++++++------- .../fr/design/mainframe/DesktopCardPane.java | 29 +++++++++-- .../mainframe/EastRegionContainerPane.java | 2 +- .../com/fr/design/mainframe/JTemplate.java | 11 ++++- .../fr/design/mainframe/OpenLoadingPane.java | 5 +- .../main/java/com/fr/design/menu/MenuDef.java | 2 +- .../com/fr/design/worker/open/OpenWorker.java | 44 +++++++++++++++-- 9 files changed, 136 insertions(+), 29 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java b/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java index a4b7c88034..d007e315fe 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java @@ -3,6 +3,8 @@ package com.fr.design.actions.file; import com.fr.design.EnvChangeEntrance; import com.fr.design.actions.UpdateAction; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.JTemplate; import java.awt.event.ActionEvent; @@ -17,4 +19,13 @@ public class EditEnvAction extends UpdateAction { public void actionPerformed(ActionEvent e) { EnvChangeEntrance.getInstance().chooseEnv(); } + + @Override + public void update() { + super.update(); + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (template != null) { + this.setEnabled(!template.isSaving()); + } + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java index bc88f72fd0..c59a92b975 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java @@ -1,10 +1,11 @@ package com.fr.design.actions.file; -import com.fr.base.svg.IconUtils; import com.fr.design.DesignerEnvManager; import com.fr.design.EnvChangeEntrance; import com.fr.design.actions.UpdateAction; import com.fr.design.env.DesignerWorkspaceInfo; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.mainframe.JTemplate; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; @@ -68,5 +69,14 @@ public class SwitchExistEnv extends MenuDef { EnvChangeEntrance.getInstance().switch2Env(envName); } } + + @Override + public void update() { + super.update(); + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (template != null) { + this.setEnabled(!template.isSaving()); + } + } } } diff --git a/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java b/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java index 8a1f55cbdf..889a0c3c9c 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java +++ b/designer-base/src/main/java/com/fr/design/dialog/link/MessageWithLink.java @@ -9,6 +9,7 @@ import java.awt.Font; import java.net.URI; import javax.swing.JEditorPane; import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; /** * 用来构建JOptionPane带超链的消息提示 @@ -19,31 +20,45 @@ import javax.swing.event.HyperlinkEvent; */ public class MessageWithLink extends JEditorPane { + private static final UILabel LABEL = new UILabel(); + + public MessageWithLink(String message, String linkName, String link) { - super("text/html", "" + message + "" + linkName + "" + ""); - addHyperlinkListener(e -> { - if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) { - try { - Desktop.getDesktop().browse(URI.create(link)); - } catch (Exception exception) { - FineLoggerFactory.getLogger().error(exception.getMessage(), exception); - } - } - }); - setEditable(false); - setBorder(null); + this(message, linkName, link, LABEL.getBackground(), LABEL.getFont()); } public MessageWithLink(String linkName, String link ) { this(StringUtils.EMPTY, linkName, link); } - private static StringBuilder getStyle() { - // 构建和相同风格样式 - UILabel label = new UILabel(); - Font font = label.getFont(); - Color color = label.getBackground(); + public MessageWithLink(String message, String linkName, String link, Color color) { + this(message, linkName, link, color, LABEL.getFont()); + } + + public MessageWithLink(String message, String linkName, String link, Color color, Font font) { + super("text/html", "" + message + "" + linkName + "" + ""); + initListener(link); + setEditable(false); + setBorder(null); + } + + protected void initListener(String link) { + addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) { + try { + Desktop.getDesktop().browse(URI.create(link)); + } catch (Exception exception) { + FineLoggerFactory.getLogger().error(exception.getMessage(), exception); + } + } + } + }); + } + private static StringBuilder generateStyle(Color color, Font font) { + // 构建相同风格样式 StringBuilder style = new StringBuilder("font-family:" + font.getFamily() + ";"); style.append("font-weight:").append(font.isBold() ? "bold" : "normal").append(";"); style.append("font-size:").append(font.getSize()).append("pt;"); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java index f940f89045..a2cc6f8065 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java @@ -21,10 +21,16 @@ import javax.swing.JLayeredPane; */ public class DesktopCardPane extends BasicPane implements TargetModifiedListener { + private static final int CONTENT_LAYER = 0; + private static final int TRANSPARENT_LAYER = 1; + private static final int LOADING_LAYER = 2; + private static final int FAILED_LAYER = 3; + private static final long serialVersionUID = 1L; private JTemplate component; private TransparentPane transparentPane = new TransparentPane(); private OpenLoadingPane loadingPane = new OpenLoadingPane(); + private OpenFailedPane failedPane = new OpenFailedPane(); private JLayeredPane layeredPane = new JLayeredPane() { @Override public void doLayout() { @@ -36,8 +42,9 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener protected DesktopCardPane() { setLayout(new BorderLayout()); - layeredPane.add(transparentPane, 1); - layeredPane.add(loadingPane, 2); + layeredPane.add(transparentPane, TRANSPARENT_LAYER); + layeredPane.add(failedPane, FAILED_LAYER); + add(layeredPane, BorderLayout.CENTER); } protected void showJTemplate(final JTemplate jt) { @@ -53,7 +60,7 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener layeredPane.remove(component); } component = jt; - layeredPane.add(component, 0); + layeredPane.add(component, CONTENT_LAYER); checkSavingAndOpening(jt); add(layeredPane, BorderLayout.CENTER); validate(); @@ -69,18 +76,34 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener showCover(); } else if (jt.isOpening()) { showOpenStatus(); + } else if (jt.isOpenFailed()) { + showOpenFailedCover(); } else { hideCover(); } } + /** + * 让loadingPane懒加载 + */ + private void checkLoadingPane() { + if (layeredPane.getComponent(LOADING_LAYER) != loadingPane) { + layeredPane.add(loadingPane, LOADING_LAYER); + } + } + private void showOpenStatus() { DesignerContext.getDesignerFrame().refreshUIToolBar(); DesignerFrameFileDealerPane.getInstance().stateChange(); EastRegionContainerPane.getInstance().updateAllPropertyPane(); + checkLoadingPane(); layeredPane.moveToFront(loadingPane); } + public void showOpenFailedCover() { + layeredPane.moveToFront(failedPane); + } + public void showCover() { layeredPane.moveToFront(transparentPane); DesignerContext.getDesignerFrame().refreshUIToolBar(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 8097d02f40..3bf9848de2 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -794,7 +794,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public void setEnabled(boolean isEnabled) { JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); if (template != null) { - this.isEnabled = isEnabled && !template.isOpening() && !template.isSaving(); + this.isEnabled = isEnabled && template.checkEnable(); } else { this.isEnabled = isEnabled; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index b374dbbf97..8d526971cb 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -115,6 +115,7 @@ public abstract class JTemplate> protected TimeConsumeTimer consumeTimer = new TimeConsumeTimer(); private volatile boolean saving = false; private volatile boolean opening = false; + private volatile boolean openFailed = false; private PluginEventListener pluginListener; @@ -1585,8 +1586,16 @@ public abstract class JTemplate> this.opening = opening; } + public boolean isOpenFailed() { + return openFailed; + } + + public void setOpenFailed(boolean openFailed) { + this.openFailed = openFailed; + } + public boolean checkEnable() { - return !isSaving() && !isOpening(); + return !isSaving() && !isOpening() && !isOpenFailed(); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java b/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java index 5a81319739..9ee095c996 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/OpenLoadingPane.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe; import com.fr.design.gui.ilable.UILabel; -import com.fr.general.IOUtils; import java.awt.Color; import java.awt.Component; import java.awt.Container; @@ -17,6 +16,8 @@ import javax.swing.JPanel; */ public class OpenLoadingPane extends JPanel { + private static final ImageIcon LOADING_ICON = new ImageIcon(OpenLoadingPane.class.getResource("/com/fr/design/images/mainframe/loading.gif")); + private UILabel loadingLabel; public OpenLoadingPane() { @@ -53,7 +54,7 @@ public class OpenLoadingPane extends JPanel { } }); setBackground(Color.WHITE); - loadingLabel = new UILabel(new ImageIcon(IOUtils.readImage("com/fr/plugin/chart/vanchart/export/loading.png"))); + loadingLabel = new UILabel(LOADING_ICON); add(loadingLabel); } diff --git a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java index 55b80c0ec8..cee1658b91 100644 --- a/designer-base/src/main/java/com/fr/design/menu/MenuDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/MenuDef.java @@ -411,7 +411,7 @@ public class MenuDef extends ShortCut { JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); boolean flag = true; if (template != null) { - flag = !template.isSaving() && !template.isOpening(); + flag = template.checkEnable(); } component.setEnabled(flag); if (!flag) { diff --git a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java index f166020513..2da4d335ec 100644 --- a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java @@ -1,11 +1,15 @@ package com.fr.design.worker.open; +import com.fr.chart.exception.ChartNotFoundException; +import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrameFileDealerPane; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.JTemplate; import com.fr.design.worker.WorkerManager; +import com.fr.exception.DecryptTemplateException; import com.fr.file.FILE; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; @@ -13,7 +17,9 @@ import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import javax.swing.JOptionPane; import javax.swing.SwingWorker; +import javax.swing.UIManager; /** * 模板打开的worker @@ -54,11 +60,34 @@ public class OpenWorker extends SwingWorker { result = get(); } catch (CancellationException ignored) { return; - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + } catch (Throwable t) { + processFailed(); + Throwable cause = t.getCause(); + if (cause instanceof DecryptTemplateException) { + FineJOptionPane.showMessageDialog( + DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Encrypt_Decrypt_Exception"), + Toolkit.i18nText("Fine-Design_Basic_Alert"), + JOptionPane.WARNING_MESSAGE, + UIManager.getIcon("OptionPane.errorIcon") + ); + } + if (cause instanceof ChartNotFoundException) { + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Chart_Not_Found_Exception"), + Toolkit.i18nText("Fine-Design_Basic_Error"), + JOptionPane.ERROR_MESSAGE, + UIManager.getIcon("OptionPane.errorIcon")); + } + FineLoggerFactory.getLogger().error(t.getMessage(), t); + return; } - this.template.setOpening(false); // 后续动作 + processResult(); + } + + private void processResult() { + this.template.setOpening(false); if (slowly && templateCallable != null) { try { JTemplate book = templateCallable.call(); @@ -89,6 +118,15 @@ public class OpenWorker extends SwingWorker { WorkerManager.getInstance().removeWorker(taskName); } + private void processFailed() { + this.template.setOpenFailed(true); + this.template.setOpening(false); + DesignerContext.getDesignerFrame().getCenterTemplateCardPane().showOpenFailedCover(); + DesignerFrameFileDealerPane.getInstance().stateChange(); + WorkerManager.getInstance().removeWorker(taskName); + + } + public void addCallBack(Callable> templateCallable) { this.templateCallable = templateCallable; } From 907e2957afe37bad882a49c5d1ae6dd1dfeb2f33 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 20 Apr 2021 20:06:24 +0800 Subject: [PATCH 36/49] =?UTF-8?q?CHART-18997=20=E5=A4=84=E7=90=86=E4=B8=8B?= =?UTF-8?q?=E6=89=93=E5=BC=80=E6=A8=A1=E6=9D=BF=E5=87=BA=E9=94=99=E6=97=B6?= =?UTF-8?q?=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/OpenFailedPane.java | 92 ++++++++++++++++++ .../fr/design/images/mainframe/loading.gif | Bin 0 -> 17443 bytes .../design/images/mainframe/open_failed.png | Bin 0 -> 2550 bytes 3 files changed, 92 insertions(+) create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java create mode 100644 designer-base/src/main/resources/com/fr/design/images/mainframe/loading.gif create mode 100644 designer-base/src/main/resources/com/fr/design/images/mainframe/open_failed.png diff --git a/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java b/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java new file mode 100644 index 0000000000..101585abb3 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java @@ -0,0 +1,92 @@ +package com.fr.design.mainframe; + +import com.fr.design.dialog.link.MessageWithLink; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.general.IOUtils; +import com.fr.stable.StringUtils; +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.LayoutManager; +import javax.swing.JPanel; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; + +/** + * @author hades + * @version 10.0 + * Created by hades on 2021/4/20 + */ +public class OpenFailedPane extends JPanel { + + private UILabel label; + private MessageWithLink link; + + public OpenFailedPane() { + this.setLayout(new LayoutManager() { + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return parent.getPreferredSize(); + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + @Override + public void layoutContainer(Container parent) { + int width = parent.getParent().getWidth(); + int height = parent.getParent().getHeight(); + int labelWidth = label.getPreferredSize().width; + int labelHeight = label.getPreferredSize().height; + int labelX = (width - labelWidth) / 2; + int labelY = (height - labelHeight) / 2; + int linkWidth = link.getPreferredSize().width; + int linkHeight = link.getPreferredSize().height; + int linkX = (width - linkWidth) / 2; + int linkY = (height - labelHeight) / 2 + labelHeight; + label.setBounds(labelX, labelY, labelWidth, labelHeight); + link.setBounds(linkX, linkY, linkWidth, linkHeight); + } + }); + this.setBackground(Color.WHITE); + label = new UILabel(IOUtils.readIcon("/com/fr/design/images/mainframe/open_failed.png"), UILabel.CENTER); + link = new MessageWithLink(Toolkit.i18nText("Fine-Design_Open_Failed_Tip"), Toolkit.i18nText("Fine-Design_Open_Failed_Retry"), StringUtils.EMPTY, Color.WHITE) { + @Override + protected void initListener(String link) { + addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) { + // 重试 + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + template = JTemplateFactory.createJTemplate(template.getEditingFILE()); + DesignerContext.getDesignerFrame().addAndActivateJTemplate(template); + HistoryTemplateListCache.getInstance(). setCurrentEditingTemplate(template); + } + } + }); + } + }; + link.setBackground(Color.WHITE); + this.add(label); + this.add(link); + } + + + +} diff --git a/designer-base/src/main/resources/com/fr/design/images/mainframe/loading.gif b/designer-base/src/main/resources/com/fr/design/images/mainframe/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..c77b4fe1006d29f61dddeb03fa96d3614184947c GIT binary patch literal 17443 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 G Date: Wed, 21 Apr 2021 10:57:51 +0800 Subject: [PATCH 37/49] =?UTF-8?q?REPORT-51292=20mongodb=E6=8F=92=E4=BB=B6-?= =?UTF-8?q?feature=E5=88=86=E6=94=AF=E4=B8=8B=E7=82=B9=E5=87=BB=E7=A1=AE?= =?UTF-8?q?=E5=AE=9A=E5=90=8E=E4=BF=9D=E5=AD=98=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datapane/connect/DatabaseConnectionPane.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java index 3e1e1f5315..61988cc69a 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -73,6 +73,7 @@ public abstract class DatabaseConnectionPane Date: Thu, 22 Apr 2021 14:20:43 +0800 Subject: [PATCH 38/49] =?UTF-8?q?CHART-18997design=20=E8=A1=A8=E5=8D=95=20?= =?UTF-8?q?=E6=89=A9=E5=B1=95=E5=9B=BE=E8=A1=A8=E5=9B=BE=E8=A1=A8=E5=9D=97?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E5=A4=B1=E8=B4=A5=20=E4=B8=8D=E5=90=9E?= =?UTF-8?q?=E6=8A=9B=E9=94=99rethrow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/mainframe/DesignerFrame.java | 2 +- .../main/java/com/fr/design/worker/open/OpenWorker.java | 9 +++++---- .../main/java/com/fr/design/mainframe/app/CptApp.java | 2 +- .../main/java/com/fr/design/mainframe/app/CptxApp.java | 2 +- .../main/java/com/fr/design/mainframe/app/FormApp.java | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index b66e6046bf..abedf38805 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -4,7 +4,7 @@ package com.fr.design.mainframe; import com.fr.base.BaseUtils; -import com.fr.chart.exception.ChartNotFoundException; +import com.fr.base.chart.exception.ChartNotFoundException; import com.fr.design.DesignModelAdapter; import com.fr.design.DesignState; import com.fr.design.DesignerEnvManager; diff --git a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java index 2da4d335ec..f556eb612e 100644 --- a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java @@ -1,6 +1,6 @@ package com.fr.design.worker.open; -import com.fr.chart.exception.ChartNotFoundException; +import com.fr.base.chart.exception.ChartNotFoundException; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.i18n.Toolkit; @@ -13,13 +13,14 @@ import com.fr.exception.DecryptTemplateException; import com.fr.file.FILE; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; + +import javax.swing.JOptionPane; +import javax.swing.SwingWorker; +import javax.swing.UIManager; import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import javax.swing.JOptionPane; -import javax.swing.SwingWorker; -import javax.swing.UIManager; /** * 模板打开的worker diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java index b55640990a..5733151c16 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java @@ -3,9 +3,9 @@ package com.fr.design.mainframe.app; import com.fr.base.BaseUtils; import com.fr.base.Style; import com.fr.base.TempNameStyle; +import com.fr.base.chart.exception.ChartNotFoundException; import com.fr.base.extension.FileExtension; import com.fr.base.io.XMLEncryptUtils; -import com.fr.chart.exception.ChartNotFoundException; import com.fr.config.ServerPreferenceConfig; import com.fr.design.DesignerEnvManager; import com.fr.design.actions.server.StyleListAction; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptxApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptxApp.java index c7411e942f..95104e2f8e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptxApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptxApp.java @@ -1,9 +1,9 @@ package com.fr.design.mainframe.app; +import com.fr.base.chart.exception.ChartNotFoundException; import com.fr.base.extension.FileExtension; import com.fr.base.frpx.exception.FRPackageRunTimeException; import com.fr.base.frpx.exception.InvalidWorkBookException; -import com.fr.chart.exception.ChartNotFoundException; import com.fr.design.i18n.Toolkit; import com.fr.exception.DecryptTemplateException; import com.fr.exception.RemoteDesignPermissionDeniedException; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java index 6f801e058c..616d4be079 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java @@ -1,8 +1,8 @@ package com.fr.design.mainframe.app; import com.fr.base.Parameter; +import com.fr.base.chart.exception.ChartNotFoundException; import com.fr.base.io.XMLEncryptUtils; -import com.fr.chart.exception.ChartNotFoundException; import com.fr.design.DesignerEnvManager; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.AbstractAppProvider; From fb0d6575de14889736788e0819b4e0d528989cae Mon Sep 17 00:00:00 2001 From: hades Date: Fri, 23 Apr 2021 14:59:09 +0800 Subject: [PATCH 39/49] =?UTF-8?q?REPORT-51317=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=90=8E=EF=BC=8C=E4=BF=9D=E5=AD=98=E4=B8=AD?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E5=8A=A8=E7=94=BB=E8=BF=98=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/worker/save/SaveWorker.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java index 2ce5089705..f6c21f208d 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java @@ -52,13 +52,19 @@ public class SaveWorker extends SwingWorker { try { success = get(); } catch (Exception e) { + processResult(); FineLoggerFactory.getLogger().error(e.getMessage(), e); FineJOptionPane.showMessageDialog( DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design-Basic_Save_Failure"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), JOptionPane.ERROR_MESSAGE); + return; } + processResult(); + } + + private void processResult() { this.template.setSaving(false); // 恢复界面 if (slowly && ComparatorUtils.equals(this.template.getName(), HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getName())) { From e799d65b7ed9b75ddb61d11feaf45e1984b2eef8 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Sun, 25 Apr 2021 11:27:20 +0800 Subject: [PATCH 40/49] =?UTF-8?q?CHART-19018=20=E6=8F=92=E5=85=A5=E6=82=AC?= =?UTF-8?q?=E6=B5=AE=E5=9B=BE=E8=A1=A8=E5=90=8E=EF=BC=8C=E5=86=8D=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E5=8D=95=E5=85=83=E6=A0=BC=E5=9B=BE=E8=A1=A8=EF=BC=8C?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E7=82=B9=E5=87=BA=E5=9B=BE=E8=A1=A8=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/EastRegionContainerPane.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 3d3ab06d01..8097d02f40 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -843,10 +843,8 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } public void replaceContentPane(JComponent pane) { - if (pane != this.contentPane) { - contentArea.remove(this.contentPane); - contentArea.add(this.contentPane = pane); - } + contentArea.remove(this.contentPane); + contentArea.add(this.contentPane = pane); if (popupDialog != null && isPoppedOut) { popupDialog.replaceContentPane(this); } From adc8808b16cb289867aaae05732cff5444498f0d Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Mon, 26 Apr 2021 11:06:39 +0800 Subject: [PATCH 41/49] =?UTF-8?q?CHART-18951=20=E6=82=AC=E6=B5=AE=E7=AA=97?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E6=97=A0=E6=B3=95=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../series/SeriesCondition/impl/ChartHyperPoplinkPane.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java index 7083da6818..ae38672204 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java @@ -11,7 +11,6 @@ import com.fr.design.gui.itextfield.UITextField; import com.fr.design.hyperlink.AbstractHyperLinkPane; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.chart.ChartHyperEditPane; -import com.fr.design.module.DesignModuleFactory; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.log.FineLoggerFactory; @@ -122,7 +121,6 @@ public class ChartHyperPoplinkPane extends AbstractHyperLinkPane Date: Thu, 29 Apr 2021 17:16:45 +0800 Subject: [PATCH 42/49] =?UTF-8?q?REPORT-51309=20=E5=AF=BC=E5=87=BA-?= =?UTF-8?q?=E5=AD=97=E4=BD=93=E6=A3=80=E6=B5=8B-=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E6=8F=90=E7=A4=BA=E7=9A=84=E6=96=87=E5=AD=97?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/check/CheckFontInfoDialog.java | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java index 837d48b288..0d5771a494 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckFontInfoDialog.java @@ -17,7 +17,6 @@ import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.UIManager; import java.awt.BorderLayout; -import java.awt.Cursor; import java.awt.Dimension; import java.awt.Frame; import java.awt.event.ActionEvent; @@ -100,26 +99,14 @@ public class CheckFontInfoDialog extends JDialog implements ActionListener { directUiLabel.setIcon(UIManager.getIcon("OptionPane.narrow.down")); } } - - @Override - public void mouseEntered(MouseEvent e) { - detailLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } - - @Override - public void mouseExited(MouseEvent e) { - detailLabel.setCursor(Cursor.getDefaultCursor()); - } }); //底部的按钮面板 UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Report_OK")); - JPanel buttonPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); - buttonPanel.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); - buttonPanel.add(okButton, BorderLayout.EAST); okButton.addActionListener(this); bottomPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); - bottomPanel.add(buttonPanel); + bottomPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + bottomPanel.add(okButton, BorderLayout.EAST); this.setTitle(Toolkit.i18nText("Fine_Designer_Check_Font")); this.setResizable(false); From 4e4e1132d012c28fac74310ff57c4b70c7586810 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Thu, 29 Apr 2021 17:18:50 +0800 Subject: [PATCH 43/49] =?UTF-8?q?REPORT-51281=20&=20=09REPORT-51378=20&=20?= =?UTF-8?q?REPORT-51490=20=E5=AF=BC=E5=87=BA-=E5=AD=97=E4=BD=93=E6=A3=80?= =?UTF-8?q?=E6=B5=8B-=E6=A8=A1=E6=9D=BF=E4=BF=9D=E5=AD=98=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/check/CheckButton.java | 77 ++++++++++++++----- 1 file changed, 59 insertions(+), 18 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java index f42d18d404..e55f9a4817 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java @@ -7,6 +7,7 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; +import com.fr.design.worker.save.CallbackSaveWorker; import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.log.FineLoggerFactory; @@ -29,6 +30,7 @@ import java.awt.event.WindowEvent; import java.util.Set; import java.util.concurrent.ExecutionException; +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; @@ -67,12 +69,14 @@ public class CheckButton extends UIButton { if (set == null) { return; } - if(set.isEmpty()) { + if (set.isEmpty()) { okButton.setEnabled(true); uiLabel.setIcon(BaseUtils.readIcon("com/fr/design/images/correct.png")); message.setText("" + Toolkit.i18nText("Fine_Designer_Check_Font_Success") + ""); } else { - dialog.dispose(); + if (dialog != null) { + dialog.dispose(); + } StringBuilder textBuilder = new StringBuilder(); textBuilder.append(Toolkit.i18nText("Fine_Designer_Check_Font_Missing_Font")).append("\n"); for (String font : set) { @@ -88,14 +92,46 @@ public class CheckButton extends UIButton { } }; - JTemplate jtemplate = DesignerContext.getDesignerFrame().getSelectedJTemplate(); + JTemplate jtemplate = DesignerContext.getDesignerFrame().getSelectedJTemplate(); if (jtemplate == null || jtemplate.getEditingFILE() == null) { return; } FILE currentTemplate = jtemplate.getEditingFILE(); - if(currentTemplate instanceof FileNodeFILE){ - checkThread.execute(); - }else { + if (currentTemplate instanceof FileNodeFILE) { + // 判断下模板是否存在 不存在先提示 + if (!currentTemplate.exists()) { + int selVal = showConfirmDialog( + DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Basic_Web_Preview_Message"), + Toolkit.i18nText("Fine_Designer_Check_Font"), + OK_CANCEL_OPTION, + WARNING_MESSAGE + ); + if (OK_OPTION == selVal) { + CallbackSaveWorker worker = jtemplate.saveAs(); + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + startCheck(checkThread); + } + }); + worker.start(jtemplate.getTarget().getTemplateID()); + } + } else { + if (!jtemplate.isSaved()) { + CallbackSaveWorker worker = jtemplate.save(); + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + startCheck(checkThread); + } + }); + worker.start(jtemplate.getTarget().getTemplateID()); + } else { + startCheck(checkThread); + } + } + } else { //模板不在报表环境下,提示保存 int selVal = FineJOptionPane.showConfirmDialog( DesignerContext.getDesignerFrame(), @@ -103,27 +139,27 @@ public class CheckButton extends UIButton { Toolkit.i18nText("Fine_Designer_Check_Font"), OK_CANCEL_OPTION, WARNING_MESSAGE); - if (OK_OPTION == selVal) { - //保存成功才执行检测 - if (jtemplate.saveAsTemplate2Env()) { - checkThread.execute(); - } + CallbackSaveWorker worker = jtemplate.saveAs2Env(); + worker.addSuccessCallback(new Runnable() { + @Override + public void run() { + startCheck(checkThread); + } + }); + worker.start(jtemplate.getTarget().getTemplateID()); } } - initDialogPane(); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - dialog.dispose(); - } - }); + } + private void startCheck(SwingWorker, Void> checkThread) { + initDialogPane(); dialog.addWindowListener(new WindowAdapter() { public void windowClosed(WindowEvent e) { checkThread.cancel(true); } }); - + checkThread.execute(); dialog.setVisible(true); dialog.dispose(); } @@ -150,6 +186,11 @@ public class CheckButton extends UIButton { uiLabel = new UILabel(); okButton = new UIButton(Toolkit.i18nText("Fine-Design_Report_OK")); okButton.setEnabled(false); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + dialog.dispose(); + } + }); dialog = new JDialog(); dialog.setTitle(Toolkit.i18nText("Fine_Designer_Check_Font")); dialog.setModal(true); From bf16dad6e4ed1b725815339e0148e5e17f4d7985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Thu, 29 Apr 2021 17:50:08 +0800 Subject: [PATCH 44/49] =?UTF-8?q?CHART-19104=20=E9=BC=A0=E6=A0=87=E7=9A=84?= =?UTF-8?q?click=E4=BA=8B=E4=BB=B6=E4=B8=8D=E8=83=BD=E7=A8=B3=E5=AE=9A?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=EF=BC=8C=E6=94=B9=E4=B8=BAchange=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VanChartFormatPaneWithCheckBox.java | 32 ++----------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithCheckBox.java index 6f5fc270ac..38ae4a08ce 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithCheckBox.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithCheckBox.java @@ -12,13 +12,12 @@ import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.stable.Constants; import javax.swing.JPanel; +import java.text.Format; +import java.util.Map; import java.awt.BorderLayout; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.text.Format; -import java.util.Map; /** * Created by Mitisky on 16/2/23. @@ -54,32 +53,7 @@ public abstract class VanChartFormatPaneWithCheckBox extends JPanel{ this.add(formatButton, BorderLayout.EAST); initFormatListener(); - isSelectedBox.addMouseListener(new MouseListener() { - @Override - public void mouseClicked(MouseEvent e) { - isDirty = true; - } - - @Override - public void mousePressed(MouseEvent e) { - - } - - @Override - public void mouseReleased(MouseEvent e) { - - } - - @Override - public void mouseEntered(MouseEvent e) { - - } - - @Override - public void mouseExited(MouseEvent e) { - - } - }); + isSelectedBox.addChangeListener((e)-> isDirty = true); } protected abstract String getCheckBoxText(); From c50b9a067bcd7eaf5cf0ae65647f89b1d2f292fd Mon Sep 17 00:00:00 2001 From: hades Date: Sat, 8 May 2021 14:31:54 +0800 Subject: [PATCH 45/49] =?UTF-8?q?REPORT-51409=20=E6=89=93=E5=BC=80?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=8A=A0=E8=BD=BD=E5=A4=B1=E8=B4=A5=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E7=82=B9=E5=87=BB=E9=87=8D=E8=AF=95=EF=BC=8C=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=9B=AE=E5=BD=95=E4=B8=8A=E6=96=B9=E7=9A=84=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E6=A0=8F=E9=83=BD=E5=8F=98=E5=BE=97=E5=8F=AF=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/mainframe/OpenFailedPane.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java b/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java index 101585abb3..132569c236 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/OpenFailedPane.java @@ -74,9 +74,10 @@ public class OpenFailedPane extends JPanel { if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) { // 重试 JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + template.whenClose(); template = JTemplateFactory.createJTemplate(template.getEditingFILE()); + HistoryTemplateListCache.getInstance().replaceCurrentEditingTemplate(template); DesignerContext.getDesignerFrame().addAndActivateJTemplate(template); - HistoryTemplateListCache.getInstance(). setCurrentEditingTemplate(template); } } }); From d340a683efcf113b10ccbe59e983bf74105a8ba6 Mon Sep 17 00:00:00 2001 From: hades Date: Sat, 8 May 2021 14:33:32 +0800 Subject: [PATCH 46/49] =?UTF-8?q?REPORT-51401=20=E6=89=93=E5=BC=80?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8=E4=B8=8A?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E9=A1=BA=E5=BA=8F=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/DesignerFrameFileDealerPane.java | 9 ++++++--- .../com/fr/design/mainframe/app/AbstractWorkBookApp.java | 2 ++ .../main/java/com/fr/design/mainframe/app/CptApp.java | 2 -- .../main/java/com/fr/design/mainframe/app/FormApp.java | 3 +-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index ad4726d664..fe25890282 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -181,9 +181,12 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt jt.requestFocus(); jt.revert(); - FineLoggerFactory.getLogger().info( - "\"" + jt.getEditingFILE().getName() + "\"" - + Toolkit.i18nText("Fine-Design_Basic_LOG_Has_Been_Openned") + "!"); + // 打开为空占位模板时不输出 + if (!jt.isOpening()) { + FineLoggerFactory.getLogger().info( + "\"" + jt.getEditingFILE().getName() + "\"" + + Toolkit.i18nText("Fine-Design_Basic_LOG_Has_Been_Openned") + "!"); + } } /** diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/AbstractWorkBookApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/AbstractWorkBookApp.java index 824fbf77d3..3fd12d81a3 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/AbstractWorkBookApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/AbstractWorkBookApp.java @@ -7,6 +7,7 @@ import com.fr.design.mainframe.JWorkBook; import com.fr.design.worker.open.OpenResult; import com.fr.design.worker.open.OpenWorker; import com.fr.file.FILE; +import com.fr.log.FineLoggerFactory; import com.fr.main.impl.WorkBook; import com.fr.report.worksheet.WorkSheet; import java.util.concurrent.Callable; @@ -42,6 +43,7 @@ abstract class AbstractWorkBookApp implements App { } }); worker.start(tplFile.getPath()); + FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_Opening_And_Waiting", tplFile.getName()) + "..."); OpenResult result = worker.getResult(); if (result != null) { return new JWorkBook(result.getBaseBook(), tplFile); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java index 5733151c16..4e9980a499 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/CptApp.java @@ -58,8 +58,6 @@ class CptApp extends AbstractWorkBookApp { } WorkBook tpl = new WorkBook(); - // richer:打开报表通知 - FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_Opening_And_Waiting", file.getName()) + "..."); TempNameStyle namestyle = TempNameStyle.getInstance(); namestyle.clear(); try { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java b/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java index 616d4be079..05454fcbe8 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/app/FormApp.java @@ -61,6 +61,7 @@ class FormApp extends AbstractAppProvider { new Object[]{result.getBaseBook(), tplFile, result.getRef()}, classType, BaseJForm.class); } }); + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Report_Template_Opening_And_Waiting", tplFile.getName()) + "..."); worker.start(tplFile.getPath()); OpenResult result = worker.getResult(); if (result != null) { @@ -83,8 +84,6 @@ class FormApp extends AbstractAppProvider { // peter:打开新报表. Form tpl = new Form(); - // richer:打开报表通知 - FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Report_Template_Opening_And_Waiting", file.getName()) + "..."); try { tpl.readStream(file.asInputStream()); } catch (DecryptTemplateException | ChartNotFoundException e) { From 1ddcc02f7e9efcbb36c924ba4057b6e1db132857 Mon Sep 17 00:00:00 2001 From: hades Date: Sat, 8 May 2021 16:05:04 +0800 Subject: [PATCH 47/49] =?UTF-8?q?REPORT-51304=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=97=B6gif=E8=83=8C=E6=99=AF=E4=B8=BA=E9=80=8F=E6=98=8E?= =?UTF-8?q?=E6=97=B6=20=E9=94=AF=E9=BD=BF=E5=A4=AA=E4=B8=A5=E9=87=8D=20?= =?UTF-8?q?=E9=80=9A=E8=BF=87=E4=BB=A3=E7=A0=81=E6=9D=A5=E7=BB=98=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/DesktopCardPane.java | 2 + .../fr/design/mainframe/TransparentPane.java | 98 +++++++++++++++---- 2 files changed, 81 insertions(+), 19 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java index a2cc6f8065..22a10d3ba0 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java @@ -105,11 +105,13 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener } public void showCover() { + transparentPane.start(); layeredPane.moveToFront(transparentPane); DesignerContext.getDesignerFrame().refreshUIToolBar(); } public void hideCover() { + transparentPane.stop(); layeredPane.moveToFront(component); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/TransparentPane.java b/designer-base/src/main/java/com/fr/design/mainframe/TransparentPane.java index 100ab04f63..8861a75919 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/TransparentPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/TransparentPane.java @@ -3,6 +3,7 @@ package com.fr.design.mainframe; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import java.awt.AlphaComposite; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Composite; @@ -11,23 +12,34 @@ import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.LayoutManager; +import java.awt.RenderingHints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JComponent; +import javax.swing.Timer; /** * @author hades * @version 10.0 * Created by hades on 2021/4/12 */ -public class TransparentPane extends JComponent { +public class TransparentPane extends JComponent implements ActionListener { - private static final ImageIcon LOADING_ICON = new ImageIcon(TransparentPane.class.getResource("/com/fr/web/images/loading-local.gif")); - - private UILabel loadingLabel; private UILabel label; private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); + private volatile boolean mIsRunning; + private volatile boolean mIsFadingOut; + private Timer mTimer; + private int mAngle; + private int mFadeCount; + private int mFadeLimit = 15; + private int lines = 12; + private int maxAngle = 360; + private int angleAdd = 30; + private double prec = 0.56; public TransparentPane() { @@ -41,10 +53,7 @@ public class TransparentPane extends JComponent { setLayout(getCoverLayout()); setBackground(null); setOpaque(false); - - loadingLabel = new UILabel(LOADING_ICON); label = new UILabel(Toolkit.i18nText("Fine-Design_Saving_Template_Tip")); - add(loadingLabel); add(label); } @@ -69,16 +78,11 @@ public class TransparentPane extends JComponent { public void layoutContainer(Container parent) { int width = parent.getParent().getWidth(); int height = parent.getParent().getHeight(); - int loadingLabelWidth = loadingLabel.getPreferredSize().width; - int loadingLabelHeight = loadingLabel.getPreferredSize().height; - int buttonX = (width - loadingLabelWidth) / 2; - int buttonY = (height - loadingLabelHeight) / 2; int labelWidth = label.getPreferredSize().width; int labelHeight = label.getPreferredSize().height; int labelX = (width - labelWidth) / 2; - int labelY = (height - labelHeight) / 2 + loadingLabelHeight; + int labelY = (int) ((height - labelHeight) * prec); label.setBounds(labelX, labelY, labelWidth, labelHeight); - loadingLabel.setBounds(buttonX, buttonY, loadingLabelWidth, loadingLabelHeight); } @Override @@ -90,13 +94,69 @@ public class TransparentPane extends JComponent { @Override public void paint(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - Composite oldComposite = g2d.getComposite(); - g2d.setComposite(composite); - g2d.setColor(Color.BLACK); - g2d.fillRect(0, 0, getWidth(), getHeight()); - g2d.setComposite(oldComposite); + int w = this.getWidth(); + int h = this.getHeight(); super.paint(g); + if (!mIsRunning) { + return; + } + Graphics2D g2 = (Graphics2D) g.create(); + float fade = (float) mFadeCount / (float) mFadeLimit; + Composite urComposite = g2.getComposite(); + g2.setComposite(composite); + g2.fillRect(0, 0, w, h); + g2.setComposite(urComposite); + int s = Math.min(w, h) / 50; + int cx = w / 2; + int cy = h / 2; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setStroke(new BasicStroke(s / 4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + g2.setPaint(Color.BLACK); + g2.rotate(Math.PI * mAngle / 180, cx, cy); + for (int i = 0; i < lines; i++) { + float scale = (11.0f - (float) i) / 11.0f; + g2.drawLine(cx + s, cy, cx + s * 2, cy); + g2.rotate(-Math.PI / 6, cx, cy); + g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, scale * fade)); + } + g2.dispose(); + } + + @Override + public void actionPerformed(ActionEvent e) { + if (mIsRunning) { + repaint(); + mAngle += angleAdd; + if (mAngle >= maxAngle) { + mAngle = 0; + } + if (mIsFadingOut) { + if (--mFadeCount == 0) { + mIsRunning = false; + mTimer.stop(); + } + } else if (mFadeCount < mFadeLimit) { + mFadeCount++; + } + } + } + + public void start() { + if (mIsRunning) { + return; + } + mIsRunning = true; + mIsFadingOut = false; + mFadeCount = 0; + int fps = 24; + int tick = 1000 / fps; + mTimer = new Timer(tick, this); + mTimer.start(); + } + + public void stop() { + mIsRunning = false; + mIsFadingOut = true; } } From 27df4e1d74b4c818f2245a2ed29f7c9f79cb0897 Mon Sep 17 00:00:00 2001 From: hades Date: Sat, 8 May 2021 16:14:45 +0800 Subject: [PATCH 48/49] =?UTF-8?q?REPORT-51315=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E7=9A=84=E5=9B=BE=E6=A0=87=E9=81=97=E6=BC=8F=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E5=8A=A8=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/file/MutilTempalteTabPane.java | 9 +++++++++ .../fr/design/images/file/grey_saving_close.gif | Bin 0 -> 3430 bytes .../fr/design/images/file/white_saving_close.gif | Bin 0 -> 3488 bytes 3 files changed, 9 insertions(+) create mode 100644 designer-base/src/main/resources/com/fr/design/images/file/grey_saving_close.gif create mode 100644 designer-base/src/main/resources/com/fr/design/images/file/white_saving_close.gif 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 0e81485849..d2d77117fd 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 @@ -26,6 +26,7 @@ import com.fr.third.javax.annotation.Nonnull; import javax.swing.BorderFactory; import javax.swing.ButtonModel; import javax.swing.Icon; +import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JMenuItem; @@ -69,6 +70,8 @@ public class MutilTempalteTabPane extends JComponent { private static Icon CLOSE = BaseUtils.readIcon("/com/fr/design/images/buttonicon/close_icon.png"); 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 Icon WHITE_SAVING_CLOSE_ICON = new ImageIcon(MutilTempalteTabPane.class.getResource("/com/fr/design/images/file/white_saving_close.gif")); + private static final Icon GREY_SAVING_CLOSE_ICON = new ImageIcon(MutilTempalteTabPane.class.getResource("/com/fr/design/images/file/grey_saving_close.gif")); private static final String ELLIPSIS = "..."; private static final int GAP = 5; private static final int SMALLGAP = 3; @@ -386,8 +389,14 @@ public class MutilTempalteTabPane extends JComponent { selectedIcon = CLOSE; } if (i == selectedIndex) { + if (template.isSaving()) { + selectedIcon = WHITE_SAVING_CLOSE_ICON; + } startX[i - minPaintIndex] = paintSelectedTab(g2d, icon, templateStartX, name, selectedIcon); } else { + if (template.isSaving()) { + selectedIcon = GREY_SAVING_CLOSE_ICON; + } boolean isLeft = i < selectedIndex; startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, isLeft, mouseOveredIndex, i); } diff --git a/designer-base/src/main/resources/com/fr/design/images/file/grey_saving_close.gif b/designer-base/src/main/resources/com/fr/design/images/file/grey_saving_close.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3c061b0f190ad1bd5199898f5e61fb55e7966e1 GIT binary patch literal 3430 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 literal 0 HcmV?d00001 From 4246d954df4917130607f00d996905b9ec517c8c Mon Sep 17 00:00:00 2001 From: hades Date: Mon, 10 May 2021 09:53:49 +0800 Subject: [PATCH 49/49] =?UTF-8?q?REPORT-51305=20=E6=89=93=E5=BC=80/?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=A8=A1=E6=9D=BF=E6=97=B6=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E6=97=B6=20=E5=8F=B3=E4=BE=A7=E9=9D=A2=E6=9D=BF=E5=8F=AF?= =?UTF-8?q?=E7=94=A8=E9=97=AE=E9=A2=98=20+=20=E7=AC=AC=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E6=89=93=E5=BC=80=E6=97=B6=E5=8A=A0=E8=BD=BD=E5=8A=A8=E7=94=BB?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/mainframe/DesktopCardPane.java | 3 +++ .../src/main/java/com/fr/design/worker/open/OpenWorker.java | 4 +--- .../src/main/java/com/fr/design/worker/save/SaveWorker.java | 1 - 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java index 22a10d3ba0..9558d44d6b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesktopCardPane.java @@ -89,6 +89,7 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener private void checkLoadingPane() { if (layeredPane.getComponent(LOADING_LAYER) != loadingPane) { layeredPane.add(loadingPane, LOADING_LAYER); + component.setVisible(false); } } @@ -108,11 +109,13 @@ public class DesktopCardPane extends BasicPane implements TargetModifiedListener transparentPane.start(); layeredPane.moveToFront(transparentPane); DesignerContext.getDesignerFrame().refreshUIToolBar(); + EastRegionContainerPane.getInstance().updateAllPropertyPane(); } public void hideCover() { transparentPane.stop(); layeredPane.moveToFront(component); + EastRegionContainerPane.getInstance().updateAllPropertyPane(); } protected JTemplate getSelectedJTemplate() { diff --git a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java index f556eb612e..819660a99d 100644 --- a/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/open/OpenWorker.java @@ -6,7 +6,6 @@ import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerFrameFileDealerPane; -import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.JTemplate; import com.fr.design.worker.WorkerManager; import com.fr.exception.DecryptTemplateException; @@ -99,11 +98,10 @@ public class OpenWorker extends SwingWorker { currentTemplate.whenClose(); DesignerContext.getDesignerFrame().addAndActivateJTemplate(book); HistoryTemplateListCache.getInstance().replaceCurrentEditingTemplate(book); - EastRegionContainerPane.getInstance().updateAllPropertyPane(); } else { // 当前tab页是其他模板 for (int i = 0, len = HistoryTemplateListCache.getInstance().getHistoryCount(); i < len; i++) { - JTemplate template = HistoryTemplateListCache.getInstance().get(i); + JTemplate template = HistoryTemplateListCache.getInstance().getTemplate(i); if (ComparatorUtils.equals(template.getEditingFILE(), book.getEditingFILE())) { template.whenClose(); HistoryTemplateListCache.getInstance().getHistoryList().set(i, book); diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java index f6c21f208d..cc60f2dc8e 100644 --- a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java +++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java @@ -68,7 +68,6 @@ public class SaveWorker extends SwingWorker { this.template.setSaving(false); // 恢复界面 if (slowly && ComparatorUtils.equals(this.template.getName(), HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getName())) { - EastRegionContainerPane.getInstance().updateAllPropertyPane(); DesignerContext.getDesignerFrame().refreshUIToolBar(); DesignerContext.getDesignerFrame().getCenterTemplateCardPane().hideCover(); }