From c50b9a067bcd7eaf5cf0ae65647f89b1d2f292fd Mon Sep 17 00:00:00 2001 From: hades Date: Sat, 8 May 2021 14:31:54 +0800 Subject: [PATCH 1/4] =?UTF-8?q?REPORT-51409=20=E6=89=93=E5=BC=80=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E5=8A=A0=E8=BD=BD=E5=A4=B1=E8=B4=A5=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E9=87=8D=E8=AF=95=EF=BC=8C=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E4=B8=8A=E6=96=B9=E7=9A=84=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E6=A0=8F=E9=83=BD=E5=8F=98=E5=BE=97=E5=8F=AF=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=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 2/4] =?UTF-8?q?REPORT-51401=20=E6=89=93=E5=BC=80=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8=E4=B8=8A=E6=97=A5?= =?UTF-8?q?=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 3/4] =?UTF-8?q?REPORT-51304=20=E4=BF=9D=E5=AD=98=E6=97=B6g?= =?UTF-8?q?if=E8=83=8C=E6=99=AF=E4=B8=BA=E9=80=8F=E6=98=8E=E6=97=B6=20?= =?UTF-8?q?=E9=94=AF=E9=BD=BF=E5=A4=AA=E4=B8=A5=E9=87=8D=20=E9=80=9A?= =?UTF-8?q?=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 4/4] =?UTF-8?q?REPORT-51315=20=E4=BF=9D=E5=AD=98=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=EF=BC=8C=E6=A0=87=E7=AD=BE=E7=9A=84?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E9=81=97=E6=BC=8F=E5=8A=A0=E8=BD=BD=E5=8A=A8?= =?UTF-8?q?=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