Browse Source

Merge branch 'release' of http://www.finedevelop.com:2015/scm/ba/design into release

master
sunmondong 8 years ago
parent
commit
4100a0c16a
  1. 85
      build.dev.gradle
  2. 18
      designer/src/com/fr/design/actions/ElementCaseAction.java
  3. 36
      designer/src/com/fr/design/actions/SelectionListenerAction.java
  4. 56
      designer/src/com/fr/design/actions/cell/GlobalStyleMenuDef.java
  5. 2
      designer/src/com/fr/design/actions/file/export/AbstractExcelExportAction.java
  6. 3
      designer/src/com/fr/design/actions/file/export/AbstractExportAction.java
  7. 3
      designer/src/com/fr/design/actions/file/export/PDFExportAction.java
  8. 2
      designer/src/com/fr/design/mainframe/bbs/LoginDialog.java
  9. 5
      designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java
  10. 9
      designer/src/com/fr/design/mainframe/bbs/UserInfoPane.java
  11. 39
      designer/src/com/fr/design/present/CellWriteAttrPane.java
  12. 1140
      designer/src/com/fr/design/report/freeze/RepeatAndFreezeSettingPane.java
  13. 1
      designer/src/com/fr/design/widget/ui/IframeEditorDefinePane.java
  14. 70
      designer_base/build.dev.gradle
  15. 27
      designer_base/src/com/fr/design/actions/UpdateAction.java
  16. 9
      designer_base/src/com/fr/design/actions/server/PluginManagerAction.java
  17. 53
      designer_base/src/com/fr/design/actions/server/ReuseManagerAction.java
  18. 5
      designer_base/src/com/fr/design/data/datapane/connect/JDBCDefPane.java
  19. 74
      designer_base/src/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java
  20. 14
      designer_base/src/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java
  21. 5
      designer_base/src/com/fr/design/extra/LoginWebBridge.java
  22. 8
      designer_base/src/com/fr/design/extra/PluginWebBridge.java
  23. 4
      designer_base/src/com/fr/design/extra/PluginWebPane.java
  24. 21
      designer_base/src/com/fr/design/extra/QQLoginWebBridge.java
  25. 36
      designer_base/src/com/fr/design/extra/ReuseWebBridge.java
  26. 54
      designer_base/src/com/fr/design/extra/ReuseWebPane.java
  27. 12
      designer_base/src/com/fr/design/extra/ShopDialog.java
  28. 84
      designer_base/src/com/fr/design/extra/ShopManagerPane.java
  29. 24
      designer_base/src/com/fr/design/extra/ShopPaneConfig.java
  30. 99
      designer_base/src/com/fr/design/extra/WebManagerPaneFactory.java
  31. 24
      designer_base/src/com/fr/design/fun/DesignerFrameUpButtonProvider.java
  32. 1
      designer_base/src/com/fr/design/fun/MenuHandler.java
  33. 23
      designer_base/src/com/fr/design/fun/impl/AbstractDsinFrameUpButtonProvider.java
  34. 167
      designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java
  35. 102
      designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java
  36. 254
      designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java
  37. 459
      designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDependenceSettingPane.java
  38. 2
      designer_base/src/com/fr/design/hyperlink/AbstractHyperlinkPane.java
  39. 48
      designer_base/src/com/fr/design/hyperlink/HyperlinkTargetFrame.java
  40. BIN
      designer_base/src/com/fr/design/images/control/combobox.png
  41. 19
      designer_base/src/com/fr/design/mainframe/DesignerFrame.java
  42. 24
      designer_base/src/com/fr/design/mainframe/JTemplate.java
  43. 107
      designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java
  44. 11
      designer_base/src/com/fr/design/menu/MenuDef.java
  45. 12
      designer_base/src/com/fr/design/utils/DesignUtils.java
  46. 9
      designer_base/src/com/fr/start/BaseDesigner.java
  47. 66
      designer_chart/build.dev.gradle
  48. 5
      designer_chart/src/com/fr/design/chart/gui/ChartComponent.java
  49. 3
      designer_chart/src/com/fr/design/chart/series/PlotSeries/MapDefiAreaNamePane.java
  50. 2
      designer_chart/src/com/fr/design/mainframe/actions/ExcelExportAction4Chart.java
  51. 9
      designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartAreaPane.java
  52. 18
      designer_chart/src/com/fr/design/mainframe/exporter/ExcelExporter4Chart.java
  53. 83
      designer_form/build.dev.gradle
  54. 30
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteBodyLayoutAdapter.java
  55. 1
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java
  56. 133
      designer_form/src/com/fr/design/designer/creator/XCreator.java
  57. 1
      designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java
  58. 26
      designer_form/src/com/fr/design/designer/creator/XElementCase.java
  59. 45
      designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java
  60. 5
      designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java
  61. 5
      designer_form/src/com/fr/design/designer/properties/AbsoluteStateRenderer.java
  62. 23
      designer_form/src/com/fr/design/designer/properties/BodyLayoutAttrRenderer.java
  63. 239
      designer_form/src/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java
  64. 8
      designer_form/src/com/fr/design/designer/properties/FRAbsoluteLayoutPropertiesGroupModel.java
  65. 68
      designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java
  66. 4
      designer_form/src/com/fr/design/designer/properties/FitStateRenderer.java
  67. 12
      designer_form/src/com/fr/design/designer/properties/LayoutTypeRenderer.java
  68. 13
      designer_form/src/com/fr/design/designer/properties/LayoutTypeWrapper.java
  69. 4
      designer_form/src/com/fr/design/designer/properties/items/FRFitConstraintsItems.java
  70. 16
      designer_form/src/com/fr/design/designer/properties/items/FRLayoutTypeItems.java
  71. 26
      designer_form/src/com/fr/design/designer/treeview/ComponentTreeModel.java
  72. 2
      designer_form/src/com/fr/design/gui/core/FormWidgetOption.java
  73. 192
      designer_form/src/com/fr/design/mainframe/ComponentTree.java
  74. 11
      designer_form/src/com/fr/design/mainframe/FormParaWidgetPane.java
  75. 8
      designer_form/src/com/fr/design/mainframe/JForm.java
  76. 192
      designer_form/src/com/fr/design/mainframe/ShareWidgetButton.java
  77. 29
      designer_form/src/com/fr/design/mainframe/ShareWidgetPane.java
  78. 291
      designer_form/src/com/fr/design/mainframe/widget/UITreeComboBox.java
  79. 15
      designer_form/src/com/fr/design/mainframe/widget/editors/LayoutTypeEditor.java
  80. 3
      designer_form/src/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java

85
build.dev.gradle

@ -0,0 +1,85 @@
apply plugin: "java"
tasks.withType(JavaCompile){
options.encoding = "UTF-8"
}
def basicDir="../../"
def libDir="${basicDir}/finereport-lib-stable"
//
FileTree files =fileTree(dir:"./",include:"build.*.gradle")
def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf ("\\"))
def branchName=buildDir.substring(buildDir.lastIndexOf ("\\")+1)
task appletJar<<{
ant{
mkdir(dir:"${libDir}/tmp-${branchName}")
mkdir(dir:"build/classes/")
copy(todir:"build/classes/"){
fileset(dir:"${basicDir}/finereport-core-stable/${branchName}/build/classes/main")
fileset(dir:"${basicDir}/finereport-chart-stable/${branchName}/build/classes/main")
fileset(dir:"${basicDir}/finereport-report-stable/${branchName}/build/classes/main")
fileset(dir:"${basicDir}/finereport-platform-stable/${branchName}/build/classes/main")
fileset(dir:"${basicDir}/finereport-performance-stable/${branchName}/build/classes/main")
}
unjar(src:"${libDir}/3rd.jar",dest:"${libDir}/tmp-${branchName}")
unjar(src:"${libDir}/servlet-api.jar",dest:"${libDir}/tmp-${branchName}")
jar(jarfile:"build/libs/fr-applet-8.0.jar"){
fileset(dir:"build/classes"){
exclude(name:"*.*")
exclude(name:"bin/*.*")
exclude(name:"classes/**")
exclude(name:"com/fr/schedule/**")
exclude(name:"com/fr/cell/**")
exclude(name:"com/fr/dialog/**")
exclude(name:"com/fr/view/**")
exclude(name:"com/fr/web/**")
exclude(name:"com/fr/fs/**")
exclude(name:"com/fr/design/**")
exclude(name:"com/fr/start/**")
exclude(name:"com/fr/process/**")
}
fileset(dir:"${libDir}/tmp-${branchName}"){
include(name:"javax/mail/**")
include(name:"javax/servlet/**")
include(name:"org/freehep/**")
include(name:"com/fr/third/JAI/**")
include(name:"com/fr/third/antlr/**")
include(name:"com/fr/third/javax/**")
include(name:"com/sun/xml/**")
include(name:"javax/xml/**")
}
fileset(dir:"build/classes"){
include(name:"com/fr/web/*.class")
include(name:"com/fr/web/attr/*.class")
}
}
delete(dir:"${libDir}/tmp-${branchName}")
def jdk6home= "D:/FineReport/develop/java/jdk1.6u35"
def keystore="frapplet.store"
def keycert="fr.cert"
def keypassword="123456"
def keyalias="fr"
exec(executable:"${jdk6home}/bin/keytool"){
arg(line:"-genkey -dname &quot;CN=FineReport L=NanJing C=China&quot; -keystore ${keystore} -alias ${keyalias} -validity 3650 -storepass ${keypassword}")
}
exec(executable:"${jdk6home}/bin/keytool"){
arg(line:"-export -keystore ${keystore} -alias ${keyalias} -file ${keycert} -storepass ${keypassword}")
}
exec(executable:"${jdk6home}/bin/jarsigner"){
arg(line:"-keystore ${keystore} -storepass ${keypassword} 'build/libs/fr-applet-8.0.jar' ${keyalias}")
}
delete(file:"${keystore}")
delete(file:"${keycert}")
delete(dir:"build/classes")
}
}

18
designer/src/com/fr/design/actions/ElementCaseAction.java

@ -10,24 +10,10 @@ import com.fr.grid.selection.Selection;
import com.fr.design.selection.SelectionEvent;
import com.fr.design.selection.SelectionListener;
public abstract class ElementCaseAction extends TemplateComponentAction<ElementCasePane> {
public abstract class ElementCaseAction extends SelectionListenerAction {
protected ElementCaseAction(ElementCasePane t) {
super(t);
t.addSelectionChangeListener(new SelectionListener() {
@Override
public void selectionChanged(SelectionEvent e) {
update();
if (DesignerContext.getFormatState() != DesignerContext.FORMAT_STATE_NULL) {
Selection selection = getEditingComponent().getSelection();
if (selection instanceof CellSelection) {
CellSelection cellselection = (CellSelection) selection;
//样式处理
getEditingComponent().setCellNeedTOFormat(cellselection);
}
}
}
});
t.addSelectionChangeListener(createSelectionListener());
}
}

36
designer/src/com/fr/design/actions/SelectionListenerAction.java

@ -0,0 +1,36 @@
package com.fr.design.actions;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.ElementCasePane;
import com.fr.design.selection.SelectionEvent;
import com.fr.design.selection.SelectionListener;
import com.fr.grid.selection.CellSelection;
import com.fr.grid.selection.Selection;
/**
* Created by daniel on 2016/10/10.
*/
public abstract class SelectionListenerAction extends TemplateComponentAction<ElementCasePane> {
protected SelectionListenerAction(ElementCasePane elementCasePane) {
super(elementCasePane);
}
protected SelectionListener createSelectionListener () {
return new SelectionListener() {
@Override
public void selectionChanged(SelectionEvent e) {
update();
if (DesignerContext.getFormatState() != DesignerContext.FORMAT_STATE_NULL) {
Selection selection = getEditingComponent().getSelection();
if (selection instanceof CellSelection) {
CellSelection cellselection = (CellSelection) selection;
//样式处理
getEditingComponent().setCellNeedTOFormat(cellselection);
}
}
}
};
}
}

56
designer/src/com/fr/design/actions/cell/GlobalStyleMenuDef.java

@ -8,19 +8,27 @@ import com.fr.base.BaseUtils;
import com.fr.base.ConfigManager;
import com.fr.base.NameStyle;
import com.fr.design.actions.ElementCaseAction;
import com.fr.design.actions.SelectionListenerAction;
import com.fr.design.actions.TemplateComponentAction;
import com.fr.design.actions.UpdateAction;
import com.fr.design.gui.imenu.UIMenu;
import com.fr.design.mainframe.CellElementPropertyPane;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.ElementCasePane;
import com.fr.design.menu.KeySetUtils;
import com.fr.design.menu.MenuDef;
import com.fr.design.selection.SelectionEvent;
import com.fr.design.selection.SelectionListener;
import com.fr.design.style.StylePane;
import com.fr.general.Inter;
import com.fr.base.ConfigManagerProvider;
import com.fr.grid.selection.CellSelection;
import com.fr.grid.selection.Selection;
import com.fr.stable.StringUtils;
import com.fr.stable.pinyin.PinyinHelper;
import java.awt.event.ActionEvent;
import java.awt.*;
import java.awt.event.*;
import java.util.Iterator;
public class GlobalStyleMenuDef extends MenuDef {
@ -35,6 +43,36 @@ public class GlobalStyleMenuDef extends MenuDef {
this.setIconPath("/com/fr/design/images/m_web/style.png");
}
protected ContainerListener getContainerListener() {
return containerListener;
}
private ContainerListener containerListener = new ContainerListener() {
@Override
public void componentAdded(ContainerEvent e) {
}
@Override
public void componentRemoved(ContainerEvent e) {
Component c = e.getChild();
c.dispatchEvent(new MenuDeleteEvent(c));
}
};
private class MenuDeleteEvent extends UpdateAction.ComponentRemoveEvent {
public MenuDeleteEvent(Component source) {
super(source);
}
@Override
public void release(SelectionListener listener) {
ePane.removeSelectionChangeListener(listener);
}
}
/**
* 更新菜单项
*/
@ -46,8 +84,7 @@ public class GlobalStyleMenuDef extends MenuDef {
while (iterator.hasNext()) {
String name = (String) iterator.next();
NameStyle nameStyle = NameStyle.getInstance(name);
UpdateAction.UseMenuItem useMenuItem = new GlobalStyleSelection(ePane, nameStyle).createUseMenuItem();
UpdateAction.UseMenuItem useMenuItem =new GlobalStyleSelection(ePane, nameStyle).createUseMenuItem();
useMenuItem.setNameStyle(nameStyle);
createdMenu.add(useMenuItem);
}
@ -113,7 +150,9 @@ public class GlobalStyleMenuDef extends MenuDef {
}
public static class GlobalStyleSelection extends ElementCaseAction {
public static class GlobalStyleSelection extends SelectionListenerAction {
private NameStyle nameStyle;
@ -149,5 +188,14 @@ public class GlobalStyleMenuDef extends MenuDef {
stylePane.updateGlobalStyle(getEditingComponent());
return true;
}
public UseMenuItem createUseMenuItem() {
UseMenuItem useMenuItem = super.createUseMenuItem();
SelectionListener listener = createSelectionListener();
getEditingComponent().addSelectionChangeListener(listener);
useMenuItem.setSelectionListener(listener);
return useMenuItem;
}
}
}

2
designer/src/com/fr/design/actions/file/export/AbstractExcelExportAction.java

@ -36,7 +36,7 @@ public abstract class AbstractExcelExportAction extends AbstractExportAction {
if (hasLayerReport(tpl)) {
return "zip";
} else {
return ExcelUtils.checkPOIJarExist() ? "xlsx" : "xls";
return ExcelUtils.checkThirdJarSupportPOI() ? "xlsx" : "xls";
}
}
}

3
designer/src/com/fr/design/actions/file/export/AbstractExportAction.java

@ -5,6 +5,7 @@ package com.fr.design.actions.file.export;
import com.fr.base.FRContext;
import com.fr.base.Parameter;
import com.fr.io.exporter.pdfstream.PDFStreamExporter;
import com.fr.page.PageSetProvider;
import com.fr.design.actions.JWorkBookAction;
import com.fr.design.gui.iprogressbar.FRProgressBar;
@ -139,7 +140,7 @@ public abstract class AbstractExportAction extends JWorkBookAction {
if (exporter instanceof AppExporter) {
AppExporter appExporter = (AppExporter) exporter;
if (exporter instanceof ExcelExporter || exporter instanceof CSVExporter
|| exporter instanceof PDFExporter || exporter instanceof WordExporter) {
|| exporter instanceof PDFExporter || exporter instanceof PDFStreamExporter || exporter instanceof WordExporter) {
ReportHelper.clearFormulaResult(tpl);// 清空rpt中的公式计算结果
appExporter.export(fileOutputStream, tpl.execute(parameterMap, ActorFactory.getActor(ActorConstants.TYPE_PAGE)

3
designer/src/com/fr/design/actions/file/export/PDFExportAction.java

@ -10,6 +10,7 @@ import com.fr.file.filter.ChooseFileFilter;
import com.fr.general.Inter;
import com.fr.io.exporter.Exporter;
import com.fr.io.exporter.PDFExporter;
import com.fr.io.exporter.pdfstream.PDFStreamExporter;
/**
* Export pdf
@ -28,7 +29,7 @@ public class PDFExportAction extends AbstractExportAction {
@Override
protected Exporter getExporter() {
return new PDFExporter();
return new PDFStreamExporter();
}
@Override

2
designer/src/com/fr/design/mainframe/bbs/LoginDialog.java

@ -15,7 +15,7 @@ import java.awt.*;
* Created by zhaohehe on 16/7/26.
*/
public class LoginDialog extends UIDialog {
private static final Dimension DEFAULT_SHOP = new Dimension(404, 204);
private static final Dimension DEFAULT_SHOP = new Dimension(401, 201);
public LoginDialog(Frame frame, BasicPane pane) {
super(frame);

5
designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java

@ -87,6 +87,7 @@ public class UserInfoLabel extends UILabel{
LoginCheckContext.addLoginCheckListener(new LoginCheckListener() {
@Override
public void loginChecked() {
/*
if (bbsLoginDialog == null) {
bbsLoginDialog = new BBSLoginDialog(DesignerContext.getDesignerFrame(), UserInfoLabel.this);
}
@ -94,6 +95,7 @@ public class UserInfoLabel extends UILabel{
bbsLoginDialog.showTipForDownloadPluginWithoutLogin();
bbsLoginDialog.setModal(true);
bbsLoginDialog.showWindow();
*/
}
});
@ -282,7 +284,8 @@ public class UserInfoLabel extends UILabel{
public void mousePressed(MouseEvent e) {
if(StringUtils.isNotEmpty(userName)){
try {
Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("bbs.default")));
String loginUrl = SiteCenter.getInstance().acquireUrlByKind("bbs.default");
Desktop.getDesktop().browse(new URI(loginUrl));
} catch (Exception exp) {
FRContext.getLogger().info(exp.getMessage());
}

9
designer/src/com/fr/design/mainframe/bbs/UserInfoPane.java

@ -77,12 +77,11 @@ public class UserInfoPane extends BasicPane{
@Override
public void run() {
String username = DesignerEnvManager.getEnvManager().getBBSName();
String password = DesignerEnvManager.getEnvManager().getBBSPassword();
String loginResult = LoginWebBridge.getHelper().login(username, password);
if (loginResult.equals(LOGININ)) {
markSignIn(username);
}else {
String inShowUsername = DesignerEnvManager.getEnvManager().getInShowBBsName();
if (StringUtils.isEmpty(username) && StringUtils.isEmpty(inShowUsername)){
markUnSignIn();
} else {
markSignIn(username);
}
}
});

39
designer/src/com/fr/design/present/CellWriteAttrPane.java

@ -1,15 +1,13 @@
package com.fr.design.present;
import com.fr.base.FRContext;
import com.fr.base.Style;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.ElementCasePane;
import com.fr.design.widget.WidgetPane;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.form.ui.DateEditor;
import com.fr.form.ui.NoneWidget;
import com.fr.form.ui.Widget;
import com.fr.general.FRLogger;
@ -22,8 +20,6 @@ import com.fr.report.cell.TemplateCellElement;
import com.fr.report.elementcase.TemplateElementCase;
import java.awt.*;
import java.text.Format;
import java.text.SimpleDateFormat;
public class CellWriteAttrPane extends BasicPane {
@ -78,22 +74,6 @@ public class CellWriteAttrPane extends BasicPane {
Widget cellWidget = cellElement.getWidget();
if (cellWidget != null && cellWidget instanceof DateEditor) {
// p:日期的格式需要设置到单元格子里面.
DateEditor dateCellEditorDef = (DateEditor) cellWidget;
// p:需要把下拉的编辑器,日期格式,都放到CellElement的Style里面
// 这个地方很方便用户,是alex提出的.
// p:日期的格式需要设置到单元格子里面.
Style style = cellElement.getStyle();
if (style != null) {
Format format = style.getFormat();
if (format != null && format instanceof SimpleDateFormat) {
SimpleDateFormat simpleDateFormat = (SimpleDateFormat) format;
dateCellEditorDef.setFormatText(simpleDateFormat.toPattern());
}
}
}
// 这里进行克隆的原因是为了保留原始的Widget以便和新的Widget做比较来判断是否发生了改变
if (cellWidget != null) {
try {
@ -111,19 +91,6 @@ public class CellWriteAttrPane extends BasicPane {
}
Widget cellWidget = this.cellEditorDefPane.update();
// p:需要把下拉的编辑器,日期格式,都放到CellElement的Style里面
if (cellWidget instanceof DateEditor) {
// p:日期的格式需要设置到单元格子里面.
DateEditor dateCellEditorDef = (DateEditor) cellWidget;
String formatText = dateCellEditorDef.getFormatText();
if (formatText != null) {
Style style = cellElement.getStyle();
if (style != null) {
cellElement.setStyle(style.deriveFormat(new SimpleDateFormat(formatText)));
}
}
}
// p:最后把这个cellEditorDef设置到CellGUIAttr.
if (cellWidget instanceof NoneWidget) {
cellElement.setWidget(null);

1140
designer/src/com/fr/design/report/freeze/RepeatAndFreezeSettingPane.java

File diff suppressed because it is too large Load Diff

1
designer/src/com/fr/design/widget/ui/IframeEditorDefinePane.java

@ -22,7 +22,6 @@ import com.fr.form.ui.IframeEditor;
import com.fr.general.Inter;
import com.fr.stable.ParameterProvider;
import com.fr.design.widget.DataModify;
import com.fr.third.org.apache.poi.hssf.record.formula.functions.Abs;
public class IframeEditorDefinePane extends AbstractDataModify<IframeEditor> {
private UITextField srcTextField;

70
designer_base/build.dev.gradle

@ -0,0 +1,70 @@
apply plugin: 'java'
tasks.withType(JavaCompile){
options.encoding = 'UTF-8'
}
//jdk版本
sourceCompatibility=1.8
//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

27
designer_base/src/com/fr/design/actions/UpdateAction.java

@ -12,10 +12,13 @@ import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.imenu.UICheckBoxMenuItem;
import com.fr.design.gui.imenu.UIMenuItem;
import com.fr.design.menu.ShortCut;
import com.fr.design.selection.SelectionListener;
import com.fr.stable.StringUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.ContainerEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
import java.util.Iterator;
@ -321,12 +324,24 @@ public abstract class UpdateAction extends ShortCut implements Action {
toolBar.add(this.createToolBarComponent());
}
public abstract static class ComponentRemoveEvent extends ComponentEvent {
private static int EVENT_DELETE= 3001;
public ComponentRemoveEvent(Component source) {
super(source, EVENT_DELETE);
}
public abstract void release(SelectionListener listener);
}
/**
* 全局style的菜单
*/
public static class UseMenuItem extends UIMenuItem {
private NameStyle nameStyle;
private SelectionListener listener;
public UseMenuItem(Action action) {
super(action);
@ -337,6 +352,18 @@ public abstract class UpdateAction extends ShortCut implements Action {
super(text, icon);
}
protected void processEvent(AWTEvent e) {
if (e instanceof ComponentRemoveEvent) {
((ComponentRemoveEvent) e).release(listener);
return;
}
super.processEvent(e);
}
public void setSelectionListener(SelectionListener listener) {
this.listener = listener;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

9
designer_base/src/com/fr/design/actions/server/PluginManagerAction.java

@ -2,10 +2,11 @@ package com.fr.design.actions.server;
import com.fr.base.BaseUtils;
import com.fr.design.actions.UpdateAction;
import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.UIDialog;
import com.fr.design.extra.PluginManagerPane;
import com.fr.design.extra.PluginWebBridge;
import com.fr.design.extra.PluginShopDialog;
import com.fr.design.extra.ShopDialog;
import com.fr.design.extra.WebManagerPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.menu.MenuKeySet;
import com.fr.general.Inter;
@ -29,8 +30,8 @@ public class PluginManagerAction extends UpdateAction {
@Override
public void actionPerformed(ActionEvent e) {
final PluginManagerPane managerPane = new PluginManagerPane();
UIDialog dlg = new PluginShopDialog(DesignerContext.getDesignerFrame(),managerPane);
BasicPane managerPane = new WebManagerPaneFactory().createPluginPane();
UIDialog dlg = new ShopDialog(DesignerContext.getDesignerFrame(), managerPane);
PluginWebBridge.getHelper().setDialogHandle(dlg);
dlg.setVisible(true);
}

53
designer_base/src/com/fr/design/actions/server/ReuseManagerAction.java

@ -0,0 +1,53 @@
package com.fr.design.actions.server;
import com.fr.base.BaseUtils;
import com.fr.design.actions.UpdateAction;
import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.UIDialog;
import com.fr.design.extra.ShopDialog;
import com.fr.design.extra.PluginWebBridge;
import com.fr.design.extra.WebManagerPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.menu.MenuKeySet;
import com.fr.general.Inter;
import javax.swing.*;
import java.awt.event.ActionEvent;
/**
* Created by vito on 2016/9/27.
*/
public class ReuseManagerAction extends UpdateAction {
public ReuseManagerAction() {
this.setMenuKeySet(REUSE_MANAGER);
this.setName(getMenuKeySet().getMenuKeySetName());
this.setMnemonic(getMenuKeySet().getMnemonic());
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/server/plugin.png"));
}
@Override
public void actionPerformed(ActionEvent e) {
BasicPane managerPane = new WebManagerPaneFactory().createReusePane();
UIDialog dlg = new ShopDialog(DesignerContext.getDesignerFrame(), managerPane);
PluginWebBridge.getHelper().setDialogHandle(dlg);
dlg.setVisible(true);
}
public static final MenuKeySet REUSE_MANAGER = new MenuKeySet() {
@Override
public char getMnemonic() {
return 'R';
}
@Override
public String getMenuName() {
return Inter.getLocText("FR-Designer-Reuse_Manager");
}
@Override
public KeyStroke getKeyStroke() {
return null;
}
};
}

5
designer_base/src/com/fr/design/data/datapane/connect/JDBCDefPane.java

@ -43,7 +43,8 @@ public class JDBCDefPane extends JPanel {
new DriverURLName("org.hsqldb.jdbcDriver", "jdbc:hsqldb:file:[PATH_TO_DB_FILES]"), new DriverURLName("com.inet.tds.TdsDriver", "jdbc:inetdae7:localhost:1433/"),
new DriverURLName("COM.cloudscape.JDBCDriver", "jdbc:cloudscape:/cloudscape/"),
new DriverURLName("com.internetcds.jdbc.tds.Driver", "jdbc:freetds:sqlserver://localhost/")});
// jdbcMap.put("Hadoop Hive",new DriverURLName[]{new DriverURLName("org.apache.hadoop.hive.jdbc.HiveDriver","jdbc:hive://localhost:10000/default")});
jdbcMap.put("Inceptor",new DriverURLName[]{new DriverURLName("org.apache.hive.jdbc.HiveDriver","jdbc:inceptor2://localhost:10000/default"),
new DriverURLName("org.apache.hadoop.hive.jdbc.HiveDriver","jdbc:inceptor://localhost:10000/default")});
jdbcMap.put("Oracle", new DriverURLName[]{new DriverURLName("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:1521:databaseName")});
jdbcMap.put("DB2", new DriverURLName[]{new DriverURLName("com.ibm.db2.jcc.DB2Driver", "jdbc:db2://localhost:50000/")});
jdbcMap.put("SQL Server", new DriverURLName[]{new DriverURLName("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://localhost:1433;" + "databaseName=")});
@ -63,7 +64,7 @@ public class JDBCDefPane extends JPanel {
private UITextField userNameTextField;
private JPasswordField passwordTextField;
// 请不要改动dbtype,只应该最后添加
private final String[] dbtype = {"", "Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre","SQLite", "Others"};
private final String[] dbtype = {"", "Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre","SQLite","Inceptor", "Others"};
// carl:DBCP的一些属性
private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor();

74
designer_base/src/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java

@ -1,16 +1,23 @@
package com.fr.design.data.tabledata.tabledatapane;
import com.fr.base.Parameter;
import com.fr.data.impl.ClassTableData;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.formula.JavaEditorPane;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itableeditorpane.ParameterTableModel;
import com.fr.design.gui.itableeditorpane.UITableEditAction;
import com.fr.design.gui.itableeditorpane.UITableEditorPane;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.general.IOUtils;
import com.fr.general.Inter;
import com.fr.script.Calculator;
import com.fr.stable.ParameterProvider;
import com.fr.stable.project.ProjectConstants;
import javax.swing.*;
@ -21,6 +28,7 @@ import java.io.File;
public class ClassTableDataPane extends AbstractTableDataPane<ClassTableData> {
private UITextField classNameTextField;
private UITableEditorPane<ParameterProvider> editorPane;
public ClassTableDataPane() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
@ -89,13 +97,62 @@ public class ClassTableDataPane extends AbstractTableDataPane<ClassTableData> {
};
JPanel northPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
this.add(northPane, BorderLayout.NORTH);
// TODO alex_ENV
// northPane.add(flowTableLayoutHelper.createLabelFlowPane(
// " ", new UILabel(Inter.getLocText("Example") + ":" +
// BaseCoreUtils.pathJoin(new String[] {FRContext.getCurrentEnv().getPath(), "classes"}))));
this.add(initSouthPanel(), BorderLayout.SOUTH);
}
private JPanel initSouthPanel() {
JPanel jpanel = new JPanel();
jpanel.setPreferredSize(new Dimension(-1, 150));
jpanel.setLayout(new BorderLayout());
editorPane = new UITableEditorPane<ParameterProvider>(new ParameterTableModel() {
@Override
public UITableEditAction[] createAction() {
return new UITableEditAction[]{
new AddParaAction(),
new RemoveParaAction()
};
}
}, " " + Inter.getLocText("FR-Designer_TableData-Default-Para"));
jpanel.add(editorPane, BorderLayout.CENTER);
return jpanel;
}
public class AddParaAction extends UITableEditAction {
public AddParaAction() {
this.setName(Inter.getLocText("FR-Designer_Add"));
this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/buttonicon/add.png"));
}
public void actionPerformed(ActionEvent e) {
java.util.List<ParameterProvider> oldParas = editorPane.update();
oldParas.add(new Parameter());
editorPane.populate(oldParas.toArray(new ParameterProvider[oldParas.size()]));
}
@Override
public void checkEnabled() {
}
}
private class RemoveParaAction extends UITableEditAction {
public RemoveParaAction() {
this.setName(Inter.getLocText("FR-Designer_Remove"));
this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/control/remove.png"));
}
public void actionPerformed(ActionEvent e) {
ParameterProvider selectedPara = editorPane.getTableModel().getSelectedValue();
java.util.List<ParameterProvider> oldParas = editorPane.update();
oldParas.remove(selectedPara);
editorPane.populate(oldParas.toArray(new ParameterProvider[oldParas.size()]));
}
@Override
public void checkEnabled() {
}
}
@Override
protected String title4PopupWindow() {
return Inter.getLocText("DS-Class_TableData");
@ -103,12 +160,17 @@ public class ClassTableDataPane extends AbstractTableDataPane<ClassTableData> {
@Override
public void populateBean(ClassTableData ob) {
this.editorPane.populate(ob.getParameters(Calculator.createCalculator()));
this.classNameTextField.setText(ob.getClassName());
}
@Override
public ClassTableData updateBean() {
return new ClassTableData(this.classNameTextField.getText());
ClassTableData tableData = new ClassTableData(this.classNameTextField.getText());
java.util.List<ParameterProvider> paras = this.editorPane.update();
tableData.setParameters(paras.toArray(new ParameterProvider[paras.size()]));
return tableData;
}

14
designer_base/src/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java

@ -99,12 +99,6 @@ public class MultiTDTableDataPane extends AbstractTableDataPane<MultiTDTableData
while (entryIt.hasNext()) {
TableDataWrapper tableDataWrappe = entryIt.next().getValue();
String tmp = tableDataWrappe.getTableDataName();
UILabel uiLabel = new UILabel(tmp);
while (uiLabel.getPreferredSize().width > MAX_LENTH_OF_DATASET) {
tmp = tmp.substring(0, tmp.length() - SUB_LENGTH);
tmp = tmp + "...";
uiLabel = new UILabel(tmp);
}
if (!ComparatorUtils.equals(tableDataWrappe.getTableDataName(), multiName)) {
centerPanel.add(new BarPanel(tmp, tableDataWrappe.getIcon()));
}
@ -285,12 +279,18 @@ public class MultiTDTableDataPane extends AbstractTableDataPane<MultiTDTableData
}
private void initUI() {
String tmp = name;
this.setLayout(new FlowLayout(FlowLayout.LEFT));
JPanel leftPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
leftPanel.setPreferredSize(new Dimension(190, BAR_HEIGHT));
chekbox = new UICheckBox();
UILabel tabledataName = new UILabel(name);
UILabel tabledataName = new UILabel(tmp);
while (tabledataName.getPreferredSize().width > MAX_LENTH_OF_DATASET) {
tmp = tmp.substring(0, tmp.length() - SUB_LENGTH);
tmp = tmp + "...";
tabledataName = new UILabel(tmp);
}
UILabel iconLabel = new UILabel(icon);
chekbox.addActionListener(tableDataCheckboxListener);
iconLabel.addMouseListener(chooseTableDataListener);

5
designer_base/src/com/fr/design/extra/LoginWebBridge.java

@ -210,7 +210,7 @@ public class LoginWebBridge {
*/
public void forgetHref() {
try {
Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("bbs.default")));
Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("bbs.reset")));
}catch (Exception e) {
FRContext.getLogger().info(e.getMessage());
}
@ -267,7 +267,6 @@ public class LoginWebBridge {
if (uiDialog != null) {
uiDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
uiDialog.setVisible(false);
uiDialog.dispose();
}
}
@ -336,4 +335,4 @@ public class LoginWebBridge {
}
return UNKNOWN_ERROR;
}
}
}

8
designer_base/src/com/fr/design/extra/PluginWebBridge.java

@ -42,6 +42,7 @@ public class PluginWebBridge {
private String ACTION = "action";
private String KEYWORD = "keyword";
private Map<String, Object> config;
private WebEngine webEngine;
private UILabel uiLabel;
@ -79,8 +80,6 @@ public class PluginWebBridge {
return helper;
}
private WebEngine webEngine;
private PluginWebBridge() {
}
@ -380,7 +379,8 @@ public class PluginWebBridge {
*/
public void getPriviteMessage() {
try {
Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("bbs.default")));
String loginUrl = SiteCenter.getInstance().acquireUrlByKind("bbs.default");
Desktop.getDesktop().browse(new URI(loginUrl));
}catch (Exception exp) {
FRContext.getLogger().info(exp.getMessage());
}
@ -509,7 +509,7 @@ public class PluginWebBridge {
*/
public void forgetHref() {
try {
Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("bbs.default")));
Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("bbs.reset")));
}catch (Exception e) {
FRContext.getLogger().info(e.getMessage());
}

4
designer_base/src/com/fr/design/extra/PluginWebPane.java

@ -19,7 +19,7 @@ public class PluginWebPane extends JFXPanel {
private WebEngine webEngine;
public PluginWebPane(final String installHome) {
public PluginWebPane(final String mainJs) {
Platform.setImplicitExit(false);
Platform.runLater(new Runnable() {
@Override
@ -29,7 +29,7 @@ public class PluginWebPane extends JFXPanel {
PluginWebPane.this.setScene(scene);
WebView webView = new WebView();
webEngine = webView.getEngine();
webEngine.load("file:///" + installHome + "/scripts/store/web/index.html");
webEngine.load("file:///" + mainJs);
webEngine.setOnAlert(new EventHandler<WebEvent<String>>() {
@Override
public void handle(WebEvent<String> event) {

21
designer_base/src/com/fr/design/extra/QQLoginWebBridge.java

@ -117,7 +117,7 @@ public class QQLoginWebBridge {
//账号没有QQ授权
closeQQWindow();
try {
Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("bbs.default")));
Desktop.getDesktop().browse(new URI(SiteCenter.getInstance().acquireUrlByKind("QQ_binding")));
}catch (Exception exp) {
}
}
@ -127,24 +127,5 @@ public class QQLoginWebBridge {
if (url.indexOf("qqLogin.html") > 0) {
return;
}
if (Desktop.isDesktopSupported()) {
try {
//创建一个URI实例,注意不是URL
URI uri = URI.create(url);
//获取当前系统桌面扩展
Desktop desktop = Desktop.getDesktop();
//判断系统桌面是否支持要执行的功能
if (desktop.isSupported(Desktop.Action.BROWSE)) {
//获取系统默认浏览器打开链接
desktop.browse(uri);
}
} catch (NullPointerException e) {
//此为uri为空时抛出异常
FRLogger.getLogger().error(e.getMessage());
} catch (IOException e) {
//此为无法获取系统默认浏览器
FRLogger.getLogger().error(e.getMessage());
}
}
}
}

36
designer_base/src/com/fr/design/extra/ReuseWebBridge.java

@ -0,0 +1,36 @@
package com.fr.design.extra;
import javafx.scene.web.WebEngine;
/**
* Created by vito on 2016/9/28.
*/
public class ReuseWebBridge {
public static ReuseWebBridge helper;
private WebEngine webEngine;
public static ReuseWebBridge getHelper() {
if (helper != null) {
return helper;
}
synchronized (ReuseWebBridge.class) {
if (helper == null) {
helper = new ReuseWebBridge();
}
return helper;
}
}
public static ReuseWebBridge getHelper(WebEngine webEngine) {
getHelper();
helper.setEngine(webEngine);
return helper;
}
private ReuseWebBridge() {
}
public void setEngine(WebEngine webEngine) {
this.webEngine = webEngine;
}
}

54
designer_base/src/com/fr/design/extra/ReuseWebPane.java

@ -0,0 +1,54 @@
package com.fr.design.extra;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebEvent;
import javafx.scene.web.WebView;
import netscape.javascript.JSObject;
import javax.swing.*;
/**
* Created by vito on 2016/9/28.
*/
public class ReuseWebPane extends JFXPanel {
private WebEngine webEngine;
public ReuseWebPane(final String mainJs) {
Platform.setImplicitExit(false);
Platform.runLater(new Runnable() {
@Override
public void run() {
BorderPane root = new BorderPane();
Scene scene = new Scene(root);
ReuseWebPane.this.setScene(scene);
WebView webView = new WebView();
webEngine = webView.getEngine();
webEngine.load("file:///" + mainJs);
webEngine.setOnAlert(new EventHandler<WebEvent<String>>() {
@Override
public void handle(WebEvent<String> event) {
showAlert(event.getData());
}
});
JSObject obj = (JSObject) webEngine.executeScript("window");
obj.setMember("ReuseHelper", ReuseWebBridge.getHelper(webEngine));
webView.setContextMenuEnabled(false);//屏蔽右键
root.setCenter(webView);
}
});
}
private void showAlert(final String message) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(ReuseWebPane.this, message);
}
});
}
}

12
designer_base/src/com/fr/design/extra/PluginShopDialog.java → designer_base/src/com/fr/design/extra/ShopDialog.java

@ -3,8 +3,7 @@ package com.fr.design.extra;
import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.UIDialog;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.Inter;
import javafx.embed.swing.JFXPanel;
import com.fr.stable.StableUtils;
import javax.swing.*;
import java.awt.*;
@ -12,19 +11,20 @@ import java.awt.*;
/**
* Created by vito on 16/4/18.
*/
public class PluginShopDialog extends UIDialog {
public class ShopDialog extends UIDialog {
private static final Dimension DEFAULT_SHOP = new Dimension(900, 700);
public PluginShopDialog(Frame frame, BasicPane pane) {
public ShopDialog(Frame frame, BasicPane pane) {
super(frame);
setUndecorated(true);
if (StableUtils.getMajorJavaVersion() == 8) {
setUndecorated(true);
}
JPanel panel = (JPanel) getContentPane();
panel.setLayout(new BorderLayout());
add(pane, BorderLayout.CENTER);
setSize(DEFAULT_SHOP);
GUICoreUtils.centerWindow(this);
setResizable(false);
setTitle(Inter.getLocText("FR-Designer-Plugin_Manager"));
}
@Override

84
designer_base/src/com/fr/design/extra/PluginManagerPane.java → designer_base/src/com/fr/design/extra/ShopManagerPane.java

@ -4,7 +4,6 @@ import com.fr.base.FRContext;
import com.fr.design.DesignerEnvManager;
import com.fr.design.RestartHelper;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.frpane.UITabbedPane;
import com.fr.general.ComparatorUtils;
import com.fr.general.IOUtils;
import com.fr.general.Inter;
@ -12,12 +11,12 @@ import com.fr.general.SiteCenter;
import com.fr.general.http.HttpClient;
import com.fr.plugin.PluginVerifyException;
import com.fr.stable.StableUtils;
import javafx.embed.swing.JFXPanel;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutionException;
/**
@ -31,82 +30,55 @@ import java.util.concurrent.ExecutionException;
* 因为如果直接嵌入WebView,和设计器的交互就需要预先设定好,这样灵活性会差很多,而如果使用JavaScript引擎,
* 就可以直接在JavaScript中和WebView组件做交互,而同时JavaScript中可以调用任何的设计器API.
*/
public class PluginManagerPane extends BasicPane {
public class ShopManagerPane extends BasicPane {
private static final String LATEST = "latest";
private ShopPaneConfig shopPaneConfig;
public PluginManagerPane() {
public ShopManagerPane(ShopPaneConfig shopPaneConfig) {
this.shopPaneConfig = shopPaneConfig;
setLayout(new BorderLayout());
if (StableUtils.getMajorJavaVersion() == 8) {
String installHome;
if (StableUtils.isDebug()) {
URL url = ClassLoader.getSystemResource("");
installHome = url.getPath();
addPane(installHome);
} else {
installHome = StableUtils.getInstallHome();
File file = new File(StableUtils.pathJoin(installHome, "scripts"));
if (!file.exists()) {
int rv = JOptionPane.showConfirmDialog(
this,
Inter.getLocText("FR-Designer-Plugin_Shop_Need_Install"),
Inter.getLocText("FR-Designer-Plugin_Warning"),
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE
);
if (rv == JOptionPane.OK_OPTION) {
downloadShopScripts();
}
} else {
addPane(installHome);
updateShopScripts();
if (StableUtils.isDebug()) {
addPane();
} else {
File file = new File(shopPaneConfig.getMainJS());
if (!file.exists()) {
int rv = JOptionPane.showConfirmDialog(
this,
Inter.getLocText("FR-Designer-Plugin_Shop_Need_Install"),
Inter.getLocText("FR-Designer-Plugin_Warning"),
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE
);
if (rv == JOptionPane.OK_OPTION) {
downloadShopScripts();
}
} else {
addPane();
updateShopScripts();
}
} else {
initTraditionalStore();
}
}
/**
* 以关键词打开设计器商店
*
* @param keyword 关键词
*/
public PluginManagerPane(String keyword) {
this();
PluginWebBridge.getHelper().openWithSearch(keyword);
}
private void addPane(String installHome) {
PluginWebPane webPane = new PluginWebPane(new File(installHome).getAbsolutePath());
private void addPane() {
JFXPanel webPane = shopPaneConfig.getWebPane();
add(webPane, BorderLayout.CENTER);
}
private void initTraditionalStore() {
UITabbedPane tabbedPane = new UITabbedPane();
add(tabbedPane, BorderLayout.CENTER);
PluginInstalledPane installedPane = new PluginInstalledPane();
tabbedPane.addTab(installedPane.tabTitle(), installedPane);
tabbedPane.addTab(Inter.getLocText("FR-Designer-Plugin_Update"), new PluginUpdatePane(tabbedPane));
tabbedPane.addTab(Inter.getLocText("FR-Designer-Plugin_All_Plugins"), new PluginFromStorePane(tabbedPane));
}
private void downloadShopScripts() {
new SwingWorker<Boolean, Void>() {
@Override
protected Boolean doInBackground() throws Exception {
String id = "shop_scripts";
String username = DesignerEnvManager.getEnvManager().getBBSName();
String password = DesignerEnvManager.getEnvManager().getBBSPassword();
try {
PluginHelper.downloadPluginFile(id, username, password, new Process<Double>() {
PluginHelper.downloadPluginFile(shopPaneConfig.getScriptsId(), username, password, new Process<Double>() {
@Override
public void process(Double integer) {
}
});
} catch (PluginVerifyException e) {
JOptionPane.showMessageDialog(PluginManagerPane.this, e.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
JOptionPane.showMessageDialog(ShopManagerPane.this, e.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE);
return false;
} catch (Exception e) {
FRContext.getLogger().error(e.getMessage(), e);
@ -122,7 +94,7 @@ public class PluginManagerPane extends BasicPane {
if (get()) {
IOUtils.unzip(new File(StableUtils.pathJoin(PluginHelper.DOWNLOAD_PATH, PluginHelper.TEMP_FILE)), StableUtils.getInstallHome());
int rv = JOptionPane.showOptionDialog(
PluginManagerPane.this,
ShopManagerPane.this,
Inter.getLocText("FR-Designer-Plugin_Shop_Installed"),
Inter.getLocText("FR-Designer-Plugin_Warning"),
JOptionPane.YES_NO_OPTION,
@ -151,7 +123,7 @@ public class PluginManagerPane extends BasicPane {
if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) {
if (!ComparatorUtils.equals(httpClient.getResponseText(), LATEST)) {
int rv = JOptionPane.showConfirmDialog(
PluginManagerPane.this,
ShopManagerPane.this,
Inter.getLocText("FR-Designer-Plugin_Shop_Need_Update"),
Inter.getLocText("FR-Designer-Plugin_Warning"),
JOptionPane.OK_CANCEL_OPTION,

24
designer_base/src/com/fr/design/extra/ShopPaneConfig.java

@ -0,0 +1,24 @@
package com.fr.design.extra;
import javafx.embed.swing.JFXPanel;
/**
* Created by vito on 2016/9/28.
*/
public abstract class ShopPaneConfig {
private String mainJS;
private String scriptsId;
private JFXPanel webPane;
public ShopPaneConfig() {
this.mainJS = getMainJS();
this.scriptsId = getScriptsId();
this.webPane = getWebPane();
}
abstract String getMainJS();
abstract String getScriptsId();
abstract JFXPanel getWebPane();
}

99
designer_base/src/com/fr/design/extra/WebManagerPaneFactory.java

@ -0,0 +1,99 @@
package com.fr.design.extra;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.frpane.UITabbedPane;
import com.fr.general.Inter;
import com.fr.stable.StableUtils;
import javafx.embed.swing.JFXPanel;
import java.awt.*;
import java.io.File;
import java.net.URL;
/**
* Created by vito on 2016/9/28.
*/
public class WebManagerPaneFactory {
private String installHome;
public WebManagerPaneFactory() {
if (StableUtils.isDebug()) {
URL url = ClassLoader.getSystemResource("");
this.installHome = url.getPath();
} else {
this.installHome = StableUtils.getInstallHome();
}
}
public BasicPane createPluginPane() {
if (StableUtils.getMajorJavaVersion() == 8) {
return new ShopManagerPane(new ShopPaneConfig() {
@Override
String getMainJS() {
String relativePath = "/scripts/store/web/index.html";
return StableUtils.pathJoin(new File(installHome).getAbsolutePath(), relativePath);
}
@Override
String getScriptsId() {
return "shop_scripts";
}
@Override
JFXPanel getWebPane() {
return new PluginWebPane(getMainJS());
}
});
} else {
BasicPane traditionalStorePane = new BasicPane() {
@Override
protected String title4PopupWindow() {
return Inter.getLocText("FR-Designer-Plugin_Manager");
}
};
traditionalStorePane.setLayout(new BorderLayout());
traditionalStorePane.add(initTraditionalStore(), BorderLayout.CENTER);
return traditionalStorePane;
}
}
public BasicPane createReusePane() {
return new ShopManagerPane(new ShopPaneConfig() {
@Override
String getMainJS() {
String relativePath = "/scripts/store/reuse/index.html";
return StableUtils.pathJoin(new File(installHome).getAbsolutePath(), relativePath);
}
@Override
String getScriptsId() {
return "reuse_scripts";
}
@Override
JFXPanel getWebPane() {
return new ReuseWebPane(getMainJS());
}
});
}
/**
* 以关键词打开设计器商店
*
* @param keyword 关键词
*/
public BasicPane createPluginPane(String keyword) {
PluginWebBridge.getHelper().openWithSearch(keyword);
return createPluginPane();
}
private Component initTraditionalStore() {
UITabbedPane tabbedPane = new UITabbedPane();
PluginInstalledPane installedPane = new PluginInstalledPane();
tabbedPane.addTab(installedPane.tabTitle(), installedPane);
tabbedPane.addTab(Inter.getLocText("FR-Designer-Plugin_Update"), new PluginUpdatePane(tabbedPane));
tabbedPane.addTab(Inter.getLocText("FR-Designer-Plugin_All_Plugins"), new PluginFromStorePane(tabbedPane));
return tabbedPane;
}
}

24
designer_base/src/com/fr/design/fun/DesignerFrameUpButtonProvider.java

@ -0,0 +1,24 @@
package com.fr.design.fun;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.stable.fun.mark.Mutable;
/**
* 设计器面板最上方的按钮接口保存赋值撤销同级
* Coder: zack
* Date: 2016/9/22
* Time: 15:40
*/
public interface DesignerFrameUpButtonProvider extends Mutable {
int CURRENT_LEVEL = 1;
String XML_TAG = "DesignerFrameUpButtonProvider";
/**
* 根据当前的设计状态返回最上层工具按钮
* @param menuState 现在设计器的设计状态
* @return 按钮
*/
UIButton[] getUpButtons(int menuState);
}

1
designer_base/src/com/fr/design/fun/MenuHandler.java

@ -18,6 +18,7 @@ public interface MenuHandler extends Mutable {
int LAST = -1;
int HIDE =-2;
String HELP = "help";
String SERVER = "server";

23
designer_base/src/com/fr/design/fun/impl/AbstractDsinFrameUpButtonProvider.java

@ -0,0 +1,23 @@
package com.fr.design.fun.impl;
import com.fr.design.fun.DesignerFrameUpButtonProvider;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.stable.fun.mark.API;
/**
* Coder: zack
* Date: 2016/9/22
* Time: 15:50
*/
@API(level = DesignerFrameUpButtonProvider.CURRENT_LEVEL)
public abstract class AbstractDsinFrameUpButtonProvider implements DesignerFrameUpButtonProvider {
@Override
public UIButton[] getUpButtons(int menuState) {
return new UIButton[0];
}
@Override
public String mark4Provider() {
return getClass().getName();
}
}

167
designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java

@ -1,44 +1,52 @@
package com.fr.design.gui.frpane;
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import com.fr.data.impl.TreeNodeWrapper;
import com.fr.design.data.DataCreatorUI;
import com.fr.design.gui.ilable.UILabel;
import javax.swing.*;
import com.fr.general.NameObject;
import com.fr.data.impl.TableDataDictionary;
import com.fr.data.impl.TreeAttr;
import com.fr.data.impl.TreeNodeAttr;
import com.fr.data.impl.TreeNodeWrapper;
import com.fr.design.data.DataCreatorUI;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.controlpane.NameObjectCreator;
import com.fr.design.gui.controlpane.NameableCreator;
import com.fr.design.gui.frpane.tree.layer.config.LayerDataControlPane;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itree.refreshabletree.TreeDataCardPane;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.dialog.BasicPane;
import com.fr.form.ui.TreeComboBoxEditor;
import com.fr.form.ui.TreeEditor;
import com.fr.form.ui.tree.LayerConfig;
import com.fr.general.Inter;
import com.fr.general.NameObject;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
public class TreeSettingPane extends BasicPane implements DataCreatorUI {
private JTreeControlPane controlPane;
private JTreeAutoBuildPane autoBuildPane;
/**
* 新的分层构建方式
*/
private LayerDataControlPane layerDataControlPane;
private UIComboBox buildBox;
/**
*
*/
private static final long serialVersionUID = 1762889323082827111L;
*
*/
private static final long serialVersionUID = 1762889323082827111L;
private String[] buildWay = new String[] { Inter.getLocText("FR-Designer_Layer-Build"),
Inter.getLocText("FR-Designer_Auto-Build") };
private String[] buildWay = new String[]{Inter.getLocText("FR-Designer_DataTable-Build"),
Inter.getLocText("FR-Designer_Auto-Build"), Inter.getLocText("FR-Designer_Layer-Build")};
public TreeSettingPane(boolean isEditor) {
this.initComponents(isEditor);
}
}
private void initComponents(boolean isEditor) {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
@ -58,18 +66,34 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI {
controlPane = new JTreeControlPane(new NameableCreator[] { treeNode },
new TreeDataCardPane(), isEditor);
autoBuildPane = new JTreeAutoBuildPane();
this.add(buildWayPanel, BorderLayout.NORTH);
cardChanged(0);
}
layerDataControlPane = new LayerDataControlPane();
this.add(buildWayPanel, BorderLayout.NORTH);
cardChanged(0);
}
private void cardChanged(int index) {
this.remove(controlPane);
this.remove(autoBuildPane);
this.add(index == 0 ? controlPane : autoBuildPane, BorderLayout.CENTER);
validate();
repaint();
revalidate();
}
this.remove(layerDataControlPane);
switch (index) {
case 0:
this.add(layerDataControlPane);
break;
case 1:
this.add(autoBuildPane);
break;
case 2:
this.add(controlPane);
break;
default:
break;
}
validate();
repaint();
revalidate();
}
@Override
protected String title4PopupWindow() {
@ -101,10 +125,19 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI {
buildBox.setSelectedIndex(1);
TableDataDictionary dictionary = treeEditor.getDictionary();
autoBuildPane.populate(dictionary);
} else {
buildBox.setSelectedIndex(0);
}
}
} else if (treeEditor.isLayerBuild()) {
buildBox.setSelectedIndex(0);
java.util.List<LayerConfig> layerConfigList = treeEditor.getLayerConfigs();
LayerConfig[] layerConfigs = new LayerConfig[layerConfigList.size()];
int i = 0;
for (LayerConfig layerConfig : layerConfigList) {
layerConfigs[i++] = layerConfig;
}
this.layerDataControlPane.populate(new NameObject("tree", layerConfigs));
} else {
buildBox.setSelectedIndex(2);
}
}
/**
* 视图树的update
@ -123,43 +156,46 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI {
te.setAutoBuild(true);
te.setDictionary(dictionary);
te.setNodeOrDict(dictionary);
} else {
} else if (buildBox.getSelectedIndex() == 2) {
te.setAutoBuild(false);
NameObject no = this.controlPane.update();
if (no != null) {
TreeEditor editor = (TreeEditor) no.getObject();
te.setAllowBlank(editor.isAllowBlank());
te.setEnabled(editor.isEnabled());
te.setDirectEdit(editor.isDirectEdit());
te.setErrorMessage(editor.getErrorMessage());
te.setWidgetName(editor.getWidgetName());
te.setVisible(editor.isVisible());
te.setWaterMark(editor.getWaterMark());
te.setRemoveRepeat(editor.isRemoveRepeat());
te.setTreeAttr(editor.getTreeAttr());
te.setTreeNodeAttr(editor.getTreeNodeAttr());
te.setNodeOrDict(editor.getTreeNodeAttr());
te.setPerformanceFirst(editor.isPerformanceFirst());
}
}
return te;
}
te.setAllowBlank(editor.isAllowBlank());
te.setEnabled(editor.isEnabled());
te.setDirectEdit(editor.isDirectEdit());
te.setErrorMessage(editor.getErrorMessage());
te.setWidgetName(editor.getWidgetName());
te.setVisible(editor.isVisible());
te.setWaterMark(editor.getWaterMark());
te.setRemoveRepeat(editor.isRemoveRepeat());
te.setTreeAttr(editor.getTreeAttr());
te.setTreeNodeAttr(editor.getTreeNodeAttr());
te.setNodeOrDict(editor.getTreeNodeAttr());
te.setPerformanceFirst(editor.isPerformanceFirst());
}
}
return te;
}
/**
* 树节点属性的update
* @return
*/
public Object updateTreeNodeAttrs() {
if(buildBox.getSelectedIndex() == 0) {
NameObject no = controlPane.update();
if (no != null) {
return no.getObject();
if (buildBox.getSelectedIndex() == 2) {
NameObject no = controlPane.update();
if (no != null) {
return no.getObject();
}
} else {
return autoBuildPane.update();
}
return null;
}
} else if (buildBox.getSelectedIndex() == 0) {
return layerDataControlPane.update();
} else {
return autoBuildPane.update();
}
return null;
}
/**
* 下拉树的update
@ -172,7 +208,7 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI {
tcb.setAutoBuild(true);
tcb.setDictionary(dictionary);
tcb.setNodeOrDict(dictionary);
} else {
} else if (buildBox.getSelectedIndex() == 2) {
tcb.setAutoBuild(false);
NameObject no = this.controlPane.update();
if (no != null) {
@ -204,12 +240,15 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI {
*/
public void populate(Object nodeOrDict) {
if(nodeOrDict instanceof TreeNodeAttr[] || nodeOrDict instanceof TreeNodeWrapper) {
buildBox.setSelectedIndex(0);
NameObject no = new NameObject("name", nodeOrDict);
controlPane.populate(no);
} else if(nodeOrDict instanceof TableDataDictionary) {
buildBox.setSelectedIndex(2);
NameObject no = new NameObject("name", nodeOrDict);
controlPane.populate(no);
} else if(nodeOrDict instanceof TableDataDictionary) {
buildBox.setSelectedIndex(1);
autoBuildPane.populate((TableDataDictionary)nodeOrDict);
}
}
} else if (nodeOrDict instanceof NameObject) {
buildBox.setSelectedIndex(0);
layerDataControlPane.populate((NameObject) nodeOrDict);
}
}
}

102
designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java

@ -0,0 +1,102 @@
package com.fr.design.gui.frpane.tree.layer.config;
import com.fr.base.TableData;
import com.fr.data.impl.TableDataDictionary;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.data.tabledata.wrapper.TableDataWrapper;
import com.fr.design.present.dict.TableDataDictPane;
import com.fr.form.ui.tree.LayerConfig;
import com.fr.form.ui.tree.LayerDependence;
import java.awt.*;
import java.util.*;
import java.util.List;
/**
* Created by juhaoyu on 16/9/13.
*/
public class LayerDataConfigPane extends BasicBeanPane<LayerConfig> {
/**
* 数据集数据字典选择panel
*/
private TableDataDictPane tableDataDictPane;
/**
* 与父级关联的字段选择
*/
private LayerDependenceSettingPane dependenceSettingPane;
/**
* 当前用户正在修改的LayerData
*/
private LayerConfig layerConfig;
public LayerDataConfigPane() {
//初始化组件及布局
this.tableDataDictPane = new TableDataDictPane();
this.dependenceSettingPane = new LayerDependenceSettingPane(tableDataDictPane);
this.setLayout(new BorderLayout(2, 2));
this.add(tableDataDictPane, BorderLayout.NORTH);
this.add(dependenceSettingPane, BorderLayout.CENTER);
}
/**
* 1.切换层级时
*
* @param layerConfig
*/
@Override
public void populateBean(LayerConfig layerConfig) {
if (layerConfig != null) {
this.layerConfig = layerConfig;
TableDataDictionary ta = layerConfig.getDictionary();
this.tableDataDictPane.populateBean(ta);
this.dependenceSettingPane.populate(layerConfig.getIndex(), layerConfig.getDependenceList());
}
}
@Override
public LayerConfig updateBean() {
if (layerConfig == null) {
return null;
}
//从下层panel中读取数据
TableData tableData = tableDataDictPane.updateBean().getTableData();
TableDataWrapper wrapper = tableDataDictPane.tableDataNameComboBox.getSelectedItem();
List<String> columnNames;
if (wrapper != null) {
columnNames = wrapper.calculateColumnNameList();
} else {
columnNames = new ArrayList<String>();
}
String viewColStr = tableDataDictPane.updateBean().getValueColumnName();
String modelColStr = tableDataDictPane.updateBean().getKeyColumnName();
TableDataDictionary dictionary = tableDataDictPane.updateBean();
int viewCol = columnNames.indexOf(viewColStr);
int modelCol = columnNames.indexOf(modelColStr);
//将数据设置到当前正在修改的layerData中
this.layerConfig.setDictionary(dictionary);
this.layerConfig.setModelColumn(modelCol);
this.layerConfig.setViewColumn(viewCol);
this.layerConfig.setTableData(tableData);
//添加依赖
java.util.List<LayerDependence> dependenceList = dependenceSettingPane.updateLayerDependence();
layerConfig.getDependenceList().clear();
layerConfig.addAll(dependenceList);
return layerConfig;
}
@Override
protected String title4PopupWindow() {
return "Layer Data Config Panel";
}
}

254
designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java

@ -0,0 +1,254 @@
package com.fr.design.gui.frpane.tree.layer.config;
import com.fr.base.BaseUtils;
import com.fr.design.actions.UpdateAction;
import com.fr.design.gui.controlpane.ControlPane;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.itoolbar.UIToolbar;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.menu.ToolBarDef;
import com.fr.form.ui.tree.LayerConfig;
import com.fr.general.ComparatorUtils;
import com.fr.general.Inter;
import com.fr.general.NameObject;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
/**
* Created by juhaoyu on 16/9/21.
*/
public class LayerDataControlPane extends ControlPane {
public static final String BEAN_NAME = "Tree Layer Data";
// 添加一个treeNode
private AddTreeNodeAction addTreeNode;
// 移除一个treeNode
private RemoveTreeNodeAction removeTreeNode;
private LayerDataConfigPane configPane;
private JTree tree;
private DefaultTreeModel defaultTreeModel;
public LayerDataControlPane() {
this.setLayout(new BorderLayout(2, 2));
//创建层编辑panel
configPane = new LayerDataConfigPane();
//创建树结构及树控件
JPanel leftPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(Inter.getLocText("FR-Designer_Root"));
defaultTreeModel = new DefaultTreeModel(rootNode);
tree = new JTree(defaultTreeModel);
DefaultMutableTreeNode firstLayer = new DefaultMutableTreeNode(new NameObject(Inter.getLocText("FR-Designer_Gradation") + 1, new LayerConfig(1)));
tree.setRootVisible(false);
((DefaultMutableTreeNode) defaultTreeModel.getRoot()).getLastLeaf().add(firstLayer);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
leftPane.add(new UIScrollPane(tree), BorderLayout.CENTER);
tree.setPreferredSize(new Dimension(170, 350));
tree.setCellRenderer(renderer);
tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
configPane.updateBean();
refreshCurrentUpdatePane();
checkButtonEnabled();
}
});
// JTreeControlPane控制栏
ToolBarDef toolbarDef = new ToolBarDef();
toolbarDef.addShortCut(addTreeNode = new AddTreeNodeAction());
toolbarDef.addShortCut(removeTreeNode = new RemoveTreeNodeAction());
UIToolbar toolBar = ToolBarDef.createJToolBar();
toolbarDef.updateToolBar(toolBar);
leftPane.add(toolBar, BorderLayout.NORTH);
this.add(leftPane, BorderLayout.WEST);
this.add(this.configPane, BorderLayout.CENTER);
defaultTreeModel.reload();
TreePath path = new TreePath(defaultTreeModel.getPathToRoot(rootNode.getLastLeaf()));
tree.setSelectionPath(path);
this.checkButtonEnabled();
}
public void refreshCurrentUpdatePane() {
TreePath selectTreePath = this.tree.getSelectionPath();
if (selectTreePath != null) {
NameObject object = (NameObject) ((DefaultMutableTreeNode) selectTreePath.getLastPathComponent()).getUserObject();
if (object != null && object.getObject() != null) {
configPane.populateBean((LayerConfig) object.getObject());
}
}
}
TreeCellRenderer renderer = new DefaultTreeCellRenderer() {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
if (leaf) {
this.setIcon(BaseUtils.readIcon("com/fr/design/images/data/default_widget.png"));
} else {
this.setIcon(BaseUtils.readIcon("com/fr/design/images/data/arrow_branch.png"));
}
if (value instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
Object userObj = node.getUserObject();
if (userObj instanceof NameObject) {
this.setText(((NameObject) userObj).getName());
}
}
this.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 0));
return this;
}
};
private void checkButtonEnabled() {
this.addTreeNode.setEnabled(true);
this.removeTreeNode.setEnabled(true);
// richer:当选择了树根节点时,不能被删除、上移和下移
DefaultMutableTreeNode root = (DefaultMutableTreeNode) defaultTreeModel.getRoot();
TreePath rootPath = new TreePath(defaultTreeModel.getPathToRoot(root));
if (ComparatorUtils.equals(rootPath, tree.getSelectionPath())) {
this.removeTreeNode.setEnabled(false);
}
}
private class AddTreeNodeAction extends UpdateAction {
public AddTreeNodeAction() {
this.setName(Inter.getLocText("FR-Designer_Add"));
this.setMnemonic('A');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png"));
}
public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) defaultTreeModel.getRoot();
DefaultMutableTreeNode innerNode = node;
int nodeCount = 0;
do {
nodeCount++;
} while ((innerNode = innerNode.getNextNode()) != null);
NameObject nameable = new NameObject(Inter.getLocText("FR-Designer_Gradation") + nodeCount, new LayerConfig(nodeCount));
node.getLastLeaf().add(new DefaultMutableTreeNode(nameable));
defaultTreeModel.reload();
TreePath path = new TreePath(defaultTreeModel.getPathToRoot(node.getLastLeaf()));
tree.setSelectionPath(path);
}
}
private class RemoveTreeNodeAction extends UpdateAction {
public RemoveTreeNodeAction() {
this.setName(Inter.getLocText("FR-Designer_Remove"));
this.setMnemonic('R');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png"));
}
public void actionPerformed(ActionEvent e) {
// TODO remove tree node
int val = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Utils-Are_you_sure_to_remove_the_selected_item") + "?",
Inter.getLocText("FR-Designer_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
if (val != JOptionPane.OK_OPTION) {
return;
}
TreePath selectionPath = tree.getSelectionPath();
DefaultMutableTreeNode tmpNode = (DefaultMutableTreeNode) selectionPath.getLastPathComponent();
tmpNode.removeFromParent();
defaultTreeModel.reload();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) defaultTreeModel.getRoot();
TreePath path = new TreePath(defaultTreeModel.getPathToRoot(node.getLastLeaf()));
tree.setSelectionPath(path);
}
}
public void populate(NameObject nameObject) {
// 重新添加tree节点的时候需要remove掉原来的所有子节点
((DefaultMutableTreeNode) defaultTreeModel.getRoot()).removeAllChildren();
if (BEAN_NAME.equals(nameObject.getName())) {
Object obj = nameObject.getObject();
LayerConfig[] layerConfigs = null;
if (obj instanceof LayerConfig[]) {
layerConfigs = ((LayerConfig[]) obj);
}
int count = layerConfigs == null ? 0 : layerConfigs.length;
//将树的层次一层一层的加上去
DefaultMutableTreeNode node4root = (DefaultMutableTreeNode) defaultTreeModel.getRoot();
for (int i = 0; i < count; i++) {
DefaultMutableTreeNode node4add = new DefaultMutableTreeNode(
new NameObject(Inter.getLocText("FR-Designer_Gradation") + (i + 1), layerConfigs[i].clone()));
node4root.add(node4add);
node4root = node4add;
}
defaultTreeModel.reload();
expandAll(tree, true);
tree.setSelectionRow(0);
}
}
public NameObject update() {
return new NameObject(BEAN_NAME, updateLayerDatas());
}
private LayerConfig[] updateLayerDatas() {
//保存最后一个设置的层级
configPane.updateBean();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) defaultTreeModel.getRoot();
java.util.List<LayerConfig> nodeList = new ArrayList<LayerConfig>();
for (; root != null; root = root.getNextNode()) {
if (!(root.getUserObject() instanceof NameObject)) {
continue;
}
NameObject no = (NameObject) root.getUserObject();
if (no.getObject() instanceof LayerConfig) {
nodeList.add((LayerConfig) no.getObject());
}
}
return nodeList.toArray(new LayerConfig[nodeList.size()]);
}
@Override
protected String title4PopupWindow() {
return "Layer Data Control Pane";
}
}

459
designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDependenceSettingPane.java

@ -0,0 +1,459 @@
package com.fr.design.gui.frpane.tree.layer.config;
import com.fr.design.data.tabledata.wrapper.TableDataWrapper;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.present.dict.TableDataDictPane;
import com.fr.form.ui.tree.LayerDependence;
import com.fr.general.Inter;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
/**
* Created by juhaoyu on 16/9/19.
*/
public class LayerDependenceSettingPane extends JPanel implements ItemListener {
/**
* 用户选择数据集的pane,在LayerDataConfigPane中传入
*/
private TableDataDictPane tableDataDictPane;
/**
* 添加依赖按钮
*/
private UIButton addButton;
/**
* 删除依赖按钮
*/
private UIButton delButton;
/**
* 依赖关系编辑Table
*/
private JTable dependenceTable;
/**
* Table的数据模型,两个按钮的操作直接对应于model
*/
private LayerDepenceTableModel model;
/**
* 当前该panel所设置的层级
*/
private int currentLayerIndex = 1;
private FieldRenderer fieldRenderer;
private LayerIndexEditor layerIndexEditor;
private FiledEditor fieldEditor;
public LayerDependenceSettingPane(TableDataDictPane tableDictPane) {
//关联数据集选择,并添加监听
this.tableDataDictPane = tableDictPane;
tableDataDictPane.tableDataNameComboBox.addItemListener(this);
//初始化按钮对象
addButton = new UIButton(Inter.getLocText("add"));
delButton = new UIButton(Inter.getLocText("Delete"));
//初始化Table对象,并添加renderer和editor
model = new LayerDepenceTableModel();
dependenceTable = new JTable();
dependenceTable.setModel(model);
//初始化辅助组件
fieldEditor = new FiledEditor(tableDataDictPane);
fieldRenderer = new FieldRenderer(tableDictPane);
layerIndexEditor = new LayerIndexEditor(currentLayerIndex);
//添加renderer
dependenceTable.getColumnModel().getColumn(0).setCellRenderer(new FirstRenderer());
dependenceTable.getColumnModel().getColumn(1).setCellRenderer(fieldRenderer);
//添加第一列editor
dependenceTable.getColumnModel().getColumn(0).setCellEditor(layerIndexEditor);
//添加第二列editor
dependenceTable.getColumnModel().getColumn(1).setCellEditor(fieldEditor);
//添加add按钮监听
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//先要停止编辑,然后再添加
fieldEditor.stopCellEditing();
layerIndexEditor.stopCellEditing();
LayerDependenceSettingPane.this.model.addDependence();
}
});
//添加del按钮监听
delButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (0 == dependenceTable.getSelectedRowCount()) {
return;
}
//获取视图索引,并根据视图索引获取model索引,删除model指定行
int selectedRow = dependenceTable.getSelectedRow();
int selectedRowModelIndex = dependenceTable.convertRowIndexToModel(selectedRow);
//先要停止编辑,然后再删除
fieldEditor.stopCellEditing();
layerIndexEditor.stopCellEditing();
model.delDependence(selectedRowModelIndex);
}
});
//生成布局
this.setLayout(new BorderLayout(2, 2));
//添加按钮panel
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(2));
buttonPanel.add(addButton);
buttonPanel.add(delButton);
this.add(buttonPanel, BorderLayout.NORTH);
//添加Table的panel
JScrollPane tablePanel = new JScrollPane(dependenceTable);
this.add(tablePanel, BorderLayout.CENTER);
}
public void populate(int layerIndex, List<LayerDependence> dependenceList) {
this.currentLayerIndex = layerIndex;
//更新Editor
this.layerIndexEditor.layerChanged(layerIndex);
this.fieldEditor.layerChanged();
this.model.clear();
this.model.addAll(dependenceList);
}
public List<LayerDependence> updateLayerDependence() {
//保存现有编辑
this.fieldEditor.stopCellEditing();
this.layerIndexEditor.stopCellEditing();
return this.model.update();
}
/**
* 当tableDataDictPane变化时,调用该方法
*/
@Override
public void itemStateChanged(ItemEvent e) {
clearDependences();
}
/**
* 清楚当前设置的依赖关系
*/
private void clearDependences() {
this.model.clear();
}
/**
* 第一列renderer
*/
private static final class FirstRenderer extends UILabel implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value != null) {
//value是用户选择的字段索引值,从1开始的
this.setText(String.valueOf(value));
} else {
this.setText("");
}
if (hasFocus) {
this.setBorder(UIManager.getBorder("Table.focusCelHighlightBorder"));
} else {
this.setBorder(null);
}
return this;
}
}
/**
* 第二列renderer
* 由于从model中获取的数据是数据集列的索引值,这里要转换为列的名称
*/
private static final class FieldRenderer extends UILabel implements TableCellRenderer {
//用于将字段索引转换为字段名;保存改pane,是为了当用户选择其他数据集时,renderer可同步更新
private TableDataDictPane tableDataDictPane;
public FieldRenderer(TableDataDictPane tableDataDictPane) {
this.tableDataDictPane = tableDataDictPane;
}
/**
* 由于数据是从tableDataDictPane中现取的,所以用户选择不同的数据集时,renderer同步更新;
* 此时只需要在用户选择数据集时,刷新Table即可,不需要对renderer处理
*/
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value != null) {
List<String> columnNames = getColumnNameList(this.tableDataDictPane);
//value是用户选择的字段索引值,从1开始的
this.setText(columnNames.get(Integer.valueOf(String.valueOf(value))));
} else {
this.setText("");
}
if (hasFocus) {
this.setBorder(UIManager.getBorder("Table.focusCelHighlightBorder"));
} else {
this.setBorder(null);
}
return this;
}
}
/**
* 第一列editor
* 该editor于layerIndex关联,当用户选择不同的层时,这个editor要同步更新
*/
private static final class LayerIndexEditor extends AbstractCellEditor implements TableCellEditor {
private int currentLayerIndex;
private UIComboBox layerChoseCombobox = new UIComboBox();
public LayerIndexEditor(int currentLayerIndex) {
this.currentLayerIndex = currentLayerIndex;
for (int i = 1; i < currentLayerIndex; i++) {
layerChoseCombobox.addItem(i);
}
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
if (value != null) {
layerChoseCombobox.setSelectedIndex(Integer.valueOf(String.valueOf(value)) - 1);
}
return layerChoseCombobox;
}
@Override
public Object getCellEditorValue() {
return layerChoseCombobox.getSelectedItem();
}
public void layerChanged(int newLayerIndex) {
this.currentLayerIndex = newLayerIndex;
layerChoseCombobox.removeAllItems();
for (int i = 1; i < currentLayerIndex; i++) {
layerChoseCombobox.addItem(i);
}
}
}
/**
* 第二列editor
*/
private static final class FiledEditor extends AbstractCellEditor implements TableCellEditor {
private UIComboBox layerChoseCombobox = new UIComboBox();
TableDataDictPane tableDataDictPane;
public FiledEditor(TableDataDictPane tableDataDictPane) {
this.tableDataDictPane = tableDataDictPane;
List<String> columnNames = getColumnNameList(this.tableDataDictPane);
for (String columnName : columnNames) {
this.layerChoseCombobox.addItem(columnName);
}
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
List<String> columnNames = getColumnNameList(this.tableDataDictPane);
layerChoseCombobox.removeAllItems();
for (String columnName : columnNames) {
layerChoseCombobox.addItem(columnName);
}
if (value != null) {
layerChoseCombobox.setSelectedIndex(Integer.valueOf(String.valueOf(value)));
}
return layerChoseCombobox;
}
@Override
public Object getCellEditorValue() {
//转化为数据集的列索引(从0开始)
return layerChoseCombobox.getSelectedIndex();
}
public void layerChanged() {
List<String> columnNames = getColumnNameList(this.tableDataDictPane);
layerChoseCombobox.removeAllItems();
for (String columnName : columnNames) {
layerChoseCombobox.addItem(columnName);
}
}
}
private static List<String> getColumnNameList(TableDataDictPane tableDataDictPane) {
TableDataWrapper wrapper = tableDataDictPane.tableDataNameComboBox.getSelectedItem();
if (wrapper == null) {
return new ArrayList<String>();
} else {
return wrapper.calculateColumnNameList();
}
}
private static class LayerDepenceTableModel extends AbstractTableModel {
private List<LayerDependence> dependences;
public LayerDepenceTableModel() {
dependences = new ArrayList<LayerDependence>();
}
/**
* 添加一条数据,该方法会请求Table进行重绘(通过发送时间,告诉JTable数据更新,JTable会自动重绘)
*/
public void addDependence() {
dependences.add(new LayerDependence());
fireTableRowsInserted(dependences.size(), dependences.size());
}
/**
* 删除一条数据
*
* @param rowIndex
*/
public void delDependence(int rowIndex) {
if (rowIndex < 0 || rowIndex >= dependences.size()) {
return;
}
dependences.remove(rowIndex);
fireTableRowsDeleted(rowIndex + 1, rowIndex + 1);
}
public void addAll(List<LayerDependence> dependenceList) {
dependences.addAll(dependenceList);
fireTableRowsInserted(1, dependenceList.size());
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public Class<?> getColumnClass(int column) {
return Integer.class;
}
@Override
public String getColumnName(int column) {
String name;
if (column == 0) {
name = Inter.getLocText("FR-Designer_layerIndex");
} else {
name = Inter.getLocText("FR-Designer_filedChosen");
}
return name;
}
@Override
public int getRowCount() {
return dependences.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
LayerDependence dependence = dependences.get(rowIndex);
Object obj;
if (columnIndex == 0) {
obj = dependence.getLayerIndex();
} else {
obj = dependence.getThisColumnIndex();
}
return obj;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
LayerDependence dependence = dependences.get(rowIndex);
if (aValue != null) {
if (columnIndex == 0) {
dependence.setLayerIndex((Integer) aValue);
} else {
dependence.setThisColumnIndex((Integer) aValue);
}
}
}
public void clear() {
int length = dependences.size();
dependences.clear();
fireTableRowsDeleted(1, length);
}
public List<LayerDependence> update() {
return this.dependences;
}
}
}

2
designer_base/src/com/fr/design/hyperlink/AbstractHyperlinkPane.java

@ -127,7 +127,7 @@ public abstract class AbstractHyperlinkPane<T extends Hyperlink> extends BasicBe
public void updateBean(T link) {
updateSubHyperlinkBean(link);
link.setTargetFrame((String) targetFrameComboBox.getSelectedItem());
link.setTargetFrame(HyperlinkTargetFrame.parse(targetFrameComboBox.getSelectedIndex()).getName());
link.setHeight(Utils.objectToNumber(heightTextFiled.getText(), false).intValue());
link.setWidth(Utils.objectToNumber(widthTextFiled.getText(), false).intValue());
}

48
designer_base/src/com/fr/design/hyperlink/HyperlinkTargetFrame.java

@ -0,0 +1,48 @@
package com.fr.design.hyperlink;
/**
* Created by ibm on 2016/10/13.
*/
public enum HyperlinkTargetFrame {
BLANK_FRAME("_blank", 0), DIALOG_FRAME("_dialog", 1), SELF_FRAME("_self", 2);
private String name;
private int index;
private static HyperlinkTargetFrame[] arrayOfValues;
HyperlinkTargetFrame(String name, int index) {
this.name = name;
this.index = index;
}
public static HyperlinkTargetFrame parse(int index) {
if (arrayOfValues == null) {
arrayOfValues = HyperlinkTargetFrame.values();
}
for (HyperlinkTargetFrame hyperlinkTargetFrame : HyperlinkTargetFrame.values()) {
if (hyperlinkTargetFrame.getIndex() == index) {
return hyperlinkTargetFrame;
}
}
return BLANK_FRAME;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

BIN
designer_base/src/com/fr/design/images/control/combobox.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

19
designer_base/src/com/fr/design/mainframe/DesignerFrame.java

@ -464,9 +464,28 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
//添加分享按钮
addShareButton();
//添加插件中的按钮
addExtraButtons();
return combineUp;
}
private void addExtraButtons(){
JTemplate<?, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
if(jt == null){
return;
}
UIButton[] extraButtons = jt.createExtraButtons();
for (int i = 0; i < extraButtons.length; i++) {
combineUp.add(extraButtons[i]);
}
if (extraButtons.length > 0) {
combineUp.addSeparator(new Dimension(2, 16));
}
}
private void addShareButton(){
JTemplate<?, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();

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

@ -8,8 +8,8 @@ import com.fr.base.io.IOFile;
import com.fr.design.DesignModelAdapter;
import com.fr.design.DesignState;
import com.fr.design.DesignerEnvManager;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.actions.TableDataSourceAction;
import com.fr.design.actions.core.WorkBookSupportable;
import com.fr.design.actions.edit.RedoAction;
import com.fr.design.actions.edit.UndoAction;
import com.fr.design.actions.file.SaveAsTemplateAction;
@ -19,6 +19,7 @@ import com.fr.design.designer.TargetComponent;
import com.fr.design.dialog.InformationWarnPane;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.TemplateTreePane;
import com.fr.design.fun.DesignerFrameUpButtonProvider;
import com.fr.design.fun.MenuHandler;
import com.fr.design.fun.PreviewProvider;
import com.fr.design.gui.frpane.HyperlinkGroupPane;
@ -37,9 +38,12 @@ import com.fr.file.FILE;
import com.fr.file.FILEChooserPane;
import com.fr.file.FileNodeFILE;
import com.fr.file.MemFILE;
import com.fr.form.ui.NoneWidget;
import com.fr.form.ui.Widget;
import com.fr.general.ComparatorUtils;
import com.fr.general.FRLogger;
import com.fr.general.Inter;
import com.fr.stable.ArrayUtils;
import com.fr.stable.ProductConstants;
import com.fr.stable.StringUtils;
import com.fr.stable.project.ProjectConstants;
@ -51,6 +55,7 @@ import java.awt.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Set;
import java.util.regex.Pattern;
/**
@ -505,6 +510,9 @@ public abstract class JTemplate<T extends IOFile, U extends BaseUndoState<?>> ex
public boolean saveShareFile(){
return true;
}
public Widget getSelectElementCase(){
return new NoneWidget();
}
protected FILEChooserPane getFILEChooserPane(boolean isShowLoc){
return new FILEChooserPane(true, isShowLoc);
@ -957,4 +965,18 @@ public abstract class JTemplate<T extends IOFile, U extends BaseUndoState<?>> ex
public boolean acceptToolbarItem(Class clazz) {
return true;
}
/**
* 加载插件中的按钮
* @return 按钮组
*/
public UIButton[] createExtraButtons() {
Set<DesignerFrameUpButtonProvider> providers = ExtraDesignClassManager.getInstance().getArray(DesignerFrameUpButtonProvider.XML_TAG);
UIButton[] uiButtons = new UIButton[0];
for (DesignerFrameUpButtonProvider provider : providers) {
uiButtons = ArrayUtils.addAll(uiButtons, provider.getUpButtons(getMenuState()));
}
return uiButtons;
}
}

107
designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java

@ -26,6 +26,7 @@ import com.fr.design.menu.MenuDef;
import com.fr.design.menu.SeparatorDef;
import com.fr.design.menu.ShortCut;
import com.fr.design.menu.ToolBarDef;
import com.fr.env.RemoteEnv;
import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralContext;
import com.fr.general.Inter;
@ -146,13 +147,13 @@ public abstract class ToolBarMenuDock {
// 给菜单加插件入口
for (MenuDef m : menuDefs) {
switch (m.getAnchor()) {
case MenuHandler.TEMPLATE :
case MenuHandler.TEMPLATE:
insertMenu(m, MenuHandler.TEMPLATE, new TemplateTargetAction(plus));
break;
case MenuHandler.INSERT :
case MenuHandler.INSERT:
insertMenu(m, MenuHandler.INSERT);
break;
case MenuHandler.CELL :
case MenuHandler.CELL:
insertMenu(m, MenuHandler.CELL);
break;
default:
@ -199,7 +200,7 @@ public abstract class ToolBarMenuDock {
addSwitchExistEnvAction(menuDef);
menuDef.addShortCut( new ExitDesignerAction());
menuDef.addShortCut(new ExitDesignerAction());
insertMenu(menuDef, MenuHandler.FILE);
return menuDef;
@ -221,7 +222,7 @@ public abstract class ToolBarMenuDock {
menuDef.addShortCut(new SwitchExistEnv());
}
protected ShortCut openTemplateAction(){
protected ShortCut openTemplateAction() {
return new OpenTemplateAction();
}
@ -231,15 +232,14 @@ public abstract class ToolBarMenuDock {
* @return 菜单
*/
public abstract ShortCut[] createNewFileShortCuts();
/**
* 创建论坛登录面板, chart那边不需要
*
* @return 面板组件
*
*/
public Component createBBSLoginPane(){
return new UILabel();
* 创建论坛登录面板, chart那边不需要
*
* @return 面板组件
*/
public Component createBBSLoginPane() {
return new UILabel();
}
@ -264,9 +264,10 @@ public abstract class ToolBarMenuDock {
);
if (!BaseUtils.isAuthorityEditing()) {
if (shouldShowPlugin()){
if (shouldShowPlugin() && !(FRContext.getCurrentEnv() instanceof RemoteEnv)) {
menuDef.addShortCut(
new PluginManagerAction()
new PluginManagerAction(),
new ReuseManagerAction()
);
}
menuDef.addShortCut(
@ -290,6 +291,7 @@ public abstract class ToolBarMenuDock {
/**
* 创建帮助子菜单
*
* @return 帮组菜单的子菜单
*/
public ShortCut[] createHelpShortCuts() {
@ -298,11 +300,11 @@ public abstract class ToolBarMenuDock {
shortCuts.add(SeparatorDef.DEFAULT);
//shortCuts.add(new TutorialAction());
shortCuts.add(SeparatorDef.DEFAULT);
if (ComparatorUtils.equals(ProductConstants.APP_NAME,FINEREPORT)) {
if (ComparatorUtils.equals(ProductConstants.APP_NAME, FINEREPORT)) {
shortCuts.add(new FeedBackAction());
shortCuts.add(SeparatorDef.DEFAULT);
shortCuts.add(SeparatorDef.DEFAULT);
// shortCuts.add(new ForumAction());
// shortCuts.add(new ForumAction());
}
shortCuts.add(SeparatorDef.DEFAULT);
shortCuts.add(new AboutAction());
@ -312,6 +314,7 @@ public abstract class ToolBarMenuDock {
/**
* 创建社区子菜单
*
* @return 社区菜单的子菜单
*/
public ShortCut[] createCommunityShortCuts() {
@ -346,6 +349,7 @@ public abstract class ToolBarMenuDock {
insertMenu(menuDef, MenuHandler.BBS);
return menuDef;
}
/**
* 生成工具栏
*
@ -470,7 +474,8 @@ public abstract class ToolBarMenuDock {
public int getMenuState() {
return DesignState.WORK_SHEET;
}
public int getToolBarHeight(){
public int getToolBarHeight() {
return PANLE_HEIGNT;
}
@ -479,29 +484,29 @@ public abstract class ToolBarMenuDock {
*
* @return 子菜单
*/
public ShortCut[] shortcut4ExportMenu(){
public ShortCut[] shortcut4ExportMenu() {
return new ShortCut[0];
}
};
public NewTemplatePane getNewTemplatePane(){
return new NewTemplatePane() {
@Override
public Icon getNew() {
return BaseUtils.readIcon("/com/fr/design/images/buttonicon/addicon.png");
}
public NewTemplatePane getNewTemplatePane() {
return new NewTemplatePane() {
@Override
public Icon getNew() {
return BaseUtils.readIcon("/com/fr/design/images/buttonicon/addicon.png");
}
@Override
public Icon getMouseOverNew() {
return BaseUtils.readIcon("/com/fr/design/images/buttonicon/add_press.png");
}
@Override
public Icon getMouseOverNew() {
return BaseUtils.readIcon("/com/fr/design/images/buttonicon/add_press.png");
}
@Override
public Icon getMousePressNew() {
return BaseUtils.readIcon("/com/fr/design/images/buttonicon/add_press.png");
}
};
@Override
public Icon getMousePressNew() {
return BaseUtils.readIcon("/com/fr/design/images/buttonicon/add_press.png");
}
};
}
protected void insertMenu(MenuDef menuDef, String anchor) {
@ -520,8 +525,11 @@ public abstract class ToolBarMenuDock {
for (MenuHandler handler : target) {
int insertPosition = handler.insertPosition(menuDef.getShortCutCount());
if (insertPosition == MenuHandler.HIDE) {
return;
}
ShortCut shortCut = action.methodAction(handler);
if (shortCut == null){
if (shortCut == null) {
continue;
}
@ -534,48 +542,47 @@ public abstract class ToolBarMenuDock {
menuDef.insertShortCut(insertPosition, shortCut);
if (handler.insertSeparatorBefore()) {
menuDef.insertShortCut(insertPosition, SeparatorDef.DEFAULT);
insertPosition ++;
insertPosition++;
}
if (handler.insertSeparatorAfter()) {
insertPosition ++;
insertPosition++;
menuDef.insertShortCut(insertPosition, SeparatorDef.DEFAULT);
}
}
}
}
/**
* 设计器退出时, 做的一些操作.
*
*/
public void shutDown(){
* 设计器退出时, 做的一些操作.
*/
public void shutDown() {
}
private interface ShortCutMethodAction{
private interface ShortCutMethodAction {
public ShortCut methodAction(MenuHandler handler);
}
private abstract class AbstractShortCutMethodAction implements ShortCutMethodAction{
private abstract class AbstractShortCutMethodAction implements ShortCutMethodAction {
public ShortCut methodAction(MenuHandler handler){
return handler.shortcut();
public ShortCut methodAction(MenuHandler handler) {
return handler.shortcut();
}
}
//不需要编辑对象的菜单, 比如文件, 服务器, 关于
private class NoTargetAction extends AbstractShortCutMethodAction{
private class NoTargetAction extends AbstractShortCutMethodAction {
}
//模板为对象的菜单, 比如模板, 后续如果单元格也要, 直接加个CellTargetAction即可.
//在methodAction中做handler.shortcut(cell), 不需要修改handler中原有接口, 加个shortcut(cell).
private class TemplateTargetAction extends AbstractShortCutMethodAction{
private class TemplateTargetAction extends AbstractShortCutMethodAction {
private ToolBarMenuDockPlus plus;
public TemplateTargetAction(ToolBarMenuDockPlus plus){
public TemplateTargetAction(ToolBarMenuDockPlus plus) {
this.plus = plus;
}

11
designer_base/src/com/fr/design/menu/MenuDef.java

@ -13,9 +13,7 @@ import javax.swing.*;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
@ -164,11 +162,18 @@ public class MenuDef extends ShortCut {
createdJMenu.setIcon(BaseUtils.readIcon(this.iconPath));
}
createdJMenu.addMenuListener(menuDefListener);
ContainerListener listener = getContainerListener();
if(listener != null){
createdJMenu.getPopupMenu().addContainerListener(listener);
}
}
return createdJMenu;
}
protected ContainerListener getContainerListener() {
return null;
}
/**
* 生成 JPopupMenu
* @return 弹出菜单

12
designer_base/src/com/fr/design/utils/DesignUtils.java

@ -236,9 +236,6 @@ public class DesignUtils {
guiFRFont = getNamedFont("SimSun");
} else if(isDisplayDialog(defaultLocale)) {
guiFRFont = getNamedFont("Dialog");
} else if(isDisplayJapaneseFont(defaultLocale)){
//日文设计器默认用MS Mincho字体渲染
guiFRFont = getNamedFont("MS Mincho");
} else {
guiFRFont = getNamedFont("Tahoma");
}
@ -270,14 +267,11 @@ public class DesignUtils {
private static boolean isDisplaySimSun(Locale defaultLocale){
return ComparatorUtils.equals(defaultLocale, Locale.SIMPLIFIED_CHINESE);
}
private static boolean isDisplayJapaneseFont(Locale defaultLocale){
return ComparatorUtils.equals(defaultLocale, Locale.JAPANESE)
|| ComparatorUtils.equals(defaultLocale, Locale.JAPAN);
}
private static boolean isDisplayDialog(Locale defaultLocale){
return ComparatorUtils.equals(defaultLocale, Locale.TRADITIONAL_CHINESE)
return ComparatorUtils.equals(defaultLocale, Locale.TRADITIONAL_CHINESE)
|| ComparatorUtils.equals(defaultLocale, Locale.JAPANESE)
|| ComparatorUtils.equals(defaultLocale, Locale.JAPAN)
|| ComparatorUtils.equals(defaultLocale, Locale.KOREAN)
|| ComparatorUtils.equals(defaultLocale, Locale.KOREA);
}

9
designer_base/src/com/fr/start/BaseDesigner.java

@ -7,10 +7,11 @@ import com.fr.base.FRContext;
import com.fr.design.DesignerEnvManager;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.RestartHelper;
import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.UIDialog;
import com.fr.design.extra.PluginManagerPane;
import com.fr.design.extra.PluginShopDialog;
import com.fr.design.extra.ShopDialog;
import com.fr.design.extra.PluginWebBridge;
import com.fr.design.extra.WebManagerPaneFactory;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.MutilTempalteTabPane;
import com.fr.design.file.TemplateTreePane;
@ -130,8 +131,8 @@ public abstract class BaseDesigner extends ToolBarMenuDock {
String text = StableUtils.join(plugins, ",") + Inter.getLocText("FR-Designer_Plugin_Should_Update");
int r = JOptionPane.showConfirmDialog(null, text, Inter.getLocText("FR-Designer_Plugin_Should_Update_Title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
if (r == JOptionPane.OK_OPTION) {
final PluginManagerPane managerPane = new PluginManagerPane();
UIDialog dlg = new PluginShopDialog(DesignerContext.getDesignerFrame(),managerPane);
BasicPane managerPane = new WebManagerPaneFactory().createPluginPane();
UIDialog dlg = new ShopDialog(DesignerContext.getDesignerFrame(), managerPane);
PluginWebBridge.getHelper().setDialogHandle(dlg);
dlg.setVisible(true);
}

66
designer_chart/build.dev.gradle

@ -0,0 +1,66 @@
apply plugin: 'java'
tasks.withType(JavaCompile){
options.encoding = 'UTF-8'
}
//jdk版本
sourceCompatibility=1.8
//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

5
designer_chart/src/com/fr/design/chart/gui/ChartComponent.java

@ -224,10 +224,7 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene
* @param event 鼠标事件
*/
public void mouseClicked(MouseEvent event) {
int click = event.getClickCount();
if (click >= 1 && activeGlyph != null && this.isSupportEdit()) {
activeGlyph.goRightPane();
}
}
/**

3
designer_chart/src/com/fr/design/chart/series/PlotSeries/MapDefiAreaNamePane.java

@ -36,7 +36,6 @@ import com.fr.design.gui.xcombox.ComboBoxUseEditor;
import com.fr.design.editor.editor.Editor;
import com.fr.design.editor.editor.TextEditor;
import com.fr.general.Inter;
import com.fr.third.org.apache.poi.hssf.record.formula.functions.T;
/**
* 地图, 定义区域名.
@ -90,7 +89,7 @@ public class MapDefiAreaNamePane extends BasicBeanPane<String> implements Abstrc
tableDataBox.setPreferredSize(new Dimension(200, 20));
northPane.add(tableDataBox);
columnBox = new FilterComboBox<T>();
columnBox = new FilterComboBox();
columnBox.setPreferredSize(new Dimension(40, 20));
columnBox.addItemListener(columnChange);

2
designer_chart/src/com/fr/design/mainframe/actions/ExcelExportAction4Chart.java

@ -58,7 +58,7 @@ public class ExcelExportAction4Chart extends AbstractExportAction4JChart {
@Override
protected String getDefaultExtension() {
return ExcelUtils.checkPOIJarExist() ? "xlsx" : "xls";
return ExcelUtils.checkThirdJarSupportPOI() ? "xlsx" : "xls";
}
@Override

9
designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartAreaPane.java

@ -45,13 +45,8 @@ public class ChartAreaPane extends ThirdTabPane<Chart> implements AutoSelectedPa
if(parent instanceof ChartStylePane) {
plotPane.setParentPane((ChartStylePane)parent);
}
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
if (jTemplate.isJWorkBook() || jTemplate.getEditingReportIndex() == BaseJForm.ELEMENTCASE_TAB) {
//表单中的图表组件的图表区挪到控件属性表的样式中了
paneList.add(new NamePane(areaPane.title4PopupWindow(), areaPane));
}else if(jTemplate.isChartBook()){
paneList.add(new NamePane(areaPane.title4PopupWindow(), areaPane));
}
paneList.add(new NamePane(areaPane.title4PopupWindow(), areaPane));
if(plot.isSupportPlotBackground()) {
paneList.add(new NamePane(plotPane.title4PopupWindow(), plotPane));

18
designer_chart/src/com/fr/design/mainframe/exporter/ExcelExporter4Chart.java

@ -6,14 +6,14 @@ import com.fr.design.mainframe.JChart;
import com.fr.general.FRLogger;
import com.fr.general.IOUtils;
import com.fr.stable.CoreGraphHelper;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.fr.third.v2.org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import com.fr.third.v2.org.apache.poi.hssf.usermodel.HSSFWorkbook;
import com.fr.third.v2.org.apache.poi.ss.usermodel.ClientAnchor;
import com.fr.third.v2.org.apache.poi.ss.usermodel.Drawing;
import com.fr.third.v2.org.apache.poi.ss.usermodel.Sheet;
import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook;
import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
@ -73,7 +73,7 @@ public class ExcelExporter4Chart extends ImageExporter4Chart {
}
private boolean checkExcelExportVersion() {
return ExcelUtils.checkPOIJarExist();
return ExcelUtils.checkThirdJarSupportPOI();
}
// 加载图片.
private int loadPicture(BufferedImage bufferedImage)throws IOException {

83
designer_form/build.dev.gradle

@ -0,0 +1,83 @@
apply plugin: 'java'
tasks.withType(JavaCompile){
options.encoding = 'UTF-8'
}
//jdk版本
sourceCompatibility=1.8
//jar包版本
version='8.0'
def srcDir="."
//jar包的名字
jar{
baseName='fr-designer-report'
}
//
sourceSets{
main{
java{
srcDirs=["${srcDir}/src",
"${srcDir}/../designer/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'
}
//
def dataContent ={def dir ->
copySpec{
from ("${dir}"){
exclude '**/.setting/**','.classpath','.project','**/*.java','**/*.db','**/*.g','**/package.html'
}
}
}
//.java文件复制到classes文件夹下
task copyFile(type:Copy,dependsOn:compileJava){
copy{
with dataContent.call("${srcDir}/src")
with dataContent.call("${srcDir}/../designer/src")
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')
}
fileset (dir:"${srcDir}/../designer/src"){
include (name:'**/*.js')
include (name:'**/*.css')
}
}
}
jar.dependsOn compressJS

30
designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteBodyLayoutAdapter.java

@ -0,0 +1,30 @@
package com.fr.design.designer.beans.adapters.layout;
import com.fr.design.beans.GroupModel;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.properties.FRAbsoluteBodyLayoutPropertiesGroupModel;
import com.fr.design.designer.properties.FRAbsoluteLayoutPropertiesGroupModel;
import com.fr.form.ui.container.WBodyLayoutType;
/**
* Created by zhouping on 2016/10/14.
*/
public class FRAbsoluteBodyLayoutAdapter extends FRAbsoluteLayoutAdapter {
public FRAbsoluteBodyLayoutAdapter(XLayoutContainer container) {
super(container);
}
@Override
public GroupModel getLayoutProperties() {
XWAbsoluteBodyLayout xwAbsoluteBodyLayout = (XWAbsoluteBodyLayout) container;
//如果body是绝对布局,那么获取原来自适应body的属性--布局类型
WBodyLayoutType layoutType = WBodyLayoutType.FIT;
if (container.getParent() != null) {
layoutType = ((XWFitLayout)container.getParent()).toData().getBodyLayoutType();
}
return new FRAbsoluteBodyLayoutPropertiesGroupModel(xwAbsoluteBodyLayout, layoutType);
}
}

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

@ -12,6 +12,7 @@ import com.fr.design.designer.properties.FRAbsoluteLayoutPropertiesGroupModel;
import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.ui.container.WBodyLayoutType;
import com.fr.general.ComparatorUtils;
import com.fr.general.FRLogger;

133
designer_form/src/com/fr/design/designer/creator/XCreator.java

@ -15,6 +15,7 @@ import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WTitleLayout;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import javax.swing.*;
import javax.swing.border.Border;
@ -27,7 +28,7 @@ import java.util.List;
/**
* @author richer
* @since 6.5.3 com.fr.base.listener.OB的设计组件
*
*
*/
public abstract class XCreator extends JPanel implements XComponent, XCreatorTools {
@ -44,6 +45,8 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
// XCreator加入到某些XLayoutContainer中时,能调整宽度或者高度
private int[] directions;
private Rectangle backupBound;
private String shareId = StringUtils.EMPTY;//如果组件是共享的会有这个属性
private boolean isHelpBtnOnFocus = false;//焦点是否在帮助按钮上
public XCreator(Widget ob, Dimension initSize) {
this.data = ob;
@ -83,7 +86,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
setSize(this.backupSize);
}
}
/**
* 备份当前大小
*/
@ -113,76 +116,76 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public XLayoutContainer getTopLayout(){
return null;
}
/**
* 获取当前XCreator的一个封装父容器
*
*
* @param widgetName 当前组件名
*
*
* @return 封装的父容器
*
*
*
* @date 2014-11-25-下午4:47:23
*
*
*/
protected XLayoutContainer getCreatorWrapper(String widgetName){
return new XWTitleLayout();
}
/**
* 将当前对象添加到父容器中
*
*
* @param parentPanel 父容器组件
*
*
*
* @date 2014-11-25-下午4:57:55
*
*
*/
protected void addToWrapper(XLayoutContainer parentPanel, int width, int minHeight){
protected void addToWrapper(XLayoutContainer parentPanel, int width, int minHeight){
parentPanel.add(this, WTitleLayout.BODY);
}
/**
* 设置父容器的名字
*
*
* @param parentPanel 当前父容器
* @param widgetName 当前控件名
*
*
*
* @date 2014-11-27-上午9:47:00
*
*
*/
protected void setWrapperName(XLayoutContainer parentPanel, String widgetName){
parentPanel.toData().setWidgetName(widgetName);
}
/**
* 初始化当前组件的父容器
* 大体分为三种: Scale缩放型, Title标题型, Border自定义标题栏
*
*
* @param minHeight 最小高度
*
*
* @return 父容器
*
*
*
* @date 2014-11-25-下午5:15:23
*
*
*/
public XLayoutContainer initCreatorWrapper(int minHeight){
XLayoutContainer parentPanel;
String widgetName = this.toData().getWidgetName();
parentPanel = this.getCreatorWrapper(widgetName);
int width = this.getWidth();
int height = this.getHeight();
parentPanel.setLocation(this.getX(), this.getY());
parentPanel.setSize(width, height);
setWrapperName(parentPanel, widgetName);
this.setLocation(0, 0);
this.addToWrapper(parentPanel, width, minHeight);
LayoutUtils.layoutRootContainer(parentPanel);
return parentPanel;
}
@ -291,7 +294,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public Dimension getMinimumSize() {
return new Dimension(0, 0);
}
/**
* 是否支持切换到报表界面编辑
* @return 是则返回true
@ -299,7 +302,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public boolean isReport(){
return false;
}
/**
* 该组件是否可以拖入参数面板
* @return 是则返回true
@ -359,7 +362,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public void setBackupBound(Rectangle rec) {
this.backupBound = rec;
}
/**
* 控件树不显示此组件
* @param path 控件树list
@ -367,7 +370,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public void notShowInComponentTree(ArrayList<Component> path) {
return;
}
/**
* 重置组件的名称
* @param name 名称
@ -375,7 +378,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public void resetCreatorName(String name) {
toData().setWidgetName(name);
}
/**
* 返回编辑的子组件scale为其内部组件
* @return 组件
@ -383,7 +386,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public XCreator getEditingChildCreator() {
return this;
}
/**
* 返回对应属性表的组件scale和title返回其子组件
* @return 组件
@ -391,7 +394,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public XCreator getPropertyDescriptorCreator() {
return this;
}
/**
* 更新子组件的Bound; 没有不处理
* @param minHeight 最小高度
@ -399,7 +402,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public void updateChildBound(int minHeight) {
return;
}
/**
* 是否作为控件树的叶子节点
* @return 是则返回true
@ -407,7 +410,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public boolean isComponentTreeLeaf() {
return true;
}
/**
* 是否为sclae和title专属容器
* @return 是则返回true
@ -415,7 +418,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public boolean isDedicateContainer() {
return false;
}
/**
* 是否接收这种类型
* @param acceptTypes 接收的类型
@ -432,13 +435,13 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
/**
* 是否组件要缩放(自适应里部分组件需要, 如数字文本下拉框下拉复选框密码下拉树下拉复选树日期)
*
*
* @return 是则返回true
*/
public boolean shouldScaleCreator() {
return false;
}
/**
* 是否支持标题样式
* @return 默认false
@ -446,10 +449,10 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public boolean hasTitleStyle() {
return false;
}
/**
* 响应点击事件
*
*
* @param editingMouseListener 鼠标点击位置处理器
* @param e 鼠标点击事件
*/
@ -468,10 +471,10 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
}
}
}
/**
* 删除相关组件
*
*
* @param creator 当前组件
* @param designer 表单设计器
*
@ -479,17 +482,17 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public void deleteRelatedComponent(XCreator creator,FormDesigner designer){
return;
}
/**
* 选择相关组件
*
*
* @param creator 当前组件
*
*
*/
public void seleteRelatedComponent(XCreator creator){
return;
}
/**
* 返回组件
* @return
@ -498,7 +501,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public XCreator getXCreator(){
return this;
}
/**
* 按百分比调整组件
* @param percent 百分比
@ -507,7 +510,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public void adjustCompSize(double percent){
return;
}
/**
* 返回一些需要的子组件
* @return 返回一些需要的子组件
@ -516,11 +519,11 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public ArrayList<?> getTargetChildrenList(){
return new ArrayList();
}
public XLayoutContainer getOuterLayout(){
return this.getBackupParent();
}
/**
* 重新调整子组件宽度
* @param width 宽度
@ -553,4 +556,38 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
public boolean supportRenameInWidgetTree() {
return true;
}
/**
* 组件是否是共享组件
* @return 是否是共享组件
*/
public boolean isShared() {
return StringUtils.isNotEmpty(shareId);
}
public void setShareId(String shareId) {
this.shareId = shareId;
}
public String getShareId() {
return shareId;
}
/**
* 焦点是否在帮助按钮上
* @return 焦点是否在帮助按钮上
*/
public boolean isHelpBtnOnFocus() {
return isHelpBtnOnFocus;
}
public void setHelpBtnOnFocus(boolean helpBtnOnFocus) {
isHelpBtnOnFocus = helpBtnOnFocus;
}
/**
* 设置共享帮助信息
* @param msg 帮助信息
*/
public void setSharedMsg(String msg){}
}

1
designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java

@ -77,6 +77,7 @@ public class XCreatorUtils {
xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class);
xLayoutMap.put(WParameterLayout.class, XWParameterLayout.class);
xLayoutMap.put(WAbsoluteBodyLayout.class, XWAbsoluteBodyLayout.class);
xLayoutMap.put(WAbsoluteLayout.class, XWAbsoluteLayout.class);
xLayoutMap.put(WHorizontalBoxLayout.class, XWHorizontalBoxLayout.class);
xLayoutMap.put(WBorderLayout.class, XWBorderLayout.class);

26
designer_form/src/com/fr/design/designer/creator/XElementCase.java

@ -1,5 +1,6 @@
package com.fr.design.designer.creator;
import com.fr.base.BaseUtils;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.designer.properties.mobile.ElementCasePropertyUI;
import com.fr.design.form.util.XCreatorConstants;
@ -20,6 +21,7 @@ import com.fr.form.FormElementCaseProvider;
import com.fr.form.ui.ElementCaseEditor;
import com.fr.general.Inter;
import com.fr.stable.ArrayUtils;
import com.fr.stable.CoreGraphHelper;
import com.fr.stable.core.PropertyChangeAdapter;
import com.fr.stable.fun.FitProvider;
import com.fr.stable.fun.ReportFitAttrProvider;
@ -35,6 +37,18 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme
private UILabel imageLable;
private JPanel coverPanel;
private FormDesigner designer;
//缩略图
private BufferedImage thumbnailImage;
private static BufferedImage DEFAULT_BACKGROUND;
static{
try{
DEFAULT_BACKGROUND = BaseUtils.readImageWithCache("com/fr/base/images/report/elementcase.png");
}catch (Throwable e) {
//IBM jdk 1.5.0_22 并发下读取图片有时会异常(EOFException), 这个图片反正只有设计器用到, 捕获住
DEFAULT_BACKGROUND = CoreGraphHelper.createBufferedImage(0, 0);
}
}
public XElementCase(ElementCaseEditor widget, Dimension initSize) {
super(widget, initSize);
@ -145,7 +159,7 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme
*/
private UILabel initImageBackground(){
UILabel imageLable = new UILabel();
BufferedImage image = toData().getECImage();
BufferedImage image = getThumbnailImage();
setLabelBackground(image, imageLable);
return imageLable;
@ -222,10 +236,18 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme
}
public void setBackground(BufferedImage image){
toData().setECImage(image);
setThumbnailImage(image);
setEditorIcon(image);
}
private void setThumbnailImage(BufferedImage image) {
this.thumbnailImage = image;
}
private BufferedImage getThumbnailImage(){
return thumbnailImage == null ? DEFAULT_BACKGROUND : thumbnailImage;
}
private void setEditorIcon(BufferedImage image){
setLabelBackground(image, imageLable);
}

45
designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java

@ -0,0 +1,45 @@
package com.fr.design.designer.creator;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.FRAbsoluteBodyLayoutAdapter;
import com.fr.form.ui.container.WAbsoluteBodyLayout;
import java.awt.*;
/**
* Created by zhouping on 2016/10/14.
* 用作body的绝对布局
*/
public class XWAbsoluteBodyLayout extends XWAbsoluteLayout {
public XWAbsoluteBodyLayout(WAbsoluteBodyLayout widget, Dimension initSize) {
super(widget, initSize);
this.editable = true;
}
/**
* 返回对应的widget容器
*
* @return 返回WAbsoluteLayout
*/
@Override
public WAbsoluteBodyLayout toData() {
return (WAbsoluteBodyLayout)data;
}
@Override
public LayoutAdapter getLayoutAdapter() {
return new FRAbsoluteBodyLayoutAdapter(this);
}
/**
* 假如是body的话始终要能编辑不会出现蒙层
*
* @param isEditable 可否编辑
*/
@Override
public void setEditable(boolean isEditable) {
super.setEditable(true);
}
}

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

@ -75,7 +75,7 @@ public class XWAbsoluteLayout extends XLayoutContainer {
xConnectorMap.put(connector, new XConnector(connector, this));
}
initPercent();
initPercent(widget);
}
/**
@ -89,13 +89,14 @@ public class XWAbsoluteLayout extends XLayoutContainer {
}
//根据屏幕大小来确定显示的百分比, 1440*900默认100%, 1366*768缩放90%
private void initPercent(){
private void initPercent(WAbsoluteLayout widget){
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension scrnsize = toolkit.getScreenSize();
double screenValue = FRScreen.getByDimension(scrnsize).getValue();
if(screenValue != FormArea.DEFAULT_SLIDER){
this.setContainerPercent(screenValue / FormArea.DEFAULT_SLIDER);
}
widget.setDesigningResolution(scrnsize);
}
/**

5
designer_form/src/com/fr/design/designer/properties/AbsoluteStateRenderer.java

@ -1,11 +1,10 @@
package com.fr.design.designer.properties;
import com.fr.design.mainframe.widget.renderer.EncoderCellRenderer;
/**
* Created by zhouping on 2016/8/1.
*/
public class AbsoluteStateRenderer extends EncoderCellRenderer {
public class AbsoluteStateRenderer extends BodyLayoutAttrRenderer {
public AbsoluteStateRenderer() {
super(new AbsoluteStateWrapper());
}

23
designer_form/src/com/fr/design/designer/properties/BodyLayoutAttrRenderer.java

@ -0,0 +1,23 @@
package com.fr.design.designer.properties;
import com.fr.design.mainframe.widget.renderer.EncoderCellRenderer;
import com.fr.general.IOUtils;
import java.awt.*;
import java.awt.image.BufferedImage;
/**
* Created by zhouping on 2016/10/14.
*/
public class BodyLayoutAttrRenderer extends EncoderCellRenderer {
public BodyLayoutAttrRenderer(Encoder encoder) {
super(encoder);
}
@Override
public void paint(Graphics g) {
super.paint(g);
BufferedImage image = IOUtils.readImage("com/fr/design/images/control/combobox.png");
g.drawImage(image, getWidth() - image.getWidth(), 0, image.getWidth(), image.getHeight(), null, this);
}
}

239
designer_form/src/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java

@ -0,0 +1,239 @@
package com.fr.design.designer.properties;
import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.design.mainframe.widget.editors.LayoutTypeEditor;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WBodyLayoutType;
import com.fr.general.FRScreen;
import com.fr.general.Inter;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.geom.Arc2D;
import java.util.Arrays;
import java.util.Comparator;
/**
* Created by zhouping on 2016/10/14.
*/
public class FRAbsoluteBodyLayoutPropertiesGroupModel extends FRAbsoluteLayoutPropertiesGroupModel {
private LayoutTypeEditor layoutTypeEditor;
private LayoutTypeRenderer layoutTypeRenderer;
//默认body是0,自适应布局;1,绝对布局.
private WBodyLayoutType layoutType = WBodyLayoutType.ABSOLUTE;
public FRAbsoluteBodyLayoutPropertiesGroupModel(XWAbsoluteBodyLayout xwAbsoluteBodyLayout) {
super(xwAbsoluteBodyLayout);
}
public FRAbsoluteBodyLayoutPropertiesGroupModel(XWAbsoluteBodyLayout xwAbsoluteBodyLayout, WBodyLayoutType layoutType){
this(xwAbsoluteBodyLayout);
this.layoutTypeEditor = new LayoutTypeEditor();
this.layoutTypeRenderer = new LayoutTypeRenderer();
this.layoutType = layoutType;
}
/**
* 布局管理器自己的属性
*/
@Override
public String getGroupName() {
return Inter.getLocText("FR-Designer_Attr_Layout");
}
@Override
public int getRowCount() {
return 2;
}
@Override
public TableCellRenderer getRenderer(int row) {
return row == 0 ? layoutTypeRenderer : stateRenderer;
}
@Override
public TableCellEditor getEditor(int row) {
return row == 0 ? layoutTypeEditor : stateEditor;
}
@Override
public Object getValue(int row, int column) {
if (column == 0) {
switch (row) {
case 0:
return Inter.getLocText("FR-Designer_Attr_Layout_Type");
default:
return Inter.getLocText("FR-Designer-Widget_Scaling_Mode");
}
} else {
switch (row) {
case 0:
return layoutType.getTypeValue();
default:
return layout.getCompState();
}
}
}
@Override
public boolean setValue(Object value, int row, int column) {
if (layoutType == WBodyLayoutType.ABSOLUTE){
int state = 0;
if(value instanceof Integer) {
state = (Integer)value;
}
if (column == 0 || state < 0) {
return false;
} else {
if (row == 0) {
if (state == WBodyLayoutType.FIT.getTypeValue()) {
XWFitLayout xfl = (XWFitLayout) xwAbsoluteLayout.getBackupParent();
Component[] components = xwAbsoluteLayout.getComponents();
Arrays.sort(components, new ComparatorComponentLocation());
xfl.getLayoutAdapter().removeBean(xwAbsoluteLayout, xwAbsoluteLayout.getWidth(), xwAbsoluteLayout.getHeight());
xfl.remove(xwAbsoluteLayout);
xfl.toData().setLayoutType(WBodyLayoutType.FIT);
for (Component comp : components) {
xfl.add(comp);
}
moveComponents2FitLayout(xfl, components);
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
formDesigner.getSelectionModel().setSelectedCreators(
FormSelectionUtils.rebuildSelection(xfl, new Widget[]{xfl.toData()}));
xfl.convert();
LayoutUtils.layoutContainer(xfl);
xfl.adjustCreatorsWhileSlide(xfl.getContainerPercent() - 1.0);
return true;
}
}
if (row == 1) {
layout.setCompState(state);
return true;
}
return false;
}
}
int state = 0;
if(value instanceof Integer) {
state = (Integer)value;
}
if (column == 0 || state < 0) {
return false;
} else {
if (row == 0) {
layout.setCompState(state);
return true;
}
return false;
}
}
/**
* 是否可编辑
* @param row
* @return
*/
@Override
public boolean isEditable(int row) {
return true;
}
//把绝对布局中的元素按规则移动到自适应布局中
private void moveComponents2FitLayout(XWFitLayout xwFitLayout, Component[] components) {
int eachRowCount = 4;
if (components.length <= 1){
return;
}
int layoutWidth = xwFitLayout.getWidth() - xwFitLayout.toData().getMargin().getLeft() - xwFitLayout.toData().getMargin().getRight();
int layoutHeight = xwFitLayout.getHeight() - xwFitLayout.toData().getMargin().getTop() - xwFitLayout.toData().getMargin().getBottom();
int leftMargin = xwFitLayout.toData().getMargin().getLeft();
int topMargin = xwFitLayout.toData().getMargin().getTop();
int row = (components.length / eachRowCount) + (components.length % eachRowCount == 0 ? 0 : 1);
//最后一行的列数不定
int column = components.length % eachRowCount == 0 ? eachRowCount : components.length % eachRowCount;
int componentWidth = layoutWidth / eachRowCount;
int componentHeight = layoutHeight / row;
for(int i = 0;i < row - 1;i++){
for(int j = 0;j < eachRowCount;j++){
components[eachRowCount * i + j].setBounds(
leftMargin + componentWidth * j,
topMargin + componentHeight * i,
j == eachRowCount - 1 ? layoutWidth - componentWidth * (eachRowCount - 1) : componentWidth,
componentHeight
);
}
}
//最后一行列数是特殊的,要单独处理
int lastRowWidth = layoutWidth / column;
int lastRowHeight = layoutHeight - componentHeight * (row - 1);
for (int i = 0;i < column;i++) {
components[eachRowCount * (row - 1) + i].setBounds(
leftMargin + lastRowWidth * i,
topMargin + componentHeight * (row - 1),
i == column - 1 ? layoutWidth - lastRowWidth * (column - 1) : lastRowWidth,
lastRowHeight
);
}
xwFitLayout.updateBoundsWidget();
}
private class ComponentLocationInfo{
private Component component;
private int horizontalNO;
private int verticalNO;
public ComponentLocationInfo(Component component, int horizontalNO, int verticalNO){
this.component = component;
this.horizontalNO = horizontalNO;
this.verticalNO = verticalNO;
}
public int getHorizontalNO() {
return this.horizontalNO;
}
public int getVerticalNO() {
return this.verticalNO;
}
public void setHorizontalNO(int horizontalNO){
this.horizontalNO = horizontalNO;
}
public void setVerticalNO(int verticalNO){
this.verticalNO = verticalNO;
}
}
//以组件的位置来确定先后顺序,y小的在前,x小的在前
private class ComparatorComponentLocation implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if(((Component)o1).getY() < ((Component)o2).getY()){
return -1;
}
else if (((Component)o1).getY() > ((Component)o2).getY()) {
return 1;
}
else {
if (((Component)o1).getX() < ((Component)o2).getX()){
return -1;
}
else if (((Component)o1).getX() > ((Component)o2).getX()) {
return 1;
}
else{
return 0;
}
}
}
}
}

8
designer_form/src/com/fr/design/designer/properties/FRAbsoluteLayoutPropertiesGroupModel.java

@ -19,10 +19,10 @@ public class FRAbsoluteLayoutPropertiesGroupModel implements GroupModel {
private PropertyCellEditor editor;
private DefaultTableCellRenderer renderer;
private AbsoluteLayoutDirectionEditor stateEditor;
private AbsoluteStateRenderer stateRenderer;
private WAbsoluteLayout layout;
private XWAbsoluteLayout xwAbsoluteLayout;
protected AbsoluteLayoutDirectionEditor stateEditor;
protected AbsoluteStateRenderer stateRenderer;
protected WAbsoluteLayout layout;
protected XWAbsoluteLayout xwAbsoluteLayout;
public FRAbsoluteLayoutPropertiesGroupModel(XWAbsoluteLayout xwAbsoluteLayout){
this.xwAbsoluteLayout = xwAbsoluteLayout;

68
designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java

@ -4,16 +4,26 @@
package com.fr.design.designer.properties;
import com.fr.design.beans.GroupModel;
import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.design.mainframe.widget.editors.FitLayoutDirectionEditor;
import com.fr.design.mainframe.widget.editors.LayoutTypeEditor;
import com.fr.design.mainframe.widget.editors.IntegerPropertyEditor;
import com.fr.design.mainframe.widget.editors.PropertyCellEditor;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WAbsoluteBodyLayout;
import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WBodyLayoutType;
import com.fr.form.ui.container.WFitLayout;
import com.fr.general.Inter;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
/**
* 自适应布局自身的属性表
@ -28,6 +38,8 @@ public class FRFitLayoutPropertiesGroupModel implements GroupModel {
private DefaultTableCellRenderer renderer;
private FitLayoutDirectionEditor stateEditor;
private FitStateRenderer stateRenderer;
private LayoutTypeEditor layoutTypeEditor;
private LayoutTypeRenderer layoutTypeRenderer;
private WFitLayout layout;
private XWFitLayout xfl;
@ -38,6 +50,8 @@ public class FRFitLayoutPropertiesGroupModel implements GroupModel {
editor = new PropertyCellEditor(new IntegerPropertyEditor());
stateEditor = new FitLayoutDirectionEditor();
stateRenderer = new FitStateRenderer();
layoutTypeEditor = new LayoutTypeEditor();
layoutTypeRenderer = new LayoutTypeRenderer();
}
/**
@ -45,31 +59,35 @@ public class FRFitLayoutPropertiesGroupModel implements GroupModel {
*/
@Override
public String getGroupName() {
return Inter.getLocText("FR-Designer-Layout_Adaptive_Layout");
return Inter.getLocText("FR-Designer_Layout");
}
@Override
public int getRowCount() {
return 2;
return 3;
}
@Override
public TableCellRenderer getRenderer(int row) {
switch (row) {
case 0:
return renderer;
return layoutTypeRenderer;
case 1:
return stateRenderer;
default:
return stateRenderer;
return renderer;
}
}
@Override
public TableCellEditor getEditor(int row) {
switch (row) {
case 0:
return editor;
case 0:
return layoutTypeEditor;
case 1:
return stateEditor;
default:
return stateEditor;
return editor;
}
}
@ -78,16 +96,20 @@ public class FRFitLayoutPropertiesGroupModel implements GroupModel {
if (column == 0) {
switch (row) {
case 0:
return Inter.getLocText("FR-Designer_Component_Interval");
return Inter.getLocText("FR-Designer_Attr_Layout_Type");
case 1:
return Inter.getLocText("FR-Designer_Component_Scale");
default:
return Inter.getLocText("FR-Designer_Component_Scale");
return Inter.getLocText("FR-Designer_Component_Interval");
}
} else {
switch (row) {
case 0:
return layout.getCompInterval();
return layout.getBodyLayoutType().getTypeValue();
case 1:
return layout.getCompState();
default:
return layout.getCompState();
return layout.getCompInterval();
}
}
}
@ -101,13 +123,35 @@ public class FRFitLayoutPropertiesGroupModel implements GroupModel {
if (column == 0 || state < 0) {
return false;
} else {
if (row ==0 && xfl.canAddInterval(state)) {
if (row == 2 && xfl.canAddInterval(state)) {
// 设置完间隔后,要同步处理界面组件,容器刷新后显示出对应效果
setLayoutGap(state);
return true;
}else if (row == 1) {
layout.setCompState(state);
return true;
}else if (row == 0) {
layout.setLayoutType(WBodyLayoutType.parse(state));
if (state == WBodyLayoutType.ABSOLUTE.getTypeValue()) {
WAbsoluteBodyLayout wAbsoluteBodyLayout = new WAbsoluteBodyLayout("body");
wAbsoluteBodyLayout.setCompState(WAbsoluteLayout.STATE_FIXED);
Component[] components = xfl.getComponents();
xfl.removeAll();
XWAbsoluteBodyLayout xwAbsoluteBodyLayout = new XWAbsoluteBodyLayout(wAbsoluteBodyLayout, new Dimension(0,0));
xfl.getLayoutAdapter().addBean(xwAbsoluteBodyLayout, 0, 0);
for (Component component : components) {
xwAbsoluteBodyLayout.add(component);
}
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
formDesigner.getSelectionModel().setSelectedCreators(
FormSelectionUtils.rebuildSelection(xfl, new Widget[]{wAbsoluteBodyLayout}));
}
else {
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
formDesigner.getSelectionModel().setSelectedCreators(
FormSelectionUtils.rebuildSelection(xfl, new Widget[]{xfl.toData()}));
}
return true;
}
return false;
}

4
designer_form/src/com/fr/design/designer/properties/FitStateRenderer.java

@ -3,13 +3,11 @@
*/
package com.fr.design.designer.properties;
import com.fr.design.mainframe.widget.renderer.EncoderCellRenderer;
/**
* @author jim
* @date 2014-7-31
*/
public class FitStateRenderer extends EncoderCellRenderer{
public class FitStateRenderer extends BodyLayoutAttrRenderer{
/**
* @param encoder

12
designer_form/src/com/fr/design/designer/properties/LayoutTypeRenderer.java

@ -0,0 +1,12 @@
package com.fr.design.designer.properties;
/**
* Created by zhouping on 2016/9/18.
*/
public class LayoutTypeRenderer extends BodyLayoutAttrRenderer {
public LayoutTypeRenderer() {
super(new LayoutTypeWrapper());
}
}

13
designer_form/src/com/fr/design/designer/properties/LayoutTypeWrapper.java

@ -0,0 +1,13 @@
package com.fr.design.designer.properties;
import com.fr.design.designer.properties.items.FRLayoutTypeItems;
/**
* Created by zhouping on 2016/9/18.
*/
public class LayoutTypeWrapper extends ItemWrapper{
public LayoutTypeWrapper() {
super(new FRLayoutTypeItems());
}
}

4
designer_form/src/com/fr/design/designer/properties/items/FRFitConstraintsItems.java

@ -13,8 +13,8 @@ import com.fr.general.Inter;
public class FRFitConstraintsItems implements ItemProvider{
public static final Item[] ITEMS = new Item[] {
new Item(Inter.getLocText("Adaptive_Full_Area"), WFitLayout.STATE_FULL),
new Item(Inter.getLocText("Adaptive_Original_Scale"), WFitLayout.STATE_ORIGIN)};
new Item(Inter.getLocText("FR-Designer_Attr_Bidirectional_Adaptive"), WFitLayout.STATE_FULL),
new Item(Inter.getLocText("FR_Designer_Attr_Horizontal_Adaptive"), WFitLayout.STATE_ORIGIN)};
public Item[] getItems() {
return ITEMS;

16
designer_form/src/com/fr/design/designer/properties/items/FRLayoutTypeItems.java

@ -0,0 +1,16 @@
package com.fr.design.designer.properties.items;
import com.fr.form.ui.container.WBodyLayoutType;
/**
* Created by zhouping on 2016/9/18.
*/
public class FRLayoutTypeItems implements ItemProvider{
public static final Item[] ITEMS = new Item[] {
new Item(WBodyLayoutType.FIT.description(), WBodyLayoutType.FIT.getTypeValue()),
new Item(WBodyLayoutType.ABSOLUTE.description(), WBodyLayoutType.ABSOLUTE.getTypeValue())};
public Item[] getItems() {
return ITEMS;
}
}

26
designer_form/src/com/fr/design/designer/treeview/ComponentTreeModel.java

@ -10,11 +10,9 @@ import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import com.fr.base.FRContext;
import com.fr.design.designer.creator.*;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWidgetCreator;
import com.fr.form.ui.Widget;
public class ComponentTreeModel implements TreeModel {
@ -23,6 +21,8 @@ public class ComponentTreeModel implements TreeModel {
private Component root;
private FormDesigner designer;
private final int ABSOLUTE_AS_BODY_NOT_FOUND = -1;
public ComponentTreeModel(FormDesigner designer, Component root) {
this.designer = designer;
this.root = root;
@ -38,6 +38,11 @@ public class ComponentTreeModel implements TreeModel {
if (parent != null && parent instanceof XLayoutContainer) {
XLayoutContainer xlayout = (XLayoutContainer) parent;
XCreator creator = xlayout.getXCreator(index);
//绝对布局作为body的时候不显示自适应布局父层
int absoluteBodyIndex = getAbsoluteBodyIndex(creator);
if (absoluteBodyIndex > ABSOLUTE_AS_BODY_NOT_FOUND){
return creator.getComponent(absoluteBodyIndex);
}
return creator.getXCreator();
}
return null;
@ -135,4 +140,19 @@ public class ComponentTreeModel implements TreeModel {
FRContext.getLogger().error(e.getMessage(), e);
}
}
private int getAbsoluteBodyIndex(XCreator xCreator){
//绝对布局作为body,父层是自适应布局,找到绝对布局位于父层的index
int index = ABSOLUTE_AS_BODY_NOT_FOUND;
if (xCreator.acceptType(XWFitLayout.class)){
XWFitLayout bodyFitLayout = (XWFitLayout)xCreator;
for (int i = 0;i < bodyFitLayout.getXCreatorCount();i++){
//类型是绝对布局并且还是body
if (bodyFitLayout.getXCreator(i).acceptType(XWAbsoluteBodyLayout.class)){
index = i;
}
}
}
return index;
}
}

2
designer_form/src/com/fr/design/gui/core/FormWidgetOption.java

@ -1 +1 @@
package com.fr.design.gui.core; import javax.swing.Icon; import com.fr.base.BaseUtils; import com.fr.form.ui.ElementCaseEditor; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WBorderLayout; import com.fr.form.ui.container.WCardLayout; import com.fr.form.ui.container.WFitLayout; import com.fr.form.ui.container.WHorizontalBoxLayout; import com.fr.form.ui.container.WParameterLayout; import com.fr.form.ui.container.WVerticalBoxLayout; import com.fr.general.Inter; /** * Author : Shockway * Date: 13-6-17 * Time: 上午10:40 */ public class FormWidgetOption extends WidgetOption { /** * 返回名字 * @return 名字 */ @Override public String optionName() { return null; } /** * 返回图标 * @return 图标 */ @Override public Icon optionIcon() { return null; } /** * 组件类 * @return 类 */ @Override public Class<? extends Widget> widgetClass() { return null; } /** * 返回组件 * @return 控件 */ @Override public Widget createWidget() { return null; } /* * 表单容器 */ public static WidgetOption[] getFormContainerInstance() { return new WidgetOption[] { ABSOLUTELAYOUTCONTAINER, BORDERLAYOUTCONTAINER, HORIZONTALBOXLAYOUTCONTAINER, VERTICALBOXLAYOUTCONTAINER, CARDLAYOUTCONTAINER, FITLAYOUTCONTAINER }; } /** * 表单工具栏上的布局 * @return 控件 */ public static WidgetOption[] getFormLayoutInstance() { return new WidgetOption[] {CARDLAYOUTCONTAINER/*, ABSOLUTELAYOUTCONTAINER*/}; } public static final WidgetOption ABSOLUTELAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_AbsoluteLayout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/layout_absolute_new.png"), WAbsoluteLayout.class); public static final WidgetOption BORDERLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_BorderLayout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/layout_border.png"), WBorderLayout.class); public static final WidgetOption CARDLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_CardLayout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/card_layout_16.png"), WCardLayout.class); public static final WidgetOption HORIZONTALBOXLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_Layout-HBox"), BaseUtils.readIcon("/com/fr/web/images/form/resources/boxlayout_h_16.png"), WHorizontalBoxLayout.class); public static final WidgetOption VERTICALBOXLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_VerticalBoxLayout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/boxlayout_v_16.png"), WVerticalBoxLayout.class); public static final WidgetOption FITLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter.getLocText("FR-Designer-Layout_Adaptive_Layout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/boxlayout_v_16.png"), WFitLayout.class); public static final WidgetOption PARAMETERCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_Para-Body"), BaseUtils.readIcon("/com/fr/web/images/form/resources/layout_parameter.png"), WParameterLayout.class); public static final WidgetOption ELEMENTCASE = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_Form-Report"), BaseUtils.readIcon("/com/fr/web/images/form/resources/report_16.png"), ElementCaseEditor.class); }
package com.fr.design.gui.core; import javax.swing.Icon; import com.fr.base.BaseUtils; import com.fr.form.ui.ElementCaseEditor; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WAbsoluteLayout; import com.fr.form.ui.container.WBorderLayout; import com.fr.form.ui.container.WCardLayout; import com.fr.form.ui.container.WFitLayout; import com.fr.form.ui.container.WHorizontalBoxLayout; import com.fr.form.ui.container.WParameterLayout; import com.fr.form.ui.container.WVerticalBoxLayout; import com.fr.general.Inter; /** * Author : Shockway * Date: 13-6-17 * Time: 上午10:40 */ public class FormWidgetOption extends WidgetOption { /** * 返回名字 * @return 名字 */ @Override public String optionName() { return null; } /** * 返回图标 * @return 图标 */ @Override public Icon optionIcon() { return null; } /** * 组件类 * @return 类 */ @Override public Class<? extends Widget> widgetClass() { return null; } /** * 返回组件 * @return 控件 */ @Override public Widget createWidget() { return null; } /* * 表单容器 */ public static WidgetOption[] getFormContainerInstance() { return new WidgetOption[] { ABSOLUTELAYOUTCONTAINER, BORDERLAYOUTCONTAINER, HORIZONTALBOXLAYOUTCONTAINER, VERTICALBOXLAYOUTCONTAINER, CARDLAYOUTCONTAINER, FITLAYOUTCONTAINER }; } /** * 表单工具栏上的布局 * @return 控件 */ public static WidgetOption[] getFormLayoutInstance() { return new WidgetOption[] {CARDLAYOUTCONTAINER, ABSOLUTELAYOUTCONTAINER}; } public static final WidgetOption ABSOLUTELAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_Layout_Block_Absolute"), BaseUtils.readIcon("/com/fr/web/images/form/resources/layout_absolute_new.png"), WAbsoluteLayout.class); public static final WidgetOption BORDERLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_BorderLayout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/layout_border.png"), WBorderLayout.class); public static final WidgetOption CARDLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_Layout_Block_Tab"), BaseUtils.readIcon("/com/fr/web/images/form/resources/card_layout_16.png"), WCardLayout.class); public static final WidgetOption HORIZONTALBOXLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_Layout-HBox"), BaseUtils.readIcon("/com/fr/web/images/form/resources/boxlayout_h_16.png"), WHorizontalBoxLayout.class); public static final WidgetOption VERTICALBOXLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_VerticalBoxLayout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/boxlayout_v_16.png"), WVerticalBoxLayout.class); public static final WidgetOption FITLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter.getLocText("FR-Designer-Layout_Adaptive_Layout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/boxlayout_v_16.png"), WFitLayout.class); public static final WidgetOption PARAMETERCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_Para-Body"), BaseUtils.readIcon("/com/fr/web/images/form/resources/layout_parameter.png"), WParameterLayout.class); public static final WidgetOption ELEMENTCASE = WidgetOptionFactory.createByWidgetClass(Inter .getLocText("FR-Designer_Form-Report"), BaseUtils.readIcon("/com/fr/web/images/form/resources/report_16.png"), ElementCaseEditor.class); }

192
designer_form/src/com/fr/design/mainframe/ComponentTree.java

@ -16,8 +16,7 @@ import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.ComponentAdapter;
import com.fr.design.designer.beans.events.DesignerEditListener;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.*;
import com.fr.design.designer.treeview.ComponentTreeCellRenderer;
import com.fr.design.designer.treeview.ComponentTreeModel;
import com.fr.stable.StringUtils;
@ -40,7 +39,7 @@ public class ComponentTree extends JTree {
TreePath[] paths = getSelectedTreePath();
addTreeSelectionListener(designer);
setSelectionPaths(paths);
designer.addDesignerEditListener(new TreeDesignerEditAdapter());
this.addMouseListener(new MouseAdapter() {
@ -68,15 +67,19 @@ public class ComponentTree extends JTree {
setEditable(true);
}
public FormDesigner getDesigner() {
return designer;
}
/**
* 构造函数
*
*
* @param designer 设计界面组件
* @param model 构造JTree的model
*/
public ComponentTree(FormDesigner designer,ComponentTreeModel model) {
this(designer);
this.setModel(model);
this(designer);
this.setModel(model);
}
@ -96,17 +99,17 @@ public class ComponentTree extends JTree {
return super.isPathEditable(path);
}
/**
* 将值转换为文本
* @param value
* @param selected 是否选中
* @param expanded 扩展
* @param leaf 是否叶子
* @param row
* @param hasFocus 是否焦点
*
* @return 返回文本
*/
/**
* 将值转换为文本
* @param value
* @param selected 是否选中
* @param expanded 扩展
* @param leaf 是否叶子
* @param row
* @param hasFocus 是否焦点
*
* @return 返回文本
*/
@Override
public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
if (value != null && value instanceof XCreator) {
@ -115,25 +118,25 @@ public class ComponentTree extends JTree {
return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus);
}
}
public void setAndScrollSelectionPath(TreePath treepath) {
setSelectionPath(treepath);
scrollPathToVisible(treepath);
setSelectionPath(treepath);
scrollPathToVisible(treepath);
}
private void popupMenu(MouseEvent e) {
TreePath path = this.getSelectionPath();
if (path == null) {
return;
}
Component component = (Component) path.getLastPathComponent();
if (!(component instanceof XCreator)) {
return;
}
ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, (XCreator) component);
JPopupMenu menu = adapter.getContextPopupMenu(e);
menu.show(this, e.getX(), e.getY());
}
private void popupMenu(MouseEvent e) {
TreePath path = this.getSelectionPath();
if (path == null) {
return;
}
Component component = (Component) path.getLastPathComponent();
if (!(component instanceof XCreator)) {
return;
}
ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, (XCreator) component);
JPopupMenu menu = adapter.getContextPopupMenu(e);
menu.show(this, e.getX(), e.getY());
}
/**
* 刷新
@ -145,51 +148,51 @@ public class ComponentTree extends JTree {
public TreePath[] getSelectedTreePath() {
XCreator[] creators = designer.getSelectionModel().getSelection().getSelectedCreators();
TreePath[] paths = new TreePath[creators.length];
for (int i = 0; i < paths.length; i++) {
paths[i] = buildTreePath(creators[i]);
}
return paths;
}
private class TreeDesignerEditAdapter implements DesignerEditListener {
@Override
public void fireCreatorModified(DesignerEvent evt) {
if (evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED) {
TreePath[] paths = getSelectedTreePath();
if (paths.length == 1) {
setAndScrollSelectionPath(paths[0]);
} else {
setSelectionPaths(paths);
}
} else if(evt.getCreatorEventID() == DesignerEvent.CREATOR_PASTED) {
ComponentTree.this.refreshUI();
TreePath[] paths = getSelectedTreePath();
if (paths.length == 1) {
setAndScrollSelectionPath(paths[0]);
} else {
setSelectionPaths(paths);
}
ComponentTree.this.repaint();
} else {
ComponentTree.this.refreshUI();
ComponentTree.this.repaint();
}
}
@Override
public boolean equals(Object o) {
return o.getClass() == this.getClass();
}
}
public TreePath[] getSelectedTreePath() {
XCreator[] creators = designer.getSelectionModel().getSelection().getSelectedCreators();
TreePath[] paths = new TreePath[creators.length];
for (int i = 0; i < paths.length; i++) {
paths[i] = buildTreePath(creators[i]);
}
return paths;
}
private class TreeDesignerEditAdapter implements DesignerEditListener {
@Override
public void fireCreatorModified(DesignerEvent evt) {
if (evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED) {
TreePath[] paths = getSelectedTreePath();
if (paths.length == 1) {
setAndScrollSelectionPath(paths[0]);
} else {
setSelectionPaths(paths);
}
} else if(evt.getCreatorEventID() == DesignerEvent.CREATOR_PASTED) {
ComponentTree.this.refreshUI();
TreePath[] paths = getSelectedTreePath();
if (paths.length == 1) {
setAndScrollSelectionPath(paths[0]);
} else {
setSelectionPaths(paths);
}
ComponentTree.this.repaint();
} else {
ComponentTree.this.refreshUI();
ComponentTree.this.repaint();
}
}
@Override
public boolean equals(Object o) {
return o.getClass() == this.getClass();
}
}
/**
@ -211,11 +214,11 @@ public class ComponentTree extends JTree {
paths[i] = buildTreePath(searchList.get(i));
}
if(paths.length > 0) {
setAndScrollSelectionPath(paths[0]);
setAndScrollSelectionPath(paths[0]);
} else {
setSelectionPath();
setSelectionPath();
}
return paths;
return paths;
}
@ -248,7 +251,7 @@ public class ComponentTree extends JTree {
* 触发
*/
public void fireTreeChanged() {
designer.refreshDesignerUI();
designer.refreshDesignerUI();
}
/**
@ -267,14 +270,21 @@ public class ComponentTree extends JTree {
ArrayList<Component> path = new ArrayList<Component>();
Component parent = comp;
while (parent != null) {
XCreator creator = (XCreator) parent;
path.add(0, parent);
if (creator != comp ) {
creator.notShowInComponentTree(path);
}
parent = parent.getParent();
}
while (parent != null) {
XCreator creator = (XCreator) parent;
path.add(0, parent);
if (creator != comp ) {
creator.notShowInComponentTree(path);
}
//绝对布局作为body的时候不显示自适应布局父层
if (((XCreator) parent).acceptType(XWAbsoluteBodyLayout.class)
&& (parent.getParent() != null)
&& ((XCreator)parent.getParent()).acceptType(XWFitLayout.class)){
parent = parent.getParent().getParent();
continue;
}
parent = parent.getParent();
}
Object[] components = path.toArray();
return new TreePath(components);
}

11
designer_form/src/com/fr/design/mainframe/FormParaWidgetPane.java

@ -94,12 +94,6 @@ public class FormParaWidgetPane extends JPanel{
private void initFormParaComponent() {
this.removeAll();
// 菜单中的布局先注释掉
JPanel reportPane = new JPanel(new FlowLayout());
reportPane.add(new ToolBarButton(FormWidgetOption.ELEMENTCASE));
add(createNormalCombinationPane(reportPane,Inter.getLocText("FR-Designer-Form-ToolBar_Report")));
add(createJSeparator());
JPanel paraPane = new JPanel(new FlowLayout());
ToolBarButton paraButton = new paraButton(FormWidgetOption.PARAMETERCONTAINER);
paraPane.add(paraButton);
@ -111,7 +105,8 @@ public class FormParaWidgetPane extends JPanel{
for(WidgetOption option : loadLayoutOptions()){
layoutPane.add(new ToolBarButton(option));
}
add(createNormalCombinationPane(layoutPane,Inter.getLocText("FR-Designer_Layout")));
layoutPane.add(new ToolBarButton(FormWidgetOption.ELEMENTCASE));
add(createNormalCombinationPane(layoutPane,Inter.getLocText("FR-Designer_Layout_Block_Blank")));
jSeparatorLayout = createJSeparator();
add(jSeparatorLayout);
@ -192,7 +187,7 @@ public class FormParaWidgetPane extends JPanel{
}
labelPane.add(label,BorderLayout.CENTER);
reportPane.add(labelPane,BorderLayout.SOUTH);
reportPane.setPreferredSize(new Dimension((int)jComponent.getPreferredSize().getWidth(),(int)reportPane.getPreferredSize().getHeight()));
reportPane.setPreferredSize(new Dimension((int)reportPane.getPreferredSize().getWidth(),(int)reportPane.getPreferredSize().getHeight()));
return reportPane;
}

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

@ -10,6 +10,7 @@ import com.fr.design.designer.beans.actions.FormDeleteAction;
import com.fr.design.designer.beans.events.DesignerEditListener;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.XComponent;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.designer.properties.FormWidgetAuthorityEditPane;
import com.fr.design.event.TargetModifiedEvent;
@ -35,6 +36,7 @@ import com.fr.file.FILE;
import com.fr.form.FormElementCaseContainerProvider;
import com.fr.form.FormElementCaseProvider;
import com.fr.form.main.Form;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WBorderLayout;
import com.fr.form.ui.container.WLayout;
import com.fr.general.ComparatorUtils;
@ -756,4 +758,10 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
return WorkBookSupportable.class.isAssignableFrom(clazz);
}
@Override
public Widget getSelectElementCase() {
FormSelection selection = formDesign.getSelectionModel().getSelection();
XCreator creator = selection.getSelectedCreator();
return creator.toData();
}
}

192
designer_form/src/com/fr/design/mainframe/ShareWidgetButton.java

@ -0,0 +1,192 @@
package com.fr.design.mainframe;
import com.fr.base.BaseUtils;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.form.share.ShareLoader;
import com.fr.form.ui.ElCaseBindInfo;
import com.fr.form.ui.Widget;
import com.fr.general.ComparatorUtils;
import com.fr.stable.StringUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.Serializable;
/**
* Coder: zack
* Date: 2016/10/9
* Time: 16:14
*/
public class ShareWidgetButton extends JPanel implements MouseListener, MouseMotionListener, Serializable {
private ElCaseBindInfo bindInfo;
private MouseEvent lastPressEvent;
public ShareWidgetButton(ElCaseBindInfo bindInfo) {
this.bindInfo = bindInfo;
initUI();
this.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
this.addMouseListener(this);
this.addMouseMotionListener(this);
new DragAndDropDragGestureListener(this, DnDConstants.ACTION_COPY_OR_MOVE);
}
private void initUI() {
this.setBackground(Color.WHITE);
this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
setPreferredSize(new Dimension(110, 70));
setLayout(FRGUIPaneFactory.createBorderLayout());
ImagePanel imagePanel = new ImagePanel((BufferedImage) bindInfo.getCover());
this.add(imagePanel, BorderLayout.NORTH);
JPanel panel = new JPanel();
UILabel label = new UILabel(bindInfo.getName(), SwingConstants.HORIZONTAL);
panel.setBackground(new Color(184, 220, 242));
panel.add(label);
this.add(panel, BorderLayout.SOUTH);
}
private class ImagePanel extends JPanel {
private BufferedImage image;
public ImagePanel(BufferedImage image) {
this.image = image;
this.setPreferredSize(new Dimension(110, 50));
}
@Override
public void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, 110, 70, null);
}
}
public ElCaseBindInfo getBindInfo() {
return bindInfo;
}
public void setBindInfo(ElCaseBindInfo bindInfo) {
this.bindInfo = bindInfo;
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
lastPressEvent = e;
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
if (BaseUtils.isAuthorityEditing()) {
return;
}
if (lastPressEvent == null) {
return;
}
Object source = e.getSource();
Widget creatorSource = null;
String shareId = StringUtils.EMPTY;
if (source instanceof ShareWidgetButton) {
ShareWidgetButton no = (ShareWidgetButton) e.getSource();
if (no == null) {
return;
}
shareId = no.getBindInfo().getId();
creatorSource = ShareLoader.getLoader().getElCaseEditorById(shareId);
}
if (creatorSource != null) {
XCreator xCreator = XCreatorUtils.createXCreator(creatorSource);
xCreator.setShareId(shareId);
WidgetToolBarPane.getTarget().startDraggingBean(xCreator);
lastPressEvent = null;
this.setBorder(null);
}
}
@Override
public void mouseMoved(MouseEvent e) {
}
public class DragAndDropDragGestureListener extends DragSourceAdapter implements DragGestureListener {
private DragSource source;
public DragAndDropDragGestureListener(ShareWidgetButton tt, int actions) {
source = new DragSource();
source.createDefaultDragGestureRecognizer(tt, actions, this);
}
public void dragGestureRecognized(DragGestureEvent dge) {
ShareWidgetButton shareWidgetButton = (ShareWidgetButton) dge.getComponent();
if (shareWidgetButton != null) {
Widget widget = ShareLoader.getLoader().getElCaseEditorById(shareWidgetButton.getBindInfo().getId());
DragAndDropTransferable dragAndDropTransferable = new DragAndDropTransferable(widget);
dge.startDrag(DragSource.DefaultCopyDrop, dragAndDropTransferable, this);
}
}
@Override
public void dragEnter(DragSourceDragEvent dragSourceDragEvent) {
}
}
public class DragAndDropTransferable implements Transferable {
private Widget widget;
public DragAndDropTransferable(Widget widget) {
this.widget = widget;
}
DataFlavor[] flavors = {new DataFlavor(Widget.class, "Widget")};
public DataFlavor[] getTransferDataFlavors() {
return flavors;
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
for (DataFlavor df : flavors) {
if (ComparatorUtils.equals(df, flavor)) {
return true;
}
}
return false;
}
public Object getTransferData(DataFlavor df) throws UnsupportedFlavorException, IOException {
return widget;
}
}
}

29
designer_form/src/com/fr/design/mainframe/ShareWidgetPane.java

@ -0,0 +1,29 @@
package com.fr.design.mainframe;
import com.fr.form.ui.ElCaseBindInfo;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
/**
* Created by xiaxiang on 2016/10/10.
*/
public class ShareWidgetPane extends JPanel {
public ShareWidgetPane(ArrayList<ElCaseBindInfo> elCaseBindInfoList) {
this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));// 设置面板的边框 ,距离上、左、下、右 的距离
int rowCount = (elCaseBindInfoList.size() + 1)/2;
this.setLayout(new GridLayout(rowCount, 2, 10, 10));
for (ElCaseBindInfo rbModuleInfo : elCaseBindInfoList) {
ShareWidgetButton widgetButton = new ShareWidgetButton(rbModuleInfo);
this.add(widgetButton);
}
if (elCaseBindInfoList.size() == 1) {
this.add(new JPanel());
}
}
}

291
designer_form/src/com/fr/design/mainframe/widget/UITreeComboBox.java

@ -0,0 +1,291 @@
package com.fr.design.mainframe.widget;
/**
* Created by xiaxiang on 2016/9/30.
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import javax.swing.plaf.metal.*;
import javax.swing.tree.*;
import com.fr.design.designer.beans.*;
import com.fr.design.designer.beans.events.DesignerEditListener;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.mainframe.ComponentTree;
import com.sun.java.swing.plaf.motif.*;
import com.sun.java.swing.plaf.windows.*;
/**
* 控件树下拉列表框
*/
public class UITreeComboBox extends JComboBox{
/**
* 显示用的树
*/
private ComponentTree tree;
public UITreeComboBox(ComponentTree componentTree){
this.setTree(componentTree);
tree.getDesigner().addDesignerEditListener(new TreeComboBoxDesignerEditAdapter());
// for(int i=0; i<tree.getRowCount(); i++)
// {
// tree.expandRow(i);
// }
setPreferredSize(new Dimension(200, 20));
}
/**
* 设置树
* @param tree ComponentTree
*/
public void setTree(ComponentTree tree){
this.tree = tree;
if(tree != null){
this.setSelectedItem(tree.getSelectionPath());
this.setRenderer(new UITreeComboBoxRenderer());
}
this.updateUI();
}
/**
* 取得树
* @return JTree
*/
public ComponentTree getTree(){
return tree;
}
/**
* 设置当前选择的树路径
* @param o Object
*/
public void setSelectedItem(Object o){
tree.setSelectionPath((TreePath)o);
getModel().setSelectedItem(o);
}
public void updateUI(){
ComboBoxUI cui = (ComboBoxUI)UIManager.getUI(this);
if(cui instanceof MetalComboBoxUI){
cui = new MetalJTreeComboBoxUI();
} else if(cui instanceof MotifComboBoxUI){
cui = new MotifJTreeComboBoxUI();
} else {
cui = new WindowsJTreeComboBoxUI();
}
setUI(cui);
}
// UI Inner classes -- one for each supported Look and Feel
class MetalJTreeComboBoxUI extends MetalComboBoxUI{
protected ComboPopup createPopup() {
return new TreePopup(comboBox);
}
}
class WindowsJTreeComboBoxUI extends WindowsComboBoxUI{
protected ComboPopup createPopup() {
return new TreePopup(comboBox);
}
}
class MotifJTreeComboBoxUI extends MotifComboBoxUI{
protected ComboPopup createPopup() {
return new TreePopup(comboBox);
}
}
/**
* <p>Title: UITreeComboBoxRenderer</p>
* <p>Description: 树形结构而来的DefaultListCellRenderer </p>
*/
class UITreeComboBoxRenderer extends DefaultListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus){
if(value != null){
TreePath path = (TreePath)value;
Object node = path.getLastPathComponent();
value = node;
TreeCellRenderer r = tree.getCellRenderer();
JLabel lb = (JLabel)r.getTreeCellRendererComponent(
tree, value, isSelected, false, false, index,
cellHasFocus);
return lb;
}
return super.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
}
}
private class TreeComboBoxDesignerEditAdapter implements DesignerEditListener {
@Override
public void fireCreatorModified(DesignerEvent evt) {
if (evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED || evt.getCreatorEventID() == DesignerEvent.CREATOR_PASTED) {
TreePath[] paths = tree.getSelectedTreePath();
if (paths.length == 1) {
tree.setAndScrollSelectionPath(paths[0]);
} else {
tree.setSelectionPaths(paths);
}
setSelectedItem(paths[0]);
MenuSelectionManager.defaultManager().clearSelectedPath();
} else {
return;
}
}
@Override
public boolean equals(Object o) {
return o.getClass() == this.getClass();
}
}
/**
* 测试
*/
// public static void main(String args[]){
// JFrame frame = new JFrame("UITreeComboBox");
// final UITreeComboBox box = new UITreeComboBox(new ComponentTree(new FormDesigner()));
// box.setPreferredSize(new Dimension(300, 28));
// frame.getContentPane().add(box);
// frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// frame.pack();
// frame.setVisible(true);
// }
}
/**
* <p>Title: UITreeComboBox</p>
* <p>Description: TreePopup</p>
*/
class TreePopup extends JPopupMenu implements ComboPopup{
protected UITreeComboBox comboBox;
protected JScrollPane scrollPane;
protected MouseMotionListener mouseMotionListener;
protected MouseListener mouseListener;
public void popupMenu(MouseEvent e) {
TreePath path = comboBox.getTree().getSelectionPath();
if (path == null) {
return;
}
Component component = (Component) path.getLastPathComponent();
if (!(component instanceof XCreator)) {
return;
}
com.fr.design.designer.beans.ComponentAdapter adapter = AdapterBus.getComponentAdapter(comboBox.getTree().getDesigner(), (XCreator) component);
JPopupMenu menu = adapter.getContextPopupMenu(e);
menu.show(comboBox, e.getX(), e.getY());
}
public TreePopup(JComboBox comboBox){
this.comboBox = (UITreeComboBox)comboBox;
setBorder(BorderFactory.createLineBorder(Color.black));
setLayout(new BorderLayout());
setLightWeightPopupEnabled(comboBox.isLightWeightPopupEnabled());
JTree tree = this.comboBox.getTree();
if(tree != null){
scrollPane = new JScrollPane(tree);
scrollPane.setBorder(null);
add(scrollPane, BorderLayout.CENTER);
}
}
public void show(){
updatePopup();
show(comboBox, 0, comboBox.getHeight());
comboBox.getTree().requestFocus();
}
public void hide(){
setVisible(false);
comboBox.firePropertyChange("popupVisible", true, false);
}
protected JList list = new JList();
public JList getList(){
return list;
}
public MouseMotionListener getMouseMotionListener(){
if(mouseMotionListener == null){
mouseMotionListener = new MouseMotionAdapter(){};
}
return mouseMotionListener;
}
public KeyListener getKeyListener(){
return null;
}
public void uninstallingUI(){}
/**
* Implementation of ComboPopup.getMouseListener().
*
* @return a <code>MouseListener</code> or null
* @see ComboPopup#getMouseListener
*/
public MouseListener getMouseListener(){
if(mouseListener == null){
mouseListener = new InvocationMouseHandler();
}
return mouseListener;
}
protected void togglePopup(){
if(isVisible()){
hide();
} else{
show();
}
}
protected void updatePopup(){
setPreferredSize(new Dimension(comboBox.getSize().width, 200));
Object selectedObj = comboBox.getSelectedItem();
if(selectedObj != null){
TreePath tp = (TreePath)selectedObj;
((UITreeComboBox)comboBox).getTree().setSelectionPath(tp);
}
}
protected class InvocationMouseHandler extends MouseAdapter{
public void mousePressed(MouseEvent e){
if(!SwingUtilities.isLeftMouseButton(e) || !comboBox.isEnabled()){
return;
}
if(comboBox.isEditable()){
Component comp = comboBox.getEditor().getEditorComponent();
if((!(comp instanceof JComponent)) ||
((JComponent)comp).isRequestFocusEnabled()){
comp.requestFocus();
}
} else if(comboBox.isRequestFocusEnabled()){
comboBox.requestFocus();
}
togglePopup();
}
public void mouseClicked (MouseEvent e){
if (e.isMetaDown()) {
popupMenu(e);
} else {
return;
}
}
}
}

15
designer_form/src/com/fr/design/mainframe/widget/editors/LayoutTypeEditor.java

@ -0,0 +1,15 @@
package com.fr.design.mainframe.widget.editors;
import com.fr.design.designer.properties.EnumerationEditor;
import com.fr.design.designer.properties.items.FRLayoutTypeItems;
/**
* Created by zhouping on 2016/9/18.
*/
public class LayoutTypeEditor extends EnumerationEditor {
public LayoutTypeEditor() {
super(new FRLayoutTypeItems());
}
}

3
designer_form/src/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java

@ -7,6 +7,7 @@ import com.fr.design.Exception.ValidationException;
import com.fr.design.designer.properties.Decoder;
import com.fr.design.designer.properties.Encoder;
import com.fr.general.Inter;
import com.fr.general.NameObject;
import com.fr.stable.StringUtils;
public class TreeModelWrapper implements Encoder, Decoder {
@ -21,6 +22,8 @@ public class TreeModelWrapper implements Encoder, Decoder {
} else if (v instanceof TreeNodeWrapper) {
TreeNodeAttr[] treeNodeAttrs = ((TreeNodeWrapper) v).getTreeNodeAttrs();
return TemplateUtils.render(Inter.getLocText("FR-Designer_Total_N_Grade"), new String[]{"N"}, new String[]{treeNodeAttrs.length + ""});
} else if (v instanceof NameObject) {
return Inter.getLocText("FR-Designer_DataTable-Build");
} else {
return Inter.getLocText("FR-Designer_Auto-Build");
}

Loading…
Cancel
Save