From 5d8d998af3079ef02d7e77d22a8d31be716fb912 Mon Sep 17 00:00:00 2001 From: Starryi Date: Fri, 30 Sep 2022 17:43:14 +0800 Subject: [PATCH 01/11] =?UTF-8?q?REPORT-81336=20FR11=E5=86=B3=E7=AD=96?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E6=8A=A5=E8=A1=A8=E5=9D=97-=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E9=80=80=E5=87=BA=EF=BC=8C=E7=BC=96=E8=BE=91=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E4=B8=A2=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【问题原因】 1. 将主题应用到模板上时,需要遍历模板对象查找颜色对象,以更新 其颜色。优化后的更新方案,使用了基于clone的值修改,即利用clone 方法遍历执行特征,在FineColor等类的clone方法内,修改返回值的颜 色值,使得Form.clone可以返回一个应用了主题色的新表单对象。 于是就需要使用新的表单对象更新模板,以及设计器界面。 2. 撤销回退时,因为撤销前后模板的主题可能会发生变化,所以需要应用 新主题到模板。所以撤销回退时,需要调用setTemplateTheme 3. BUG发生的直接原因是当主题应用到模板上时,仅仅更新了target, 没有更新报表块编辑界面内ElementCase对象,导致后续在报表块上的更新 保存在了一个无效的,与Target失去联系的ElementCase上了 4. 还有一个BUG: 报表块的撤销回退,没有更新Target,仅仅更新了 ElementCase,导致后续主题更新以及主题色更新时,新Target基于 旧Target产生,所以新Target中的ElementCase还是旧的ElementCase, 从而报表块内的撤销回退无效. 【改动思路】 1. 当编辑报表块时更新主题,需要更新报表块编辑界面内的ElementCase 2. 报表块撤销回退时,更新Target --- .../java/com/fr/design/mainframe/JForm.java | 63 ++++++++++++------- 1 file changed, 42 insertions(+), 21 deletions(-) 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 a142ee297..e3162e9ef 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 @@ -704,8 +704,8 @@ public class JForm extends JTemplate implements BaseJForm implements BaseJForm implements BaseJForm Date: Sat, 8 Oct 2022 15:55:23 +0800 Subject: [PATCH 02/11] =?UTF-8?q?REPORT-78144=20FVS=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E5=9D=97=E5=AD=97=E5=8F=B7=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fun/DefaultValueAdjustProvider.java | 56 +++++++++++++++++ .../AbstractDefaultValueAdjustProvider.java | 24 +++++++ .../mainframe/AbsoluteMeasureUIMode.java | 37 +++++++++++ .../fr/design/mainframe/DesignerUIMode.java | 17 +++++ .../mainframe/DesignerUIModeConfig.java | 63 +++---------------- .../design/mainframe/SimulateWebUIMode.java | 38 +++++++++++ .../DefaultThemedTemplateCellElementCase.java | 6 ++ .../java/com/fr/design/utils/DesignUtils.java | 18 ++++++ .../com/fr/design/utils/gui/GUICoreUtils.java | 6 ++ .../java/com/fr/design/chart/ChartDialog.java | 6 ++ .../impl/ChartHyperPoplinkPane.java | 7 ++- .../chart/config/DefaultStyleHelper4Van.java | 7 +++ .../design/cell/editor/RichTextToolBar.java | 19 ++++-- 13 files changed, 244 insertions(+), 60 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/fun/DefaultValueAdjustProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/fun/impl/AbstractDefaultValueAdjustProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/AbsoluteMeasureUIMode.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/DesignerUIMode.java create mode 100644 designer-base/src/main/java/com/fr/design/mainframe/SimulateWebUIMode.java diff --git a/designer-base/src/main/java/com/fr/design/fun/DefaultValueAdjustProvider.java b/designer-base/src/main/java/com/fr/design/fun/DefaultValueAdjustProvider.java new file mode 100644 index 000000000..0a9361629 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/DefaultValueAdjustProvider.java @@ -0,0 +1,56 @@ +package com.fr.design.fun; + +import com.fr.base.chart.BaseChartCollection; +import com.fr.chartx.attr.ChartProvider; +import com.fr.general.FRFont; +import com.fr.report.cell.CellElement; +import com.fr.stable.fun.mark.Selectable; + +import java.awt.Font; + +/** + * 主要用于fvs报表块内元素默认值的调整,以达到所见所得效果,后续fvs内置后删除 + */ +public interface DefaultValueAdjustProvider extends Selectable { + String MARK_STRING = "DefaultValueAdjustProvider"; + int CURRENT_LEVEL = 1; + + /** + * 调整单元格对象默认值 + * + * @param cellElement + */ + void adjustCellElement(CellElement cellElement); + + /** + * 调整富文本默认值 + * + * @param fontSize + * @return + */ + int adjustRichTextTransform(int fontSize, double transformedFontSize); + + /** + * 调整ChartCollection + * + * @param chartCollection + */ + void adjustChartCollectionStyle(BaseChartCollection chartCollection); + + /** + * 调整图表 + * + * @param chartProvider + */ + void adjustChart(ChartProvider chartProvider); + + + /** + * 转成当前分辨率下显示的font + * @param font + * @param resolution + * @return + */ + Font transformFontByResolution(FRFont font, int resolution); + +} diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractDefaultValueAdjustProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractDefaultValueAdjustProvider.java new file mode 100644 index 000000000..b2fc58ba8 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractDefaultValueAdjustProvider.java @@ -0,0 +1,24 @@ +package com.fr.design.fun.impl; + + +import com.fr.design.fun.DefaultValueAdjustProvider; +import com.fr.stable.fun.assist.Selector; +import com.fr.stable.fun.impl.AbstractProvider; +import com.fr.stable.fun.mark.API; + +@API(level = DefaultValueAdjustProvider.CURRENT_LEVEL) +public abstract class AbstractDefaultValueAdjustProvider extends AbstractProvider implements DefaultValueAdjustProvider { + + @Override + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + public String mark4Provider() { + return this.getClass().getName(); + } + + public Selector selector() { + return Selector.ALWAYS; + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/AbsoluteMeasureUIMode.java b/designer-base/src/main/java/com/fr/design/mainframe/AbsoluteMeasureUIMode.java new file mode 100644 index 000000000..2085127d7 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/AbsoluteMeasureUIMode.java @@ -0,0 +1,37 @@ +package com.fr.design.mainframe; + +import com.fr.base.AutoChangeLineProvider; +import com.fr.base.DefaultAutoChangeLine; +import com.fr.base.ScreenResolution; +import com.fr.design.fun.ReportLengthUNITProvider; +import com.fr.design.unit.UnitConvertUtil; + +public class AbsoluteMeasureUIMode implements DesignerUIMode { + + private static class AbsoluteMeasureUIModeHolder { + private static final AbsoluteMeasureUIMode absoluteMeasureUIMode = new AbsoluteMeasureUIMode(); + } + + private AbsoluteMeasureUIMode() { + + } + + public static AbsoluteMeasureUIMode getInstance() { + return AbsoluteMeasureUIModeHolder.absoluteMeasureUIMode; + } + + @Override + public ReportLengthUNITProvider parseLengthUNIT(int unitType) { + return UnitConvertUtil.parseLengthUNIT(unitType); + } + + @Override + public AutoChangeLineProvider getAutoChangeLineStrategy() { + return new DefaultAutoChangeLine(); + } + + @Override + public int getScreenResolution() { + return ScreenResolution.getScreenResolution(); + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerUIMode.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerUIMode.java new file mode 100644 index 000000000..801291125 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerUIMode.java @@ -0,0 +1,17 @@ +package com.fr.design.mainframe; + +import com.fr.base.AutoChangeLineProvider;; +import com.fr.design.fun.ReportLengthUNITProvider; + +/** + * 设计器上和展示相关配置 + */ +public interface DesignerUIMode { + + ReportLengthUNITProvider parseLengthUNIT(int unitType); + + AutoChangeLineProvider getAutoChangeLineStrategy(); + + int getScreenResolution(); + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerUIModeConfig.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerUIModeConfig.java index 400f69818..cd99f728a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerUIModeConfig.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerUIModeConfig.java @@ -1,19 +1,14 @@ package com.fr.design.mainframe; import com.fr.base.AutoChangeLineProvider; -import com.fr.base.DefaultAutoChangeLine; -import com.fr.base.ScreenResolution; import com.fr.design.fun.ReportLengthUNITProvider; -import com.fr.design.unit.UnitConvertUtil; -import com.fr.form.fit.NewUIModeAutoChangeLine; import com.fr.general.ComparatorUtils; -import com.fr.stable.Constants; /** * Created by kerry on 2020-06-05 */ public class DesignerUIModeConfig { - private DesignerUIMode mode = DesignerUIMode.ABSOLUTE_MEASURE_UI_MODE; + private DesignerUIMode mode = AbsoluteMeasureUIMode.getInstance(); private static class DesignerUIModeConfigHolder { private static final DesignerUIModeConfig designerUIModeConfig = new DesignerUIModeConfig(); @@ -34,21 +29,25 @@ public class DesignerUIModeConfig { * @return boolean */ public boolean simulateWebUIMode() { - return ComparatorUtils.equals(DesignerUIMode.SIMULATE_WEB_UI_MODE, mode); + return ComparatorUtils.equals(SimulateWebUIMode.getInstance(), mode); } /** * 设置新ui模式 */ public void setSimulateWebUIMode() { - this.mode = DesignerUIMode.SIMULATE_WEB_UI_MODE; + this.mode = SimulateWebUIMode.getInstance(); + } + + public void setDesignerUIMode(DesignerUIMode mode) { + this.mode = mode; } /** * 设置老ui模式 */ public void setAbsoluteMeasureUIMode() { - this.mode = DesignerUIMode.ABSOLUTE_MEASURE_UI_MODE; + this.mode = AbsoluteMeasureUIMode.getInstance(); } /** @@ -78,50 +77,4 @@ public class DesignerUIModeConfig { return mode.getScreenResolution(); } - - private enum DesignerUIMode { - ABSOLUTE_MEASURE_UI_MODE { - @Override - protected ReportLengthUNITProvider parseLengthUNIT(int unitType) { - return UnitConvertUtil.parseLengthUNIT(unitType); - } - - @Override - public AutoChangeLineProvider getAutoChangeLineStrategy() { - return new DefaultAutoChangeLine(); - } - - @Override - protected int getScreenResolution() { - return ScreenResolution.getScreenResolution(); - } - - }, - SIMULATE_WEB_UI_MODE { - @Override - protected ReportLengthUNITProvider parseLengthUNIT(int unitType) { - return new PXReportLengthUNIT(); - } - - @Override - public AutoChangeLineProvider getAutoChangeLineStrategy() { - return new NewUIModeAutoChangeLine(); - } - - @Override - protected int getScreenResolution() { - return Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION; - } - - }; - - protected abstract ReportLengthUNITProvider parseLengthUNIT(int unitType); - - public abstract AutoChangeLineProvider getAutoChangeLineStrategy(); - - - protected abstract int getScreenResolution(); - - } - } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/SimulateWebUIMode.java b/designer-base/src/main/java/com/fr/design/mainframe/SimulateWebUIMode.java new file mode 100644 index 000000000..a13bff759 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/SimulateWebUIMode.java @@ -0,0 +1,38 @@ +package com.fr.design.mainframe; + +import com.fr.base.AutoChangeLineProvider; +import com.fr.design.fun.ReportLengthUNITProvider; +import com.fr.form.fit.NewUIModeAutoChangeLine; +import com.fr.stable.Constants; + +public class SimulateWebUIMode implements DesignerUIMode { + + private static class SimulateWebUIModeHolder { + private static final SimulateWebUIMode simulateWebUIMode = new SimulateWebUIMode(); + } + + private SimulateWebUIMode() { + + } + + public static SimulateWebUIMode getInstance() { + return SimulateWebUIModeHolder.simulateWebUIMode; + } + + + @Override + public ReportLengthUNITProvider parseLengthUNIT(int unitType) { + return new PXReportLengthUNIT(); + } + + @Override + public AutoChangeLineProvider getAutoChangeLineStrategy() { + return new NewUIModeAutoChangeLine(); + } + + @Override + public int getScreenResolution() { + return Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/theme/utils/DefaultThemedTemplateCellElementCase.java b/designer-base/src/main/java/com/fr/design/mainframe/theme/utils/DefaultThemedTemplateCellElementCase.java index 8b1abe71b..0923c7f65 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/theme/utils/DefaultThemedTemplateCellElementCase.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/theme/utils/DefaultThemedTemplateCellElementCase.java @@ -5,7 +5,9 @@ import com.fr.base.theme.TemplateTheme; import com.fr.base.theme.settings.ThemedCellStyle; import com.fr.design.base.mode.DesignModeContext; import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.fun.DefaultValueAdjustProvider; import com.fr.design.mainframe.JTemplate; +import com.fr.design.utils.DesignUtils; import com.fr.report.cell.DefaultTemplateCellElement; /** @@ -41,6 +43,10 @@ public class DefaultThemedTemplateCellElementCase { cellElement.setStyle(DesignModeContext.isDuchampMode() ? nameStyle.getRealStyle() : nameStyle); } } + DefaultValueAdjustProvider adjustProvider = DesignUtils.getValueAdjust(); + if (adjustProvider != null) { + adjustProvider.adjustCellElement(cellElement); + } return cellElement; } } diff --git a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java index 47690bba9..dfeeacc60 100644 --- a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java @@ -7,6 +7,7 @@ import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.deeplink.DeepLinkCore; import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.fun.DefaultValueAdjustProvider; import com.fr.design.fun.DesignerEnvProcessor; import com.fr.design.gui.UILookAndFeel; import com.fr.design.i18n.Toolkit; @@ -18,11 +19,14 @@ import com.fr.general.ComparatorUtils; import com.fr.general.FRFont; import com.fr.general.GeneralContext; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.injectable.PluginModule; import com.fr.stable.ArrayUtils; import com.fr.stable.CommonCodeUtils; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; +import com.fr.stable.bridge.ObjectHolder; import com.fr.stable.os.OperatingSystem; +import com.fr.stable.plugin.ExtraDesignClassManagerProvider; import com.fr.start.ServerStarter; import com.fr.start.common.DesignerStartupContext; import com.fr.start.common.DesignerStartupUtil; @@ -48,6 +52,7 @@ import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.Enumeration; import java.util.Locale; +import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -463,4 +468,17 @@ public class DesignUtils { return xmlDesignerVersion; } + public static DefaultValueAdjustProvider getValueAdjust() { + ExtraDesignClassManager extraDesignClassManager = PluginModule.getAgent(PluginModule.ExtraDesign); + if (extraDesignClassManager != null) { + Set providers = extraDesignClassManager.getArray(DefaultValueAdjustProvider.MARK_STRING); + for (DefaultValueAdjustProvider provider : providers) { + if (provider.selector().accept(new ObjectHolder())) { + return provider; + } + } + } + return null; + } + } diff --git a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java index ac7578631..d90f2af42 100644 --- a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java @@ -17,6 +17,7 @@ import com.fr.design.actions.UpdateAction; import com.fr.design.actions.core.ActionFactory; import com.fr.design.border.UITitledBorder; import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.fun.DefaultValueAdjustProvider; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.icheckbox.UICheckBox; @@ -32,6 +33,7 @@ import com.fr.design.style.color.ColorCell; import com.fr.design.style.color.ColorFactory; import com.fr.design.style.color.ColorSelectBox; import com.fr.design.style.color.ColorSelectable; +import com.fr.design.utils.DesignUtils; import com.fr.general.FRFont; import com.fr.stable.AssistUtils; import com.fr.stable.Constants; @@ -171,6 +173,10 @@ public final class GUICoreUtils { FRFont frFont = style.getFRFont(); textField.setFont(new Font(frFont.getFontName(), frFont.getStyle(), frFont.getShowSize(resolution))); + DefaultValueAdjustProvider valueAdjust = DesignUtils.getValueAdjust(); + if (valueAdjust != null) { + textField.setFont(valueAdjust.transformFontByResolution(frFont, resolution)); + } textField.setForeground(style.getFRFont().getForeground()); if (style.getBackground() instanceof ColorBackground) { diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java index bce90aaae..183f14b76 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java @@ -4,9 +4,11 @@ import com.fr.base.chart.BaseChartCollection; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.dialog.BasicDialog; import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.fun.DefaultValueAdjustProvider; import com.fr.design.gui.chart.MiddleChartDialog; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.i18n.Toolkit; +import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.third.joda.time.DateTime; @@ -87,6 +89,10 @@ public class ChartDialog extends MiddleChartDialog { return new ActionListener() { public void actionPerformed(ActionEvent e) { chartTypePane.update((ChartCollection) cc, createTime); + DefaultValueAdjustProvider adjustProvider = DesignUtils.getValueAdjust(); + if (adjustProvider != null) { + adjustProvider.adjustChartCollectionStyle(cc); + } doOK(); } }; 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 11d2e32e4..35b0c0d5b 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 @@ -8,10 +8,12 @@ import com.fr.chart.web.ChartHyperPoplink; import com.fr.chartx.attr.ChartProvider; import com.fr.design.chart.gui.ChartComponent; import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.fun.DefaultValueAdjustProvider; 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.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.log.FineLoggerFactory; import com.fr.van.chart.config.DefaultStyleHelper4Van; @@ -67,7 +69,10 @@ public class ChartHyperPoplinkPane extends AbstractHyperLinkPane Date: Sun, 9 Oct 2022 11:21:36 +0800 Subject: [PATCH 03/11] =?UTF-8?q?REPORT-81307=20A=E5=88=97=E5=88=97?= =?UTF-8?q?=E5=AE=BD=E6=A6=82=E7=8E=87=E6=98=BE=E7=A4=BA=E4=B8=BAB?= =?UTF-8?q?=E5=88=97=E5=88=97=E5=AE=BD=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../grid/AbstractGridHeaderMouseHandler.java | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java b/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java index 97e95a34f..193d056f0 100644 --- a/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java +++ b/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java @@ -38,6 +38,8 @@ import java.lang.reflect.Method; public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { protected static final int FUZZY_EDGE = 10; protected static final int SEPARATOR_GAP = 5; + //只选中一个 + private static final int ONLY_SELECT_ONE = 1; protected GridHeader gHeader; private int dragType = GridUtils.DRAG_NONE; @@ -109,7 +111,7 @@ public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { if (between(evt, tmpSize1, tmpSize2)) { if (index >= dragIndex) { try { - if(method != null) { + if (method != null) { method.invoke(report, dragIndex, FU.valueOfPix(evtOffset(evt, oldEndValueSize), resolution)); } } catch (Exception e) { @@ -118,7 +120,7 @@ public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { //sizeList.set(dragIndex, FU.valueOfPix(evtOffset(evt, oldEndValueSize), resolution)); } else { try { - if(method != null) { + if (method != null) { method.invoke(report, index, FU.valueOfPix(evtOffset(evt, (int) tmpSize1), resolution)); } } catch (Exception e) { @@ -128,7 +130,7 @@ public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { // from all to do. for (int h = (dragIndex - 1); h > index; h--) { try { - if(method != null) { + if (method != null) { method.invoke(report, h, UNIT.ZERO); } } catch (Exception e) { @@ -219,7 +221,7 @@ public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { ePane.getGrid().stopEditing();// james 停止当前的所有编辑 // peter:选中格子位置. - ColumnRow selectedCellPoint = GridUtils.getAdjustEventColumnRow_withresolution(ePane, evt.getX(), evt.getY(),resolution); + ColumnRow selectedCellPoint = GridUtils.getAdjustEventColumnRow_withresolution(ePane, evt.getX(), evt.getY(), resolution); iterateScrollBar(ePane, evt, PRESS_ACTION); @@ -227,7 +229,7 @@ public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { if (SwingUtilities.isRightMouseButton(evt)) { Selection cs = ePane.getSelection(); resetSelectionByRightButton(selectedCellPoint, cs, ePane); - + checkEndMultiSelectIndex(cs); UIPopupMenu popupMenu = createPopupMenu(ePane, evt, Math.max(dragIndex, Math.max(this.startMultiSelectIndex, this.endMultiSelectIndex))); if (popupMenu != null) { GUICoreUtils.showPopupMenu(popupMenu, gHeader, evt.getX() + 1, evt.getY() + 1); @@ -246,6 +248,16 @@ public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { ePane.repaint(); } + /** + * 如果行列中有只选中一个的情况,更新下endIndex,防止列宽或行宽不匹配 + * @param selection + */ + private void checkEndMultiSelectIndex(Selection selection) { + if (selection.getSelectedColumns().length == ONLY_SELECT_ONE || selection.getSelectedRows().length == ONLY_SELECT_ONE) { + this.endMultiSelectIndex = this.startMultiSelectIndex; + } + } + protected abstract void resetSelectionByRightButton(ColumnRow mouseSelectedColumnRow, Selection cs, ElementCasePane ePane); @@ -305,14 +317,11 @@ public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { StringBuilder sb = new StringBuilder(); sb.append(String.format("%.2f", new Double(len))) .append('/').append(String.format("%.2f", new Double(tlen))) - .append(unit); - if(!DesignerUIModeConfig.getInstance().simulateWebUIMode()){ - sb.append('(') - .append((int)(unitValue.toPixD(resolution))).append('/') - .append((int)(totalUnitValue.toPixD(resolution))) - .append(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Px")) - .append(')'); - } + .append(unit).append('(') + .append((int) (unitValue.toPixD(resolution))).append('/') + .append((int) (totalUnitValue.toPixD(resolution))) + .append(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Px")) + .append(')'); return sb.toString(); } From f9d77fac63cfc1403d34b29330487249f5742901 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Sun, 9 Oct 2022 11:26:31 +0800 Subject: [PATCH 04/11] =?UTF-8?q?REPORT-81307=20A=E5=88=97=E5=88=97?= =?UTF-8?q?=E5=AE=BD=E6=A6=82=E7=8E=87=E6=98=BE=E7=A4=BA=E4=B8=BAB?= =?UTF-8?q?=E5=88=97=E5=88=97=E5=AE=BD=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/grid/AbstractGridHeaderMouseHandler.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java b/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java index 193d056f0..760c1f04a 100644 --- a/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java +++ b/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java @@ -317,11 +317,14 @@ public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { StringBuilder sb = new StringBuilder(); sb.append(String.format("%.2f", new Double(len))) .append('/').append(String.format("%.2f", new Double(tlen))) - .append(unit).append('(') - .append((int) (unitValue.toPixD(resolution))).append('/') - .append((int) (totalUnitValue.toPixD(resolution))) - .append(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Px")) - .append(')'); + .append(unit); + if(!DesignerUIModeConfig.getInstance().simulateWebUIMode()){ + sb.append('(') + .append((int)(unitValue.toPixD(resolution))).append('/') + .append((int)(totalUnitValue.toPixD(resolution))) + .append(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Px")) + .append(')'); + } return sb.toString(); } From 7cca9c2f571cd69bfd16910f14cd150a54041cbd Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Sun, 9 Oct 2022 11:50:51 +0800 Subject: [PATCH 05/11] =?UTF-8?q?REPORT-81307=20=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java b/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java index 760c1f04a..2927f74d6 100644 --- a/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java +++ b/designer-realize/src/main/java/com/fr/grid/AbstractGridHeaderMouseHandler.java @@ -250,7 +250,7 @@ public abstract class AbstractGridHeaderMouseHandler extends MouseInputAdapter { /** * 如果行列中有只选中一个的情况,更新下endIndex,防止列宽或行宽不匹配 - * @param selection + * @param selection 与ElementCasePane绑定的选择对象 */ private void checkEndMultiSelectIndex(Selection selection) { if (selection.getSelectedColumns().length == ONLY_SELECT_ONE || selection.getSelectedRows().length == ONLY_SELECT_ONE) { From 97490a81162ed5bc1859032c5f238c578fdf3eae Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 10 Oct 2022 15:22:07 +0800 Subject: [PATCH 06/11] =?UTF-8?q?REPORT-75998=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=B8=AE=E5=8A=A9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../replace/ui/ITReplaceMainDialog.java | 3 +- .../replace/ui/ITReplaceWestPanel.java | 55 +++++++++++++++---- .../actions/replace/ui/ITTableEditor.java | 2 +- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java index 54e6a3bff..9a2f5c8de 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java @@ -23,7 +23,6 @@ import com.fr.stable.StringUtils; import javax.swing.JOptionPane; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Color; import java.awt.Dimension; import java.awt.Point; import java.awt.event.ActionEvent; @@ -153,7 +152,7 @@ public class ITReplaceMainDialog extends UIDialog { }); center.add(northPane.getScrollPane(), BorderLayout.NORTH); center.add(southPanel.getTableEditorPane(), BorderLayout.CENTER); - add(westPanel.getLeftJpanel(), BorderLayout.WEST); + add(westPanel.getLeftPanel(), BorderLayout.WEST); //主体部分 add(center, BorderLayout.CENTER); center.setVisible(true); diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java index 9295baf65..c88e3a19d 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java @@ -1,14 +1,22 @@ package com.fr.design.actions.replace.ui; +import com.fr.base.svg.IconUtils; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.share.ui.base.MouseClickListener; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; +import javax.swing.Icon; import javax.swing.JPanel; import java.awt.Color; +import java.awt.Cursor; +import java.awt.Desktop; +import java.awt.Font; import java.awt.GridLayout; +import java.awt.event.MouseEvent; +import java.net.URI; /** * 左侧面板 @@ -18,28 +26,53 @@ import java.awt.GridLayout; * created by Destiny.Lin on 2022-09-05 */ public class ITReplaceWestPanel { - JPanel leftJpanel; + private JPanel leftPanel; + private UILabel iconLabel; + private static final Icon HELP_ICON = IconUtils.readIcon("com/fr/design/images/buttonicon/replace_help.svg"); + private static final int FILL_COUNT = 13; public ITReplaceWestPanel() { - leftJpanel = new JPanel(new GridLayout(15, 1, 0, 0)); + leftPanel = new JPanel(new GridLayout(15, 1, 0, 0)); + iconLabel = new UILabel("" + Toolkit.i18nText("Fine-Design_Report_Community_Help") + ""); + UIToggleButton contentButton = new UIToggleButton(Toolkit.i18nText("Fine-Design_Basic_Templates_Content")); contentButton.setSelected(true); contentButton.setBorderPainted(false); - leftJpanel.add(contentButton); - leftJpanel.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, new Color(218, 218, 221))); + leftPanel.add(contentButton); + leftPanel.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, new Color(218, 218, 221))); //填充一下面板 - int labelNum = 14; - for (int i = 0; i < labelNum; i++) { - leftJpanel.add(new UILabel(StringUtils.EMPTY)); + for (int i = 0; i < FILL_COUNT; i++) { + leftPanel.add(new UILabel(StringUtils.EMPTY)); } + + //添加帮助文档按钮及超链 + iconLabel.setIcon(HELP_ICON); + iconLabel.setToolTipText(Toolkit.i18nText("Fine-Design_Replace_Tooltip")); + //设置游标 + iconLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); + iconLabel.setFont(new Font("Dialog", Font.BOLD, 12)); + iconLabel.addMouseListener(new MouseClickListener() { + @Override + public void mouseClicked(MouseEvent e) { + Desktop desktop = Desktop.getDesktop(); + try { + //创建URI统一资源标识符 + URI uri = new URI("https://help.fanruan.com/finereport/doc-view-4954.html"); + desktop.browse(uri); + } catch (Exception exception) { + exception.printStackTrace(); + } + } + }); + leftPanel.add(iconLabel); } - public JPanel getLeftJpanel() { - return leftJpanel; + public JPanel getLeftPanel() { + return leftPanel; } - public void setLeftJpanel(JPanel leftJpanel) { - this.leftJpanel = leftJpanel; + public void setLeftPanel(JPanel leftPanel) { + this.leftPanel = leftPanel; } } diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITTableEditor.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITTableEditor.java index 5c57e6d6a..0c8819abf 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITTableEditor.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITTableEditor.java @@ -102,8 +102,8 @@ public class ITTableEditor extends UITableModelAdapter { public void add(List list) { for (Info info : list) { addRow(info.getContent()); - fireTableDataChanged(); } + fireTableDataChanged(); } public enum ChooseIndex { From 8ee083f996c29c2c40947a765f4d0e2d3a3770d6 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 10 Oct 2022 15:26:42 +0800 Subject: [PATCH 07/11] =?UTF-8?q?REPORT-75998=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=B8=AE=E5=8A=A9=E6=96=87=E6=A1=A3Icon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/com/fr/design/images/buttonicon/replace_help.svg | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 designer-base/src/main/resources/com/fr/design/images/buttonicon/replace_help.svg diff --git a/designer-base/src/main/resources/com/fr/design/images/buttonicon/replace_help.svg b/designer-base/src/main/resources/com/fr/design/images/buttonicon/replace_help.svg new file mode 100644 index 000000000..cfc3370a6 --- /dev/null +++ b/designer-base/src/main/resources/com/fr/design/images/buttonicon/replace_help.svg @@ -0,0 +1,3 @@ + + + From c218e9c130be7a8e682ab915d46635a3aca5239b Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 10 Oct 2022 15:31:13 +0800 Subject: [PATCH 08/11] =?UTF-8?q?REPORT-75998=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/actions/replace/ui/ITReplaceWestPanel.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java index c88e3a19d..5b4882751 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java @@ -5,6 +5,7 @@ import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.share.ui.base.MouseClickListener; +import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; @@ -61,7 +62,7 @@ public class ITReplaceWestPanel { URI uri = new URI("https://help.fanruan.com/finereport/doc-view-4954.html"); desktop.browse(uri); } catch (Exception exception) { - exception.printStackTrace(); + FineLoggerFactory.getLogger().error(exception.getMessage(), exception); } } }); From 1fdd0cac880d7c7b73831fd46660c5f7cc1c1769 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 10 Oct 2022 16:09:38 +0800 Subject: [PATCH 09/11] =?UTF-8?q?REPORT-75998=20=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E9=80=BB=E8=BE=91,=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=E5=B8=AE=E5=8A=A9=E6=96=87=E6=A1=A3Icon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/images/buttonicon/replace_help.svg | 2 +- .../actions/replace/ui/ITReplaceWestPanel.java | 17 ++++------------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/designer-base/src/main/resources/com/fr/design/images/buttonicon/replace_help.svg b/designer-base/src/main/resources/com/fr/design/images/buttonicon/replace_help.svg index cfc3370a6..fdbd5eca5 100644 --- a/designer-base/src/main/resources/com/fr/design/images/buttonicon/replace_help.svg +++ b/designer-base/src/main/resources/com/fr/design/images/buttonicon/replace_help.svg @@ -1,3 +1,3 @@ - + diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java index 5b4882751..3363b7db7 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java @@ -5,7 +5,8 @@ import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.share.ui.base.MouseClickListener; -import com.fr.log.FineLoggerFactory; +import com.fr.design.utils.BrowseUtils; +import com.fr.general.CloudCenter; import com.fr.stable.StringUtils; import javax.swing.BorderFactory; @@ -13,11 +14,8 @@ import javax.swing.Icon; import javax.swing.JPanel; import java.awt.Color; import java.awt.Cursor; -import java.awt.Desktop; -import java.awt.Font; import java.awt.GridLayout; import java.awt.event.MouseEvent; -import java.net.URI; /** * 左侧面板 @@ -30,6 +28,7 @@ public class ITReplaceWestPanel { private JPanel leftPanel; private UILabel iconLabel; private static final Icon HELP_ICON = IconUtils.readIcon("com/fr/design/images/buttonicon/replace_help.svg"); + private static final String HELP_URL = CloudCenter.getInstance().acquireUrlByKind("design.replace.help", "https://help.fanruan.com/finereport/doc-view-4954.html"); private static final int FILL_COUNT = 13; public ITReplaceWestPanel() { @@ -52,18 +51,10 @@ public class ITReplaceWestPanel { iconLabel.setToolTipText(Toolkit.i18nText("Fine-Design_Replace_Tooltip")); //设置游标 iconLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); - iconLabel.setFont(new Font("Dialog", Font.BOLD, 12)); iconLabel.addMouseListener(new MouseClickListener() { @Override public void mouseClicked(MouseEvent e) { - Desktop desktop = Desktop.getDesktop(); - try { - //创建URI统一资源标识符 - URI uri = new URI("https://help.fanruan.com/finereport/doc-view-4954.html"); - desktop.browse(uri); - } catch (Exception exception) { - FineLoggerFactory.getLogger().error(exception.getMessage(), exception); - } + BrowseUtils.browser(HELP_URL); } }); leftPanel.add(iconLabel); From 2973891f7b0ca8a53454ca73e8425727070ab90d Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 11 Oct 2022 11:14:02 +0800 Subject: [PATCH 10/11] =?UTF-8?q?REPORT-75998=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=B8=AE=E5=8A=A9=E6=96=87=E6=A1=A3=E7=BD=91=E5=9D=80=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/actions/replace/ui/ITReplaceWestPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java index 3363b7db7..a58091a06 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceWestPanel.java @@ -28,7 +28,7 @@ public class ITReplaceWestPanel { private JPanel leftPanel; private UILabel iconLabel; private static final Icon HELP_ICON = IconUtils.readIcon("com/fr/design/images/buttonicon/replace_help.svg"); - private static final String HELP_URL = CloudCenter.getInstance().acquireUrlByKind("design.replace.help", "https://help.fanruan.com/finereport/doc-view-4954.html"); + private static final String HELP_URL = CloudCenter.getInstance().acquireUrlByKind("design.replace.help", "https://help.fanruan.com/finereport/doc-view-4954.html?source=3"); private static final int FILL_COUNT = 13; public ITReplaceWestPanel() { From 7f3dd21e666a69642e4a2fb844320a4e52c4555b Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 11 Oct 2022 11:36:25 +0800 Subject: [PATCH 11/11] =?UTF-8?q?REPORT-81416=20=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E7=9A=84=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/carton/EventDispatchThreadHangMonitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/carton/EventDispatchThreadHangMonitor.java b/designer-base/src/main/java/com/fr/design/carton/EventDispatchThreadHangMonitor.java index f472d901a..56ccaa2c4 100644 --- a/designer-base/src/main/java/com/fr/design/carton/EventDispatchThreadHangMonitor.java +++ b/designer-base/src/main/java/com/fr/design/carton/EventDispatchThreadHangMonitor.java @@ -7,7 +7,6 @@ import com.fr.stable.ArrayUtils; import com.fr.stable.ProductConstantsBase; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; -import com.fr.third.ibm.icu.text.SimpleDateFormat; import org.jetbrains.annotations.NotNull; import javax.swing.SwingUtilities; @@ -22,6 +21,7 @@ import java.io.IOException; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; +import java.text.SimpleDateFormat; import java.util.LinkedList; import java.util.Timer; import java.util.TimerTask;