Browse Source

Merge branch 'release/10.0' of https://code.fineres.com/scm/~qinghui.liu/design into release/10.0

feature/big-screen
Qinghui.Liu 4 years ago
parent
commit
b3abb1c424
  1. 3
      build.gradle
  2. 30
      designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
  3. 2
      designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java
  4. 2
      designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java
  5. 38
      designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java
  6. 2
      designer-base/src/main/java/com/fr/design/extra/LoginDialog.java
  7. 2
      designer-base/src/main/java/com/fr/design/extra/ShopDialog.java
  8. 4
      designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java
  9. 8
      designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java
  10. 4
      designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java
  11. 10
      designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java
  12. 30
      designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java
  13. 2
      designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java
  14. 24
      designer-base/src/main/java/com/fr/env/EnvListPane.java
  15. 18
      designer-base/src/main/java/com/fr/start/BaseDesigner.java
  16. 4
      designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java
  17. 21
      designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java
  18. 6
      designer-base/src/main/java/com/fr/start/server/ServerTray.java
  19. 8
      designer-base/src/test/java/com/fr/design/DesignerEnvManagerTest.java
  20. 67
      designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java
  21. 7
      designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java
  22. 5
      designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/ReportDataPane.java
  23. 4
      designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java
  24. 4
      designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java
  25. 4
      designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java
  26. 4
      designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java
  27. 35
      designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java
  28. 4
      designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java
  29. 10
      designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java
  30. 90
      designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractRectanglePlotPane.java
  31. 61
      designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java
  32. 16
      designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/MapDataTree.java
  33. 4
      designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java
  34. 85
      designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java
  35. 3
      designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java
  36. 4
      designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java
  37. 23
      designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java
  38. 4
      designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java
  39. 41
      designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java
  40. 2
      designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarConditionPane.java
  41. 4
      designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java
  42. 24
      designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java
  43. 5
      designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java
  44. 7
      designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java
  45. 1
      designer-form/src/main/java/com/fr/design/designer/creator/XButton.java
  46. 5
      designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java
  47. 10
      designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java
  48. 22
      designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java
  49. 2
      designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java
  50. 3
      designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java
  51. 5
      designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java
  52. 2
      designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java
  53. 5
      designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java
  54. 4
      designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java
  55. 1
      designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java
  56. 5
      designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java
  57. 1
      designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java
  58. 1
      designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java
  59. 4
      designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java
  60. 8
      designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java
  61. 3
      designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java
  62. 56
      designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java
  63. 4
      designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java
  64. 50
      designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java
  65. 66
      designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java
  66. 5
      designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java
  67. 7
      designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java
  68. 68
      designer-form/src/main/java/com/fr/design/mainframe/TopXCreator.java
  69. 82
      designer-form/src/main/java/com/fr/design/mainframe/TopXCreators.java
  70. 48
      designer-form/src/main/java/com/fr/design/mainframe/widget/UITreeComboBox.java
  71. 9
      designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java
  72. 4
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java
  73. 24
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java
  74. 168
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java
  75. 2
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/PluginPreviewPane.java
  76. 4
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java
  77. 12
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java
  78. 5
      designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java
  79. 2
      designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java
  80. 5
      designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java
  81. 28
      designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java
  82. 208
      designer-realize/src/main/java/com/fr/start/fx/FastGifImage.java
  83. 208
      designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java
  84. 59
      designer-realize/src/main/java/com/fr/start/fx/SplashFx.java
  85. 194
      designer-realize/src/main/java/com/fr/start/fx/SplashFxWindow.java
  86. 69
      designer-realize/src/main/java/com/fr/start/jni/SplashJNI.java
  87. 100
      designer-realize/src/main/java/com/fr/start/jni/SplashMac.java
  88. BIN
      designer-realize/src/main/resources/com/fr/start/jni/splash.dylib
  89. 79
      designer-realize/src/test/java/com.fr/design/mainframe/alphafine/search/manager/impl/FileSearchManagerTest.java
  90. 23
      designer-realize/src/test/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRenderTest.java

3
build.gradle

@ -64,7 +64,7 @@ allprojects {
implementation 'org.swingexplorer:swexpl:2.0.1'
implementation 'org.swingexplorer:swag:1.0'
implementation 'net.java.dev.jna:jna:5.4.0'
implementation 'org.apache.tomcat:tomcat-catalina:8.5.32'
implementation 'org.apache.tomcat:tomcat-catalina:8.5.57'
implementation 'io.socket:socket.io-client:0.7.0'
implementation 'com.fr.third:fine-third:' + frVersion
implementation 'com.fr.core:fine-core:' + frDevVersion
@ -73,6 +73,7 @@ allprojects {
implementation 'com.fr.decision:fine-decision:' + frVersion
implementation 'com.fr.schedule:fine-schedule:' + frVersion
implementation 'com.fr.report:fine-report-engine:' + frDevVersion
implementation 'com.fr.design:design-i18n:' + frDevVersion
testImplementation 'org.easymock:easymock:3.5.1'
testImplementation 'org.powermock:powermock-module-junit4:1.7.1'
testImplementation 'org.powermock:powermock-api-easymock:1.7.1'

30
designer-base/src/main/java/com/fr/design/DesignerEnvManager.java

@ -163,7 +163,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
* alphafine
*/
private AlphaFineConfigManager alphaFineConfigManager = AlphaFineConfigManager.getInstance();
/**
* 阅后即焚的配置项
*/
@ -218,14 +218,9 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
if (needCheckEnv) {
checkNameEnvMap();
}
GeneralContext.addEnvChangedListener(new EnvChangedListener() {
@Override
public void envChanged() {
designerEnvManager.setCurrentDirectoryPrefix(FILEFactory.ENV_PREFIX);
designerEnvManager.setDialogCurrentDirectory(ProjectConstants.REPORTLETS_NAME);
}
GeneralContext.addEnvChangedListener(() -> {
designerEnvManager.setCurrentDirectoryPrefix(FILEFactory.ENV_PREFIX);
designerEnvManager.setDialogCurrentDirectory(ProjectConstants.REPORTLETS_NAME);
});
}
@ -1424,7 +1419,9 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
* @return
*/
private Locale checkLocale(Locale locale) {
return SupportLocale.getInstance().isSupport(locale) ? locale : Locale.US;
// Yvan: REPORT-39341,有一些情况下,获取到的是zh-Hans-CN这种,需要找到项目中最匹配的Locale
return SupportLocale.getInstance().isSupport(locale) ?
locale : SupportLocale.getInstance().getSuitableLocale(locale);
}
private void readReportLengthUnit(XMLableReader reader) {
@ -1475,7 +1472,10 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
}
public String getUUID() {
return StringUtils.isEmpty(uuid) ? UUID.randomUUID().toString() : uuid;
if (StringUtils.isEmpty(uuid)) {
uuid = UUID.randomUUID().toString();
}
return uuid;
}
public int getActiveKeyStatus() {
@ -1578,7 +1578,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
}
}
}
private void readSnapChatConfig(XMLableReader reader) {
reader.readXMLObject(this.snapChatConfig = SnapChatConfig.getInstance());
}
@ -1801,14 +1801,14 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
writeSnapChatConfig(writer);
writer.end();
}
private void writeSnapChatConfig(XMLPrintWriter writer) {
if (this.snapChatConfig != null) {
this.snapChatConfig.writeXML(writer);
}
}
private void writeAlphaFineAttr(XMLPrintWriter writer) {
if (this.alphaFineConfigManager != null) {
this.alphaFineConfigManager.writeXML(writer);

2
designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java

@ -218,7 +218,7 @@ public class DBTableDataPane extends AbstractTableDataPane<DBTableData> {
paramTexts[0] = SqlUtils.tryPureSqlText(sqlTextPane.getText());
paramTexts[1] = SqlUtils.tryPureSqlText(pageQuery);
List<ParameterProvider> existParameterList = editorPane.update();
Parameter[] ps = existParameterList == null ? new Parameter[0] : existParameterList.toArray(new Parameter[existParameterList.size()]);
Parameter[] ps = existParameterList == null ? new Parameter[0] : existParameterList.toArray(new Parameter[0]);
editorPane.populate(ParameterUtils.analyzeAndUnionParameters(paramTexts, ps));
}

2
designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java

@ -35,7 +35,7 @@ public abstract class ErrorDialog extends JDialog implements ActionListener {
JPanel messagePane = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true);
UILabel boldFontLabel = new UILabel(message);
UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Send_Report_To_Us"));
Font font = FRFont.getInstance("Dialog", Font.BOLD, 20);
Font font = FRFont.getInstance(label.getFont().getFontName(), Font.BOLD, 20);
boldFontLabel.setFont(font);
messagePane.add(boldFontLabel);
messagePane.add(label);

38
designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java vendored

@ -40,6 +40,12 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
private WorkspaceConnectionInfo connection;
/**
* 标记下新创建的远程工作目录 兼容存留的远程目录客户升级后再回退 读取为密文
* 仅保证当前新增是加密的
*/
private boolean newCreated;
public static RemoteDesignerWorkspaceInfo create(WorkspaceConnectionInfo connection) {
RemoteDesignerWorkspaceInfo info = new RemoteDesignerWorkspaceInfo();
info.connection = connection;
@ -79,12 +85,21 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
return remindTime;
}
public boolean isNewCreated() {
return newCreated;
}
public void setNewCreated(boolean newCreated) {
this.newCreated = newCreated;
}
@Override
public void readXML(XMLableReader reader) {
if (reader.isAttr()) {
this.name = reader.getAttrAsString("name", StringUtils.EMPTY);
this.remindTime = reader.getAttrAsString("remindTime", StringUtils.EMPTY);
this.newCreated = reader.getAttrAsBoolean("newCreated", false);
}
if (reader.isChildNode()) {
String tagName = reader.getTagName();
@ -92,32 +107,49 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
String url = reader.getAttrAsString("url", StringUtils.EMPTY);
String username = reader.getAttrAsString("username", StringUtils.EMPTY);
//密码解密
String password = SecurityToolbox.defaultDecrypt(reader.getAttrAsString("password", StringUtils.EMPTY).replaceAll(" ", "\r\n"));
String password = SecurityToolbox.defaultDecrypt(reader.getAttrAsString("password", StringUtils.EMPTY).replaceAll(StringUtils.BLANK, "\r\n"));
String certPath = reader.getAttrAsString("certPath", StringUtils.EMPTY);
String certSecretKey = reader.getAttrAsString("certSecretKey", StringUtils.EMPTY);
String certSecretKey = readCertSecretKey(reader);
boolean rememberPwd = reader.getAttrAsBoolean("rememberPwd", true);
this.connection = new WorkspaceConnectionInfo(url, username, password, certPath, certSecretKey, rememberPwd);
}
}
}
private String readCertSecretKey(XMLableReader reader) {
if (isNewCreated()) {
return SecurityToolbox.defaultDecrypt(reader.getAttrAsString("certSecretKey", StringUtils.EMPTY).replaceAll(StringUtils.BLANK, "\r\n"));
} else {
return reader.getAttrAsString("certSecretKey", StringUtils.EMPTY);
}
}
@Override
public void writeXML(XMLPrintWriter writer) {
writer.attr("name", name);
writer.attr("remindTime", remindTime);
writer.attr("newCreated", isNewCreated());
if (this.connection != null) {
writer.startTAG("Connection");
writer.attr("url", connection.getUrl());
writer.attr("username", connection.getUserName());
writer.attr("password", SecurityToolbox.defaultEncrypt(connection.getPassword()));
writer.attr("certPath", connection.getCertPath());
writer.attr("certSecretKey", connection.getCertSecretKey());
writeCertSecretKey(writer);
writer.attr("rememberPwd", connection.isRememberPwd());
writer.end();
}
}
private void writeCertSecretKey(XMLPrintWriter writer) {
if (isNewCreated()) {
writer.attr("certSecretKey", SecurityToolbox.defaultEncrypt(connection.getCertSecretKey()));
} else {
writer.attr("certSecretKey", connection.getCertSecretKey());
}
}
@Override
@SuppressWarnings("squid:S2975")
public Object clone() throws CloneNotSupportedException {

2
designer-base/src/main/java/com/fr/design/extra/LoginDialog.java

@ -24,7 +24,7 @@ public class LoginDialog extends UIDialog {
}
private void init(Component pane) {
if (StableUtils.getMajorJavaVersion() == 8) {
if (StableUtils.getMajorJavaVersion() >= 8) {
setUndecorated(true);
}
JPanel panel = (JPanel) getContentPane();

2
designer-base/src/main/java/com/fr/design/extra/ShopDialog.java

@ -16,7 +16,7 @@ public class ShopDialog extends UIDialog {
public ShopDialog(Frame frame, BasicPane pane) {
super(frame);
if (StableUtils.getMajorJavaVersion() == 8) {
if (StableUtils.getMajorJavaVersion() >= 8) {
setUndecorated(true);
}
JPanel panel = (JPanel) getContentPane();

4
designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java

@ -159,7 +159,7 @@ public class WebViewDlgHelper {
}
public static void createLoginDialog() {
if (StableUtils.getMajorJavaVersion() == VERSION_8) {
if (StableUtils.getMajorJavaVersion() >= VERSION_8) {
File file = new File(StableUtils.pathJoin(installHome, "scripts"));
if (!file.exists()) {
confirmDownLoadShopJS();
@ -172,7 +172,7 @@ public class WebViewDlgHelper {
public static void createLoginDialog(Window parent) {
if (StableUtils.getMajorJavaVersion() == VERSION_8) {
if (StableUtils.getMajorJavaVersion() >= VERSION_8) {
File file = new File(StableUtils.pathJoin(installHome, "scripts"));
if (!file.exists()) {
confirmDownLoadShopJS();

8
designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java

@ -200,13 +200,17 @@ public class ColumnRowPane extends JPanel implements UIObserver {
column = 0;
}
removeDocumentListener(d);
columnSpinner.setValue(StableUtils.convertIntToABC(column + 1));
String colValue = StableUtils.convertIntToABC(column + 1);
columnSpinner.setValue(colValue);
((DefaultEditor) columnSpinner.getEditor()).getTextField().setText(colValue);
int row = columnRow.getRow();
// shoc 小于0就蹦了
if (row < 0) {
row = 0;
}
rowSpinner.setValue("" + (row + 1));
String rowValue = Integer.toString(row + 1);
rowSpinner.setValue(rowValue);
((DefaultEditor) rowSpinner.getEditor()).getTextField().setText(rowValue);
addDocumentListener(d);
fireChanged();
}

4
designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java

@ -3,10 +3,10 @@
*/
package com.fr.design.gui.icombobox;
import com.fr.design.gui.UILookAndFeel;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.log.FineLoggerFactory;
import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
import javax.swing.JFrame;
import javax.swing.JPanel;
@ -23,7 +23,7 @@ import java.awt.event.ItemListener;
public class LazyComboBoxTest {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(new WindowsLookAndFeel());
UIManager.setLookAndFeel(new UILookAndFeel());
} catch (UnsupportedLookAndFeelException e1) {
FineLoggerFactory.getLogger().error(e1.getMessage(), e1);
}

10
designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java

@ -19,7 +19,7 @@ import java.awt.event.MouseMotionListener;
public class UIEastResizableContainer extends JPanel {
private static final long serialVersionUID = 1854340560790476907L;
public static final int MAX_CONTAINER_WIDTH = 500;
public static final int MAX_CONTAINER_WIDTH = 340;
public static final int MIN_CONTAINER_WIDTH = 286;
private int containerWidth = 240;
@ -266,13 +266,7 @@ public class UIEastResizableContainer extends JPanel {
@Override
public void mouseDragged(MouseEvent e) {
containerWidth = UIEastResizableContainer.this.getWidth() + (UIEastResizableContainer.this.getLocationOnScreen().x - e.getXOnScreen());
containerWidth = Math.min(containerWidth, MAX_CONTAINER_WIDTH);
containerWidth = Math.max(containerWidth, MIN_CONTAINER_WIDTH);
refreshContainer();
if ( DesignModeContext.isAuthorityEditing()) {
DesignerContext.getDesignerFrame().doResize();
}
// do noting
}
});
addMouseListener(new MouseAdapter() {

30
designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java

@ -257,8 +257,6 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
}
};
private ProgressDialog progressDialog;
public DesignerFrame(ToolBarMenuDock ad) {
setName(DESIGNER_FRAME_NAME);
@ -338,7 +336,6 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
this.setDropTarget(new DropTarget(this, DnDConstants.ACTION_MOVE, new FileDropTargetListener(), true));
closeMode = UIConstants.CLOSE_OF_AUTHORITY;
initMenuPane();
this.progressDialog = new ProgressDialog(this);
}
public void resizeFrame() {
@ -748,9 +745,11 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
* @param al 组件名称
*/
public void checkCombineUp(boolean flag, ArrayList<String> al) {
//Yvan: 检查当前是否为WORK_SHEET状态,因为只有WORK_SHEET中含有格式刷组件,此时是不需要进行checkComponentsByNames的
if (HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getMenuState() == DesignState.WORK_SHEET) {
return;
}
combineUp.checkComponentsByNames(flag, al);
}
/**
@ -1262,23 +1261,15 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
}
}
@Deprecated
public ProgressDialog getProgressDialog() {
return progressDialog;
}
public void showProgressDialog() {
progressDialog.setVisible(true);
return new ProgressDialog(this);
}
/**
* 隐藏进度框
*/
public void hideProgressDialog() {
@Deprecated
public void openProgressDialog() {
progressDialog.setVisible(false);
}
/**
@ -1286,17 +1277,17 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
*
* @param progress 进度值
*/
@Deprecated
public void updateProgress(int progress) {
progressDialog.setProgressValue(progress);
}
/**
* 释放进度框
*/
@Deprecated
public void disposeProgressDialog() {
progressDialog.dispose();
}
/**
@ -1307,4 +1298,5 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
public boolean isDesignerOpened() {
return designerOpened;
}
}

2
designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java

@ -856,7 +856,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt
BorderLayout.CENTER);
this.setSize(340, 180);
this.setSize(380, 180);
this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Mkdir"));
this.setResizable(false);
this.setAlwaysOnTop(true);

24
designer-base/src/main/java/com/fr/env/EnvListPane.java vendored

@ -3,6 +3,7 @@ package com.fr.env;
import com.fr.design.DesignerEnvManager;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.env.DesignerWorkspaceType;
import com.fr.design.env.LocalDesignerWorkspaceInfo;
import com.fr.design.env.RemoteDesignerWorkspaceInfo;
import com.fr.design.gui.controlpane.JListControlPane;
@ -17,8 +18,10 @@ import com.fr.stable.core.PropertyChangeAdapter;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* @author yaohwu
@ -98,11 +101,30 @@ public class EnvListPane extends JListControlPane {
DesignerEnvManager mgr = DesignerEnvManager.getEnvManager();
//这里代码时序换一下,因为update中需要借助mgr来获取提醒时间,已确认mgr对res无依赖
Nameable[] res = this.update();
Set<Nameable> set = findNewWorkSpaceInfo(res);
mgr.clearAllEnv();
for (Nameable re : res) {
NameObject nameObject = (NameObject) re;
mgr.putEnv(nameObject.getName(), (DesignerWorkspaceInfo) nameObject.getObject());
DesignerWorkspaceInfo info = (DesignerWorkspaceInfo) nameObject.getObject();
if (set.contains(re) && info.getType() == DesignerWorkspaceType.Remote) {
RemoteDesignerWorkspaceInfo newInfo = (RemoteDesignerWorkspaceInfo) info;
newInfo.setNewCreated(true);
mgr.putEnv(nameObject.getName(), newInfo);
} else {
mgr.putEnv(nameObject.getName(), info);
}
}
return this.getSelectedName();
}
private Set<Nameable> findNewWorkSpaceInfo(Nameable[] res) {
Set<Nameable> set = new HashSet<>();
for (Nameable val : res) {
NameObject nameObject = (NameObject) val;
if (DesignerEnvManager.getEnvManager().getWorkspaceInfo(nameObject.getName()) == null) {
set.add(val);
}
}
return set;
}
}

18
designer-base/src/main/java/com/fr/start/BaseDesigner.java

@ -64,14 +64,11 @@ public abstract class BaseDesigner extends ToolBarMenuDock {
@Override
public void on(Event event, Null param) {
EventDispatcher.stopListen(this);
UIUtil.invokeLaterIfNeeded(new Runnable() {
@Override
public void run() {
UIUtil.invokeLaterIfNeeded(() -> {
// 打开上次的文件
showDesignerFrame(false);
DesignerLaunchStatus.setStatus(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE);
}
// 打开上次的文件
showDesignerFrame(false);
DesignerLaunchStatus.setStatus(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE);
});
}
});
@ -90,12 +87,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock {
}
public void show() {
UIUtil.invokeLaterIfNeeded(new Runnable() {
@Override
public void run() {
refreshTemplateTree();
}
});
UIUtil.invokeLaterIfNeeded(this::refreshTemplateTree);
}
private void refreshTemplateTree() {

4
designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java

@ -62,6 +62,10 @@ public class FineEmbedServerActivator extends Activator {
tomcat.setPort(DesignerEnvManager.getEnvManager().getEmbedServerPort());
// 设置解码uri使用的字符编码
tomcat.getConnector().setURIEncoding(EncodeConstants.ENCODING_UTF_8);
// 参考 https://jira.atlassian.com/browse/CONFSERVER-57582
// https://tomcat.apache.org/tomcat-8.5-doc/config/http.html
// 8.5.x 请求参数带特殊字符被tomcat拒绝 []|{}^\`"<>
tomcat.getConnector().setProperty("relaxedQueryChars", "[]|{}^&#x5c;&#x60;&quot;&lt;&gt;");
setMaxPostSize();
String docBase = new File(WorkContext.getCurrent().getPath()).getParent();

21
designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java

@ -32,7 +32,7 @@ public class FineEmbedServerMonitor {
*/
private static final int STEP_HEARTBEAT = 40;
private static volatile FineEmbedServerMonitor monitor;
private static ProgressDialog progressBar = DesignerContext.getDesignerFrame().getProgressDialog();
private static ProgressDialog progressDialog = new ProgressDialog(DesignerContext.getDesignerFrame());
//由于默认值的字体不支持韩文,所以要对韩文单独生成字体
private FRFont font = null;
private static final int FONT_RGB = 333334;
@ -47,7 +47,7 @@ public class FineEmbedServerMonitor {
@Override
public void on(Event event, Null aNull) {
getInstance().reset();
DesignerContext.getDesignerFrame().hideProgressDialog();
progressDialog.dispose();
}
});
}
@ -64,7 +64,7 @@ public class FineEmbedServerMonitor {
}
public int getProgress() {
if (progress == progressBar.getProgressMaximum()) {
if (progress == progressDialog.getProgressMaximum()) {
return progress;
} else {
progress += STEP;
@ -73,7 +73,7 @@ public class FineEmbedServerMonitor {
}
public void setComplete() {
this.progress = progressBar.getProgressMaximum();
this.progress = progressDialog.getProgressMaximum();
}
public void reset() {
@ -81,7 +81,7 @@ public class FineEmbedServerMonitor {
}
public boolean isComplete() {
return this.progress >= progressBar.getProgressMaximum();
return this.progress >= progressDialog.getProgressMaximum();
}
public void monitor() {
@ -92,11 +92,12 @@ public class FineEmbedServerMonitor {
public void run() {
if (isComplete()) {
scheduler.shutdown();
DesignerContext.getDesignerFrame().hideProgressDialog();
progressDialog.dispose();
return;
}
if (!DesignerContext.getDesignerFrame().getProgressDialog().isVisible()) {
DesignerContext.getDesignerFrame().showProgressDialog();
if (!progressDialog.isVisible()) {
progressDialog = new ProgressDialog(DesignerContext.getDesignerFrame());
progressDialog.setVisible(true);
//如果为韩文则改变字体
LocaleCenter.buildAction(new LocaleAction() {
@Override
@ -105,9 +106,9 @@ public class FineEmbedServerMonitor {
}
}, SupportLocaleImpl.SUPPORT_KOREA);
String text = Toolkit.i18nText("Fine-Design_Basic_Loading_Embed_Server");
DesignerContext.getDesignerFrame().getProgressDialog().updateLoadingText(text, font);
progressDialog.updateLoadingText(text, font);
}
DesignerContext.getDesignerFrame().updateProgress(getProgress());
progressDialog.setProgressValue(getProgress());
}
}, 0, STEP_HEARTBEAT, TimeUnit.MILLISECONDS);

6
designer-base/src/main/java/com/fr/start/server/ServerTray.java

@ -29,9 +29,9 @@ public class ServerTray {
private MenuItem stopMenu;
private Image trayStartedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStarted.png");
private Image trayStartedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStarted@2x.png");
private Image trayStoppedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStopped.png");
private Image trayStoppedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStopped@2x.png");
private ServerManageFrame serverManageFrame;
@ -188,4 +188,4 @@ public class ServerTray {
}
});
}
}
}

8
designer-base/src/test/java/com/fr/design/DesignerEnvManagerTest.java

@ -3,6 +3,7 @@ package com.fr.design;
import junit.framework.TestCase;
import java.util.Locale;
import org.junit.Assert;
public class DesignerEnvManagerTest extends TestCase{
@ -17,4 +18,11 @@ public class DesignerEnvManagerTest extends TestCase{
assertEquals("下边界", envManager.getLanguage(), Locale.SIMPLIFIED_CHINESE);
}
public void testGetUUID() {
DesignerEnvManager envManager = new DesignerEnvManager();
String uuid0 = envManager.getUUID();
String uuid1 = envManager.getUUID();
Assert.assertEquals(uuid0, uuid1);
}
}

67
designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java vendored

@ -1,9 +1,16 @@
package com.fr.design.env;
import com.fr.invoke.Reflect;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLReaderHelper;
import com.fr.stable.xml.XMLableReader;
import com.fr.workspace.connect.WorkspaceConnectionInfo;
import junit.framework.TestCase;
import org.junit.Assert;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
/**
* @author hades
* @version 10.0
@ -22,4 +29,64 @@ public class RemoteDesignerWorkspaceInfoTest extends TestCase {
Assert.assertFalse(workspaceInfo3.checkValid());
}
public void testReadXml() {
String xml0 = "<Connection url=\"https://192.168.101.171:8075/webroot/decision\" username=\"1\" password=\"EclFl2zl5ti32lqQIh9r/7iCd0Vmhm5uuLol+zs+oi4JWN8F6JA2Ym4PYeQOAR5cjvIdzhUgwoG/\n" +
"AJF1Ht1CFLfZqrztuJsWpP8GlMvqZb/Gi3TT2idJC/qHU6Am1jFe0qJoytyWUi5zGnZicTfVgDir\n" +
"gE0kuw1ONOzFCkVfNbLrC+DXIIbVa7ramqbsVa6/LDEqOJvfAE36cBYJjWGHjOT91ixldaCyEX8m\n" +
"0xmw5xvEuEiTgRUHufbKCEG0FOR1xvS3D3C9vlauoqDI1INOyUOawQvpuQ552AjZi/FH1v+eNt+q\n" +
"eU7iCzsKb6P5KomaKUTZ8EPlSR/+Ihzg5VjAyg==\" certPath=\"\" certSecretKey=\"bofKLt/G93T2NudGR71Npb1GCPSUVeC34dtFGa+DHRl2GfP3WM4Nitb/LwdA/mml5BNl/S5f4txt\n" +
"0jxK4r08BoWoleKt5r7C0Fapj6Ccm+qVP6ywaxN1PSC0ML8Fowo3VYhv2BVzdodMLLliIVngostk\n" +
"76gqsiatzJb0XiPnzb0UpjWs7lpgCw+XDBk2Qfpv/U8fyPmLkAxA+085w55vzLluu7o2ilaveOUk\n" +
"hmT3NfZinTTZd+dQJxfVfUgjKJdZ9C+EM/IkzY1gVYXYuZ8gl5wd5RkjC3VUOu36akmB09gXJ4S8\n" +
"z8ZdHilA5L9tneuS5C05DMRJ6CdO+avGJgJAtw==\" rememberPwd=\"true\"/>";
String xml1 = "<Connection url=\"https://192.168.101.171:8075/webroot/decision\" username=\"1\" password=\"EclFl2zl5ti32lqQIh9r/7iCd0Vmhm5uuLol+zs+oi4JWN8F6JA2Ym4PYeQOAR5cjvIdzhUgwoG/\n" +
"AJF1Ht1CFLfZqrztuJsWpP8GlMvqZb/Gi3TT2idJC/qHU6Am1jFe0qJoytyWUi5zGnZicTfVgDir\n" +
"gE0kuw1ONOzFCkVfNbLrC+DXIIbVa7ramqbsVa6/LDEqOJvfAE36cBYJjWGHjOT91ixldaCyEX8m\n" +
"0xmw5xvEuEiTgRUHufbKCEG0FOR1xvS3D3C9vlauoqDI1INOyUOawQvpuQ552AjZi/FH1v+eNt+q\n" +
"eU7iCzsKb6P5KomaKUTZ8EPlSR/+Ihzg5VjAyg==\" certPath=\"\" certSecretKey=\"xxxxxxx\" rememberPwd=\"true\"/>";
byte[] bytes0 = xml0.getBytes();
byte[] bytes1 = xml1.getBytes();
RemoteDesignerWorkspaceInfo info = new RemoteDesignerWorkspaceInfo();
ByteArrayInputStream in0 = new ByteArrayInputStream(bytes0);
ByteArrayInputStream in1 = new ByteArrayInputStream(bytes1);
try {
XMLableReader reader0 = XMLReaderHelper.createXMLableReader(in0, XMLPrintWriter.XML_ENCODER);
Reflect.on(reader0).set("state", 1);
info.setNewCreated(true);
info.readXML(reader0);
Assert.assertEquals("xxxxxxx", info.getConnection().getCertSecretKey());
XMLableReader reader1 = XMLReaderHelper.createXMLableReader(in1, XMLPrintWriter.XML_ENCODER);
Reflect.on(reader1).set("state", 1);
info.setNewCreated(false);
info.readXML(reader1);
Assert.assertEquals("xxxxxxx", info.getConnection().getCertSecretKey());
} catch (Exception ignore) {
}
}
public void testWriteXml() {
ByteArrayOutputStream out0 = new ByteArrayOutputStream();
XMLPrintWriter writer0 = XMLPrintWriter.create(out0);
RemoteDesignerWorkspaceInfo info0 = RemoteDesignerWorkspaceInfo.create(new WorkspaceConnectionInfo("127.0.0.1", "1", "1", "/xxx", "xxxxx", true));
info0.setNewCreated(true);
info0.writeXML(writer0);
writer0.close();
String result0 = new String(out0.toByteArray());
Assert.assertTrue(result0.contains("certSecretKey"));
Assert.assertFalse(result0.contains("certSecretKey=\"xxxxx\""));
ByteArrayOutputStream out1 = new ByteArrayOutputStream();
XMLPrintWriter writer1 = XMLPrintWriter.create(out1);
RemoteDesignerWorkspaceInfo info1 = RemoteDesignerWorkspaceInfo.create(new WorkspaceConnectionInfo("127.0.0.1", "1", "1", "/xxx", "xxxxx", true));
info1.writeXML(writer1);
writer1.close();
String result1 = new String(out1.toByteArray());
Assert.assertTrue(result1.contains("certSecretKey"));
Assert.assertTrue(result1.contains("certSecretKey=\"xxxxx\""));
}
}

7
designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java

@ -82,6 +82,10 @@ public abstract class AbstractCustomFieldComboBoxPane<T> extends BasicBeanPane<T
return false;
}
protected boolean seriesComboBoxHasNone() {
return false;
}
public void checkBoxUse(boolean hasUse) {
nameOrValue.setEnabled(hasUse);
useFieldValuePane.checkBoxUse(hasUse);
@ -147,8 +151,7 @@ public abstract class AbstractCustomFieldComboBoxPane<T> extends BasicBeanPane<T
private void initComponents() {
series = new UIComboBox();
series = seriesComboBoxHasNone() ? new UIComboBoxWithNone() : new UIComboBox();
value = valueComboBoxHasNone() ? new UIComboBoxWithNone() : new UIComboBox();
value.addItemListener(new ItemListener() {
@Override

5
designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/ReportDataPane.java

@ -1,5 +1,6 @@
package com.fr.design.mainframe.chart.gui.data;
import com.fr.base.chart.chartdata.TopDefinitionProvider;
import com.fr.chart.chartattr.Chart;
import com.fr.chart.chartattr.ChartCollection;
import com.fr.chart.chartattr.Plot;
@ -8,6 +9,7 @@ import com.fr.design.ChartTypeInterfaceManager;
import com.fr.design.beans.FurtherBasicBeanPane;
import com.fr.design.mainframe.chart.gui.ChartDataPane;
import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane;
import com.fr.plugin.chart.custom.CustomDefinition;
import java.awt.*;
@ -45,7 +47,8 @@ public class ReportDataPane extends FurtherBasicBeanPane<ChartCollection>{
* @return 界面是否接受对象
*/
public boolean accept(Object ob) {
return ob instanceof ChartCollection && ((ChartCollection)ob).getSelectedChart().getFilterDefinition() instanceof ReportDataDefinition;
TopDefinitionProvider filterDefinition = ((ChartCollection) ob).getSelectedChartProvider(Chart.class).getFilterDefinition();
return ob instanceof ChartCollection && filterDefinition instanceof ReportDataDefinition && !(filterDefinition instanceof CustomDefinition);
}
/**

4
designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java

@ -22,6 +22,10 @@ public class ExtendedCustomFieldComboBoxPane extends AbstractCustomFieldComboBox
return new ExtendedCustomFieldNamePane();
}
@Override
protected boolean seriesComboBoxHasNone() {
return true;
}
@Override
public void populateBean(AbstractDataConfig ob) {

4
designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java

@ -41,7 +41,9 @@ public class UIComboBoxWithNone extends UIComboBox {
public void setSelectedItem(Object anObject) {
super.setSelectedItem(anObject);
if (getSelectedIndex() == -1) {//找不到的都选中无。中文的无 英文下是none。
//找不到的都选中无。中文的无 英文下是none。
//改正:找不到的且anObject不是null的 全部选中无。
if (getSelectedIndex() == -1 && anObject != null) {
super.setSelectedItem(getDefaultLocaleString());
}
}

4
designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java

@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.area.AreaIndependentVanChart;
import com.fr.plugin.chart.area.VanChartAreaPlot;
import com.fr.van.chart.designer.type.AbstractVanChartTypePane;
import com.fr.van.chart.designer.type.AbstractRectanglePlotPane;
/**
* Created by Mitisky on 15/11/18.
*/
public class VanChartAreaPlotPane extends AbstractVanChartTypePane {
public class VanChartAreaPlotPane extends AbstractRectanglePlotPane {
@Override
protected String[] getTypeIconPath() {

4
designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java

@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.bar.BarIndependentVanChart;
import com.fr.plugin.chart.column.VanChartColumnPlot;
import com.fr.van.chart.designer.type.AbstractVanChartTypePane;
import com.fr.van.chart.designer.type.AbstractRectanglePlotPane;
/**
* Created by Mitisky on 15/10/20.
*/
public class VanChartBarPlotPane extends AbstractVanChartTypePane {
public class VanChartBarPlotPane extends AbstractRectanglePlotPane {
@Override
protected String[] getTypeIconPath() {

35
designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java

@ -12,15 +12,22 @@ import com.fr.chartx.data.field.AbstractColumnFieldCollection;
import com.fr.chartx.data.field.diff.BubbleColumnFieldCollection;
import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.area.VanChartAreaPlot;
import com.fr.plugin.chart.attr.plot.VanChartPlot;
import com.fr.plugin.chart.base.VanChartTools;
import com.fr.plugin.chart.base.VanChartZoom;
import com.fr.plugin.chart.bubble.BubbleIndependentVanChart;
import com.fr.plugin.chart.bubble.VanChartBubblePlot;
import com.fr.plugin.chart.column.VanChartColumnPlot;
import com.fr.plugin.chart.line.VanChartLinePlot;
import com.fr.plugin.chart.scatter.VanChartScatterPlot;
import com.fr.plugin.chart.scatter.attr.ScatterAttrLabel;
import com.fr.plugin.chart.vanchart.VanChart;
import com.fr.van.chart.designer.type.AbstractVanChartTypePane;
import java.util.HashSet;
import java.util.Set;
/**
* Created by Mitisky on 16/3/31.
*/
@ -32,6 +39,20 @@ public class VanChartBubblePlotPane extends AbstractVanChartTypePane {
private static final float ALPHA = 0.7f;
private static Set<String> forceExtendPlotIds = new HashSet<>();
private static Set<String> extendPlotIds = new HashSet<>();
static {
extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID);
extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID);
extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT);
extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID);
extendPlotIds.add(VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID);
forceExtendPlotIds.add(VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID);
}
@Override
protected String[] getTypeIconPath() {
return new String[]{"/com/fr/van/chart/bubble/images/bubble.png",
@ -122,16 +143,16 @@ public class VanChartBubblePlotPane extends AbstractVanChartTypePane {
* @param chart
*/
@Override
protected void resetChartAttr4SamePlot(Chart chart) {
protected void resetChartAttr4SamePlot(VanChart chart) {
//图表缩放新设计 恢复用注释。下面2行删除。
VanChartZoom vanChartZoom = new VanChartZoom();
((VanChart) chart).setVanChartZoom(vanChartZoom);
chart.setVanChartZoom(vanChartZoom);
//图表缩放新设计 恢复用注释。下面一行取消注释。
//((VanChart) chart).setZoomAttribute(new ZoomAttribute());
//重置监控刷新选项
resetRefreshMoreLabelAttr((VanChart) chart);
resetRefreshMoreLabelAttr(chart);
}
@Override
@ -147,4 +168,12 @@ public class VanChartBubblePlotPane extends AbstractVanChartTypePane {
}
return false;
}
//是否支持属性的继承
@Override
protected boolean supportExtendAttr(VanChart chart) {
VanChartBubblePlot selectedClonedPlot = (VanChartBubblePlot) getSelectedClonedPlot();
return selectedClonedPlot.isForceBubble() ? forceExtendPlotIds.contains(chart.getID()) :
extendPlotIds.contains(chart.getID());
}
}

4
designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java

@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.column.ColumnIndependentVanChart;
import com.fr.plugin.chart.column.VanChartColumnPlot;
import com.fr.van.chart.designer.type.AbstractVanChartTypePane;
import com.fr.van.chart.designer.type.AbstractRectanglePlotPane;
/**
* Created by Mitisky on 15/9/24.
*/
public class VanChartColumnPlotPane extends AbstractVanChartTypePane {
public class VanChartColumnPlotPane extends AbstractRectanglePlotPane {
@Override
protected String[] getTypeIconPath() {

10
designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java

@ -119,7 +119,7 @@ public class VanChartCustomPlotPane extends AbstractVanChartTypePane {
}
@Override
public void updateBean(Chart chart) {
public void updateBean(VanChart chart) {
//保存上次选中的值,其会在super中更新
int lastState = chart.getPlot().getDetailType();
@ -129,7 +129,7 @@ public class VanChartCustomPlotPane extends AbstractVanChartTypePane {
//如果上次的状态和这次的装填不在同一个页面,说明同一个图表內切换了,需要情況数据配置
if (lastState != chart.getPlot().getDetailType()) {
chart.setFilterDefinition(null);
((VanChart) chart).setChartDataDefinition(null);
chart.setChartDataDefinition(null);
}
Chart[] customChart = CustomIndependentVanChart.CustomVanChartTypes;
@ -214,12 +214,12 @@ public class VanChartCustomPlotPane extends AbstractVanChartTypePane {
* @param newPlot
*/
@Override
protected void resetChartAttr(Chart chart, Plot newPlot) {
protected void resetChartAttr(VanChart chart, VanChartPlot newPlot) {
super.resetChartAttr(chart, newPlot);
//切换图表清空数据配置
chart.setFilterDefinition(null);
//设置默认不排序
VanChartTools tools = ((VanChart) chart).getVanChartTools();
VanChartTools tools = chart.getVanChartTools();
if (tools != null) {
tools.setSort(false);
}
@ -228,7 +228,7 @@ public class VanChartCustomPlotPane extends AbstractVanChartTypePane {
/**
* 更新界面内容
*/
public void populateBean(Chart chart) {
public void populateBean(VanChart chart) {
for (ChartImagePane imagePane : typeDemo) {
imagePane.isPressing = false;
}

90
designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractRectanglePlotPane.java

@ -0,0 +1,90 @@
package com.fr.van.chart.designer.type;
import com.fr.chart.chartglyph.ConditionCollection;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.PiePlot4VanChart;
import com.fr.plugin.chart.area.VanChartAreaPlot;
import com.fr.plugin.chart.attr.axis.VanChartAxis;
import com.fr.plugin.chart.attr.plot.VanChartPlot;
import com.fr.plugin.chart.attr.plot.VanChartRectanglePlot;
import com.fr.plugin.chart.bubble.VanChartBubblePlot;
import com.fr.plugin.chart.column.VanChartColumnPlot;
import com.fr.plugin.chart.line.VanChartLinePlot;
import com.fr.plugin.chart.scatter.VanChartScatterPlot;
import com.fr.plugin.chart.type.VanChartPlotType;
import com.fr.plugin.chart.vanchart.VanChart;
import com.fr.stable.StringUtils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author Bjorn
* @version 10.0
* Created by Bjorn on 2020-08-24
*/
public abstract class AbstractRectanglePlotPane extends AbstractVanChartTypePane {
private static Set<String> extendPlotIds = new HashSet<>();
static {
extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID);
extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID);
extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT);
extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID);
extendPlotIds.add(VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID);
extendPlotIds.add(PiePlot4VanChart.VAN_CHART_PIE_PLOT);
}
@Override
protected VanChartPlot cloneOldPlot2New(VanChartPlot oldPlot, VanChartPlot newPlot) {
try {
VanChartRectanglePlot vanChartRectanglePlot = (VanChartRectanglePlot) newPlot;
VanChartRectanglePlot clonePlot = (VanChartRectanglePlot) oldPlot.clone();
clonePlot.setVanChartPlotType(vanChartRectanglePlot.getVanChartPlotType());
//自定义类型的图形要增加一个y2轴,并且增加系列中的堆积条件,反之则要去掉y2轴和条件
if (clonePlot.isCustomChart()) {
List<VanChartAxis> valueAxisList = clonePlot.getValueAxisList();
valueAxisList.add(vanChartRectanglePlot.getValueAxisList().get(1));
clonePlot.setStackAndAxisCondition(vanChartRectanglePlot.getStackAndAxisCondition());
} else {
List<VanChartAxis> xAxisList = clonePlot.getXAxisList();
List<VanChartAxis> yAxisList = clonePlot.getYAxisList();
List<VanChartAxis> newXAxisList = new ArrayList<>();
List<VanChartAxis> newYAxisList = new ArrayList<>();
newXAxisList.add(xAxisList.get(0));
newYAxisList.add(yAxisList.get(0));
clonePlot.setXAxisList(newXAxisList);
clonePlot.setYAxisList(newYAxisList);
clonePlot.setStackAndAxisCondition(new ConditionCollection());
}
//百分比堆积图值轴的格式不保留
if (clonePlot.getVanChartPlotType() == VanChartPlotType.STACK_BY_PERCENT ||
((VanChartRectanglePlot) oldPlot).getVanChartPlotType() == VanChartPlotType.STACK_BY_PERCENT) {
VanChartAxis cloneAxis = clonePlot.getValueAxisList().get(0);
VanChartAxis vanChartAxis = vanChartRectanglePlot.getValueAxisList().get(0);
cloneAxis.setFormat(vanChartAxis.getFormat());
cloneAxis.setPercentage(vanChartAxis.isPercentage());
cloneAxis.setCommonValueFormat(vanChartAxis.isCommonValueFormat());
cloneAxis.setHtmlLabel(vanChartAxis.getHtmlLabel());
}
return clonePlot;
} catch (CloneNotSupportedException ex) {
FineLoggerFactory.getLogger().error("Error in change plot");
return newPlot;
}
}
//是否支持属性的继承
@Override
protected boolean supportExtendAttr(VanChart chart) {
if (StringUtils.equals(VanChartBubblePlot.VAN_CHART_BUBBLE_PLOT_ID, chart.getID())) {
VanChartBubblePlot vanChartBubblePlot = chart.getPlot();
return !vanChartBubblePlot.isForceBubble();
}
return extendPlotIds.contains(chart.getID());
}
}

61
designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java

@ -1,10 +1,13 @@
package com.fr.van.chart.designer.type;
import com.fr.base.BaseUtils;
import com.fr.base.chart.chartdata.TopDefinitionProvider;
import com.fr.chart.base.AttrFillStyle;
import com.fr.chart.chartattr.Chart;
import com.fr.chart.chartattr.Legend;
import com.fr.chart.chartattr.Plot;
import com.fr.chart.chartdata.NormalReportDataDefinition;
import com.fr.chart.chartdata.NormalTableDataDefinition;
import com.fr.chart.chartglyph.ConditionAttr;
import com.fr.chart.chartglyph.ConditionCollection;
import com.fr.chart.chartglyph.DataSheet;
@ -37,7 +40,7 @@ import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionListener;
public abstract class AbstractVanChartTypePane extends AbstractChartTypePane<Chart> {
public abstract class AbstractVanChartTypePane extends AbstractChartTypePane<VanChart> {
private static final long serialVersionUID = 7743244512351499265L;
private UICheckBox largeModelCheckBox;
@ -119,7 +122,7 @@ public abstract class AbstractVanChartTypePane extends AbstractChartTypePane<Cha
/**
* 更新界面内容
*/
public void populateBean(Chart chart) {
public void populateBean(VanChart chart) {
for (ChartImagePane imagePane : typeDemo) {
imagePane.isPressing = false;
}
@ -131,15 +134,14 @@ public abstract class AbstractVanChartTypePane extends AbstractChartTypePane<Cha
/**
* 保存界面属性
*/
public void updateBean(Chart chart) {
public void updateBean(VanChart chart) {
VanChartPlot oldPlot = chart.getPlot();
VanChartPlot newPlot = getSelectedClonedPlot();
checkTypeChange(oldPlot);
samePlot = accept(chart);
if (typeChanged && samePlot) {
//同一中图表切换不同类型
cloneOldPlot2New(oldPlot, newPlot);
chart.setPlot(newPlot);
chart.setPlot(cloneOldPlot2New(oldPlot, newPlot));
resetChartAttr4SamePlot(chart);
ChartInfoCollector.getInstance().updateChartMiniType(chart);
} else if (!samePlot) {
@ -150,9 +152,8 @@ public abstract class AbstractVanChartTypePane extends AbstractChartTypePane<Cha
//切换类型埋点
ChartInfoCollector.getInstance().updateChartTypeTime(chart, oldPlot.getPlotID());
}
if (chart instanceof VanChart
&& !acceptDefinition(((VanChart) chart).getChartDataDefinition(), newPlot)) {
((VanChart) chart).setChartDataDefinition(null);
if (!acceptDefinition(chart.getChartDataDefinition(), newPlot)) {
chart.setChartDataDefinition(null);
}
}
@ -164,31 +165,41 @@ public abstract class AbstractVanChartTypePane extends AbstractChartTypePane<Cha
return false;
}
protected void resetChartAttr4SamePlot(Chart chart) {
resetRefreshMoreLabelAttr((VanChart) chart);
protected void resetChartAttr4SamePlot(VanChart chart) {
resetRefreshMoreLabelAttr(chart);
}
protected void resetChartAttr(Chart chart, Plot newPlot) {
protected void resetChartAttr(VanChart chart, VanChartPlot newPlot) {
resetFilterDefinition(chart);
//上个图表支持继承部分属性到新图表
if (supportExtendAttr(chart)) {
newPlot.extendAttribute(chart);
chart.setPlot(newPlot);
return;
}
chart.setPlot(newPlot);
if (newPlot.isSupportZoomDirection() && !newPlot.isSupportZoomCategoryAxis()) {
//图表缩放新设计 恢复用注释。下面一行删除。
((VanChart) chart).setVanChartZoom(new VanChartZoom());
chart.setVanChartZoom(new VanChartZoom());
//图表缩放新设计 恢复用注释。下面一行取消注释。
// ((VanChart) chart).setZoomAttribute(new ZoomAttribute());
}
//重置工具栏选项
((VanChart) chart).setVanChartTools(createVanChartTools());
chart.setVanChartTools(createVanChartTools());
//重置标题选项
resetTitleAttr(chart);
//重置监控刷新选项
resetRefreshMoreLabelAttr((VanChart) chart);
resetFilterDefinition(chart);
resetRefreshMoreLabelAttr(chart);
}
//是否支持属性的继承
protected boolean supportExtendAttr(VanChart chart) {
return false;
}
//默认有标题
protected void resetTitleAttr(Chart chart) {
VanChartPlot vanChartPlot = (VanChartPlot) chart.getPlot();
VanChartPlot vanChartPlot = chart.getPlot();
chart.setTitle(vanChartPlot.getDefaultTitle());
}
@ -219,7 +230,7 @@ public abstract class AbstractVanChartTypePane extends AbstractChartTypePane<Cha
/**
* 同一个图表 类型之间切换
*/
protected void cloneOldPlot2New(Plot oldPlot, Plot newPlot) {
protected VanChartPlot cloneOldPlot2New(VanChartPlot oldPlot, VanChartPlot newPlot) {
try {
if (oldPlot.getLegend() != null) {
newPlot.setLegend((Legend) oldPlot.getLegend().clone());
@ -247,11 +258,12 @@ public abstract class AbstractVanChartTypePane extends AbstractChartTypePane<Cha
newPlot.setAlpha(oldPlot.getAlpha());
newPlot.setShadow(oldPlot.isShadow());
((VanChartPlot) newPlot).setCategoryNum(((VanChartPlot) oldPlot).getCategoryNum());
newPlot.setCategoryNum(oldPlot.getCategoryNum());
} catch (CloneNotSupportedException e) {
FineLoggerFactory.getLogger().error("Error in change plot");
}
return newPlot;
}
protected void cloneHotHyperLink(Plot oldPlot, Plot newPlot) throws CloneNotSupportedException {
@ -280,4 +292,17 @@ public abstract class AbstractVanChartTypePane extends AbstractChartTypePane<Cha
autoButton.addActionListener(autoButtonListener);
}
}
//部分图表继承到多分类之后会报错
protected void resetMoreCateDefinition(Chart chart) {
TopDefinitionProvider filterDefinition = chart.getFilterDefinition();
if (filterDefinition instanceof NormalTableDataDefinition) {
((NormalTableDataDefinition) filterDefinition).clearMoreCate();
((VanChartPlot) chart.getPlot()).setCategoryNum(1);
}
if (filterDefinition instanceof NormalReportDataDefinition) {
((NormalReportDataDefinition) filterDefinition).clearMoreCate();
((VanChartPlot) chart.getPlot()).setCategoryNum(1);
}
}
}

16
designer-chart/src/main/java/com/fr/van/chart/drillmap/designer/data/comp/MapDataTree.java

@ -45,9 +45,9 @@ public class MapDataTree extends JTree {
public void selectDefaultTreeNode() {
DefaultTreeModel m_model = (DefaultTreeModel) this.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) m_model.getRoot();
Enumeration<DefaultMutableTreeNode> children = root.children();
Enumeration<TreeNode> children = root.children();
if (children.hasMoreElements()) {
DefaultMutableTreeNode child = children.nextElement();
DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement();
if(GEOJSONTreeHelper.getInstance().isSelectableTreeNode(child)){
selectTreeNode(child, m_model);
@ -59,9 +59,9 @@ public class MapDataTree extends JTree {
}
private void setFirstChildTreeNode(DefaultMutableTreeNode parent, DefaultTreeModel m_model){
Enumeration<DefaultMutableTreeNode> children = parent.children();
Enumeration<TreeNode> children = parent.children();
if (children.hasMoreElements()){
DefaultMutableTreeNode node = children.nextElement();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) children.nextElement();
selectTreeNode(node, m_model);
}
}
@ -89,9 +89,9 @@ public class MapDataTree extends JTree {
DefaultTreeModel m_model = (DefaultTreeModel) this.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) m_model.getRoot();
Enumeration<DefaultMutableTreeNode> els = root.postorderEnumeration();
Enumeration<TreeNode> els = root.postorderEnumeration();
while(els.hasMoreElements()){
DefaultMutableTreeNode el = els.nextElement();
DefaultMutableTreeNode el = (DefaultMutableTreeNode) els.nextElement();
if(el == null || el.getUserObject() == null){
return null;
}
@ -145,10 +145,10 @@ public class MapDataTree extends JTree {
DefaultTreeModel m_model = (DefaultTreeModel) this.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) m_model.getRoot();
Enumeration<DefaultMutableTreeNode> els = root.postorderEnumeration();
Enumeration<TreeNode> els = root.postorderEnumeration();
while(els.hasMoreElements()){
DefaultMutableTreeNode el = els.nextElement();
DefaultMutableTreeNode el = (DefaultMutableTreeNode) els.nextElement();
String path = el.getUserObject().toString();
String fileName = ChartGEOJSONHelper.getPresentNameWithPath(path);
if (StringUtils.contains(fileName, text) && GEOJSONTreeHelper.isValidDirPath(path)) {

4
designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java

@ -59,10 +59,6 @@ public class VanChartGanttSeriesPane extends VanChartAbstractPlotSeriesPane {
return ganntStylePane;
}
protected void checkCompsEnabledWithLarge(Plot plot) {
}
private JPanel createLinkLinePane(){
lineWidth = new LineComboBox(CoreConstants.STRIKE_LINE_STYLE_ARRAY_4_CHART);
colorSelect = new ColorSelectBoxWithOutTransparent(100);

85
designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java

@ -8,10 +8,13 @@ import com.fr.chartx.data.field.AbstractColumnFieldCollection;
import com.fr.chartx.data.field.diff.GaugeColumnFieldCollection;
import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.attr.GaugeDetailStyle;
import com.fr.plugin.chart.attr.plot.VanChartPlot;
import com.fr.plugin.chart.base.AttrLabel;
import com.fr.plugin.chart.gauge.GaugeIndependentVanChart;
import com.fr.plugin.chart.gauge.VanChartGaugePlot;
import com.fr.plugin.chart.type.GaugeStyle;
import com.fr.plugin.chart.vanchart.VanChart;
import com.fr.van.chart.designer.type.AbstractVanChartTypePane;
/**
@ -31,12 +34,12 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane {
};
}
protected Plot getSelectedClonedPlot(){
protected Plot getSelectedClonedPlot() {
VanChartGaugePlot newPlot = null;
Chart[] GaugeChart = GaugeIndependentVanChart.GaugeVanChartTypes;
for(int i = 0, len = GaugeChart.length; i < len; i++){
if(typeDemo.get(i).isPressing){
newPlot = (VanChartGaugePlot)GaugeChart[i].getPlot();
for (int i = 0, len = GaugeChart.length; i < len; i++) {
if (typeDemo.get(i).isPressing) {
newPlot = (VanChartGaugePlot) GaugeChart[i].getPlot();
}
}
@ -44,8 +47,8 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane {
try {
if (newPlot == null) {
throw new IllegalArgumentException("newPlot con not be null");
}else {
cloned = (Plot)newPlot.clone();
} else {
cloned = (Plot) newPlot.clone();
}
} catch (CloneNotSupportedException e) {
FineLoggerFactory.getLogger().error("Error In GaugeChart");
@ -56,16 +59,70 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane {
/**
* 保存界面属性
*/
public void updateBean(Chart chart) {
boolean oldISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot)chart.getPlot()).isMultiPointer();
public void updateBean(VanChart chart) {
boolean oldISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot) chart.getPlot()).isMultiPointer();
super.updateBean(chart);
boolean newISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot)chart.getPlot()).isMultiPointer();
if(oldISMulti != newISMulti){
boolean newISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot) chart.getPlot()).isMultiPointer();
if (oldISMulti != newISMulti) {
chart.setFilterDefinition(null);
}
}
protected void cloneOldConditionCollection(Plot oldPlot, Plot newPlot) throws CloneNotSupportedException{
@Override
protected VanChartPlot cloneOldPlot2New(VanChartPlot oldPlot, VanChartPlot newPlot) {
try {
VanChartGaugePlot vanChartNewPlot = (VanChartGaugePlot) newPlot;
VanChartGaugePlot vanChartOldPlot = (VanChartGaugePlot) oldPlot;
if (vanChartNewPlot.isMultiPointer() != vanChartOldPlot.isMultiPointer()) {
return super.cloneOldPlot2New(oldPlot, newPlot);
}
VanChartGaugePlot clonePlot = (VanChartGaugePlot) vanChartOldPlot.clone();
clonePlot.setGaugeStyle(vanChartNewPlot.getGaugeStyle());
//都是多指针仪表盘,所有属性都一样
if (clonePlot.isMultiPointer()) {
return clonePlot;
}
//超链和系列中的样式、布局不保留
clonePlot.setHotHyperLink(vanChartNewPlot.getHotHyperLink());
clonePlot.setRadius(vanChartNewPlot.getRadius());
reductionDetail(clonePlot.getGaugeDetailStyle(), vanChartNewPlot.getGaugeDetailStyle());
//如果切换试管型仪表盘,部分属性不保留
if (clonePlot.getGaugeStyle() == GaugeStyle.THERMOMETER ||
vanChartOldPlot.getGaugeStyle() == GaugeStyle.THERMOMETER) {
clonePlot.setGaugeAxis(vanChartNewPlot.getGaugeAxis());
clonePlot.getGaugeDetailStyle().setHorizontalLayout(vanChartNewPlot.getGaugeDetailStyle().isHorizontalLayout());
clonePlot.getGaugeDetailStyle().setHotAreaColor(vanChartNewPlot.getGaugeDetailStyle().getHotAreaColor());
AttrLabel cloneLabel = clonePlot.getAttrLabelFromConditionCollection();
AttrLabel newLabel = vanChartNewPlot.getAttrLabelFromConditionCollection();
cloneLabel.getAttrLabelDetail().setPosition(newLabel.getAttrLabelDetail().getPosition());
cloneLabel.getAttrLabelDetail().setAlign(newLabel.getAttrLabelDetail().getAlign());
cloneLabel.getAttrLabelDetail().setTextAttr(newLabel.getAttrLabelDetail().getTextAttr());
cloneLabel.getGaugeValueLabelDetail().setPosition(newLabel.getGaugeValueLabelDetail().getPosition());
cloneLabel.getGaugeValueLabelDetail().setAlign(newLabel.getGaugeValueLabelDetail().getAlign());
cloneLabel.getGaugeValueLabelDetail().setTextAttr(newLabel.getGaugeValueLabelDetail().getTextAttr());
}
return clonePlot;
} catch (CloneNotSupportedException e) {
FineLoggerFactory.getLogger().error("Error in change plot");
return newPlot;
}
}
private void reductionDetail(GaugeDetailStyle cloneDetail, GaugeDetailStyle newDetail) {
cloneDetail.setNeedleColor(newDetail.getNeedleColor());
cloneDetail.setPaneBackgroundColor(newDetail.getPaneBackgroundColor());
cloneDetail.setSlotBackgroundColor(newDetail.getSlotBackgroundColor());
cloneDetail.setAntiClockWise(newDetail.isAntiClockWise());
cloneDetail.setInnerPaneBackgroundColor(newDetail.getInnerPaneBackgroundColor());
cloneDetail.setThermometerWidth(newDetail.getThermometerWidth());
cloneDetail.setChutePercent(newDetail.getChutePercent());
}
protected void cloneOldConditionCollection(Plot oldPlot, Plot newPlot) throws CloneNotSupportedException {
}
public Chart getDefaultChart() {
@ -74,8 +131,8 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane {
@Override
protected void cloneHotHyperLink(Plot oldPlot, Plot newPlot) throws CloneNotSupportedException {
if(oldPlot instanceof VanChartGaugePlot && newPlot instanceof VanChartGaugePlot){
if(((VanChartGaugePlot) oldPlot).isMultiPointer() == ((VanChartGaugePlot) newPlot).isMultiPointer()){
if (oldPlot instanceof VanChartGaugePlot && newPlot instanceof VanChartGaugePlot) {
if (((VanChartGaugePlot) oldPlot).isMultiPointer() == ((VanChartGaugePlot) newPlot).isMultiPointer()) {
super.cloneHotHyperLink(oldPlot, newPlot);
}
}
@ -83,7 +140,7 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane {
@Override
protected boolean acceptDefinition(ChartDataDefinitionProvider definition, VanChartPlot vanChartPlot) {
if(definition instanceof AbstractDataDefinition) {
if (definition instanceof AbstractDataDefinition) {
AbstractColumnFieldCollection columnFieldCollection = ((AbstractDataDefinition) definition).getColumnFieldCollection();
GaugeStyle gaugeStyle = ((VanChartGaugePlot) vanChartPlot).getGaugeStyle();
switch (gaugeStyle) {

3
designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java

@ -10,6 +10,7 @@ import com.fr.plugin.chart.base.VanChartTools;
import com.fr.plugin.chart.heatmap.HeatMapIndependentVanChart;
import com.fr.plugin.chart.heatmap.VanChartHeatMapPlot;
import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper;
import com.fr.plugin.chart.vanchart.VanChart;
import com.fr.van.chart.map.designer.type.VanChartMapPlotPane;
import com.fr.van.chart.map.designer.type.VanChartMapSourceChoosePane;
@ -30,7 +31,7 @@ public class VanChartHeatMapTypePane extends VanChartMapPlotPane {
}
//适用一种图表只有一种类型的
public void populateBean(Chart chart) {
public void populateBean(VanChart chart) {
typeDemo.get(0).isPressing = true;
VanChartHeatMapPlot plot = (VanChartHeatMapPlot)chart.getPlot();
populateSourcePane(plot);

4
designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java

@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.line.LineIndependentVanChart;
import com.fr.plugin.chart.line.VanChartLinePlot;
import com.fr.van.chart.designer.type.AbstractVanChartTypePane;
import com.fr.van.chart.designer.type.AbstractRectanglePlotPane;
/**
* Created by Mitisky on 15/11/5.
*/
public class VanChartLinePlotPane extends AbstractVanChartTypePane {
public class VanChartLinePlotPane extends AbstractRectanglePlotPane {
@Override
protected String[] getTypeIconPath() {

23
designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java

@ -9,13 +9,18 @@ import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.attr.plot.VanChartPlot;
import com.fr.plugin.chart.base.VanChartTools;
import com.fr.plugin.chart.drillmap.VanChartDrillMapPlot;
import com.fr.plugin.chart.heatmap.VanChartHeatMapPlot;
import com.fr.plugin.chart.map.MapIndependentVanChart;
import com.fr.plugin.chart.map.VanChartMapPlot;
import com.fr.plugin.chart.map.data.VanMapDefinition;
import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper;
import com.fr.plugin.chart.vanchart.VanChart;
import com.fr.van.chart.designer.type.AbstractVanChartTypePane;
import javax.swing.JPanel;
import java.util.HashSet;
import java.util.Set;
import java.awt.Component;
/**
@ -25,6 +30,14 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane {
private VanChartMapSourceChoosePane sourceChoosePane;
private static Set<String> extendPlotIds = new HashSet<>();
static {
extendPlotIds.add(VanChartMapPlot.VAN_CHART_MAP_ID);
extendPlotIds.add(VanChartDrillMapPlot.VAN_CHART_DRILL_MAP_ID);
extendPlotIds.add(VanChartHeatMapPlot.VAN_CHART_HEAT_MAP_ID);
}
@Override
protected String[] getTypeIconPath() {
return new String[]{"/com/fr/van/chart/map/images/area-map.png",
@ -54,7 +67,7 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane {
/**
* 更新界面内容
*/
public void populateBean(Chart chart) {
public void populateBean(VanChart chart) {
for (ChartImagePane imagePane : typeDemo) {
imagePane.isPressing = false;
}
@ -80,7 +93,7 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane {
}
}
public void updateBean(Chart chart) {
public void updateBean(VanChart chart) {
super.updateBean(chart);
Plot plot = chart.getPlot();
if (plot instanceof VanChartMapPlot) {
@ -154,4 +167,10 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane {
protected boolean acceptDefinition(ChartDataDefinitionProvider definition, VanChartPlot vanChartPlot) {
return definition instanceof MapChartDataDefinition;
}
//是否支持属性的继承
@Override
protected boolean supportExtendAttr(VanChart chart) {
return extendPlotIds.contains(chart.getID());
}
}

4
designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java

@ -55,10 +55,10 @@ public class VanChartMultiPiePlotPane extends AbstractVanChartTypePane {
return MultiPieIndependentVanChart.MultilayerVanChartTypes[0];
}
protected void resetChartAttr(Chart chart, Plot newPlot) {
protected void resetChartAttr(VanChart chart, VanChartPlot newPlot) {
super.resetChartAttr(chart, newPlot);
//重置工具栏选项
VanChartTools tools = ((VanChart) chart).getVanChartTools();
VanChartTools tools = chart.getVanChartTools();
if (tools != null) {
tools.setSort(false);
tools.setFullScreen(false);

41
designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java

@ -5,9 +5,17 @@ import com.fr.chart.chartattr.Chart;
import com.fr.chart.chartattr.Plot;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.PiePlot4VanChart;
import com.fr.plugin.chart.area.VanChartAreaPlot;
import com.fr.plugin.chart.attr.plot.VanChartPlot;
import com.fr.plugin.chart.column.VanChartColumnPlot;
import com.fr.plugin.chart.line.VanChartLinePlot;
import com.fr.plugin.chart.pie.PieIndependentVanChart;
import com.fr.plugin.chart.vanchart.VanChart;
import com.fr.van.chart.designer.type.AbstractVanChartTypePane;
import java.util.HashSet;
import java.util.Set;
/**
* 饼图(新特性) 属性表 选择类型 布局界面.
*/
@ -15,6 +23,15 @@ public class VanChartPiePlotPane extends AbstractVanChartTypePane {
private static final long serialVersionUID = 6163246902689597259L;
private static Set<String> extendPlotIds = new HashSet<>();
static {
extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID);
extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID);
extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT);
extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID);
}
@Override
protected String[] getTypeIconPath() {
return new String[]{"/com/fr/van/chart/pie/images/pie.png",
@ -44,7 +61,31 @@ public class VanChartPiePlotPane extends AbstractVanChartTypePane {
return cloned;
}
@Override
protected VanChartPlot cloneOldPlot2New(VanChartPlot oldPlot, VanChartPlot newPlot) {
try {
PiePlot4VanChart piePlot4VanChart = (PiePlot4VanChart) newPlot;
PiePlot4VanChart clonePlot = (PiePlot4VanChart) oldPlot.clone();
clonePlot.setRoseType(piePlot4VanChart.getRoseType());
return clonePlot;
} catch (CloneNotSupportedException e) {
FineLoggerFactory.getLogger().error("Error in change plot");
return newPlot;
}
}
//是否支持属性的继承
@Override
protected boolean supportExtendAttr(VanChart chart) {
return extendPlotIds.contains(chart.getID());
}
public Chart getDefaultChart() {
return PieIndependentVanChart.newPieChartTypes[0];
}
//重置数据配置
protected void resetFilterDefinition(Chart chart) {
resetMoreCateDefinition(chart);
}
}

2
designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarConditionPane.java

@ -53,7 +53,7 @@ public class VanChartRadarConditionPane extends DataSeriesConditionPane{
} else {
classPaneMap.put(VanChartAttrMarker.class, new VanChartMarkerConditionPane(this));
classPaneMap.put(VanChartAttrLine.class, new VanChartLineWidthConditionPane(this));
classPaneMap.put(AttrAreaSeriesFillColorBackground.class, new VanChartAreaFillColorConditionPane(this));
classPaneMap.put(AttrAreaSeriesFillColorBackground.class, new VanChartAreaFillColorConditionPane(this, plot));
classPaneMap.put(AttrEffect.class, new VanChartEffectConditionPane(this, EffectHelper.getRadarPlotDefaultEffect()));
}
}

4
designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java

@ -49,4 +49,8 @@ public class VanChartRadarPlotPane extends AbstractVanChartTypePane {
return RadarIndependentVanChart.RadarVanChartTypes[0];
}
//重置数据配置
protected void resetFilterDefinition(Chart chart) {
resetMoreCateDefinition(chart);
}
}

24
designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java

@ -10,13 +10,21 @@ import com.fr.chartx.data.ChartDataDefinitionProvider;
import com.fr.chartx.data.field.AbstractColumnFieldCollection;
import com.fr.chartx.data.field.diff.BubbleColumnFieldCollection;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.chart.area.VanChartAreaPlot;
import com.fr.plugin.chart.attr.plot.VanChartPlot;
import com.fr.plugin.chart.base.VanChartAttrLine;
import com.fr.plugin.chart.base.VanChartTools;
import com.fr.plugin.chart.bubble.VanChartBubblePlot;
import com.fr.plugin.chart.column.VanChartColumnPlot;
import com.fr.plugin.chart.line.VanChartLinePlot;
import com.fr.plugin.chart.scatter.ScatterIndependentVanChart;
import com.fr.plugin.chart.scatter.VanChartScatterPlot;
import com.fr.plugin.chart.vanchart.VanChart;
import com.fr.van.chart.designer.type.AbstractVanChartTypePane;
import java.util.HashSet;
import java.util.Set;
/**
* Created by Mitisky on 16/2/16.
*/
@ -29,6 +37,16 @@ public class VanChartScatterPlotPane extends AbstractVanChartTypePane {
};
}
private static Set<String> extendPlotIds = new HashSet<>();
static {
extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID);
extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID);
extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT);
extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID);
extendPlotIds.add(VanChartBubblePlot.VAN_CHART_BUBBLE_PLOT_ID);
}
protected Plot getSelectedClonedPlot(){
VanChartScatterPlot newPlot = null;
Chart[] scatterChart = ScatterIndependentVanChart.ScatterVanChartTypes;
@ -95,4 +113,10 @@ public class VanChartScatterPlotPane extends AbstractVanChartTypePane {
}
return false;
}
//是否支持属性的继承
@Override
protected boolean supportExtendAttr(VanChart chart) {
return extendPlotIds.contains(chart.getID());
}
}

5
designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java

@ -77,12 +77,13 @@ public class SelectionModel {
* @param e 鼠标事件
*/
public void selectACreatorAtMouseEvent(MouseEvent e) {
//单选因为要先从已选择的组件中筛选一遍,所以先选择再reset
XCreator comp = designer.getComponentAt(e);
if (e.getButton() == MouseEvent.BUTTON3 || (!InputEventBaseOnOS.isControlDown(e) && !e.isShiftDown())) {
// 如果Ctrl或者Shift键盘没有按下,则清除已经选择的组件
selection.reset();
} else {
//按下Ctrl或者shift键时鼠标可以进行多选,两次点击同一控件就取消选中
XCreator comp = designer.getComponentAt(e);
XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer(comp).getTopLayout();
if (topLayout != null && !topLayout.isEditable()) {
comp = topLayout;
@ -93,9 +94,9 @@ public class SelectionModel {
selection.removeCreator(selected);
}
}
comp = designer.getComponentAt(e);
}
// 获取e所在的组件
XCreator comp = designer.getComponentAt(e);
selectACreator(comp);
}

7
designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java

@ -300,6 +300,13 @@ public class StateModel {
int y = getMouseXY(e).y;
Rectangle bounds = createCurrentBounds(x, y);
// 有参数面板时 要考虑下参数面板的高度影响
int yOffset = 0;
XLayoutContainer paramComponent = designer.getParaComponent();
if (paramComponent != null) {
yOffset = paramComponent.getHeight();
}
bounds.y = Math.max(bounds.y - yOffset, 0);
if ((x != currentX) || (y != currentY)) {
ArrayList<XCreator> creators = getHotspotCreators(bounds, designer.getRootComponent());

1
designer-form/src/main/java/com/fr/design/designer/creator/XButton.java

@ -308,5 +308,4 @@ public class XButton extends XWidgetCreator {
}
}
}

5
designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java

@ -229,6 +229,9 @@ public class XChartEditor extends XBorderStyleWidgetCreator {
*/
public void paint(Graphics g) {
designerEditor.paintEditor(g, this.getSize());
if (coverPanel != null) {
coverPanel.setSize(this.getSize());
}
super.paint(g);
if (isEditing) {
g.setColor(INNER_BORDER_COLOR);
@ -258,6 +261,7 @@ public class XChartEditor extends XBorderStyleWidgetCreator {
(e.getClickCount() == 2 || designer.getCursor().getType() == Cursor.HAND_CURSOR);
displayCoverPane(!isEditing);
selectionModel.selectACreatorAtMouseEvent(e);
editingMouseListener.refreshTopXCreator(isEditing);
if (editingMouseListener.stopEditing()) {
if (this != (XCreator) designer.getRootComponent()) {
@ -357,4 +361,5 @@ public class XChartEditor extends XBorderStyleWidgetCreator {
public boolean supportMobileStyle() {
return false;
}
}

10
designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java

@ -539,6 +539,8 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
selectionModel.selectACreatorAtMouseEvent(e);
}
editingMouseListener.refreshTopXCreator();
if (editingMouseListener.stopEditing() && this != designer.getRootComponent()) {
ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, this);
editingMouseListener.startEditing(this, adapter.getDesignerEditor(), adapter);
@ -798,10 +800,16 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
/**
* 是否支持共享-现只支持报表块图表tab块绝对布局
* @return
*/
public boolean isSupportShared() {
return false;
}
/**
* 是否支持置顶显示
*/
public boolean isTopable() {
return true;
}
}

22
designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java

@ -336,4 +336,26 @@ public class XCreatorUtils {
}
return IOUtils.readIcon(iconPath);
}
public static boolean containComponent(Container ancestor, Container xCreator) {
while (xCreator != null && xCreator.getParent() != ancestor) {
xCreator = xCreator.getParent();
}
return xCreator != null;
}
/**
* 获取组件的最顶层XMainBorderLayout,没有则返回null
* */
@Nullable
public static XWCardMainBorderLayout getTopXMainBorderLayout(Container creator) {
XWCardMainBorderLayout result = null;
while (creator != null) {
if (creator instanceof XWCardMainBorderLayout) {
result = (XWCardMainBorderLayout) creator;
}
creator = creator.getParent();
}
return result;
}
}

2
designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java

@ -319,6 +319,7 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme
public void respondClick(EditingMouseListener editingMouseListener,MouseEvent e){
HelpDialogManager.getInstance().setPane(coverPanel);
super.respondClick(editingMouseListener, e);
editingMouseListener.refreshTopXCreator();
if (this.isHelpBtnOnFocus()) {
coverPanel.setMsgDisplay(e);
} else {
@ -370,4 +371,5 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme
public boolean isSupportShared() {
return true;
}
}

3
designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java

@ -68,9 +68,6 @@ public class XNameWidget extends XWidgetCreator {
Widget widget;
if (wc != null && (widget= wc.toWidget()) != null) {
editor = XCreatorUtils.createXCreator(widget);
Widget currentWidget = toData();
currentWidget.setVisible(widget.isVisible());
currentWidget.setEnabled(widget.isEnabled());
this.setBorder(null);
} else {
this.setBorder(DEFALUTBORDER);

5
designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java

@ -130,4 +130,9 @@ public class XWAbsoluteBodyLayout extends XWAbsoluteLayout {
public boolean isSupportShared() {
return false;
}
@Override
public boolean isTopable() {
return false;
}
}

2
designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java

@ -542,6 +542,7 @@ public class XWAbsoluteLayout extends XLayoutContainer {
selectionModel.selectACreatorAtMouseEvent(e);
designer.repaint();
editingMouseListener.refreshTopXCreator(isEditing);
if (editingMouseListener.stopEditing()) {
if (this != designer.getRootComponent()) {
@ -606,4 +607,5 @@ public class XWAbsoluteLayout extends XLayoutContainer {
return super.getWidgetPropertyUIProviders();
}
}
}

5
designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java

@ -1222,6 +1222,11 @@ public class XWFitLayout extends XLayoutContainer {
return false;
}
@Override
public boolean isTopable() {
return false;
}
public boolean switch2FitBodyLayout(XCreator creator) {
try {
XWFitLayout xfl = (XWFitLayout) creator.getBackupParent();

4
designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java

@ -251,4 +251,8 @@ public class XWParameterLayout extends XWAbsoluteLayout {
return false;
}
@Override
public boolean isTopable() {
return false;
}
}

1
designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java

@ -189,4 +189,5 @@ public class XWTitleLayout extends DedicateLayoutContainer {
XCreator creator = getPropertyDescriptorCreator();
return creator.getWidgetPropertyUIProviders();
}
}

5
designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java

@ -16,10 +16,7 @@ import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWBorderLayout;
import com.fr.design.designer.creator.XWidgetCreator;
import com.fr.design.designer.properties.mobile.MobileBooKMarkUsePropertyUI;
import com.fr.design.form.util.FormDesignerUtils;
import com.fr.design.form.util.XCreatorConstants;
import com.fr.design.fun.WidgetPropertyUIProvider;
import com.fr.design.icon.IconPathConstants;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.EditingMouseListener;
@ -438,6 +435,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout {
setEditable(isEditing);
selectionModel.selectACreatorAtMouseEvent(e);
editingMouseListener.refreshTopXCreator(isEditing);
designer.repaint();
if (editingMouseListener.stopEditing()) {
@ -514,4 +512,5 @@ public class XWCardMainBorderLayout extends XWBorderLayout {
public boolean isSupportShared() {
return true;
}
}

1
designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java

@ -248,6 +248,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
if (e.getClickCount() <= 1) {
selectionModel.selectACreatorAtMouseEvent(e);
}
editingMouseListener.refreshTopXCreator();
if (editingMouseListener.stopEditing()) {
if (this != designer.getRootComponent()) {
ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, this);

1
designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java

@ -204,6 +204,7 @@ public class XWCardTitleLayout extends XWBorderLayout {
if (e.getClickCount() <= 1) {
selectionModel.selectACreatorAtMouseEvent(e);
}
editingMouseListener.refreshTopXCreator();
if (editingMouseListener.stopEditing()) {
if (this != designer.getRootComponent()) {

4
designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java

@ -639,4 +639,8 @@ public class XWTabFitLayout extends XWFitLayout {
checkVisible();
}
@Override
public boolean isTopable() {
return true;
}
}

8
designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java

@ -4,6 +4,7 @@ import com.fr.design.constants.UIConstants;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.gui.ilable.UILabel;
import com.fr.log.FineLoggerFactory;
import javax.swing.Icon;
import javax.swing.JTree;
@ -23,7 +24,12 @@ public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer {
if (value instanceof XCreator) {
String name = ((XCreator) value).toData().getWidgetName();
setText(name);
Icon icon = XCreatorUtils.getCreatorIcon((XCreator) value);
Icon icon = null;
try {
icon = XCreatorUtils.getCreatorIcon((XCreator) value);
} catch (Exception e) {
FineLoggerFactory.getLogger().info("{} has not icon or has been deleted", name);
}
if (icon != null) {
setIcon(icon);
}

3
designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java

@ -1,5 +1,6 @@
package com.fr.design.form.util;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.JTemplate;
@ -17,7 +18,7 @@ public class FormDesignerUtils {
* @return
*/
public static boolean isAppRelayout(FormDesigner designer) {
if (!designer.getRootComponent().acceptType(WFitLayout.class)) {
if (!designer.getRootComponent().acceptType(XWFitLayout.class)) {
return false;
}
return ((WFitLayout) designer.getRootComponent().toData()).isAppRelayout();

56
designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java

@ -2,7 +2,11 @@ package com.fr.design.mainframe;
import com.fr.design.constants.UIConstants;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.creator.cardlayout.XCardSwitchButton;
import com.fr.design.designer.treeview.ComponentTreeCellRenderer;
import com.fr.design.designer.treeview.ComponentTreeModel;
import com.fr.design.gui.itree.UITreeUI;
@ -15,7 +19,9 @@ import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import java.awt.BorderLayout;
@ -30,6 +36,9 @@ import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;
public class ComponentTree extends JTree {
@ -129,6 +138,7 @@ public class ComponentTree extends JTree {
setSelectionPaths(treepath);
if (treepath.length > 0) {
scrollPathToVisible(treepath[0]);
//expandPath(treepath[0]);
}
}
@ -228,6 +238,52 @@ public class ComponentTree extends JTree {
repaint();
}
/**
* 获得树的展开路径
* */
public void getExpandNodes(List<TreePath> searchList) {
getExpandNodes((XLayoutContainer)designer.getTopContainer(),searchList);
}
public void getExpandNodes(XLayoutContainer container, List<TreePath> searchList) {
TreePath treePath = buildTreePath(container);
if (isExpanded(treePath)) {
searchList.add(treePath);
for (int i = 0, size = container.getXCreatorCount(); i < size; i++) {
XCreator creator = container.getXCreator(i);
if (creator.acceptType(XLayoutContainer.class) || creator.acceptType(XCardSwitchButton.class)) {
getExpandNodes((XLayoutContainer) creator.getXCreator(), searchList);
}
}
}
//对绝对布局做特殊处理
if (container.acceptType(XWFitLayout.class)) {
XWFitLayout bodyFitLayout = (XWFitLayout) container;
for (int j = 0; j < bodyFitLayout.getXCreatorCount(); j++) {
//类型是绝对布局并且还是body
if (bodyFitLayout.getXCreator(j).acceptType(XWAbsoluteBodyLayout.class)) {
container = (XLayoutContainer) bodyFitLayout.getXCreator(j);
getExpandNodes(container, searchList);
}
}
}
}
/**
* 将树按照展开路径进行展开
* */
public void expandNodes(List<TreePath> list){
for(TreePath treePath:list) {
if (treePath.getLastPathComponent() instanceof XLayoutContainer) {
XLayoutContainer creator= (XLayoutContainer) treePath.getLastPathComponent();
if (XCreatorUtils.getParentXLayoutContainer(creator) == null) {
continue;
}
expandPath(treePath);
}
}
}
private TreePath buildTreePath(Component comp) {
ArrayList<Component> path = new ArrayList<Component>();
Component parent = comp;

4
designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java

@ -8,7 +8,7 @@ import com.fr.general.IOUtils;
import com.fr.stable.Constants;
import javax.swing.JPanel;
import javax.swing.JComponent;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
@ -28,7 +28,7 @@ import java.awt.Rectangle;
* Date: 14-7-24
* Time: 上午9:09
*/
public class CoverPane extends JPanel {
public class CoverPane extends JComponent {
private UIButton editButton;
private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);

50
designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java

@ -210,6 +210,7 @@ public class EditingMouseListener extends MouseInputAdapter {
*/
public void mouseReleased(MouseEvent e) {
MouseEvent transEvent = new MouseEvent(e.getComponent(), MouseEvent.MOUSE_CLICKED, e.getWhen(), e.getModifiers(), e.getX(), e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton());
MouseEvent clickEvent = new MouseEvent(e.getComponent(), MouseEvent.MOUSE_CLICKED, e.getWhen(), e.getModifiers(), e.getX(), e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton());
int oldX = e.getX();
int oldY = e.getY();
offsetEventPoint(e);
@ -234,14 +235,21 @@ public class EditingMouseListener extends MouseInputAdapter {
lastPressEvent = null;
lastXCreator = null;
e.translatePoint(oldX - e.getX(), oldY - e.getY());
if (pressX != oldX || pressY != oldY) {
if (isAutoFire(transEvent, clickEvent)) {
// click只有在mouseReleased和mousePressed前后x/y坐标相等时才会被触发在mouseReleased之后
// 但是当使用者来回点击切换时 存在mouseReleased和mousePressed前后x/y坐标不相等的情况 即鼠标按下去的位置和鼠标释放的位置不相等 存在偏移
// 当这种偏移很小时 看起来就好像是点击了 实际上是手抖了或者鼠标轻微滑动了 所以这里对这种情况要有容错处理
mouseClicked(transEvent);
mouseClicked(clickEvent);
}
}
private boolean isAutoFire(MouseEvent transEvent, MouseEvent clickEvent ) {
offsetEventPoint(transEvent);
XCreator xCreator = designer.getComponentAt(transEvent);
return (pressX != clickEvent.getX() || pressY != clickEvent.getY())
&& xCreator != null && xCreator.acceptType(XCardSwitchButton.class);
}
private void mouseDraggingRelease(MouseEvent e) {
// 当前鼠标所在的组件
XCreator hoveredComponent = designer.getComponentAt(e.getX(), e.getY());
@ -355,7 +363,7 @@ public class EditingMouseListener extends MouseInputAdapter {
designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} // component.getParent() 是报表块所在的XWTitleLayout
int minX = button.getX() + getParentPositionX(component, 0) - designer.getHorizontalScaleValue();
int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue();
int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue() + xElementCase.getY();
if (e.getX() + GAP - xElementCase.getInsets().left > minX && e.getX() - GAP - xElementCase.getInsets().left < minX + button.getWidth()) {
if (e.getY() + GAP - xElementCase.getInsets().top > minY && e.getY() - GAP - xElementCase.getInsets().top < minY + button.getHeight()) {
designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
@ -397,16 +405,7 @@ public class EditingMouseListener extends MouseInputAdapter {
}
private void setCoverPaneNotDisplay(XCreator component, MouseEvent e, boolean isLinkedHelpDialog) {
if (xElementCase != null) {
int x = getParentPositionX(xElementCase, 0) - designer.getArea().getHorizontalValue();
int y = getParentPositionY(xElementCase, 0) - designer.getArea().getVerticalValue();
Rectangle rect = new Rectangle(x, y, xElementCase.getWidth(), xElementCase.getHeight());
if (rect.contains(e.getPoint())) {
return;
}
xElementCase.displayCoverPane(false);
}
if (xChartEditor != null) {
xChartEditor.displayCoverPane(false);
}
@ -417,6 +416,15 @@ public class EditingMouseListener extends MouseInputAdapter {
if (xTopLayoutContainer != null) {
xTopLayoutContainer.setMouseEnter(false);
}
//不知道为什么要对XElementCase进行判断,但是直接return会有bug,所以把他放在最后
if (xElementCase != null) {
int x = getParentPositionX(xElementCase, 0) - designer.getArea().getHorizontalValue();
int y = getParentPositionY(xElementCase, 0) - designer.getArea().getVerticalValue();
Rectangle rect = new Rectangle(x, y, xElementCase.getWidth(), xElementCase.getHeight());
if (!rect.contains(e.getPoint())) {
xElementCase.displayCoverPane(false);
}
}
designer.repaint();
}
@ -454,7 +462,7 @@ public class EditingMouseListener extends MouseInputAdapter {
designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
int minX = button.getX() + getParentPositionX(component, 0) - designer.getHorizontalScaleValue();
int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue();
int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue() + xChartEditor.getY();
if (e.getX() + GAP > minX && e.getX() - GAP < minX + button.getWidth()) {
if (e.getY() + GAP > minY && e.getY() - GAP < minY + button.getHeight()) {
designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
@ -692,6 +700,7 @@ public class EditingMouseListener extends MouseInputAdapter {
currentXCreator.stopEditing();
currentXCreator = null;
currentEditor = null;
refreshTopXCreator();
return true;
}
return true;
@ -719,4 +728,19 @@ public class EditingMouseListener extends MouseInputAdapter {
}
currentEditor.getEditorTarget().setBounds(bounds);
}
/**
* 刷新顶层组件
* */
public void refreshTopXCreator(boolean isEditing){
designer.refreshTopXCreator(isEditing);
}
/**
* 刷新顶层组件
* */
public void refreshTopXCreator(){
refreshTopXCreator(false);
}
}

66
designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java

@ -36,6 +36,8 @@ import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.designer.creator.XWBorderLayout;
import com.fr.design.designer.creator.XWParameterLayout;
import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout;
import com.fr.design.designer.creator.cardlayout.XWTabFitLayout;
import com.fr.design.designer.properties.FormWidgetAuthorityEditPane;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.event.DesignerOpenedListener;
@ -121,6 +123,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
private FormArea formArea;
private ConnectorHelper connectorHelper;
private boolean isReportBlockEditing = false;
private TopXCreators topXCreators;
//组件重叠
private boolean isWidgetsIntersect = false;
@ -184,6 +187,9 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
new FormDesignerDropTarget(this);// 添加Drag and Drop.
this.switchAction = switchAction;
topXCreators=new TopXCreators(this);
topXCreators.setVisible(true);
add(topXCreators);
// 必须刷新"参数/控件树"面板,否则,若最近一次打开模版为 cpt,重启设计器,打开 frm,控件树消失
populateParameterPropertyPane();
@ -825,6 +831,46 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
return null;
}
/**
* 从已选择的组件中找x,y所在的组件
*/
private XCreator xCreatorAt(int x, int y, XCreator root) {
XCreator[] xCreators = selectionModel.getSelection().getSelectedCreators();
for (XCreator creator : xCreators) {
boolean shouldContinue = creator == null
|| !creator.isVisible()
|| !XCreatorUtils.containComponent(root, creator);
if (shouldContinue) {
continue;
}
//如果组件为XWCardMainBorderLayout的子组件,直接从XWCardMainBorderLayout中去找
XWCardMainBorderLayout borderLayout = XCreatorUtils.getTopXMainBorderLayout(creator);
if (borderLayout != null) {
return xCreatorAt(x, y, borderLayout, null);
}
if (creator instanceof XLayoutContainer) {
return xCreatorAt(x, y, creator, null);
}
x -= creator.getX();
y -= creator.getY();
Rectangle rect = ComponentUtils.computeVisibleRect(creator);
// 判断是否处于交叉区域
if (!isIntersectArea(x, y, rect)) {
continue;
}
return creator;
}
return null;
}
/**
* 刷新顶层组件
* */
public void refreshTopXCreator(boolean isEditing){
topXCreators.refresh();
topXCreators.setVisible(!isEditing);
}
private boolean isIntersectArea(int x, int y, Rectangle rect) {
return x >= rect.getX() && (x <= (rect.getX() + rect.getWidth())) && (y >= rect.getY())
&& (y <= (rect.getY() + rect.getHeight()));
@ -984,6 +1030,10 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
invalidateLayout();
}
public TopXCreators getTopXCreators() {
return topXCreators;
}
public StateModel getStateModel() {
return stateModel;
}
@ -1001,9 +1051,19 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
return getComponentAt(p.x, p.y);
}
/**
* 先从已选择则的组件中去找再遍历root去找
* */
@Override
public XCreator getComponentAt(int x, int y) {
return getComponentAt(x, y, null);
XLayoutContainer container = y < paraHeight - formArea.getVerticalValue() ? paraComponent : rootComponent;
if (container == null) {
container = rootComponent;
}
int relativeX = x + (int) (formArea.getHorizontalValue() / scale) - container.getX();
int relativeY = y + (int) (formArea.getVerticalValue() / scale) - container.getY();
XCreator result = xCreatorAt(relativeX, relativeY, container);
return result == null ? getComponentAt(x, y, null) : result;
}
@Nullable
@ -1311,6 +1371,10 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
}
}
public void paintTopCreators(Graphics clipg){
topXCreators.paint(clipg);
}
/**
* 重置组件边界
*/

5
designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java

@ -84,6 +84,7 @@ public class FormDesignerUI extends ComponentUI {
// 设计参数面板
repaintPara(g, paraComponent, c);
}
repaintTopXCreators(g);
if (designer.isDrawLineMode() && designer.getDrawLineHelper().drawLining()) {
designer.getDrawLineHelper().drawAuxiliaryLine(g);
@ -445,4 +446,8 @@ public class FormDesignerUI extends ComponentUI {
ComponentUtils.resetBuffer(dbcomponents);
}
private void repaintTopXCreators(Graphics g){
designer.paintTopCreators(g);
}
}

7
designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java

@ -24,12 +24,14 @@ import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.tree.TreePath;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
/**
@ -89,10 +91,13 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree
/**
* 刷新
*/
//TODO 太乱了,需要重写,监听器里加了监听器是什么意思,每次调用该方法都会添加一个新的监听器
public void refreshDockingView() {
FormDesigner formDesigner = this.getEditingFormDesigner();
List<TreePath> list = new ArrayList<>();
removeAll();
if (this.componentTree != null) {
componentTree.getExpandNodes(list);
this.componentTree.removeAll();
}
if (formDesigner == null) {
@ -100,6 +105,8 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree
return;
}
componentTree = new ComponentTree(formDesigner);
//保证删除组件后组件树不收起
componentTree.expandNodes(list);
formDesigner.addDesignerEditListener(new DesignerEditListener() {
@Override
public void fireCreatorModified(DesignerEvent evt) {

68
designer-form/src/main/java/com/fr/design/mainframe/TopXCreator.java

@ -0,0 +1,68 @@
package com.fr.design.mainframe;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.design.utils.ComponentUtils;
import com.fr.stable.CoreGraphHelper;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
/**
* @Author: Yuan.Wang
* @Date: 2020/8/31
*/
public class TopXCreator extends JComponent {
private final FormDesigner designer;
private final XCreator creator;
public TopXCreator(FormDesigner designer, XCreator creator) {
this.designer = designer;
this.creator = creator;
init();
}
private void init() {
setOpaque(false);
setBackground(null);
setLayout(null);
setBounds(calculateBounds());
}
/**
* 重新设置组件大小
* */
public void resizeTopXCreator() {
setBounds(calculateBounds());
}
/**
* 计算显示大小
* */
private Rectangle calculateBounds() {
Rectangle rect = ComponentUtils.getRelativeBounds(creator);
Rectangle bounds = new Rectangle(0, 0, creator.getWidth(), creator.getHeight());
bounds.x += (rect.x - designer.getHorizontalScaleValue());
bounds.y += (rect.y - designer.getVerticalScaleValue());
return bounds;
}
@Override
public void paint(Graphics g) {
super.paint(g);
ArrayList<JComponent> dbcomponents = new ArrayList<JComponent>();
// 禁止双缓冲
ComponentUtils.disableBuffer(creator, dbcomponents);
creator.paint(g);
// 恢复双缓冲
ComponentUtils.resetBuffer(dbcomponents);
}
}

82
designer-form/src/main/java/com/fr/design/mainframe/TopXCreators.java

@ -0,0 +1,82 @@
package com.fr.design.mainframe;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.beans.models.SelectionModel;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout;
import javax.swing.*;
import java.awt.*;
/**
* 需要显示顶层的组件层
*
* @Author: Yuan.Wang
* @Date: 2020/8/25
*/
public class TopXCreators extends JComponent {
final private FormDesigner designer;
public TopXCreators(FormDesigner designer) {
this.designer = designer;
init();
}
private void init() {
setLayout(null);
setVisible(false);
setBackground(null);
setOpaque(false);
designer.addDesignerEditListener(e -> {
if (e.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED) {
refresh();
}
});
}
/**
* 选中的组件有变化时刷新
*/
public void refresh() {
removeAll();
addXCreators();
}
@Override
public void paint(Graphics g) {
setSize(designer.getSize());
resizeTopXCreators();
super.paint(g);
}
/**
* 加入被选择的组件
*/
private void addXCreators() {
SelectionModel selectionModel = designer.getSelectionModel();
XCreator[] xCreators = selectionModel.getSelection().getSelectedCreators();
for (XCreator creator : xCreators) {
if (!creator.isTopable()) {
continue;
}
XWCardMainBorderLayout topXMainBorderLayout = XCreatorUtils.getTopXMainBorderLayout(creator);
add(new TopXCreator(designer, creator));
if (topXMainBorderLayout != null) {
add(new TopXCreator(designer, topXMainBorderLayout));
}
}
}
/**
* 更新顶层组件的位置和大小
*/
private void resizeTopXCreators() {
for (int i = 0, count = getComponentCount(); i < count; i++) {
TopXCreator topXCreator = (TopXCreator) getComponent(i);
topXCreator.resizeTopXCreator();
}
}
}

48
designer-form/src/main/java/com/fr/design/mainframe/widget/UITreeComboBox.java

@ -3,16 +3,8 @@ package com.fr.design.mainframe.widget;
/**
* Created by xiaxiang on 2016/9/30.
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import javax.swing.plaf.metal.*;
import javax.swing.tree.*;
import com.fr.design.constants.UIConstants;
import com.fr.design.designer.beans.*;
import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.events.DesignerEditListener;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.XCreator;
@ -20,8 +12,36 @@ import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.icombobox.UIComboBoxUI;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.mainframe.ComponentTree;
import com.sun.java.swing.plaf.motif.*;
import com.sun.java.swing.plaf.windows.*;
import com.sun.java.swing.plaf.motif.MotifComboBoxUI;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.ListCellRenderer;
import javax.swing.MenuSelectionManager;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.ComboBoxUI;
import javax.swing.plaf.basic.ComboPopup;
import javax.swing.plaf.metal.MetalComboBoxUI;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
/**
* 控件树下拉列表框
@ -111,12 +131,6 @@ public class UITreeComboBox extends UIComboBox {
}
}
class WindowsJTreeComboBoxUI extends WindowsComboBoxUI{
protected ComboPopup createPopup() {
return new TreePopup(comboBox);
}
}
class UIJTreeComboBoxUI extends UIComboBoxUI {
protected ComboPopup createPopup() {
return new TreePopup(comboBox);

9
designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java

@ -456,12 +456,17 @@ public class JWorkBook extends JTemplate<WorkBook, WorkBookUndoState> {
grid.setHorizontalExtent(GridUtils.getExtentValue(0, columnWidthList, grid.getWidth(), resolution));
elementCasePane.getGrid().updateUI();
//更新Column和Row
((DynamicScrollBar) elementCasePane.getVerticalScrollBar()).setDpi(resolution);
((DynamicScrollBar) elementCasePane.getHorizontalScrollBar()).setDpi(resolution);
DynamicScrollBar verticalScrollBar = (DynamicScrollBar) elementCasePane.getVerticalScrollBar();
DynamicScrollBar horizontalScrollBar = (DynamicScrollBar) elementCasePane.getHorizontalScrollBar();
verticalScrollBar.setDpi(resolution);
horizontalScrollBar.setDpi(resolution);
elementCasePane.getGridColumn().setResolution(resolution);
elementCasePane.getGridColumn().updateUI();
elementCasePane.getGridRow().setResolution(resolution);
elementCasePane.getGridRow().updateUI();
//Yvan:更新滚动条值(主要是为了重置滚动条里的BoundedRangeModel的extent值),使之随着界面缩放
verticalScrollBar.setValue(verticalScrollBar.getValue());
horizontalScrollBar.setValue(horizontalScrollBar.getValue());
}
if (polyDezi != null) {
polyDezi.setResolution(resolution);

4
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java

@ -49,9 +49,7 @@ public class BottomModel extends AlphaCellModel {
public void doAction() {
try {
Desktop.getDesktop().browse(new URI(AlphaFineConstants.ALPHA_GO_TO_FORUM));
} catch (IOException e) {
FineLoggerFactory.getLogger().error(e.getMessage());
} catch (URISyntaxException e) {
} catch (IOException | URISyntaxException e) {
FineLoggerFactory.getLogger().error(e.getMessage());
}
}

24
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java

@ -106,11 +106,10 @@ public class ContentCellRender implements ListCellRenderer<Object> {
if (strings == null) {
return modelName;
}
for (int i = 0; i < strings.length; i++) {
String primaryStr = getReplacedString(modelName, strings[i]);
modelName = modelName.replaceAll("(?i)" + strings[i], "|<font color=" + AlphaFineConstants.HIGH_LIGHT_COLOR + ">" + strings[i] + "</font>|");
for (String string : strings) {
String primaryStr = getReplacedString(modelName, string);
if (StringUtils.isNotEmpty(primaryStr)) {
modelName = modelName.replaceAll(strings[i], primaryStr);
modelName = modelName.replaceAll("(?i)" + primaryStr, "|<font color=" + AlphaFineConstants.HIGH_LIGHT_COLOR + ">" + primaryStr + "</font>|");
}
}
modelName = "<html><head><style> .style{" +
@ -121,13 +120,24 @@ public class ContentCellRender implements ListCellRenderer<Object> {
return modelName;
}
private String getReplacedString(String modelName, String string) {
int index = modelName.toLowerCase().indexOf(string.toLowerCase());
//需要考虑modelName有空格的情况
//比如现在是work boo k 搜索词是workb,应该要替换的部分是work b
//先去掉空格进行匹配
String noBlackName = modelName.replaceAll(StringUtils.BLANK, StringUtils.EMPTY).toLowerCase();
int index = noBlackName.indexOf(string.toLowerCase());
if (index == -1) {
return StringUtils.EMPTY;
}
return modelName.substring(index, index + string.length());
StringBuilder result = new StringBuilder();
int count = 0;
while (count < string.length()) {
char pos = modelName.charAt(index++);
result.append(pos);
count += pos == ' ' ? 0 : 1;
}
return result.toString();
}

168
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java

@ -162,19 +162,15 @@ public class AlphaFineDialog extends UIDialog {
* @return
*/
public static AWTEventListener listener() {
return new AWTEventListener() {
@Override
public void eventDispatched(AWTEvent event) {
if (event instanceof KeyEvent) {
KeyEvent e = (KeyEvent) event;
KeyStroke keyStroke = (KeyStroke) KeyStroke.getAWTKeyStrokeForEvent(e);
KeyStroke storeKeyStroke = DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().getShortCutKeyStore();
if (ComparatorUtils.equals(keyStroke.toString(), storeKeyStroke.toString()) && AlphaFineConfigManager.isALPHALicAvailable() && AlphaFinePane.getAlphaFinePane().isVisible()) {
doClickAction();
}
return event -> {
if (event instanceof KeyEvent) {
KeyEvent e = (KeyEvent) event;
KeyStroke keyStroke = (KeyStroke) KeyStroke.getAWTKeyStrokeForEvent(e);
KeyStroke storeKeyStroke = DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().getShortCutKeyStore();
if (ComparatorUtils.equals(keyStroke.toString(), storeKeyStroke.toString()) && AlphaFineConfigManager.isALPHALicAvailable() && AlphaFinePane.getAlphaFinePane().isVisible()) {
doClickAction();
}
}
};
}
@ -300,7 +296,7 @@ public class AlphaFineDialog extends UIDialog {
if (winSize.width > screenSize.width) {
winSize.width = screenSize.width;
}
//这里设置位置:水平居中,竖直偏上
//这里设置位置:水平居中,竖直偏上
win.setLocation((screenSize.width - winSize.width) / 2, (screenSize.height - winSize.height) / AlphaFineConstants.SHOW_SIZE);
}
@ -513,7 +509,8 @@ public class AlphaFineDialog extends UIDialog {
* @return
*/
private String getStoreText(String searchText) {
setStoreText(searchText.substring(searchText.indexOf(StringUtils.BLANK) + 1, searchText.length()));
//这里也需要先做一个去除不需要空格的处理
setStoreText((searchText.substring(searchText.indexOf(StringUtils.BLANK) + 1)).replaceAll(StringUtils.BLANK, StringUtils.EMPTY));
return storeText;
}
@ -616,9 +613,7 @@ public class AlphaFineDialog extends UIDialog {
rightSearchResultPane.removeAll();
try {
rightSearchResultPane.add(new FilePreviewPane(get()));
} catch (InterruptedException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
} catch (ExecutionException e) {
} catch (InterruptedException | ExecutionException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
validate();
@ -651,9 +646,7 @@ public class AlphaFineDialog extends UIDialog {
rightSearchResultPane.add(new FilePreviewPane(get()));
validate();
repaint();
} catch (InterruptedException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
} catch (ExecutionException e) {
} catch (InterruptedException | ExecutionException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
@ -819,56 +812,52 @@ public class AlphaFineDialog extends UIDialog {
}
});
Timer timer = new Timer(TIMER_DELAY, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!alreadyInitHot && StringUtils.isEmpty(searchTextField.getText())) {
alreadyInitHot = true;
Timer timer = new Timer(TIMER_DELAY, e -> {
if (!alreadyInitHot && StringUtils.isEmpty(searchTextField.getText())) {
alreadyInitHot = true;
removeSearchResult();
refreshContainer();
if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) {
initHotPane();
setSize(AlphaFineConstants.FULL_SIZE);
} else {
setSize(AlphaFineConstants.FIELD_SIZE);
}
refreshContainer();
return;
} else if (beforeSearchStr.equals(searchTextField.getText()) && StringUtils.isNotEmpty(beforeSearchStr)) {
if (alreadySearch) {
return;
} else {
removeHotPane();
removeSearchResult();
refreshContainer();
if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) {
initHotPane();
setSize(AlphaFineConstants.FULL_SIZE);
} else {
setSize(AlphaFineConstants.FIELD_SIZE);
}
refreshContainer();
return;
} else if (beforeSearchStr.equals(searchTextField.getText()) && StringUtils.isNotEmpty(beforeSearchStr)) {
if (alreadySearch) {
return;
if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedSegmentationCheckbox()) {
//是高级搜索
if (searchTextField.getText().toLowerCase().startsWith(ADVANCED_SEARCH_MARK)) {
segmentationResult = SegmentationManager.getInstance().startSegmentation(getStoreText(searchTextField.getText().toLowerCase()));
}
//是普通搜索
else {
segmentationResult = SegmentationManager.getInstance().startSegmentation(searchTextField.getText().toLowerCase());
}
} else {
removeHotPane();
removeSearchResult();
refreshContainer();
if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedSegmentationCheckbox()) {
//是高级搜索
if (searchTextField.getText().toLowerCase().startsWith(ADVANCED_SEARCH_MARK)) {
segmentationResult = SegmentationManager.getInstance().startSegmentation(getStoreText(searchTextField.getText().toLowerCase()));
}
//是普通搜索
else {
segmentationResult = SegmentationManager.getInstance().startSegmentation(searchTextField.getText().toLowerCase());
}
if (StringUtils.isEmpty(getRealSearchText(searchTextField.getText()))) {
segmentationResult = null;
} else {
if (StringUtils.isEmpty(getRealSearchText(searchTextField.getText()))) {
segmentationResult = null;
} else {
segmentationResult = new String[]{getRealSearchText(searchTextField.getText())};
}
segmentationResult = new String[]{getRealSearchText(searchTextField.getText())};
}
doSearch(searchTextField.getText().toLowerCase());
alreadySearch = true;
}
} else {
beforeSearchStr = searchTextField.getText();
alreadySearch = false;
}
if (beforeSearchStr.equals(searchTextField.getText()) && beforeSearchStr.length() != 0) {
alreadyInitHot = false;
doSearch(searchTextField.getText().toLowerCase());
alreadySearch = true;
}
} else {
beforeSearchStr = searchTextField.getText();
alreadySearch = false;
}
if (beforeSearchStr.equals(searchTextField.getText()) && beforeSearchStr.length() != 0) {
alreadyInitHot = false;
}
});
timer.start();
}
@ -880,7 +869,7 @@ public class AlphaFineDialog extends UIDialog {
searchText = searchText.toLowerCase();
Pattern p = Pattern.compile(AlphaFineConstants.SPECIAL_CHARACTER_REGEX);
Matcher m = p.matcher(searchText);
searchText = m.replaceAll("").trim().replaceAll(" ", "");
searchText = m.replaceAll(StringUtils.EMPTY).trim().replaceAll(StringUtils.BLANK, StringUtils.EMPTY);
if (searchText.length() == 0) {
return null;
}
@ -901,22 +890,19 @@ public class AlphaFineDialog extends UIDialog {
* 当鼠标在搜索界面边界外点击时触发
*/
private void initAWTEventListener() {
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
@Override
public void eventDispatched(AWTEvent event) {
if (!AlphaFineDialog.this.isVisible()) {
return;
}
if (event instanceof MouseEvent) {
MouseEvent k = (MouseEvent) event;
if (SwingUtilities.isLeftMouseButton(k)) {
Point p = k.getLocationOnScreen();
Rectangle dialogRectangle = AlphaFineDialog.this.getBounds();
Rectangle paneRectangle = new Rectangle(AlphaFinePane.getAlphaFinePane().getLocationOnScreen(), AlphaFinePane.getAlphaFinePane().getSize());
if (!dialogRectangle.contains(p) && !paneRectangle.contains(p) && !forceOpen) {
AlphaFineDialog.this.dispose();
forceOpen = false;
}
Toolkit.getDefaultToolkit().addAWTEventListener(event -> {
if (!AlphaFineDialog.this.isVisible()) {
return;
}
if (event instanceof MouseEvent) {
MouseEvent k = (MouseEvent) event;
if (SwingUtilities.isLeftMouseButton(k)) {
Point p = k.getLocationOnScreen();
Rectangle dialogRectangle = AlphaFineDialog.this.getBounds();
Rectangle paneRectangle = new Rectangle(AlphaFinePane.getAlphaFinePane().getLocationOnScreen(), AlphaFinePane.getAlphaFinePane().getSize());
if (!dialogRectangle.contains(p) && !paneRectangle.contains(p) && !forceOpen) {
AlphaFineDialog.this.dispose();
forceOpen = false;
}
}
}
@ -925,7 +911,7 @@ public class AlphaFineDialog extends UIDialog {
@Override
public void checkValid() throws Exception {
//不处理
//不处理
}
/**
@ -948,14 +934,11 @@ public class AlphaFineDialog extends UIDialog {
if (cellModel instanceof BottomModel) {
return;
}
Thread sendThread = new Thread(new Runnable() {
@Override
public void run() {
if (StringUtils.isNotEmpty(storeText)) {
RecentSearchManager searchManager = RecentSearchManager.getInstance();
searchManager.addModel(storeText, cellModel);
sendDataToServer(storeText, cellModel);
}
Thread sendThread = new Thread(() -> {
if (StringUtils.isNotEmpty(storeText)) {
RecentSearchManager searchManager = RecentSearchManager.getInstance();
searchManager.addModel(storeText, cellModel);
sendDataToServer(storeText, cellModel);
}
});
sendThread.start();
@ -1182,12 +1165,9 @@ public class AlphaFineDialog extends UIDialog {
}
});
addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting() && getSelectedValue() != null) {
showResult(getSelectedValue());
}
addListSelectionListener(e -> {
if (!e.getValueIsAdjusting() && getSelectedValue() != null) {
showResult(getSelectedValue());
}
});

2
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/PluginPreviewPane.java

@ -49,7 +49,7 @@ public class PluginPreviewPane extends JPanel {
nameLabel.setBackground(AlphaFineConstants.BLUE);
nameLabel.setBorder(BorderFactory.createEmptyBorder(20, 20, 10, 20));
line.setBorder(BorderFactory.createEmptyBorder(20, 0, 10, 0));
String price0 = price == 0 ? com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Collect_Information_free") : "¥" + String.valueOf(price);
String price0 = price == 0 ? com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Collect_Information_free") : "¥" + price;
UILabel priceLabel = new UILabel(price0);
priceLabel.setForeground(AlphaFineConstants.RED);
priceLabel.setFont(AlphaFineConstants.MEDIUM_FONT);

4
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java

@ -61,9 +61,7 @@ public class RobotPreviewPane extends JPanel {
.replaceAll("'\\)", StringUtils.EMPTY);
try {
Desktop.getDesktop().browse(new URI(AlphaFineConstants.ALPHA_PREVIEW + URLEncoder.encode(s, EncodeConstants.ENCODING_UTF_8)));
} catch (IOException e1) {
FineLoggerFactory.getLogger().error(e1.getMessage());
} catch (URISyntaxException e1) {
} catch (IOException | URISyntaxException e1) {
FineLoggerFactory.getLogger().error(e1.getMessage());
}
}

12
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java

@ -33,7 +33,7 @@ public class FileSearchManager implements AlphaFineSearchProvider {
private FileNode[] fileNodes = null;
//停止搜索
//隐藏的搜索功能,可根据特殊的字符标记判断搜索分类
//隐藏的搜索功能,可根据特殊的字符标记判断搜索分类
private boolean isContainCpt = true;
private boolean isContainFrm = true;
@ -108,20 +108,22 @@ public class FileSearchManager implements AlphaFineSearchProvider {
private void doSearch(String searchText) {
if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainTemplate()) {
for (FileNode node : fileNodes) {
if (node.getName().toLowerCase().contains(searchText)) {
String name = node.getName().toLowerCase();
name = name.replaceAll(StringUtils.BLANK, StringUtils.EMPTY);
if (name.contains(searchText)) {
FileModel model = new FileModel(node.getName(), node.getEnvPath());
if (!AlphaFineHelper.getFilterResult().contains(model)) {
AlphaFineHelper.checkCancel();
filterModelList.add(model);
}
}
}
}
}
/**
* 搜索模板内容
*
* @param searchText
*/
private void doFileContentSearch(String searchText) {
@ -140,10 +142,10 @@ public class FileSearchManager implements AlphaFineSearchProvider {
private String dealWithSearchText(String searchText) {
if (searchText.startsWith(FRM_PREFIX)) {
isContainCpt = false;
searchText = searchText.substring(MARK_LENGTH, searchText.length());
searchText = searchText.substring(MARK_LENGTH);
} else if (searchText.startsWith(CPT_PREFIX)) {
isContainFrm = false;
searchText = searchText.substring(MARK_LENGTH, searchText.length());
searchText = searchText.substring(MARK_LENGTH);
}
return searchText;
}

5
designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java

@ -42,10 +42,7 @@ public class SegmentationManager {
count = count + 1;
}
}
if (count >= MAX_CHINESE_CHARACTERS_NUM) {
return true;
}
return false;
return count >= MAX_CHINESE_CHARACTERS_NUM;
}
/**

2
designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java

@ -199,7 +199,7 @@ public class UserInfoLabel extends UILabel {
this.addMouseListener(userInfoAdapter);
this.setHorizontalAlignment(SwingConstants.CENTER);
if (StableUtils.getMajorJavaVersion() == VERSION_8) {
if (StableUtils.getMajorJavaVersion() >= VERSION_8) {
LoginWebBridge.getHelper().setUILabel(UserInfoLabel.this);
PluginWebBridge.getHelper().setUILabel(UserInfoLabel.this);
}

5
designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java

@ -4,6 +4,7 @@ import com.fr.base.io.IOFile;
import com.fr.base.io.XMLReadHelper;
import com.fr.config.MarketConfig;
import com.fr.design.DesignerEnvManager;
import com.fr.design.i18n.Toolkit;
import com.fr.web.session.SessionLocalManager;
import com.fr.stable.StableUtils;
@ -31,6 +32,7 @@ public class ErrorInfoLogAppender extends AppenderSkeleton {
private static final int ERROR_LEN = 8;
private static final int ERROR_STACK_TRACE = 15;
private static final String ERROR_CODE = Toolkit.i18nText("Fine-Design_Report_Engine_ErrorCode_Prefix") + ".*?[:,:]";
// 缓存下不变的, 没必要频繁取.
private String username;
@ -92,9 +94,8 @@ public class ErrorInfoLogAppender extends AppenderSkeleton {
}
private String readLogID(String log) {
String errorCode = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ErrorCode_Prefix");
// 报错信息国际化不规范, 有些是中文分号, 有些是英文
String[] matchs = log.split(errorCode + ".*?[:,:]");
String[] matchs = log.split(ERROR_CODE);
if (matchs.length <= 1) {
return StringUtils.EMPTY;
}

28
designer-realize/src/main/java/com/fr/poly/PolyComponentsBar.java

@ -12,19 +12,12 @@ import com.fr.design.gui.itooltip.MultiLineToolTip;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.dnd.SerializableTransferable;
import com.fr.log.FineLoggerFactory;
import com.fr.report.poly.PolyECBlock;
import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.JToolTip;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
@ -147,25 +140,4 @@ public class PolyComponentsBar extends JToolBar {
}
}
/**
* 测试下
*
* @param args 参数
*/
public static void main(String... args) {
try {
UIManager.setLookAndFeel(new WindowsLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
JFrame f = new JFrame();
JPanel p = (JPanel) f.getContentPane();
p.setLayout(FRGUIPaneFactory.createBorderLayout());
PolyComponentsBar pbp = new PolyComponentsBar();
p.add(pbp, BorderLayout.CENTER);
f.setSize(400, 300);
f.setVisible(true);
}
}

208
designer-realize/src/main/java/com/fr/start/fx/FastGifImage.java

@ -1,208 +0,0 @@
package com.fr.start.fx;
import com.sun.imageio.plugins.gif.GIFImageReader;
import com.sun.imageio.plugins.gif.GIFImageReaderSpi;
import com.sun.javafx.tk.ImageLoader;
import com.sun.javafx.tk.PlatformImage;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.image.WritableImage;
import javafx.util.Duration;
import javax.imageio.stream.FileImageInputStream;
import java.io.File;
import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.regex.Pattern;
/**
* 边加载边播放的gif加载器
*
* @author daniel
*/
public class FastGifImage extends WritableImage {
private String url;
private int gifCount;
public FastGifImage(String url, int w, int h) {
super(w, h);
this.url = validateUrl(url);
seekCount();
initialize();
}
/**
* 给出gif帧数加快加载速度
*
* @param url gif url
* @param gifCount gif帧数
* @param w
* @param h
*/
public FastGifImage(String url, int gifCount, int w, int h) {
super(w, h);
this.url = validateUrl(url);
this.gifCount = gifCount;
initialize();
}
private void seekCount() {
try {
GIFImageReaderSpi spi = new GIFImageReaderSpi();
GIFImageReader gifReader = (GIFImageReader) spi.createReaderInstance();
gifReader.setInput(new FileImageInputStream(new File(new URI(url))));
gifCount = gifReader.getNumImages(true);
} catch (Exception e) {
e.printStackTrace();
}
}
private static final Pattern URL_QUICKMATCH = Pattern.compile("^\\p{Alpha}[\\p{Alnum}+.-]*:.*$");
private static String validateUrl(final String url) {
if (url == null) {
throw new NullPointerException("URL must not be null");
}
if (url.trim().isEmpty()) {
throw new IllegalArgumentException("URL must not be empty");
}
try {
if (!URL_QUICKMATCH.matcher(url).matches()) {
final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
URL resource;
if (url.charAt(0) == '/') {
resource = contextClassLoader.getResource(url.substring(1));
} else {
resource = contextClassLoader.getResource(url);
}
if (resource == null) {
throw new IllegalArgumentException("Invalid URL or resource not found");
}
return resource.toString();
}
// Use URL constructor for validation
return new URL(url).toString();
} catch (final IllegalArgumentException e) {
throw new IllegalArgumentException("Invalid URL" + e.getMessage());
} catch (final MalformedURLException e) {
throw new IllegalArgumentException("Invalid URL" + e.getMessage());
}
}
private void finishImage(ImageLoader loader) {
initializeAnimatedImage(loader);
}
// Generates the animation Timeline for multiframe images.
private void initializeAnimatedImage(ImageLoader loader) {
animation = new Animation(this, loader);
animation.start();
}
// Support for animated images.
private Animation animation;
private static final class Animation {
final WeakReference<FastGifImage> imageRef;
final Timeline timeline;
private ImageLoader loader;
public Animation(final FastGifImage image, final ImageLoader loader) {
this.loader = loader;
imageRef = new WeakReference<FastGifImage>(image);
timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
final int frameCount = loader.getFrameCount();
int duration = 0;
for (int i = 0; i < frameCount; ++i) {
addKeyFrame(i, duration);
duration = duration + loader.getFrameDelay(i);
}
// Note: we need one extra frame in the timeline to define how long
// the last frame is shown, the wrap around is "instantaneous"
addKeyFrame(0, duration);
}
public void start() {
timeline.play();
}
public void stop() {
timeline.stop();
loader = null;
}
private void updateImage(final int frameIndex) {
final FastGifImage image = imageRef.get();
if (image != null) {
image.setPlatformImagePropertyImpl(
loader.getFrame(frameIndex));
} else {
timeline.stop();
}
}
private void addKeyFrame(final int index, final double duration) {
timeline.getKeyFrames().add(
new KeyFrame(Duration.millis(duration),
new EventHandler() {
@Override
public void handle(Event event) {
updateImage(index);
}
}
));
}
}
private static Method method;
static {
try {
method = FastGifImage.class.getSuperclass().getSuperclass().getDeclaredMethod("platformImagePropertyImpl");
method.setAccessible(true);
} catch (Exception e) {
}
}
private void setPlatformImagePropertyImpl(PlatformImage image) {
try {
Object o = method.invoke(this);
Method method = o.getClass().getDeclaredMethod("set", Object.class);
method.setAccessible(true);
method.invoke(o, image);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
private void initialize() {
finishImage(new PrismImageLoader2(url, gifCount, (int) getRequestedWidth(), (int) getRequestedHeight(), isPreserveRatio(), isSmooth()));
}
/**
* 销毁gif动画
*/
public void destroy() {
animation.stop();
}
}

208
designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java

@ -1,208 +0,0 @@
package com.fr.start.fx;
import com.fr.concurrent.NamedThreadFactory;
import com.fr.log.FineLoggerFactory;
import com.sun.javafx.iio.ImageFrame;
import com.sun.javafx.iio.ImageLoadListener;
import com.sun.javafx.iio.ImageLoader;
import com.sun.javafx.iio.ImageMetadata;
import com.sun.javafx.iio.ImageStorageException;
import com.sun.javafx.iio.common.ImageTools;
import com.sun.javafx.iio.gif.GIFImageLoaderFactory;
import com.sun.javafx.tk.PlatformImage;
import com.sun.prism.Image;
import com.sun.prism.impl.PrismSettings;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 边加载边播放的gif加载器
*
* @author daniel
*/
class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader {
private Image[] images;
private int[] delayTimes;
private int width;
private int height;
private int gifCount = 1;
private Exception exception;
public PrismImageLoader2(final String url, int gifCount, final int width, final int height,
final boolean preserveRatio, final boolean smooth) {
this.gifCount = gifCount;
images = new Image[gifCount];
delayTimes = new int[gifCount];
this.width = width;
this.height = height;
ExecutorService es = Executors.newSingleThreadExecutor(new NamedThreadFactory("PrismImageLoader2"));
es.execute(new Runnable() {
@Override
public void run() {
InputStream inputStream = null;
try {
inputStream = ImageTools.createInputStream(url);
loadAll(inputStream, width, height, preserveRatio, smooth);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
es.shutdown();
}
@Override
public int getWidth() {
return width;
}
@Override
public int getHeight() {
return height;
}
@Override
public int getFrameCount() {
return gifCount;
}
@Override
@SuppressWarnings("squid:S2142")
public PlatformImage getFrame(int index) {
while (images[index] == null) {
synchronized (this) {
if (images[index] == null) {
try {
this.wait();
} catch (InterruptedException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
}
}
return images[index];
}
@Override
public int getFrameDelay(int index) {
// while (images[0] == null) {
// synchronized (this) {
// if(images[0] == null) {
// try {
// this.wait();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }
// return 0;
// }
// return delayTimes[0];
// 直接使用第一帧的时间
return 40;
}
@Override
public int getLoopCount() {
return 0;
}
@Override
public Exception getException() {
return exception;
}
@SuppressWarnings("squid:S244")
private void loadAll(InputStream stream, int w, int h,
boolean preserveRatio, boolean smooth) {
ImageLoadListener listener = new PrismLoadListener();
try {
ImageLoader loader = null;
loader = GIFImageLoaderFactory.getInstance().createImageLoader(stream);
loader.addListener(listener);
for (int i = 0; i < gifCount; i++) {
ImageFrame imageFrame = loader.load(i, w, h, preserveRatio, smooth);
images[i] = convert(imageFrame);
synchronized (this) {
notifyAll();
}
}
} catch (ImageStorageException e) {
handleException(e);
} catch (Exception e) {
handleException(e);
}
}
private void handleException(final ImageStorageException isException) {
// unwrap ImageStorageException if possible
final Throwable exceptionCause = isException.getCause();
if (exceptionCause instanceof Exception) {
handleException((Exception) exceptionCause);
} else {
handleException((Exception) isException);
}
}
private void handleException(final Exception exception) {
if (PrismSettings.verbose) {
exception.printStackTrace(System.err);
}
this.exception = exception;
}
private Image convert(ImageFrame imgFrames) {
ImageFrame frame = imgFrames;
Image image = Image.convertImageFrame(frame);
ImageMetadata metadata = frame.getMetadata();
if (metadata != null) {
Integer delay = metadata.delayTime;
if (delay != null) {
delayTimes[0] = delay.intValue();
}
}
return image;
}
private class PrismLoadListener implements ImageLoadListener {
@Override
public void imageLoadWarning(ImageLoader loader, String message) {
}
@Override
public void imageLoadProgress(ImageLoader loader,
float percentageComplete) {
// progress only matters when backgroundLoading=true, but
// currently we are relying on AbstractRemoteResource for tracking
// progress of the InputStream, so there's no need to implement
// this for now; eventually though we might want to consider
// moving away from AbstractRemoteResource and instead use
// the built-in support for progress in the javafx-iio library...
}
@Override
public void imageLoadMetaData(ImageLoader loader, ImageMetadata metadata) {
// We currently have no need to listen for ImageMetadata ready.
}
}
}

59
designer-realize/src/main/java/com/fr/start/fx/SplashFx.java

@ -1,59 +0,0 @@
package com.fr.start.fx;
import com.fr.concurrent.NamedThreadFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.start.SplashFxActionListener;
import com.fr.start.SplashStrategy;
import javafx.application.Application;
import javafx.application.Platform;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* JavaFx方式启动启动动画这种方式在mac下与
* swing一起启动会会出现线程死锁jvm等问题
* 所以这个方式仅用于windows上
*
* @author vito
* @date 2018/6/4
* @see com.fr.start.jni.SplashMac
*/
public class SplashFx implements SplashStrategy {
private SplashFxWindow fxWindow;
private static final ExecutorService SERVICE = Executors.newSingleThreadExecutor(new NamedThreadFactory("SplashFx"));
@Override
public void show() {
Platform.setImplicitExit(false);
SERVICE.execute(new Runnable() {
@Override
public void run() {
Application.launch(SplashFxWindow.class);
}
});
fxWindow = SplashFxWindow.waitForStartUpTest();
fxWindow.addSplashActionListener(new SplashFxActionListener() {
@Override
public void splashClose() {
DesignerContext.getDesignerFrame().setVisible(true);
}
});
}
@Override
public void hide() {
fxWindow.close();
}
@Override
public void updateModuleLog(final String text) {
fxWindow.updateModuleInfo(text);
}
@Override
public void updateThanksLog(final String text) {
fxWindow.updateThanks(text);
}
}

194
designer-realize/src/main/java/com/fr/start/fx/SplashFxWindow.java

@ -1,194 +0,0 @@
package com.fr.start.fx;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.OperatingSystem;
import com.fr.start.SplashContext;
import com.fr.start.SplashFxActionListener;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
/**
* JavaFx启动动画窗口
*
* @author vito
*/
public class SplashFxWindow extends Application {
private static final String ARIAL_FONT_NAME = "Arial";
private static final String PF_FONT_NAME = "PingFang";
private static final String YAHEI_FONT_NAME = "Microsoft YaHei";
private static final int MODULE_INFO_LEFT_MARGIN = 36;
private static final int MODULE_INFO_BOTTOM_MARGIN = 28;
private static final int THINKS_BOTTOM_RIGHT = 35;
private static final int THINKS_BOTTOM_MARGIN = 27;
private static final int WINDOW_WIDTH = 640;
private static final int WINDOW_HEIGHT = 360;
private static final int FONT = 12;
private static final int FRAME_COUNT = 315;
private static final String THINKS_COLOR = "#82b1ce";
private static final CountDownLatch LATCH = new CountDownLatch(1);
private static SplashFxWindow app = null;
private Text moduleInfo;
private Text thanks;
private FastGifImage image;
private List<SplashFxActionListener> listeners = new ArrayList<SplashFxActionListener>();
/**
* 获取当前运行实例黑科技
*
* @return 运行实例
*/
@SuppressWarnings("squid:S2142")
public static SplashFxWindow waitForStartUpTest() {
try {
LATCH.await();
} catch (InterruptedException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
return app;
}
private static void setApp(SplashFxWindow window) {
app = window;
LATCH.countDown();
}
public SplashFxWindow() {
setApp(this);
}
@Override
public void start(Stage primaryStage) {
AnchorPane root = new AnchorPane();
primaryStage.initStyle(StageStyle.TRANSPARENT);
image = new FastGifImage(SplashContext.SPLASH_PATH, FRAME_COUNT, WINDOW_WIDTH, WINDOW_HEIGHT);
ImageView gif = new ImageView(image);
AnchorPane.setBottomAnchor(gif, 0d);
AnchorPane.setTopAnchor(gif, 0d);
AnchorPane.setLeftAnchor(gif, 0d);
AnchorPane.setRightAnchor(gif, 0d);
Font font;
if (OperatingSystem.isWindows()) {
font = new Font(YAHEI_FONT_NAME, FONT);
} else if (OperatingSystem.isMacOS()) {
font = new Font(PF_FONT_NAME, FONT);
} else {
font = new Font(ARIAL_FONT_NAME, FONT);
}
moduleInfo = new Text();
moduleInfo.setFont(font);
moduleInfo.setFill(Color.WHITE);
AnchorPane.setLeftAnchor(moduleInfo,(double) MODULE_INFO_LEFT_MARGIN);
AnchorPane.setBottomAnchor(moduleInfo,(double) MODULE_INFO_BOTTOM_MARGIN);
thanks = new Text();
thanks.setFont(font);
thanks.setFill(Color.valueOf(THINKS_COLOR));
AnchorPane.setRightAnchor(thanks, (double) THINKS_BOTTOM_RIGHT);
AnchorPane.setBottomAnchor(thanks, (double) THINKS_BOTTOM_MARGIN);
root.getChildren().add(gif);
root.getChildren().add(moduleInfo);
root.getChildren().add(thanks);
primaryStage.setWidth(WINDOW_WIDTH);
primaryStage.setHeight(WINDOW_HEIGHT);
primaryStage.setScene(new Scene(root, WINDOW_WIDTH, WINDOW_HEIGHT, null));
setWindowCenter(primaryStage);
primaryStage.show();
}
public void close() {
Platform.runLater(new Runnable() {
@Override
public void run() {
try {
((Stage) moduleInfo.getScene().getWindow()).close();
image.destroy();
fireSplashClose();
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
});
}
/**
* 设置窗口居中
*
* @param stage 窗口
*/
private void setWindowCenter(Stage stage) {
Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
stage.setX(primaryScreenBounds.getMinX() + (primaryScreenBounds.getWidth() - stage.getWidth()) / 2.0);
stage.setY(primaryScreenBounds.getMinY() + (primaryScreenBounds.getHeight() - stage.getHeight()) / 2.0);
}
/**
* 更新模块信息
*
* @param s 文字
*/
public void updateModuleInfo(final String s) {
Platform.runLater(new Runnable() {
@Override
public void run() {
if (moduleInfo != null) {
moduleInfo.setText(s);
}
}
});
}
/**
* 更新欢迎信息
*
* @param s 文字
*/
public void updateThanks(final String s) {
Platform.runLater(new Runnable() {
@Override
public void run() {
if (thanks != null) {
thanks.setText(s);
}
}
});
}
/**
* 添加一个动画状态监听
*
* @param listener
*/
public void addSplashActionListener(SplashFxActionListener listener) {
listeners.add(listener);
}
public void fireSplashClose() {
for (SplashFxActionListener listener : listeners) {
listener.splashClose();
}
}
}

69
designer-realize/src/main/java/com/fr/start/jni/SplashJNI.java

@ -1,69 +0,0 @@
package com.fr.start.jni;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
/**
* Splash JNI调用jni类改名或者移包之后
* 必须重新编译动态库
*
* @author vito
* @date 2018/6/4
*/
public class SplashJNI {
static {
try {
System.setProperty("java.library.path", ".");
System.loadLibrary("splash");
} catch (UnsatisfiedLinkError e) {
loadLibraryFromJar("/com/fr/start/jni/splash.dylib");
}
}
/**
* 显示启动动画窗口
*/
public native void show(String path);
/**
* 隐藏启动动画窗口
*/
public native void hide();
/**
* 设置模块加载信息
*/
public native void updateModuleLog(String text);
/**
* 设置感谢文字
*/
public native void updateThanksLog(String text);
/**
* 从jar中加载动态库
*
* @param path 路径/com/a/b
* @throws UnsatisfiedLinkError 没有找到合适的动态库
*/
private static void loadLibraryFromJar(String path) throws UnsatisfiedLinkError {
try (InputStream inputStream = SplashJNI.class.getResourceAsStream(path)) {
File tempLib = File.createTempFile(path, "");
byte[] buffer = new byte[1024];
int read = -1;
try (FileOutputStream fileOutputStream = new FileOutputStream(tempLib)) {
while ((read = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, read);
}
}
System.load(tempLib.getAbsolutePath());
} catch (Exception e) {
throw new UnsatisfiedLinkError("Unable to open " + path + " from jar file.");
}
}
}

100
designer-realize/src/main/java/com/fr/start/jni/SplashMac.java

@ -1,100 +0,0 @@
package com.fr.start.jni;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ProductConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.start.SplashContext;
import com.fr.start.SplashStrategy;
import javax.swing.JFrame;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* mac上使用jni方式绘制gif不使用javafx有两个原因
* 1.mac上javafx和swing同时启动会导致卡死
* 2.platform.exit会导致设计器崩溃
*
* @author vito
* @see com.fr.start.fx.SplashFx
*/
public class SplashMac implements SplashStrategy {
private SplashJNI jni;
private static final int EXILE = 10000;
public SplashMac() {
jni = new SplashJNI();
}
/**
* 将jar中的资源拷贝到缓存文件夹
*
* @return 路径
*/
private static String loadResFromJar() {
File tempLib = null;
try (InputStream inputStream = SplashContext.class.getResourceAsStream(SplashContext.SPLASH_PATH)) {
if (inputStream == null) {
FineLoggerFactory.getLogger().error("Unable to copy " + SplashContext.SPLASH_PATH + " from jar file.");
return StringUtils.EMPTY;
}
tempLib = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), SplashContext.SPLASH_CACHE_NAME));
byte[] buffer = new byte[1024];
int read = -1;
try (FileOutputStream fileOutputStream = new FileOutputStream(tempLib)) {
while ((read = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, read);
}
}
return tempLib.getAbsolutePath();
} catch (IOException e) {
if (tempLib != null) {
tempLib.deleteOnExit();
}
// 直接抛异常
throw new RuntimeException("Unable to copy " + SplashContext.SPLASH_PATH + " from jar file.");
}
}
@Override
public void show() {
if (jni != null) {
// mac下安装版模糊的hack
JFrame jFrame = new JFrame();
jFrame.setLocation(EXILE, EXILE);
jFrame.setVisible(true);
jFrame.setVisible(false);
File splash = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), SplashContext.SPLASH_CACHE_NAME));
String path = splash.exists() ? splash.getAbsolutePath() : loadResFromJar();
jni.show(path);
}
}
@Override
public void hide() {
if (jni != null) {
jni.hide();
jni = null;
}
}
@Override
public void updateModuleLog(String text) {
if (jni != null) {
jni.updateModuleLog(text);
}
}
@Override
public void updateThanksLog(String text) {
if (jni != null) {
jni.updateThanksLog(text);
}
}
}

BIN
designer-realize/src/main/resources/com/fr/start/jni/splash.dylib

Binary file not shown.

79
designer-realize/src/test/java/com.fr/design/mainframe/alphafine/search/manager/impl/FileSearchManagerTest.java

@ -0,0 +1,79 @@
package com.fr.design.mainframe.alphafine.search.manager.impl;
import com.fr.base.FRContext;
import com.fr.base.extension.FileExtension;
import com.fr.design.DesignerEnvManager;
import com.fr.design.actions.help.alphafine.AlphaFineConfigManager;
import com.fr.design.mainframe.alphafine.AlphaFineHelper;
import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel;
import com.fr.design.mainframe.alphafine.model.SearchResult;
import com.fr.file.filetree.FileNode;
import com.fr.invoke.Reflect;
import com.fr.stable.project.ProjectConstants;
import com.fr.web.core.SessionPoolManager;
import com.fr.web.utils.WebUtils;
import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*;
/**
* @author Yyming
* @version 10.0
* Created by Yyming on 2020/9/15
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({AlphaFineHelper.class,DesignerEnvManager.class})
@SuppressStaticInitializationFor("com.fr.design.mainframe.alphafine.AlphaFineHelper")
public class FileSearchManagerTest {
@Test
public void doSearch() {
String searchText = "workb";
FileSearchManager instance = FileSearchManager.getInstance();
FileNode fileNode1 = EasyMock.createMock(FileNode.class);
FileNode fileNode2 = EasyMock.createMock(FileNode.class);
EasyMock.expect(fileNode1.getName()).andReturn("workbook").anyTimes();
EasyMock.expect(fileNode2.getName()).andReturn("work book").anyTimes();
EasyMock.expect(fileNode1.getEnvPath()).andReturn("").anyTimes();
EasyMock.expect(fileNode2.getEnvPath()).andReturn("").anyTimes();
EasyMock.replay(fileNode1,fileNode2);
FileNode[] fileNodes = { fileNode1, fileNode2 };
Reflect.on(instance).set("fileNodes",fileNodes);
AlphaFineConfigManager configManager = EasyMock.createMock(AlphaFineConfigManager.class);
EasyMock.expect(configManager.isContainTemplate()).andReturn(true).anyTimes();
EasyMock.replay(configManager);
DesignerEnvManager manager = EasyMock.createMock(DesignerEnvManager.class);
EasyMock.expect(manager.getAlphaFineConfigManager()).andReturn(configManager).anyTimes();
EasyMock.replay(manager);
PowerMock.mockStatic(DesignerEnvManager.class);
DesignerEnvManager.getEnvManager();
PowerMock.expectLastCall().andReturn(manager).anyTimes();
PowerMock.replay(DesignerEnvManager.class);
List<AlphaCellModel> list = new ArrayList<>();
PowerMock.mockStatic(AlphaFineHelper.class);
AlphaFineHelper.getFilterResult();
PowerMock.expectLastCall().andReturn(list).anyTimes();
AlphaFineHelper.findFolderName("");
PowerMock.expectLastCall().andReturn("").anyTimes();
AlphaFineHelper.checkCancel();
PowerMock.expectLastCall().andVoid().anyTimes();
PowerMock.replay(AlphaFineHelper.class);
SearchResult alphaCellModels = new SearchResult();
Reflect.on(instance).set("filterModelList",alphaCellModels);
Reflect.on(instance).call("doSearch",searchText);
assertEquals(alphaCellModels.size(),2);
}
}

23
designer-realize/src/test/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRenderTest.java

@ -0,0 +1,23 @@
package com.fr.design.mainframe.alphafine.cell.render;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* @author Yyming
* @version 10.0
* Created by Yyming on 2020/9/16
*/
public class ContentCellRenderTest {
@Test
public void highLightModelName() {
String searchText = "workb";
ContentCellRender contentCellRender = new ContentCellRender(searchText,new String[]{searchText});
String workbook = contentCellRender.highLightModelName("workbook", new String[]{searchText});
assertTrue(workbook.endsWith("workb</font>ook</body></HTML>"));
workbook = contentCellRender.highLightModelName("work book", new String[]{searchText});
assertTrue(workbook.endsWith("work b</font>ook</body></HTML>"));
}
}
Loading…
Cancel
Save