daniel 8 years ago
parent
commit
74f3d05704
  1. 2
      designer/src/com/fr/design/mainframe/CellElementPropertyPane.java
  2. 1
      designer/src/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java
  3. 12
      designer/src/com/fr/design/webattr/EditToolBar.java
  4. 20
      designer_base/build.master.gradle
  5. 89
      designer_base/build.master.gradle.bak
  6. 23
      designer_base/build.release.gradle
  7. 8
      designer_base/src/com/fr/design/actions/edit/CopyAction.java
  8. 7
      designer_base/src/com/fr/design/beans/location/WidgetForbidWindow.java
  9. 3
      designer_base/src/com/fr/design/extra/PluginHelper.java
  10. 15
      designer_base/src/com/fr/design/locale/designer.properties
  11. 14
      designer_base/src/com/fr/design/locale/designer_en_US.properties
  12. 19
      designer_base/src/com/fr/design/locale/designer_ja_JP.properties
  13. 19
      designer_base/src/com/fr/design/locale/designer_ko_KR.properties
  14. 20
      designer_base/src/com/fr/design/locale/designer_zh_CN.properties
  15. 20
      designer_base/src/com/fr/design/locale/designer_zh_TW.properties
  16. 67
      designer_base/src/com/fr/design/mainframe/BaseJForm.java
  17. 9
      designer_base/src/com/fr/design/mainframe/JTemplate.java
  18. 43
      designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java
  19. 18
      designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDockPlus.java
  20. 73
      designer_base/src/com/fr/design/parameter/ParameterDesignerProvider.java
  21. 3
      designer_base/src/com/fr/design/style/color/ColorSelectConfigManager.java
  22. 11
      designer_base/src/com/fr/design/utils/ComponentUtils.java
  23. 2
      designer_base/src/com/fr/env/RemoteEnv.java
  24. 20
      designer_chart/build.master.gradle
  25. 85
      designer_chart/build.master.gradle.bak
  26. 20
      designer_chart/build.release.gradle
  27. 40
      designer_chart/src/com/fr/design/chart/axis/MinMaxValuePane.java
  28. 2
      designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java
  29. 2
      designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java
  30. 17
      designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/AbstractReportDataContentPane.java
  31. 15
      designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotReportDataContentPane.java
  32. 17
      designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/PiePlotReportDataContentPane.java
  33. 6
      designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPane.java
  34. 13
      designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartValuePane.java
  35. 21
      designer_form/build.master.gradle
  36. 22
      designer_form/build.master.gradle.bak
  37. 21
      designer_form/build.release.gradle
  38. 2
      designer_form/src/com/fr/design/designer/beans/ConnectorCreator.java
  39. 17
      designer_form/src/com/fr/design/designer/beans/LayoutAdapter.java
  40. 11
      designer_form/src/com/fr/design/designer/beans/actions/CopyAction.java
  41. 27
      designer_form/src/com/fr/design/designer/beans/adapters/layout/AbstractLayoutAdapter.java
  42. 2
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java
  43. 26
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRBodyLayoutAdapter.java
  44. 4
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java
  45. 19
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java
  46. 7
      designer_form/src/com/fr/design/designer/beans/location/AccessDirection.java
  47. 2
      designer_form/src/com/fr/design/designer/beans/location/Inner.java
  48. 46
      designer_form/src/com/fr/design/designer/beans/models/AddingModel.java
  49. 178
      designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java
  50. 170
      designer_form/src/com/fr/design/designer/beans/models/StateModel.java
  51. 5
      designer_form/src/com/fr/design/designer/beans/painters/AbstractPainter.java
  52. 12
      designer_form/src/com/fr/design/designer/creator/DedicateLayoutContainer.java
  53. 85
      designer_form/src/com/fr/design/designer/creator/XLayoutContainer.java
  54. 23
      designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java
  55. 23
      designer_form/src/com/fr/design/designer/creator/XWFitLayout.java
  56. 2
      designer_form/src/com/fr/design/designer/creator/XWScaleLayout.java
  57. 2
      designer_form/src/com/fr/design/designer/creator/XWTitleLayout.java
  58. 6
      designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java
  59. 46
      designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java
  60. 4
      designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java
  61. 28
      designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java
  62. 4
      designer_form/src/com/fr/design/mainframe/ConnectorHelper.java
  63. 167
      designer_form/src/com/fr/design/mainframe/EditingMouseListener.java
  64. 17
      designer_form/src/com/fr/design/mainframe/FormCreatorDropTarget.java
  65. 189
      designer_form/src/com/fr/design/mainframe/FormDesigner.java
  66. 34
      designer_form/src/com/fr/design/mainframe/FormSelection.java
  67. 203
      designer_form/src/com/fr/design/mainframe/FormSelectionUtils.java
  68. 65
      designer_form/src/com/fr/design/mainframe/JForm.java
  69. 3
      designer_form/src/com/fr/design/mainframe/MobileParaWidgetTable.java
  70. 52
      designer_form/src/com/fr/design/mainframe/MobileWidgetTable.java
  71. 26
      designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java
  72. 8
      designer_form/src/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java

2
designer/src/com/fr/design/mainframe/CellElementPropertyPane.java

@ -108,8 +108,10 @@ public class CellElementPropertyPane extends DockingView {
} }
public void reInit(ElementCasePane ePane) { public void reInit(ElementCasePane ePane) {
if (titlePane.getParent() == null) { // 如果处于隐藏状态,则让其显示
this.add(titlePane, BorderLayout.NORTH); this.add(titlePane, BorderLayout.NORTH);
this.add(cellElementEditPane, BorderLayout.CENTER); this.add(cellElementEditPane, BorderLayout.CENTER);
}
cellElementEditPane.populate(ePane); cellElementEditPane.populate(ePane);
} }

1
designer_base/src/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java → designer/src/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java

@ -1,6 +1,5 @@
package com.fr.design.mainframe.templateinfo; package com.fr.design.mainframe.templateinfo;
import com.fr.base.io.IOFile;
import com.fr.base.parameter.ParameterUI; import com.fr.base.parameter.ParameterUI;
import com.fr.main.impl.WorkBook; import com.fr.main.impl.WorkBook;
import com.fr.report.cellcase.CellCase; import com.fr.report.cellcase.CellCase;

12
designer/src/com/fr/design/webattr/EditToolBar.java

@ -329,15 +329,16 @@ public class EditToolBar extends BasicPane {
private JavaScriptActionPane javaScriptPane; private JavaScriptActionPane javaScriptPane;
private ExportToolBarProvider[] exportToolBarProviders; private ExportToolBarProvider[] exportToolBarProviders;
private ChangeListener changeListener = new ChangeListener() { private ActionListener actionListener = new ActionListener() {
public void stateChanged(ChangeEvent e) { @Override
public void actionPerformed(ActionEvent e) {
if (isVerify.isSelected()) { if (isVerify.isSelected()) {
failSubmit.setVisible(true); failSubmit.setVisible(true);
} else { } else {
failSubmit.setVisible(false); failSubmit.setVisible(false);
failSubmit.setSelected(false);
} }
} }
}; };
public ButtonPane() { public ButtonPane() {
@ -481,7 +482,7 @@ public class EditToolBar extends BasicPane {
submitPane.add(isVerify); submitPane.add(isVerify);
submitPane.add(failSubmit); submitPane.add(failSubmit);
submitPane.add(isCurSheet); submitPane.add(isCurSheet);
isVerify.addChangeListener(changeListener); isVerify.addActionListener(actionListener);
return submitPane; return submitPane;
} }
@ -573,6 +574,9 @@ public class EditToolBar extends BasicPane {
card.show(centerPane, "submit"); card.show(centerPane, "submit");
Submit submit = ((Submit) widget); Submit submit = ((Submit) widget);
this.isVerify.setSelected(submit.isVerify()); this.isVerify.setSelected(submit.isVerify());
if (!submit.isVerify()) {
this.failSubmit.setVisible(false);
}
this.failSubmit.setSelected(submit.isFailVerifySubmit()); this.failSubmit.setSelected(submit.isFailVerifySubmit());
this.isCurSheet.setSelected(submit.isOnlySubmitSelect()); this.isCurSheet.setSelected(submit.isOnlySubmitSelect());
} }

20
designer_base/build.master.gradle

@ -1,8 +1,26 @@
apply plugin: 'java'
tasks.withType(JavaCompile){ tasks.withType(JavaCompile){
options.encoding = 'UTF-8' options.encoding = 'UTF-8'
} }
buildscript {
repositories {
maven {
url "http://www.eveoh.nl/files/maven2"
}
}
dependencies {
classpath "nl.eveoh:gradle-aspectj:1.2"
}
}
ext.aspectjVersion = '1.7.4'
apply plugin: 'aspectj'
repositories {
mavenCentral()
}
//jdk版本 //jdk版本
sourceCompatibility=1.7 sourceCompatibility=1.7
//jar包版本 //jar包版本

89
designer_base/build.master.gradle.bak

@ -0,0 +1,89 @@
apply plugin: 'java'
tasks.withType(JavaCompile){
options.encoding = 'UTF-8'
}
buildscript {
repositories {
maven {
url "http://www.eveoh.nl/files/maven2"
}
}
dependencies {
classpath "nl.eveoh:gradle-aspectj:1.2"
}
}
ext.aspectjVersion = '1.7.4'
apply plugin: 'aspectj'
repositories {
mavenCentral()
}
//jdk版本
sourceCompatibility=1.7
//jar包版本
version='8.0'
//jar包重命名
jar{
baseName='fr-designer-core'
}
def srcDir="."
//
sourceSets{
main{
java{
srcDirs=["${srcDir}/src"]
}
}
}
//
FileTree files =fileTree(dir:'./',include:'build.*.gradle')
def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf ('\\'))
buildDir=buildDir.substring(0,buildDir.lastIndexOf ('\\'))
def branchName=buildDir.substring(buildDir.lastIndexOf ('\\')+1)
//
dependencies{
compile fileTree(dir:"../../../finereport-lib-stable/${branchName}",include:'**/*.jar')
compile fileTree(dir:'../../../',include:"finereport-*-stable/${branchName}/**/build/libs/*.jar")
testCompile 'junit:junit:4.12'
}
//.java文件到classes文件夹下参与打包
task copyFile(type:Copy,dependsOn:compileJava){
copy{
from ("${srcDir}/src"){
exclude '**/.setting/**','.classpath','.project','**/*.java','**/*.db','**/*.g','**/package.html'
}
into 'build/classes/main'
}
}
//js文件
task compressJS{
ant.taskdef(name:'yuicompress',classname:'com.yahoo.platform.yui.compressor.YUICompressTask'){
classpath {
fileset(dir:'../../../finereport-lib4build-stable',includes:'**/*.jar')
}
}
ant.yuicompress(linebreak:"500",warn:"false", munge:"yes",preserveallsemicolons:"false",charset:"utf-8",encoding:"utf-8",outputfolder:'build/classes/main'){
fileset (dir:"${srcDir}/src"){
include (name:'**/*.js')
include (name:'**/*.css')
}
}
}
jar.dependsOn compressJS

23
designer_base/build.release.gradle

@ -1,8 +1,29 @@
apply plugin: 'java'
tasks.withType(JavaCompile){ tasks.withType(JavaCompile){
options.encoding = 'UTF-8' options.encoding = 'UTF-8'
} }
buildscript {
repositories {
maven {
url "http://www.eveoh.nl/files/maven2"
}
}
dependencies {
classpath "nl.eveoh:gradle-aspectj:1.2"
}
}
ext.aspectjVersion = '1.7.4'
apply plugin: 'aspectj'
repositories {
mavenCentral()
}
//jdk版本 //jdk版本
sourceCompatibility=1.8 sourceCompatibility=1.8
//jar包版本 //jar包版本

8
designer_base/src/com/fr/design/actions/edit/CopyAction.java

@ -3,15 +3,14 @@
*/ */
package com.fr.design.actions.edit; package com.fr.design.actions.edit;
import java.awt.event.KeyEvent;
import javax.swing.KeyStroke;
import com.fr.base.BaseUtils; import com.fr.base.BaseUtils;
import com.fr.design.actions.TemplateComponentAction; import com.fr.design.actions.TemplateComponentAction;
import com.fr.design.designer.TargetComponent; import com.fr.design.designer.TargetComponent;
import com.fr.general.Inter; import com.fr.general.Inter;
import javax.swing.*;
import java.awt.event.KeyEvent;
/** /**
* Copy. * Copy.
*/ */
@ -31,7 +30,6 @@ public class CopyAction extends TemplateComponentAction {
if (tc != null) { if (tc != null) {
tc.copy(); tc.copy();
} }
return false; return false;
} }
} }

7
designer_base/src/com/fr/design/beans/location/WidgetForbidWindow.java

@ -22,7 +22,6 @@ public class WidgetForbidWindow extends JWindow {
*/ */
public WidgetForbidWindow() { public WidgetForbidWindow() {
this.add(promptButton); this.add(promptButton);
this.setSize(WIDTH, HEIGHT); this.setSize(WIDTH, HEIGHT);
} }
@ -31,18 +30,16 @@ public class WidgetForbidWindow extends JWindow {
* *
* @param x x坐标 * @param x x坐标
* @param y y坐标 * @param y y坐标
*
*/ */
public void showWindow(int x, int y){ public void showWindow(int x, int y) {
this.setLocation(x - WIDTH / 2, y - HEIGHT / 2); this.setLocation(x - WIDTH / 2, y - HEIGHT / 2);
this.setVisible(true); this.setVisible(true);
} }
/** /**
* 隐藏当前窗口 * 隐藏当前窗口
*
*/ */
public void hideWindow(){ public void hideWindow() {
this.setVisible(false); this.setVisible(false);
} }
} }

3
designer_base/src/com/fr/design/extra/PluginHelper.java

@ -7,6 +7,7 @@ import com.fr.design.extra.plugindependence.DownLoadDependenceUI;
import com.fr.general.*; import com.fr.general.*;
import com.fr.general.http.HttpClient; import com.fr.general.http.HttpClient;
import com.fr.plugin.Plugin; import com.fr.plugin.Plugin;
import com.fr.plugin.PluginConfigManager;
import com.fr.stable.plugin.PluginConstants; import com.fr.stable.plugin.PluginConstants;
import com.fr.plugin.PluginLoader; import com.fr.plugin.PluginLoader;
import com.fr.plugin.PluginManagerHelper; import com.fr.plugin.PluginManagerHelper;
@ -225,6 +226,8 @@ public class PluginHelper {
} }
// 删除放解压文件的临时文件夹 // 删除放解压文件的临时文件夹
StableUtils.deleteFile(new File(TEMP_PATH)); StableUtils.deleteFile(new File(TEMP_PATH));
PluginConfigManager.getProviderInstance().pushNewPlugin(plugin);
PluginConfigManager.getProviderInstance().syncPluginConfig();
new SwingWorker<String, Void>() { new SwingWorker<String, Void>() {
@Override @Override

15
designer_base/src/com/fr/design/locale/designer.properties

@ -91,7 +91,6 @@ FR-Designer_DS-Dictionary=
FR-Designer_Data-confusion= FR-Designer_Data-confusion=
FR-Designer_Data_Type= FR-Designer_Data_Type=
FR-Designer_Double_Click_Edit_OR_Clear= FR-Designer_Double_Click_Edit_OR_Clear=
FR-Designer_Edit_Button_ToolBar=
FR-Designer_Email= FR-Designer_Email=
FR-Designer_Enabled= FR-Designer_Enabled=
FR-Designer_End-Date= FR-Designer_End-Date=
@ -101,6 +100,7 @@ FR-Designer_FS_Close_Other_Templates=
FR-Designer_File= FR-Designer_File=
FR-Designer_Filter_Conditions= FR-Designer_Filter_Conditions=
FR-Designer_Finish-Modify-Share= FR-Designer_Finish-Modify-Share=
FR-Designer_Fit=
FR-Designer_Fit-App= FR-Designer_Fit-App=
FR-Designer_Font-Family= FR-Designer_Font-Family=
FR-Designer_Font-Size= FR-Designer_Font-Size=
@ -162,7 +162,6 @@ FR-Designer_Refresh_Parameter_In_SQL=
FR-Designer_Reg_Expressions= FR-Designer_Reg_Expressions=
FR-Designer_Reg_Max_Length= FR-Designer_Reg_Max_Length=
FR-Designer_Reg_Min_Length= FR-Designer_Reg_Min_Length=
FR-Designer_Remove_Button_ToolBar=
FR-Designer_ReportColumns-Columns= FR-Designer_ReportColumns-Columns=
FR-Designer_Return-Date= FR-Designer_Return-Date=
FR-Designer_RichText= FR-Designer_RichText=
@ -543,14 +542,14 @@ FR-Designer_Left_Display=Left
FR-Designer_About_Version=Version FR-Designer_About_Version=Version
FR-Designer_About_CopyRight=Copy Right FR-Designer_About_CopyRight=Copy Right
FR-Designer_Service_Phone=Service Phone FR-Designer_Service_Phone=Service Phone
FR-Designer_Allow_Blank=Allow Blank FR-Designer_Allow_Null=Allow null
FR-Designer_PageSetup_Page=Page FR-Designer_PageSetup_Page=Page
FR-Designer_Custom_Job_Description=Description FR-Designer_Custom_Job_Description=Description
FR-Designer_Property=Property FR-Designer_Property=Property
FR-Designer_ClassName=Class Name FR-Designer_ClassName=Class Name
FR-Designer_Polyblock_Edit=Polyblock Edit FR-Designer_Polyblock_Edit=Polyblock Edit
FR-Designer_Function_Description_Area_Text=The class must inherit 'com.fr.script.AbstractFunction'. The compiled class should be copied to\nJ2EE server '{R1}WEB-INF{R2}classes' directory.\nAdd the source code(.java file) into the same folder if need.\nExample: {R3}classes} FR-Designer_Function_Description_Area_Text=The class must inherit 'com.fr.script.AbstractFunction'. The compiled class should be copied to\nJ2EE server '{R1}' directory.\nAdd the source code(.java file) into the same folder if need.\nExample: {R2}}
FR-Designer_PageSetup_Horizontal=Horizontal FR-Designer_PageSetup_Horizontal=Horizontal
FR-Designer_PageSetup_Vertical=Vertical FR-Designer_PageSetup_Vertical=Vertical
FR-Designer_Gradient_Direction=Gradient Direction FR-Designer_Gradient_Direction=Gradient Direction
@ -564,6 +563,10 @@ FR-Designer_Show_As_Download=Display the binary content using download link
FR-Designer_File_Name_For_Download=File Name For Download FR-Designer_File_Name_For_Download=File Name For Download
FR-Designer_No=No FR-Designer_No=No
FR-Designer_Pagination=Page Break FR-Designer_Pagination=Page Break
FR-Designer-Move_Tab_First=move to first
FR-Designer-Move_Tab_End=move to end
FR-Designer-Move_Tab_Next=move to next
FR-Designer-Move_Tab_Prev=move to previous
FR-Designer_DS_TableData=Data Set FR-Designer_DS_TableData=Data Set
FR-Designer_Parameter-Formula=Formula FR-Designer_Parameter-Formula=Formula
FR-Designer_Plugin_Should_Update_Please_Contact_Developer=Plugin version is too low, and is not compatible with current API. Please contact the developer to update. FR-Designer_Plugin_Should_Update_Please_Contact_Developer=Plugin version is too low, and is not compatible with current API. Please contact the developer to update.
@ -585,3 +588,7 @@ FR-Designer-Move_Tab_First=move to first
FR-Designer-Move_Tab_End=move to end FR-Designer-Move_Tab_End=move to end
FR-Designer-Move_Tab_Next=move to next FR-Designer-Move_Tab_Next=move to next
FR-Designer-Move_Tab_Prev=move to previous FR-Designer-Move_Tab_Prev=move to previous
FR-Designer_AxisReversed=AxisValue
FR-Designer_Logarithmic=Logarithmic
FR-Designer_Chart_Log_Base=Log Base
FR-Designer_Chart_F_Radar_Axis=Chart_F_Radar_Axis

14
designer_base/src/com/fr/design/locale/designer_en_US.properties

@ -91,7 +91,6 @@ FR-Designer_DS-Dictionary=Data Dictionary
FR-Designer_Data-confusion=Data Confusion FR-Designer_Data-confusion=Data Confusion
FR-Designer_Data_Type=Data type FR-Designer_Data_Type=Data type
FR-Designer_Double_Click_Edit_OR_Clear=Double Click to Edit or Clear FR-Designer_Double_Click_Edit_OR_Clear=Double Click to Edit or Clear
FR-Designer_Edit_Button_ToolBar=Edit Button ToolBar
FR-Designer_Email=Mail FR-Designer_Email=Mail
FR-Designer_Enabled=Enabled FR-Designer_Enabled=Enabled
FR-Designer_End-Date=End Date FR-Designer_End-Date=End Date
@ -164,7 +163,6 @@ FR-Designer_Refresh_Parameter_In_SQL=Whether to refresh parameters in the SQL
FR-Designer_Reg_Expressions=Regular expressions FR-Designer_Reg_Expressions=Regular expressions
FR-Designer_Reg_Max_Length=max length FR-Designer_Reg_Max_Length=max length
FR-Designer_Reg_Min_Length=min length FR-Designer_Reg_Min_Length=min length
FR-Designer_Remove_Button_ToolBar=Remove Button ToolBar
FR-Designer_ReportColumns-Columns=Multi-columns/lines FR-Designer_ReportColumns-Columns=Multi-columns/lines
FR-Designer_Return-Date=Return Date FR-Designer_Return-Date=Return Date
FR-Designer_RichText=Insert Rich Text FR-Designer_RichText=Insert Rich Text
@ -544,14 +542,14 @@ FR-Designer_Left_Display=Left
FR-Designer_About_Version=Version FR-Designer_About_Version=Version
FR-Designer_About_CopyRight=Copy Right FR-Designer_About_CopyRight=Copy Right
FR-Designer_Service_Phone=Service Phone FR-Designer_Service_Phone=Service Phone
FR-Designer_Allow_Blank=Allow Null FR-Designer_Allow_Null=Allow null
FR-Designer_PageSetup_Page=Page FR-Designer_PageSetup_Page=Page
FR-Designer_Custom_Job_Description=Description FR-Designer_Custom_Job_Description=Description
FR-Designer_Property=Property FR-Designer_Property=Property
FR-Designer_ClassName=Class Name FR-Designer_ClassName=Class Name
FR-Designer_Polyblock_Edit=Aggregation block edition FR-Designer_Polyblock_Edit=Aggregation block edition
FR-Designer_Function_Description_Area_Text=The class must inherit 'com.fr.script.AbstractFunction'. The compiled class files should be copied to\nJ2EE server '{R1}WEB-INF{R2}classes' directory.\nAdd the source code(.java file) into the same folder if need.\nExample: {R3}classes FR-Designer_Function_Description_Area_Text=The class must inherit 'com.fr.script.AbstractFunction'. The compiled class should be copied to\nJ2EE server '{R1}' directory.\nAdd the source code(.java file) into the same folder if need.\nExample: {R2}}
FR-Designer_PageSetup_Horizontal=Horizontal FR-Designer_PageSetup_Horizontal=Horizontal
FR-Designer_PageSetup_Vertical=Vertical FR-Designer_PageSetup_Vertical=Vertical
FR-Designer_Gradient_Direction=Gradient Direction FR-Designer_Gradient_Direction=Gradient Direction
@ -565,6 +563,10 @@ FR-Designer_Show_As_Download=Display the binary content using download link
FR-Designer_File_Name_For_Download=File Name For Download FR-Designer_File_Name_For_Download=File Name For Download
FR-Designer_No=No FR-Designer_No=No
FR-Designer_Pagination=Page Break FR-Designer_Pagination=Page Break
FR-Designer-Move_Tab_First=move to first
FR-Designer-Move_Tab_End=move to end
FR-Designer-Move_Tab_Next=move to next
FR-Designer-Move_Tab_Prev=move to previous
FR-Designer_DS_TableData=Data Set FR-Designer_DS_TableData=Data Set
FR-Designer_Parameter-Formula=Formula FR-Designer_Parameter-Formula=Formula
FR-Designer_Plugin_Should_Update_Please_Contact_Developer=Plugin version is too low, and is not compatible with current API. Please contact the developer to update. FR-Designer_Plugin_Should_Update_Please_Contact_Developer=Plugin version is too low, and is not compatible with current API. Please contact the developer to update.
@ -586,3 +588,7 @@ FR-Designer-Move_Tab_First=move to first
FR-Designer-Move_Tab_End=move to end FR-Designer-Move_Tab_End=move to end
FR-Designer-Move_Tab_Next=move to next FR-Designer-Move_Tab_Next=move to next
FR-Designer-Move_Tab_Prev=move to previous FR-Designer-Move_Tab_Prev=move to previous
FR-Designer_AxisReversed=Axis in reverse order
FR-Designer_Logarithmic=Log scale
FR-Designer_Chart_Log_Base=Log Base
FR-Designer_Chart_F_Radar_Axis=Value Axis

19
designer_base/src/com/fr/design/locale/designer_ja_JP.properties

@ -91,7 +91,6 @@ FR-Designer_DS-Dictionary=\u30C7\u30FC\u30BF\u5B57\u5178
FR-Designer_Data-confusion=\u30C7\u30FC\u30BF\u6DF7\u4EA4 FR-Designer_Data-confusion=\u30C7\u30FC\u30BF\u6DF7\u4EA4
FR-Designer_Data_Type=\u30C7\u30FC\u30BF\u30BF\u30A4\u30D7 FR-Designer_Data_Type=\u30C7\u30FC\u30BF\u30BF\u30A4\u30D7
FR-Designer_Double_Click_Edit_OR_Clear=\u30C0\u30D6\u30EB\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u7DE8\u96C6\u307E\u305F\u306F\u30AF\u30EA\u30A2\u3059\u308B FR-Designer_Double_Click_Edit_OR_Clear=\u30C0\u30D6\u30EB\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u7DE8\u96C6\u307E\u305F\u306F\u30AF\u30EA\u30A2\u3059\u308B
FR-Designer_Edit_Button_ToolBar=\u30DC\u30BF\u30F3\u306B\u3042\u308B\u30C4\u30FC\u30EB\u6B04\u7DE8\u96C6
FR-Designer_Email=\u30E1\u30FC\u30EB FR-Designer_Email=\u30E1\u30FC\u30EB
FR-Designer_Enabled=\u4F7F\u7528\u53EF\u80FD FR-Designer_Enabled=\u4F7F\u7528\u53EF\u80FD
FR-Designer_End-Date=\u7D42\u4E86\u65E5\u671F FR-Designer_End-Date=\u7D42\u4E86\u65E5\u671F
@ -163,7 +162,6 @@ FR-Designer_Refresh_Parameter_In_SQL=SQL\u4E2D\u306E\u30D1\u30E9\u30E1\u30FC\u30
FR-Designer_Reg_Expressions=\u6B63\u5247\u8868\u73FE\u5F0F FR-Designer_Reg_Expressions=\u6B63\u5247\u8868\u73FE\u5F0F
FR-Designer_Reg_Max_Length=\u6700\u5927\u9577\u3055 FR-Designer_Reg_Max_Length=\u6700\u5927\u9577\u3055
FR-Designer_Reg_Min_Length=\u6700\u5C0F\u9577\u3055 FR-Designer_Reg_Min_Length=\u6700\u5C0F\u9577\u3055
FR-Designer_Remove_Button_ToolBar=\u30DC\u30BF\u30F3\u304C\u3042\u308B\u30C4\u30FC\u30EB\u30D0\u30FC\u3092\u30EA\u30E0\u30FC\u30D6
FR-Designer_ReportColumns-Columns=\u6BB5\u7D44\u307F FR-Designer_ReportColumns-Columns=\u6BB5\u7D44\u307F
FR-Designer_Return-Date=\u65E5\u671F\u306B\u623B\u308B FR-Designer_Return-Date=\u65E5\u671F\u306B\u623B\u308B
FR-Designer_RichText=\u30EA\u30C3\u30C1\u6587\u66F8\u633F\u5165 FR-Designer_RichText=\u30EA\u30C3\u30C1\u6587\u66F8\u633F\u5165
@ -518,14 +516,14 @@ FR-Designer_Left_Display=\u5DE6\u8868\u793A
FR-Designer_About_Version=\u30D0\u30FC\u30B8\u30E7\u30F3 FR-Designer_About_Version=\u30D0\u30FC\u30B8\u30E7\u30F3
FR-Designer_About_CopyRight=\u8457\u4F5C\u6A29\u6240\u6709 FR-Designer_About_CopyRight=\u8457\u4F5C\u6A29\u6240\u6709
FR-Designer_Service_Phone=\u30B5\u30FC\u30D3\u30B9\u96FB\u8A71\uFF1A FR-Designer_Service_Phone=\u30B5\u30FC\u30D3\u30B9\u96FB\u8A71\uFF1A
FR-Designer_Allow_Blank=\u7A7A\u6B04\u3042\u308A FR-Designer_Allow_Null=\u7A7A\u6B04\u3042\u308A
FR-Designer_PageSetup_Page=\u30DA\u30FC\u30B8 FR-Designer_PageSetup_Page=\u30DA\u30FC\u30B8
FR-Designer_Custom_Job_Description=\u8A18\u8FF0 FR-Designer_Custom_Job_Description=\u8A18\u8FF0
FR-Designer_Property=\u5C5E\u6027 FR-Designer_Property=\u5C5E\u6027
FR-Designer_ClassName=\u985E\u540D FR-Designer_ClassName=\u985E\u540D
FR-Designer_Polyblock_Edit=\u30A2\u30B0\u30EA\u30B2\u30FC\u30B7\u30E7\u30F3\u30D6\u30ED\u30C3\u30AF\u7DE8\u96C6 FR-Designer_Polyblock_Edit=\u30A2\u30B0\u30EA\u30B2\u30FC\u30B7\u30E7\u30F3\u30D6\u30ED\u30C3\u30AF\u7DE8\u96C6
FR-Designer_Function_Description_Area_Text=\u3053\u306E\u30AF\u30E9\u30B9\u306F\u7D99\u627F\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"com.fr.script.AbstractFunction"\u3002\u3092\u7D99\u627F\u3059\u3079\u304D\u3067\u3059\u3002\u30B3\u30F3\u30D1\u30A4\u30EB\u5F8C\u306E\u985E\u30D5\u30A1\u30A4\u30EB\u3092\nJ2EE\u30B5\u30FC\u30D0\u30FC "{R1}WEB-INF{R2}classes" \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3002\u306B\u30B3\u30D4\u30FC\u3057\u3066\u3001class\u306B\u5BFE\u5FDC\u3059\u308Bjava\u30D5\u30A1\u30A4\u30EB\u3082\u5F53\u76EE\u6B21\u306B\u7F6E\u3044\u3066\u304F\u3060\u3055\u3044\u3002\n\u4F8B\u3048\u3070\uFF1A{R3}classes FR-Designer_Function_Description_Area_Text=\u3053\u306E\u30AF\u30E9\u30B9\u306F\u7D99\u627F\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"com.fr.script.AbstractFunction"\u3002\u3092\u7D99\u627F\u3059\u3079\u304D\u3067\u3059\u3002\u30B3\u30F3\u30D1\u30A4\u30EB\u5F8C\u306E\u985E\u30D5\u30A1\u30A4\u30EB\u3092\nJ2EE\u30B5\u30FC\u30D0\u30FC "{R1}" \u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3002\u306B\u30B3\u30D4\u30FC\u3057\u3066\u3001class\u306B\u5BFE\u5FDC\u3059\u308Bjava\u30D5\u30A1\u30A4\u30EB\u3082\u5F53\u76EE\u6B21\u306B\u7F6E\u3044\u3066\u304F\u3060\u3055\u3044\u3002\n\u4F8B\u3048\u3070\uFF1A{R2}
FR-Designer_PageSetup_Horizontal=\u6A2A\u65B9\u5411 FR-Designer_PageSetup_Horizontal=\u6A2A\u65B9\u5411
FR-Designer_PageSetup_Vertical=\u7E26\u65B9\u5411 FR-Designer_PageSetup_Vertical=\u7E26\u65B9\u5411
FR-Designer_Gradient_Direction=\u65B9\u5411\u3092\u5F90\u3005\u306B\u5909\u5316 FR-Designer_Gradient_Direction=\u65B9\u5411\u3092\u5F90\u3005\u306B\u5909\u5316
@ -539,6 +537,10 @@ FR-Designer_Show_As_Download=\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30EA\u30F3\u3
FR-Designer_File_Name_For_Download=\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30D5\u30A1\u30A4\u30EB\u540D FR-Designer_File_Name_For_Download=\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u30D5\u30A1\u30A4\u30EB\u540D
FR-Designer_No=\u3044\u3044\u3048 FR-Designer_No=\u3044\u3044\u3048
FR-Designer_Pagination=\u30DA\u30FC\u30B8\u30F3\u30B0 FR-Designer_Pagination=\u30DA\u30FC\u30B8\u30F3\u30B0
FR-Designer-Move_Tab_First=
FR-Designer-Move_Tab_End=
FR-Designer-Move_Tab_Next=
FR-Designer-Move_Tab_Prev=
FR-Designer_DS_TableData=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9 FR-Designer_DS_TableData=\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9
FR-Designer_Parameter-Formula=\u6570\u5F0F FR-Designer_Parameter-Formula=\u6570\u5F0F
FR-Designer_Background_Null= FR-Designer_Background_Null=
@ -552,7 +554,8 @@ FR-Designer_Background_Image_Select=
FR-Designer_Initial_Background_Tips= FR-Designer_Initial_Background_Tips=
FR-Designer_Mouse_Move_Tips= FR-Designer_Mouse_Move_Tips=
FR-Designer_Mouse_Click_Tips= FR-Designer_Mouse_Click_Tips=
FR-Designer-Move_Tab_First= FR-Designer_Plugin_Should_Update_Please_Contact_Developer=
FR-Designer-Move_Tab_End= FR-Designer_AxisReversed=\u8EF8\u9006\u9806
FR-Designer-Move_Tab_Next= FR-Designer_Logarithmic=\u5BFE\u6570\u76EE\u76DB\u308A
FR-Designer-Move_Tab_Prev= FR-Designer_Chart_Log_Base=\u5E95\u6570
FR-Designer_Chart_F_Radar_Axis=\u5782\u76F4\u8EF8

19
designer_base/src/com/fr/design/locale/designer_ko_KR.properties

@ -91,7 +91,6 @@ FR-Designer_DS-Dictionary=\uB370\uC774\uD130\uC0AC\uC804
FR-Designer_Data-confusion=\uB370\uC774\uD130\uD63C\uD569 FR-Designer_Data-confusion=\uB370\uC774\uD130\uD63C\uD569
FR-Designer_Data_Type=\uB370\uC774\uD130\uC720\uD615 FR-Designer_Data_Type=\uB370\uC774\uD130\uC720\uD615
FR-Designer_Double_Click_Edit_OR_Clear=\uB354\uBE14\uD074\uB9AD\uD558\uC5EC\uD3B8\uC9D1\uB610\uB294\uD074\uB9AC\uC5B4\uC2E4\uD589 FR-Designer_Double_Click_Edit_OR_Clear=\uB354\uBE14\uD074\uB9AD\uD558\uC5EC\uD3B8\uC9D1\uB610\uB294\uD074\uB9AC\uC5B4\uC2E4\uD589
FR-Designer_Edit_Button_ToolBar=\uD0A4\uAC00\uC788\uB294\uD234\uBC14\uD3B8\uC9D1
FR-Designer_Email=\uBA54\uC77C FR-Designer_Email=\uBA54\uC77C
FR-Designer_Enabled=\uC0AC\uC6A9\uAC00\uB2A5 FR-Designer_Enabled=\uC0AC\uC6A9\uAC00\uB2A5
FR-Designer_End-Date=\uC885\uB8CC\uB0A0\uC9DC FR-Designer_End-Date=\uC885\uB8CC\uB0A0\uC9DC
@ -163,7 +162,6 @@ FR-Designer_Refresh_Parameter_In_SQL=SQL\uC758\uB9E4\uAC1C\uBCC0\uC218\uB97C\uC0
FR-Designer_Reg_Expressions=\uC815\uADDC\uD45C\uD604\uC2DD FR-Designer_Reg_Expressions=\uC815\uADDC\uD45C\uD604\uC2DD
FR-Designer_Reg_Max_Length=\uCD5C\uB300\uAE38\uC774 FR-Designer_Reg_Max_Length=\uCD5C\uB300\uAE38\uC774
FR-Designer_Reg_Min_Length=\uCD5C\uC18C\uAE38\uC774 FR-Designer_Reg_Min_Length=\uCD5C\uC18C\uAE38\uC774
FR-Designer_Remove_Button_ToolBar=\uD0A4\uAC00\uC788\uB294\uD234\uBC14\uC81C\uAC70
FR-Designer_ReportColumns-Columns=\uC140\uB098\uB204\uAE30 FR-Designer_ReportColumns-Columns=\uC140\uB098\uB204\uAE30
FR-Designer_Return-Date=\uB0A0\uC9DC\uB3CC\uC544\uAC00\uAE30 FR-Designer_Return-Date=\uB0A0\uC9DC\uB3CC\uC544\uAC00\uAE30
FR-Designer_RichText=\uB9AC\uCE58\uD14D\uC2A4\uD2B8\uBC15\uC2A4\uC0BD\uC785 FR-Designer_RichText=\uB9AC\uCE58\uD14D\uC2A4\uD2B8\uBC15\uC2A4\uC0BD\uC785
@ -514,7 +512,7 @@ FR-Designer_Left_Display=\uC67C\uCABD\uBCF4\uC774\uAE30
FR-Designer_About_Version=\uBC84\uC804 FR-Designer_About_Version=\uBC84\uC804
FR-Designer_About_CopyRight=\uD310\uAD8C\uC18C\uC720 FR-Designer_About_CopyRight=\uD310\uAD8C\uC18C\uC720
FR-Designer_Service_Phone=\uC11C\uBE44\uC2A4\uC804\uD654\uFF1A FR-Designer_Service_Phone=\uC11C\uBE44\uC2A4\uC804\uD654\uFF1A
FR-Designer_Allow_Blank=\uBE48\uCE78\uD5C8\uC6A9 FR-Designer_Allow_Null=\uBE48\uCE78\uD5C8\uC6A9
FR-Designer_PageSetup_Page=\uC6F9\uD398\uC774\uC9C0 FR-Designer_PageSetup_Page=\uC6F9\uD398\uC774\uC9C0
FR-Designer_Custom_Job_Description=\uC124\uBA85 FR-Designer_Custom_Job_Description=\uC124\uBA85
FR-Designer_Property=\uC18D\uC131 FR-Designer_Property=\uC18D\uC131
@ -522,7 +520,7 @@ FR-Designer_ClassName=\uD074\uB798\uC2A4\uB124\uC784
FR-Designer_Template_Web_Attributes=\uD15C\uD50C\uB9BF \uC6F9 \uC18D\uC131 FR-Designer_Template_Web_Attributes=\uD15C\uD50C\uB9BF \uC6F9 \uC18D\uC131
FR-Designer_Polyblock_Edit=\uCDE8\uD569\uBE14\uB7ED\uD3B8\uC9D1 FR-Designer_Polyblock_Edit=\uCDE8\uD569\uBE14\uB7ED\uD3B8\uC9D1
FR-Designer_Function_Description_Area_Text=\uD574\uB2F9\uD074\uB798\uC2A4\uB294\uACC4\uC2B9\uD574\uC57C\uD55C\uB2E4."com.fr.script.AbstractFunction".\uCEF4\uD30C\uC77C\uD6C4\uC758\uD074\uB798\uC2A4\uD30C\uC77C\uC744~\uB85C\uBCF5\uC0AC\nJ2EE\uC11C\uBC84 "{R1}WEB-INF{R2}classes" \uB514\uB809\uD130\uB9AC, \uD544\uC694\uC2DC class \uC0C1\uC751\uD558\uB294 java\uC18C\uC2A4\uD30C\uC77C\uB3C4\uD574\uB2F9\uB514\uB809\uD130\uB9AC\uD558\uB2E8\uC5D0\uB450\uC5B4\uD3B8\uC9D1\uBC0F\uCC3E\uC544\uBCF4\uAE30\uB97C\uD560\uC218\uC788\uC2B5\uB2C8\uB2E4.\n\uC608: {R3}classes FR-Designer_Function_Description_Area_Text=\uD574\uB2F9\uD074\uB798\uC2A4\uB294\uACC4\uC2B9\uD574\uC57C\uD55C\uB2E4."com.fr.script.AbstractFunction".\uCEF4\uD30C\uC77C\uD6C4\uC758\uD074\uB798\uC2A4\uD30C\uC77C\uC744~\uB85C\uBCF5\uC0AC\nJ2EE\uC11C\uBC84 "{R1}" \uB514\uB809\uD130\uB9AC, \uD544\uC694\uC2DC class \uC0C1\uC751\uD558\uB294 java\uC18C\uC2A4\uD30C\uC77C\uB3C4\uD574\uB2F9\uB514\uB809\uD130\uB9AC\uD558\uB2E8\uC5D0\uB450\uC5B4\uD3B8\uC9D1\uBC0F\uCC3E\uC544\uBCF4\uAE30\uB97C\uD560\uC218\uC788\uC2B5\uB2C8\uB2E4.\n\uC608: {R2}
FR-Designer_PageSetup_Horizontal=\uAC00\uB85C FR-Designer_PageSetup_Horizontal=\uAC00\uB85C
FR-Designer_PageSetup_Vertical=\uC138\uB85C FR-Designer_PageSetup_Vertical=\uC138\uB85C
FR-Designer_Gradient_Direction=\uADF8\uB77C\uB370\uC774\uC158 \uBC29\uD5A5 FR-Designer_Gradient_Direction=\uADF8\uB77C\uB370\uC774\uC158 \uBC29\uD5A5
@ -536,6 +534,10 @@ FR-Designer_Show_As_Download=\uB2E4\uC6B4\uB85C\uB4DC\uB9C1\uD06C\uB85C2\uC9C4\u
FR-Designer_File_Name_For_Download=\uB2E4\uC6B4\uB85C\uB4DC\uD30C\uC77C\uBA85 FR-Designer_File_Name_For_Download=\uB2E4\uC6B4\uB85C\uB4DC\uD30C\uC77C\uBA85
FR-Designer_No=\uC544\uB2C8\uC624 FR-Designer_No=\uC544\uB2C8\uC624
FR-Designer_Pagination=\uD398\uC774\uC9C0\uB098\uB204\uAE30 FR-Designer_Pagination=\uD398\uC774\uC9C0\uB098\uB204\uAE30
FR-Designer-Move_Tab_First=
FR-Designer-Move_Tab_End=
FR-Designer-Move_Tab_Next=
FR-Designer-Move_Tab_Prev=
FR-Designer_DS_TableData=\uB370\uC774\uD130\uC138\uD2B8 FR-Designer_DS_TableData=\uB370\uC774\uD130\uC138\uD2B8
FR-Designer_Parameter-Formula=\uC218\uC2DD FR-Designer_Parameter-Formula=\uC218\uC2DD
FR-Designer_Background_Null= FR-Designer_Background_Null=
@ -549,7 +551,8 @@ FR-Designer_Background_Image_Select=
FR-Designer_Initial_Background_Tips= FR-Designer_Initial_Background_Tips=
FR-Designer_Mouse_Move_Tips= FR-Designer_Mouse_Move_Tips=
FR-Designer_Mouse_Click_Tips= FR-Designer_Mouse_Click_Tips=
FR-Designer-Move_Tab_First= FR-Designer_Plugin_Should_Update_Please_Contact_Developer=
FR-Designer-Move_Tab_End= FR-Designer_AxisReversed=\uCD95\uC5ED\uC21C
FR-Designer-Move_Tab_Next= FR-Designer_Logarithmic=\uB85C\uADF8\uB208\uAE08
FR-Designer-Move_Tab_Prev= FR-Designer_Chart_Log_Base=\uAE30\uC218
FR-Designer_Chart_F_Radar_Axis=\uAC12\uCD95

20
designer_base/src/com/fr/design/locale/designer_zh_CN.properties

@ -91,7 +91,6 @@ FR-Designer_DS-Dictionary=\u6570\u636E\u5B57\u5178
FR-Designer_Data-confusion=\u6570\u636E\u6DF7\u6DC6 FR-Designer_Data-confusion=\u6570\u636E\u6DF7\u6DC6
FR-Designer_Data_Type=\u6570\u636E\u7C7B\u578B FR-Designer_Data_Type=\u6570\u636E\u7C7B\u578B
FR-Designer_Double_Click_Edit_OR_Clear=\u53CC\u51FB\u8FDB\u884C\u7F16\u8F91\u6216\u6E05\u9664 FR-Designer_Double_Click_Edit_OR_Clear=\u53CC\u51FB\u8FDB\u884C\u7F16\u8F91\u6216\u6E05\u9664
FR-Designer_Edit_Button_ToolBar=\u7F16\u8F91\u6309\u94AE\u6240\u5728\u5DE5\u5177\u680F
FR-Designer_Email=\u90AE\u4EF6 FR-Designer_Email=\u90AE\u4EF6
FR-Designer_Enabled=\u53EF\u7528 FR-Designer_Enabled=\u53EF\u7528
FR-Designer_End-Date=\u7ED3\u675F\u65E5\u671F FR-Designer_End-Date=\u7ED3\u675F\u65E5\u671F
@ -164,7 +163,6 @@ FR-Designer_Refresh_Parameter_In_SQL=\u662F\u5426\u5237\u65B0SQL\u4E2D\u7684\u53
FR-Designer_Reg_Expressions=\u6B63\u5219\u8868\u8FBE\u5F0F FR-Designer_Reg_Expressions=\u6B63\u5219\u8868\u8FBE\u5F0F
FR-Designer_Reg_Max_Length=\u6700\u5927\u957F\u5EA6 FR-Designer_Reg_Max_Length=\u6700\u5927\u957F\u5EA6
FR-Designer_Reg_Min_Length=\u6700\u5C0F\u957F\u5EA6 FR-Designer_Reg_Min_Length=\u6700\u5C0F\u957F\u5EA6
FR-Designer_Remove_Button_ToolBar=\u79FB\u9664\u6309\u94AE\u6240\u5728\u5DE5\u5177\u680F
FR-Designer_ReportColumns-Columns=\u5206\u680F FR-Designer_ReportColumns-Columns=\u5206\u680F
FR-Designer_Return-Date=\u8FD4\u56DE\u65E5\u671F FR-Designer_Return-Date=\u8FD4\u56DE\u65E5\u671F
FR-Designer_RichText=\u63D2\u5165\u5BCC\u6587\u672C FR-Designer_RichText=\u63D2\u5165\u5BCC\u6587\u672C
@ -548,14 +546,14 @@ FR-Designer_Left_Display=\u5DE6\u5C55\u793A
FR-Designer_About_Version=\u7248\u672C FR-Designer_About_Version=\u7248\u672C
FR-Designer_About_CopyRight=\u7248\u6743\u6240\u6709 FR-Designer_About_CopyRight=\u7248\u6743\u6240\u6709
FR-Designer_Service_Phone=\u670D\u52A1\u7535\u8BDD\uFF1A FR-Designer_Service_Phone=\u670D\u52A1\u7535\u8BDD\uFF1A
FR-Designer_Allow_Blank=\u5141\u8BB8\u4E3A\u7A7A FR-Designer_Allow_Null=\u5141\u8BB8\u4E3A\u7A7A
FR-Designer_PageSetup_Page=\u9875\u9762 FR-Designer_PageSetup_Page=\u9875\u9762
FR-Designer_Custom_Job_Description=\u63CF\u8FF0 FR-Designer_Custom_Job_Description=\u63CF\u8FF0
FR-Designer_Property=\u5C5E\u6027 FR-Designer_Property=\u5C5E\u6027
FR-Designer_ClassName=\u7C7B\u540D FR-Designer_ClassName=\u7C7B\u540D
FR-Designer_Polyblock_Edit=\u805A\u5408\u5757\u7F16\u8F91 FR-Designer_Polyblock_Edit=\u805A\u5408\u5757\u7F16\u8F91
FR-Designer_Function_Description_Area_Text=\u8BE5\u7C7B\u5FC5\u987B\u7EE7\u627F"com.fr.script.AbstractFunction"\u3002\u5E94\u5C06\u7F16\u8BD1\u540E\u7684\u7C7B\u6587\u4EF6\u62F7\u8D1D\u5230\nJ2EE\u670D\u52A1\u5668 "{R1}WEB-INF{R2}classes" \u76EE\u5F55\uFF0C\u5982\u679C\u5FC5\u8981\u7684\u8BDD\u5C06class\u5BF9\u5E94\u7684java\u6E90\u6587\u4EF6\u4E5F\u653E\u7F6E\u5230\u8BE5\u76EE\u5F55\u4E0B\u65B9\u4FBF\u7F16\u8F91\u548C\u67E5\u770B\u3002\n\u4F8B\u5982\uFF1A{R3}classes FR-Designer_Function_Description_Area_Text=\u8BE5\u7C7B\u5FC5\u987B\u7EE7\u627F"com.fr.script.AbstractFunction"\u3002\u5E94\u5C06\u7F16\u8BD1\u540E\u7684\u7C7B\u6587\u4EF6\u62F7\u8D1D\u5230\nJ2EE\u670D\u52A1\u5668 "{R1}" \u76EE\u5F55\uFF0C\u5982\u679C\u5FC5\u8981\u7684\u8BDD\u5C06class\u5BF9\u5E94\u7684java\u6E90\u6587\u4EF6\u4E5F\u653E\u7F6E\u5230\u8BE5\u76EE\u5F55\u4E0B\u65B9\u4FBF\u7F16\u8F91\u548C\u67E5\u770B\u3002\n\u4F8B\u5982\uFF1A{R2}
FR-Designer_PageSetup_Horizontal=\u6A2A\u5411 FR-Designer_PageSetup_Horizontal=\u6A2A\u5411
FR-Designer_PageSetup_Vertical=\u7EB5\u5411 FR-Designer_PageSetup_Vertical=\u7EB5\u5411
FR-Designer_Gradient_Direction=\u6E10\u53D8\u65B9\u5411 FR-Designer_Gradient_Direction=\u6E10\u53D8\u65B9\u5411
@ -569,12 +567,16 @@ FR-Designer_Show_As_Download=\u7528\u4E0B\u8F7D\u94FE\u63A5\u663E\u793A\u4E8C\u8
FR-Designer_File_Name_For_Download=\u4E0B\u8F7D\u6587\u4EF6\u540D FR-Designer_File_Name_For_Download=\u4E0B\u8F7D\u6587\u4EF6\u540D
FR-Designer_No=\u5426 FR-Designer_No=\u5426
FR-Designer_Pagination=\u5206\u9875 FR-Designer_Pagination=\u5206\u9875
FR-Designer-Move_Tab_First=\u79FB\u52A8\u5230\u9996\u4F4D
FR-Designer-Move_Tab_End=\u79FB\u52A8\u5230\u672B\u5C3E
FR-Designer-Move_Tab_Next=\u5F80\u540E\u79FB\u52A8
FR-Designer-Move_Tab_Prev=\u5F80\u524D\u79FB\u52A8
FR-Designer_DS_TableData=\u6570\u636E\u96C6 FR-Designer_DS_TableData=\u6570\u636E\u96C6
FR-Designer_Parameter-Formula=\u516C\u5F0F FR-Designer_Parameter-Formula=\u516C\u5F0F
FR-Designer_Plugin_Should_Update_Please_Contact_Developer=\u63D2\u4EF6\u7248\u672C\u8FC7\u4F4E, \u5B58\u5728API\u4E0D\u517C\u5BB9, \u8BF7\u8054\u7CFB\u5F00\u53D1\u8005\u5347\u7EA7\u63D2\u4EF6 FR-Designer_Plugin_Should_Update_Please_Contact_Developer=\u63D2\u4EF6\u7248\u672C\u8FC7\u4F4E, \u5B58\u5728API\u4E0D\u517C\u5BB9, \u8BF7\u8054\u7CFB\u5F00\u53D1\u8005\u5347\u7EA7\u63D2\u4EF6
FR-Designer_WidgetOrder=\u63A7\u4EF6\u987A\u5E8F FR-Designer_WidgetOrder=\u63A7\u4EF6\u987A\u5E8F
FR-Designer_Mobile_Form_Analysis_Annotation=\u6CE8\u91CA\uFF1A\u53EF\u4EE5\u901A\u8FC7\u8BE5\u5C5E\u6027\u63A7\u5236\u8868\u5355\u5728APP\u4E2D\u7684\u89E3\u6790\u65B9\u5F0F\u3002 FR-Designer_Mobile_Form_Analysis_Annotation=\u6CE8\u91CA\uFF1A\u53EF\u4EE5\u901A\u8FC7\u8BE5\u5C5E\u6027\u63A7\u5236\u8868\u5355\u5728APP\u4E2D\u7684\u89E3\u6790\u65B9\u5F0F\u3002
FR-Designer_Mobile_Report_Analysis_Annotation=\u6CE8\u91CA\: \u53EF\u4EE5\u901A\u8FC7\u8BE5\u5C5E\u6027\u63A7\u5236\u62A5\u8868\u5728APP\u4E2D\u7684\u89E3\u6790\u65B9\u5F0F\uFF0C\u53EA\u652F\u6301\u5206\u9875\u9884\u89C8\uFF0C\u586B\u62A5\u9884\u89C8\u65F6\u5C5E\u6027\u65E0\u6548\u3002 FR-Designer_Mobile_Report_Analysis_Annotation=\u6CE8\u91CA: \u53EF\u4EE5\u901A\u8FC7\u8BE5\u5C5E\u6027\u63A7\u5236\u62A5\u8868\u5728APP\u4E2D\u7684\u89E3\u6790\u65B9\u5F0F\uFF0C\u53EA\u652F\u6301\u5206\u9875\u9884\u89C8\uFF0C\u586B\u62A5\u9884\u89C8\u65F6\u5C5E\u6027\u65E0\u6548\u3002
FR-Designer_Background_Null=\u6CA1\u6709\u80CC\u666F FR-Designer_Background_Null=\u6CA1\u6709\u80CC\u666F
FR-Designer_Background_Color=\u989C\u8272 FR-Designer_Background_Color=\u989C\u8272
FR-Designer_Background_Texture=\u7EB9\u7406 FR-Designer_Background_Texture=\u7EB9\u7406
@ -586,7 +588,7 @@ FR-Designer_Background_Image_Select=\u9009\u62E9\u56FE\u7247
FR-Designer_Initial_Background_Tips=\u6309\u94AE\u7684\u521D\u59CB\u80CC\u666F FR-Designer_Initial_Background_Tips=\u6309\u94AE\u7684\u521D\u59CB\u80CC\u666F
FR-Designer_Mouse_Move_Tips=\u9F20\u6807\u79FB\u52A8\u5230\u6309\u94AE\u4E0A\u7684\u80CC\u666F\uFF0C\u82E5\u65E0\u5219\u4E0D\u6539\u53D8\u80CC\u666F FR-Designer_Mouse_Move_Tips=\u9F20\u6807\u79FB\u52A8\u5230\u6309\u94AE\u4E0A\u7684\u80CC\u666F\uFF0C\u82E5\u65E0\u5219\u4E0D\u6539\u53D8\u80CC\u666F
FR-Designer_Mouse_Click_Tips=\u9F20\u6807\u70B9\u51FB\u6309\u94AE\u65F6\u80CC\u666F\uFF0C\u82E5\u65E0\u5219\u4E0D\u6539\u53D8\u80CC\u666F FR-Designer_Mouse_Click_Tips=\u9F20\u6807\u70B9\u51FB\u6309\u94AE\u65F6\u80CC\u666F\uFF0C\u82E5\u65E0\u5219\u4E0D\u6539\u53D8\u80CC\u666F
FR-Designer-Move_Tab_First=\u79FB\u52A8\u5230\u9996\u4F4D FR-Designer_AxisReversed=\u8F74\u9006\u5E8F
FR-Designer-Move_Tab_End=\u79FB\u52A8\u5230\u672B\u5C3E FR-Designer_Logarithmic=\u5BF9\u6570\u523B\u5EA6
FR-Designer-Move_Tab_Next=\u5F80\u540E\u79FB\u52A8 FR-Designer_Chart_Log_Base=\u5E95\u6570
FR-Designer-Move_Tab_Prev=\u5F80\u524D\u79FB\u52A8 FR-Designer_Chart_F_Radar_Axis=\u503C\u8F74

20
designer_base/src/com/fr/design/locale/designer_zh_TW.properties

@ -91,7 +91,6 @@ FR-Designer_DS-Dictionary=\u8CC7\u6599\u5B57\u5178
FR-Designer_Data-confusion=\u8CC7\u6599\u6DF7\u6DC6 FR-Designer_Data-confusion=\u8CC7\u6599\u6DF7\u6DC6
FR-Designer_Data_Type=\u8CC7\u6599\u985E\u578B FR-Designer_Data_Type=\u8CC7\u6599\u985E\u578B
FR-Designer_Double_Click_Edit_OR_Clear=\u96D9\u64CA\u9032\u884C\u7DE8\u8F2F\u6216\u6E05\u9664 FR-Designer_Double_Click_Edit_OR_Clear=\u96D9\u64CA\u9032\u884C\u7DE8\u8F2F\u6216\u6E05\u9664
FR-Designer_Edit_Button_ToolBar=\u7DE8\u8F2F\u6309\u9215\u6240\u5728\u5DE5\u5177\u6B04
FR-Designer_Email=\u90F5\u4EF6 FR-Designer_Email=\u90F5\u4EF6
FR-Designer_Enabled=\u53EF\u7528 FR-Designer_Enabled=\u53EF\u7528
FR-Designer_End-Date=\u7D50\u675F\u65E5\u671F FR-Designer_End-Date=\u7D50\u675F\u65E5\u671F
@ -163,7 +162,6 @@ FR-Designer_Refresh_Parameter_In_SQL=\u5728SQL\u4E2D\u91CD\u65B0\u6574\u7406\u76
FR-Designer_Reg_Expressions=\u6B63\u5247\u8868\u9054\u5F0F FR-Designer_Reg_Expressions=\u6B63\u5247\u8868\u9054\u5F0F
FR-Designer_Reg_Max_Length=\u6700\u5927\u9577\u5EA6 FR-Designer_Reg_Max_Length=\u6700\u5927\u9577\u5EA6
FR-Designer_Reg_Min_Length=\u6700\u5C0F\u9577\u5EA6 FR-Designer_Reg_Min_Length=\u6700\u5C0F\u9577\u5EA6
FR-Designer_Remove_Button_ToolBar=\u79FB\u9664\u6309\u9215\u6240\u5728\u5DE5\u5177\u6B04
FR-Designer_ReportColumns-Columns=\u5831\u8868\u6B04\u4F4D FR-Designer_ReportColumns-Columns=\u5831\u8868\u6B04\u4F4D
FR-Designer_Return-Date=\u8FD4\u56DE\u65E5\u671F FR-Designer_Return-Date=\u8FD4\u56DE\u65E5\u671F
FR-Designer_RichText= RTF FR-Designer_RichText= RTF
@ -536,14 +534,14 @@ FR-Designer_Left_Display=\u5DE6\u986F\u793A
FR-Designer_About_Version=\u7248\u672C FR-Designer_About_Version=\u7248\u672C
FR-Designer_About_CopyRight=\u7248\u6B0A\u6240\u6709 FR-Designer_About_CopyRight=\u7248\u6B0A\u6240\u6709
FR-Designer_Service_Phone=\u670D\u52D9\u96FB\u8A71\uFF1A FR-Designer_Service_Phone=\u670D\u52D9\u96FB\u8A71\uFF1A
FR-Designer_Allow_Blank=\u5141\u8A31\u70BA\u7A7A\u767D FR-Designer_Allow_Null=\u5141\u8A31\u70BA\u7A7A\u767D
FR-Designer_PageSetup_Page=\u9801\u9762 FR-Designer_PageSetup_Page=\u9801\u9762
FR-Designer_Custom_Job_Description=\u63CF\u8FF0 FR-Designer_Custom_Job_Description=\u63CF\u8FF0
FR-Designer_Property=\u5C6C\u6027 FR-Designer_Property=\u5C6C\u6027
FR-Designer_ClassName=\u985E\u540D FR-Designer_ClassName=\u985E\u540D
FR-Designer_Polyblock_Edit=\u805A\u5408\u584A\u7DE8\u8F2F FR-Designer_Polyblock_Edit=\u805A\u5408\u584A\u7DE8\u8F2F
FR-Designer_Function_Description_Area_Text=\u8A72\u985E\u5FC5\u9808\u7E7C\u627F"com.fr.script.AbstractFunction"\u3002\u61C9\u5C07\u7DE8\u8B6F\u5F8C\u7684\u985E\u6A94\u6848\u62F7\u8C9D\u5230\nJ2EE\u4F3A\u670D\u5668 "{R1}WEB-INF{R2}classes" \u76EE\u9304\uFF0C\u5982\u679C\u5FC5\u8981\u7684\u8A71\u5C07class\u5C0D\u61C9\u7684java\u539F\u59CB\u6A94\u6848\u4E5F\u653E\u7F6E\u5230\u8A72\u76EE\u9304\u4E0B\u65B9\u4FBF\u7DE8\u8F2F\u548C\u67E5\u770B\u3002\n\u4F8B\u5982\uFF1A{R3}classes FR-Designer_Function_Description_Area_Text=\u8A72\u985E\u5FC5\u9808\u7E7C\u627F"com.fr.script.AbstractFunction"\u3002\u61C9\u5C07\u7DE8\u8B6F\u5F8C\u7684\u985E\u6A94\u6848\u62F7\u8C9D\u5230\nJ2EE\u4F3A\u670D\u5668 "{R1}" \u76EE\u9304\uFF0C\u5982\u679C\u5FC5\u8981\u7684\u8A71\u5C07class\u5C0D\u61C9\u7684java\u539F\u59CB\u6A94\u6848\u4E5F\u653E\u7F6E\u5230\u8A72\u76EE\u9304\u4E0B\u65B9\u4FBF\u7DE8\u8F2F\u548C\u67E5\u770B\u3002\n\u4F8B\u5982\uFF1A{R2}
FR-Designer_PageSetup_Horizontal=\u6A2A\u5411 FR-Designer_PageSetup_Horizontal=\u6A2A\u5411
FR-Designer_PageSetup_Vertical=\u7E31\u5411 FR-Designer_PageSetup_Vertical=\u7E31\u5411
FR-Designer_Gradient_Direction=\u6F38\u8B8A\u65B9\u5411 FR-Designer_Gradient_Direction=\u6F38\u8B8A\u65B9\u5411
@ -557,9 +555,13 @@ FR-Designer_Show_As_Download=\u7528\u4E0B\u8F09\u93C8\u63A5\u986F\u793A\u4E8C\u9
FR-Designer_File_Name_For_Download=\u4E0B\u8F09\u6A94\u6848\u540D FR-Designer_File_Name_For_Download=\u4E0B\u8F09\u6A94\u6848\u540D
FR-Designer_No=\u5426 FR-Designer_No=\u5426
FR-Designer_Pagination=\u5206\u9801 FR-Designer_Pagination=\u5206\u9801
FR-Designer-Move_Tab_First=\u79FB\u52D5\u5230\u9996\u4F4D
FR-Designer-Move_Tab_End=\u79FB\u52D5\u5230\u672B\u5C3E
FR-Designer-Move_Tab_Next=\u5F80\u5F8C\u79FB\u52D5
FR-Designer-Move_Tab_Prev=\u5F80\u524D\u79FB\u52D5
FR-Designer_DS_TableData=\u8CC7\u6599\u96C6 FR-Designer_DS_TableData=\u8CC7\u6599\u96C6
FR-Designer_Parameter-Formula=\u516C\u5F0F FR-Designer_Parameter-Formula=\u516C\u5F0F
FR-Designer_Plugin_Should_Update_Please_Contact_Developer=\u63D2\u4EF6\u7248\u672C\u904E\u4F4E, \u5B58\u5728API\u4E0D\u517C\u5BB9, \u8ACB\u806F\u7E6B\u958B\u767C\u8005\u5347\u7D1A\u63D2\u4EF6 FR-Designer_Plugin_Should_Update_Please_Contact_Developer=\u633F\u4EF6\u7248\u672C\u904E\u4F4E\uFF0C\u5B58\u5728API\u4E0D\u76F8\u5BB9\uFF0C\u8ACB\u806F\u7CFB\u958B\u767C\u8005\u965E\u7D1A\u633F\u4EF6
FR-Designer_WidgetOrder=\u63A7\u4EF6\u9806\u5E8F FR-Designer_WidgetOrder=\u63A7\u4EF6\u9806\u5E8F
FR-Designer_Mobile_Form_Analysis_Annotation=\u6CE8\u91CB\uFF1A\u53EF\u4EE5\u901A\u904E\u8A72\u5C6C\u6027\u63A7\u5236\u8868\u55AE\u5728APP\u4E2D\u7684\u89E3\u6790\u65B9\u5F0F\u3002 FR-Designer_Mobile_Form_Analysis_Annotation=\u6CE8\u91CB\uFF1A\u53EF\u4EE5\u901A\u904E\u8A72\u5C6C\u6027\u63A7\u5236\u8868\u55AE\u5728APP\u4E2D\u7684\u89E3\u6790\u65B9\u5F0F\u3002
FR-Designer_Mobile_Report_Analysis_Annotation=\u6CE8\u91CB\uFF1A\u53EF\u4EE5\u901A\u904E\u8A72\u5C6C\u6027\u63A7\u5236\u5831\u8868\u5728APP\u4E2D\u7684\u89E3\u6790\u65B9\u5F0F\uFF0C\u53EA\u652F\u6301\u5206\u9801\u9810\u89BD\uFF0C\u586B\u5831\u9810\u89BD\u6642\u5C6C\u6027\u7121\u6548\u3002 FR-Designer_Mobile_Report_Analysis_Annotation=\u6CE8\u91CB\uFF1A\u53EF\u4EE5\u901A\u904E\u8A72\u5C6C\u6027\u63A7\u5236\u5831\u8868\u5728APP\u4E2D\u7684\u89E3\u6790\u65B9\u5F0F\uFF0C\u53EA\u652F\u6301\u5206\u9801\u9810\u89BD\uFF0C\u586B\u5831\u9810\u89BD\u6642\u5C6C\u6027\u7121\u6548\u3002
@ -574,7 +576,7 @@ FR-Designer_Background_Image_Select=
FR-Designer_Initial_Background_Tips= FR-Designer_Initial_Background_Tips=
FR-Designer_Mouse_Move_Tips= FR-Designer_Mouse_Move_Tips=
FR-Designer_Mouse_Click_Tips= FR-Designer_Mouse_Click_Tips=
FR-Designer-Move_Tab_First=\u79FB\u52D5\u5230\u9996\u4F4D FR-Designer_AxisReversed=\u8EF8\u9006\u5E8F
FR-Designer-Move_Tab_End=\u79FB\u52D5\u5230\u672B\u5C3E FR-Designer_Logarithmic=\u5C0D\u6578\u523B\u5EA6
FR-Designer-Move_Tab_Next=\u5F80\u5F8C\u79FB\u52D5 FR-Designer_Chart_Log_Base=\u5E95\u6578
FR-Designer-Move_Tab_Prev=\u5F80\u524D\u79FB\u52D5 FR-Designer_Chart_F_Radar_Axis=\u503C\u8EF8

67
designer_base/src/com/fr/design/mainframe/BaseJForm.java

@ -1 +1,66 @@
package com.fr.design.mainframe; import javax.swing.JComponent; import com.fr.form.FormElementCaseContainerProvider; /** * Author : Shockway * Date: 13-7-15 * Time: 上午10:28 */ public interface BaseJForm extends JTemplateProvider{ public static final String XML_TAG = "JForm"; public static final int FORM_TAB = 0; public static final int ELEMENTCASE_TAB = 1; public static final int ELEMENTCASE_CHANGE_TAB = 2; /** * 刷新所有控件 */ public void refreshAllNameWidgets(); /** * 刷新参数 */ public void populateParameter(); /** * 刷新选中的控件 */ public void refreshSelectedWidget(); /** * 获取当前的Target */ public Object getTarget(); /** * 执行撤销 * * @param o 之前保存的状态 */ public void applyUndoState4Form(BaseUndoState o); /** * 获取当前编辑的组件 */ public JComponent getEditingPane(); /** * 只在Form和ElementCase之间切换 * @param index 切换位置 */ public void tabChanged(int index); /** * 在Form和ElementCase, 以及ElementCase和ElementCase之间切换 * @param index 切换位置 * @param ecContainer ElementCase所在container */ public void tabChanged(int index, FormElementCaseContainerProvider ecContainer); } package com.fr.design.mainframe;
import javax.swing.JComponent;
import com.fr.form.FormElementCaseContainerProvider;
/**
* Author : Shockway
* Date: 13-7-15
* Time: 上午10:28
*/
public interface BaseJForm extends JTemplateProvider {
String XML_TAG = "JForm";
int FORM_TAB = 0;
int ELEMENTCASE_TAB = 1;
int ELEMENTCASE_CHANGE_TAB = 2;
/**
* 刷新所有控件
*/
void refreshAllNameWidgets();
/**
* 刷新参数
*/
void populateParameter();
/**
* 刷新选中的控件
*/
void refreshSelectedWidget();
/**
* 获取当前的Target
*/
Object getTarget();
/**
* 执行撤销
*
* @param o 之前保存的状态
*/
void applyUndoState4Form(BaseUndoState o);
/**
* 获取当前编辑的组件
*/
JComponent getEditingPane();
/**
* 只在Form和ElementCase之间切换
*
* @param index 切换位置
*/
void tabChanged(int index);
/**
* 在Form和ElementCase, 以及ElementCase和ElementCase之间切换
*
* @param index 切换位置
* @param ecContainer ElementCase所在container
*/
void tabChanged(int index, FormElementCaseContainerProvider ecContainer);
}

9
designer_base/src/com/fr/design/mainframe/JTemplate.java

@ -85,7 +85,7 @@ public abstract class JTemplate<T extends IOFile, U extends BaseUndoState<?>> ex
public JTemplate(T t, String defaultFileName) { public JTemplate(T t, String defaultFileName) {
this(t, new MemFILE(newTemplateNameByIndex(defaultFileName)), true); this(t, new MemFILE(newTemplateNameByIndex(defaultFileName)), true);
initForCollect(); openTime = System.currentTimeMillis();
} }
public JTemplate(T t, FILE file) { public JTemplate(T t, FILE file) {
@ -111,14 +111,15 @@ public abstract class JTemplate<T extends IOFile, U extends BaseUndoState<?>> ex
// 为收集模版信息作准备 // 为收集模版信息作准备
private void initForCollect() { private void initForCollect() {
if (template.getTemplateID() == null) {
template.initTemplateID(); // 为新模板设置 templateID 属性 template.initTemplateID(); // 为新模板设置 templateID 属性
}
if (openTime == 0) { if (openTime == 0) {
openTime = System.currentTimeMillis(); openTime = System.currentTimeMillis();
} }
} }
private void collectInfo() { // 执行收集操作 private void collectInfo() { // 执行收集操作
if (openTime == 0) { // 旧模板,不收集数据
return;
}
long saveTime = System.currentTimeMillis(); // 保存模板的时间点 long saveTime = System.currentTimeMillis(); // 保存模板的时间点
tic.collectInfo(template, this, openTime, saveTime); tic.collectInfo(template, this, openTime, saveTime);
openTime = saveTime; // 更新 openTime,准备下一次计算 openTime = saveTime; // 更新 openTime,准备下一次计算
@ -533,7 +534,7 @@ public abstract class JTemplate<T extends IOFile, U extends BaseUndoState<?>> ex
boolean result = this.saveFile(); boolean result = this.saveFile();
if (result) { if (result) {
DesignerFrameFileDealerPane.getInstance().refresh(); DesignerFrameFileDealerPane.getInstance().refresh();
initForCollect(); // 如果是旧模板另存为新模板,则添加 templateID initForCollect(); // 如果保存新模板(新建模板直接保存,或者另存为),则添加 templateID
collectInfo(); collectInfo();
} }
//更换最近打开 //更换最近打开

43
designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java

@ -5,6 +5,7 @@ import com.fr.base.io.IOFile;
import com.fr.design.DesignerEnvManager; import com.fr.design.DesignerEnvManager;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplate;
import com.fr.env.RemoteEnv;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.general.FRLogger; import com.fr.general.FRLogger;
import com.fr.general.GeneralUtils; import com.fr.general.GeneralUtils;
@ -15,9 +16,7 @@ import org.json.JSONObject;
import java.io.*; import java.io.*;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.*;
import java.util.Calendar;
import java.util.HashMap;
/** /**
* 做模板的过程和耗时收集辅助类 * 做模板的过程和耗时收集辅助类
@ -32,6 +31,7 @@ public class TemplateInfoCollector<T extends IOFile> implements Serializable {
private static final int VALID_WIDGET_COUNT = 5; // 有效报表模板的控件数 private static final int VALID_WIDGET_COUNT = 5; // 有效报表模板的控件数
private static final int COMPLETE_DAY_COUNT = 15; // 判断模板是否完成的天数 private static final int COMPLETE_DAY_COUNT = 15; // 判断模板是否完成的天数
private static final int ONE_THOUSAND = 1000; private static final int ONE_THOUSAND = 1000;
static final long serialVersionUID = 2007L;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private TemplateInfoCollector() { private TemplateInfoCollector() {
@ -70,18 +70,28 @@ public class TemplateInfoCollector<T extends IOFile> implements Serializable {
} catch (FileNotFoundException ex) { } catch (FileNotFoundException ex) {
// 如果之前没有存储过,则创建新对象 // 如果之前没有存储过,则创建新对象
instance = new TemplateInfoCollector(); instance = new TemplateInfoCollector();
} catch (Exception ex) { } catch (InvalidClassException ex) {
// 如果 TemplateInfoCollecor 类结构有改动,则放弃之前收集的数据(下次保存时覆盖)
// 这种情况主要在开发、测试过程中遇到,正式上线后不应该出现
FRLogger.getLogger().info(ex.getMessage());
FRLogger.getLogger().info("use a new instance");
instance = new TemplateInfoCollector();
}
catch (Exception ex) {
FRLogger.getLogger().error(ex.getMessage(), ex); FRLogger.getLogger().error(ex.getMessage(), ex);
} }
} }
return instance; return instance;
} }
private static boolean shouldCollectInfo() { private boolean shouldCollectInfo() {
if (FRContext.getCurrentEnv() instanceof RemoteEnv) { // 远程设计不收集数据
return false;
}
return DesignerEnvManager.getEnvManager().isJoinProductImprove() && FRContext.isChineseEnv(); return DesignerEnvManager.getEnvManager().isJoinProductImprove() && FRContext.isChineseEnv();
} }
public static void appendProcess(String log) { public void appendProcess(String log) {
if (!shouldCollectInfo()) { if (!shouldCollectInfo()) {
return; return;
} }
@ -113,7 +123,14 @@ public class TemplateInfoCollector<T extends IOFile> implements Serializable {
private void saveInfo() { private void saveInfo() {
try { try {
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile())); ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile()));
FRLogger.getLogger().info("writing: " + instance.templateInfoList); String log = "";
int count = 1;
for (String key : templateInfoList.keySet()) {
String createTime = ((HashMap)templateInfoList.get(key).get("consumingMap")).get("create_time").toString();
log += (count + ". id: " + key + " " + createTime + "\n" + templateInfoList.get(key).toString() + "\n");
count ++;
}
FRLogger.getLogger().info("writing tplInfo: \n" + log);
os.writeObject(instance); os.writeObject(instance);
os.close(); os.close();
} catch (Exception ex) { } catch (Exception ex) {
@ -225,7 +242,9 @@ public class TemplateInfoCollector<T extends IOFile> implements Serializable {
if (sendSingleTemplateInfo(consumingUrl, jsonConsumingMap) && sendSingleTemplateInfo(processUrl, jsonProcessMap)) { if (sendSingleTemplateInfo(consumingUrl, jsonConsumingMap) && sendSingleTemplateInfo(processUrl, jsonProcessMap)) {
// 清空记录 // 清空记录
FRLogger.getLogger().info("successfully send " + templateInfo.get("templateID")); FRLogger.getLogger().info("successfully send " + templateInfo.get("templateID"));
templateInfoList.remove(templateInfo.get("templateID")); removeFromTemplateInfoList(templateInfo.get("templateID"));
} else {
FRLogger.getLogger().info("send template info failed, will try next time, " + templateInfo.get("templateID"));
} }
} }
saveInfo(); saveInfo();
@ -277,12 +296,16 @@ public class TemplateInfoCollector<T extends IOFile> implements Serializable {
} }
// 删除测试模板 // 删除测试模板
for (String key : testTemplateKeys) { for (String key : testTemplateKeys) {
templateInfoList.remove(key); removeFromTemplateInfoList(key);
// System.out.println(key + " is removed...");
} }
return completeTemplatesInfo; return completeTemplatesInfo;
} }
private void removeFromTemplateInfoList(String key) {
templateInfoList.remove(key);
FRLogger.getLogger().info(key + " is removed...");
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private boolean isTestTemplate(HashMap<String, Object> templateInfo) { private boolean isTestTemplate(HashMap<String, Object> templateInfo) {
HashMap<String, Object> processMap = (HashMap<String, Object>) templateInfo.get("processMap"); HashMap<String, Object> processMap = (HashMap<String, Object>) templateInfo.get("processMap");

18
designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDockPlus.java

@ -12,52 +12,52 @@ public interface ToolBarMenuDockPlus {
* *
* @return 工具 * @return 工具
*/ */
public ToolBarDef[] toolbars4Target(); ToolBarDef[] toolbars4Target();
/** /**
* 文件菜单的子菜单 * 文件菜单的子菜单
* *
* @return 子菜单 * @return 子菜单
*/ */
public ShortCut[] shortcut4FileMenu(); ShortCut[] shortcut4FileMenu();
/** /**
* 目标的菜单 * 目标的菜单
* *
* @return 菜单 * @return 菜单
*/ */
public MenuDef[] menus4Target(); MenuDef[] menus4Target();
/** /**
* 表单的工具栏 * 表单的工具栏
* *
* @return 表单工具栏 * @return 表单工具栏
*/ */
public JPanel[] toolbarPanes4Form(); JPanel[] toolbarPanes4Form();
/** /**
* 表单的工具按钮 * 表单的工具按钮
* *
* @return 工具按钮 * @return 工具按钮
*/ */
public JComponent[] toolBarButton4Form(); JComponent[] toolBarButton4Form();
/** /**
* 权限细粒度状态下的工具面板 * 权限细粒度状态下的工具面板
* *
* @return 工具面板 * @return 工具面板
*/ */
public JComponent toolBar4Authority(); JComponent toolBar4Authority();
public int getMenuState(); int getMenuState();
public int getToolBarHeight(); int getToolBarHeight();
/** /**
* 导出菜单的子菜单 目前用于图表设计器 * 导出菜单的子菜单 目前用于图表设计器
* *
* @return 子菜单 * @return 子菜单
*/ */
public ShortCut[] shortcut4ExportMenu(); ShortCut[] shortcut4ExportMenu();
} }

73
designer_base/src/com/fr/design/parameter/ParameterDesignerProvider.java

@ -1 +1,72 @@
package com.fr.design.parameter; import com.fr.base.Parameter; import com.fr.base.parameter.ParameterUI; import com.fr.design.mainframe.AuthorityEditPane; import javax.swing.*; import java.awt.*; /** * 参数设计界面接口 */ public interface ParameterDesignerProvider { public void addListener(ParaDefinitePane paraDefinitePane); public Component createWrapper(); public void setDesignHeight(int height); public Dimension getDesignSize(); public Dimension getPreferredSize(); public void populate(ParameterUI p); public void refreshAllNameWidgets(); public void refresh4TableData(String oldName, String newName); public void refreshParameter(ParaDefinitePane paraDefinitePane); public boolean isWithQueryButton(); public java.util.List<String> getAllXCreatorNameList(); public boolean isWithoutParaXCreator(Parameter[] ps); public boolean isBlank(); public ParameterUI getParaTarget(); public boolean addingParameter2Editor(Parameter parameter, int index); public boolean addingParameter2EditorWithQueryButton(Parameter parameter, int index); public void addingAllParameter2Editor(Parameter[] parameterArray, int currentIndex); public JPanel[] toolbarPanes4Form(); public JComponent[] toolBarButton4Form(); public void initBeforeUpEdit(); public void populateParameterPropertyPane(ParaDefinitePane p); public void initWidgetToolbarPane(); public AuthorityEditPane getAuthorityEditPane(); public JPanel getEastUpPane(); public JPanel getEastDownPane(); public boolean isSupportAuthority(); public void removeSelection(); public ParameterBridge getParaComponent(); } package com.fr.design.parameter;
import com.fr.base.Parameter;
import com.fr.base.parameter.ParameterUI;
import com.fr.design.mainframe.AuthorityEditPane;
import javax.swing.*;
import java.awt.*;
/**
* 参数设计界面接口
*/
public interface ParameterDesignerProvider {
void addListener(ParaDefinitePane paraDefinitePane);
Component createWrapper();
void setDesignHeight(int height);
Dimension getDesignSize();
Dimension getPreferredSize();
void populate(ParameterUI p);
void refreshAllNameWidgets();
void refresh4TableData(String oldName, String newName);
void refreshParameter(ParaDefinitePane paraDefinitePane);
boolean isWithQueryButton();
java.util.List<String> getAllXCreatorNameList();
boolean isWithoutParaXCreator(Parameter[] ps);
boolean isBlank();
ParameterUI getParaTarget();
boolean addingParameter2Editor(Parameter parameter, int index);
boolean addingParameter2EditorWithQueryButton(Parameter parameter, int index);
void addingAllParameter2Editor(Parameter[] parameterArray, int currentIndex);
JPanel[] toolbarPanes4Form();
JComponent[] toolBarButton4Form();
void initBeforeUpEdit();
void populateParameterPropertyPane(ParaDefinitePane p);
void initWidgetToolbarPane();
AuthorityEditPane getAuthorityEditPane();
JPanel getEastUpPane();
JPanel getEastDownPane();
boolean isSupportAuthority();
void removeSelection();
ParameterBridge getParaComponent();
}

3
designer_base/src/com/fr/design/style/color/ColorSelectConfigManager.java

@ -84,6 +84,9 @@ public class ColorSelectConfigManager extends XMLFileManager implements ColorSel
* @param color 颜色 * @param color 颜色
*/ */
public void addToColorQueue(Color color) { public void addToColorQueue(Color color) {
if(color == null){
return;
}
// 过滤重复的最近使用颜色 // 过滤重复的最近使用颜色
// 因为有个后进先出的问题,最近使用的颜色需要放到最前面所以没用set // 因为有个后进先出的问题,最近使用的颜色需要放到最前面所以没用set
if (colors.contains(color)) { if (colors.contains(color)) {

11
designer_base/src/com/fr/design/utils/ComponentUtils.java

@ -12,6 +12,9 @@ import java.util.ArrayList;
*/ */
public class ComponentUtils { public class ComponentUtils {
private ComponentUtils() {
}
public static boolean isComponentVisible(Component comp) { public static boolean isComponentVisible(Component comp) {
if (!comp.isVisible() && !isRootComponent(comp)) { if (!comp.isVisible() && !isRootComponent(comp)) {
return false; return false;
@ -79,7 +82,7 @@ public class ComponentUtils {
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
Component child = container.getComponent(i); Component child = container.getComponent(i);
if (child == target) { if (child.equals(target)) {
return i; return i;
} }
} }
@ -105,10 +108,10 @@ public class ComponentUtils {
* 计算组件root相对于其顶层容器的可见区域 * 计算组件root相对于其顶层容器的可见区域
*/ */
public static Rectangle computeVisibleRect(JComponent root) { public static Rectangle computeVisibleRect(JComponent root) {
Rectangle root_bounds = ComponentUtils.getRelativeBounds(root); Rectangle rootBounds = ComponentUtils.getRelativeBounds(root);
Rectangle rect = computeVisibleRectRel2Root(root); Rectangle rect = computeVisibleRectRel2Root(root);
rect.x -= root_bounds.x; rect.x -= rootBounds.x;
rect.y -= root_bounds.y; rect.y -= rootBounds.y;
return rect; return rect;
} }

2
designer_base/src/com/fr/env/RemoteEnv.java vendored

@ -55,7 +55,7 @@ import java.util.Timer;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class RemoteEnv implements Env { public class RemoteEnv extends AbstractEnv {
private static final int TIME_OUT = 30 * 1000; private static final int TIME_OUT = 30 * 1000;
private static final int PLAIN_SOCKET_PORT = 80; private static final int PLAIN_SOCKET_PORT = 80;
private static final int SSL_PORT = 443; private static final int SSL_PORT = 443;

20
designer_chart/build.master.gradle

@ -1,8 +1,26 @@
apply plugin: 'java'
tasks.withType(JavaCompile){ tasks.withType(JavaCompile){
options.encoding = 'UTF-8' options.encoding = 'UTF-8'
} }
buildscript {
repositories {
maven {
url "http://www.eveoh.nl/files/maven2"
}
}
dependencies {
classpath "nl.eveoh:gradle-aspectj:1.2"
}
}
ext.aspectjVersion = '1.7.4'
apply plugin: 'aspectj'
repositories {
mavenCentral()
}
//jdk版本 //jdk版本
sourceCompatibility=1.7 sourceCompatibility=1.7
//jar包的版本 //jar包的版本

85
designer_chart/build.master.gradle.bak

@ -0,0 +1,85 @@
apply plugin: 'java'
tasks.withType(JavaCompile){
options.encoding = 'UTF-8'
}
buildscript {
repositories {
maven {
url "http://www.eveoh.nl/files/maven2"
}
}
dependencies {
classpath "nl.eveoh:gradle-aspectj:1.2"
}
}
ext.aspectjVersion = '1.7.4'
apply plugin: 'aspectj'
repositories {
mavenCentral()
}
//jdk版本
sourceCompatibility=1.7
//jar包的版本
version='8.0'
def srcDir="."
//jar包进行重命名
jar{
baseName='fr-designer-chart'
}
sourceSets{
main{
java{
srcDirs=["${srcDir}/src"]
}
}
}
FileTree files =fileTree(dir:'./',include:'build.*.gradle')
def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf ('\\'))
buildDir=buildDir.substring(0,buildDir.lastIndexOf ('\\'))
def branchName=buildDir.substring(buildDir.lastIndexOf ('\\')+1)
//
dependencies{
compile fileTree(dir:"../../../finereport-lib-stable/${branchName}",include:'**/*.jar')
compile fileTree(dir:'../../../',include:"finereport-*-stable/${branchName}/**/build/libs/*.jar")
testCompile 'junit:junit:4.12'
}
//.java classes文件夹下参与打包
task copyFile(type:Copy,dependsOn:compileJava){
copy{
from ("${srcDir}/src"){
exclude '**/.setting/**','.classpath','.project','**/*.java','**/*.db','**/*.g','**/package.html'
}
into 'build/classes/main'
}
}
//js文件
task compressJS{
ant.taskdef(name:'yuicompress',classname:'com.yahoo.platform.yui.compressor.YUICompressTask'){
classpath {
fileset(dir:'../../../finereport-lib4build-stable',includes:'**/*.jar')
}
}
ant.yuicompress(linebreak:"500",warn:"false", munge:"yes",preserveallsemicolons:"false",charset:"utf-8",encoding:"utf-8",outputfolder:'build/classes/main'){
fileset (dir:"${srcDir}/src"){
include (name:'**/*.js')
include (name:'**/*.css')
}
}
}
jar.dependsOn compressJS

20
designer_chart/build.release.gradle

@ -1,8 +1,26 @@
apply plugin: 'java'
tasks.withType(JavaCompile){ tasks.withType(JavaCompile){
options.encoding = 'UTF-8' options.encoding = 'UTF-8'
} }
buildscript {
repositories {
maven {
url "http://www.eveoh.nl/files/maven2"
}
}
dependencies {
classpath "nl.eveoh:gradle-aspectj:1.2"
}
}
ext.aspectjVersion = '1.7.4'
apply plugin: 'aspectj'
repositories {
mavenCentral()
}
//jdk版本 //jdk版本
sourceCompatibility=1.8 sourceCompatibility=1.8
//jar包的版本 //jar包的版本

40
designer_chart/src/com/fr/design/chart/axis/MinMaxValuePane.java

@ -39,37 +39,45 @@ public class MinMaxValuePane extends JPanel {
mainUnitField = new UITextField(6); mainUnitField = new UITextField(6);
isCustomSecUnitBox = new UICheckBox(Inter.getLocText("FR-Chart_SecondGraduationUnit")); isCustomSecUnitBox = new UICheckBox(Inter.getLocText("FR-Chart_SecondGraduationUnit"));
secUnitField = new UITextField(6); secUnitField = new UITextField(6);
double p = TableLayout.PREFERRED; double p = TableLayout.PREFERRED;
double f = TableLayout.FILL; double f = TableLayout.FILL;
double[] columnSize = { p, f }; double[] columnSize = {p, f};
double[] rowSize = { p, p, p, p, p, p, p, p};
Component[][] components = getPanelComponents(); Component[][] components = getPanelComponents();
JPanel panel = TableLayoutHelper.createTableLayoutPane(components ,rowSize,columnSize); JPanel panel = TableLayoutHelper.createTableLayoutPane(components, getRowSize(p), columnSize);
this.setLayout(new BorderLayout()); this.setLayout(new BorderLayout());
this.add(panel,BorderLayout.CENTER); this.add(panel, BorderLayout.CENTER);
addComponentListener(components);
}
for(int i = 0; i < components.length; i+=2) { protected double[] getRowSize(double p) {
((UICheckBox)components[i][0]).addActionListener(new ActionListener() { return new double[]{p, p, p, p};
}
protected void addComponentListener(Component[][] components) {
for (int i = 0; i < components.length; i++) {
addListener((UICheckBox) components[i][0]);
ChartSwingUtils.addListener((UICheckBox) components[i][0], (UITextField) components[i][1]);
}
}
protected void addListener(UICheckBox checkBox) {
checkBox.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
checkBoxUse(); checkBoxUse();
} }
}); });
ChartSwingUtils.addListener((UICheckBox)components[i][0], (UITextField)components[i+1][0]);
}
} }
protected Component[][] getPanelComponents() { protected Component[][] getPanelComponents() {
return new Component[][]{ return new Component[][]{
new Component[]{minCheckBox}, new Component[]{minCheckBox, minValueField},
new Component[]{minValueField}, new Component[]{maxCheckBox, maxValueField},
new Component[]{maxCheckBox}, new Component[]{isCustomMainUnitBox, mainUnitField},
new Component[]{maxValueField}, new Component[]{isCustomSecUnitBox, secUnitField},
new Component[]{isCustomMainUnitBox},
new Component[]{mainUnitField},
new Component[]{isCustomSecUnitBox},
new Component[]{secUnitField},
}; };
} }

2
designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java

@ -45,7 +45,7 @@ public class ChartHyperPoplinkPane extends BasicBeanPane<ChartHyperPoplink> {
ChartCollection cc = createChartCollection(); ChartCollection cc = createChartCollection();
chartComponent = new ChartComponent(); chartComponent = new ChartComponent();
chartComponent.setPreferredSize(new Dimension(220, 170));// 在单元格弹出时 需要调整保证属性表的大小. chartComponent.setPreferredSize(new Dimension(200, 170));// 在单元格弹出时 需要调整保证属性表的大小.
chartComponent.setSupportEdit(false); chartComponent.setSupportEdit(false);
chartComponent.populate(cc); chartComponent.populate(cc);

2
designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java

@ -79,7 +79,7 @@ public class ChartTypeButtonPane extends BasicBeanPane<ChartCollection> implemen
eastPane.setLayout(new BorderLayout()); eastPane.setLayout(new BorderLayout());
eastPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 15)); eastPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 5));
JPanel button = new JPanel(); JPanel button = new JPanel();
button.setPreferredSize(new Dimension(45, 20)); button.setPreferredSize(new Dimension(45, 20));
button.setLayout(new GridLayout(1, 2, 5, 0)); button.setLayout(new GridLayout(1, 2, 5, 0));

17
designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/AbstractReportDataContentPane.java

@ -3,6 +3,8 @@ package com.fr.design.mainframe.chart.gui.data.report;
import com.fr.base.Formula; import com.fr.base.Formula;
import com.fr.base.Utils; import com.fr.base.Utils;
import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartattr.ChartCollection;
import com.fr.chart.chartdata.NormalReportDataDefinition;
import com.fr.chart.chartdata.SeriesDefinition;
import com.fr.design.beans.BasicBeanPane; import com.fr.design.beans.BasicBeanPane;
import com.fr.design.constants.UIConstants; import com.fr.design.constants.UIConstants;
import com.fr.design.event.UIObserverListener; import com.fr.design.event.UIObserverListener;
@ -16,6 +18,7 @@ import com.fr.stable.StableUtils;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import java.awt.*; import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -95,6 +98,20 @@ public abstract class AbstractReportDataContentPane extends BasicBeanPane<ChartC
return seriesPane.updateBean(); return seriesPane.updateBean();
} }
protected List getEntryList(NormalReportDataDefinition seriesList) {
List list = new ArrayList();
for (int i = 0; i < seriesList.size(); i++) {
SeriesDefinition seriesEntry = (SeriesDefinition) seriesList.get(i);
Object[] nameAndValue = new Object[2];
nameAndValue[0] = seriesEntry.getSeriesName();
nameAndValue[1] = seriesEntry.getValue();
if (nameAndValue[0] != null || nameAndValue[1] != null) {
list.add(nameAndValue);
}
}
return list;
}
/** /**
* 界面标题: * 界面标题:
*/ */

15
designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotReportDataContentPane.java

@ -18,7 +18,6 @@ import javax.swing.*;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
import java.awt.*; import java.awt.*;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class CategoryPlotReportDataContentPane extends AbstractReportDataContentPane { public class CategoryPlotReportDataContentPane extends AbstractReportDataContentPane {
@ -113,20 +112,6 @@ public class CategoryPlotReportDataContentPane extends AbstractReportDataContent
filterPane.populateBean(collection); filterPane.populateBean(collection);
} }
private List getEntryList(NormalReportDataDefinition seriesList) {
List list = new ArrayList();
for (int i = 0; i < seriesList.size(); i++) {
SeriesDefinition seriesEntry = (SeriesDefinition) seriesList.get(i);
Object[] nameAndValue = new Object[2];
nameAndValue[0] = seriesEntry.getSeriesName();
nameAndValue[1] = seriesEntry.getValue();
if (nameAndValue[0] != null && nameAndValue[1] != null) {
list.add(nameAndValue);
}
}
return list;
}
public void updateBean(ChartCollection collection) { public void updateBean(ChartCollection collection) {
collection.getSelectedChart().setFilterDefinition(new NormalReportDataDefinition()); collection.getSelectedChart().setFilterDefinition(new NormalReportDataDefinition());

17
designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/PiePlotReportDataContentPane.java

@ -10,7 +10,6 @@ import com.fr.design.mainframe.chart.gui.ChartDataPane;
import com.fr.design.mainframe.chart.gui.data.ChartDataFilterPane; import com.fr.design.mainframe.chart.gui.data.ChartDataFilterPane;
import com.fr.general.Inter; import com.fr.general.Inter;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
@ -25,7 +24,7 @@ public class PiePlotReportDataContentPane extends AbstractReportDataContentPane
public PiePlotReportDataContentPane(ChartDataPane parent) { public PiePlotReportDataContentPane(ChartDataPane parent) {
initEveryPane(); initEveryPane();
this.add(new BoldFontTextLabel(Inter.getLocText("Data_Filter")), "0,4,2,4"); this.add(new BoldFontTextLabel(Inter.getLocText("FR-Chart-Data_Filter")), "0,4,2,4");
this.add(filterPane = new ChartDataFilterPane(new PiePlot(), parent), "0,6,2,4"); this.add(filterPane = new ChartDataFilterPane(new PiePlot(), parent), "0,6,2,4");
} }
@ -51,20 +50,6 @@ public class PiePlotReportDataContentPane extends AbstractReportDataContentPane
filterPane.populateBean(collection); filterPane.populateBean(collection);
} }
private List getEntryList(NormalReportDataDefinition seriesList) {
List list = new ArrayList();
for(int i = 0; i < seriesList.size(); i++) {
SeriesDefinition seriesEntry = (SeriesDefinition)seriesList.get(i);
Object[] nameAndValue = new Object[2];
nameAndValue[0] = seriesEntry.getSeriesName();
nameAndValue[1] = seriesEntry.getValue();
if(nameAndValue[0] != null && nameAndValue[1] != null) {
list.add(nameAndValue);
}
}
return list;
}
public void updateBean(ChartCollection collection) { public void updateBean(ChartCollection collection) {
collection.getSelectedChart().setFilterDefinition(new NormalReportDataDefinition()); collection.getSelectedChart().setFilterDefinition(new NormalReportDataDefinition());

6
designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPane.java

@ -77,9 +77,8 @@ public class ChartTextAttrPane extends BasicPane {
public void populate(FRFont frFont) { public void populate(FRFont frFont) {
UIObserverListener listener = fontNameComboBox == null ? null : fontNameComboBox.getUiObserverListener(); UIObserverListener listener = fontNameComboBox == null ? null : fontNameComboBox.getUiObserverListener();
removeAllComboBoxListener(); removeAllComboBoxListener();
if (frFont == null) {
return; if (frFont != null) {
}
fontNameComboBox.setSelectedItem(frFont.getFamily()); fontNameComboBox.setSelectedItem(frFont.getFamily());
bold.setSelected(frFont.isBold()); bold.setSelected(frFont.isBold());
italic.setSelected(frFont.isItalic()); italic.setSelected(frFont.isItalic());
@ -89,6 +88,7 @@ public class ChartTextAttrPane extends BasicPane {
if (fontColor != null) { if (fontColor != null) {
fontColor.setColor(frFont.getForeground()); fontColor.setColor(frFont.getForeground());
} }
}
//更新结束后,注册监听器 //更新结束后,注册监听器
registerAllComboBoxListener(listener); registerAllComboBoxListener(listener);

13
designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartValuePane.java

@ -72,7 +72,7 @@ public class ChartValuePane extends ChartAxisUsePane<Axis>{
axisLineStylePane = new ChartAxisLineStylePane(); axisLineStylePane = new ChartAxisLineStylePane();
zeroPane = aliagnZero4Second(); zeroPane = aliagnZero4Second();
axisReversed = new UICheckBox(Inter.getLocText("AxisReversed")); axisReversed = new UICheckBox(Inter.getLocText("FR-Designer_AxisReversed"));
unitCombox = new UIComboBox(ChartConstants.UNIT_I18N_VALUES); unitCombox = new UIComboBox(ChartConstants.UNIT_I18N_VALUES);
formatPane = new FormatPane(); formatPane = new FormatPane();
axisLabelPane = new ChartAxisLabelPane(); axisLabelPane = new ChartAxisLabelPane();
@ -151,11 +151,10 @@ public class ChartValuePane extends ChartAxisUsePane<Axis>{
double p = TableLayout.PREFERRED; double p = TableLayout.PREFERRED;
double f = TableLayout.FILL; double f = TableLayout.FILL;
double[] columnSize = { LayoutConstants.CHART_ATTR_TOMARGIN,p,f}; double[] columnSize = { LayoutConstants.CHART_ATTR_TOMARGIN,p,f};
double[] rowSize = { p, p, p}; double[] rowSize = { p, p};
Component[][] component = new Component[][]{ Component[][] component = new Component[][]{
new Component[]{null,initMinMaxValue(),null}, new Component[]{null,initMinMaxValue(),null},
new Component[]{null, addLogarithmicPane2ValuePane(), null}, new Component[]{null, addLogarithmicPane2ValuePane(), addLogText()},
new Component[]{null, null, addLogText()},
}; };
return TableLayoutHelper.createTableLayoutPane(component, rowSize, columnSize); return TableLayoutHelper.createTableLayoutPane(component, rowSize, columnSize);
} }
@ -172,8 +171,8 @@ public class ChartValuePane extends ChartAxisUsePane<Axis>{
// 返回对数相关界面. 百分比 没有此界面. // 返回对数相关界面. 百分比 没有此界面.
protected JPanel addLogarithmicPane2ValuePane() { protected JPanel addLogarithmicPane2ValuePane() {
JPanel labelLogPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); JPanel labelLogPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane();
labelLogPane.add(logBox = new UICheckBox(Inter.getLocText("Logarithmic")+":")); labelLogPane.add(logBox = new UICheckBox(Inter.getLocText("FR-Designer_Logarithmic")+":"));
labelLogPane.add(new UILabel(Inter.getLocText("Chart_Log_Base"))); labelLogPane.add(new UILabel(Inter.getLocText("FR-Designer_Chart_Log_Base")));
logBaseField = new UITextField(4); logBaseField = new UITextField(4);
logBaseField.setText("10"); logBaseField.setText("10");
@ -222,7 +221,7 @@ public class ChartValuePane extends ChartAxisUsePane<Axis>{
* @return 返回标题. * @return 返回标题.
*/ */
public String title4PopupWindow() { public String title4PopupWindow() {
return Inter.getLocText("Chart_F_Radar_Axis"); return Inter.getLocText("FR-Designer_Chart_F_Radar_Axis");
} }
@Override @Override

21
designer_form/build.master.gradle

@ -1,8 +1,27 @@
apply plugin: 'java'
tasks.withType(JavaCompile){ tasks.withType(JavaCompile){
options.encoding = 'UTF-8' options.encoding = 'UTF-8'
} }
buildscript {
repositories {
maven {
url "http://www.eveoh.nl/files/maven2"
}
}
dependencies {
classpath "nl.eveoh:gradle-aspectj:1.2"
}
}
ext.aspectjVersion = '1.7.4'
apply plugin: 'aspectj'
repositories {
mavenCentral()
}
//jdk版本 //jdk版本
sourceCompatibility=1.7 sourceCompatibility=1.7
//jar包版本 //jar包版本

22
designer_form/build.master.gradle.bak

@ -3,6 +3,26 @@ apply plugin: 'java'
tasks.withType(JavaCompile){ tasks.withType(JavaCompile){
options.encoding = 'UTF-8' options.encoding = 'UTF-8'
} }
buildscript {
repositories {
maven {
url "http://www.eveoh.nl/files/maven2"
}
}
dependencies {
classpath "nl.eveoh:gradle-aspectj:1.2"
}
}
ext.aspectjVersion = '1.7.4'
apply plugin: 'aspectj'
repositories {
mavenCentral()
}
//jdk版本 //jdk版本
sourceCompatibility=1.7 sourceCompatibility=1.7
//jar包版本 //jar包版本
@ -47,7 +67,7 @@ def dataContent ={def dir ->
} }
} }
} }
FileTree f1=fileTree(dir:'../../../'include:"finereport-*-stable/${branchName}/build/libs/*.jar") FileTree f1=fileTree(dir:'../../../',include:"finereport-*-stable/${branchName}/build/libs/*.jar")
f1.each{File file-> f1.each{File file->
println "----------${file.path}" println "----------${file.path}"
} }

21
designer_form/build.release.gradle

@ -1,10 +1,27 @@
apply plugin: 'java'
tasks.withType(JavaCompile){ tasks.withType(JavaCompile){
options.encoding = 'UTF-8' options.encoding = 'UTF-8'
} }
buildscript {
repositories {
maven {
url "http://www.eveoh.nl/files/maven2"
}
}
dependencies {
classpath "nl.eveoh:gradle-aspectj:1.2"
}
}
ext.aspectjVersion = '1.7.4'
apply plugin: 'aspectj'
repositories {
mavenCentral()
}
//jdk版本 //jdk版本
sourceCompatibility=1.8 sourceCompatibility=1.7
//jar包版本 //jar包版本
version='8.0' version='8.0'

2
designer_form/src/com/fr/design/designer/beans/ConnectorCreator.java

@ -6,7 +6,7 @@ import java.util.ArrayList;
import java.util.PriorityQueue; import java.util.PriorityQueue;
import com.fr.form.ui.container.WLayout; import com.fr.form.ui.container.WLayout;
import com.fr.form.ui.widget.BoundsWidget; import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
public class ConnectorCreator { public class ConnectorCreator {

17
designer_form/src/com/fr/design/designer/beans/LayoutAdapter.java

@ -6,6 +6,7 @@ import com.fr.design.designer.creator.XCreator;
/** /**
* 该接口是LayoutManager的BeanInfo类标准Java平台没有提供布局管理器的BeanInfo类 * 该接口是LayoutManager的BeanInfo类标准Java平台没有提供布局管理器的BeanInfo类
* 对于界面设计工具来说还需一些特殊的行为 * 对于界面设计工具来说还需一些特殊的行为
*
* @since 6.5.3 * @since 6.5.3
*/ */
public interface LayoutAdapter { public interface LayoutAdapter {
@ -15,15 +16,17 @@ public interface LayoutAdapter {
* 管理适配器的accept来决定当前位置是否可以放置并提供特殊的标识比如红色区域标识 * 管理适配器的accept来决定当前位置是否可以放置并提供特殊的标识比如红色区域标识
* 如在BorderLayout中如果某个方位已经放置了组件则此时应该返回false标识该区域不可以 * 如在BorderLayout中如果某个方位已经放置了组件则此时应该返回false标识该区域不可以
* 放置 * 放置
*@param creator 组件 *
*@param x 添加的位置x该位置是相对于container的 * @param creator 组件
*@param y 添加的位置y该位置是相对于container的 * @param x 添加的位置x该位置是相对于container的
*@return 是否可以放置 * @param y 添加的位置y该位置是相对于container的
* @return 是否可以放置
*/ */
boolean accept(XCreator creator, int x, int y); boolean accept(XCreator creator, int x, int y);
/** /**
* 有的控件在拖拽调整大小后需要根据自身内容重新计算下当前的尺寸是否合适如果不合适就需要重新fix一下 * 有的控件在拖拽调整大小后需要根据自身内容重新计算下当前的尺寸是否合适如果不合适就需要重新fix一下
*
* @param creator 组件 * @param creator 组件
*/ */
void fix(XCreator creator); void fix(XCreator creator);
@ -31,6 +34,7 @@ public interface LayoutAdapter {
/** /**
* 组件的ComponentAdapter在添加组件时如果发现布局管理器不为空会继而调用该布局管理器的 * 组件的ComponentAdapter在添加组件时如果发现布局管理器不为空会继而调用该布局管理器的
* addComp方法来完成组件的具体添加在该方法内布局管理器可以提供额外的功能 * addComp方法来完成组件的具体添加在该方法内布局管理器可以提供额外的功能
*
* @param creator 被添加的新组件 * @param creator 被添加的新组件
* @param x 添加的位置x该位置是相对于container的 * @param x 添加的位置x该位置是相对于container的
* @param y 添加的位置y该位置是相对于container的 * @param y 添加的位置y该位置是相对于container的
@ -45,6 +49,7 @@ public interface LayoutAdapter {
/** /**
* 显示parent的字组件child解决CardLayout中显示某个非显示组件的特殊情况 * 显示parent的字组件child解决CardLayout中显示某个非显示组件的特殊情况
*
* @param child 组件 * @param child 组件
*/ */
void showComponent(XCreator child); void showComponent(XCreator child);
@ -53,6 +58,7 @@ public interface LayoutAdapter {
/** /**
* 组件叠放顺序前插入 * 组件叠放顺序前插入
*
* @param target 目标组件 * @param target 目标组件
* @param added 插入组件 * @param added 插入组件
*/ */
@ -60,6 +66,7 @@ public interface LayoutAdapter {
/** /**
* 组件叠放顺序后插入 * 组件叠放顺序后插入
*
* @param target 目标组件 * @param target 目标组件
* @param added 放置组件 * @param added 放置组件
*/ */
@ -67,6 +74,7 @@ public interface LayoutAdapter {
/** /**
* 能否放置更多组件 * 能否放置更多组件
*
* @return 能则返回true * @return 能则返回true
*/ */
boolean canAcceptMoreComponent(); boolean canAcceptMoreComponent();
@ -77,6 +85,7 @@ public interface LayoutAdapter {
/** /**
* 删除组件 * 删除组件
*
* @param creator 组件 * @param creator 组件
* @param initWidth 组件之前宽度 * @param initWidth 组件之前宽度
* @param initHeight 组件之前高度 * @param initHeight 组件之前高度

11
designer_form/src/com/fr/design/designer/beans/actions/CopyAction.java

@ -1,13 +1,12 @@
package com.fr.design.designer.beans.actions; package com.fr.design.designer.beans.actions;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.KeyStroke;
import com.fr.base.BaseUtils; import com.fr.base.BaseUtils;
import com.fr.general.Inter;
import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesigner;
import com.fr.general.Inter;
import javax.swing.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
public class CopyAction extends FormEditAction { public class CopyAction extends FormEditAction {

27
designer_form/src/com/fr/design/designer/beans/adapters/layout/AbstractLayoutAdapter.java

@ -1,8 +1,5 @@
package com.fr.design.designer.beans.adapters.layout; package com.fr.design.designer.beans.adapters.layout;
import java.awt.LayoutManager;
import com.fr.general.ComparatorUtils;
import com.fr.design.beans.GroupModel; import com.fr.design.beans.GroupModel;
import com.fr.design.designer.beans.ConstraintsGroupModel; import com.fr.design.designer.beans.ConstraintsGroupModel;
import com.fr.design.designer.beans.HoverPainter; import com.fr.design.designer.beans.HoverPainter;
@ -13,6 +10,9 @@ import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWidgetCreator; import com.fr.design.designer.creator.XWidgetCreator;
import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.LayoutUtils; import com.fr.design.utils.gui.LayoutUtils;
import com.fr.general.ComparatorUtils;
import java.awt.*;
public abstract class AbstractLayoutAdapter implements LayoutAdapter { public abstract class AbstractLayoutAdapter implements LayoutAdapter {
@ -26,13 +26,14 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 是否使用控件备份大小 * 是否使用控件备份大小
*
* @param xCreator 控件 * @param xCreator 控件
* @return 所在容器相同且支持备份的话返回true * @return 所在容器相同且支持备份的话返回true
*/ */
public boolean whetherUseBackupSize(XCreator xCreator) { public boolean whetherUseBackupSize(XCreator xCreator) {
Class clazz = container.getClass(); Class clazz = container.getClass();
Class bkClazz = null; Class bkClazz = null;
if(xCreator.getBackupParent() != null) { if (xCreator.getBackupParent() != null) {
bkClazz = xCreator.getBackupParent().getClass(); bkClazz = xCreator.getBackupParent().getClass();
} }
return ComparatorUtils.equals(bkClazz, clazz) return ComparatorUtils.equals(bkClazz, clazz)
@ -41,6 +42,7 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 是否支持用备份大小 * 是否支持用备份大小
*
* @return * @return
*/ */
public boolean supportBackupSize() { public boolean supportBackupSize() {
@ -49,6 +51,7 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 有的控件在拖拽调整大小后需要根据自身内容重新计算下当前的尺寸是否合适如果不合适就需要重新fix一下 * 有的控件在拖拽调整大小后需要根据自身内容重新计算下当前的尺寸是否合适如果不合适就需要重新fix一下
*
* @param creator 组件 * @param creator 组件
*/ */
public void fix(XCreator creator) { public void fix(XCreator creator) {
@ -56,6 +59,7 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 显示parent的字组件child解决CardLayout中显示某个非显示组件的特殊情况 * 显示parent的字组件child解决CardLayout中显示某个非显示组件的特殊情况
*
* @param child 组件 * @param child 组件
*/ */
@Override @Override
@ -66,6 +70,7 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 组件的ComponentAdapter在添加组件时如果发现布局管理器不为空会继而调用该布局管理器的 * 组件的ComponentAdapter在添加组件时如果发现布局管理器不为空会继而调用该布局管理器的
* addComp方法来完成组件的具体添加在该方法内布局管理器可以提供额外的功能 * addComp方法来完成组件的具体添加在该方法内布局管理器可以提供额外的功能
*
* @param creator 被添加的新组件 * @param creator 被添加的新组件
* @param x 添加的位置x该位置是相对于container的 * @param x 添加的位置x该位置是相对于container的
* @param y 添加的位置y该位置是相对于container的 * @param y 添加的位置y该位置是相对于container的
@ -83,9 +88,10 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 删除组件 * 删除组件
*
* @param creator 组件 * @param creator 组件
* @param initWidth 组件之前宽度 * @param creatorWidth
* @param initHeight 组件之前高度 * @param creatorHeight
*/ */
public void removeBean(XCreator creator, int creatorWidth, int creatorHeight) { public void removeBean(XCreator creator, int creatorWidth, int creatorHeight) {
delete(creator, creatorWidth, creatorHeight); delete(creator, creatorWidth, creatorHeight);
@ -98,6 +104,7 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 增加下一个组件 * 增加下一个组件
*
* @param dragged 组件 * @param dragged 组件
*/ */
@Override @Override
@ -108,6 +115,7 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 目标控件位置插入组件 * 目标控件位置插入组件
*
* @param target 目标 * @param target 目标
* @param added 增加组件 * @param added 增加组件
*/ */
@ -126,6 +134,7 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 插在目标组件后面 * 插在目标组件后面
*
* @param target 目标 * @param target 目标
* @param added 增加组件 * @param added 增加组件
*/ */
@ -155,6 +164,7 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 是否能接收更多的组件 * 是否能接收更多的组件
*
* @return 能则返回true * @return 能则返回true
*/ */
@Override @Override
@ -171,4 +181,9 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
public GroupModel getLayoutProperties() { public GroupModel getLayoutProperties() {
return null; return null;
} }
public XLayoutContainer getContainer() {
return this.container;
}
} }

2
designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java

@ -12,8 +12,8 @@ import com.fr.design.designer.properties.FRAbsoluteLayoutPropertiesGroupModel;
import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.LayoutUtils; import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.ui.widget.BoundsWidget;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
import com.fr.general.FRLogger; import com.fr.general.FRLogger;
public class FRAbsoluteLayoutAdapter extends FRBodyLayoutAdapter { public class FRAbsoluteLayoutAdapter extends FRBodyLayoutAdapter {

26
designer_form/src/com/fr/design/designer/beans/adapters/layout/FRBodyLayoutAdapter.java

@ -640,11 +640,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter {
* 又通过ComponentUtils.getRelativeBounds()方法获取到了绝对坐标 * 又通过ComponentUtils.getRelativeBounds()方法获取到了绝对坐标
* 再次计算相对坐标所以将y值重新变成绝对坐标 * 再次计算相对坐标所以将y值重新变成绝对坐标
* */ * */
if (currentCreator.getBackupParent().getLocation().y == WBorderLayout.DEFAULT_SIZE) { y = y + WCardMainBorderLayout.TAB_HEIGHT + this.getParaEditorYOffset();
y = y + WCardMainBorderLayout.TAB_HEIGHT + WBorderLayout.DEFAULT_SIZE;
} else {
y = y + WCardMainBorderLayout.TAB_HEIGHT;
}
int tempX = x - rect.x; int tempX = x - rect.x;
int tempY = y - rect.y; int tempY = y - rect.y;
int containerX = container.getX(); int containerX = container.getX();
@ -675,6 +671,26 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter {
return position; return position;
} }
/**
* 获取因为参数面板导致的Y坐标偏移
*
* @return 参数面板导致的Y坐标偏移
*/
protected int getParaEditorYOffset() {
int offset = 0;
if (container.getParent() != null) {
Component components[] = container.getParent().getComponents();
for (Component component : components) {
if (component instanceof XWParameterLayout) {
offset = component.getY() + component.getHeight();
break;
}
}
}
return offset;
}
/** /**
* 组件交叉区域进行插入时调整受到变动的其他组件,之前是交叉区域插入也按照三等分逻辑后面测试中发现有bug改为和bi一样的鼠标所在侧平分 * 组件交叉区域进行插入时调整受到变动的其他组件,之前是交叉区域插入也按照三等分逻辑后面测试中发现有bug改为和bi一样的鼠标所在侧平分
* 默认左上角右下角区域是垂直方向插入组件 * 默认左上角右下角区域是垂直方向插入组件

4
designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java

@ -28,8 +28,8 @@ import com.fr.design.utils.ComponentUtils;
import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.LayoutBorderStyle;
import com.fr.form.ui.container.WLayout; import com.fr.form.ui.container.WLayout;
import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout;
import com.fr.form.ui.widget.BoundsWidget;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
/** /**
* 自适应布局的容器适配器 * 自适应布局的容器适配器
@ -1026,7 +1026,7 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
setAdjustedSize(tabLayout, offset, isHor); setAdjustedSize(tabLayout, offset, isHor);
for (int m = 0; m < tabLayout.getComponentCount(); m++) { for (int m = 0; m < tabLayout.getComponentCount(); m++) {
XCreator childCreator = tabLayout.getXCreator(m); XCreator childCreator = tabLayout.getXCreator(m);
BoundsWidget wgt = tabLayout.toData().getBoundsWidget(childCreator.toData()); BoundsWidget wgt = (BoundsWidget) tabLayout.toData().getBoundsWidget(childCreator.toData());
wgt.setBounds(tabLayout.getComponent(m).getBounds()); wgt.setBounds(tabLayout.getComponent(m).getBounds());
} }
adjustCreatorsSize(percent, tabLayout, isHor); adjustCreatorsSize(percent, tabLayout, isHor);

19
designer_form/src/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java

@ -13,6 +13,7 @@ import com.fr.design.designer.creator.cardlayout.XWCardLayout;
import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout;
import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout;
import com.fr.design.designer.properties.FRTabFitLayoutPropertiesGroupModel; import com.fr.design.designer.properties.FRTabFitLayoutPropertiesGroupModel;
import com.fr.design.mainframe.widget.editors.ParameterEditor;
import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.ComponentUtils;
import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.LayoutBorderStyle;
import com.fr.form.ui.container.WBorderLayout; import com.fr.form.ui.container.WBorderLayout;
@ -28,8 +29,6 @@ import java.awt.*;
* @date 2014-6-24 * @date 2014-6-24
*/ */
public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter { public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter {
//标题栏高度对tab布局内部组件的y坐标造成了偏移
private static int TAB_HEIGHT = 40;
/** /**
* 构造函数 * 构造函数
@ -63,13 +62,12 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter {
// 经过accept判断后,container会被改变,先备份 // 经过accept判断后,container会被改变,先备份
XLayoutContainer backUpContainer = container; XLayoutContainer backUpContainer = container;
Rectangle rect = ComponentUtils.getRelativeBounds(container); Rectangle rect = ComponentUtils.getRelativeBounds(container);
int posX = x - rect.x; int posX = x - rect.x;
int posY = y - rect.y; int posY = y - rect.y;
if (!accept(creator, posX, posY)) { if (!accept(creator, posX, posY)) {
return false; return false;
} }
// posX,posY是新拖入组件相对于容器的位置,若在tab布局的边缘,则需要把新组件添加到 // posX,posY是新拖入组件相对于容器的位置,若在tab布局的边缘,则需要把新组件添加到l
// 父层自适应布局中,这时候的添加位置就是tab布局所在的位置 // 父层自适应布局中,这时候的添加位置就是tab布局所在的位置
if (this.intersectsEdge(posX, posY, backUpContainer)) { if (this.intersectsEdge(posX, posY, backUpContainer)) {
if (!ComparatorUtils.equals(backUpContainer.getOuterLayout(), backUpContainer.getBackupParent())) { if (!ComparatorUtils.equals(backUpContainer.getOuterLayout(), backUpContainer.getBackupParent())) {
@ -86,16 +84,14 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter {
return true; return true;
} }
// tab布局的纵坐标受到tab高度的影响,判断的上边界取得是里面XWTabFitLayout的上边界, // tab布局的纵坐标受到tab高度以及参数面板高度的影响,判断的上边界取得是里面XWTabFitLayout的上边界,
// 实际计算的时候的纵坐标用了外层的CardMainBorerLayout,需要将tab高度减掉 // 实际计算的时候的纵坐标用了外层的CardMainBorerLayout,需要将tab高度和参数面板高度减掉
//将y值变为相对坐标以实现获取到鼠标drop位置的控件 // 将y值变为相对坐标以实现获取到鼠标drop位置的控件
//TODO 可以直接在这边将x,y都变成相对坐标,这样在后面判断拖进来的新控件放置方式的时候就不用再判断了 // TODO 可以直接在这边将x,y都变成相对坐标,这样在后面判断拖进来的新控件放置方式的时候就不用再判断了
private int adjustY(int y, XWTabFitLayout tabLayout) { private int adjustY(int y, XWTabFitLayout tabLayout) {
XWCardLayout cardLayout = (XWCardLayout) tabLayout.getBackupParent(); XWCardLayout cardLayout = (XWCardLayout) tabLayout.getBackupParent();
LayoutBorderStyle style = cardLayout.toData().getBorderStyle(); LayoutBorderStyle style = cardLayout.toData().getBorderStyle();
if (container.getLocation().y == WBorderLayout.DEFAULT_SIZE) { y = y - this.getParaEditorYOffset();
y = y - WBorderLayout.DEFAULT_SIZE;
}
if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) {
y = y - WCardMainBorderLayout.TAB_HEIGHT; y = y - WCardMainBorderLayout.TAB_HEIGHT;
} }
@ -105,4 +101,5 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter {
protected Rectangle getLayoutBound(XWCardMainBorderLayout mainLayout) { protected Rectangle getLayoutBound(XWCardMainBorderLayout mainLayout) {
return ComponentUtils.getRelativeBounds(mainLayout); return ComponentUtils.getRelativeBounds(mainLayout);
} }
} }

7
designer_form/src/com/fr/design/designer/beans/location/AccessDirection.java

@ -3,18 +3,17 @@
*/ */
package com.fr.design.designer.beans.location; package com.fr.design.designer.beans.location;
import java.awt.*;
import com.fr.design.beans.location.Absorptionline; import com.fr.design.beans.location.Absorptionline;
import com.fr.design.beans.location.MoveUtils; import com.fr.design.beans.location.MoveUtils;
import com.fr.design.designer.creator.*; import com.fr.design.designer.creator.*;
import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelection; import com.fr.design.mainframe.FormSelection;
import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.ComponentUtils;
import com.fr.form.main.Form;
import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
import com.fr.form.ui.container.WParameterLayout; import com.fr.form.ui.container.WParameterLayout;
import com.fr.form.ui.widget.BoundsWidget;
import java.awt.*;
/** /**
* @author richer * @author richer

2
designer_form/src/com/fr/design/designer/beans/location/Inner.java

@ -9,8 +9,8 @@ import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelection; import com.fr.design.mainframe.FormSelection;
import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.ComponentUtils;
import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.widget.BoundsWidget;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
import java.awt.*; import java.awt.*;
import java.awt.Rectangle; import java.awt.Rectangle;

46
designer_form/src/com/fr/design/designer/beans/models/AddingModel.java

@ -21,8 +21,8 @@ public class AddingModel {
// 当前要添加的组件 // 当前要添加的组件
private XCreator creator; private XCreator creator;
// 记录当前鼠标的位置信息 // 记录当前鼠标的位置信息
private int current_x; private int currentX;
private int current_y; private int currentY;
private boolean added; private boolean added;
public AddingModel(FormDesigner designer, XCreator xCreator) { public AddingModel(FormDesigner designer, XCreator xCreator) {
@ -30,12 +30,13 @@ public class AddingModel {
this.creator = xCreator; this.creator = xCreator;
instantiateCreator(designer, creatorName); instantiateCreator(designer, creatorName);
// 初始的时候隐藏该组件的图标 // 初始的时候隐藏该组件的图标
current_x = -this.creator.getWidth(); currentY = -this.creator.getWidth();
current_y = -this.creator.getHeight(); currentX = -this.creator.getHeight();
} }
/** /**
* 待说明 * 待说明
*
* @param designer 设计器 * @param designer 设计器
* @param creatorName 组件名 * @param creatorName 组件名
*/ */
@ -52,20 +53,20 @@ public class AddingModel {
this.creator.backupCurrentSize(); this.creator.backupCurrentSize();
this.creator.backupParent(); this.creator.backupParent();
this.creator.setSize(xCreator.initEditorSize()); this.creator.setSize(xCreator.initEditorSize());
current_x = x - (xCreator.getWidth() / 2); currentX = x - (xCreator.getWidth() / 2);
current_y = y - (xCreator.getHeight() / 2); currentY = y - (xCreator.getHeight() / 2);
} }
/** /**
* 隐藏当前组件的图标 * 隐藏当前组件的图标
*/ */
public void reset() { public void reset() {
current_x = -this.creator.getWidth(); currentX = -this.creator.getWidth();
current_y = -this.creator.getHeight(); currentY = -this.creator.getHeight();
} }
public String getXCreatorName(FormDesigner designer,XCreator x){ public String getXCreatorName(FormDesigner designer, XCreator x) {
String def= x.createDefaultName(); String def = x.createDefaultName();
if (x.acceptType(XWParameterLayout.class)) { if (x.acceptType(XWParameterLayout.class)) {
return def; return def;
} }
@ -73,26 +74,27 @@ public class AddingModel {
while (designer.getTarget().isNameExist(def + i)) { while (designer.getTarget().isNameExist(def + i)) {
i++; i++;
} }
return def+i; return def + i;
} }
public int getCurrentX() { public int getCurrentX() {
return current_x; return currentX;
} }
public int getCurrentY() { public int getCurrentY() {
return current_y; return currentY;
} }
/** /**
* 移动组件图标到鼠标事件发生的位置 * 移动组件图标到鼠标事件发生的位置
*
* @param x 坐标 * @param x 坐标
* @param y 坐标 * @param y 坐标
*/ */
public void moveTo(int x, int y) { public void moveTo(int x, int y) {
current_x = x - (this.creator.getWidth() / 2); currentX = x - (this.creator.getWidth() / 2);
current_y = y - (this.creator.getHeight() / 2); currentY = y - (this.creator.getHeight() / 2);
} }
public XCreator getXCreator() { public XCreator getXCreator() {
@ -101,6 +103,7 @@ public class AddingModel {
/** /**
* 当前组件是否已经添加到某个容器中 * 当前组件是否已经添加到某个容器中
*
* @return 是返回true * @return 是返回true
*/ */
public boolean isCreatorAdded() { public boolean isCreatorAdded() {
@ -109,6 +112,7 @@ public class AddingModel {
/** /**
* 加入容器 * 加入容器
*
* @param designer 设计器 * @param designer 设计器
* @param container 容器 * @param container 容器
* @param x 坐标 * @param x 坐标
@ -118,16 +122,20 @@ public class AddingModel {
public boolean add2Container(FormDesigner designer, XLayoutContainer container, int x, int y) { public boolean add2Container(FormDesigner designer, XLayoutContainer container, int x, int y) {
//考虑不同布局嵌套的情况,获取顶层容器 //考虑不同布局嵌套的情况,获取顶层容器
XLayoutContainer xLayoutContainer = container.getTopLayout(); XLayoutContainer xLayoutContainer = container.getTopLayout();
if(xLayoutContainer != null && xLayoutContainer.acceptType(XWAbsoluteLayout.class)){ if (xLayoutContainer != null && xLayoutContainer.acceptType(XWAbsoluteLayout.class)) {
container = xLayoutContainer; container = xLayoutContainer;
} }
Rectangle rect = ComponentUtils.getRelativeBounds(container); Rectangle rect = ComponentUtils.getRelativeBounds(container);
if(!ComparatorUtils.equals(container.getOuterLayout(), container.getBackupParent())){ if (!ComparatorUtils.equals(container.getOuterLayout(), container.getBackupParent())) {
return added = container.getLayoutAdapter().addBean(creator, x + designer.getArea().getHorizontalValue(), y + designer.getArea().getVerticalValue()); added = container.getLayoutAdapter().addBean(creator,
x + designer.getArea().getHorizontalValue(),
y + designer.getArea().getVerticalValue());
return added;
} }
return added = container.getLayoutAdapter().addBean(creator, added = container.getLayoutAdapter().addBean(creator,
x + designer.getArea().getHorizontalValue() - rect.x, x + designer.getArea().getHorizontalValue() - rect.x,
y + designer.getArea().getVerticalValue() - rect.y); y + designer.getArea().getVerticalValue() - rect.y);
return added;
} }
} }

178
designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java

@ -1,37 +1,37 @@
package com.fr.design.designer.beans.models; package com.fr.design.designer.beans.models;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.beans.location.Direction; import com.fr.design.designer.beans.location.Direction;
import com.fr.design.designer.beans.location.Location; import com.fr.design.designer.beans.location.Location;
import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.*;
import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.cardlayout.XWCardLayout;
import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout;
import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout;
import com.fr.design.designer.creator.XWParameterLayout;
import com.fr.design.form.util.XCreatorConstants; import com.fr.design.form.util.XCreatorConstants;
import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelection; import com.fr.design.mainframe.FormSelection;
import com.fr.design.mainframe.FormSelectionUtils; import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.LayoutUtils; import com.fr.design.utils.gui.LayoutUtils;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
/** /**
* 该model保存当前选择的组件和剪切版信息 * 该model保存当前选择的组件和剪切版信息
*/ */
public class SelectionModel { public class SelectionModel {
//被粘贴组件在所选组件位置处往下、往右各错开20像素。执行多次粘贴时,在上一次粘贴的位置处错开20像素。
private static final int DELTA_X_Y = 20; //粘贴时候的偏移距离 private static final int DELTA_X_Y = 20; //粘贴时候的偏移距离
private static FormSelection CLIP_BOARD = new FormSelection(); private static final double OFFSET_RELATIVE = 0.80;
private static FormSelection clipboard = new FormSelection();
private FormDesigner designer; private FormDesigner designer;
private FormSelection selection; private FormSelection selection;
private Rectangle hotspot_bounds; private Rectangle hotspotBounds;
public SelectionModel(FormDesigner designer) { public SelectionModel(FormDesigner designer) {
this.designer = designer; this.designer = designer;
@ -43,19 +43,21 @@ public class SelectionModel {
*/ */
public void reset() { public void reset() {
selection.reset(); selection.reset();
hotspot_bounds = null; hotspotBounds = null;
} }
/** /**
* formSelction是否为空 * formSelction是否为空
*
* @return 是否为空 * @return 是否为空
*/ */
public static boolean isEmpty(){ public static boolean isEmpty() {
return CLIP_BOARD.isEmpty(); return clipboard.isEmpty();
} }
/** /**
* 鼠标点击一下所选中的单个组件按下Ctrl或者shift键时鼠标可以进行多选 * 鼠标点击一下所选中的单个组件按下Ctrl或者shift键时鼠标可以进行多选
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void selectACreatorAtMouseEvent(MouseEvent e) { public void selectACreatorAtMouseEvent(MouseEvent e) {
@ -63,13 +65,12 @@ public class SelectionModel {
// 如果Ctrl或者Shift键盘没有按下,则清除已经选择的组件 // 如果Ctrl或者Shift键盘没有按下,则清除已经选择的组件
selection.reset(); selection.reset();
} }
// 获取e所在的组件 // 获取e所在的组件
XCreator comp = designer.getComponentAt(e); XCreator comp = designer.getComponentAt(e);
//布局组件的顶层布局如不可编辑,要获取其顶层布局 //布局组件的顶层布局如不可编辑,要获取其顶层布局
XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer(comp).getTopLayout(); XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer(comp).getTopLayout();
if(topLayout != null && !topLayout.isEditable()){ if (topLayout != null && !topLayout.isEditable()) {
comp = topLayout; comp = topLayout;
} }
@ -89,7 +90,7 @@ public class SelectionModel {
*/ */
public void cutSelectedCreator2ClipBoard() { public void cutSelectedCreator2ClipBoard() {
if (hasSelectionComponent()) { if (hasSelectionComponent()) {
selection.cut2ClipBoard(CLIP_BOARD); selection.cut2ClipBoard(clipboard);
designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_CUTED); designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_CUTED);
designer.repaint(); designer.repaint();
} }
@ -100,25 +101,23 @@ public class SelectionModel {
*/ */
public void copySelectedCreator2ClipBoard() { public void copySelectedCreator2ClipBoard() {
if (!selection.isEmpty()) { if (!selection.isEmpty()) {
selection.copy2ClipBoard(CLIP_BOARD); selection.copy2ClipBoard(clipboard);
} }
} }
/** /**
* 从剪切板粘帖组件 * 从剪切板粘帖组件
*
* @return * @return
*/ */
public boolean pasteFromClipBoard() { public boolean pasteFromClipBoard() {
if (!CLIP_BOARD.isEmpty()) { if (!clipboard.isEmpty()) {
XLayoutContainer parent = null; if (!hasSelectedPasteSource()) {
if (!hasSelectionComponent()) { //未选
FormSelectionUtils.paste2Container(designer, designer.getRootComponent(),CLIP_BOARD, DELTA_X_Y, DELTA_X_Y); unselectedPaste();
} else { } else {
parent = XCreatorUtils.getParentXLayoutContainer(selection.getSelectedCreator()); //已选
if (parent != null) { selectedPaste();
Rectangle rec = selection.getSelctionBounds();
FormSelectionUtils.paste2Container(designer, parent,CLIP_BOARD, rec.x + DELTA_X_Y, rec.y + DELTA_X_Y);
}
} }
} else { } else {
Toolkit.getDefaultToolkit().beep(); Toolkit.getDefaultToolkit().beep();
@ -130,6 +129,69 @@ public class SelectionModel {
return selection; return selection;
} }
/**
* 粘贴时未选择组件
*/
private void unselectedPaste() {
if (designer.getClass().equals(FormDesigner.class)) {
if (selection.getSelectedCreator() instanceof XWFitLayout) {
if (selection.getSelectedCreator().getClass().equals(XWTabFitLayout.class)) {
Rectangle rec = selection.getRelativeBounds();
//Tab布局
FormSelectionUtils.paste2Container(designer, (XLayoutContainer) selection.getSelectedCreator(),
clipboard,
rec.x + rec.width / 2,
rec.y + DELTA_X_Y);
} else {
Rectangle rec = selection.getRelativeBounds();
//自适应布局
FormSelectionUtils.paste2Container(designer, designer.getRootComponent(),
clipboard,
rec.x + rec.width / 2,
rec.y + DELTA_X_Y);
}
} else {
//绝对布局
//编辑器外面还有两层容器,使用designer.getRootComponent()获取到的是编辑器中层的容器,不是编辑器表层
//当前选择的就是编辑器表层
FormSelectionUtils.paste2Container(designer, (XLayoutContainer) selection.getSelectedCreator(),
clipboard,
DELTA_X_Y,
DELTA_X_Y);
}
} else {
//cpt本地组件复用,编辑器就一层,是最底层,使用designer.getRootComponent()就可以获取到
//使用selection.getSelectedCreator()也应该是可以获取到的。
FormSelectionUtils.paste2Container(designer, designer.getRootComponent(),
clipboard,
DELTA_X_Y,
DELTA_X_Y);
}
}
/**
* 粘贴时选择组件
*/
private void selectedPaste() {
XLayoutContainer container = null;
//获取到编辑器的表层容器(已选的组件的父容器就是表层容器)
container = XCreatorUtils.getParentXLayoutContainer(selection.getSelectedCreator());
if (container != null && selection.getSelectedCreator().getParent() instanceof XWFitLayout) {
//自适应布局
Rectangle selectionRec = selection.getRelativeBounds();
Rectangle containerRec = ComponentUtils.getRelativeBounds(container);
//计算自适应布局位置
int positionX = selectionRec.x - containerRec.x + selectionRec.width / 2;
int positionY = (int) (selectionRec.y - containerRec.y + selectionRec.height * OFFSET_RELATIVE);
FormSelectionUtils.paste2Container(designer, container, clipboard, positionX, positionY);
} else if (container != null && selection.getSelectedCreator().getParent() instanceof XWAbsoluteLayout) {
//绝对布局
Rectangle rec = selection.getSelctionBounds();
FormSelectionUtils.paste2Container(designer, container, clipboard, rec.x + DELTA_X_Y, rec.y + DELTA_X_Y);
}
}
/** /**
* 删除当前所有选择的组件 * 删除当前所有选择的组件
*/ */
@ -138,16 +200,16 @@ public class SelectionModel {
if (roots.length > 0) { if (roots.length > 0) {
for (XCreator creator : roots) { for (XCreator creator : roots) {
if(creator.acceptType(XWParameterLayout.class)){ if (creator.acceptType(XWParameterLayout.class)) {
designer.removeParaComponent(); designer.removeParaComponent();
} }
removeCreatorFromContainer(creator, creator.getWidth(), creator.getHeight()); removeCreatorFromContainer(creator, creator.getWidth(), creator.getHeight());
creator.removeAll(); creator.removeAll();
// 清除被选中的组件 // 清除被选中的组件
selection.reset(); selection.reset();
} }
setSelectedCreator(designer.getRootComponent()); setSelectedCreator(designer.getRootComponent());
FormSelectionUtils.rebuildSelection(designer);
// 触发事件 // 触发事件
designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_DELETED); designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_DELETED);
designer.repaint(); designer.repaint();
@ -171,14 +233,14 @@ public class SelectionModel {
* 设置选择区域 * 设置选择区域
*/ */
public void setHotspotBounds(Rectangle rect) { public void setHotspotBounds(Rectangle rect) {
hotspot_bounds = rect; hotspotBounds = rect;
} }
/** /**
* 获得当前选择区域 * 获得当前选择区域
*/ */
public Rectangle getHotspotBounds() { public Rectangle getHotspotBounds() {
return hotspot_bounds; return hotspotBounds;
} }
private void removeCreatorFromContainer(XCreator creator, int creatorWidth, int creatorHeight) { private void removeCreatorFromContainer(XCreator creator, int creatorWidth, int creatorHeight) {
@ -203,6 +265,50 @@ public class SelectionModel {
/** /**
* 是否有组件被选择如果所选组件是最底层容器也视为无选择 * 是否有组件被选择如果所选组件是最底层容器也视为无选择
*
* @return 是则返回true
* yaoh.wu 不应该通过判断是否是最底层容器来判断是否选择了组件
* 而是应该判断选择的容器是否是编辑器的最表层容器,也就是点击空白地方选择的容器
* 但是直接判断选择的容器是否是编辑器最表层类型又会引发拖动时选不上的情况
* 因此通过判断父容器来实现
* <p>
* 举例frm组件复用 绝对布局情况下不选择时有三层容器
* 底层@see {@link com.fr.design.designer.creator.XWBorderLayout}
* 中层@see {@link XWFitLayout}
* 表层@see {@link com.fr.design.designer.creator.XWAbsoluteBodyLayout}
* <p>
* 但是编辑窗口的最外层其实是表层@see {@link com.fr.design.designer.creator.XWAbsoluteBodyLayout},
* 其他两层不是靠添加组件就可以编辑的
*/
public boolean hasSelectedPasteSource() {
XCreator selectionXCreator = selection.getSelectedCreator();
if (designer.getClass().equals(FormDesigner.class)) {
//frm本地组件复用
if (selectionXCreator != null) {
//选中的是否是tab布局编辑器本身
boolean tabEditor = selectionXCreator.getClass().equals(XWCardMainBorderLayout.class)
|| selectionXCreator.getClass().equals(XWCardLayout.class)
|| selectionXCreator.getClass().equals(XWTabFitLayout.class);
//选中的是否是frm绝对布局编辑器本身
boolean absoluteEditor = selectionXCreator.getClass().equals(XWAbsoluteBodyLayout.class);
//选中是否是frm绝对画布块编辑器本身
boolean absoluteCanvas = selectionXCreator.getClass().equals(XWAbsoluteLayout.class);
//选中的是否是相对布局编辑器本身
boolean relativeEditor = selectionXCreator.getClass().equals(XWFitLayout.class);
return !(tabEditor || absoluteEditor || absoluteCanvas || relativeEditor);
} else {
return false;
}
} else {
//cpt本地组件复用,selection.getSelectedCreator().getParent()=@XWParameterLayout instanceof @XWAbsoluteLayout
return selectionXCreator != null && selectionXCreator.getParent() != null;
}
}
/**
* 是否有组件被选择如果所选组件是最底层容器也视为无选择
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean hasSelectionComponent() { public boolean hasSelectionComponent() {
@ -211,6 +317,7 @@ public class SelectionModel {
/** /**
* 移动组件至指定位置 * 移动组件至指定位置
*
* @param x 坐标x * @param x 坐标x
* @param y 坐标y * @param y 坐标y
*/ */
@ -248,11 +355,10 @@ public class SelectionModel {
int x = e.getX() + designer.getArea().getHorizontalValue(); int x = e.getX() + designer.getArea().getHorizontalValue();
int y = e.getY() + designer.getArea().getVerticalValue(); int y = e.getY() + designer.getArea().getVerticalValue();
dir = getDirection(selection.getRelativeBounds(), x, y); dir = getDirection(selection.getRelativeBounds(), x, y);
if (selection.size() == 1) { if (selection.size() == 1 && !ArrayUtils.contains(selection.getSelectedCreator().getDirections(), dir
if (!ArrayUtils.contains(selection.getSelectedCreator().getDirections(), dir.getActual())) { .getActual())) {
dir = Location.outer; dir = Location.outer;
} }
}
} else { } else {
dir = Location.outer; dir = Location.outer;
} }

170
designer_form/src/com/fr/design/designer/beans/models/StateModel.java

@ -1,30 +1,21 @@
package com.fr.design.designer.beans.models; package com.fr.design.designer.beans.models;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import com.fr.design.beans.location.Absorptionline; import com.fr.design.beans.location.Absorptionline;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.HoverPainter; import com.fr.design.designer.beans.HoverPainter;
import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.beans.location.Direction; import com.fr.design.designer.beans.location.Direction;
import com.fr.design.designer.beans.location.Location; import com.fr.design.designer.beans.location.Location;
import com.fr.design.designer.creator.XConnector; import com.fr.design.designer.creator.*;
import com.fr.design.designer.creator.XCreator; import com.fr.design.mainframe.FormDesigner;
import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.ComponentUtils;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
/** /**
* 普通模式下的状态model * 普通模式下的状态model
*/ */
@ -36,8 +27,11 @@ public class StateModel {
private Direction driection; private Direction driection;
// 当前拖拽的起始位置 // 当前拖拽的起始位置
private int current_x; private int currentX;
private int current_y; private int currentY;
//拖拽组件原始位置大小备份
private Rectangle selectedPositionBackup;
private Point startPoint = new Point(); private Point startPoint = new Point();
private Point currentPoint = new Point(); private Point currentPoint = new Point();
@ -62,6 +56,7 @@ public class StateModel {
/** /**
* 返回direction * 返回direction
*
* @return direction方向 * @return direction方向
*/ */
public Direction getDirection() { public Direction getDirection() {
@ -78,7 +73,8 @@ public class StateModel {
} }
/** /**
*是否能拖拽 * 是否能拖拽
*
* @return 非outer且选中为空 * @return 非outer且选中为空
*/ */
public boolean dragable() { public boolean dragable() {
@ -118,22 +114,35 @@ public class StateModel {
} }
} }
private boolean addBean(XLayoutContainer container, int x, int y) { /**
* @param container 容器
* @param mouseX 鼠标释放位置X
* @param mouseY 鼠标释放位置Y
* @return 是否成功
*/
private boolean addBean(XLayoutContainer container, int mouseX, int mouseY) {
LayoutAdapter adapter = container.getLayoutAdapter(); LayoutAdapter adapter = container.getLayoutAdapter();
Rectangle r = ComponentUtils.getRelativeBounds(container); Rectangle rectangleContainer = ComponentUtils.getRelativeBounds(container);
if (selectionModel.getSelection().size() == 1) { if (selectionModel.getSelection().size() == 1) {
return adapter.addBean(selectionModel.getSelection().getSelectedCreator(), x return adapter.addBean(selectionModel.getSelection().getSelectedCreator(),
+ designer.getArea().getHorizontalValue() - r.x, y + designer.getArea().getVerticalValue() - r.y); mouseX + designer.getArea().getHorizontalValue() - rectangleContainer.x,
mouseY + designer.getArea().getVerticalValue() - rectangleContainer.y);
} }
for (XCreator creator : selectionModel.getSelection().getSelectedCreators()) { for (XCreator creator : selectionModel.getSelection().getSelectedCreators()) {
adapter.addBean(creator, x + designer.getArea().getHorizontalValue() - r.x, y + designer.getArea().getVerticalValue()- r.y); adapter.addBean(creator,
mouseX + designer.getArea().getHorizontalValue() - rectangleContainer.x,
mouseY + designer.getArea().getVerticalValue() - rectangleContainer.y);
} }
return true; return true;
} }
private void adding(int x, int y) { /**
* @param mouseReleasedX 鼠标释放位置X
* @param mouseReleasedY 鼠标释放位置Y
*/
private void adding(int mouseReleasedX, int mouseReleasedY) {
// 当前鼠标所在的组件 // 当前鼠标所在的组件
XCreator hoveredComponent = designer.getComponentAt(x, y, selectionModel.getSelection().getSelectedCreators()); XCreator hoveredComponent = designer.getComponentAt(mouseReleasedX, mouseReleasedY, selectionModel.getSelection().getSelectedCreators());
// 获取该组件所在的焦点容器 // 获取该组件所在的焦点容器
XLayoutContainer container = XCreatorUtils.getHotspotContainer(hoveredComponent); XLayoutContainer container = XCreatorUtils.getHotspotContainer(hoveredComponent);
@ -142,7 +151,7 @@ public class StateModel {
if (container != null) { if (container != null) {
// 如果是容器,则调用其acceptComponent接受组件 // 如果是容器,则调用其acceptComponent接受组件
success = addBean(container, x, y); success = addBean(container, mouseReleasedX, mouseReleasedY);
} }
if (success) { if (success) {
@ -150,15 +159,16 @@ public class StateModel {
designer.getEditListenerTable().fireCreatorModified( designer.getEditListenerTable().fireCreatorModified(
selectionModel.getSelection().getSelectedCreator(), DesignerEvent.CREATOR_ADDED); selectionModel.getSelection().getSelectedCreator(), DesignerEvent.CREATOR_ADDED);
} else { } else {
selectionModel.getSelection().setSelectionBounds(selectedPositionBackup, designer);
Toolkit.getDefaultToolkit().beep(); Toolkit.getDefaultToolkit().beep();
} }
// 取消提示 // 取消提示
designer.setPainter(null); designer.setPainter(null);
} }
/** /**
*是否拖拽 * 是否拖拽
*
* @return dragging状态 * @return dragging状态
*/ */
public boolean isDragging() { public boolean isDragging() {
@ -166,7 +176,8 @@ public class StateModel {
} }
/** /**
*是否可以开始画线 * 是否可以开始画线
*
* @return startPoint不为空返回true * @return startPoint不为空返回true
*/ */
public boolean prepareForDrawLining() { public boolean prepareForDrawLining() {
@ -174,7 +185,8 @@ public class StateModel {
} }
/** /**
*设置开始位置 * 设置开始位置
*
* @param p point位置 * @param p point位置
*/ */
public void setStartPoint(Point p) { public void setStartPoint(Point p) {
@ -182,7 +194,8 @@ public class StateModel {
} }
/** /**
*返回开始位置 * 返回开始位置
*
* @return 点位置 * @return 点位置
*/ */
public Point getStartPoint() { public Point getStartPoint() {
@ -190,7 +203,8 @@ public class StateModel {
} }
/** /**
*返回当前点位置 * 返回当前点位置
*
* @return 点位置 * @return 点位置
*/ */
public Point getEndPoint() { public Point getEndPoint() {
@ -198,35 +212,38 @@ public class StateModel {
} }
/** /**
*当前选中组件 * 当前选中组件
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void startSelecting(MouseEvent e) { public void startSelecting(MouseEvent e) {
selecting = true; selecting = true;
selectionModel.setHotspotBounds(new Rectangle()); selectionModel.setHotspotBounds(new Rectangle());
current_x = getMouseXY(e).x; currentX = getMouseXY(e).x;
current_y = getMouseXY(e).y; currentY = getMouseXY(e).y;
} }
/** /**
*当前鼠标的xy * 当前鼠标的xy
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void startResizing(MouseEvent e) { public void startResizing(MouseEvent e) {
if (!selectionModel.getSelection().isEmpty()) { if (!selectionModel.getSelection().isEmpty()) {
driection.backupBounds(designer); driection.backupBounds(designer);
} }
current_x = getMouseXY(e).x; currentX = getMouseXY(e).x;
current_y = getMouseXY(e).y; currentY = getMouseXY(e).y;
} }
/** /**
*起始点开始DrawLine * 起始点开始DrawLine
*
* @param p 点位置 * @param p 点位置
*/ */
public void startDrawLine(Point p) { public void startDrawLine(Point p) {
this.startPoint = p; this.startPoint = p;
if(p != null) { if (p != null) {
try { try {
designer.setCursor(XConnector.connectorCursor); designer.setCursor(XConnector.connectorCursor);
} catch (Exception e) { } catch (Exception e) {
@ -237,7 +254,8 @@ public class StateModel {
} }
/** /**
*鼠标释放时所在的区域及圈中的组件 * 鼠标释放时所在的区域及圈中的组件
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void selectCreators(MouseEvent e) { public void selectCreators(MouseEvent e) {
@ -246,14 +264,15 @@ public class StateModel {
Rectangle bounds = createCurrentBounds(x, y); Rectangle bounds = createCurrentBounds(x, y);
if ((x != current_x) || (y != current_y)) { if ((x != currentX) || (y != currentY)) {
selectionModel.setSelectedCreators(getHotspotCreators(bounds, designer.getRootComponent())); selectionModel.setSelectedCreators(getHotspotCreators(bounds, designer.getRootComponent()));
} }
selectionModel.setHotspotBounds(null); selectionModel.setHotspotBounds(null);
} }
/** /**
*画所在区域线 * 画所在区域线
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void drawLine(MouseEvent e) { public void drawLine(MouseEvent e) {
@ -270,16 +289,16 @@ public class StateModel {
private Rectangle createCurrentBounds(int x, int y) { private Rectangle createCurrentBounds(int x, int y) {
Rectangle bounds = new Rectangle(); Rectangle bounds = new Rectangle();
bounds.x = Math.min(x, current_x); bounds.x = Math.min(x, currentX);
bounds.y = Math.min(y, current_y); bounds.y = Math.min(y, currentY);
bounds.width = Math.max(x, current_x) - bounds.x; bounds.width = Math.max(x, currentX) - bounds.x;
bounds.height = Math.max(y, current_y) - bounds.y; bounds.height = Math.max(y, currentY) - bounds.y;
return bounds; return bounds;
} }
private ArrayList<XCreator> getHotspotCreators(Rectangle selection, XCreator root) { private ArrayList<XCreator> getHotspotCreators(Rectangle selection, XCreator root) {
ArrayList<XCreator> creators = new ArrayList<XCreator>(); ArrayList<XCreator> creators = new ArrayList<>();
if (!root.isVisible() && !designer.isRoot(root)) { if (!root.isVisible() && !designer.isRoot(root)) {
return creators; return creators;
@ -308,7 +327,7 @@ public class StateModel {
/** /**
*重置model * 重置model
*/ */
public void resetModel() { public void resetModel() {
dragging = false; dragging = false;
@ -316,7 +335,7 @@ public class StateModel {
} }
/** /**
*重置 * 重置
*/ */
public void reset() { public void reset() {
driection = Location.outer; driection = Location.outer;
@ -325,7 +344,7 @@ public class StateModel {
} }
/** /**
*取消拖拽 * 取消拖拽
*/ */
public void draggingCancel() { public void draggingCancel() {
designer.repaint(); designer.repaint();
@ -333,18 +352,20 @@ public class StateModel {
} }
/** /**
*设置可拉伸方向 * 设置可拉伸方向
*
* @param dir 拉伸方向 * @param dir 拉伸方向
*/ */
public void setDirection(Direction dir) { public void setDirection(Direction dir) {
if(driection != dir) { if (driection != dir) {
this.driection = dir; this.driection = dir;
driection.updateCursor(designer); driection.updateCursor(designer);
} }
} }
/** /**
*x吸附线赋值 * x吸附线赋值
*
* @param line 线 * @param line 线
*/ */
public void setXAbsorptionline(Absorptionline line) { public void setXAbsorptionline(Absorptionline line) {
@ -352,7 +373,8 @@ public class StateModel {
} }
/** /**
*y吸附线赋值 * y吸附线赋值
*
* @param line 线 * @param line 线
*/ */
public void setYAbsorptionline(Absorptionline line) { public void setYAbsorptionline(Absorptionline line) {
@ -361,41 +383,48 @@ public class StateModel {
/** /**
* 等距线赋值 * 等距线赋值
*
* @param line 线 * @param line 线
*/ */
public void setEquidistantLine(Absorptionline line){ public void setEquidistantLine(Absorptionline line) {
this.lineEquidistant = line; this.lineEquidistant = line;
} }
/** /**
*画吸附线 * 画吸附线
*
* @param g Graphics类 * @param g Graphics类
*/ */
public void paintAbsorptionline(Graphics g) { public void paintAbsorptionline(Graphics g) {
if(lineInX != null) { if (lineInX != null) {
lineInX.paint(g,designer.getArea()); lineInX.paint(g, designer.getArea());
} }
if(lineInY != null) { if (lineInY != null) {
lineInY.paint(g,designer.getArea()); lineInY.paint(g, designer.getArea());
} }
if(lineEquidistant != null){ if (lineEquidistant != null) {
lineEquidistant.paint(g,designer.getArea()); lineEquidistant.paint(g, designer.getArea());
} }
} }
/** /**
*拖拽 * 拖拽
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void dragging(MouseEvent e) { public void dragging(MouseEvent e) {
//进入dragging状态时备份组件大小和位置
if (!dragging) {
selectedPositionBackup = selectionModel.getSelection().getRelativeBounds();
}
checkAddable(e); checkAddable(e);
setDependLinePainter(e); setDependLinePainter(e);
driection.drag(getMouseXY(e).x-current_x, getMouseXY(e).y-current_y, designer); driection.drag(getMouseXY(e).x - currentX, getMouseXY(e).y - currentY, designer);
this.dragging = true; this.dragging = true;
} }
// 拖拽时画依附线用到的painter // 拖拽时画依附线用到的painter
private void setDependLinePainter(MouseEvent e){ private void setDependLinePainter(MouseEvent e) {
XCreator comp = designer.getComponentAt(e.getX(), e.getY(), selectionModel.getSelection().getSelectedCreators()); XCreator comp = designer.getComponentAt(e.getX(), e.getY(), selectionModel.getSelection().getSelectedCreators());
XLayoutContainer container = XCreatorUtils.getHotspotContainer(comp); XLayoutContainer container = XCreatorUtils.getHotspotContainer(comp);
XCreator creator = selectionModel.getSelection().getSelectedCreator(); XCreator creator = selectionModel.getSelection().getSelectedCreator();
@ -408,7 +437,8 @@ public class StateModel {
} }
/** /**
*释放捕获 * 释放捕获
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void releaseDragging(MouseEvent e) { public void releaseDragging(MouseEvent e) {
@ -422,7 +452,7 @@ public class StateModel {
} }
/** /**
*改变选择区域 * 改变选择区域
* *
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
@ -432,7 +462,7 @@ public class StateModel {
} }
/** /**
*返回鼠标所在的xy 考虑滚动条的值 * 返回鼠标所在的xy 考虑滚动条的值
* *
* @param e 鼠标事件 * @param e 鼠标事件
* @return xy值 * @return xy值

5
designer_form/src/com/fr/design/designer/beans/painters/AbstractPainter.java

@ -22,6 +22,7 @@ public abstract class AbstractPainter implements HoverPainter {
/** /**
* 构造函数 * 构造函数
*
* @param container 容器 * @param container 容器
*/ */
public AbstractPainter(XLayoutContainer container) { public AbstractPainter(XLayoutContainer container) {
@ -35,18 +36,20 @@ public abstract class AbstractPainter implements HoverPainter {
/** /**
* 画初始区域 * 画初始区域
*
* @param g 画图类 * @param g 画图类
* @param startX 起始x位置 * @param startX 起始x位置
* @param startY 起始y位置 * @param startY 起始y位置
*/ */
public void paint(Graphics g, int startX, int startY) { public void paint(Graphics g, int startX, int startY) {
if(hotspot_bounds != null){ if (hotspot_bounds != null) {
drawHotspot(g, hotspot_bounds.x, hotspot_bounds.y, hotspot_bounds.width, hotspot_bounds.height, Color.lightGray, true, false); drawHotspot(g, hotspot_bounds.x, hotspot_bounds.y, hotspot_bounds.width, hotspot_bounds.height, Color.lightGray, true, false);
} }
} }
/** /**
* 设置边界 * 设置边界
*
* @param rect 位置 * @param rect 位置
*/ */
@Override @Override

12
designer_form/src/com/fr/design/designer/creator/DedicateLayoutContainer.java

@ -11,6 +11,7 @@ import java.util.ArrayList;
/** /**
* 一些控件专属的容器如标题容器sclae容器 * 一些控件专属的容器如标题容器sclae容器
*
* @author jim * @author jim
* @date 2014-11-7 * @date 2014-11-7
*/ */
@ -22,6 +23,7 @@ public abstract class DedicateLayoutContainer extends XLayoutContainer {
/** /**
* 得到属性名 * 得到属性名
*
* @return 属性名 * @return 属性名
* @throws IntrospectionException * @throws IntrospectionException
*/ */
@ -36,7 +38,7 @@ public abstract class DedicateLayoutContainer extends XLayoutContainer {
*/ */
@Override @Override
public String getIconPath() { public String getIconPath() {
if(this.getXCreator(XWScaleLayout.INDEX) != null){ if (this.getXCreator(XWScaleLayout.INDEX) != null) {
return this.getXCreator(XWScaleLayout.INDEX).getIconPath(); return this.getXCreator(XWScaleLayout.INDEX).getIconPath();
} }
return "/com/fr/web/images/form/resources/text_field_16.png"; return "/com/fr/web/images/form/resources/text_field_16.png";
@ -45,24 +47,28 @@ public abstract class DedicateLayoutContainer extends XLayoutContainer {
/** /**
* 控件树不显示此组件 * 控件树不显示此组件
*
* @param path 控件树list * @param path 控件树list
*/ */
public void notShowInComponentTree(ArrayList<Component> path) { public void notShowInComponentTree(ArrayList<Component> path) {
path.remove(path.size()-1); path.remove(path.size() - 1);
} }
/** /**
* 重置组件的名称 * 重置组件的名称
*
* @param name 名称 * @param name 名称
*/ */
public void resetCreatorName(String name) { public void resetCreatorName(String name) {
super.resetCreatorName(name); super.resetCreatorName(name);
XCreator child = getXCreator(XWScaleLayout.INDEX); XCreator child = getXCreator(XWScaleLayout.INDEX);
//实现WTitleLayout的SetWidgetName
child.toData().setWidgetName(name); child.toData().setWidgetName(name);
} }
/** /**
* 返回对应属性表的组件scale和title返回其子组件 * 返回对应属性表的组件scale和title返回其子组件
*
* @return 组件 * @return 组件
*/ */
public XCreator getPropertyDescriptorCreator() { public XCreator getPropertyDescriptorCreator() {
@ -71,6 +77,7 @@ public abstract class DedicateLayoutContainer extends XLayoutContainer {
/** /**
* 是否作为控件树的叶子节点 * 是否作为控件树的叶子节点
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean isComponentTreeLeaf() { public boolean isComponentTreeLeaf() {
@ -79,6 +86,7 @@ public abstract class DedicateLayoutContainer extends XLayoutContainer {
/** /**
* 是否为sclae和title专属容器 * 是否为sclae和title专属容器
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean isDedicateContainer() { public boolean isDedicateContainer() {

85
designer_form/src/com/fr/design/designer/creator/XLayoutContainer.java

@ -45,6 +45,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
protected boolean editable = false; protected boolean editable = false;
//鼠标移动到布局画出编辑层 //鼠标移动到布局画出编辑层
protected boolean isMouseEnter = false; protected boolean isMouseEnter = false;
public void setMouseEnter(boolean mouseEnter) { public void setMouseEnter(boolean mouseEnter) {
isMouseEnter = mouseEnter; isMouseEnter = mouseEnter;
} }
@ -56,11 +57,12 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 得到属性名 * 得到属性名
*
* @return 属性名 * @return 属性名
* @throws IntrospectionException * @throws IntrospectionException
*/ */
public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException { public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException {
return new CRPropertyDescriptor[] { return new CRPropertyDescriptor[]{
new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Inter new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Inter
.getLocText("FR-Designer_Form-Widget_Name")), .getLocText("FR-Designer_Form-Widget_Name")),
new CRPropertyDescriptor("borderStyle", this.data.getClass()).setEditorClass( new CRPropertyDescriptor("borderStyle", this.data.getClass()).setEditorClass(
@ -81,6 +83,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 控件名属性 * 控件名属性
*
* @return * @return
* @throws IntrospectionException * @throws IntrospectionException
*/ */
@ -91,6 +94,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 边距属性 * 边距属性
*
* @return * @return
* @throws IntrospectionException * @throws IntrospectionException
*/ */
@ -102,6 +106,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 返回对应的wlayout * 返回对应的wlayout
*
* @return wlayout控件 * @return wlayout控件
*/ */
public WLayout toData() { public WLayout toData() {
@ -123,6 +128,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 当前组件zorder位置替换新的控件 * 当前组件zorder位置替换新的控件
*
* @param widget 控件 * @param widget 控件
* @param oldcreator 旧组件 * @param oldcreator 旧组件
* @return 组件 * @return 组件
@ -141,6 +147,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 初始化时默认的组件大小 * 初始化时默认的组件大小
*
* @return 默认Dimension * @return 默认Dimension
*/ */
public Dimension initEditorSize() { public Dimension initEditorSize() {
@ -172,6 +179,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 设计界面中有组件添加时要通知WLayout容器重新paint * 设计界面中有组件添加时要通知WLayout容器重新paint
*
* @param e 待说明 * @param e 待说明
*/ */
@Override @Override
@ -188,6 +196,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 设计界面中有组件添加时要通知WLayout容器重新paint * 设计界面中有组件添加时要通知WLayout容器重新paint
*
* @param e 待说明 * @param e 待说明
*/ */
@Override @Override
@ -203,6 +212,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 根据widget的属性值来获取 * 根据widget的属性值来获取
*
* @param wgt * @param wgt
* @return * @return
*/ */
@ -233,23 +243,25 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 该组件是否可以拖入参数面板 * 该组件是否可以拖入参数面板
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean canEnterIntoParaPane(){ public boolean canEnterIntoParaPane() {
return false; return false;
} }
/** /**
* 是否作为控件树的叶子节点 * 是否作为控件树的叶子节点
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean isComponentTreeLeaf() { public boolean isComponentTreeLeaf() {
return false; return false;
} }
public List<String> getAllXCreatorNameList(XCreator xCreator, List<String> namelist){ public List<String> getAllXCreatorNameList(XCreator xCreator, List<String> namelist) {
for (int i = 0; i < ((XLayoutContainer)xCreator).getXCreatorCount(); i++) { for (int i = 0; i < ((XLayoutContainer) xCreator).getXCreatorCount(); i++) {
XCreator creatorSon = ((XLayoutContainer)xCreator).getXCreator(i); XCreator creatorSon = ((XLayoutContainer) xCreator).getXCreator(i);
creatorSon.getAllXCreatorNameList(creatorSon, namelist); creatorSon.getAllXCreatorNameList(creatorSon, namelist);
} }
return namelist; return namelist;
@ -257,13 +269,14 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 是否有查询按钮 * 是否有查询按钮
*
* @param xCreator 控件或容器 * @param xCreator 控件或容器
* @return 有无查询按钮 * @return 有无查询按钮
*/ */
public boolean SearchQueryCreators(XCreator xCreator) { public boolean SearchQueryCreators(XCreator xCreator) {
for (int i = 0; i < ((XLayoutContainer)xCreator).getXCreatorCount(); i++) { for (int i = 0; i < ((XLayoutContainer) xCreator).getXCreatorCount(); i++) {
XCreator creatorSon = ((XLayoutContainer)xCreator).getXCreator(i); XCreator creatorSon = ((XLayoutContainer) xCreator).getXCreator(i);
if(creatorSon.SearchQueryCreators(creatorSon)){ if (creatorSon.SearchQueryCreators(creatorSon)) {
return true; return true;
} }
} }
@ -295,71 +308,78 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 主要为自适应用 * 主要为自适应用
* 返回指定point的上方组件 * 返回指定point的上方组件
*
* @param x x位置 * @param x x位置
* @param y y位置 * @param y y位置
* @return 指定位置的组件 * @return 指定位置的组件
*/ */
public Component getTopComp(int x, int y) { public Component getTopComp(int x, int y) {
return this.getComponentAt(x, y-default_Length); return this.getComponentAt(x, y - default_Length);
} }
/** /**
* 主要为自适应用 * 主要为自适应用
* 返回指定point的左方组件 * 返回指定point的左方组件
*
* @param x x位置 * @param x x位置
* @param y y位置 * @param y y位置
* @return 指定位置的组件 * @return 指定位置的组件
*/ */
public Component getLeftComp(int x, int y) { public Component getLeftComp(int x, int y) {
return this.getComponentAt(x-default_Length, y); return this.getComponentAt(x - default_Length, y);
} }
/** /**
* 返回指定point的右方组件 * 返回指定point的右方组件
*
* @param x x位置 * @param x x位置
* @param y y位置 * @param y y位置
* @param w 宽度 * @param w 宽度
* @return 指定位置的组件 * @return 指定位置的组件
*/ */
public Component getRightComp(int x, int y, int w) { public Component getRightComp(int x, int y, int w) {
return this.getComponentAt(x+w+default_Length, y); return this.getComponentAt(x + w + default_Length, y);
} }
/** /**
* 返回指定point的下方组件 * 返回指定point的下方组件
*
* @param x x位置 * @param x x位置
* @param y y位置 * @param y y位置
* @param h 高度 * @param h 高度
* @return 指定位置的组件 * @return 指定位置的组件
*/ */
public Component getBottomComp(int x, int y, int h) { public Component getBottomComp(int x, int y, int h) {
return this.getComponentAt(x, y+h+default_Length); return this.getComponentAt(x, y + h + default_Length);
} }
/** /**
* 返回指定point的上方且是右侧的组件 * 返回指定point的上方且是右侧的组件
*
* @param x x位置 * @param x x位置
* @param y y位置 * @param y y位置
* @param w 宽度 * @param w 宽度
* @return 指定位置的组件 * @return 指定位置的组件
*/ */
public Component getRightTopComp(int x, int y, int w) { public Component getRightTopComp(int x, int y, int w) {
return this.getComponentAt(x+w-default_Length, y-default_Length); return this.getComponentAt(x + w - default_Length, y - default_Length);
} }
/** /**
* 返回指定point的左方且是下侧的组件 * 返回指定point的左方且是下侧的组件
*
* @param x x位置 * @param x x位置
* @param y y位置 * @param y y位置
* @param h 高度 * @param h 高度
* @return 指定位置的组件 * @return 指定位置的组件
*/ */
public Component getBottomLeftComp(int x, int y, int h) { public Component getBottomLeftComp(int x, int y, int h) {
return this.getComponentAt(x-default_Length, y+h-default_Length); return this.getComponentAt(x - default_Length, y + h - default_Length);
} }
/** /**
* 返回指定point的右方且是下侧的组件 * 返回指定point的右方且是下侧的组件
*
* @param x x位置 * @param x x位置
* @param y y位置 * @param y y位置
* @param h 高度 * @param h 高度
@ -367,11 +387,12 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
* @return 指定位置的组件 * @return 指定位置的组件
*/ */
public Component getBottomRightComp(int x, int y, int h, int w) { public Component getBottomRightComp(int x, int y, int h, int w) {
return this.getComponentAt(x+w+default_Length, y+h-default_Length); return this.getComponentAt(x + w + default_Length, y + h - default_Length);
} }
/** /**
* 返回指定point的下方且是右侧的组件 * 返回指定point的下方且是右侧的组件
*
* @param x x位置 * @param x x位置
* @param y y位置 * @param y y位置
* @param h 高度 * @param h 高度
@ -379,11 +400,12 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
* @return 指定位置的组件 * @return 指定位置的组件
*/ */
public Component getRightBottomComp(int x, int y, int h, int w) { public Component getRightBottomComp(int x, int y, int h, int w) {
return this.getComponentAt(x+w-default_Length, y+h+default_Length); return this.getComponentAt(x + w - default_Length, y + h + default_Length);
} }
/** /**
* 是否延迟展示报表内容也就是说是否要等点击了查询之后才执行报表 * 是否延迟展示报表内容也就是说是否要等点击了查询之后才执行报表
*
* @return 如果是true则表示点击之后才开始计算false则表示会根据参数默认值直接计算报表并展现 * @return 如果是true则表示点击之后才开始计算false则表示会根据参数默认值直接计算报表并展现
*/ */
public boolean isDelayDisplayContent() { public boolean isDelayDisplayContent() {
@ -392,18 +414,20 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 是否显示参数界面 * 是否显示参数界面
*
* @return 显示参数界面则返回true否则返回false * @return 显示参数界面则返回true否则返回false
*/ */
public boolean isDisplay() { public boolean isDisplay() {
return false; return false;
} }
public Background getDataBackground(){ public Background getDataBackground() {
return toData().getBackground(); return toData().getBackground();
} }
/** /**
* 获取参数界面的宽度 * 获取参数界面的宽度
*
* @return 宽度 * @return 宽度
*/ */
public int getDesignWidth() { public int getDesignWidth() {
@ -412,6 +436,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/** /**
* 获取参数面板的对齐方式 * 获取参数面板的对齐方式
*
* @return 左中右三种对齐方式 * @return 左中右三种对齐方式
*/ */
public int getPosition() { public int getPosition() {
@ -423,20 +448,16 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
* *
* @param designer 表单设计器 * @param designer 表单设计器
*/ */
public void stopAddingState(FormDesigner designer){ public void stopAddingState(FormDesigner designer) {
return;
} }
/** /**
* 寻找最近的为自适应布局的父容器 * 寻找最近的为自适应布局的父容器
* *
* @return 布局容器 * @return 布局容器
*
*
* @date 2014-12-30-下午3:15:28 * @date 2014-12-30-下午3:15:28
*
*/ */
public XLayoutContainer findNearestFit(){ public XLayoutContainer findNearestFit() {
//一层一层网上找, 找到最近的fit那一层就return //一层一层网上找, 找到最近的fit那一层就return
XLayoutContainer parent = this.getBackupParent(); XLayoutContainer parent = this.getBackupParent();
return parent == null ? null : parent.findNearestFit(); return parent == null ? null : parent.findNearestFit();
@ -447,7 +468,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
* *
* @return 横坐标数组 * @return 横坐标数组
*/ */
public int[] getHors(){ public int[] getHors() {
return ArrayUtils.EMPTY_INT_ARRAY; return ArrayUtils.EMPTY_INT_ARRAY;
} }
@ -456,39 +477,41 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
* *
* @return 纵坐标数组 * @return 纵坐标数组
*/ */
public int[] getVeris(){ public int[] getVeris() {
return ArrayUtils.EMPTY_INT_ARRAY; return ArrayUtils.EMPTY_INT_ARRAY;
} }
public void setDelayDisplayContent(boolean delayPlaying){ public void setDelayDisplayContent(boolean delayPlaying) {
} }
public void setPosition(int align){ public void setPosition(int align) {
} }
public void setDisplay(boolean showWindow){ public void setDisplay(boolean showWindow) {
} }
public void setBackground(Background background){ public void setBackground(Background background) {
} }
/** /**
* 布局是否可编辑不可则显示编辑蒙层 * 布局是否可编辑不可则显示编辑蒙层
*
* @return 可否编辑 * @return 可否编辑
*/ */
public boolean isEditable(){ public boolean isEditable() {
return this.editable; return this.editable;
} }
/** /**
* 设置布局是否可编辑不可则显示编辑蒙层 * 设置布局是否可编辑不可则显示编辑蒙层
*
* @param isEditable 可否编辑 * @param isEditable 可否编辑
*/ */
public void setEditable(boolean isEditable){ public void setEditable(boolean isEditable) {
this.editable = isEditable; this.editable = isEditable;
} }
} }

23
designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java

@ -8,6 +8,7 @@ import java.awt.event.ContainerEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.beans.IntrospectionException; import java.beans.IntrospectionException;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.AdapterBus;
@ -16,6 +17,7 @@ import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.FRAbsoluteLayoutAdapter; import com.fr.design.designer.beans.adapters.layout.FRAbsoluteLayoutAdapter;
import com.fr.design.designer.beans.location.Direction; import com.fr.design.designer.beans.location.Direction;
import com.fr.design.designer.beans.models.SelectionModel; import com.fr.design.designer.beans.models.SelectionModel;
import com.fr.design.designer.creator.cardlayout.XWTabFitLayout;
import com.fr.design.form.layout.FRAbsoluteLayout; import com.fr.design.form.layout.FRAbsoluteLayout;
import com.fr.design.icon.IconPathConstants; import com.fr.design.icon.IconPathConstants;
import com.fr.design.mainframe.*; import com.fr.design.mainframe.*;
@ -23,7 +25,7 @@ import com.fr.form.ui.Connector;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WLayout; import com.fr.form.ui.container.WLayout;
import com.fr.form.ui.widget.BoundsWidget; import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
import com.fr.general.FRScreen; import com.fr.general.FRScreen;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import com.fr.general.Inter; import com.fr.general.Inter;
@ -154,8 +156,15 @@ public class XWAbsoluteLayout extends XLayoutContainer {
if (xCreator.acceptType(XWAbsoluteLayout.class)){ if (xCreator.acceptType(XWAbsoluteLayout.class)){
((XWAbsoluteLayout) xCreator).updateBoundsWidget(); ((XWAbsoluteLayout) xCreator).updateBoundsWidget();
} }
BoundsWidget boundsWidget = layout.getBoundsWidget(xCreator.toData()); // 如果子组件时tab布局,则tab布局内部的组件的wiget也要更新,否则保存后重新打开大小不对
Rectangle rectangle = dealWidgetBound(xCreator.getBounds()); ArrayList<?> childrenList = xCreator.getTargetChildrenList();
if(!childrenList.isEmpty()){
for(int i=0; i<childrenList.size(); i++){
XWTabFitLayout tabLayout = (XWTabFitLayout) childrenList.get(i);
tabLayout.updateBoundsWidget();
}
}
BoundsWidget boundsWidget = (BoundsWidget) layout.getBoundsWidget(xCreator.toData()); Rectangle rectangle = dealWidgetBound(xCreator.getBounds());
} }
private Rectangle calculateBound(Rectangle rec, double pw, double ph){ private Rectangle calculateBound(Rectangle rec, double pw, double ph){
@ -179,7 +188,7 @@ public class XWAbsoluteLayout extends XLayoutContainer {
double percentH = ((double) backupBound.height / (double) currentBound.height); double percentH = ((double) backupBound.height / (double) currentBound.height);
for (int index = 0, n = this.getComponentCount(); index < n; index++){ for (int index = 0, n = this.getComponentCount(); index < n; index++){
XCreator creator = (XCreator) this.getComponent(index); XCreator creator = (XCreator) this.getComponent(index);
BoundsWidget wgt = layout.getBoundsWidget(creator.toData()); BoundsWidget wgt = (BoundsWidget) layout.getBoundsWidget(creator.toData());
// 用当前的显示大小计算后调正具体位置 // 用当前的显示大小计算后调正具体位置
Rectangle wgtBound = creator.getBounds(); Rectangle wgtBound = creator.getBounds();
Rectangle rec = calculateBound(wgtBound, percentW, percentH); Rectangle rec = calculateBound(wgtBound, percentW, percentH);
@ -211,7 +220,7 @@ public class XWAbsoluteLayout extends XLayoutContainer {
rec.y = (int)(rec.y / prevContainerPercent * containerPercent); rec.y = (int)(rec.y / prevContainerPercent * containerPercent);
rec.height = (int)(rec.height / prevContainerPercent * containerPercent); rec.height = (int)(rec.height / prevContainerPercent * containerPercent);
rec.width = (int)(rec.width / prevContainerPercent * containerPercent); rec.width = (int)(rec.width / prevContainerPercent * containerPercent);
BoundsWidget wgt = toData().getBoundsWidget(creator.toData()); BoundsWidget wgt = (BoundsWidget) toData().getBoundsWidget(creator.toData());
wgt.setBounds(rec); wgt.setBounds(rec);
creator.setBounds(rec); creator.setBounds(rec);
creator.updateChildBound(minHeight); creator.updateChildBound(minHeight);
@ -467,7 +476,7 @@ public class XWAbsoluteLayout extends XLayoutContainer {
XCreator xCreator = (XCreator) getComponent(i); XCreator xCreator = (XCreator) getComponent(i);
Rectangle rectangle = xCreator.getBounds(); Rectangle rectangle = xCreator.getBounds();
xCreator.setBounds((int) (rectangle.x * percent), rectangle.y, (int) (rectangle.width * percent), rectangle.height); xCreator.setBounds((int) (rectangle.x * percent), rectangle.y, (int) (rectangle.width * percent), rectangle.height);
BoundsWidget widget = toData().getBoundsWidget(xCreator.toData()); BoundsWidget widget = (BoundsWidget) toData().getBoundsWidget(xCreator.toData());
widget.setBounds(xCreator.getBounds()); widget.setBounds(xCreator.getBounds());
} }
} }
@ -483,7 +492,7 @@ public class XWAbsoluteLayout extends XLayoutContainer {
XCreator xCreator = (XCreator) getComponent(i); XCreator xCreator = (XCreator) getComponent(i);
Rectangle rectangle = xCreator.getBounds(); Rectangle rectangle = xCreator.getBounds();
xCreator.setBounds(rectangle.x, (int) (rectangle.y * percent), rectangle.width, (int) (rectangle.height * percent)); xCreator.setBounds(rectangle.x, (int) (rectangle.y * percent), rectangle.width, (int) (rectangle.height * percent));
BoundsWidget widget = toData().getBoundsWidget(xCreator.toData()); BoundsWidget widget = (BoundsWidget) toData().getBoundsWidget(xCreator.toData());
widget.setBounds(xCreator.getBounds()); widget.setBounds(xCreator.getBounds());
} }
} }

23
designer_form/src/com/fr/design/designer/creator/XWFitLayout.java

@ -23,8 +23,8 @@ import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WBodyLayoutType; import com.fr.form.ui.container.WBodyLayoutType;
import com.fr.form.ui.container.WFitLayout; import com.fr.form.ui.container.WFitLayout;
import com.fr.form.ui.container.WLayout; import com.fr.form.ui.container.WLayout;
import com.fr.form.ui.widget.BoundsWidget;
import com.fr.general.FRScreen; import com.fr.general.FRScreen;
import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
import com.fr.general.Inter; import com.fr.general.Inter;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
@ -351,7 +351,7 @@ public class XWFitLayout extends XLayoutContainer {
} }
for (int i=0, size=comps.size(); i<size; i++) { for (int i=0, size=comps.size(); i<size; i++) {
XCreator creator = (XCreator) comps.get(i); XCreator creator = (XCreator) comps.get(i);
BoundsWidget widget = toData().getBoundsWidget(creator.toData()); BoundsWidget widget = (BoundsWidget) toData().getBoundsWidget(creator.toData());
Rectangle rec = widget.getBounds(); Rectangle rec = widget.getBounds();
Rectangle backRec = widget.getBackupBounds(); Rectangle backRec = widget.getBackupBounds();
if (backRec.x<x) { if (backRec.x<x) {
@ -415,7 +415,7 @@ public class XWFitLayout extends XLayoutContainer {
protected void modifyEdgemostCreator(boolean isHor) { protected void modifyEdgemostCreator(boolean isHor) {
for (int i=0, size=this.getComponentCount(); i<size; i++) { for (int i=0, size=this.getComponentCount(); i<size; i++) {
XCreator creator = (XCreator) this.getComponent(i); XCreator creator = (XCreator) this.getComponent(i);
BoundsWidget widget = toData().getBoundsWidget(creator.toData()); BoundsWidget widget = (BoundsWidget) toData().getBoundsWidget(creator.toData());
Rectangle rec = widget.getBackupBounds(); Rectangle rec = widget.getBackupBounds();
if (isHor && notHasRightCreator(rec)) { if (isHor && notHasRightCreator(rec)) {
creator.setSize(creator.getWidth()+needAddWidth, creator.getHeight()); creator.setSize(creator.getWidth()+needAddWidth, creator.getHeight());
@ -480,7 +480,7 @@ public class XWFitLayout extends XLayoutContainer {
} }
for (int i=0, size=comps.size(); i<size; i++) { for (int i=0, size=comps.size(); i<size; i++) {
XCreator creator = (XCreator) comps.get(i); XCreator creator = (XCreator) comps.get(i);
BoundsWidget widget = toData().getBoundsWidget(creator.toData()); BoundsWidget widget = (BoundsWidget) toData().getBoundsWidget(creator.toData());
Rectangle rec = widget.getBounds(); Rectangle rec = widget.getBounds();
Rectangle backRec = widget.getBackupBounds(); Rectangle backRec = widget.getBackupBounds();
if (backRec.y < y) { if (backRec.y < y) {
@ -519,7 +519,7 @@ public class XWFitLayout extends XLayoutContainer {
for (int i=0; i<size; i++) { for (int i=0; i<size; i++) {
Component comp = this.getComponent(i); Component comp = this.getComponent(i);
XCreator creator = (XCreator) comp; XCreator creator = (XCreator) comp;
BoundsWidget widget = toData().getBoundsWidget(creator.toData()); BoundsWidget widget = (BoundsWidget) toData().getBoundsWidget(creator.toData());
Rectangle rec = widget.getBackupBounds(); Rectangle rec = widget.getBackupBounds();
//rec.x小于x,右侧大于x //rec.x小于x,右侧大于x
boolean isLowX = rec.x<x && x<rec.x+rec.width; boolean isLowX = rec.x<x && x<rec.x+rec.width;
@ -535,7 +535,7 @@ public class XWFitLayout extends XLayoutContainer {
for (int i=0,size=this.getComponentCount(); i<size; i++) { for (int i=0,size=this.getComponentCount(); i<size; i++) {
Component comp = this.getComponent(i); Component comp = this.getComponent(i);
XCreator creator = (XCreator) comp; XCreator creator = (XCreator) comp;
BoundsWidget widget = toData().getBoundsWidget(creator.toData()); BoundsWidget widget = (BoundsWidget) toData().getBoundsWidget(creator.toData());
Rectangle rec = widget.getBackupBounds(); Rectangle rec = widget.getBackupBounds();
boolean isLowY = rec.y<y && y<rec.y+rec.height; boolean isLowY = rec.y<y && y<rec.y+rec.height;
if (isLowY || rec.y==y) { if (isLowY || rec.y==y) {
@ -574,7 +574,7 @@ public class XWFitLayout extends XLayoutContainer {
public XCreator getCreatorAt(int x, int y) { public XCreator getCreatorAt(int x, int y) {
for (int i=0,size=this.getComponentCount(); i<size; i++) { for (int i=0,size=this.getComponentCount(); i<size; i++) {
XCreator creator = (XCreator) this.getComponent(i); XCreator creator = (XCreator) this.getComponent(i);
BoundsWidget widget = toData().getBoundsWidget(creator.toData()); BoundsWidget widget = (BoundsWidget) toData().getBoundsWidget(creator.toData());
Rectangle rec = widget.getBackupBounds(); Rectangle rec = widget.getBackupBounds();
boolean isCurrent = rec.x<=x && x<rec.x+rec.width && rec.y<=y && y<rec.y+rec.height; boolean isCurrent = rec.x<=x && x<rec.x+rec.width && rec.y<=y && y<rec.y+rec.height;
if (isCurrent) { if (isCurrent) {
@ -591,7 +591,7 @@ public class XWFitLayout extends XLayoutContainer {
for (int i=0, size=this.getComponentCount(); i<size; i++) { for (int i=0, size=this.getComponentCount(); i<size; i++) {
Component comp = this.getComponent(i); Component comp = this.getComponent(i);
XCreator creator = (XCreator) comp; XCreator creator = (XCreator) comp;
BoundsWidget widget = toData().getBoundsWidget(creator.toData()); BoundsWidget widget = (BoundsWidget) toData().getBoundsWidget(creator.toData());
widget.setBackupBounds(widget.getBounds()); widget.setBackupBounds(widget.getBounds());
} }
} }
@ -736,7 +736,7 @@ public class XWFitLayout extends XLayoutContainer {
int containerHeight = 0; int containerHeight = 0;
for (int index=0, n=this.getComponentCount(); index<n; index++) { for (int index=0, n=this.getComponentCount(); index<n; index++) {
XCreator creator = (XCreator) this.getComponent(index); XCreator creator = (XCreator) this.getComponent(index);
BoundsWidget wgt = layout.getBoundsWidget(creator.toData()); BoundsWidget wgt = (BoundsWidget) layout.getBoundsWidget(creator.toData());
// 用当前的显示大小计算后调正具体位置 // 用当前的显示大小计算后调正具体位置
Rectangle wgtBound = dealWidgetBound(creator.getBounds()); Rectangle wgtBound = dealWidgetBound(creator.getBounds());
Rectangle rec = recalculateWidgetBounds(wgtBound, hors, veris); Rectangle rec = recalculateWidgetBounds(wgtBound, hors, veris);
@ -759,6 +759,7 @@ public class XWFitLayout extends XLayoutContainer {
//如果子组件是绝对布局,则内部的widget也要更新 //如果子组件是绝对布局,则内部的widget也要更新
if (creator.acceptType(XWAbsoluteLayout.class)){ if (creator.acceptType(XWAbsoluteLayout.class)){
((XWAbsoluteLayout) creator).updateBoundsWidget(); ((XWAbsoluteLayout) creator).updateBoundsWidget();
creator.setBackupBound(creator.getBounds());
} }
} }
layout.setContainerHeight(containerHeight); layout.setContainerHeight(containerHeight);
@ -814,7 +815,7 @@ public class XWFitLayout extends XLayoutContainer {
WFitLayout wlayout = this.toData(); WFitLayout wlayout = this.toData();
XWidgetCreator xwc = ((XWidgetCreator) e.getChild()); XWidgetCreator xwc = ((XWidgetCreator) e.getChild());
Widget wgt = xwc.toData(); Widget wgt = xwc.toData();
BoundsWidget bw = wlayout.getBoundsWidget(wgt); BoundsWidget bw = (BoundsWidget) wlayout.getBoundsWidget(wgt);
wlayout.removeWidget(bw); wlayout.removeWidget(bw);
updateBoundsWidget(); updateBoundsWidget();
((FRFitLayoutAdapter)getLayoutAdapter()).updateCreatorBackBound(); ((FRFitLayoutAdapter)getLayoutAdapter()).updateCreatorBackBound();
@ -992,7 +993,7 @@ public class XWFitLayout extends XLayoutContainer {
int val = toData().getCompInterval()/2; int val = toData().getCompInterval()/2;
for (int i=0, len=this.getComponentCount(); i<len; i++) { for (int i=0, len=this.getComponentCount(); i<len; i++) {
XCreator creator = (XCreator) this.getComponent(i); XCreator creator = (XCreator) this.getComponent(i);
BoundsWidget widget = toData().getBoundsWidget(creator.toData()); BoundsWidget widget = (BoundsWidget) toData().getBoundsWidget(creator.toData());
Rectangle rec = widget.getBounds(); Rectangle rec = widget.getBounds();
Dimension d = new Dimension(this.getBackupBound().width, this.getBackupBound().height); Dimension d = new Dimension(this.getBackupBound().width, this.getBackupBound().height);
Rectangle bound = dealBound(rec, d, val, percent); Rectangle bound = dealBound(rec, d, val, percent);

2
designer_form/src/com/fr/design/designer/creator/XWScaleLayout.java

@ -12,7 +12,7 @@ import com.fr.design.designer.beans.adapters.layout.FRScaleLayoutAdapter;
import com.fr.design.form.layout.FRScaleLayout; import com.fr.design.form.layout.FRScaleLayout;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WScaleLayout; import com.fr.form.ui.container.WScaleLayout;
import com.fr.form.ui.widget.BoundsWidget; import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
/** /**
* 自适应布局中添加组件时部分控件如数字文本下拉等需要保持控件默认高度21 用此容器来实现 * 自适应布局中添加组件时部分控件如数字文本下拉等需要保持控件默认高度21 用此容器来实现

2
designer_form/src/com/fr/design/designer/creator/XWTitleLayout.java

@ -11,8 +11,8 @@ import com.fr.form.ui.Label;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.WidgetTitle;
import com.fr.form.ui.container.WTitleLayout; import com.fr.form.ui.container.WTitleLayout;
import com.fr.form.ui.widget.BoundsWidget;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
import java.awt.*; import java.awt.*;
import java.awt.event.ContainerEvent; import java.awt.event.ContainerEvent;

6
designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java

@ -19,8 +19,8 @@ import com.fr.design.mainframe.EditingMouseListener;
import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesigner;
import com.fr.form.ui.container.WBorderLayout; import com.fr.form.ui.container.WBorderLayout;
import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout;
import com.fr.form.ui.widget.BoundsWidget;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
import com.fr.general.Inter; import com.fr.general.Inter;
/** /**
@ -154,7 +154,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout{
tabLayout.getHeight()); tabLayout.getHeight());
for (int m = 0; m < tabLayout.getComponentCount(); m++) { for (int m = 0; m < tabLayout.getComponentCount(); m++) {
XCreator childCreator = tabLayout.getXCreator(m); XCreator childCreator = tabLayout.getXCreator(m);
BoundsWidget wgt = tabLayout.toData() BoundsWidget wgt = (BoundsWidget) tabLayout.toData()
.getBoundsWidget(childCreator.toData()); .getBoundsWidget(childCreator.toData());
wgt.setBounds(tabLayout.getComponent(m).getBounds()); wgt.setBounds(tabLayout.getComponent(m).getBounds());
} }
@ -189,7 +189,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout{
tabLayout.getHeight() + offset); tabLayout.getHeight() + offset);
for (int m = 0; m < tabLayout.getComponentCount(); m++) { for (int m = 0; m < tabLayout.getComponentCount(); m++) {
XCreator childCreator = tabLayout.getXCreator(m); XCreator childCreator = tabLayout.getXCreator(m);
BoundsWidget wgt = tabLayout.toData() BoundsWidget wgt = (BoundsWidget) tabLayout.toData()
.getBoundsWidget(childCreator.toData()); .getBoundsWidget(childCreator.toData());
wgt.setBounds(tabLayout.getComponent(m).getBounds()); wgt.setBounds(tabLayout.getComponent(m).getBounds());
} }

46
designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java

@ -25,8 +25,6 @@ import com.fr.form.ui.container.cardlayout.WCardTagLayout;
import com.fr.form.ui.container.cardlayout.WTabFitLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout;
/** /**
*
*
* @date: 2014-11-25-下午3:11:14 * @date: 2014-11-25-下午3:11:14
*/ */
public class XWCardTagLayout extends XWHorizontalBoxLayout { public class XWCardTagLayout extends XWHorizontalBoxLayout {
@ -75,7 +73,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
private XWCardLayout cardLayout; private XWCardLayout cardLayout;
public XWCardTagLayout(WCardTagLayout widget, Dimension initSize){ public XWCardTagLayout(WCardTagLayout widget, Dimension initSize) {
super(widget, initSize); super(widget, initSize);
} }
@ -92,26 +90,23 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
* 添加组件的监听事件 * 添加组件的监听事件
* *
* @param e 事件 * @param e 事件
*
*
* @date 2014-11-25-下午6:20:10 * @date 2014-11-25-下午6:20:10
*
*/ */
public void componentAdded(ContainerEvent e) { public void componentAdded(ContainerEvent e) {
super.componentAdded(e); super.componentAdded(e);
if (isSwitchingTab()){ if (isSwitchingTab()) {
return; return;
} }
if(this.cardLayout == null){ if (this.cardLayout == null) {
initCardLayout(); initCardLayout();
} }
int index = this.cardLayout.toData().getWidgetCount(); int index = this.cardLayout.toData().getWidgetCount();
//新加一个card //新加一个card
String widgetName = tagName+getTabNameIndex(); String widgetName = tagName + getTabNameIndex();
WTabFitLayout fitLayout = new WTabFitLayout(widgetName,tabFitIndex,currentCard); WTabFitLayout fitLayout = new WTabFitLayout(widgetName, tabFitIndex, currentCard);
fitLayout.setTabNameIndex(getTabNameIndex()); fitLayout.setTabNameIndex(getTabNameIndex());
XWTabFitLayout tabFitLayout = new XWTabFitLayout(fitLayout, new Dimension()); XWTabFitLayout tabFitLayout = new XWTabFitLayout(fitLayout, new Dimension());
tabFitLayout.setBackupParent(cardLayout); tabFitLayout.setBackupParent(cardLayout);
@ -120,9 +115,9 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
cardLayout.showCard(); cardLayout.showCard();
} }
private void initCardLayout(){ private void initCardLayout() {
XWCardTitleLayout titleLayout = (XWCardTitleLayout)this.getBackupParent(); XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.getBackupParent();
XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout)titleLayout.getBackupParent(); XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout) titleLayout.getBackupParent();
this.cardLayout = borderLayout.getCardPart(); this.cardLayout = borderLayout.getCardPart();
} }
@ -132,7 +127,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
*/ */
public void convert() { public void convert() {
isRefreshing = true; isRefreshing = true;
WCardTagLayout layout = (WCardTagLayout)this.toData(); WCardTagLayout layout = (WCardTagLayout) this.toData();
this.removeAll(); this.removeAll();
for (int i = 0; i < layout.getWidgetCount(); i++) { for (int i = 0; i < layout.getWidgetCount(); i++) {
Widget wgt = layout.getWidget(i); Widget wgt = layout.getWidget(i);
@ -150,20 +145,19 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
* *
* @return designer 表单设计器 * @return designer 表单设计器
*/ */
public void stopAddingState(FormDesigner designer){ public void stopAddingState(FormDesigner designer) {
designer.stopAddingState(); designer.stopAddingState();
return;
} }
//新增时去tabFitLayout名字中最大的Index+1,防止重名 //新增时去tabFitLayout名字中最大的Index+1,防止重名
private int getTabNameIndex(){ private int getTabNameIndex() {
int tabNameIndex = 0; int tabNameIndex = 0;
WCardLayout layout = this.cardLayout.toData(); WCardLayout layout = this.cardLayout.toData();
int size = layout.getWidgetCount(); int size = layout.getWidgetCount();
if(size < MIN_SIZE){ if (size < MIN_SIZE) {
return tabNameIndex; return tabNameIndex;
} }
for(int i=0;i<size;i++){ for (int i = 0; i < size; i++) {
WTabFitLayout fitLayout = (WTabFitLayout) layout.getWidget(i); WTabFitLayout fitLayout = (WTabFitLayout) layout.getWidget(i);
int tempIndex = fitLayout.getTabNameIndex(); int tempIndex = fitLayout.getTabNameIndex();
tabNameIndex = Math.max(tempIndex, tabNameIndex); tabNameIndex = Math.max(tempIndex, tabNameIndex);
@ -173,20 +167,20 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
/** /**
* 调整tab宽度 * 调整tab宽度
* * <p>
* void * void
*/ */
public void adjustComponentWidth(){ public void adjustComponentWidth() {
} }
/** /**
* 该布局需要隐藏无需对边框进行操作 * 该布局需要隐藏无需对边框进行操作
* @param 边框
* *
* @param
*/ */
public void setBorder(Border border) { public void setBorder(Border border) {
return;
} }
@Override @Override
@ -202,9 +196,9 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
SelectionModel selectionModel = editingMouseListener.getSelectionModel(); SelectionModel selectionModel = editingMouseListener.getSelectionModel();
XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.getBackupParent(); XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.getBackupParent();
if(titleLayout != null){ if (titleLayout != null) {
XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout)titleLayout.getBackupParent(); XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout) titleLayout.getBackupParent();
if(mainLayout != null){ if (mainLayout != null) {
XWCardLayout cardLayout = mainLayout.getCardPart(); XWCardLayout cardLayout = mainLayout.getCardPart();
selectionModel.setSelectedCreator(cardLayout); selectionModel.setSelectedCreator(cardLayout);
} }

4
designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java

@ -18,7 +18,7 @@ import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.ui.CardSwitchButton; import com.fr.form.ui.CardSwitchButton;
import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WCardTagLayout;
import com.fr.form.ui.container.cardlayout.WTabFitLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout;
import com.fr.form.ui.widget.BoundsWidget; import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
import com.fr.general.Background; import com.fr.general.Background;
import com.fr.general.FRLogger; import com.fr.general.FRLogger;
import com.fr.general.Inter; import com.fr.general.Inter;
@ -425,7 +425,7 @@ public class XWTabFitLayout extends XWFitLayout {
private void updateCompsWidget(){ private void updateCompsWidget(){
for(int m=0;m<this.getComponentCount();m++){ for(int m=0;m<this.getComponentCount();m++){
XCreator childCreator = this.getXCreator(m); XCreator childCreator = this.getXCreator(m);
BoundsWidget wgt = this.toData().getBoundsWidget(childCreator.toData()); BoundsWidget wgt = (BoundsWidget) this.toData().getBoundsWidget(childCreator.toData());
wgt.setBounds(this.getComponent(m).getBounds()); wgt.setBounds(this.getComponent(m).getBounds());
wgt.setBackupBounds(this.getComponent(m).getBounds()); wgt.setBackupBounds(this.getComponent(m).getBounds());
} }

28
designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java

@ -125,6 +125,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
/** /**
* 创建权限编辑面板 * 创建权限编辑面板
*
* @return 面板 * @return 面板
*/ */
public AuthorityEditPane createAuthorityEditPane() { public AuthorityEditPane createAuthorityEditPane() {
@ -133,6 +134,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
/** /**
* 内容属性表面板 * 内容属性表面板
*
* @return 内容属性表面板 * @return 内容属性表面板
*/ */
public JPanel getEastUpPane() { public JPanel getEastUpPane() {
@ -141,6 +143,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
/** /**
* 参数属性表 * 参数属性表
*
* @return 参数属性表 * @return 参数属性表
*/ */
@ -150,6 +153,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
/** /**
* 权限编辑面板 * 权限编辑面板
*
* @return 权限编辑面板 * @return 权限编辑面板
*/ */
public AuthorityEditPane getAuthorityEditPane() { public AuthorityEditPane getAuthorityEditPane() {
@ -309,26 +313,27 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
*/ */
public boolean isWithQueryButton() { public boolean isWithQueryButton() {
XLayoutContainer rootContainer = this.getRootComponent(); XLayoutContainer rootContainer = this.getRootComponent();
return SearchQueryCreators(rootContainer); return searchQueryCreators(rootContainer);
} }
/** /**
* 返回复制粘贴删除等动作 * 返回复制粘贴删除等动作
*
* @return 同上 * @return 同上
*/ */
public Action[] getActions() { public Action[] getActions() {
if (designer_actions == null) { if (designerActions == null) {
designer_actions = new Action[]{new CutAction(this), new CopyAction(this), new PasteAction(this), designerActions = new Action[]{new CutAction(this), new CopyAction(this), new PasteAction(this),
new FormDeleteAction(this)}; new FormDeleteAction(this)};
} }
return designer_actions; return designerActions;
} }
private boolean SearchQueryCreators(XLayoutContainer rootContainer) { private boolean searchQueryCreators(XLayoutContainer rootContainer) {
boolean b = false; boolean b = false;
for (int i = 0; i < rootContainer.getXCreatorCount(); i++) { for (int i = 0; i < rootContainer.getXCreatorCount(); i++) {
if (rootContainer.getXCreator(i) instanceof XLayoutContainer) { if (rootContainer.getXCreator(i) instanceof XLayoutContainer) {
b = SearchQueryCreators((XLayoutContainer) rootContainer.getXCreator(i)); b = searchQueryCreators((XLayoutContainer) rootContainer.getXCreator(i));
} else if (rootContainer.getXCreator(i) instanceof XFormSubmit) { } else if (rootContainer.getXCreator(i) instanceof XFormSubmit) {
b = true; b = true;
} }
@ -380,6 +385,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
/** /**
* 报表直接判断底层是否是绝对布局 * 报表直接判断底层是否是绝对布局
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean hasWAbsoluteLayout() { public boolean hasWAbsoluteLayout() {
@ -401,9 +407,10 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
/** /**
* 是否是报表的参数面板 * 是否是报表的参数面板
*
* @return * @return
*/ */
public boolean isFormParaDesigner(){ public boolean isFormParaDesigner() {
return true; return true;
} }
@ -494,7 +501,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
public void populateRootSize() { public void populateRootSize() {
((FormParameterUI) getTarget()).setDesignSize(getRootComponent().getSize()); ((FormParameterUI) getTarget()).setDesignSize(getRootComponent().getSize());
if (getParaComponent().acceptType(XWParameterLayout.class)) { if (getParaComponent().acceptType(XWParameterLayout.class)) {
WParameterLayout layout = (WParameterLayout)getParaComponent().toData(); WParameterLayout layout = (WParameterLayout) getParaComponent().toData();
layout.setDesignWidth(getRootComponent().getWidth()); layout.setDesignWidth(getRootComponent().getWidth());
} }
} }
@ -554,6 +561,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
/** /**
* 加入参数 * 加入参数
*
* @param parameter 参数 c * @param parameter 参数 c
* @param currentIndex 位置 w * @param currentIndex 位置 w
* @return 是否加入 s * @return 是否加入 s
@ -580,6 +588,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
/** /**
* 加入参数 * 加入参数
*
* @param parameter 参数 c * @param parameter 参数 c
* @param currentIndex 位置 w * @param currentIndex 位置 w
* @return 是否加入 s * @return 是否加入 s
@ -614,6 +623,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
/** /**
* 加入参数 * 加入参数
*
* @param parameterArray 参数 c * @param parameterArray 参数 c
* @param currentIndex 位置 w * @param currentIndex 位置 w
* @return 是否加入 s * @return 是否加入 s
@ -672,6 +682,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
/** /**
* 工具栏 * 工具栏
*
* @return 工具栏面板 g * @return 工具栏面板 g
*/ */
public JPanel[] toolbarPanes4Form() { public JPanel[] toolbarPanes4Form() {
@ -680,6 +691,7 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP
/** /**
* 复制等按钮 * 复制等按钮
*
* @return 按钮组 a * @return 按钮组 a
*/ */
public JComponent[] toolBarButton4Form() { public JComponent[] toolBarButton4Form() {

4
designer_form/src/com/fr/design/mainframe/ConnectorHelper.java

@ -7,7 +7,7 @@ import java.awt.Rectangle;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.ArrayList; import java.util.ArrayList;
import com.fr.form.ui.widget.BoundsWidget; import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
import com.fr.stable.Constants; import com.fr.stable.Constants;
import com.fr.base.GraphHelper; import com.fr.base.GraphHelper;
import com.fr.design.designer.beans.ConnectorCreator; import com.fr.design.designer.beans.ConnectorCreator;
@ -29,7 +29,7 @@ public class ConnectorHelper {
} }
public void resetConnector(Connector connector) { public void resetConnector(Connector connector) {
ConnectorCreator cc = new ConnectorCreator(designer.getTarget().getContainer(),connector.getStartPoint(),connector.getEndPoint()); ConnectorCreator cc = new ConnectorCreator(designer.getTarget().getContainer(), connector.getStartPoint(), connector.getEndPoint());
connector.addAll(cc.createPointList()); connector.addAll(cc.createPointList());
} }

167
designer_form/src/com/fr/design/mainframe/EditingMouseListener.java

@ -1,7 +1,6 @@
package com.fr.design.mainframe; package com.fr.design.mainframe;
import com.fr.base.BaseUtils; import com.fr.base.BaseUtils;
import com.fr.design.beans.location.MoveUtils;
import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.ComponentAdapter; import com.fr.design.designer.beans.ComponentAdapter;
import com.fr.design.designer.beans.events.DesignerEditor; import com.fr.design.designer.beans.events.DesignerEditor;
@ -31,7 +30,6 @@ import java.awt.event.MouseEvent;
*/ */
public class EditingMouseListener extends MouseInputAdapter { public class EditingMouseListener extends MouseInputAdapter {
private static final int INDEX = 0;
private FormDesigner designer; private FormDesigner designer;
/** /**
@ -56,6 +54,7 @@ public class EditingMouseListener extends MouseInputAdapter {
* 选择模型存储当前选择的组件和剪切板 * 选择模型存储当前选择的组件和剪切板
*/ */
private SelectionModel selectionModel; private SelectionModel selectionModel;
/** /**
* 获取选择模型 * 获取选择模型
* *
@ -65,10 +64,10 @@ public class EditingMouseListener extends MouseInputAdapter {
return selectionModel; return selectionModel;
} }
private XCreator last_creator; private XCreator lastXCreator;
private MouseEvent lastPressEvent; private MouseEvent lastPressEvent;
private DesignerEditor<? extends JComponent> current_editor; private DesignerEditor<? extends JComponent> currentEditor;
private XCreator current_creator; private XCreator currentXCreator;
//备份开始拖动的位置和大小 //备份开始拖动的位置和大小
private Rectangle dragBackupBounds; private Rectangle dragBackupBounds;
@ -103,25 +102,25 @@ public class EditingMouseListener extends MouseInputAdapter {
this.promptWindow.add(promptButton); this.promptWindow.add(promptButton);
} }
private void promptUser(int x, int y, XLayoutContainer container){ private void promptUser(int x, int y, XLayoutContainer container) {
if (!selectionModel.getSelection().getSelectedCreator().canEnterIntoAdaptPane() && container.acceptType(XWFitLayout.class)){ if (!selectionModel.getSelection().getSelectedCreator().canEnterIntoAdaptPane() && container.acceptType(XWFitLayout.class)) {
promptWidgetForbidEnter(x ,y , container); promptWidgetForbidEnter(x, y, container);
} else { } else {
cancelPromptWidgetForbidEnter(); cancelPromptWidgetForbidEnter();
} }
} }
private void promptWidgetForbidEnter(int x,int y, XLayoutContainer container){ private void promptWidgetForbidEnter(int x, int y, XLayoutContainer container) {
container.setBorder(BorderFactory.createLineBorder(Color.RED, Constants.LINE_MEDIUM)); container.setBorder(BorderFactory.createLineBorder(Color.RED, Constants.LINE_MEDIUM));
int screen_X = (int)designer.getArea().getLocationOnScreen().getX(); int screenX = (int) designer.getArea().getLocationOnScreen().getX();
int screen_Y = (int)designer.getArea().getLocationOnScreen().getY(); int screenY = (int) designer.getArea().getLocationOnScreen().getY();
this.promptWindow.setSize(promptWindow.getPreferredSize()); this.promptWindow.setSize(promptWindow.getPreferredSize());
this.promptWindow.setPreferredSize(promptWindow.getPreferredSize()); this.promptWindow.setPreferredSize(promptWindow.getPreferredSize());
promptWindow.setLocation(screen_X + x + GAP, screen_Y + y + GAP); promptWindow.setLocation(screenX + x + GAP, screenY + y + GAP);
promptWindow.setVisible(true); promptWindow.setVisible(true);
} }
private void cancelPromptWidgetForbidEnter(){ private void cancelPromptWidgetForbidEnter() {
designer.getRootComponent().setBorder(BorderFactory.createLineBorder(XCreatorConstants.LAYOUT_SEP_COLOR, Constants.LINE_THIN)); designer.getRootComponent().setBorder(BorderFactory.createLineBorder(XCreatorConstants.LAYOUT_SEP_COLOR, Constants.LINE_THIN));
promptWindow.setVisible(false); promptWindow.setVisible(false);
} }
@ -129,6 +128,7 @@ public class EditingMouseListener extends MouseInputAdapter {
/** /**
* 按下 * 按下
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
@ -139,9 +139,7 @@ public class EditingMouseListener extends MouseInputAdapter {
// 获取焦点,以便获取热键 // 获取焦点,以便获取热键
designer.requestFocus(); designer.requestFocus();
} }
if (e.isPopupTrigger()) { if (e.getButton() == MouseEvent.BUTTON1) {
// 为触发上下文菜单预留
} else if (e.getButton() == MouseEvent.BUTTON1) {
Direction dir = selectionModel.getDirectionAt(e); Direction dir = selectionModel.getDirectionAt(e);
if (!BaseUtils.isAuthorityEditing()) { if (!BaseUtils.isAuthorityEditing()) {
@ -157,7 +155,7 @@ public class EditingMouseListener extends MouseInputAdapter {
designer.getArea().getHorizontalValue() + e.getX(), designer.getArea().getHorizontalValue() + e.getX(),
designer.getArea().getVerticalValue() + e.getY())) { designer.getArea().getVerticalValue() + e.getY())) {
lastPressEvent = e; lastPressEvent = e;
last_creator = selectionModel.getSelection().getSelectedCreator(); lastXCreator = selectionModel.getSelection().getSelectedCreator();
} else { } else {
stateModel.startSelecting(e); stateModel.startSelecting(e);
} }
@ -170,6 +168,7 @@ public class EditingMouseListener extends MouseInputAdapter {
/** /**
* 释放 * 释放
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void mouseReleased(MouseEvent e) { public void mouseReleased(MouseEvent e) {
@ -192,17 +191,16 @@ public class EditingMouseListener extends MouseInputAdapter {
} }
} }
lastPressEvent = null; lastPressEvent = null;
last_creator = null; lastXCreator = null;
} }
private void mouseDraggingRelease(MouseEvent e) { private void mouseDraggingRelease(MouseEvent e) {
// 当前鼠标所在的组件 // 当前鼠标所在的组件
XCreator hoveredComponent = designer.getComponentAt(e.getX(), e.getY()); XCreator hoveredComponent = designer.getComponentAt(e.getX(), e.getY());
if(designer.isWidgetsIntersect() && dragBackupBounds != null && hoveredComponent != null){ if (designer.isWidgetsIntersect() && dragBackupBounds != null && hoveredComponent != null) {
XCreator selectionXCreator = designer.getSelectionModel().getSelection().getSelectedCreator(); XCreator selectionXCreator = designer.getSelectionModel().getSelection().getSelectedCreator();
if(selectionXCreator != null){ if (selectionXCreator != null) {
selectionXCreator.setBounds(dragBackupBounds.x, dragBackupBounds.y, dragBackupBounds.width, dragBackupBounds.height); selectionXCreator.setBounds(dragBackupBounds.x, dragBackupBounds.y, dragBackupBounds.width, dragBackupBounds.height);
MoveUtils.hideForbidWindow();
} }
} }
dragBackupBounds = null; dragBackupBounds = null;
@ -219,7 +217,7 @@ public class EditingMouseListener extends MouseInputAdapter {
if (container != null) { if (container != null) {
boolean formSubmit2Adapt = !selectionModel.getSelection().getSelectedCreator().canEnterIntoAdaptPane() boolean formSubmit2Adapt = !selectionModel.getSelection().getSelectedCreator().canEnterIntoAdaptPane()
&& container.acceptType(XWFitLayout.class); && container.acceptType(XWFitLayout.class);
if ( !formSubmit2Adapt) { if (!formSubmit2Adapt) {
// 如果是处于拖拽状态,则释放组件 // 如果是处于拖拽状态,则释放组件
stateModel.releaseDragging(e); stateModel.releaseDragging(e);
} else { } else {
@ -231,17 +229,14 @@ public class EditingMouseListener extends MouseInputAdapter {
} }
/** /**
* 激活上下文菜单待完善 * TODO 激活上下文菜单待完善
* 6.56暂时不支持右键 bugid 8777 * 6.56暂时不支持右键 bugid 8777
*/ */
private void trigger_popup(MouseEvent e) { private void triggerPopup(MouseEvent e) {
XCreator creator = selectionModel.getSelection().getSelectedCreator(); XCreator creator = selectionModel.getSelection().getSelectedCreator();
if (creator == null) { if (creator == null) {
return; return;
} }
JPopupMenu popupMenu = null; JPopupMenu popupMenu = null;
ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, creator); ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, creator);
popupMenu = adapter.getContextPopupMenu(e); popupMenu = adapter.getContextPopupMenu(e);
@ -255,6 +250,7 @@ public class EditingMouseListener extends MouseInputAdapter {
/** /**
* 移动 * 移动
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void mouseMoved(MouseEvent e) { public void mouseMoved(MouseEvent e) {
@ -262,7 +258,7 @@ public class EditingMouseListener extends MouseInputAdapter {
setCoverPaneNotDisplay(e, false); setCoverPaneNotDisplay(e, false);
if(processTopLayoutMouseMove(component, e)){ if (processTopLayoutMouseMove(component, e)) {
return; return;
} }
if (component instanceof XEditorHolder) { if (component instanceof XEditorHolder) {
@ -301,9 +297,9 @@ public class EditingMouseListener extends MouseInputAdapter {
} }
private void elementCaseMouseMoved(MouseEvent e, XCreator component) { private void elementCaseMouseMoved(MouseEvent e, XCreator component) {
xElementCase = (XElementCase)component; xElementCase = (XElementCase) component;
UIButton button = (UIButton)xElementCase.getCoverPane().getComponent(0); UIButton button = (UIButton) xElementCase.getCoverPane().getComponent(0);
if(designer.getCursor().getType() == Cursor.HAND_CURSOR) { if (designer.getCursor().getType() == Cursor.HAND_CURSOR) {
designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} // component.getParent() 是报表块所在的XWTitleLayout } // component.getParent() 是报表块所在的XWTitleLayout
int minX = button.getX() + getParentPositionX(component, 0) - designer.getArea().getHorizontalValue(); int minX = button.getX() + getParentPositionX(component, 0) - designer.getArea().getHorizontalValue();
@ -337,12 +333,12 @@ public class EditingMouseListener extends MouseInputAdapter {
if (rect.contains(e.getPoint())) { if (rect.contains(e.getPoint())) {
return; return;
} }
if(isLinkedHelpDialog){ if (isLinkedHelpDialog) {
xElementCase.destroyHelpDialog(); xElementCase.destroyHelpDialog();
} }
xElementCase.displayCoverPane(false); xElementCase.displayCoverPane(false);
} }
if (xChartEditor != null){ if (xChartEditor != null) {
xChartEditor.displayCoverPane(false); xChartEditor.displayCoverPane(false);
} }
@ -352,13 +348,13 @@ public class EditingMouseListener extends MouseInputAdapter {
designer.repaint(); designer.repaint();
} }
private boolean processTopLayoutMouseMove(XCreator component, MouseEvent e){ private boolean processTopLayoutMouseMove(XCreator component, MouseEvent e) {
XLayoutContainer parent = XCreatorUtils.getHotspotContainer(component).getTopLayout(); XLayoutContainer parent = XCreatorUtils.getHotspotContainer(component).getTopLayout();
if (parent != null){ if (parent != null) {
xTopLayoutContainer = parent; xTopLayoutContainer = parent;
xTopLayoutContainer.setMouseEnter(true); xTopLayoutContainer.setMouseEnter(true);
designer.repaint(); designer.repaint();
if(!xTopLayoutContainer.isEditable()) { if (!xTopLayoutContainer.isEditable()) {
if (designer.getCursor().getType() == Cursor.HAND_CURSOR) { if (designer.getCursor().getType() == Cursor.HAND_CURSOR) {
designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} }
@ -377,17 +373,17 @@ public class EditingMouseListener extends MouseInputAdapter {
return false; return false;
} }
private void processChartEditorMouseMove(XCreator component, MouseEvent e){ private void processChartEditorMouseMove(XCreator component, MouseEvent e) {
if (component instanceof XChartEditor) { if (component instanceof XChartEditor) {
xChartEditor = (XChartEditor)component; xChartEditor = (XChartEditor) component;
UIButton button = (UIButton)xChartEditor.getCoverPane().getComponent(0); UIButton button = (UIButton) xChartEditor.getCoverPane().getComponent(0);
if(designer.getCursor().getType() ==Cursor.HAND_CURSOR) { if (designer.getCursor().getType() == Cursor.HAND_CURSOR) {
designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} }
int minX = button.getX() + getParentPositionX(component, 0) - designer.getArea().getHorizontalValue(); int minX = button.getX() + getParentPositionX(component, 0) - designer.getArea().getHorizontalValue();
int minY = button.getY() + getParentPositionY(component, 0) - designer.getArea().getVerticalValue(); int minY = button.getY() + getParentPositionY(component, 0) - designer.getArea().getVerticalValue();
if(e.getX() + GAP > minX && e.getX() - GAP < minX + button.getWidth()){ if (e.getX() + GAP > minX && e.getX() - GAP < minX + button.getWidth()) {
if( e.getY() + GAP > minY && e.getY() - GAP < minY + button.getHeight()){ if (e.getY() + GAP > minY && e.getY() - GAP < minY + button.getHeight()) {
designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
} }
} }
@ -397,9 +393,9 @@ public class EditingMouseListener extends MouseInputAdapter {
} }
} }
private int getParentPositionX(XCreator comp, int x){ private int getParentPositionX(XCreator comp, int x) {
return comp.getParent() == null ? return comp.getParent() == null ?
x : getParentPositionX((XCreator)comp.getParent(), comp.getParent().getX() + x); x : getParentPositionX((XCreator) comp.getParent(), comp.getParent().getX() + x);
} }
private int getParentPositionY(XCreator comp, int y) { private int getParentPositionY(XCreator comp, int y) {
@ -409,6 +405,7 @@ public class EditingMouseListener extends MouseInputAdapter {
/** /**
* 拖拽 * 拖拽
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void mouseDragged(MouseEvent e) { public void mouseDragged(MouseEvent e) {
@ -423,9 +420,9 @@ public class EditingMouseListener extends MouseInputAdapter {
stateModel.dragging(e); stateModel.dragging(e);
// 获取e所在的焦点组件 // 获取e所在的焦点组件
XCreator hotspot = designer.getComponentAt(e.getX(), e.getY()); XCreator hotspot = designer.getComponentAt(e.getX(), e.getY());
if(dragBackupBounds == null) { if (dragBackupBounds == null) {
XCreator selectingXCreator = designer.getSelectionModel().getSelection().getSelectedCreator(); XCreator selectingXCreator = designer.getSelectionModel().getSelection().getSelectedCreator();
if(selectingXCreator != null){ if (selectingXCreator != null) {
dragBackupBounds = new Rectangle(selectingXCreator.getX(), selectingXCreator.getY(), selectingXCreator.getWidth(), selectingXCreator.getHeight()); dragBackupBounds = new Rectangle(selectingXCreator.getX(), selectingXCreator.getY(), selectingXCreator.getWidth(), selectingXCreator.getHeight());
} }
} }
@ -446,13 +443,13 @@ public class EditingMouseListener extends MouseInputAdapter {
// 如果是拖拽选择区域状态,则更新选择区域 // 如果是拖拽选择区域状态,则更新选择区域
stateModel.changeSelection(e); stateModel.changeSelection(e);
} else { } else {
if ((lastPressEvent == null) || (last_creator == null)) { if ((lastPressEvent == null) || (lastXCreator == null)) {
return; return;
} }
if (e.getPoint().distance(lastPressEvent.getPoint()) > minDragSize) { if (e.getPoint().distance(lastPressEvent.getPoint()) > minDragSize) {
//参数面板和自适应布局不支持拖拽 //参数面板和自适应布局不支持拖拽
if (last_creator.isSupportDrag()){ if (lastXCreator.isSupportDrag()) {
designer.startDraggingComponent(last_creator, lastPressEvent, e.getX(), e.getY()); designer.startDraggingComponent(lastXCreator, lastPressEvent, e.getX(), e.getY());
} }
e.consume(); e.consume();
lastPressEvent = null; lastPressEvent = null;
@ -462,50 +459,50 @@ public class EditingMouseListener extends MouseInputAdapter {
} }
//当前编辑的组件是在布局中,鼠标点击布局外部,需要一次性将布局及其父布局都置为不可编辑 //当前编辑的组件是在布局中,鼠标点击布局外部,需要一次性将布局及其父布局都置为不可编辑
private void setTopLayoutUnEditable(XLayoutContainer clickedTopLayout, XLayoutContainer clickingTopLayout){ private void setTopLayoutUnEditable(XLayoutContainer clickedTopLayout, XLayoutContainer clickingTopLayout) {
//双击的前后点击click为相同对象,过滤掉 //双击的前后点击click为相同对象,过滤掉
if (clickedTopLayout == null || clickedTopLayout == clickingTopLayout){ if (clickedTopLayout == null || clickedTopLayout == clickingTopLayout) {
return; return;
} }
//位于同一层级的控件,父布局相同,过滤掉 //位于同一层级的控件,父布局相同,过滤掉
if (clickingTopLayout != null && clickedTopLayout.getParent() == clickingTopLayout.getParent()){ if (clickingTopLayout != null && clickedTopLayout.getParent() == clickingTopLayout.getParent()) {
return; return;
} }
//前后点击的位于不同层级,要置为不可编辑 //前后点击的位于不同层级,要置为不可编辑
XLayoutContainer xLayoutContainer = (XLayoutContainer)clickedTopLayout.getParent(); XLayoutContainer xLayoutContainer = (XLayoutContainer) clickedTopLayout.getParent();
if (xLayoutContainer == clickingTopLayout){ if (xLayoutContainer == clickingTopLayout) {
return; return;
} }
if (xLayoutContainer != null){ if (xLayoutContainer != null) {
xLayoutContainer.setEditable(false); xLayoutContainer.setEditable(false);
setTopLayoutUnEditable((XLayoutContainer) clickedTopLayout.getParent(), clickingTopLayout); setTopLayoutUnEditable((XLayoutContainer) clickedTopLayout.getParent(), clickingTopLayout);
} }
} }
private boolean isCreatorInLayout(XCreator creator, XCreator layout){ private boolean isCreatorInLayout(XCreator creator, XCreator layout) {
if (creator == layout){ if (creator.equals(layout)) {
return true; return true;
} }
if(layout.getParent() != null){ if (layout.getParent() != null) {
return isCreatorInLayout(creator, (XCreator)layout.getParent()); return isCreatorInLayout(creator, (XCreator) layout.getParent());
} }
return false; return false;
} }
private XCreator processTopLayoutMouseClick(XCreator creator){ private XCreator processTopLayoutMouseClick(XCreator creator) {
XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer(creator).getTopLayout(); XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer(creator).getTopLayout();
if(topLayout != null){ if (topLayout != null) {
if (clickTopLayout != null && clickTopLayout != topLayout && !isCreatorInLayout(clickTopLayout, topLayout)){ if (clickTopLayout != null && !clickTopLayout.equals(topLayout) && !isCreatorInLayout(clickTopLayout,
topLayout)) {
clickTopLayout.setEditable(false); clickTopLayout.setEditable(false);
setTopLayoutUnEditable(clickTopLayout, topLayout); setTopLayoutUnEditable(clickTopLayout, topLayout);
} }
clickTopLayout = topLayout; clickTopLayout = topLayout;
if(!topLayout.isEditable()) { if (!topLayout.isEditable()) {
creator = topLayout; creator = topLayout;
} }
} } else {
else{ if (clickTopLayout != null) {
if(clickTopLayout != null){
clickTopLayout.setEditable(false); clickTopLayout.setEditable(false);
setTopLayoutUnEditable(clickTopLayout, null); setTopLayoutUnEditable(clickTopLayout, null);
} }
@ -513,8 +510,10 @@ public class EditingMouseListener extends MouseInputAdapter {
return creator; return creator;
} }
/** /**
* 点击 * 点击
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
@ -526,7 +525,7 @@ public class EditingMouseListener extends MouseInputAdapter {
creator = processTopLayoutMouseClick(creator); creator = processTopLayoutMouseClick(creator);
if(creator != null){ if (creator != null) {
creator.respondClick(this, e); creator.respondClick(this, e);
} }
creator.doLayout(); creator.doLayout();
@ -534,9 +533,9 @@ public class EditingMouseListener extends MouseInputAdapter {
} }
/** /**
* 离开 * 离开
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void mouseExited(MouseEvent e) { public void mouseExited(MouseEvent e) {
@ -551,6 +550,7 @@ public class EditingMouseListener extends MouseInputAdapter {
/** /**
* 开始编辑 * 开始编辑
*
* @param creator 容器 * @param creator 容器
* @param designerEditor 设计器 * @param designerEditor 设计器
* @param adapter 适配器 * @param adapter 适配器
@ -558,8 +558,8 @@ public class EditingMouseListener extends MouseInputAdapter {
public void startEditing(XCreator creator, DesignerEditor<? extends JComponent> designerEditor, ComponentAdapter adapter) { public void startEditing(XCreator creator, DesignerEditor<? extends JComponent> designerEditor, ComponentAdapter adapter) {
if (designerEditor != null) { if (designerEditor != null) {
Rectangle rect = ComponentUtils.getRelativeBounds(creator); Rectangle rect = ComponentUtils.getRelativeBounds(creator);
current_editor = designerEditor; currentEditor = designerEditor;
current_creator = creator; currentXCreator = creator;
Rectangle bounds = new Rectangle(1, 1, creator.getWidth() - 2, creator.getHeight() - 2); Rectangle bounds = new Rectangle(1, 1, creator.getWidth() - 2, creator.getHeight() - 2);
bounds.x += (rect.x - designer.getArea().getHorizontalValue()); bounds.x += (rect.x - designer.getArea().getHorizontalValue());
bounds.y += (rect.y - designer.getArea().getVerticalValue()); bounds.y += (rect.y - designer.getArea().getVerticalValue());
@ -574,22 +574,23 @@ public class EditingMouseListener extends MouseInputAdapter {
/** /**
* 停止编辑 * 停止编辑
*
* @return 是否编辑成功 * @return 是否编辑成功
*/ */
public boolean stopEditing() { public boolean stopEditing() {
if (current_editor != null) { if (currentEditor != null) {
designer.remove(current_editor.getEditorTarget()); designer.remove(currentEditor.getEditorTarget());
current_editor.fireEditStoped(); currentEditor.fireEditStoped();
Container container = current_creator.getParent(); Container container = currentXCreator.getParent();
if (container != null) { if (container != null) {
LayoutUtils.layoutRootContainer(container); LayoutUtils.layoutRootContainer(container);
} }
designer.invalidate(); designer.invalidate();
designer.repaint(); designer.repaint();
current_creator = null; currentXCreator = null;
current_editor = null; currentEditor = null;
return true; return true;
} }
return true; return true;
@ -599,22 +600,22 @@ public class EditingMouseListener extends MouseInputAdapter {
* 重置编辑控件大小 * 重置编辑控件大小
*/ */
public void resetEditorComponentBounds() { public void resetEditorComponentBounds() {
if (current_editor == null) { if (currentEditor == null) {
return; return;
} }
if (current_creator.getParent() == null) { if (currentXCreator.getParent() == null) {
stopEditing(); stopEditing();
return; return;
} }
Rectangle rect = ComponentUtils.getRelativeBounds(current_creator); Rectangle rect = ComponentUtils.getRelativeBounds(currentXCreator);
Rectangle bounds = new Rectangle(1, 1, current_creator.getWidth() - 2, current_creator.getHeight() - 2); Rectangle bounds = new Rectangle(1, 1, currentXCreator.getWidth() - 2, currentXCreator.getHeight() - 2);
bounds.x += (rect.x - designer.getArea().getHorizontalValue()); bounds.x += (rect.x - designer.getArea().getHorizontalValue());
bounds.y += (rect.y - designer.getArea().getVerticalValue()); bounds.y += (rect.y - designer.getArea().getVerticalValue());
if (current_creator instanceof XEditorHolder) { if (currentXCreator instanceof XEditorHolder) {
ToolTipEditor.getInstance().resetBounds((XEditorHolder) current_creator, bounds, current_editor.getEditorTarget().getBounds()); ToolTipEditor.getInstance().resetBounds((XEditorHolder) currentXCreator, bounds, currentEditor.getEditorTarget().getBounds());
} }
current_editor.getEditorTarget().setBounds(bounds); currentEditor.getEditorTarget().setBounds(bounds);
} }
} }

17
designer_form/src/com/fr/design/mainframe/FormCreatorDropTarget.java

@ -43,7 +43,7 @@ public class FormCreatorDropTarget extends DropTarget {
* 当前添加模式对应的model * 当前添加模式对应的model
*/ */
private AddingModel addingModel; private AddingModel addingModel;
private final static int GAP = 30; private static final int GAP = 30;
private JWindow promptWindow = new JWindow(); private JWindow promptWindow = new JWindow();
private UIButton promptButton = new UIButton("", BaseUtils.readIcon(IconPathConstants.FORBID_ICON_PATH)); private UIButton promptButton = new UIButton("", BaseUtils.readIcon(IconPathConstants.FORBID_ICON_PATH));
@ -59,10 +59,11 @@ public class FormCreatorDropTarget extends DropTarget {
XCreator hoveredComponent = designer.getComponentAt(x, y); XCreator hoveredComponent = designer.getComponentAt(x, y);
// 获取该组件所在的焦点容器 // 获取该组件所在的焦点容器
XLayoutContainer container = XCreatorUtils.getHotspotContainer(hoveredComponent); XLayoutContainer container = XCreatorUtils.getHotspotContainer(hoveredComponent);
//cardTagLayout里用到
container.stopAddingState(designer);
boolean success = false; boolean success = false;
if (container != null) { if (container != null) {
//XWCardTagLayout 切换添加状态到普通状态
container.stopAddingState(designer);
// 如果是容器,则调用其acceptComponent接受组件 // 如果是容器,则调用其acceptComponent接受组件
AddingModel model = designer.getAddingModel(); AddingModel model = designer.getAddingModel();
@ -129,9 +130,7 @@ public class FormCreatorDropTarget extends DropTarget {
//提示组件是否可以拖入 //提示组件是否可以拖入
promptUser(x, y, container); promptUser(x, y, container);
if (container != null) { if (container != null) {
dealWithContainer(x, y, container); dealWithContainer(x, y, container);
} else { } else {
// 如果鼠标不在任何组件上,则取消提示器 // 如果鼠标不在任何组件上,则取消提示器
designer.setPainter(null); designer.setPainter(null);
@ -197,11 +196,9 @@ public class FormCreatorDropTarget extends DropTarget {
private void promptWidgetForbidEnter(int x, int y, XLayoutContainer container) { private void promptWidgetForbidEnter(int x, int y, XLayoutContainer container) {
container.setBorder(BorderFactory.createLineBorder(Color.RED, Constants.LINE_MEDIUM)); container.setBorder(BorderFactory.createLineBorder(Color.RED, Constants.LINE_MEDIUM));
int screen_X = (int) designer.getArea().getLocationOnScreen().getX(); int screenX = designer.getArea().getLocationOnScreen().x;
int screen_Y = (int) designer.getArea().getLocationOnScreen().getY(); int screenY = designer.getArea().getLocationOnScreen().y;
this.promptWindow.setSize(promptWindow.getPreferredSize()); promptWindow.setLocation(screenX + x + GAP, screenY + y + GAP);
this.promptWindow.setPreferredSize(promptWindow.getPreferredSize());
promptWindow.setLocation(screen_X + x + GAP, screen_Y + y + GAP);
promptWindow.setVisible(true); promptWindow.setVisible(true);
} }

189
designer_form/src/com/fr/design/mainframe/FormDesigner.java

@ -6,7 +6,10 @@ import com.fr.design.DesignState;
import com.fr.design.designer.TargetComponent; import com.fr.design.designer.TargetComponent;
import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.Painter; import com.fr.design.designer.beans.Painter;
import com.fr.design.designer.beans.actions.CopyAction;
import com.fr.design.designer.beans.actions.CutAction;
import com.fr.design.designer.beans.actions.FormDeleteAction; import com.fr.design.designer.beans.actions.FormDeleteAction;
import com.fr.design.designer.beans.actions.PasteAction;
import com.fr.design.designer.beans.adapters.layout.FRParameterLayoutAdapter; import com.fr.design.designer.beans.adapters.layout.FRParameterLayoutAdapter;
import com.fr.design.designer.beans.events.CreatorEventListenerTable; import com.fr.design.designer.beans.events.CreatorEventListenerTable;
import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEditListener;
@ -43,7 +46,6 @@ import com.fr.form.ui.container.WFitLayout;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.general.FRLogger; import com.fr.general.FRLogger;
import com.fr.general.Inter; import com.fr.general.Inter;
import com.fr.plugin.ExtraClassManager;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
import com.fr.stable.bridge.StableFactory; import com.fr.stable.bridge.StableFactory;
@ -65,11 +67,10 @@ import java.util.List;
/** /**
* 设计界面组件该组件是界面设计工具的核心主要负责的是被设计界面的显示界面设计操作状态的 显示编辑状态的显示等等 * 设计界面组件该组件是界面设计工具的核心主要负责的是被设计界面的显示界面设计操作状态的 显示编辑状态的显示等等
*/ */
public class FormDesigner extends TargetComponent<Form> implements TreeSelectionListener, InvocationHandler, BaseFormDesigner ,ParaDefinitePane{ public class FormDesigner extends TargetComponent<Form> implements TreeSelectionListener, InvocationHandler, BaseFormDesigner, ParaDefinitePane {
protected static final ArrayList<String> NAME_ARRAY_LIST = new ArrayList<String>( protected static final ArrayList<String> NAME_ARRAY_LIST = new ArrayList<String>(
Arrays.asList(new String[]{Inter.getLocText("M_Edit-Cut"), Inter.getLocText("M_Edit-Copy"), Inter.getLocText("M_Edit-Delete")}) Arrays.asList(new String[]{Inter.getLocText("M_Edit-Cut"), Inter.getLocText("M_Edit-Copy"), Inter.getLocText("M_Edit-Delete")})
); );
private static final int BORDER_WIDTH = 6;
//底层容器的默认大小 //底层容器的默认大小
protected static final Dimension LARGE_PREFERRED_SIZE = new Dimension(WBorderLayout.DEFAULT_WIDTH, WBorderLayout.DEFAULT_HEIGHT); protected static final Dimension LARGE_PREFERRED_SIZE = new Dimension(WBorderLayout.DEFAULT_WIDTH, WBorderLayout.DEFAULT_HEIGHT);
private int paraHeight = 0; private int paraHeight = 0;
@ -81,7 +82,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
private XLayoutContainer paraComponent; private XLayoutContainer paraComponent;
private boolean drawLineMode; private boolean drawLineMode;
private FormArea formArea; private FormArea formArea;
private ConnectorHelper ConnectorHelper; private ConnectorHelper connectorHelper;
private boolean isReportBlockEditing = false; private boolean isReportBlockEditing = false;
//组件重叠 //组件重叠
@ -104,7 +105,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
// 编辑状态的事件表 // 编辑状态的事件表
private CreatorEventListenerTable edit; private CreatorEventListenerTable edit;
protected Action[] designer_actions; protected Action[] designerActions;
private FormDesignerModeForSpecial<?> desigerMode; private FormDesignerModeForSpecial<?> desigerMode;
private Action switchAction; private Action switchAction;
private FormElementCaseContainerProvider elementCaseContainer; private FormElementCaseContainerProvider elementCaseContainer;
@ -159,7 +160,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
ParameterPropertyPane.getInstance().populateBean(this); ParameterPropertyPane.getInstance().populateBean(this);
} }
public Parameter[] getNoRepeatParas(Parameter[] paras){ public Parameter[] getNoRepeatParas(Parameter[] paras) {
List<Parameter> paraList = new ArrayList<Parameter>(); List<Parameter> paraList = new ArrayList<Parameter>();
java.util.Set set = new java.util.HashSet(); java.util.Set set = new java.util.HashSet();
for (Parameter p : paras) { for (Parameter p : paras) {
@ -171,23 +172,23 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
return paraList.toArray(new Parameter[paraList.size()]); return paraList.toArray(new Parameter[paraList.size()]);
} }
public void setParameterArray(Parameter[] ps){ public void setParameterArray(Parameter[] ps) {
parameterArray = ps; parameterArray = ps;
} }
public Parameter[] getParameterArray(){ public Parameter[] getParameterArray() {
return parameterArray; return parameterArray;
} }
/** /**
* 刷新参数 * 刷新参数
*/ */
public void refreshParameter(){ public void refreshParameter() {
XLayoutContainer rootContainer = this.getParaComponent(); XLayoutContainer rootContainer = this.getParaComponent();
if (rootContainer != null){ if (rootContainer != null) {
java.util.List<String> namelist = new ArrayList<String>(); java.util.List<String> namelist = new ArrayList<String>();
rootContainer.getAllXCreatorNameList(rootContainer,namelist); rootContainer.getAllXCreatorNameList(rootContainer, namelist);
// parameterArray是报表的所有参数, nameList是已经在参数面板添加过控件的参数名 // parameterArray是报表的所有参数, nameList是已经在参数面板添加过控件的参数名
// 与已有的参数列表比较 如果已经存在 就除去 // 与已有的参数列表比较 如果已经存在 就除去
Parameter[] ps = getParameterArray(); Parameter[] ps = getParameterArray();
@ -201,7 +202,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
EastRegionContainerPane.getInstance().setParameterHeight(ParameterPropertyPane.getInstance(this).getPreferredSize().height); EastRegionContainerPane.getInstance().setParameterHeight(ParameterPropertyPane.getInstance(this).getPreferredSize().height);
} }
private void removeSame(Parameter[] parameters, List<String> namelist){ private void removeSame(Parameter[] parameters, List<String> namelist) {
for (Parameter parameter : parameters) { for (Parameter parameter : parameters) {
for (String name : namelist) { for (String name : namelist) {
if (name.equalsIgnoreCase(parameter.getName())) { if (name.equalsIgnoreCase(parameter.getName())) {
@ -214,20 +215,22 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 是否有查询按钮 * 是否有查询按钮
*
* @return 有无查询按钮 * @return 有无查询按钮
*/ */
public boolean isWithQueryButton(){ public boolean isWithQueryButton() {
XLayoutContainer rootContainer = this.getParaComponent(); XLayoutContainer rootContainer = this.getParaComponent();
return rootContainer != null && rootContainer.SearchQueryCreators(rootContainer); return rootContainer != null && rootContainer.SearchQueryCreators(rootContainer);
} }
/** /**
* 加入参数到参数面板 * 加入参数到参数面板
*
* @param parameter 参数 * @param parameter 参数
* @return 是否加入 * @return 是否加入
*/ */
public void addingParameter2Editor(Parameter parameter){ public void addingParameter2Editor(Parameter parameter) {
if(getParaComponent() == null){ if (getParaComponent() == null) {
addParaPaneTooltips(); addParaPaneTooltips();
return; return;
} }
@ -242,11 +245,11 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
if (!(this.autoAddComponent(xLabel, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) if (!(this.autoAddComponent(xLabel, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE)
+ FIRST_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) { + FIRST_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) {
return ; return;
} }
if (!(this.autoAddComponent(xCreator, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) if (!(this.autoAddComponent(xCreator, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE)
+ SECOND_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) { + SECOND_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) {
return ; return;
} }
currentIndex++; currentIndex++;
parameterArray = (Parameter[]) ArrayUtils.removeElement(parameterArray, parameter); parameterArray = (Parameter[]) ArrayUtils.removeElement(parameterArray, parameter);
@ -256,11 +259,12 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 加入参数到参数面板有查询按钮 * 加入参数到参数面板有查询按钮
*
* @param parameter 参数 * @param parameter 参数
* @return 是否加入 * @return 是否加入
*/ */
public void addingParameter2EditorWithQueryButton(Parameter parameter){ public void addingParameter2EditorWithQueryButton(Parameter parameter) {
if(getParaComponent() == null){ if (getParaComponent() == null) {
addParaPaneTooltips(); addParaPaneTooltips();
return; return;
} }
@ -276,12 +280,12 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
if (!(this.autoAddComponent(xLabel, FIRST_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP if (!(this.autoAddComponent(xLabel, FIRST_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP
* (currentIndex / NUM_IN_A_LINE)))) { * (currentIndex / NUM_IN_A_LINE)))) {
return ; return;
} }
if (!(this.autoAddComponent(xCreator, SECOND_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP if (!(this.autoAddComponent(xCreator, SECOND_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP
* (currentIndex / NUM_IN_A_LINE)))) { * (currentIndex / NUM_IN_A_LINE)))) {
return ; return;
} }
FormSubmitButton formSubmitButton = new FormSubmitButton(); FormSubmitButton formSubmitButton = new FormSubmitButton();
formSubmitButton.setWidgetName("Search"); formSubmitButton.setWidgetName("Search");
@ -289,7 +293,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
xCreator = XCreatorUtils.createXCreator(formSubmitButton); xCreator = XCreatorUtils.createXCreator(formSubmitButton);
if (!(this.autoAddComponent(xCreator, 270, FIRST_V_LOCATION + V_COMPONENT_GAP if (!(this.autoAddComponent(xCreator, 270, FIRST_V_LOCATION + V_COMPONENT_GAP
* (currentIndex / NUM_IN_A_LINE)))) { * (currentIndex / NUM_IN_A_LINE)))) {
return ; return;
} }
currentIndex = currentIndex + NUM_IN_A_LINE - currentIndex % NUM_IN_A_LINE; currentIndex = currentIndex + NUM_IN_A_LINE - currentIndex % NUM_IN_A_LINE;
parameterArray = (Parameter[]) ArrayUtils.removeElement(parameterArray, parameter); parameterArray = (Parameter[]) ArrayUtils.removeElement(parameterArray, parameter);
@ -300,8 +304,8 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 一键添加所有参数 * 一键添加所有参数
*/ */
public void addingAllParameter2Editor(){ public void addingAllParameter2Editor() {
if(getParaComponent() == null){ if (getParaComponent() == null) {
addParaPaneTooltips(); addParaPaneTooltips();
return; return;
} }
@ -350,13 +354,14 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
EastRegionContainerPane.getInstance().refreshDownPane(); EastRegionContainerPane.getInstance().refreshDownPane();
} }
private void addParaPaneTooltips(){ private void addParaPaneTooltips() {
JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(),Inter.getLocText("FR-Designer-Form-Please_Drag_ParaPane"), JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Designer-Form-Please_Drag_ParaPane"),
Inter.getLocText("FR-Designer_Tooltips"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); Inter.getLocText("FR-Designer_Tooltips"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
} }
/** /**
* 自动添加组件 * 自动添加组件
*
* @param xCreator 组件 * @param xCreator 组件
* @param x 横坐标 * @param x 横坐标
* @param y 纵坐标 * @param y 纵坐标
@ -375,6 +380,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 在参数很多时全部添加的时候可以向下一次排版若去掉就会在参数面板堆到一起 * 在参数很多时全部添加的时候可以向下一次排版若去掉就会在参数面板堆到一起
*
* @param creator 组件 * @param creator 组件
* @param x 长度 * @param x 长度
* @param y 长度 * @param y 长度
@ -404,9 +410,9 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 加入参数面板 * 加入参数面板
*/ */
public void addParaComponent(){ public void addParaComponent() {
if (paraComponent != null) { if (paraComponent != null) {
return ; return;
} }
paraHeight = WBorderLayout.DEFAULT_SIZE; paraHeight = WBorderLayout.DEFAULT_SIZE;
paraComponent = new XWParameterLayout(); paraComponent = new XWParameterLayout();
@ -414,7 +420,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
paraComponent.setSize(paraComponent.initEditorSize()); paraComponent.setSize(paraComponent.initEditorSize());
XWBorderLayout formLayoutContainer = (XWBorderLayout) rootComponent.getParent(); XWBorderLayout formLayoutContainer = (XWBorderLayout) rootComponent.getParent();
formLayoutContainer.toData().setNorthSize(paraHeight); formLayoutContainer.toData().setNorthSize(paraHeight);
formLayoutContainer.add(paraComponent,WBorderLayout.NORTH); formLayoutContainer.add(paraComponent, WBorderLayout.NORTH);
//设下northSize,增加para后,重置border大小,这时候para和root的大小会自适应调整 //设下northSize,增加para后,重置border大小,这时候para和root的大小会自适应调整
formLayoutContainer.setSize(formLayoutContainer.getWidth(), formLayoutContainer.getHeight() + paraHeight); formLayoutContainer.setSize(formLayoutContainer.getWidth(), formLayoutContainer.getHeight() + paraHeight);
selectionModel.reset(); selectionModel.reset();
@ -425,10 +431,11 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回根节点父容器 * 返回根节点父容器
*
* @return 父容器 * @return 父容器
*/ */
public Component getTopContainer(){ public Component getTopContainer() {
if(rootComponent != null){ if (rootComponent != null) {
// 返回root所在的父容器,非designer // 返回root所在的父容器,非designer
return LayoutUtils.getTopContainer(rootComponent); return LayoutUtils.getTopContainer(rootComponent);
} }
@ -437,17 +444,19 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回参数界面高度 * 返回参数界面高度
*
* @return para高度 * @return para高度
*/ */
public int getParaHeight(){ public int getParaHeight() {
return paraHeight; return paraHeight;
} }
/** /**
* 重置para的高度 * 重置para的高度
*
* @param height 高度 * @param height 高度
*/ */
public void setParaHeight(int height){ public void setParaHeight(int height) {
XWBorderLayout container = (XWBorderLayout) getTopContainer(); XWBorderLayout container = (XWBorderLayout) getTopContainer();
container.toData().setNorthSize(height); container.toData().setNorthSize(height);
container.setSize(container.getWidth(), container.getHeight() + height - getParaHeight()); container.setSize(container.getWidth(), container.getHeight() + height - getParaHeight());
@ -457,7 +466,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 删除参数界面 * 删除参数界面
*/ */
public void removeParaComponent(){ public void removeParaComponent() {
XWBorderLayout formLayoutContainer = (XWBorderLayout) getTopContainer(); XWBorderLayout formLayoutContainer = (XWBorderLayout) getTopContainer();
formLayoutContainer.toData().removeWidget(paraComponent.toData()); formLayoutContainer.toData().removeWidget(paraComponent.toData());
paraHeight = 0; paraHeight = 0;
@ -472,41 +481,42 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 切换 * 切换
*
* @param elementCaseContainer 容器 * @param elementCaseContainer 容器
*/ */
public void switchTab(FormElementCaseContainerProvider elementCaseContainer){ public void switchTab(FormElementCaseContainerProvider elementCaseContainer) {
if(this.switchAction == null){ if (this.switchAction == null) {
return; return;
} }
this.elementCaseContainer = elementCaseContainer; this.elementCaseContainer = elementCaseContainer;
this.switchAction.actionPerformed(null); this.switchAction.actionPerformed(null);
} }
public void setElementCaseContainer(FormElementCaseContainerProvider elementCaseContainer){ public void setElementCaseContainer(FormElementCaseContainerProvider elementCaseContainer) {
this.elementCaseContainer = elementCaseContainer; this.elementCaseContainer = elementCaseContainer;
} }
public FormElementCaseProvider getElementCase(){ public FormElementCaseProvider getElementCase() {
return this.elementCaseContainer.getElementCase(); return this.elementCaseContainer.getElementCase();
} }
public String getElementCaseContainerName(){ public String getElementCaseContainerName() {
return this.elementCaseContainer.getElementCaseContainerName(); return this.elementCaseContainer.getElementCaseContainerName();
} }
public void setElementCase(FormElementCaseProvider elementCase){ public void setElementCase(FormElementCaseProvider elementCase) {
this.elementCaseContainer.setElementCase(elementCase); this.elementCaseContainer.setElementCase(elementCase);
} }
public void setElementCaseBackground(BufferedImage image){ public void setElementCaseBackground(BufferedImage image) {
this.elementCaseContainer.setBackground(image); this.elementCaseContainer.setBackground(image);
} }
public Dimension getElementCaseContainerSize(){ public Dimension getElementCaseContainerSize() {
return this.elementCaseContainer.getSize(); return this.elementCaseContainer.getSize();
} }
public FormElementCaseContainerProvider getElementCaseContainer(){ public FormElementCaseContainerProvider getElementCaseContainer() {
return this.elementCaseContainer; return this.elementCaseContainer;
} }
@ -524,6 +534,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 增加监听事件 * 增加监听事件
*
* @param listener 界面组件编辑事件 * @param listener 界面组件编辑事件
*/ */
public void addDesignerEditListener(DesignerEditListener listener) { public void addDesignerEditListener(DesignerEditListener listener) {
@ -539,15 +550,15 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 表单则判断参数面板是否为绝对布局 * 表单则判断参数面板是否为绝对布局
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean hasWAbsoluteLayout() { public boolean hasWAbsoluteLayout() {
if (paraComponent != null && paraComponent.acceptType(XWParameterLayout.class)){ if (paraComponent != null && paraComponent.acceptType(XWParameterLayout.class)) {
return true; return true;
} } else {
else{
if (this.getSelectionModel().getSelection().getSelectedCreator().getParent() != null if (this.getSelectionModel().getSelection().getSelectedCreator().getParent() != null
&& ((XLayoutContainer)this.getSelectionModel().getSelection().getSelectedCreator().getParent()).acceptType(XWAbsoluteLayout.class)){ && ((XLayoutContainer) this.getSelectionModel().getSelection().getSelectedCreator().getParent()).acceptType(XWAbsoluteLayout.class)) {
return true; return true;
} }
} }
@ -556,6 +567,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 设置是否为报表块编辑 * 设置是否为报表块编辑
*
* @param isEditing 是否为报表块编辑 * @param isEditing 是否为报表块编辑
*/ */
public void setReportBlockEditing(boolean isEditing) { public void setReportBlockEditing(boolean isEditing) {
@ -564,22 +576,24 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 是否为报表块编辑 * 是否为报表块编辑
*
* @return 是否为报表块编辑 * @return 是否为报表块编辑
*/ */
public boolean isReportBlockEditing() { public boolean isReportBlockEditing() {
return this.isReportBlockEditing; return this.isReportBlockEditing;
} }
public void setWidgetsIntersect(boolean isWidgetsIntersect){ public void setWidgetsIntersect(boolean isWidgetsIntersect) {
this.isWidgetsIntersect = isWidgetsIntersect; this.isWidgetsIntersect = isWidgetsIntersect;
} }
public boolean isWidgetsIntersect(){ public boolean isWidgetsIntersect() {
return this.isWidgetsIntersect; return this.isWidgetsIntersect;
} }
/** /**
* 是否重命名控件 * 是否重命名控件
*
* @param creator 组件 * @param creator 组件
* @param newName 新的组件名 * @param newName 新的组件名
* @return 组件名有变化且不和其他一样返回true * @return 组件名有变化且不和其他一样返回true
@ -598,6 +612,12 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
return true; return true;
} }
public void showMessageDialog(String message) {
JOptionPane.showMessageDialog(this, message, Inter.getLocText("FR-Designer_Alert"), JOptionPane.WARNING_MESSAGE);
FormSelectionUtils.rebuildSelection(this);
repaint();
}
/** /**
* 保存参数界面的宽度 * 保存参数界面的宽度
* *
@ -609,16 +629,17 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 更新界面布局重绘 * 更新界面布局重绘
*
* @param proxy 动态代理类 * @param proxy 动态代理类
* @param method 接口方法 * @param method 接口方法
* @param args 参数 * @param args 参数
* @return 不返回任何对象 * @return 不返回任何对象
*/ */
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(rootComponent != null){ if (rootComponent != null) {
LayoutUtils.layoutRootContainer(rootComponent); LayoutUtils.layoutRootContainer(rootComponent);
} }
if(paraComponent != null){ if (paraComponent != null) {
LayoutUtils.layoutRootContainer(paraComponent); LayoutUtils.layoutRootContainer(paraComponent);
} }
repaint(); repaint();
@ -654,6 +675,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 增加组件事件 * 增加组件事件
*
* @param h 动态代理 * @param h 动态代理
*/ */
public void addInvocationHandler(InvocationHandler h) { public void addInvocationHandler(InvocationHandler h) {
@ -741,16 +763,14 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 更新边框线状态 * 更新边框线状态
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void updateDrawLineMode(MouseEvent e) { public void updateDrawLineMode(MouseEvent e) {
Point p = ConnectorHelper.getNearWidgetPoint(e); Point p = connectorHelper.getNearWidgetPoint(e);
if (p == null) { if (p == null && getComponentAt(e) == rootComponent) {
XComponent comp = getComponentAt(e);
if (comp == rootComponent) {
p = new Point(e.getX() + formArea.getHorizontalValue(), e.getY() + formArea.getVerticalValue()); p = new Point(e.getX() + formArea.getHorizontalValue(), e.getY() + formArea.getVerticalValue());
} }
}
stateModel.startDrawLine(p); stateModel.startDrawLine(p);
} }
@ -761,7 +781,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
// 撤销恢复操作都会refreshRoot,这时候的target.getContainer里的widget会和之前不一样,所以不用root判断来取 // 撤销恢复操作都会refreshRoot,这时候的target.getContainer里的widget会和之前不一样,所以不用root判断来取
XLayoutContainer formLayoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator(this.getTarget().getContainer()); XLayoutContainer formLayoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator(this.getTarget().getContainer());
// 布局默认都是1,底层的border改为0,不然没意义 // 布局默认都是1,底层的border改为0,不然没意义
this.getTarget().getContainer().setMargin(new PaddingMargin(0,0,0,0)); this.getTarget().getContainer().setMargin(new PaddingMargin(0, 0, 0, 0));
formLayoutContainer.setBorder(null); formLayoutContainer.setBorder(null);
if (formLayoutContainer.acceptType(XWBorderLayout.class)) { if (formLayoutContainer.acceptType(XWBorderLayout.class)) {
WBorderLayout borderLayout = (WBorderLayout) formLayoutContainer.toData(); WBorderLayout borderLayout = (WBorderLayout) formLayoutContainer.toData();
@ -790,9 +810,9 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
} }
XLayoutContainer northContainer = (XLayoutContainer) XCreatorUtils.createXCreator(northWidget); XLayoutContainer northContainer = (XLayoutContainer) XCreatorUtils.createXCreator(northWidget);
paraHeight = ((XWBorderLayout)formLayoutContainer).toData().getNorthSize(); paraHeight = ((XWBorderLayout) formLayoutContainer).toData().getNorthSize();
paraComponent = northContainer; paraComponent = northContainer;
northContainer.setSize(0,paraHeight); northContainer.setSize(0, paraHeight);
formLayoutContainer.add(northContainer, WBorderLayout.NORTH); formLayoutContainer.add(northContainer, WBorderLayout.NORTH);
} }
@ -841,14 +861,16 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 是否是报表的参数面板 * 是否是报表的参数面板
*
* @return (表单的) * @return (表单的)
*/ */
public boolean isFormParaDesigner(){ public boolean isFormParaDesigner() {
return false; return false;
} }
/** /**
* 是否为底层容器 * 是否为底层容器
*
* @param comp 组件 * @param comp 组件
* @return 是则返回true * @return 是则返回true
*/ */
@ -923,10 +945,10 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
} }
public SelectionModel getSelectionModel() { public SelectionModel getSelectionModel() {
if (paraComponent!=null){ if (paraComponent != null) {
paraComponent.setSize(paraComponent.getWidth(),getParaHeight()); paraComponent.setSize(paraComponent.getWidth(), getParaHeight());
Rectangle rec = rootComponent.getBounds(); Rectangle rec = rootComponent.getBounds();
rootComponent.setBounds(rec.x,getParaHeight(),rec.width,rec.height); rootComponent.setBounds(rec.x, getParaHeight(), rec.width, rec.height);
} }
return selectionModel; return selectionModel;
} }
@ -941,6 +963,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 拖拽准备 * 拖拽准备
*
* @param xCreator 组件 * @param xCreator 组件
*/ */
public void startDraggingBean(XCreator xCreator) { public void startDraggingBean(XCreator xCreator) {
@ -954,6 +977,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 拖拽时相关处理 * 拖拽时相关处理
*
* @param xCreator 组件 * @param xCreator 组件
* @param lastPressEvent 鼠标事件 * @param lastPressEvent 鼠标事件
* @param x 坐标x * @param x 坐标x
@ -978,6 +1002,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 改变组件值 * 改变组件值
*
* @param e 组件选择事件 * @param e 组件选择事件
*/ */
@Override @Override
@ -1024,6 +1049,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 是否支持权限编辑 * 是否支持权限编辑
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean isSupportAuthority() { public boolean isSupportAuthority() {
@ -1049,6 +1075,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 是否含有action名 * 是否含有action名
*
* @param name action名 * @param name action名
* @return 有则返回true * @return 有则返回true
*/ */
@ -1058,6 +1085,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 显示组件 * 显示组件
*
* @param comp 组件 * @param comp 组件
*/ */
public void makeVisible(XCreator comp) { public void makeVisible(XCreator comp) {
@ -1088,16 +1116,16 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回复制粘贴删除等动作 * 返回复制粘贴删除等动作
* 鼠标右键菜单
*
* @return 同上 * @return 同上
*/ */
public Action[] getActions() { public Action[] getActions() {
if (designer_actions == null) { if (designerActions == null) {
//先把复制粘贴按钮去掉,只留下删除 designerActions = new Action[]{new CutAction(this), new CopyAction(this), new PasteAction(this),
// designer_actions = new Action[]{new CutAction(this), new CopyAction(this), new PasteAction(this), new FormDeleteAction(this)};
// new FormDeleteAction(this)};
designer_actions = new Action[]{new FormDeleteAction(this)};
} }
return designer_actions; return designerActions;
} }
protected Border getOuterBorder() { protected Border getOuterBorder() {
@ -1120,6 +1148,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回表单区域 * 返回表单区域
*
* @return 表单区域 * @return 表单区域
*/ */
public FormArea getArea() { public FormArea getArea() {
@ -1128,6 +1157,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 设置上层区域 * 设置上层区域
*
* @param formArea 表单区域 * @param formArea 表单区域
*/ */
public void setParent(FormArea formArea) { public void setParent(FormArea formArea) {
@ -1136,14 +1166,15 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 绘制组件根节点 * 绘制组件根节点
*
* @param clipg 图形 * @param clipg 图形
*/ */
public void paintContent(Graphics clipg) { public void paintContent(Graphics clipg) {
rootComponent.paint(clipg); rootComponent.paint(clipg);
} }
public void paintPara(Graphics clipg){ public void paintPara(Graphics clipg) {
if(paraComponent != null){ if (paraComponent != null) {
paraComponent.paint(clipg); paraComponent.paint(clipg);
} }
} }
@ -1157,14 +1188,16 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回连线类 * 返回连线类
*
* @return ConnectorHelper类 * @return ConnectorHelper类
*/ */
public ConnectorHelper getDrawLineHelper() { public ConnectorHelper getDrawLineHelper() {
return ConnectorHelper; return connectorHelper;
} }
/** /**
* 是否画线模式 * 是否画线模式
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean isDrawLineMode() { public boolean isDrawLineMode() {
@ -1173,6 +1206,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 设置DrawLineMode * 设置DrawLineMode
*
* @param mode 是or或 * @param mode 是or或
*/ */
public void setDrawLineMode(boolean mode) { public void setDrawLineMode(boolean mode) {
@ -1199,6 +1233,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回表单控件权限编辑pane * 返回表单控件权限编辑pane
*
* @return 同上 * @return 同上
*/ */
public AuthorityEditPane createAuthorityEditPane() { public AuthorityEditPane createAuthorityEditPane() {
@ -1249,6 +1284,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 粘贴 * 粘贴
*
* @return * @return
*/ */
@Override @Override
@ -1259,6 +1295,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 剪切 * 剪切
*
* @return * @return
*/ */
@Override @Override
@ -1273,6 +1310,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 工具栏菜单 * 工具栏菜单
*
* @return 同上 * @return 同上
*/ */
@Override @Override
@ -1286,6 +1324,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 模版菜单 * 模版菜单
*
* @return 同上 * @return 同上
*/ */
@Override @Override
@ -1295,6 +1334,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 权限菜单 * 权限菜单
*
* @return 同上 * @return 同上
*/ */
public ShortCut[] shortCuts4Authority() { public ShortCut[] shortCuts4Authority() {
@ -1304,6 +1344,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回ToolBarDef * 返回ToolBarDef
*
* @return 同上 * @return 同上
*/ */
@Override @Override
@ -1313,10 +1354,12 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回工具栏按钮组件 * 返回工具栏按钮组件
*
* @return 同上 * @return 同上
*/ */
public JComponent[] toolBarButton4Form() { public JComponent[] toolBarButton4Form() {
return new JComponent[0]; return new JComponent[]{new CutAction(this).createToolBarComponent(), new CopyAction(this).createToolBarComponent(), new PasteAction(this).createToolBarComponent(),
new FormDeleteAction(this).createToolBarComponent()};
} }

34
designer_form/src/com/fr/design/mainframe/FormSelection.java

@ -8,12 +8,7 @@ import com.fr.base.FRContext;
import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.location.Direction; import com.fr.design.designer.beans.location.Direction;
import com.fr.design.designer.creator.XComponent; import com.fr.design.designer.creator.*;
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.XWAbsoluteLayout;
import com.fr.design.designer.creator.XWParameterLayout;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.LayoutUtils; import com.fr.design.utils.gui.LayoutUtils;
@ -37,6 +32,7 @@ public class FormSelection {
/** /**
* 是否没有选中的组件 * 是否没有选中的组件
*
* @return 为空返回true * @return 为空返回true
*/ */
public boolean isEmpty() { public boolean isEmpty() {
@ -45,6 +41,7 @@ public class FormSelection {
/** /**
* 选中的组件数量 * 选中的组件数量
*
* @return 选中的组件数量 * @return 选中的组件数量
*/ */
public int size() { public int size() {
@ -53,6 +50,7 @@ public class FormSelection {
/** /**
* 去除选中的组件中指定组件 * 去除选中的组件中指定组件
*
* @param creator 待去除组件 * @param creator 待去除组件
*/ */
public void removeCreator(XCreator creator) { public void removeCreator(XCreator creator) {
@ -61,6 +59,7 @@ public class FormSelection {
/** /**
* 是否成功删除选择的组件 * 是否成功删除选择的组件
*
* @param comp 组件 * @param comp 组件
* @return 是则返回true * @return 是则返回true
*/ */
@ -74,6 +73,7 @@ public class FormSelection {
/** /**
* 成功增加选中的组件 * 成功增加选中的组件
*
* @param creator 组件 * @param creator 组件
* @return 成功增加返回true * @return 成功增加返回true
*/ */
@ -87,6 +87,7 @@ public class FormSelection {
/** /**
* 是否是可以增加的 * 是否是可以增加的
*
* @param creator 组件 * @param creator 组件
* @return 是则返回true * @return 是则返回true
*/ */
@ -108,6 +109,7 @@ public class FormSelection {
/** /**
* 返回选中的第一个组件为空返回null * 返回选中的第一个组件为空返回null
*
* @return 返回选中组件 * @return 返回选中组件
*/ */
public XCreator getSelectedCreator() { public XCreator getSelectedCreator() {
@ -116,6 +118,7 @@ public class FormSelection {
/** /**
* 返回选中的所有组件 * 返回选中的所有组件
*
* @return 所有组件s * @return 所有组件s
*/ */
public XCreator[] getSelectedCreators() { public XCreator[] getSelectedCreators() {
@ -146,6 +149,7 @@ public class FormSelection {
/** /**
* 是否包含当前控件 * 是否包含当前控件
*
* @param widget 控件 * @param widget 控件
* @return 是则返回true * @return 是则返回true
*/ */
@ -196,7 +200,7 @@ public class FormSelection {
} }
public Rectangle getSelctionBounds() { public Rectangle getSelctionBounds() {
if(selection.isEmpty()) { if (selection.isEmpty()) {
return new Rectangle(); return new Rectangle();
} }
Rectangle bounds = selection.get(0).getBounds(); Rectangle bounds = selection.get(0).getBounds();
@ -221,8 +225,8 @@ public class FormSelection {
if (size == 1) { if (size == 1) {
XCreator creator = selection.get(0); XCreator creator = selection.get(0);
creator.setBounds(rec); creator.setBounds(rec);
if(creator.acceptType(XWParameterLayout.class)){ if (creator.acceptType(XWParameterLayout.class)) {
designer.setParaHeight((int)rec.getHeight()); designer.setParaHeight((int) rec.getHeight());
designer.getArea().doLayout(); designer.getArea().doLayout();
} }
LayoutUtils.layoutContainer(creator); LayoutUtils.layoutContainer(creator);
@ -235,8 +239,8 @@ public class FormSelection {
newBounds.height = rec.height * newBounds.height / backupBounds.height; newBounds.height = rec.height * newBounds.height / backupBounds.height;
XCreator creator = selection.get(i); XCreator creator = selection.get(i);
creator.setBounds(newBounds); creator.setBounds(newBounds);
if(creator.acceptType(XWParameterLayout.class)){ if (creator.acceptType(XWParameterLayout.class)) {
designer.setParaHeight((int)rec.getHeight()); designer.setParaHeight((int) rec.getHeight());
designer.getArea().doLayout(); designer.getArea().doLayout();
} }
} }
@ -246,6 +250,7 @@ public class FormSelection {
/** /**
* 调整组件大小 * 调整组件大小
*
* @param designer 设计界面组件 * @param designer 设计界面组件
*/ */
public void fixCreator(FormDesigner designer) { public void fixCreator(FormDesigner designer) {
@ -263,6 +268,11 @@ public class FormSelection {
if (parent == null) { if (parent == null) {
return; return;
} }
boolean changeCreator = creator.shouldScaleCreator() || creator.hasTitleStyle();
if (parent.acceptType(XWFitLayout.class) && changeCreator) {
creator = (XCreator) creator.getParent();
}
parent.getLayoutAdapter().removeBean(creator, creator.getWidth(), creator.getHeight());
// 删除其根组件,同时就删除了同时被选择的叶子组件 // 删除其根组件,同时就删除了同时被选择的叶子组件
parent.remove(creator); parent.remove(creator);
LayoutManager layout = parent.getLayout(); LayoutManager layout = parent.getLayout();
@ -275,6 +285,7 @@ public class FormSelection {
/** /**
* 剪切选中的所有组件 * 剪切选中的所有组件
*
* @param clipBoard 剪切板 * @param clipBoard 剪切板
*/ */
public void cut2ClipBoard(FormSelection clipBoard) { public void cut2ClipBoard(FormSelection clipBoard) {
@ -289,6 +300,7 @@ public class FormSelection {
/** /**
* 复制选中的所有组件 * 复制选中的所有组件
*
* @param clipBoard 复制板 * @param clipBoard 复制板
*/ */
public void copy2ClipBoard(FormSelection clipBoard) { public void copy2ClipBoard(FormSelection clipBoard) {

203
designer_form/src/com/fr/design/mainframe/FormSelectionUtils.java

@ -1,70 +1,185 @@
package com.fr.design.mainframe; package com.fr.design.mainframe;
import java.awt.Component;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.fr.base.FRContext; import com.fr.base.FRContext;
import com.fr.general.ComparatorUtils;
import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.AbstractLayoutAdapter;
import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.*;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.form.main.ClonedWidgetCreator;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WTitleLayout;
import com.fr.general.ComparatorUtils;
import com.fr.general.Inter;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class FormSelectionUtils { public class FormSelectionUtils {
public static void paste2Container(FormDesigner designer, XLayoutContainer parent, FormSelection selection, int x, //组件复制时坐标偏移
int y) { private static final int DELAY_X_Y = 20;
//组件重命名后缀
private static final String POSTFIX = "_c";
private FormSelectionUtils() {
}
/**
* 粘贴到容器
*/
public static void paste2Container(FormDesigner designer, XLayoutContainer parent,
FormSelection clipboard, int x, int y) {
LayoutAdapter adapter = parent.getLayoutAdapter(); LayoutAdapter adapter = parent.getLayoutAdapter();
if (selection.size() == 1) { if (parent instanceof XWAbsoluteLayout) {
//绝对布局
absolutePaste(designer, clipboard, adapter, x, y);
return;
} else if (parent instanceof XWFitLayout) {
//相对布局
relativePaste(designer, clipboard, adapter, x, y);
return;
}
Toolkit.getDefaultToolkit().beep();
}
/**
* 绝对布局粘贴
*/
private static void absolutePaste(FormDesigner designer, FormSelection clipboard, LayoutAdapter adapter, int x, int y) {
designer.getSelectionModel().getSelection().reset();
Rectangle rec = clipboard.getSelctionBounds();
for (XCreator creator : clipboard.getSelectedCreators()) {
try { try {
XCreator creator = selection.getSelectedCreator(); Widget copied = copyWidget(designer, creator);
Widget cloned = new ClonedWidgetCreator(designer.getTarget()).clonedWidgetWithNoRepeatName(creator XCreator copiedCreator = XCreatorUtils.createXCreator(copied, creator.getSize());
.toData()); // 获取位置
XCreator clondCreator = XCreatorUtils.createXCreator(cloned, creator.getSize()); Point point = getPasteLocation((AbstractLayoutAdapter) adapter,
if (adapter.addBean(clondCreator, x + clondCreator.getWidth() / 2, y + clondCreator.getHeight() / 2)) { copiedCreator,
designer.getSelectionModel().getSelection().setSelectedCreator(clondCreator); x + creator.getX() - rec.x + copiedCreator.getWidth() / 2,
designer.getEditListenerTable().fireCreatorModified(clondCreator, DesignerEvent.CREATOR_PASTED); y + creator.getY() - rec.y + copiedCreator.getHeight() / 2);
if (!adapter.accept(copiedCreator, point.x, point.y)) {
designer.showMessageDialog(Inter.getLocText("FR-Designer_Too_Large_To_Paste"));
return; return;
} }
boolean addSuccess = adapter.addBean(copiedCreator, point.x, point.y);
if (addSuccess) {
designer.getSelectionModel().getSelection().addSelectedCreator(copiedCreator);
}
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
FRContext.getLogger().error(e.getMessage(), e); FRContext.getLogger().error(e.getMessage(), e);
} }
} else if (selection.size() > 1) { }
if (parent instanceof XWAbsoluteLayout) { rebuildSelection(designer);
designer.getEditListenerTable().fireCreatorModified(
designer.getSelectionModel().getSelection().getSelectedCreator(), DesignerEvent.CREATOR_PASTED);
}
/**
* 相对布局粘贴
*/
private static void relativePaste(FormDesigner designer, FormSelection clipboard, LayoutAdapter adapter, int x, int y) {
designer.getSelectionModel().getSelection().reset(); designer.getSelectionModel().getSelection().reset();
Rectangle rec = selection.getSelctionBounds(); for (XCreator creator : clipboard.getSelectedCreators()) {
for (XCreator creator : selection.getSelectedCreators()) {
try { try {
Widget cloned = new ClonedWidgetCreator(designer.getTarget()) Widget copied = copyWidget(designer, creator);
.clonedWidgetWithNoRepeatName(creator.toData()); XCreator copiedCreator = XCreatorUtils.createXCreator(copied, creator.getSize());
XCreator clondCreator = XCreatorUtils.createXCreator(cloned, creator.getSize()); if (!adapter.accept(copiedCreator, x, y)) {
// 设置位置,移动20x20,防止被粘帖的组件重叠,照顾表单布局情况下 designer.showMessageDialog(Inter.getLocText("FR-Designer_Too_Small_To_Paste"));
adapter.addBean(clondCreator, x + creator.getX() - rec.x + clondCreator.getWidth() / 2, y return;
+ creator.getY() - rec.y + clondCreator.getHeight() / 2); }
designer.getSelectionModel().getSelection().addSelectedCreator(clondCreator); boolean addSuccess = adapter.addBean(copiedCreator, x, y);
if (addSuccess) {
designer.getSelectionModel().getSelection().addSelectedCreator(copiedCreator);
}
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
FRContext.getLogger().error(e.getMessage(), e); FRContext.getLogger().error(e.getMessage(), e);
} }
} }
rebuildSelection(designer);
designer.getEditListenerTable().fireCreatorModified( designer.getEditListenerTable().fireCreatorModified(
designer.getSelectionModel().getSelection().getSelectedCreator(), DesignerEvent.CREATOR_PASTED); designer.getSelectionModel().getSelection().getSelectedCreator(), DesignerEvent.CREATOR_PASTED);
return;
} }
/**
* 组件复用绝对布局获取粘贴组件位置
*/
private static Point getPasteLocation(AbstractLayoutAdapter layoutAdapter, XCreator copiedCreator, int x, int y) {
//当宽度为奇数时 设置偏移
int xoffset = (copiedCreator.getWidth() & 1) == 1 ? 1 : 0;
//当高度为奇数时 设置偏移
int yoffset = (copiedCreator.getHeight() & 1) == 1 ? 1 : 0;
if (!layoutAdapter.accept(copiedCreator, x, y)) {
XLayoutContainer container = layoutAdapter.getContainer();
boolean xOut = x < 0 || x + copiedCreator.getWidth() / 2 + xoffset > container.getWidth();
boolean yOut = y < 0 || y + copiedCreator.getHeight() / 2 + yoffset > container.getHeight();
/*
* 组件原始位置位于布局的右下角
* 和布局右下边界线紧挨
* 粘贴时组件在原始位置向左错开20像素
* x,y同时越界
*/
if (xOut && yOut) {
//向左偏移
x = container.getWidth() - copiedCreator.getWidth() / 2 - DELAY_X_Y - xoffset;
//紧贴下边界
y = container.getHeight() - copiedCreator.getHeight() / 2 - yoffset;
return new Point(x, y);
}
/*
* 组件原始位置与布局边界距离小于20像素下边界&右边界同时小于或者任意一个边界小于
* 则粘贴时距离小于20像素一侧直接贴近布局边界
* 距离大于20像素的一侧正常错开
* x,y中只有一个越界
*/
if ((xOut || yOut)) {
x = xOut ? container.getWidth() - copiedCreator.getWidth() / 2 - xoffset : x;
y = yOut ? container.getHeight() - copiedCreator.getHeight() / 2 - yoffset : y;
return new Point(x, y);
}
}
return new Point(x, y);
} }
Toolkit.getDefaultToolkit().beep();
/**
* 拷贝组件
*/
private static Widget copyWidget(FormDesigner formDesigner, XCreator xCreator) throws
CloneNotSupportedException {
ArrayList<String> nameSpace = new ArrayList<>();
Widget copied = (Widget) xCreator.toData().clone();
//重命名拷贝的组件
String name = getCopiedName(formDesigner, copied, nameSpace);
if (copied instanceof WTitleLayout) {
XWTitleLayout xwTitleLayout = new XWTitleLayout((WTitleLayout) copied, xCreator.getSize());
xwTitleLayout.resetCreatorName(name);
} else {
copied.setWidgetName(name);
}
return copied;
}
/**
* 组件拷贝命名规则
*/
private static String getCopiedName(FormDesigner formDesigner, Widget copied, ArrayList<String> nameSpace) {
StringBuilder name = new StringBuilder(copied.getWidgetName());
do {
name.append(POSTFIX);
} while (formDesigner.getTarget().isNameExist(name.toString()) || nameSpace.contains(name.toString()));
nameSpace.add(name.toString());
return name.toString();
} }
public static void rebuildSelection(FormDesigner designer) { public static void rebuildSelection(FormDesigner designer) {
ArrayList<XCreator> newSelection = new ArrayList<XCreator>(); ArrayList<XCreator> newSelection = new ArrayList<>();
List<Widget> widgetList = new ArrayList<Widget>(); List<Widget> widgetList = new ArrayList<>();
for (XCreator comp : designer.getSelectionModel().getSelection().getSelectedCreators()) { for (XCreator comp : designer.getSelectionModel().getSelection().getSelectedCreators()) {
widgetList.add(comp.toData()); widgetList.add(comp.toData());
} }
@ -73,8 +188,8 @@ public class FormSelectionUtils {
} }
public static ArrayList<XCreator> rebuildSelection(XCreator rootComponent, Widget[] selectWidgets) { public static ArrayList<XCreator> rebuildSelection(XCreator rootComponent, Widget[] selectWidgets) {
List<Widget> selectionWidget = new ArrayList<Widget>(); List<Widget> selectionWidget = new ArrayList<>();
if(selectWidgets != null){ if (selectWidgets != null) {
selectionWidget.addAll(Arrays.asList(selectWidgets)); selectionWidget.addAll(Arrays.asList(selectWidgets));
} }
return FormSelectionUtils.rebuildSelection(rootComponent, selectionWidget, new ArrayList<XCreator>()); return FormSelectionUtils.rebuildSelection(rootComponent, selectionWidget, new ArrayList<XCreator>());
@ -82,14 +197,14 @@ public class FormSelectionUtils {
private static ArrayList<XCreator> rebuildSelection(XCreator rootComponent, List<Widget> selectionWidget, private static ArrayList<XCreator> rebuildSelection(XCreator rootComponent, List<Widget> selectionWidget,
ArrayList<XCreator> newSelection) { ArrayList<XCreator> newSelection) {
FormSelectionUtils._rebuild(rootComponent, selectionWidget, newSelection); FormSelectionUtils.rebuild(rootComponent, selectionWidget, newSelection);
if (newSelection.isEmpty()) { if (newSelection.isEmpty()) {
newSelection.add(rootComponent); newSelection.add(rootComponent);
} }
return newSelection; return newSelection;
} }
private static void _rebuild(XCreator root, List<Widget> selectionWidget, List<XCreator> newSelection) { private static void rebuild(XCreator root, List<Widget> selectionWidget, List<XCreator> newSelection) {
if (selectionWidget.isEmpty()) { if (selectionWidget.isEmpty()) {
return; return;
} }
@ -116,9 +231,7 @@ public class FormSelectionUtils {
} }
} }
if (c instanceof XLayoutContainer) { if (c instanceof XLayoutContainer) {
_rebuild((XLayoutContainer) c, selectionWidget, newSelection); rebuild((XLayoutContainer) c, selectionWidget, newSelection);
} else {
continue;
} }
} }
} }

65
designer_form/src/com/fr/design/mainframe/JForm.java

@ -4,10 +4,12 @@ import com.fr.base.BaseUtils;
import com.fr.design.DesignState; import com.fr.design.DesignState;
import com.fr.design.actions.core.WorkBookSupportable; import com.fr.design.actions.core.WorkBookSupportable;
import com.fr.design.actions.file.WebPreviewUtils; import com.fr.design.actions.file.WebPreviewUtils;
import com.fr.design.mainframe.actions.FormMobileAttrAction;
import com.fr.design.cell.FloatElementsProvider; import com.fr.design.cell.FloatElementsProvider;
import com.fr.design.constants.UIConstants; import com.fr.design.constants.UIConstants;
import com.fr.design.designer.beans.actions.CopyAction;
import com.fr.design.designer.beans.actions.CutAction;
import com.fr.design.designer.beans.actions.FormDeleteAction; import com.fr.design.designer.beans.actions.FormDeleteAction;
import com.fr.design.designer.beans.actions.PasteAction;
import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEditListener;
import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.*; import com.fr.design.designer.creator.*;
@ -20,6 +22,7 @@ import com.fr.design.gui.imenu.UIMenuItem;
import com.fr.design.gui.xpane.FormHyperlinkGroupPane; import com.fr.design.gui.xpane.FormHyperlinkGroupPane;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.actions.EmbeddedFormExportExportAction; import com.fr.design.mainframe.actions.EmbeddedFormExportExportAction;
import com.fr.design.mainframe.actions.FormMobileAttrAction;
import com.fr.design.mainframe.actions.TemplateParameterAction; import com.fr.design.mainframe.actions.TemplateParameterAction;
import com.fr.design.mainframe.form.FormECCompositeProvider; import com.fr.design.mainframe.form.FormECCompositeProvider;
import com.fr.design.mainframe.form.FormECDesignerProvider; import com.fr.design.mainframe.form.FormECDesignerProvider;
@ -40,7 +43,6 @@ import com.fr.form.FormElementCaseProvider;
import com.fr.form.main.Form; import com.fr.form.main.Form;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WBorderLayout; import com.fr.form.ui.container.WBorderLayout;
import com.fr.form.ui.container.WFitLayout;
import com.fr.form.ui.container.WLayout; import com.fr.form.ui.container.WLayout;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.general.FRLogger; import com.fr.general.FRLogger;
@ -274,10 +276,10 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
} }
@Override
/** /**
*焦点放到JForm * 焦点放到JForm
*/ */
@Override
public void requestFocus() { public void requestFocus() {
super.requestFocus(); super.requestFocus();
formDesign.requestFocus(); formDesign.requestFocus();
@ -291,12 +293,12 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
formDesign.requestFocus(); formDesign.requestFocus();
} }
@Override
/** /**
* 保存文件的后缀名 * 保存文件的后缀名
* *
* @return 返回后缀名 * @return 返回后缀名
*/ */
@Override
public String suffix() { public String suffix() {
// daniel改成三个字 // daniel改成三个字
return ".frm"; return ".frm";
@ -329,30 +331,33 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
formDesign.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_SELECTED); formDesign.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_SELECTED);
} }
@Override
/** /**
*复制 f * 复制
*/ */
@Override
public void copy() { public void copy() {
this.formDesign.copy(); this.formDesign.copy();
} }
@Override
/** /**
*
* 粘贴 * 粘贴
*
* @return 是否成功 * @return 是否成功
*/ */
@Override
public boolean paste() { public boolean paste() {
return this.formDesign.paste(); return this.formDesign.paste();
} }
@Override
/** /**
*
* 剪切 * 剪切
*
* @return 是否成功 * @return 是否成功
*/ */
@Override
public boolean cut() { public boolean cut() {
return this.formDesign.cut(); return this.formDesign.cut();
} }
@ -362,36 +367,38 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
// //////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////
@Override
/** /**
* 目标菜单 * 目标菜单
* *
* @return 菜单 * @return 菜单
*/ */
@Override
public MenuDef[] menus4Target() { public MenuDef[] menus4Target() {
return this.index == FORM_TAB ? return this.index == FORM_TAB ?
(MenuDef[]) ArrayUtils.addAll(super.menus4Target(), this.formDesign.menus4Target()) : (MenuDef[]) ArrayUtils.addAll(super.menus4Target(), this.formDesign.menus4Target()) :
(MenuDef[]) ArrayUtils.addAll(super.menus4Target(), this.elementCaseDesign.menus4Target()); (MenuDef[]) ArrayUtils.addAll(super.menus4Target(), this.elementCaseDesign.menus4Target());
} }
@Override
/** /**
* 模板的工具 * 模板的工具
* *
* @return 工具 * @return 工具
*/ */
@Override
public ToolBarDef[] toolbars4Target() { public ToolBarDef[] toolbars4Target() {
return this.index == FORM_TAB ? return this.index == FORM_TAB ?
this.formDesign.toolbars4Target() : this.formDesign.toolbars4Target() :
this.elementCaseDesign.toolbars4Target(); this.elementCaseDesign.toolbars4Target();
} }
@Override
/** /**
* 模板菜单 * 模板菜单
* *
* @return 返回菜单 * @return 返回菜单
*/ */
@Override
public ShortCut[] shortcut4TemplateMenu() { public ShortCut[] shortcut4TemplateMenu() {
if (this.index == FORM_TAB) { if (this.index == FORM_TAB) {
return (ShortCut[]) ArrayUtils.addAll(new ShortCut[]{ return (ShortCut[]) ArrayUtils.addAll(new ShortCut[]{
@ -417,11 +424,6 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
} }
@Override @Override
/**
* undo的表单state
*
* @return 表单State
*/
protected FormUndoState createUndoState() { protected FormUndoState createUndoState() {
FormUndoState cur = new FormUndoState(this, this.formDesign.getArea()); FormUndoState cur = new FormUndoState(this, this.formDesign.getArea());
if (this.formDesign.isReportBlockEditing()) { if (this.formDesign.isReportBlockEditing()) {
@ -455,17 +457,15 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
// 假如当前body是绝对布局的话就返回绝对布局body // 假如当前body是绝对布局的话就返回绝对布局body
private XLayoutContainer selectedBodyLayout() { private XLayoutContainer selectedBodyLayout() {
XLayoutContainer rootLayout = formDesign.getRootComponent(); XLayoutContainer rootLayout = formDesign.getRootComponent();
for (int i = 0; i < rootLayout.getComponentCount(); i++){ for (int i = 0; i < rootLayout.getComponentCount(); i++) {
if (rootLayout.getXCreator(i).acceptType(XWAbsoluteBodyLayout.class)){ if (rootLayout.getXCreator(i).acceptType(XWAbsoluteBodyLayout.class)) {
rootLayout = (XWAbsoluteBodyLayout)rootLayout.getXCreator(i); rootLayout = (XWAbsoluteBodyLayout) rootLayout.getXCreator(i);
} }
} }
return rootLayout; return rootLayout;
} }
@Override @Override
/**
* 应用undoState的表单数据
*/
protected void applyUndoState(FormUndoState u) { protected void applyUndoState(FormUndoState u) {
try { try {
//JForm的target重置 //JForm的target重置
@ -497,19 +497,11 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
} }
@Override @Override
/**
*
*/
protected FormModelAdapter createDesignModel() { protected FormModelAdapter createDesignModel() {
return new FormModelAdapter(this); return new FormModelAdapter(this);
} }
@Override @Override
/**
* 表单的工具栏
*
* @return 表单工具栏
*/
public JPanel[] toolbarPanes4Form() { public JPanel[] toolbarPanes4Form() {
return this.index == FORM_TAB ? return this.index == FORM_TAB ?
new JPanel[]{FormParaWidgetPane.getInstance(formDesign)} : new JPanel[]{FormParaWidgetPane.getInstance(formDesign)} :
@ -524,10 +516,9 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
public JComponent[] toolBarButton4Form() { public JComponent[] toolBarButton4Form() {
return this.index == FORM_TAB ? return this.index == FORM_TAB ?
new JComponent[]{ new JComponent[]{
//自适应布局里的复制粘贴意义不大, 先屏蔽掉 new CutAction(formDesign).createToolBarComponent(),
// new CutAction(formDesign).createToolBarComponent(), new CopyAction(formDesign).createToolBarComponent(),
// new CopyAction(formDesign).createToolBarComponent(), new PasteAction(formDesign).createToolBarComponent(),
// new PasteAction(formDesign).createToolBarComponent(),
new FormDeleteAction(formDesign).createToolBarComponent()} : new FormDeleteAction(formDesign).createToolBarComponent()} :
elementCaseDesign.toolBarButton4Form(); elementCaseDesign.toolBarButton4Form();
} }

3
designer_form/src/com/fr/design/mainframe/MobileParaWidgetTable.java

@ -305,9 +305,12 @@ class MobileParaWidgetTable extends JTable {
/** /**
* cell改变相应的nametag改变 * cell改变相应的nametag改变
*/ */
private void firePropertyChange(){ private void firePropertyChange(){
((WParameterLayout) designer.getParaComponent().toData()).add2NameTagMap(uiTableTextField.getText(), ((WParameterLayout) designer.getParaComponent().toData()).add2NameTagMap(uiTableTextField.getText(),
cellData[getSelectedRow()][1]); cellData[getSelectedRow()][1]);
((WParameterLayout) designer.getParaComponent().toData()).setNameTagModified(cellData[getSelectedRow()][1],
true);
} }
@Override @Override

52
designer_form/src/com/fr/design/mainframe/MobileWidgetTable.java

@ -36,7 +36,7 @@ public class MobileWidgetTable extends JTable {
private static final int WIDGET_TABLE_ROW_HEIGHT = 22; private static final int WIDGET_TABLE_ROW_HEIGHT = 22;
private UILabel moveComponent = new UILabel(); // 作为拖动时候随鼠标移动的那个半透明控件 private UILabel moveComponent = new UILabel(); // 作为拖动时候随鼠标移动的那个半透明控件
private int selectedRow = -1; private int selectedRow = -1;
private int GAP = 11; private static final int GAP = 11;
private boolean draging = false; private boolean draging = false;
private boolean collapsed = false; // 控件列表是否折叠 private boolean collapsed = false; // 控件列表是否折叠
@ -57,7 +57,7 @@ public class MobileWidgetTable extends JTable {
TableModel defaultModel = new BeanTableModel(); TableModel defaultModel = new BeanTableModel();
this.setModel(defaultModel); this.setModel(defaultModel);
this.repaint(); this.repaint();
this.setDefaultRenderer(Object.class,new DefaultTableCellRenderer()); this.setDefaultRenderer(Object.class, new DefaultTableCellRenderer());
refreshData(); refreshData();
this.addMouseListener(mouseAdapter); this.addMouseListener(mouseAdapter);
this.addMouseMotionListener(mouseAdapter); this.addMouseMotionListener(mouseAdapter);
@ -90,7 +90,7 @@ public class MobileWidgetTable extends JTable {
@Override @Override
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
getInstance().setCellSelected(); getInstance().setCellSelected();
if (selectedRow == 0 && !e.isPopupTrigger() && e.getClickCount() == 1 && e.getX() < WIDGET_TABLE_ROW_HEIGHT / 2){ // 如果是点击在第一行 if (selectedRow == 0 && !e.isPopupTrigger() && e.getClickCount() == 1 && e.getX() < WIDGET_TABLE_ROW_HEIGHT / 2) { // 如果是点击在第一行
toggleCollapse(); toggleCollapse();
} }
} }
@ -102,14 +102,14 @@ public class MobileWidgetTable extends JTable {
*/ */
@Override @Override
public void mouseReleased(MouseEvent e) { public void mouseReleased(MouseEvent e) {
if(!draging){ if (!draging) {
return; return;
} }
draging = false; draging = false;
moveComponent.setVisible(false); moveComponent.setVisible(false);
int toIndex = e.getY() < GAP ? 0 : (int)Math.rint((e.getY() - GAP)/WIDGET_TABLE_ROW_HEIGHT) + 1; int toIndex = e.getY() < GAP ? 0 : (int) Math.rint((e.getY() - GAP) / WIDGET_TABLE_ROW_HEIGHT) + 1;
//当鼠标放开时,将选中的容器调整至新的顺序 //当鼠标放开时,将选中的容器调整至新的顺序
((WSortLayout)designer.getSelectionModel().getSelection().getSelectedCreator().toData()).adjustOrder(selectedRow - 1, toIndex - 1); ((WSortLayout) designer.getSelectionModel().getSelection().getSelectedCreator().toData()).adjustOrder(selectedRow - 1, toIndex - 1);
//拿取排序后表格数据,然后重绘表格 //拿取排序后表格数据,然后重绘表格
getInstance().refreshData(); getInstance().refreshData();
getInstance().repaint(); getInstance().repaint();
@ -124,8 +124,8 @@ public class MobileWidgetTable extends JTable {
@Override @Override
public void mouseMoved(MouseEvent e) { public void mouseMoved(MouseEvent e) {
int overRow = 0; int overRow = 0;
for (int i = 0;i < getRowCount();i++) { for (int i = 0; i < getRowCount(); i++) {
if (e.getY() > i * WIDGET_TABLE_ROW_HEIGHT && e.getY() <= (i + 1) * WIDGET_TABLE_ROW_HEIGHT){ if (e.getY() > i * WIDGET_TABLE_ROW_HEIGHT && e.getY() <= (i + 1) * WIDGET_TABLE_ROW_HEIGHT) {
overRow = i; //判断鼠标在哪一行 overRow = i; //判断鼠标在哪一行
} }
} }
@ -147,10 +147,10 @@ public class MobileWidgetTable extends JTable {
public void mouseDragged(MouseEvent e) { public void mouseDragged(MouseEvent e) {
int width = getColumnModel().getColumn(0).getWidth(); int width = getColumnModel().getColumn(0).getWidth();
//如果当前选中的行的范围是合理的话,就可以拖动 //如果当前选中的行的范围是合理的话,就可以拖动
if (selectedRow < getRowCount() && selectedRow > 0){ if (selectedRow < getRowCount() && selectedRow > 0) {
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
draging = true; draging = true;
moveComponent.setText(getValueAt(selectedRow,0).toString()); moveComponent.setText(getValueAt(selectedRow, 0).toString());
moveComponent.setLocation(0, e.getY() - GAP); moveComponent.setLocation(0, e.getY() - GAP);
moveComponent.setSize(new Dimension(width, WIDGET_TABLE_ROW_HEIGHT)); moveComponent.setSize(new Dimension(width, WIDGET_TABLE_ROW_HEIGHT));
moveComponent.setVisible(true); moveComponent.setVisible(true);
@ -165,16 +165,16 @@ public class MobileWidgetTable extends JTable {
*/ */
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
if(selectedRow > 0){ if (selectedRow > 0) {
//当前点击的控件的名字 //当前点击的控件的名字
String widgetName = cellData[selectedRow][0]; String widgetName = cellData[selectedRow][0];
if (StringUtils.isNotEmpty(widgetName)){ if (StringUtils.isNotEmpty(widgetName)) {
//当前选择的容器 //当前选择的容器
XCreator selectedContainer = designer.getSelectionModel().getSelection().getSelectedCreator(); XCreator selectedContainer = designer.getSelectionModel().getSelection().getSelectedCreator();
WLayout selectedWidget = (WLayout)selectedContainer.toData(); WLayout selectedWidget = (WLayout) selectedContainer.toData();
//当前选择的容器中的控件数量 //当前选择的容器中的控件数量
int count = selectedWidget.getWidgetCount(); int count = selectedWidget.getWidgetCount();
for (int i = 0;i < count ;i++){ for (int i = 0; i < count; i++) {
XCreator xCreator = (XCreator) selectedContainer.getComponent(i); XCreator xCreator = (XCreator) selectedContainer.getComponent(i);
Widget widget = xCreator.toData(); Widget widget = xCreator.toData();
if (ComparatorUtils.equals(widgetName, widget.getWidgetName())) { if (ComparatorUtils.equals(widgetName, widget.getWidgetName())) {
@ -182,7 +182,7 @@ public class MobileWidgetTable extends JTable {
} }
} }
} }
} else if (selectedRow == 0){ // 如果是点击在第一行 } else if (selectedRow == 0) { // 如果是点击在第一行
if (!e.isPopupTrigger() && e.getClickCount() > 1) { if (!e.isPopupTrigger() && e.getClickCount() > 1) {
toggleCollapse(); toggleCollapse();
} }
@ -200,11 +200,11 @@ public class MobileWidgetTable extends JTable {
} }
}; };
public MobileWidgetTable getInstance(){ public MobileWidgetTable getInstance() {
return this; return this;
} }
public FormDesigner getEditingDesigner(){ public FormDesigner getEditingDesigner() {
return designer; return designer;
} }
@ -236,7 +236,7 @@ public class MobileWidgetTable extends JTable {
/** /**
* 重新get排序后的数据 * 重新get排序后的数据
*/ */
public void refreshData(){ public void refreshData() {
cellData = getData(); cellData = getData();
} }
@ -245,21 +245,22 @@ public class MobileWidgetTable extends JTable {
* *
* @return String[][] 二维数组[0][0]widgetName * @return String[][] 二维数组[0][0]widgetName
*/ */
private String[][] getData(){ private String[][] getData() {
if(designer.isFormParaDesigner()){ if (designer.isFormParaDesigner()) {
return new String[0][0]; return new String[0][0];
} }
//选择的控件 //选择的控件
Widget selectedModel = designer.getSelectionModel().getSelection().getSelectedCreator().toData(); XCreator selectedCreator = designer.getSelectionModel().getSelection().getSelectedCreator();
Widget selectedModel = selectedCreator != null ? selectedCreator.toData() : null;
if(selectedModel == null){ if (selectedModel == null) {
return new String[0][0]; return new String[0][0];
} }
// 选择的控件有两种类型,一种是WLayout,代表容器,一种是Widget,代表控件 // 选择的控件有两种类型,一种是WLayout,代表容器,一种是Widget,代表控件
if (selectedModel.acceptType(WSortLayout.class)) { if (selectedModel.acceptType(WSortLayout.class)) {
List<String> mobileWidgetList = ((WSortLayout)selectedModel).getOrderedMobileWidgetList(); List<String> mobileWidgetList = ((WSortLayout) selectedModel).getOrderedMobileWidgetList();
String[][] widgetName = new String[mobileWidgetList.size() + 1][1]; String[][] widgetName = new String[mobileWidgetList.size() + 1][1];
widgetName[0][0] = Inter.getLocText("FR-Designer_WidgetOrder"); widgetName[0][0] = Inter.getLocText("FR-Designer_WidgetOrder");
for (int i = 0; i < mobileWidgetList.size(); i++) { for (int i = 0; i < mobileWidgetList.size(); i++) {
@ -284,7 +285,7 @@ public class MobileWidgetTable extends JTable {
*/ */
public class BeanTableModel extends DefaultTableModel { public class BeanTableModel extends DefaultTableModel {
public BeanTableModel() { public BeanTableModel() {
super(cellData,headers); super(cellData, headers);
} }
@Override @Override
@ -307,7 +308,7 @@ public class MobileWidgetTable extends JTable {
return null; return null;
} }
if (row == 0) { if (row == 0) {
return (isCollapsed()? "+" : "-") + cellData[row][0]; return (isCollapsed() ? "+" : "-") + cellData[row][0];
} }
return cellData[row][0]; return cellData[row][0];
@ -333,6 +334,7 @@ public class MobileWidgetTable extends JTable {
/** /**
* 是否可编辑 * 是否可编辑
*
* @param row 行号 * @param row 行号
* @param column 列号 * @param column 列号
* @return 是否可编辑 * @return 是否可编辑

26
designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java

@ -147,7 +147,8 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
designer.addDesignerEditListener(new mobileWidgetDesignerAdapter()); designer.addDesignerEditListener(new mobileWidgetDesignerAdapter());
centerPane = FRGUIPaneFactory.createCardLayout_S_Pane(); centerPane = FRGUIPaneFactory.createCardLayout_S_Pane();
cardLayout = (CardLayout) centerPane.getLayout(); cardLayout = (CardLayout) centerPane.getLayout();
centerPane.add(mobileParaWidgetTable, PARA);// 采用卡片布局的容器必须指定卡片名字,如果没有卡片名字 centerPane.add(mobileParaWidgetTable, PARA);
// 采用卡片布局的容器必须指定卡片名字,如果没有卡片名字
// 就会出现:Exception in thread "main" java.lang.IllegalArgumentException: // 就会出现:Exception in thread "main" java.lang.IllegalArgumentException:
// cannot add to layout: constraint must be a string // cannot add to layout: constraint must be a string
// 第二个参数代表卡片的名字。后来show方法调用时通过名字找到要显示的卡片 // 第二个参数代表卡片的名字。后来show方法调用时通过名字找到要显示的卡片
@ -155,11 +156,11 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
//只有放到JScrollPanel中去表头才能正常显示,这就是MobileWidgetTable中定义了表头却没有显示的原因! //只有放到JScrollPanel中去表头才能正常显示,这就是MobileWidgetTable中定义了表头却没有显示的原因!
//解决方案:MobileWidgetTable实在无法直接放到JScrollPanel中去的时候,应该把表头get出来单独作为一个组件显示 //解决方案:MobileWidgetTable实在无法直接放到JScrollPanel中去的时候,应该把表头get出来单独作为一个组件显示
if(hasSelectParaPane(designer)){ if (hasSelectParaPane(designer)) {
cardLayout.show(centerPane,PARA); cardLayout.show(centerPane, PARA);
header = mobileParaWidgetTable.getTableHeader(); header = mobileParaWidgetTable.getTableHeader();
} else { } else {
cardLayout.show(centerPane,BODY); cardLayout.show(centerPane, BODY);
header = mobileWidgetTable.getTableHeader(); header = mobileWidgetTable.getTableHeader();
} }
downPanel = new UIScrollPane(centerPane); downPanel = new UIScrollPane(centerPane);
@ -200,6 +201,7 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
/** /**
* 判断是将拓展的tab放入属性表还是将原来的tab放入属性表 * 判断是将拓展的tab放入属性表还是将原来的tab放入属性表
*
* @param widgetAttrProviders 拓展的tab * @param widgetAttrProviders 拓展的tab
*/ */
private void addWidgetAttr(WidgetPropertyUIProvider[] widgetAttrProviders) { private void addWidgetAttr(WidgetPropertyUIProvider[] widgetAttrProviders) {
@ -219,6 +221,7 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
/** /**
* 如果是body的拓展属性表那么要额外加上一张控件顺序表 * 如果是body的拓展属性表那么要额外加上一张控件顺序表
*
* @return * @return
*/ */
private Component getExtraBodyTable(AbstractPropertyTable abstractPropertyTable) { private Component getExtraBodyTable(AbstractPropertyTable abstractPropertyTable) {
@ -243,18 +246,20 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
tabbedPane.addTab(Inter.getLocText("FR-Widget_Mobile_Terminal"), wsp); tabbedPane.addTab(Inter.getLocText("FR-Widget_Mobile_Terminal"), wsp);
} }
//
/** /**
* 选中的组件是否在参数面板里 * 选中的组件是否在参数面板里
*
* @param designer 设计器 * @param designer 设计器
* @return 是则返回true * @return 是则返回true
*/ */
public boolean hasSelectParaPane(FormDesigner designer){ public boolean hasSelectParaPane(FormDesigner designer) {
XCreator xCreator = designer.getSelectionModel().getSelection().getSelectedCreator(); XCreator xCreator = designer.getSelectionModel().getSelection().getSelectedCreator();
if(xCreator == null){ if (xCreator == null) {
xCreator = designer.getRootComponent(); xCreator = designer.getRootComponent();
} }
XLayoutContainer container = XCreatorUtils.getHotspotContainer(xCreator); XLayoutContainer container = XCreatorUtils.getHotspotContainer(xCreator);
//TODO container可能为空,引发空指针异常
return xCreator.acceptType(XWParameterLayout.class) || container.acceptType(XWParameterLayout.class); return xCreator.acceptType(XWParameterLayout.class) || container.acceptType(XWParameterLayout.class);
} }
@ -335,6 +340,7 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
/** /**
* 响应界面改变事件 * 响应界面改变事件
*
* @param evt 事件 * @param evt 事件
*/ */
public void fireCreatorModified(DesignerEvent evt) { public void fireCreatorModified(DesignerEvent evt) {
@ -343,11 +349,11 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
|| evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED || evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED
|| evt.getCreatorEventID() == DesignerEvent.CREATOR_ADDED) { || evt.getCreatorEventID() == DesignerEvent.CREATOR_ADDED) {
int value = downPanel.getVerticalScrollBar().getValue(); int value = downPanel.getVerticalScrollBar().getValue();
if(hasSelectParaPane(getEditingFormDesigner())){ if (hasSelectParaPane(getEditingFormDesigner())) {
cardLayout.show(centerPane,PARA); cardLayout.show(centerPane, PARA);
mobileParaWidgetTable.refreshData(); mobileParaWidgetTable.refreshData();
} else { } else {
cardLayout.show(centerPane,BODY); cardLayout.show(centerPane, BODY);
mobileWidgetTable.refreshData(); mobileWidgetTable.refreshData();
} }
//出现滚动条 //出现滚动条

8
designer_base/src/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java → designer_form/src/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java

@ -1,7 +1,7 @@
package com.fr.design.mainframe.templateinfo; package com.fr.design.mainframe.templateinfo;
import com.fr.form.main.Form; import com.fr.form.main.Form;
import com.fr.form.ui.container.WFitLayout; import com.fr.form.ui.container.WLayout;
/** /**
* Created by plough on 2017/3/17. * Created by plough on 2017/3/17.
@ -32,11 +32,9 @@ public class JFormProcessInfo extends TemplateProcessInfo<Form> {
public int getWidgetCount() { public int getWidgetCount() {
int widgetCount = 0; int widgetCount = 0;
for (int i = 0; i < template.getContainer().getWidgetCount(); i++) { for (int i = 0; i < template.getContainer().getWidgetCount(); i++) {
WFitLayout wf = (WFitLayout) template.getContainer().getWidget(i); WLayout wl = (WLayout) template.getContainer().getWidget(i);
widgetCount += wf.getWidgetCount(); widgetCount += wl.getWidgetCount();
} }
int a = 1;
int b = 2;
return widgetCount; return widgetCount;
} }
} }
Loading…
Cancel
Save