diff --git a/build.master.gradle b/build.dev.gradle similarity index 100% rename from build.master.gradle rename to build.dev.gradle diff --git a/build.release.gradle b/build.release.gradle new file mode 100644 index 000000000..44aacadb4 --- /dev/null +++ b/build.release.gradle @@ -0,0 +1,85 @@ +apply plugin: "java" +tasks.withType(JavaCompile){ + options.encoding = "UTF-8" +} +def basicDir="../../" +def libDir="${basicDir}/finereport-lib-stable/master" +//获取什么分支名 +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 "CN=FineReport L=NanJing C=China" -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") + + } + +} \ No newline at end of file diff --git a/build.release.gradle.bak b/build.release.gradle.bak new file mode 100644 index 000000000..d8afaf2bb --- /dev/null +++ b/build.release.gradle.bak @@ -0,0 +1,85 @@ +apply plugin: "java" +tasks.withType(JavaCompile){ + options.encoding = "UTF-8" +} +def basicDir="../../" +def libDir="${basicDir}/finereport-lib-stable/master" +//获取什么分支名 +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}/${branchName}/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 "CN=FineReport L=NanJing C=China" -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") + + } + +} \ No newline at end of file diff --git a/designer/src/com/fr/design/mainframe/ElementCasePaneDelegate.java b/designer/src/com/fr/design/mainframe/ElementCasePaneDelegate.java index d6c167a01..79c60d2dc 100644 --- a/designer/src/com/fr/design/mainframe/ElementCasePaneDelegate.java +++ b/designer/src/com/fr/design/mainframe/ElementCasePaneDelegate.java @@ -3,6 +3,7 @@ package com.fr.design.mainframe; import com.fr.base.BaseUtils; import com.fr.design.fun.MenuHandler; import com.fr.design.menu.KeySetUtils; +import com.fr.design.parameter.ParameterPropertyPane; import com.fr.general.Inter; import com.fr.page.ReportSettingsProvider; import com.fr.design.file.HistoryTemplateListPane; @@ -58,6 +59,7 @@ public class ElementCasePaneDelegate extends ElementCasePane { if (editingTemplate != null && !editingTemplate.isUpMode()) { EastRegionContainerPane.getInstance().replaceDownPane(CellElementPropertyPane.getInstance()); EastRegionContainerPane.getInstance().replaceUpPane(QuickEditorRegion.getInstance()); + EastRegionContainerPane.getInstance().removeParameterPane(); } } }); diff --git a/designer/src/com/fr/design/mainframe/JWorkBook.java b/designer/src/com/fr/design/mainframe/JWorkBook.java index 1e27feeb5..f3722c4ac 100644 --- a/designer/src/com/fr/design/mainframe/JWorkBook.java +++ b/designer/src/com/fr/design/mainframe/JWorkBook.java @@ -732,6 +732,7 @@ public class JWorkBook extends JTemplate { } } else { DesignerContext.getDesignerFrame().resetToolkitByPlus(JWorkBook.this); + EastRegionContainerPane.getInstance().removeParameterPane(); if (delegate4ToolbarMenuAdapter() instanceof PolyDesigner) { PolyDesigner polyDesigner = (PolyDesigner) delegate4ToolbarMenuAdapter(); if (polyDesigner.getSelectionType() == PolyDesigner.SelectionType.NONE || polyDesigner.getSelection() == null) { @@ -752,6 +753,7 @@ public class JWorkBook extends JTemplate { EastRegionContainerPane.getInstance().replaceUpPane(allowAuthorityUpPane()); EastRegionContainerPane.getInstance().replaceDownPane(RolesAlreadyEditedPane.getInstance()); } + centerPane.needToShowCoverAndHidPane(); } diff --git a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java index 79ca8b44d..ddce30d70 100644 --- a/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java +++ b/designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java @@ -18,6 +18,7 @@ import com.fr.general.Inter; import com.fr.general.SiteCenter; import com.fr.general.http.HttpClient; import com.fr.stable.EncodeConstants; +import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import javax.swing.*; @@ -99,7 +100,9 @@ public class UserInfoLabel extends UILabel{ } }); - //PluginWebBridge.getHelper().setUILabel(UserInfoLabel.this); + if (StableUtils.getMajorJavaVersion() == 8) { + PluginWebBridge.getHelper().setUILabel(UserInfoLabel.this); + } QQLoginWebBridge.getHelper().setUILabelInPlugin(UserInfoLabel.this); UserLoginContext.addLoginContextListener(new LoginContextListener() { diff --git a/designer/src/com/fr/design/module/DesignerModule.java b/designer/src/com/fr/design/module/DesignerModule.java index 13dc722dc..9e0837ac0 100644 --- a/designer/src/com/fr/design/module/DesignerModule.java +++ b/designer/src/com/fr/design/module/DesignerModule.java @@ -111,17 +111,17 @@ public class DesignerModule extends DesignModule { */ private void registerCellEditor() { - ActionFactory.registerCellEditor(String.class, CellStringQuickEditor.getInstance()); - ActionFactory.registerCellEditor(Number.class, CellStringQuickEditor.getInstance()); - ActionFactory.registerCellEditor(Formula.class, CellStringQuickEditor.getInstance()); - ActionFactory.registerCellEditor(SubReport.class, CellSubReportEditor.getInstance()); - ActionFactory.registerCellEditor(RichText.class, CellRichTextEditor.getInstance()); - ActionFactory.registerCellEditor(DSColumn.class, CellDScolumnEditor.getInstance()); - ActionFactory.registerCellEditor(Image.class, CellImageQuickEditor.getInstance()); - ActionFactory.registerCellEditor(BiasTextPainter.class, new CellBiasTextPainterEditor()); - ActionFactory.registerCellEditor(BufferedImage.class, CellImageQuickEditor.getInstance()); - - ActionFactory.registerChartCellEditorInEditor(ChartQuickEditor.getInstance()); + ActionFactory.registerCellEditor(String.class, CellStringQuickEditor.class); + ActionFactory.registerCellEditor(Number.class, CellStringQuickEditor.class); + ActionFactory.registerCellEditor(Formula.class, CellStringQuickEditor.class); + ActionFactory.registerCellEditor(SubReport.class, CellSubReportEditor.class); + ActionFactory.registerCellEditor(RichText.class, CellRichTextEditor.class); + ActionFactory.registerCellEditor(DSColumn.class, CellDSColumnEditor.class); + ActionFactory.registerCellEditor(Image.class, CellImageQuickEditor.class); + ActionFactory.registerCellEditor(BiasTextPainter.class, CellBiasTextPainterEditor.class); + ActionFactory.registerCellEditor(BufferedImage.class, CellImageQuickEditor.class); + + ActionFactory.registerChartCellEditorInEditor(ChartQuickEditor.class); Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); for (ElementUIProvider provider : providers) { @@ -139,14 +139,13 @@ public class DesignerModule extends DesignModule { * kunnat: 注册悬浮选中Editor */ private void registerFloatEditor() { - FloatStringQuickEditor floatStringQuickEditor = new FloatStringQuickEditor(); - ActionFactory.registerFloatEditor(String.class, floatStringQuickEditor); - ActionFactory.registerFloatEditor(Formula.class, floatStringQuickEditor); + ActionFactory.registerFloatEditor(String.class, FloatStringQuickEditor.class); + ActionFactory.registerFloatEditor(Formula.class, FloatStringQuickEditor.class); FloatImageQuickEditor floatImageQuickEditor = new FloatImageQuickEditor(); - ActionFactory.registerFloatEditor(Image.class, floatImageQuickEditor); - ActionFactory.registerFloatEditor(BufferedImage.class, floatImageQuickEditor); - ActionFactory.registerChartFloatEditorInEditor(ChartQuickEditor.getInstance()); + ActionFactory.registerFloatEditor(Image.class, FloatImageQuickEditor.class); + ActionFactory.registerFloatEditor(BufferedImage.class, FloatImageQuickEditor.class); + ActionFactory.registerChartFloatEditorInEditor(ChartQuickEditor.class); } /** diff --git a/designer/src/com/fr/design/parameter/ParameterDefinitePane.java b/designer/src/com/fr/design/parameter/ParameterDefinitePane.java index 1a547c3e6..eb02932b6 100644 --- a/designer/src/com/fr/design/parameter/ParameterDefinitePane.java +++ b/designer/src/com/fr/design/parameter/ParameterDefinitePane.java @@ -20,7 +20,9 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.AuthorityToolBarPane; +import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.JWorkBook; +import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.menu.*; import com.fr.design.module.DesignModuleFactory; @@ -244,7 +246,7 @@ public class ParameterDefinitePane extends JPanel implements ToolBarMenuDockPlus isdelayItem.setSelected(reportParameterAttr.isDelayPlaying()); isshowWindowItem.setSelected(reportParameterAttr.isShowWindow()); isEditing = true; - + EastRegionContainerPane.getInstance().setParameterHeight(ParameterPropertyPane.getInstance().getPreferredSize().height); ParameterBridge bridge = paraDesignEditor.getParaComponent(); if (parameterUI != null) { bridge.setDelayDisplayContent(reportParameterAttr.isDelayPlaying()); @@ -455,13 +457,13 @@ public class ParameterDefinitePane extends JPanel implements ToolBarMenuDockPlus */ public ShortCut[] shortcut4FileMenu() { return (ShortCut[]) ArrayUtils.addAll(BaseUtils.isAuthorityEditing() ? - new ShortCut[]{new SaveTemplateAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()), - new UndoAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()), - new RedoAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate())} : - new ShortCut[]{new SaveTemplateAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()), - new SaveAsTemplateAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()), - new UndoAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()), - new RedoAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate())}, + new ShortCut[]{new SaveTemplateAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()), + new UndoAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()), + new RedoAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate())} : + new ShortCut[]{new SaveTemplateAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()), + new SaveAsTemplateAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()), + new UndoAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()), + new RedoAction(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate())}, new ShortCut[0] ); } diff --git a/designer/src/com/fr/design/webattr/EditToolBar.java b/designer/src/com/fr/design/webattr/EditToolBar.java index da5ebe2b0..58f455870 100644 --- a/designer/src/com/fr/design/webattr/EditToolBar.java +++ b/designer/src/com/fr/design/webattr/EditToolBar.java @@ -319,7 +319,7 @@ public class EditToolBar extends BasicPane { private CardLayout card; private JPanel centerPane; private UICheckBox icon, text, pdf, excelP, excelO, excelS, image, word, - flashPrint, pdfPrint, appletPrint, serverPrint, isPopup, isVerify, failSubmit; + flashPrint, pdfPrint, appletPrint, serverPrint, isPopup, isVerify, failSubmit, isCurSheet; private UIBasicSpinner count; private Widget widget; private UITextField nameField; @@ -469,10 +469,12 @@ public class EditToolBar extends BasicPane { private JPanel getSubmitPane() { isVerify = new UICheckBox(Inter.getLocText("Verify-Data_Verify")); failSubmit = new UICheckBox(Inter.getLocText(new String[]{"Verify_Fail", "Still", "Submit"})); + isCurSheet = new UICheckBox(Inter.getLocText("FR-Designer-Basic_Only_Submit_Current_Sheet")); JPanel submitPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); submitPane.setBorder(GUICoreUtils.createTitledBorder(Inter.getLocText(new String[]{"Form-Button", "Property", "Set"}), null)); submitPane.add(isVerify); submitPane.add(failSubmit); + submitPane.add(isCurSheet); isVerify.addChangeListener(changeListener); return submitPane; } @@ -562,6 +564,7 @@ public class EditToolBar extends BasicPane { Submit submit = ((Submit) widget); this.isVerify.setSelected(submit.isVerify()); this.failSubmit.setSelected(submit.isFailVerifySubmit()); + this.isCurSheet.setSelected(submit.isOnlySubmitSelect()); } private void populatePDFPrint(){ @@ -624,6 +627,7 @@ public class EditToolBar extends BasicPane { Submit submit = ((Submit) widget); submit.setVerify(this.isVerify.isSelected()); submit.setFailVerifySubmit(this.failSubmit.isSelected()); + submit.setOnlySubmitSelect(this.isCurSheet.isSelected()); } private void updatePrint(){ diff --git a/designer/src/com/fr/design/widget/ui/DateEditorDefinePane.java b/designer/src/com/fr/design/widget/ui/DateEditorDefinePane.java index 2cd4dfadd..b85a18a52 100644 --- a/designer/src/com/fr/design/widget/ui/DateEditorDefinePane.java +++ b/designer/src/com/fr/design/widget/ui/DateEditorDefinePane.java @@ -31,7 +31,7 @@ public class DateEditorDefinePane extends DirectWriteEditorDefinePane 0) { try { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(text); - String sample = simpleDateFormat.format(new Date()); - Color c = Color.black; - if (!ArrayUtils.contains(FormatField.getInstance().getDateFormatArray(), text)) { - sample += " " + Inter.getLocText("DateFormat-Custom_Warning"); - c = Color.red; - } + String sample = simpleDateFormat.format(new Date()); + Color c = Color.black; + if (!ArrayUtils.contains(FormatField.getInstance().getDateFormatArray(), text)) { + sample += " " + Inter.getLocText("DateFormat-Custom_Warning"); + c = Color.red; + } this.sampleLabel.setText(sample); - this.sampleLabel.setForeground(c); + this.sampleLabel.setForeground(c); } catch (Exception exp) { this.sampleLabel.setForeground(Color.red); this.sampleLabel.setText(exp.getMessage()); @@ -143,12 +126,12 @@ public class DateEditorDefinePane extends DirectWriteEditorDefinePane 0) { try { - simpleDateFormat = new SimpleDateFormat(patternTextField.getText()); + simpleDateFormat = new SimpleDateFormat(text); this.sampleLabel.setText(simpleDateFormat.format(new Date())); } catch (Exception exp) { simpleDateFormat = new SimpleDateFormat(""); diff --git a/designer/src/com/fr/design/widget/ui/TextFieldEditorDefinePane.java b/designer/src/com/fr/design/widget/ui/TextFieldEditorDefinePane.java index 1c11aad2e..c9128627c 100644 --- a/designer/src/com/fr/design/widget/ui/TextFieldEditorDefinePane.java +++ b/designer/src/com/fr/design/widget/ui/TextFieldEditorDefinePane.java @@ -61,11 +61,7 @@ public class TextFieldEditorDefinePane extends FieldEditorDefinePane regPane.getRegComboBox().addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { RegExp regExp = (RegExp) regPane.getRegComboBox().getSelectedItem(); - if (!StringUtils.isNotEmpty(regExp.toRegText())) { - getRegErrorMsgTextField().setEnabled(false); - } else { - getRegErrorMsgTextField().setEnabled(true); - } + getRegErrorMsgTextField().setEnabled(regExp.errorMessageEditable()); } }); diff --git a/designer/src/com/fr/poly/creator/ChartBlockCreator.java b/designer/src/com/fr/poly/creator/ChartBlockCreator.java index ca939295b..ca8106ffa 100644 --- a/designer/src/com/fr/poly/creator/ChartBlockCreator.java +++ b/designer/src/com/fr/poly/creator/ChartBlockCreator.java @@ -142,7 +142,7 @@ public class ChartBlockCreator extends BlockCreator { @Override public QuickEditor getQuickEditor(TargetComponent tc) { - ChartQuickEditor quitEditor = ChartQuickEditor.getInstance(); + ChartQuickEditor quitEditor = new ChartQuickEditor(); quitEditor.populate(tc); return quitEditor; } diff --git a/designer/src/com/fr/quickeditor/CellQuickEditor.java b/designer/src/com/fr/quickeditor/CellQuickEditor.java index e1b11ceda..1190b433a 100644 --- a/designer/src/com/fr/quickeditor/CellQuickEditor.java +++ b/designer/src/com/fr/quickeditor/CellQuickEditor.java @@ -30,7 +30,7 @@ import java.awt.event.MouseEvent; */ public abstract class CellQuickEditor extends QuickEditor { - protected UITextField columnRowTextField; + protected UITextField columnRowTextField; protected UIButton cellElementEditButton; protected TemplateCellElement cellElement; diff --git a/designer/src/com/fr/quickeditor/ChartQuickEditor.java b/designer/src/com/fr/quickeditor/ChartQuickEditor.java index c187f1a44..f0f68a9a7 100644 --- a/designer/src/com/fr/quickeditor/ChartQuickEditor.java +++ b/designer/src/com/fr/quickeditor/ChartQuickEditor.java @@ -16,29 +16,17 @@ import com.fr.design.selection.QuickEditor; import java.awt.*; public class ChartQuickEditor extends QuickEditor{ - private static ChartQuickEditor THIS; - // kunsnat: editingPropertyPane初始化 避开设计器启动, 在用到的时候再初始化. - private BaseChartPropertyPane editingPropertyPane = null; - - public static final ChartQuickEditor getInstance() { - if(THIS == null) { - THIS = new ChartQuickEditor(); - } - return THIS; - } + //private BaseChartPropertyPane editingPropertyPane = null; - private ChartQuickEditor() { + public ChartQuickEditor() { setLayout(new BorderLayout()); setBorder(null); } @Override protected void refresh() { - if(editingPropertyPane != null) { - remove(editingPropertyPane); - } - + BaseChartPropertyPane editingPropertyPane = null; BaseChartCollection collection = null; if(tc instanceof PolyDesigner) { ChartBlockEditor chartBlockEditor = (ChartBlockEditor)((PolyDesigner)tc).getSelection().getEditor(); diff --git a/designer/src/com/fr/quickeditor/cellquick/CellDScolumnEditor.java b/designer/src/com/fr/quickeditor/cellquick/CellDSColumnEditor.java similarity index 90% rename from designer/src/com/fr/quickeditor/cellquick/CellDScolumnEditor.java rename to designer/src/com/fr/quickeditor/cellquick/CellDSColumnEditor.java index f92b35394..11cea3e15 100644 --- a/designer/src/com/fr/quickeditor/cellquick/CellDScolumnEditor.java +++ b/designer/src/com/fr/quickeditor/cellquick/CellDSColumnEditor.java @@ -16,7 +16,7 @@ import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -public class CellDScolumnEditor extends CellQuickEditor { +public class CellDSColumnEditor extends CellQuickEditor { private JPanel dsColumnRegion; private JPanel centerPane; private SelectedDataColumnPane dataPane; @@ -55,16 +55,7 @@ public class CellDScolumnEditor extends CellQuickEditor { } }; - private static CellDScolumnEditor THIS; - - public static final CellDScolumnEditor getInstance() { - if (THIS == null) { - THIS = new CellDScolumnEditor(); - } - return THIS; - } - - private CellDScolumnEditor() { + private CellDSColumnEditor() { super(); } @@ -107,4 +98,14 @@ public class CellDScolumnEditor extends CellQuickEditor { this.validate(); } + + /** + * for 关闭时候释放 + */ + public void release () { + super.release(); + dsColumnRegion = null; + centerPane = null; + } + } \ No newline at end of file diff --git a/designer_base/build.dev.gradle b/designer_base/build.dev.gradle new file mode 100644 index 000000000..b02f751e7 --- /dev/null +++ b/designer_base/build.dev.gradle @@ -0,0 +1,70 @@ + +apply plugin: 'java' +tasks.withType(JavaCompile){ + options.encoding = 'UTF-8' +} +//指定构建的jdk版本 +sourceCompatibility=1.7 +//指定生成jar包版本 +version='8.0' +//生成jar包重命名 +jar{ + baseName='fr-designer-core' +} + + +def srcDir="." + +//指定源码路径 +sourceSets{ + main{ + java{ + srcDirs=["${srcDir}/src"] + } + } +} +//获取什么分支名 +FileTree files =fileTree(dir:'./',include:'build.*.gradle') +def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf ('\\')) +buildDir=buildDir.substring(0,buildDir.lastIndexOf ('\\')) +def branchName=buildDir.substring(buildDir.lastIndexOf ('\\')+1) + +//声明外部依赖 +dependencies{ + +compile fileTree(dir:"../../../finereport-lib-stable/${branchName}",include:'**/*.jar') +compile fileTree(dir:'../../../',include:"finereport-*-stable/${branchName}/**/build/libs/*.jar") + + testCompile 'junit:junit:4.12' +} +//复制非.java文件到classes文件夹下参与打包 +task copyFile(type:Copy,dependsOn:compileJava){ + copy{ + from ("${srcDir}/src"){ + exclude '**/.setting/**','.classpath','.project','**/*.java','**/*.db','**/*.g','**/package.html' + } + into 'build/classes/main' + } + +} + + +//压缩项目中的js文件 +task compressJS{ + ant.taskdef(name:'yuicompress',classname:'com.yahoo.platform.yui.compressor.YUICompressTask'){ + classpath { + fileset(dir:'../../../finereport-lib4build-stable',includes:'**/*.jar') + } + } + ant.yuicompress(linebreak:"500",warn:"false", munge:"yes",preserveallsemicolons:"false",charset:"utf-8",encoding:"utf-8",outputfolder:'build/classes/main'){ + fileset (dir:"${srcDir}/src"){ + include (name:'**/*.js') + include (name:'**/*.css') + } + + } +} +jar.dependsOn compressJS + + + diff --git a/designer_base/build.release.gradle b/designer_base/build.release.gradle new file mode 100644 index 000000000..4ed4ba12b --- /dev/null +++ b/designer_base/build.release.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/master',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 + + + diff --git a/designer_base/src/com/fr/design/actions/AllowAuthorityEditAction.java b/designer_base/src/com/fr/design/actions/AllowAuthorityEditAction.java index 5d0ccf2d0..4a79a2d98 100644 --- a/designer_base/src/com/fr/design/actions/AllowAuthorityEditAction.java +++ b/designer_base/src/com/fr/design/actions/AllowAuthorityEditAction.java @@ -1 +1 @@ -package com.fr.design.actions; import com.fr.base.BaseUtils; import com.fr.design.constants.UIConstants; import com.fr.design.menu.KeySetUtils; import com.fr.design.roleAuthority.ReportAndFSManagePane; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; import com.fr.design.designer.TargetComponent; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.mainframe.*; /** * Author : daisy * Date: 13-8-30 * Time: 上午10:12 */ public class AllowAuthorityEditAction extends TemplateComponentAction { public AllowAuthorityEditAction(TargetComponent t) { super(t); this.setMenuKeySet(KeySetUtils.ALLOW_AUTHORITY_EDIT); this.setName(getMenuKeySet().getMenuName()); this.setMnemonic(getMenuKeySet().getMnemonic()); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_report/allow_authority_edit.png")); } /** * 撤销 */ public void prepare4Undo() { HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().iniAuthorityUndoState(); } /** * 执行动作 * * @return 是否执行成功 */ public boolean executeActionReturnUndoRecordNeeded() { TargetComponent tc = getEditingComponent(); if (tc == null) { return false; } cleanAuthorityCondition(); //进入时是格式刷则取消格式刷 if (DesignerContext.getFormatState() != DesignerContext.FORMAT_STATE_NULL) { tc.cancelFormat(); } BaseUtils.setAuthorityEditing(true); ReportAndFSManagePane.getInstance().refreshDockingView(); RolesAlreadyEditedPane.getInstance().refreshDockingView(); WestRegionContainerPane.getInstance().replaceDownPane(ReportAndFSManagePane.getInstance()); DesignerContext.getDesignerFrame().setCloseMode(UIConstants.CLOSE_OF_AUTHORITY); DesignerContext.getDesignerFrame().resetToolkitByPlus(tc.getToolBarMenuDockPlus()); DesignerContext.getDesignerFrame().needToAddAuhtorityPaint(); EastRegionContainerPane.getInstance().replaceUpPane(tc.getEastUpPane()); DesignerContext.getDesignerFrame().refreshDottedLine(); EastRegionContainerPane.getInstance().replaceDownPane(RolesAlreadyEditedPane.getInstance()); //画虚线 return true; } /** * 进入权限编辑之前将权限编辑界面重置一下工具栏 */ private void cleanAuthorityCondition() { java.util.List> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList(); for (int i = 0; i < opendedTemplate.size(); i++) { opendedTemplate.get(i).cleanAuthorityUndo(); } } } \ No newline at end of file +package com.fr.design.actions; import com.fr.base.BaseUtils; import com.fr.design.constants.UIConstants; import com.fr.design.menu.KeySetUtils; import com.fr.design.roleAuthority.ReportAndFSManagePane; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; import com.fr.design.designer.TargetComponent; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.mainframe.*; /** * Author : daisy * Date: 13-8-30 * Time: 上午10:12 */ public class AllowAuthorityEditAction extends TemplateComponentAction { public AllowAuthorityEditAction(TargetComponent t) { super(t); this.setMenuKeySet(KeySetUtils.ALLOW_AUTHORITY_EDIT); this.setName(getMenuKeySet().getMenuName()); this.setMnemonic(getMenuKeySet().getMnemonic()); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_report/allow_authority_edit.png")); } /** * 撤销 */ public void prepare4Undo() { HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().iniAuthorityUndoState(); } /** * 执行动作 * * @return 是否执行成功 */ public boolean executeActionReturnUndoRecordNeeded() { TargetComponent tc = getEditingComponent(); if (tc == null) { return false; } cleanAuthorityCondition(); //进入时是格式刷则取消格式刷 if (DesignerContext.getFormatState() != DesignerContext.FORMAT_STATE_NULL) { tc.cancelFormat(); } BaseUtils.setAuthorityEditing(true); ReportAndFSManagePane.getInstance().refreshDockingView(); RolesAlreadyEditedPane.getInstance().refreshDockingView(); WestRegionContainerPane.getInstance().replaceDownPane(ReportAndFSManagePane.getInstance()); DesignerContext.getDesignerFrame().setCloseMode(UIConstants.CLOSE_OF_AUTHORITY); DesignerContext.getDesignerFrame().resetToolkitByPlus(tc.getToolBarMenuDockPlus()); DesignerContext.getDesignerFrame().needToAddAuhtorityPaint(); EastRegionContainerPane.getInstance().replaceUpPane(tc.getEastUpPane()); DesignerContext.getDesignerFrame().refreshDottedLine(); EastRegionContainerPane.getInstance().replaceDownPane(RolesAlreadyEditedPane.getInstance()); EastRegionContainerPane.getInstance().removeParameterPane(); //画虚线 return true; } /** * 进入权限编辑之前将权限编辑界面重置一下工具栏 */ private void cleanAuthorityCondition() { java.util.List> opendedTemplate = HistoryTemplateListPane.getInstance().getHistoryList(); for (int i = 0; i < opendedTemplate.size(); i++) { opendedTemplate.get(i).cleanAuthorityUndo(); } } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/core/ActionFactory.java b/designer_base/src/com/fr/design/actions/core/ActionFactory.java index 4b3eecb3c..55a72002f 100644 --- a/designer_base/src/com/fr/design/actions/core/ActionFactory.java +++ b/designer_base/src/com/fr/design/actions/core/ActionFactory.java @@ -10,6 +10,7 @@ import com.fr.design.selection.QuickEditor; import javax.swing.*; import java.awt.event.KeyEvent; import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.*; /** @@ -22,11 +23,11 @@ public class ActionFactory { private ActionFactory() { } - private static Map floatEditor = new HashMap(); + private static Map> floatEditor = new HashMap>(); private static Class chartCollectionClass = null; - private static Map cellEditor = new HashMap(); + private static Map> cellEditor = new HashMap>(); private static UpdateAction chartPreStyleAction = null; @@ -36,17 +37,18 @@ public class ActionFactory { * @param clazz 待说明 * @param editor 待说明 */ - public static void registerCellEditor(Class clazz, QuickEditor editor) { + public static void registerCellEditor(Class clazz, Class editor) { cellEditor.put(clazz, editor); } + /** * 待说明 * * @param clazz 待说明 * @param editor 待说明 */ - public static void registerFloatEditor(Class clazz, QuickEditor editor) { + public static void registerFloatEditor(Class clazz, Class editor) { floatEditor.put(clazz, editor); } @@ -84,7 +86,7 @@ public class ActionFactory { * * @param editor 待说明 */ - public static void registerChartFloatEditorInEditor(QuickEditor editor) { + public static void registerChartFloatEditorInEditor(Class editor) { if (chartCollectionClass != null) { floatEditor.put(chartCollectionClass, editor); } @@ -95,7 +97,7 @@ public class ActionFactory { * * @param editor 待说明 */ - public static void registerChartCellEditorInEditor(QuickEditor editor) { + public static void registerChartCellEditorInEditor(Class editor) { if (chartCollectionClass != null) { cellEditor.put(chartCollectionClass, editor); } @@ -105,11 +107,29 @@ public class ActionFactory { * 返回 悬浮元素选中的Editor */ public static QuickEditor getFloatEditor(Class clazz) { - return floatEditor.get(clazz); + return createEditor(clazz, floatEditor); + } + + private static QuickEditor createEditor(Class clazz, Map> editorMap) { + Class c = editorMap.get(clazz); + try { + Constructor constructor = c.getDeclaredConstructor(); + constructor.setAccessible(true); + return constructor.newInstance(); + } catch (NoSuchMethodException e) { + FRContext.getLogger().error(e.getMessage(), e); + } catch (IllegalAccessException e) { + FRContext.getLogger().error(e.getMessage(), e); + } catch (InstantiationException e) { + FRContext.getLogger().error(e.getMessage(), e); + } catch (InvocationTargetException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + return null; } public static QuickEditor getCellEditor(Class clazz) { - return cellEditor.get(clazz); + return createEditor(clazz, cellEditor); } /** diff --git a/designer_base/src/com/fr/design/actions/file/LocalePane.java b/designer_base/src/com/fr/design/actions/file/LocalePane.java index e22d8c258..4dd25c504 100644 --- a/designer_base/src/com/fr/design/actions/file/LocalePane.java +++ b/designer_base/src/com/fr/design/actions/file/LocalePane.java @@ -210,8 +210,6 @@ public class LocalePane extends BasicPane { /** * 保存当前编辑的国际化 * - * - * @date 2014-9-30-下午3:10:30 */ public void save() { Env env = FRContext.getCurrentEnv(); diff --git a/designer_base/src/com/fr/design/actions/file/SwitchExistEnv.java b/designer_base/src/com/fr/design/actions/file/SwitchExistEnv.java index 8854e777b..8545d85d0 100644 --- a/designer_base/src/com/fr/design/actions/file/SwitchExistEnv.java +++ b/designer_base/src/com/fr/design/actions/file/SwitchExistEnv.java @@ -10,6 +10,7 @@ import com.fr.design.DesignerEnvManager; import com.fr.design.actions.UpdateAction; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.TemplatePane; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; @@ -41,12 +42,15 @@ public class SwitchExistEnv extends MenuDef { this.setName(getMenuKeySet().getMenuName()); this.setHasScrollSubMenu(true); initMenuDef(); - GeneralContext.addEnvWillChangedListener(new EnvChangedListener() { - public void envChanged() { - SwitchExistEnv.this.clearShortCuts(); - initMenuDef(); - } - }); + JTemplate t = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + if(t != null) { + GeneralContext.addEnvWillChangedListener(t.getFullPathName(), new EnvChangedListener() { + public void envChanged() { + SwitchExistEnv.this.clearShortCuts(); + initMenuDef(); + } + }); + } } private void initMenuDef() { diff --git a/designer_base/src/com/fr/design/condition/LiteConditionPane.java b/designer_base/src/com/fr/design/condition/LiteConditionPane.java index a32a11239..d6e4a2af4 100644 --- a/designer_base/src/com/fr/design/condition/LiteConditionPane.java +++ b/designer_base/src/com/fr/design/condition/LiteConditionPane.java @@ -542,13 +542,12 @@ public abstract class LiteConditionPane extends BasicBeanPa andRadioButton.setSelected(true); - JPanel radioPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(3); + JPanel radioPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); addControlPane.add(radioPane); radioPane.add(andRadioButton); - addControlPane.add(Box.createHorizontalStrut(4)); radioPane.add(orRadioButton); - addControlPane.add(Box.createHorizontalStrut(12)); + addControlPane.add(Box.createHorizontalStrut(35)); addButton = new UIButton(Inter.getLocText("FR-Designer_Add"), BaseUtils.readIcon("com/fr/base/images/cell/control/add.png")); addButton.setMnemonic('A'); diff --git a/designer_base/src/com/fr/design/constants/KeyWords.java b/designer_base/src/com/fr/design/constants/KeyWords.java index e4af62970..546195e62 100644 --- a/designer_base/src/com/fr/design/constants/KeyWords.java +++ b/designer_base/src/com/fr/design/constants/KeyWords.java @@ -117,6 +117,8 @@ public class KeyWords { "verifyReport()", "writeReportIgnoreVerify(true)", "writeReport(index)", + "loadSheetByIndex(index)", + "loadSheetByName(sheetName)", // curLGP "currentTDCell", diff --git a/designer_base/src/com/fr/design/data/BasicTableDataTreePane.java b/designer_base/src/com/fr/design/data/BasicTableDataTreePane.java index 32049380d..a76d4a105 100644 --- a/designer_base/src/com/fr/design/data/BasicTableDataTreePane.java +++ b/designer_base/src/com/fr/design/data/BasicTableDataTreePane.java @@ -3,6 +3,7 @@ package com.fr.design.data; import com.fr.base.BaseUtils; import com.fr.base.FRContext; import com.fr.base.TableData; +import com.fr.data.TableDataSource; import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.design.DesignModelAdapter; import com.fr.design.actions.UpdateAction; @@ -117,7 +118,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp if (StringUtils.isBlank(tempName)) { nPanel.setShowText(Inter.getLocText(new String[]{"DS-TableData", "ISEMPTY", "PLEASE", "GIVE-NAME"}, new String[]{"", ",", "", "!"})); dg.setButtonEnabled(false); - } else if (!ComparatorUtils.equals(oldName, tempName) && isDsNameRepeaded(tempName, allDSNames)) { + } else if (!ComparatorUtils.equals(oldName, tempName) && isDsNameRepeaded(tempName)) { String[] waring = new String[]{"DS-TableData", "Utils-has_been_existed", "PLEASE", "Rename"}; String[] sign = new String[]{tempName, ",", "", "!"}; nPanel.setShowText(Inter.getLocText(waring, sign)); @@ -323,20 +324,22 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp private String createDsName(String prefix) { int count = 1; allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook()); - while (isDsNameRepeaded(prefix + count, allDSNames)) { + while (isDsNameRepeaded(prefix + count)) { count++; } return prefix + count; } - private boolean isDsNameRepeaded(String name, String[] names) { - boolean repeat = false; - for (int i = 0; i < names.length; i++) { - if (ComparatorUtils.equals(name, names[i])) { - repeat = true; + protected boolean isDsNameRepeaded(String name) { + if (allDSNames == null) { + allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook()); + } + for (int i = 0; i < allDSNames.length; i++) { + if (ComparatorUtils.equals(name, allDSNames[i])) { + return true; } } - return repeat; + return false; } protected KeyAdapter getTableTreeNodeListener(final UpdateAction editAction, final UpdateAction previewTableDataAction, final UpdateAction removeAction, final TableDataSourceOP op, final TableDataTree dataTree) { @@ -423,4 +426,13 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp this.setSmallIcon(BaseUtils.readIcon(IconPathConstants.TD_CONNECTION_ICON_PATH)); } } + + /** + * 合并数据集 + * @param srcName 数据集来源(比如报表块,就是报表块的名称) + * @param tableDataSource 数据集 + */ + public void addTableData(String srcName, TableDataSource tableDataSource) { + + } } diff --git a/designer_base/src/com/fr/design/data/DesignTableDataManager.java b/designer_base/src/com/fr/design/data/DesignTableDataManager.java index 5ec6dd1d5..e0569424d 100644 --- a/designer_base/src/com/fr/design/data/DesignTableDataManager.java +++ b/designer_base/src/com/fr/design/data/DesignTableDataManager.java @@ -13,8 +13,10 @@ import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.data.impl.storeproc.StoreProcedureConstants; import com.fr.design.data.tabledata.wrapper.*; import com.fr.design.DesignModelAdapter; +import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.iprogressbar.AutoProgressBar; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; import com.fr.design.parameter.ParameterInputPane; import com.fr.design.dialog.DialogActionAdapter; import com.fr.file.DatasourceManager; @@ -34,6 +36,7 @@ import java.io.ByteArrayOutputStream; import java.text.Collator; import java.util.*; import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; /** * 设计器管理操作数据集的类: @@ -54,7 +57,10 @@ public abstract class DesignTableDataManager { */ private static java.util.Map globalDsCache = new java.util.HashMap(); private static java.util.Map dsNameChangedMap = new HashMap(); - private static List dsListeners = new ArrayList(); +// private static List dsListeners = new ArrayList(); + + private static Map> dsListenersMap = new HashMap>(); + public static String NO_PARAMETER = "no_paramater_pane"; @@ -73,15 +79,31 @@ public abstract class DesignTableDataManager { * 响应数据集改变. */ private static void fireDsChanged() { - for (int i = 0; i < dsListeners.size(); i++) { - //增强for循环用的iterator实现的, 如果中间哪个listener修改或删除了(如ChartEditPane.dsChangeListener), - // 由于dsListeners是arraylist, 此时会ConcurrentModifyException + for(Entry> listenerEntry : dsListenersMap.entrySet()) { + List dsListeners = listenerEntry.getValue(); + for (int i = 0; i < dsListeners.size(); i++) { + //增强for循环用的iterator实现的, 如果中间哪个listener修改或删除了(如ChartEditPane.dsChangeListener), + // 由于dsListeners是arraylist, 此时会ConcurrentModifyException // for (ChangeListener l : dsListeners) { - ChangeEvent e = null; - dsListeners.get(i).stateChanged(e); + ChangeEvent e = null; + dsListeners.get(i).stateChanged(e); + } + } + } + + public static void closeTemplate(JTemplate template) { + if(template != null) { + dsListenersMap.remove(template.getFullPathName()); } } + public static void envChange() { + dsListenersMap.clear(); + dsNameChangedMap.clear(); + clearGlobalDs(); + } + + /** * 响应数据集改变 * @@ -127,6 +149,16 @@ public abstract class DesignTableDataManager { * @param l ChangeListener监听器 */ public static void addDsChangeListener(ChangeListener l) { + JTemplate template = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + String key = StringUtils.EMPTY; + if(template != null) { + key = template.getFullPathName(); + } + List dsListeners = dsListenersMap.get(key); + if (dsListeners == null) { + dsListeners = new ArrayList(); + dsListenersMap.put(key, dsListeners); + } dsListeners.add(l); } diff --git a/designer_base/src/com/fr/design/data/datapane/TableDataComboBox.java b/designer_base/src/com/fr/design/data/datapane/TableDataComboBox.java index 711c2fc71..4286bbe4b 100644 --- a/designer_base/src/com/fr/design/data/datapane/TableDataComboBox.java +++ b/designer_base/src/com/fr/design/data/datapane/TableDataComboBox.java @@ -146,4 +146,5 @@ public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceC } }); } + } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java b/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java index 162957ebf..219093c6d 100644 --- a/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java @@ -39,6 +39,7 @@ import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; public class TableDataTreePane extends BasicTableDataTreePane { @@ -138,6 +139,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { populate(new TableDataSourceOP(tc)); this.checkButtonEnabled(); } + protected void initbuttonGroup() { Icon[] iconArray = {BaseUtils.readIcon("/com/fr/design/images/data/datasource.png"), BaseUtils.readIcon("/com/fr/design/images/data/dock/serverdatabase.png")}; final Integer[] modeArray = {TEMPLATE_TABLE_DATA, SERVER_TABLE_DATA}; @@ -267,4 +269,31 @@ public class TableDataTreePane extends BasicTableDataTreePane { public TableDataTree getDataTree() { return dataTree; } + + /** + * 合并数据集 + * @param srcName 数据集来源(比如报表块,就是报表块的名称) + * @param tableDataSource 数据集 + */ + public void addTableData(String srcName, TableDataSource tableDataSource) { + allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook()); + DesignTableDataManager.setThreadLocal(DesignTableDataManager.NO_PARAMETER); + TableDataSource tds = tc.getBook(); + Iterator tdIterator = tableDataSource.getTableDataNameIterator(); + while (tdIterator.hasNext()) { + String tdName = (String) tdIterator.next(); + TableData td = tableDataSource.getTableData(tdName); + if (tds.getTableData(tdName) != null || isDsNameRepeaded(tdName)) {//如果有同名的就拼上来源名称 + tdName = srcName + tdName; + } + int i = 0; + while (tds.getTableData(tdName) != null) { + i++;//如果拼上名字后依然已经存在就加编号 + tdName += i; + } + tds.putTableData(tdName, td); + } + tc.parameterChanged(); + dataTree.refresh(); + } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java b/designer_base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java index 0a05e1893..c27373d59 100644 --- a/designer_base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java +++ b/designer_base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java @@ -445,6 +445,14 @@ public class FileTableDataPane extends AbstractTableDataPane { return suffixList.toArray(new String[suffixList.size()]); } + private String getFileSuffixToString() { + String suffixToString = fileTypeComboBox.getSelectedItem().toString().toLowerCase(); + if (suffixToString.equalsIgnoreCase("excel")) { + suffixToString = "xls"; + } + return suffixToString; + } + private ActionListener getFileTypeListener(final JPanel setPanel, final int width, final int height) { ActionListener fileTypeListener = new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -458,7 +466,7 @@ public class FileTableDataPane extends AbstractTableDataPane { } else { setPanel.add(textSetPanel(width,height), BorderLayout.NORTH); } - String tipContent = Inter.getLocText("FR-Designer-Type_Parameter") + "reportlets/excel/FineReport${abc}." + getFileSuffix() + "
" + String tipContent = Inter.getLocText("FR-Designer-Type_Parameter") + "reportlets/excel/FineReport${abc}." + getFileSuffixToString() + "
" + "http://192.168.100.120:8080/XXServer/Report/excel${abc}.jsp
" + "  "; tips.setText(tipContent); } diff --git a/designer_base/src/com/fr/design/event/TemplateTreeDragSource.java b/designer_base/src/com/fr/design/event/TemplateTreeDragSource.java deleted file mode 100644 index 7b387305c..000000000 --- a/designer_base/src/com/fr/design/event/TemplateTreeDragSource.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.fr.design.event; - -import com.fr.design.gui.itree.filetree.TemplateFileTree; -import com.fr.design.mainframe.dnd.ArrayTransferable; -import com.fr.design.mainframe.dnd.SerializableTransferable; -import com.fr.general.web.ParameterConsts; -import com.fr.stable.StringUtils; - -import javax.swing.*; -import java.awt.*; -import java.awt.dnd.DragGestureEvent; -import java.awt.dnd.DragGestureListener; -import java.awt.dnd.DragSource; -import java.awt.dnd.DragSourceAdapter; - -/** - * Created with IntelliJ IDEA. - * User: richie - * Date: 13-11-4 - * Time: 下午2:17 - */ -public class TemplateTreeDragSource extends DragSourceAdapter implements DragGestureListener { - private DragSource source; - - public TemplateTreeDragSource(JTree tree, int actions) { - source = new DragSource(); - source.createDefaultDragGestureRecognizer(tree, actions, this); - - } - public void dragGestureRecognized(DragGestureEvent dge) { - Component comp = dge.getComponent(); - if (comp instanceof TemplateFileTree) { - String selectedPath = ((TemplateFileTree)comp).getSelectedTemplatePath(); - source.startDrag(dge, DragSource.DefaultLinkDrop, new SerializableTransferable(selectedPath), this); - } - } -} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/extra/LoginWebBridge.java b/designer_base/src/com/fr/design/extra/LoginWebBridge.java index b604ae8d8..41ed99beb 100644 --- a/designer_base/src/com/fr/design/extra/LoginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/LoginWebBridge.java @@ -68,11 +68,11 @@ public class LoginWebBridge { public static com.fr.design.extra.LoginWebBridge getHelper() { if (helper != null) { - return helper; + return helper; } synchronized (com.fr.design.extra.LoginWebBridge.class) { if (helper == null) { - helper = new com.fr.design.extra.LoginWebBridge(); + helper = new com.fr.design.extra.LoginWebBridge(); } return helper; } @@ -118,14 +118,13 @@ public class LoginWebBridge { if(!StringUtils.isEmpty(this.userName)){ updateMessageCount(); } - DesignerEnvManager.getEnvManager().setBBSName(userName); this.userName = userName; } /** * 定时取后台论坛消息 */ - private void updateMessageCount(){ + public void updateMessageCount(){ //启动获取消息更新的线程 //登陆状态, 根据存起来的用户名密码, 每1分钟发起一次请求, 更新消息条数. Thread updateMessageThread = new Thread(new Runnable() { @@ -171,7 +170,7 @@ public class LoginWebBridge { } this.messageCount = count; StringBuilder sb = new StringBuilder(); - sb.append(StringUtils.BLANK).append(this.userName) + sb.append(StringUtils.BLANK).append(DesignerEnvManager.getEnvManager().getBBSName()) .append("(").append(this.messageCount) .append(")").append(StringUtils.BLANK); DesignerEnvManager.getEnvManager().setInShowBBsName(sb.toString()); @@ -244,7 +243,7 @@ public class LoginWebBridge { * @param uiLabel 两边的label显示 * @return 登录信息标志 */ - private String login(String username, String password, UILabel uiLabel) { + public String login(String username, String password, UILabel uiLabel) { if (!StringUtils.isNotBlank(username) && !StringUtils.isNotBlank(password)) { return LOGIN_INFO_EMPTY; } @@ -253,7 +252,7 @@ public class LoginWebBridge { } String loginResult = login(username, password); if (loginResult.equals(LOGININ)) { - updateUserInfo(username, password); + updateUserInfo(username); loginSuccess(username, uiLabel); setUserName(username, uiLabel); } @@ -275,10 +274,7 @@ public class LoginWebBridge { * @param username 用户名 * @param password 密码 */ - public void updateUserInfo(String username,String password) { - DesignerEnvManager.getEnvManager().setBBSName(username); - DesignerEnvManager.getEnvManager().setBBSPassword(password); - DesignerEnvManager.getEnvManager().setInShowBBsName(username); + public void updateUserInfo(String username) { this.userName = username; } @@ -309,7 +305,7 @@ public class LoginWebBridge { }); } - public String login(String username, String password) { + private String login(String username, String password) { try { Client uc = new Client(); String result = uc.uc_user_login(username, password); @@ -319,6 +315,9 @@ public class LoginWebBridge { int $uid = Integer.parseInt(list.get(0)); if ($uid > 0) { DesignerEnvManager.getEnvManager().setBbsUid($uid); + DesignerEnvManager.getEnvManager().setBBSName(username); + DesignerEnvManager.getEnvManager().setInShowBBsName(username); + DesignerEnvManager.getEnvManager().setBBSPassword(password); return LOGININ;//登录成功,0 } else if ($uid == -1) { return USERNAME_NOT_EXSIT;//用户名不存在,-1 @@ -335,4 +334,4 @@ public class LoginWebBridge { } return UNKNOWN_ERROR; } -} +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/extra/PluginHelper.java b/designer_base/src/com/fr/design/extra/PluginHelper.java index ed35251db..4a4870ba2 100644 --- a/designer_base/src/com/fr/design/extra/PluginHelper.java +++ b/designer_base/src/com/fr/design/extra/PluginHelper.java @@ -154,7 +154,6 @@ public class PluginHelper { installDependenceOnline(currentID, needInstallDependence); } - /** * 构造一个下载UI * diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer_base/src/com/fr/design/extra/PluginWebBridge.java index 12c3e85c4..15bd72c09 100644 --- a/designer_base/src/com/fr/design/extra/PluginWebBridge.java +++ b/designer_base/src/com/fr/design/extra/PluginWebBridge.java @@ -529,6 +529,17 @@ public class PluginWebBridge { return LoginWebBridge.getHelper().pluginManageLogin(username, password, uiLabel); } + /** + * 插件管理部分的登陆的回调处理 + * @param username + * @param password + * @param callback + */ + public void defaultLogin(String username, String password, final JSObject callback) { + Task task = new PluginTask<>(webEngine, callback, new PluginLoginExecutor(username, password, uiLabel)); + new Thread(task).start(); + } + /** * 弹出QQ授权页面 */ @@ -545,4 +556,4 @@ public class PluginWebBridge { DesignerEnvManager.getEnvManager().setInShowBBsName(StringUtils.EMPTY); uiLabel.setText(Inter.getLocText("FR-Base_UnSignIn")); } -} +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/extra/exe/PluginLoginExecutor.java b/designer_base/src/com/fr/design/extra/exe/PluginLoginExecutor.java new file mode 100644 index 000000000..c1101f800 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/exe/PluginLoginExecutor.java @@ -0,0 +1,49 @@ +package com.fr.design.extra.exe; + +import com.fr.design.extra.LoginWebBridge; +import com.fr.design.extra.Process; +import com.fr.design.gui.ilable.UILabel; + +/** + * Created by Slpire on 2016/11/7. + */ +public class PluginLoginExecutor implements Executor { + + private String result = "[]"; + + private String username; + private String password; + private UILabel uiLabel; + + public PluginLoginExecutor(String username, String password, UILabel uiLabel) { + this.username = username; + this.password = password; + this.uiLabel = uiLabel; + } + + @Override + public String getTaskFinishMessage() { + return result; + } + + @Override + public Command[] getCommands() { + return new Command[] { + new Command() { + @Override + public String getExecuteMessage() { + return null; + } + + @Override + public void run(Process process) { + String loginResult = LoginWebBridge.getHelper().login(username, password, uiLabel); + if (Integer.valueOf(loginResult) == 0) { + LoginWebBridge.getHelper().updateMessageCount(); + } + result = loginResult; + } + } + }; + } +} diff --git a/designer_base/src/com/fr/design/file/HistoryTemplateListPane.java b/designer_base/src/com/fr/design/file/HistoryTemplateListPane.java index 26aa72f14..c61a39c43 100644 --- a/designer_base/src/com/fr/design/file/HistoryTemplateListPane.java +++ b/designer_base/src/com/fr/design/file/HistoryTemplateListPane.java @@ -11,6 +11,7 @@ import javax.swing.*; import com.fr.design.constants.UIConstants; import com.fr.design.DesignerEnvManager; +import com.fr.design.data.DesignTableDataManager; import com.fr.design.gui.ilable.UILabel; import javax.swing.event.ListSelectionEvent; @@ -24,9 +25,11 @@ import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilist.UIList; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; +import com.fr.design.module.DesignModuleFactory; import com.fr.file.filetree.FileNode; import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; +import com.fr.general.GeneralContext; import com.fr.general.Inter; import com.fr.stable.Constants; import com.fr.stable.project.ProjectConstants; @@ -102,6 +105,9 @@ public class HistoryTemplateListPane extends JPanel implements FileOperations { * @param selected 选择的 */ public void closeSelectedReport(JTemplate selected) { + DesignModuleFactory.clearChartPropertyPane(); + DesignTableDataManager.closeTemplate(selected); + GeneralContext.removeEnvWillChangedListener(selected.getFullPathName()); if (contains(selected) == -1) { return; } diff --git a/designer_base/src/com/fr/design/file/MutilTempalteTabPane.java b/designer_base/src/com/fr/design/file/MutilTempalteTabPane.java index 15c0f0bfb..794c6a5e4 100644 --- a/designer_base/src/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer_base/src/com/fr/design/file/MutilTempalteTabPane.java @@ -1 +1 @@ -package com.fr.design.file; import java.awt.AWTEvent; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.event.AWTEventListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.Arc2D; import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import java.io.File; import java.util.logging.Level; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.ButtonModel; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.plaf.basic.BasicMenuItemUI; import com.fr.base.BaseUtils; import com.fr.base.GraphHelper; import com.fr.design.constants.UIConstants; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIScrollPopUpMenu; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.stable.Constants; import com.fr.stable.ProductConstants; import com.fr.stable.project.ProjectConstants; /** * Author : daisy * Date: 13-8-5 * Time: 下午6:12 */ public class MutilTempalteTabPane extends JComponent implements MouseListener, MouseMotionListener, Action { private static Icon LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_normal.png"); private static Icon MOUSE_OVER_LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_pressed.png"); private static Icon MOUSE_PRESS_LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_pressed.png"); private static Icon CLOSE = BaseUtils.readIcon("/com/fr/design/images/buttonicon/close_icon.png"); private static Icon MOUSE_OVER_CLOSE = BaseUtils.readIcon("/com/fr/design/images/buttonicon/mouseoverclose icon.png"); private static Icon MOUSE_PRESS_CLOSE = BaseUtils.readIcon("/com/fr/design/images/buttonicon/pressclose icon.png"); private static final String ELLIPSIS = "..."; private static final int GAP_BEFORE_CLOSE = 10; private static final int GAP = 5; private static final int SMALLGAP = 3; private static final int LIST_BUTTON_WIDTH = 34; private static final int HEIGHT = 26; private static final int LIST_DOWN_HEIGHT = 25; private static final double FOR_CAL_BYTES = 0.5; private static final double CORNOR_RADIUS = 0.0; //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 private static final double SPECIAL_LOCATION_1 = 2.5; private static final double SPECIAL_LOCATION_2 = 4.330127; private static final int ICON_WIDTH = 22; //每个标签页的最大的长度和最小长度。这些长度均为均分 private static final int MAXWIDTH = 240; private static final int MINWIDTH = 100; private static MutilTempalteTabPane THIS; //用于存放工作簿 private java.util.List> openedTemplate; //选中的Tab项 private int selectedIndex = 0; // private int mouseOveredIndex = -1; //tab栏可以放下的每个tab的实际宽度 private int realWidth = MAXWIDTH; //当前标签页栏存放的所有标签页的index private int minPaintIndex = 0; private int maxPaintIndex = 0; /** * 鼠标按下时的坐标数组、鼠标放开时的坐标数组 */ private int[] xyPressedCoordinate = {0, 0}; //每个关闭图标的起始位置 private int[] startX; private boolean[] isNeedToolTips; private Graphics2D g2d; //记录关闭按钮的状态 private int closeIconIndex = -1; private boolean isCloseCurrent = false; private Icon clodeMode = CLOSE; private Icon listDownMode = LIST_DOWN; private boolean isShowList = false; //自动新建的模板B若没有进行任何编辑,切换到其他 // // 模板时,模板B会自动关闭 private JTemplate temTemplate = null; private AWTEventListener awt = new AWTEventListener() { public void eventDispatched(AWTEvent event) { if (event instanceof MouseEvent) { MouseEvent mv = (MouseEvent) event; if (mv.getClickCount() > 0 && !ComparatorUtils.equals(mv.getSource(), MutilTempalteTabPane.this)) { isShowList = false; } } } }; public static final MutilTempalteTabPane getInstance() { if (THIS == null) { THIS = new MutilTempalteTabPane(); } return THIS; } public JTemplate getSelectedFile() { return openedTemplate.get(selectedIndex); } /** * 关闭掉当前已打开文件列表中指定的文件 * * @param file 指定的文件 * */ public void closeFileTemplate(FILE file){ for (JTemplate temp : openedTemplate) { if(ComparatorUtils.equals(file, temp.getEditingFILE())){ closeSpecifiedTemplate(temp); break; } } } public Dimension getPreferredSize() { Dimension dimension = super.getPreferredSize(); dimension.height = HEIGHT; return dimension; } /** * 多工作簿面板 */ public MutilTempalteTabPane() { this.setLayout(new BorderLayout(0, 0)); this.addMouseListener(this); this.addMouseMotionListener(this); this.setBorder(null); this.setForeground(new Color(99, 99, 99)); this.setFont(new Font(Inter.getLocText("FR-Designer_Song_TypeFace"), 0, 12)); openedTemplate = HistoryTemplateListPane.getInstance().getHistoryList(); selectedIndex = openedTemplate.size() - 1; Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); } private UIMenuItem initCloseOther() { UIMenuItem closeOther = new UIMenuItem(Inter.getLocText("FR-Designer_FS_Close_Other_Templates")); setListDownItemPreferredSize(closeOther); closeOther.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (openedTemplate.size() == 1) { return; } SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); //点击关闭其他模板,并且点击确定保存 if (saveSomeTempaltePane.showSavePane()) { for (int i = 0; i < openedTemplate.size(); i++) { if (i != selectedIndex) { //判断关闭的模板是不是格式刷的被参照的模板 closeFormat(openedTemplate.get(i)); HistoryTemplateListPane.getInstance().closeSelectedReport(openedTemplate.get(i)); } } JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); HistoryTemplateListPane.getInstance().removeAllHistory(); DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); THIS.repaint(); } //如果取消保存了,则不关闭其他模板 } }); if (openedTemplate.size() == 1) { closeOther.setEnabled(false); } return closeOther; } private UIMenuItem[] createListDownTemplate() { UIMenuItem[] templates = new UIMenuItem[openedTemplate.size()]; for (int i = 0; i < openedTemplate.size(); i++) { final int index = i; final JTemplate tem = openedTemplate.get(i); templates[i] = new UIMenuItem(tempalteShowName(tem), tem.getIcon()); templates[i].setUI(new UIListDownItemUI()); setListDownItemPreferredSize(templates[i]); if (i == selectedIndex) { //画选中的高亮 templates[i].setBackground(UIConstants.SHADOW_CENTER); } templates[i].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { selectedIndex = index; DesignerContext.getDesignerFrame().addAndActivateJTemplate(tem); } }); } return templates; } private void setListDownItemPreferredSize(UIMenuItem item) { Dimension dimension = item.getPreferredSize(); dimension.height = LIST_DOWN_HEIGHT; item.setPreferredSize(dimension); } private String tempalteShowName(JTemplate template) { String name = template.getEditingFILE().getName(); if (!template.isSaved() && !name.endsWith(" *")) { name += " *"; } return name; } /** * 刷新打开模板 * @param history 模板 */ public void refreshOpenedTemplate(java.util.List> history) { openedTemplate = history; } public void setTemTemplate(JTemplate auotCreate) { temTemplate = auotCreate; } private void showListDown() { UIScrollPopUpMenu menu = new UIScrollPopUpMenu(); menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0)); menu.add(initCloseOther()); JSeparator separator = new JSeparator() { public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.height = 1; return d; } }; menu.add(new JPanel() { public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.height = 1; return d; } }); separator.setForeground(UIConstants.LINE_COLOR); menu.add(separator); menu.add(new JPanel() { public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.height = 1; return d; } }); UIMenuItem[] items = createListDownTemplate(); for (int i = 0; i < items.length; i++) { menu.add(items[i]); } GUICoreUtils.showPopupMenu(menu, MutilTempalteTabPane.getInstance(), MutilTempalteTabPane.getInstance().getWidth() - menu.getPreferredSize().width, getY() - 1 + getHeight()); } public void setSelectedIndex(int index) { selectedIndex = index; } public void paintComponent(Graphics g) { super.paintComponent(g); double maxWidth = getWidth() - LIST_BUTTON_WIDTH; //最大宽度 g2d = (Graphics2D) g; paintBackgroundAndLine(g2d, maxWidth); } private void paintBackgroundAndLine(Graphics2D g2d, double maxWidth) { paintDefaultBackground(g2d); //最多能画的个数 int maxTemplateNum = (int) (maxWidth) / MINWIDTH; //计算开始画的最小模板index和最大模板index calMinAndMaxIndex(maxTemplateNum); calculateRealAverageWidth(maxWidth, maxTemplateNum); int maxStringlength = calculateStringMaxLength(); if (selectedIndex >= openedTemplate.size()) { selectedIndex = openedTemplate.size() - 1; } if (selectedIndex < 0) { selectedIndex = 0; } double templateStartX = 0; startX = new int[maxPaintIndex - minPaintIndex + 1]; isNeedToolTips = new boolean[maxPaintIndex - minPaintIndex + 1]; //从可以开始展示在tab面板上的tab开始画 for (int i = minPaintIndex; i <= maxPaintIndex; i++) { JTemplate template = openedTemplate.get(i); Icon icon = template.getIcon(); String name = tempalteShowName(template); //如果tab名字的长度大于最大能显示的英文字符长度,则进行省略号处理 if (getStringWidth(name) > maxStringlength) { name = getEllipsisName(name, maxStringlength); isNeedToolTips[i - minPaintIndex] = true; } else { isNeedToolTips[i - minPaintIndex] = false; } Icon selectedIcon = null; if (i == closeIconIndex) { selectedIcon = clodeMode; } else { selectedIcon = CLOSE; } if (i == selectedIndex) { startX[i - minPaintIndex] = paintSelectedTab(g2d, icon, templateStartX, name, selectedIcon); } else { boolean isLeft = i < selectedIndex; startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, isLeft, mouseOveredIndex, i); } templateStartX += realWidth; } paintListDown(g2d, maxWidth); paintUnderLine(templateStartX, maxWidth, g2d); } private void paintUnderLine(double templateStartX, double maxWidth, Graphics2D g2d) { //画下面的那条线 if (templateStartX < maxWidth) { GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, 2); generalPath.moveTo((float) templateStartX, getHeight() - 1); generalPath.lineTo((float) maxWidth, getHeight() - 1); g2d.fill(generalPath); g2d.setPaint(UIConstants.LINE_COLOR); g2d.draw(new Line2D.Double((float) templateStartX, getHeight() - 1, (float) maxWidth + LIST_BUTTON_WIDTH, getHeight() - 1)); } } private void paintDefaultBackground(Graphics2D g2d) { //画默认背景 g2d.setPaint(new GradientPaint(1, 1, UIConstants.SHADOW_GREY, 1, getHeight() - 1, UIConstants.SHADOW_GREY)); g2d.fillRect(getX(), getY(), getWidth(), getHeight()); } private void paintListDown(Graphics2D g2d, double maxWidth) { int x = (int) maxWidth + (LIST_BUTTON_WIDTH - listDownMode.getIconWidth()) / 2; int y = (getHeight() - listDownMode.getIconHeight()) / 2; listDownMode.paintIcon(this, g2d, x, y); } /** * 判断tab文字的长度大于能装下的最大文字长度,要用省略号 * * @param name * @param maxStringlength * @return */ private String getEllipsisName(String name, int maxStringlength) { //若是名字长度大于能显示的长度,那能显示的文字的最大长度还要减去省略号的最大长度 // int maxellipsislength = maxStringlength - ELLIPSIS.length(); int ellipsisWidth = getStringWidth(ELLIPSIS); int leftkeyPoint = 0; int rightKeyPoint = name.length() - 1; int leftStrWidth = 0; int rightStrWidth = 0; while (leftStrWidth + rightStrWidth + ellipsisWidth < maxStringlength) { if (leftStrWidth <= rightStrWidth) { leftkeyPoint++; } else { rightKeyPoint--; } leftStrWidth = getStringWidth(name.substring(0, leftkeyPoint)); rightStrWidth = getStringWidth(name.substring(rightKeyPoint)); if (leftStrWidth + rightStrWidth + ellipsisWidth > maxStringlength) { if (leftStrWidth <= rightStrWidth) { rightKeyPoint++; } break; } } return name.substring(0, leftkeyPoint) + ELLIPSIS + name.substring(rightKeyPoint); } private void calMinAndMaxIndex(int maxTemplateNum) { //如果个数大于最多能容纳的个数,则多余的进行处理 if (openedTemplate.size() > maxTemplateNum) { //所点击列表中的标签页处在标签页栏最后一个标签页之后,则标签页栏左移至所点击标签页出现 if (selectedIndex >= maxPaintIndex) { minPaintIndex = selectedIndex - maxTemplateNum + 1; maxPaintIndex = selectedIndex; if (minPaintIndex <= 0) { minPaintIndex = 0; maxPaintIndex = maxTemplateNum - 1; } } else if (selectedIndex <= minPaintIndex) { //所点击列表中的标签页处在标签页栏第一个标签页之前,则标签页栏右移至所点击标签页出现 minPaintIndex = selectedIndex; maxPaintIndex = minPaintIndex + maxTemplateNum - 1; if (maxPaintIndex > openedTemplate.size() - 1) { maxPaintIndex = openedTemplate.size() - 1; } } else { if (selectedIndex >= openedTemplate.size() - 1) { selectedIndex = openedTemplate.size() - 1; maxPaintIndex = selectedIndex; minPaintIndex = selectedIndex - maxTemplateNum + 1; } else { maxPaintIndex = minPaintIndex + maxTemplateNum - 1; if (maxPaintIndex > openedTemplate.size() - 1) { maxPaintIndex = openedTemplate.size() - 1; } } } } else { minPaintIndex = 0; maxPaintIndex = openedTemplate.size() - 1; } } //个数小于最多能容纳的个数的情况下,看看宽度每个要画多少 private void calculateRealAverageWidth(double maxwidth, int templateNum) { int num = openedTemplate.size() > templateNum ? templateNum : openedTemplate.size(); realWidth = (int) (maxwidth / (num)); if (realWidth > MAXWIDTH) { realWidth = MAXWIDTH; } else if (realWidth < MINWIDTH) { //平均下来每个的宽度小于最小宽度 realWidth = MINWIDTH; } } /** * 计算过长度之后的每个tab的能接受的文字的英文字符数 * * @return */ private int calculateStringMaxLength() { return realWidth - 3 * GAP - ICON_WIDTH - SMALLGAP - CLOSE.getIconWidth(); } private int getStringWidth(String str) { return GraphHelper.getFontMetrics(this.getFont()).stringWidth(str); } /** * 画选中的tab * * @param g2d * @param sheeticon * @param templateStartX * @param sheetName * @param closeIcon * @return */ private int paintSelectedTab(Graphics2D g2d, Icon sheeticon, double templateStartX, String sheetName, Icon closeIcon) { double[] x = {templateStartX, templateStartX, templateStartX + realWidth, templateStartX + realWidth, templateStartX}; double[] y = {-1, getHeight(), getHeight(), -1, -1}; RoundRectangle2D.Double rect1 = new RoundRectangle2D.Double(templateStartX, 1, this.getWidth(), this.getHeight(), 7, 7); g2d.setPaint(new GradientPaint(1, 1, UIConstants.NORMAL_BACKGROUND, 1, getHeight() - 1, UIConstants.NORMAL_BACKGROUND)); //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 double specialLocation1 = 2.5; double specialLocation2 = 4.330127; GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); generalPath.moveTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); generalPath.curveTo(((float) x[0] + CORNOR_RADIUS - specialLocation1), (y[0] + CORNOR_RADIUS - specialLocation2), ((float) x[0] + CORNOR_RADIUS - specialLocation2), (y[0] + CORNOR_RADIUS - specialLocation1), x[0], y[0] + CORNOR_RADIUS); for (int index = 1; index <= 2; index++) { generalPath.lineTo((float) x[index], (float) y[index]); } generalPath.lineTo((float) x[3], (float) y[3] + CORNOR_RADIUS); generalPath.curveTo(((float) x[3] - CORNOR_RADIUS + specialLocation1), ((float) y[3] + CORNOR_RADIUS - specialLocation2), ((float) x[3] - CORNOR_RADIUS + specialLocation2), ((float) y[3] + CORNOR_RADIUS - specialLocation1), (float) x[3] - CORNOR_RADIUS, (float) y[3]); generalPath.lineTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); generalPath.closePath(); g2d.fill(generalPath); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setPaint(UIConstants.LINE_COLOR); g2d.draw(new Arc2D.Double(x[0], y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); g2d.draw(new Line2D.Double(x[0], y[0] + CORNOR_RADIUS, x[1], y[1])); g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3] + CORNOR_RADIUS)); g2d.draw(new Arc2D.Double(x[3] - CORNOR_RADIUS * 2, y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); int sheetIconY = (getHeight() - sheeticon.getIconHeight()) / 2; sheeticon.paintIcon(this, g2d, (int) templateStartX + GAP, sheetIconY); // 画字符 g2d.setPaint(getForeground()); g2d.drawString(sheetName, (int) templateStartX + sheeticon.getIconWidth() + 2 * GAP, getHeight() - GAP * 2); int closePosition = (int) templateStartX + realWidth - CLOSE.getIconWidth() - SMALLGAP; int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; closeIcon.paintIcon(this, g2d, closePosition, closeY); return closePosition; } /** * 画没有选中的tab * * @param g2d * @param sheeticon * @param templateStartX * @param sheetName * @param closeIcon * @param isLeft * @return */ private int paintUnSelectedTab(Graphics2D g2d, Icon sheeticon, double templateStartX, String sheetName, Icon closeIcon, boolean isLeft, int mouseOveredIndex, int selfIndex) { double[] x = {templateStartX, templateStartX, templateStartX + realWidth, templateStartX + realWidth, templateStartX}; double[] y = {-1, getHeight() - 1, getHeight() - 1, -1, -1}; if (selfIndex == mouseOveredIndex) { g2d.setPaint(new GradientPaint(1, 1, UIConstants.HOVER_BLUE, 1, getHeight() - 1, UIConstants.HOVER_BLUE)); } else { g2d.setPaint(new GradientPaint(1, 1, UIConstants.SHADOW_GREY, 1, getHeight() - 1, UIConstants.SHADOW_GREY)); } GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); unSelectedClosedPath(generalPath, isLeft, x, y); g2d.fill(generalPath); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setPaint(UIConstants.LINE_COLOR); if (isLeft) { g2d.draw(new Arc2D.Double(x[0], y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); } else { g2d.draw(new Arc2D.Double(x[0] - CORNOR_RADIUS * 2, y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); } g2d.draw(new Line2D.Double(x[0], y[0] + CORNOR_RADIUS, x[1], y[1] + 1)); g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3] + CORNOR_RADIUS)); if (isLeft) { g2d.draw(new Arc2D.Double(x[3], y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); } else { g2d.draw(new Arc2D.Double(x[3] - CORNOR_RADIUS * 2, y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); } g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); int sheetIconY = (getHeight() - sheeticon.getIconHeight()) / 2; sheeticon.paintIcon(this, g2d, (int) templateStartX + GAP, sheetIconY); // 画字符 g2d.setPaint(getForeground()); g2d.drawString(sheetName, (int) templateStartX + sheeticon.getIconWidth() + 2 * GAP, getHeight() - GAP * 2); int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; int closePosition = (int) templateStartX + realWidth - CLOSE.getIconWidth() - SMALLGAP; closeIcon.paintIcon(this, g2d, closePosition, closeY); return closePosition; } private void unSelectedClosedPath(GeneralPath generalPath, boolean isLeft, double[] x, double[] y) { if (isLeft) { generalPath.moveTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); generalPath.curveTo(((float) x[0] + CORNOR_RADIUS - SPECIAL_LOCATION_1), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[0] + CORNOR_RADIUS - SPECIAL_LOCATION_2), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_1), x[0], y[0] + CORNOR_RADIUS); } else { generalPath.moveTo((float) x[0] - CORNOR_RADIUS, (float) y[0]); generalPath.curveTo(((float) x[0] - CORNOR_RADIUS + SPECIAL_LOCATION_1), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[0] - CORNOR_RADIUS + SPECIAL_LOCATION_2), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_1), x[0], y[0] + CORNOR_RADIUS); } for (int index = 1; index <= 2; index++) { generalPath.lineTo((float) x[index], (float) y[index]); } generalPath.lineTo((float) x[3], (float) y[3] + CORNOR_RADIUS); if (isLeft) { generalPath.curveTo(((float) x[3] + CORNOR_RADIUS - SPECIAL_LOCATION_1), ((float) y[3] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[3] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) y[3] - CORNOR_RADIUS + SPECIAL_LOCATION_1), (float) x[3] + CORNOR_RADIUS, (float) y[3]); generalPath.lineTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); } else { generalPath.curveTo(((float) x[3] - CORNOR_RADIUS + SPECIAL_LOCATION_1), ((float) y[3] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[3] - CORNOR_RADIUS + SPECIAL_LOCATION_2), ((float) y[3] + CORNOR_RADIUS - SPECIAL_LOCATION_1), (float) x[3] - CORNOR_RADIUS, (float) y[3]); generalPath.lineTo((float) x[0] - CORNOR_RADIUS, (float) y[0]); } generalPath.closePath(); } /** * 点击 * @param e 鼠标事件 */ public void mouseClicked(MouseEvent e) { } /** * 按下 * @param e 鼠标事件 */ public void mousePressed(MouseEvent e) { int evtX = e.getX(); int evtY = e.getY(); this.setPressedXY(evtX, evtY); //是否点击关闭按钮 如果点击了关闭按钮,则将点击的模板关闭,不需要切换,如果没有点击关闭按钮,则切换到点击的模板处 boolean isOverCloseIcon = isOverCloseIcon(evtX); if (isOverListDown(evtX)) { listDownMode = isOverListDown(evtX) ? MOUSE_PRESS_LIST_DOWN : LIST_DOWN; if (!isShowList) { showListDown(); } isShowList = !isShowList; } else if (isOverCloseIcon) { //关闭按钮的图标变化 closeIconIndex = getTemplateIndex(evtX); clodeMode = MOUSE_PRESS_CLOSE; //关闭close图标所在的模板{ closeFormat(openedTemplate.get(closeIconIndex)); closeSpecifiedTemplate(openedTemplate.get(closeIconIndex)); DesignerContext.getDesignerFrame().getContentFrame().repaint(); isShowList = false; } else { //没有点击关闭和ListDown按钮,则切换到点击的模板处 closeIconIndex = -1; clodeMode = CLOSE; int tempSelectedIndex = selectedIndex; if (selectedIndex != getTemplateIndex(evtX) && getTemplateIndex(evtX) != -1) { openedTemplate.get(selectedIndex).stopEditing(); selectedIndex = getTemplateIndex(evtX); //如果在权限编辑情况下,不允许切换到表单类型的工作簿 if(BaseUtils.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()){ DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex)); JOptionPane.showMessageDialog(this, Inter.getLocText("FR-Designer_Form-AuthorityEdited_Cannot_be_Supported") + "!", Inter.getLocText("FR-Designer_Alert"), JOptionPane.WARNING_MESSAGE); this.repaint(); return; } DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(getTemplateIndex(evtX))); } isShowList = false; } this.repaint(); } public void setIsCloseCurrent(boolean isCloseCurrent) { this.isCloseCurrent = isCloseCurrent; } /** * 关闭模板 * @param specifiedTemplate 模板 */ public void closeSpecifiedTemplate(JTemplate specifiedTemplate) { if (specifiedTemplate == null) { return; } //当前激活的模板 String filename = openedTemplate.get(selectedIndex).getEditingFILE().getPath(); if (filename.startsWith(ProjectConstants.REPORTLETS_NAME)) { filename = ((FileNodeFILE) openedTemplate.get(selectedIndex).getEditingFILE()).getEnvPath() + File.separator + filename; } filename = filename.replaceAll("/", "\\\\"); if (!specifiedTemplate.isALLSaved()) { specifiedTemplate.stopEditing(); int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Utils-Would_you_like_to_save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", ProductConstants.PRODUCT_NAME, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (returnVal == JOptionPane.YES_OPTION && specifiedTemplate.saveTemplate()) { specifiedTemplate.saveTemplate(); FRLogger.getLogger().log(Level.INFO, Inter.getLocText(new String[]{"Template", "already-saved"}, new String[]{specifiedTemplate.getEditingFILE().getName(), "."})); HistoryTemplateListPane.getInstance().closeSelectedReport(specifiedTemplate); activeTemplate(filename); } else if (returnVal == JOptionPane.NO_OPTION) { //不保存 HistoryTemplateListPane.getInstance().closeSelectedReport(specifiedTemplate); activeTemplate(filename); } //若是点击取消关闭,则什么都不做 } else { //若是已经保存过了,则关闭即可 HistoryTemplateListPane.getInstance().closeSelectedReport(specifiedTemplate); activeTemplate(filename); } } /** * 关闭模板 * @param closedTemplate 模板 */ public void closeFormat(JTemplate closedTemplate) { //表单不需要处理 if (!closedTemplate.isJWorkBook()) { return; } if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_NULL) { return; } //是被参照的模板被关闭,则重置格式刷 closedTemplate.doConditionCancelFormat(); } /** * 关闭掉一个模板之后该激活的Tab * * @param fileName */ private void activeTemplate(String fileName) { if (openedTemplate.isEmpty()) { //新建并激活模板 DesignerContext.getDesignerFrame().addAndActivateJTemplate(); selectedIndex = 0; //此时刚自动新建的模板在HistoryTemplateListPane的editingTemplate temTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); } else { //如果关闭的模板是当前选中的模板,则重新激活 if (closeIconIndex == selectedIndex) { if (closeIconIndex == maxPaintIndex) { selectedIndex -= 1; } } else if (isCloseCurrent) { //不是通过关闭按钮,而是通过文件关闭菜单关闭的当前模板的,也重新激活 if (selectedIndex > openedTemplate.size() - 1) { selectedIndex -= 1; if (selectedIndex < 0) { selectedIndex = 0; } isCloseCurrent = false; } } else { //如果关闭的模板不是当前选中的模板,则激活的模板不变 selectedIndex = HistoryTemplateListPane.getInstance().contains(fileName); } DesignerContext.getDesignerFrame().activateJTemplate(openedTemplate.get(selectedIndex)); } } /** * 鼠标释放 * @param e 鼠标事件 */ public void mouseReleased(MouseEvent e) { } /** * 鼠标进入 * @param e 鼠标事件 */ public void mouseEntered(MouseEvent e) { } private boolean isOverCloseIcon(int evtX) { boolean isOverCloseIcon = false; for (int i = 0; i < startX.length; i++) { if (evtX >= startX[i] && evtX <= startX[i] + CLOSE.getIconWidth()) { isOverCloseIcon = true; break; } } return isOverCloseIcon; } private boolean isOverListDown(int evtX) { int maxWidth = getWidth() - LIST_BUTTON_WIDTH; return evtX >= (maxWidth + SMALLGAP) && evtX <= (getWidth() - SMALLGAP); } private int getTemplateIndex(int evtX) { int textX = 0; for (int i = minPaintIndex; i <= maxPaintIndex; i++) { int textWidth = realWidth; if (evtX >= textX && evtX < textX + textWidth) { return i; } textX += textWidth; } return -1; } /** * 鼠标离开 * @param e 鼠标事件 */ public void mouseExited(MouseEvent e) { listDownMode = LIST_DOWN; closeIconIndex = -1; mouseOveredIndex = -1; this.repaint(); } /** * 鼠标拖拽 * @param e 鼠标事件 */ public void mouseDragged(MouseEvent e) { } /** * 鼠标移动 * @param e 鼠标事件 */ public void mouseMoved(MouseEvent e) { int evtX = e.getX(); mouseOveredIndex = getTemplateIndex(evtX); //看是否需要显示toolTip if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) { setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); } else { setToolTipText(null); } listDownMode = isOverListDown(evtX) ? MOUSE_OVER_LIST_DOWN : LIST_DOWN; boolean isOverCloseIcon = isOverCloseIcon(evtX); clodeMode = isOverCloseIcon ? MOUSE_OVER_CLOSE : CLOSE; closeIconIndex = isOverCloseIcon ? mouseOveredIndex : -1; this.repaint(); } private void setPressedXY(int x, int y) { this.xyPressedCoordinate[0] = x; this.xyPressedCoordinate[1] = y; } public Object getValue(String key) { return null; } /** * 加入值 * @param key 键 * @param value 值 */ public void putValue(String key, Object value) { } /** * 动作 * @param e 事件 */ public void actionPerformed(ActionEvent e) { } /** * 处理自动新建的模板 在切换时的处理 */ public void doWithtemTemplate() { //temtemplate保存的一定是手动新建的没有编辑或是编辑了没有保存的模板 //没有保存,说明有编辑;已经保存在磁盘里的文件,说明有过处理,并且已经保存,此时切换都不将其自动关闭 if (temTemplate == null || temTemplate == HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()) { return; } if (!temTemplate.isSaved() || !temTemplate.getEditingFILE().isMemFile()) { temTemplate = null; } //自动新建的模板B若没有进行任何编辑(新建模板没有进行任何编辑时saved都是true):还没有存盘 if (temTemplate != null && temTemplate.getEditingFILE().isMemFile() && temTemplate.isSaved()) { HistoryTemplateListPane.getInstance().closeSelectedReport(temTemplate); temTemplate = null; setSelectedIndex(HistoryTemplateListPane.getInstance().contains(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate())); } } private class UIListDownItemUI extends BasicMenuItemUI { @Override protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { if (menuItem.getIcon() == null) { super.paintBackground(g, menuItem, bgColor); return; } ButtonModel model = menuItem.getModel(); Color oldColor = g.getColor(); int menuWidth = menuItem.getWidth(); int menuHeight = menuItem.getHeight(); g.setColor(UIConstants.NORMAL_BACKGROUND); g.fillRect(0, 0, menuWidth, menuHeight); boolean itemIsSelected = menuItem instanceof JMenu && model.isSelected(); if (menuItem.isOpaque()) { if (model.isArmed() || itemIsSelected) { GUIPaintUtils.fillPaint((Graphics2D) g, GAP, 0, menuWidth - GAP, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, UIConstants.ARC); } else { GUIPaintUtils.fillPaint((Graphics2D) g, GAP, 0, menuWidth - GAP, menuHeight, true, Constants.NULL, menuItem.getBackground(), UIConstants.ARC); } g.setColor(oldColor); } else if (model.isArmed() || itemIsSelected) { GUIPaintUtils.fillPaint((Graphics2D) g, GAP, 0, menuWidth - GAP, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, UIConstants.ARC); g.setColor(oldColor); } } } } \ No newline at end of file +package com.fr.design.file; import java.awt.AWTEvent; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.event.AWTEventListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.Arc2D; import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import java.io.File; import java.util.logging.Level; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.ButtonModel; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.plaf.basic.BasicMenuItemUI; import com.fr.base.BaseUtils; import com.fr.base.GraphHelper; import com.fr.design.constants.UIConstants; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIScrollPopUpMenu; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.stable.Constants; import com.fr.stable.ProductConstants; import com.fr.stable.project.ProjectConstants; /** * Author : daisy * Date: 13-8-5 * Time: 下午6:12 */ public class MutilTempalteTabPane extends JComponent implements MouseListener, MouseMotionListener, Action { private static Icon LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_normal.png"); private static Icon MOUSE_OVER_LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_pressed.png"); private static Icon MOUSE_PRESS_LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_pressed.png"); private static Icon CLOSE = BaseUtils.readIcon("/com/fr/design/images/buttonicon/close_icon.png"); private static Icon MOUSE_OVER_CLOSE = BaseUtils.readIcon("/com/fr/design/images/buttonicon/mouseoverclose icon.png"); private static Icon MOUSE_PRESS_CLOSE = BaseUtils.readIcon("/com/fr/design/images/buttonicon/pressclose icon.png"); private static final String ELLIPSIS = "..."; private static final int GAP_BEFORE_CLOSE = 10; private static final int GAP = 5; private static final int SMALLGAP = 3; private static final int LIST_BUTTON_WIDTH = 34; private static final int HEIGHT = 26; private static final int LIST_DOWN_HEIGHT = 25; private static final double FOR_CAL_BYTES = 0.5; private static final double CORNOR_RADIUS = 0.0; //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 private static final double SPECIAL_LOCATION_1 = 2.5; private static final double SPECIAL_LOCATION_2 = 4.330127; private static final int ICON_WIDTH = 22; //每个标签页的最大的长度和最小长度。这些长度均为均分 private static final int MAXWIDTH = 240; private static final int MINWIDTH = 100; private static MutilTempalteTabPane THIS; //用于存放工作簿 private java.util.List> openedTemplate; //选中的Tab项 private int selectedIndex = 0; // private int mouseOveredIndex = -1; //tab栏可以放下的每个tab的实际宽度 private int realWidth = MAXWIDTH; //当前标签页栏存放的所有标签页的index private int minPaintIndex = 0; private int maxPaintIndex = 0; /** * 鼠标按下时的坐标数组、鼠标放开时的坐标数组 */ private int[] xyPressedCoordinate = {0, 0}; //每个关闭图标的起始位置 private int[] startX; private boolean[] isNeedToolTips; private Graphics2D g2d; //记录关闭按钮的状态 private int closeIconIndex = -1; private boolean isCloseCurrent = false; private Icon clodeMode = CLOSE; private Icon listDownMode = LIST_DOWN; private boolean isShowList = false; //自动新建的模板B若没有进行任何编辑,切换到其他 // // 模板时,模板B会自动关闭 private JTemplate temTemplate = null; private AWTEventListener awt = new AWTEventListener() { public void eventDispatched(AWTEvent event) { if (event instanceof MouseEvent) { MouseEvent mv = (MouseEvent) event; if (mv.getClickCount() > 0 && !ComparatorUtils.equals(mv.getSource(), MutilTempalteTabPane.this)) { isShowList = false; } } } }; public static final MutilTempalteTabPane getInstance() { if (THIS == null) { THIS = new MutilTempalteTabPane(); } return THIS; } public JTemplate getSelectedFile() { return openedTemplate.get(selectedIndex); } /** * 关闭掉当前已打开文件列表中指定的文件 * * @param file 指定的文件 * */ public void closeFileTemplate(FILE file){ for (JTemplate temp : openedTemplate) { if(ComparatorUtils.equals(file, temp.getEditingFILE())){ closeSpecifiedTemplate(temp); break; } } } public Dimension getPreferredSize() { Dimension dimension = super.getPreferredSize(); dimension.height = HEIGHT; return dimension; } /** * 多工作簿面板 */ public MutilTempalteTabPane() { this.setLayout(new BorderLayout(0, 0)); this.addMouseListener(this); this.addMouseMotionListener(this); this.setBorder(null); this.setForeground(new Color(99, 99, 99)); this.setFont(new Font(Inter.getLocText("FR-Designer_Song_TypeFace"), 0, 12)); openedTemplate = HistoryTemplateListPane.getInstance().getHistoryList(); selectedIndex = openedTemplate.size() - 1; Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); } private UIMenuItem initCloseOther() { UIMenuItem closeOther = new UIMenuItem(Inter.getLocText("FR-Designer_FS_Close_Other_Templates")); setListDownItemPreferredSize(closeOther); closeOther.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (openedTemplate.size() == 1) { return; } SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(false); //点击关闭其他模板,并且点击确定保存 if (saveSomeTempaltePane.showSavePane()) { JTemplate[] panes = new JTemplate[openedTemplate.size()]; for(int i = 0; i < openedTemplate.size(); i++) { panes[i] = openedTemplate.get(i); } for (int i = 0; i < panes.length; i++) { if (i != selectedIndex) { //判断关闭的模板是不是格式刷的被参照的模板 openedTemplate.remove(panes[i]); closeFormat(panes[i]); HistoryTemplateListPane.getInstance().closeSelectedReport(panes[i]); } } JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); HistoryTemplateListPane.getInstance().removeAllHistory(); DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); THIS.repaint(); } //如果取消保存了,则不关闭其他模板 } }); if (openedTemplate.size() == 1) { closeOther.setEnabled(false); } return closeOther; } private UIMenuItem[] createListDownTemplate() { UIMenuItem[] templates = new UIMenuItem[openedTemplate.size()]; for (int i = 0; i < openedTemplate.size(); i++) { final int index = i; final JTemplate tem = openedTemplate.get(i); templates[i] = new UIMenuItem(tempalteShowName(tem), tem.getIcon()); templates[i].setUI(new UIListDownItemUI()); setListDownItemPreferredSize(templates[i]); if (i == selectedIndex) { //画选中的高亮 templates[i].setBackground(UIConstants.SHADOW_CENTER); } templates[i].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { selectedIndex = index; DesignerContext.getDesignerFrame().addAndActivateJTemplate(tem); } }); } return templates; } private void setListDownItemPreferredSize(UIMenuItem item) { Dimension dimension = item.getPreferredSize(); dimension.height = LIST_DOWN_HEIGHT; item.setPreferredSize(dimension); } private String tempalteShowName(JTemplate template) { String name = template.getEditingFILE().getName(); if (!template.isSaved() && !name.endsWith(" *")) { name += " *"; } return name; } /** * 刷新打开模板 * @param history 模板 */ public void refreshOpenedTemplate(java.util.List> history) { openedTemplate = history; } public void setTemTemplate(JTemplate auotCreate) { temTemplate = auotCreate; } private void showListDown() { UIScrollPopUpMenu menu = new UIScrollPopUpMenu(); menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0)); menu.add(initCloseOther()); JSeparator separator = new JSeparator() { public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.height = 1; return d; } }; menu.add(new JPanel() { public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.height = 1; return d; } }); separator.setForeground(UIConstants.LINE_COLOR); menu.add(separator); menu.add(new JPanel() { public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.height = 1; return d; } }); UIMenuItem[] items = createListDownTemplate(); for (int i = 0; i < items.length; i++) { menu.add(items[i]); } GUICoreUtils.showPopupMenu(menu, MutilTempalteTabPane.getInstance(), MutilTempalteTabPane.getInstance().getWidth() - menu.getPreferredSize().width, getY() - 1 + getHeight()); } public void setSelectedIndex(int index) { selectedIndex = index; } public void paintComponent(Graphics g) { super.paintComponent(g); double maxWidth = getWidth() - LIST_BUTTON_WIDTH; //最大宽度 g2d = (Graphics2D) g; paintBackgroundAndLine(g2d, maxWidth); } private void paintBackgroundAndLine(Graphics2D g2d, double maxWidth) { paintDefaultBackground(g2d); //最多能画的个数 int maxTemplateNum = (int) (maxWidth) / MINWIDTH; //计算开始画的最小模板index和最大模板index calMinAndMaxIndex(maxTemplateNum); calculateRealAverageWidth(maxWidth, maxTemplateNum); int maxStringlength = calculateStringMaxLength(); if (selectedIndex >= openedTemplate.size()) { selectedIndex = openedTemplate.size() - 1; } if (selectedIndex < 0) { selectedIndex = 0; } double templateStartX = 0; startX = new int[maxPaintIndex - minPaintIndex + 1]; isNeedToolTips = new boolean[maxPaintIndex - minPaintIndex + 1]; //从可以开始展示在tab面板上的tab开始画 for (int i = minPaintIndex; i <= maxPaintIndex; i++) { JTemplate template = openedTemplate.get(i); Icon icon = template.getIcon(); String name = tempalteShowName(template); //如果tab名字的长度大于最大能显示的英文字符长度,则进行省略号处理 if (getStringWidth(name) > maxStringlength) { name = getEllipsisName(name, maxStringlength); isNeedToolTips[i - minPaintIndex] = true; } else { isNeedToolTips[i - minPaintIndex] = false; } Icon selectedIcon = null; if (i == closeIconIndex) { selectedIcon = clodeMode; } else { selectedIcon = CLOSE; } if (i == selectedIndex) { startX[i - minPaintIndex] = paintSelectedTab(g2d, icon, templateStartX, name, selectedIcon); } else { boolean isLeft = i < selectedIndex; startX[i - minPaintIndex] = paintUnSelectedTab(g2d, icon, templateStartX, name, selectedIcon, isLeft, mouseOveredIndex, i); } templateStartX += realWidth; } paintListDown(g2d, maxWidth); paintUnderLine(templateStartX, maxWidth, g2d); } private void paintUnderLine(double templateStartX, double maxWidth, Graphics2D g2d) { //画下面的那条线 if (templateStartX < maxWidth) { GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, 2); generalPath.moveTo((float) templateStartX, getHeight() - 1); generalPath.lineTo((float) maxWidth, getHeight() - 1); g2d.fill(generalPath); g2d.setPaint(UIConstants.LINE_COLOR); g2d.draw(new Line2D.Double((float) templateStartX, getHeight() - 1, (float) maxWidth + LIST_BUTTON_WIDTH, getHeight() - 1)); } } private void paintDefaultBackground(Graphics2D g2d) { //画默认背景 g2d.setPaint(new GradientPaint(1, 1, UIConstants.SHADOW_GREY, 1, getHeight() - 1, UIConstants.SHADOW_GREY)); g2d.fillRect(getX(), getY(), getWidth(), getHeight()); } private void paintListDown(Graphics2D g2d, double maxWidth) { int x = (int) maxWidth + (LIST_BUTTON_WIDTH - listDownMode.getIconWidth()) / 2; int y = (getHeight() - listDownMode.getIconHeight()) / 2; listDownMode.paintIcon(this, g2d, x, y); } /** * 判断tab文字的长度大于能装下的最大文字长度,要用省略号 * * @param name * @param maxStringlength * @return */ private String getEllipsisName(String name, int maxStringlength) { //若是名字长度大于能显示的长度,那能显示的文字的最大长度还要减去省略号的最大长度 // int maxellipsislength = maxStringlength - ELLIPSIS.length(); int ellipsisWidth = getStringWidth(ELLIPSIS); int leftkeyPoint = 0; int rightKeyPoint = name.length() - 1; int leftStrWidth = 0; int rightStrWidth = 0; while (leftStrWidth + rightStrWidth + ellipsisWidth < maxStringlength) { if (leftStrWidth <= rightStrWidth) { leftkeyPoint++; } else { rightKeyPoint--; } leftStrWidth = getStringWidth(name.substring(0, leftkeyPoint)); rightStrWidth = getStringWidth(name.substring(rightKeyPoint)); if (leftStrWidth + rightStrWidth + ellipsisWidth > maxStringlength) { if (leftStrWidth <= rightStrWidth) { rightKeyPoint++; } break; } } return name.substring(0, leftkeyPoint) + ELLIPSIS + name.substring(rightKeyPoint); } private void calMinAndMaxIndex(int maxTemplateNum) { //如果个数大于最多能容纳的个数,则多余的进行处理 if (openedTemplate.size() > maxTemplateNum) { //所点击列表中的标签页处在标签页栏最后一个标签页之后,则标签页栏左移至所点击标签页出现 if (selectedIndex >= maxPaintIndex) { minPaintIndex = selectedIndex - maxTemplateNum + 1; maxPaintIndex = selectedIndex; if (minPaintIndex <= 0) { minPaintIndex = 0; maxPaintIndex = maxTemplateNum - 1; } } else if (selectedIndex <= minPaintIndex) { //所点击列表中的标签页处在标签页栏第一个标签页之前,则标签页栏右移至所点击标签页出现 minPaintIndex = selectedIndex; maxPaintIndex = minPaintIndex + maxTemplateNum - 1; if (maxPaintIndex > openedTemplate.size() - 1) { maxPaintIndex = openedTemplate.size() - 1; } } else { if (selectedIndex >= openedTemplate.size() - 1) { selectedIndex = openedTemplate.size() - 1; maxPaintIndex = selectedIndex; minPaintIndex = selectedIndex - maxTemplateNum + 1; } else { maxPaintIndex = minPaintIndex + maxTemplateNum - 1; if (maxPaintIndex > openedTemplate.size() - 1) { maxPaintIndex = openedTemplate.size() - 1; } } } } else { minPaintIndex = 0; maxPaintIndex = openedTemplate.size() - 1; } } //个数小于最多能容纳的个数的情况下,看看宽度每个要画多少 private void calculateRealAverageWidth(double maxwidth, int templateNum) { int num = openedTemplate.size() > templateNum ? templateNum : openedTemplate.size(); realWidth = (int) (maxwidth / (num)); if (realWidth > MAXWIDTH) { realWidth = MAXWIDTH; } else if (realWidth < MINWIDTH) { //平均下来每个的宽度小于最小宽度 realWidth = MINWIDTH; } } /** * 计算过长度之后的每个tab的能接受的文字的英文字符数 * * @return */ private int calculateStringMaxLength() { return realWidth - 3 * GAP - ICON_WIDTH - SMALLGAP - CLOSE.getIconWidth(); } private int getStringWidth(String str) { return GraphHelper.getFontMetrics(this.getFont()).stringWidth(str); } /** * 画选中的tab * * @param g2d * @param sheeticon * @param templateStartX * @param sheetName * @param closeIcon * @return */ private int paintSelectedTab(Graphics2D g2d, Icon sheeticon, double templateStartX, String sheetName, Icon closeIcon) { double[] x = {templateStartX, templateStartX, templateStartX + realWidth, templateStartX + realWidth, templateStartX}; double[] y = {-1, getHeight(), getHeight(), -1, -1}; RoundRectangle2D.Double rect1 = new RoundRectangle2D.Double(templateStartX, 1, this.getWidth(), this.getHeight(), 7, 7); g2d.setPaint(new GradientPaint(1, 1, UIConstants.NORMAL_BACKGROUND, 1, getHeight() - 1, UIConstants.NORMAL_BACKGROUND)); //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 double specialLocation1 = 2.5; double specialLocation2 = 4.330127; GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); generalPath.moveTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); generalPath.curveTo(((float) x[0] + CORNOR_RADIUS - specialLocation1), (y[0] + CORNOR_RADIUS - specialLocation2), ((float) x[0] + CORNOR_RADIUS - specialLocation2), (y[0] + CORNOR_RADIUS - specialLocation1), x[0], y[0] + CORNOR_RADIUS); for (int index = 1; index <= 2; index++) { generalPath.lineTo((float) x[index], (float) y[index]); } generalPath.lineTo((float) x[3], (float) y[3] + CORNOR_RADIUS); generalPath.curveTo(((float) x[3] - CORNOR_RADIUS + specialLocation1), ((float) y[3] + CORNOR_RADIUS - specialLocation2), ((float) x[3] - CORNOR_RADIUS + specialLocation2), ((float) y[3] + CORNOR_RADIUS - specialLocation1), (float) x[3] - CORNOR_RADIUS, (float) y[3]); generalPath.lineTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); generalPath.closePath(); g2d.fill(generalPath); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setPaint(UIConstants.LINE_COLOR); g2d.draw(new Arc2D.Double(x[0], y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); g2d.draw(new Line2D.Double(x[0], y[0] + CORNOR_RADIUS, x[1], y[1])); g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3] + CORNOR_RADIUS)); g2d.draw(new Arc2D.Double(x[3] - CORNOR_RADIUS * 2, y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); int sheetIconY = (getHeight() - sheeticon.getIconHeight()) / 2; sheeticon.paintIcon(this, g2d, (int) templateStartX + GAP, sheetIconY); // 画字符 g2d.setPaint(getForeground()); g2d.drawString(sheetName, (int) templateStartX + sheeticon.getIconWidth() + 2 * GAP, getHeight() - GAP * 2); int closePosition = (int) templateStartX + realWidth - CLOSE.getIconWidth() - SMALLGAP; int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; closeIcon.paintIcon(this, g2d, closePosition, closeY); return closePosition; } /** * 画没有选中的tab * * @param g2d * @param sheeticon * @param templateStartX * @param sheetName * @param closeIcon * @param isLeft * @return */ private int paintUnSelectedTab(Graphics2D g2d, Icon sheeticon, double templateStartX, String sheetName, Icon closeIcon, boolean isLeft, int mouseOveredIndex, int selfIndex) { double[] x = {templateStartX, templateStartX, templateStartX + realWidth, templateStartX + realWidth, templateStartX}; double[] y = {-1, getHeight() - 1, getHeight() - 1, -1, -1}; if (selfIndex == mouseOveredIndex) { g2d.setPaint(new GradientPaint(1, 1, UIConstants.HOVER_BLUE, 1, getHeight() - 1, UIConstants.HOVER_BLUE)); } else { g2d.setPaint(new GradientPaint(1, 1, UIConstants.SHADOW_GREY, 1, getHeight() - 1, UIConstants.SHADOW_GREY)); } GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, x.length); unSelectedClosedPath(generalPath, isLeft, x, y); g2d.fill(generalPath); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setPaint(UIConstants.LINE_COLOR); if (isLeft) { g2d.draw(new Arc2D.Double(x[0], y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); } else { g2d.draw(new Arc2D.Double(x[0] - CORNOR_RADIUS * 2, y[0], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); } g2d.draw(new Line2D.Double(x[0], y[0] + CORNOR_RADIUS, x[1], y[1] + 1)); g2d.draw(new Line2D.Double(x[1], y[1], x[2], y[2])); g2d.draw(new Line2D.Double(x[2], y[2], x[3], y[3] + CORNOR_RADIUS)); if (isLeft) { g2d.draw(new Arc2D.Double(x[3], y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, 90, 0)); } else { g2d.draw(new Arc2D.Double(x[3] - CORNOR_RADIUS * 2, y[3], CORNOR_RADIUS * 2, CORNOR_RADIUS * 2, 90, -90, 0)); } g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); int sheetIconY = (getHeight() - sheeticon.getIconHeight()) / 2; sheeticon.paintIcon(this, g2d, (int) templateStartX + GAP, sheetIconY); // 画字符 g2d.setPaint(getForeground()); g2d.drawString(sheetName, (int) templateStartX + sheeticon.getIconWidth() + 2 * GAP, getHeight() - GAP * 2); int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; int closePosition = (int) templateStartX + realWidth - CLOSE.getIconWidth() - SMALLGAP; closeIcon.paintIcon(this, g2d, closePosition, closeY); return closePosition; } private void unSelectedClosedPath(GeneralPath generalPath, boolean isLeft, double[] x, double[] y) { if (isLeft) { generalPath.moveTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); generalPath.curveTo(((float) x[0] + CORNOR_RADIUS - SPECIAL_LOCATION_1), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[0] + CORNOR_RADIUS - SPECIAL_LOCATION_2), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_1), x[0], y[0] + CORNOR_RADIUS); } else { generalPath.moveTo((float) x[0] - CORNOR_RADIUS, (float) y[0]); generalPath.curveTo(((float) x[0] - CORNOR_RADIUS + SPECIAL_LOCATION_1), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[0] - CORNOR_RADIUS + SPECIAL_LOCATION_2), (y[0] + CORNOR_RADIUS - SPECIAL_LOCATION_1), x[0], y[0] + CORNOR_RADIUS); } for (int index = 1; index <= 2; index++) { generalPath.lineTo((float) x[index], (float) y[index]); } generalPath.lineTo((float) x[3], (float) y[3] + CORNOR_RADIUS); if (isLeft) { generalPath.curveTo(((float) x[3] + CORNOR_RADIUS - SPECIAL_LOCATION_1), ((float) y[3] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[3] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) y[3] - CORNOR_RADIUS + SPECIAL_LOCATION_1), (float) x[3] + CORNOR_RADIUS, (float) y[3]); generalPath.lineTo((float) x[0] + CORNOR_RADIUS, (float) y[0]); } else { generalPath.curveTo(((float) x[3] - CORNOR_RADIUS + SPECIAL_LOCATION_1), ((float) y[3] + CORNOR_RADIUS - SPECIAL_LOCATION_2), ((float) x[3] - CORNOR_RADIUS + SPECIAL_LOCATION_2), ((float) y[3] + CORNOR_RADIUS - SPECIAL_LOCATION_1), (float) x[3] - CORNOR_RADIUS, (float) y[3]); generalPath.lineTo((float) x[0] - CORNOR_RADIUS, (float) y[0]); } generalPath.closePath(); } /** * 点击 * @param e 鼠标事件 */ public void mouseClicked(MouseEvent e) { } /** * 按下 * @param e 鼠标事件 */ public void mousePressed(MouseEvent e) { int evtX = e.getX(); int evtY = e.getY(); this.setPressedXY(evtX, evtY); //是否点击关闭按钮 如果点击了关闭按钮,则将点击的模板关闭,不需要切换,如果没有点击关闭按钮,则切换到点击的模板处 boolean isOverCloseIcon = isOverCloseIcon(evtX); if (isOverListDown(evtX)) { listDownMode = isOverListDown(evtX) ? MOUSE_PRESS_LIST_DOWN : LIST_DOWN; if (!isShowList) { showListDown(); } isShowList = !isShowList; } else if (isOverCloseIcon) { //关闭按钮的图标变化 closeIconIndex = getTemplateIndex(evtX); clodeMode = MOUSE_PRESS_CLOSE; //关闭close图标所在的模板{ closeFormat(openedTemplate.get(closeIconIndex)); closeSpecifiedTemplate(openedTemplate.get(closeIconIndex)); DesignerContext.getDesignerFrame().getContentFrame().repaint(); isShowList = false; } else { //没有点击关闭和ListDown按钮,则切换到点击的模板处 closeIconIndex = -1; clodeMode = CLOSE; int tempSelectedIndex = selectedIndex; if (selectedIndex != getTemplateIndex(evtX) && getTemplateIndex(evtX) != -1) { openedTemplate.get(selectedIndex).stopEditing(); selectedIndex = getTemplateIndex(evtX); //如果在权限编辑情况下,不允许切换到表单类型的工作簿 if(BaseUtils.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()){ DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex)); JOptionPane.showMessageDialog(this, Inter.getLocText("FR-Designer_Form-AuthorityEdited_Cannot_be_Supported") + "!", Inter.getLocText("FR-Designer_Alert"), JOptionPane.WARNING_MESSAGE); this.repaint(); return; } DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(getTemplateIndex(evtX))); } isShowList = false; } this.repaint(); } public void setIsCloseCurrent(boolean isCloseCurrent) { this.isCloseCurrent = isCloseCurrent; } /** * 关闭模板 * @param specifiedTemplate 模板 */ public void closeSpecifiedTemplate(JTemplate specifiedTemplate) { if (specifiedTemplate == null) { return; } //当前激活的模板 String filename = openedTemplate.get(selectedIndex).getEditingFILE().getPath(); if (filename.startsWith(ProjectConstants.REPORTLETS_NAME)) { filename = ((FileNodeFILE) openedTemplate.get(selectedIndex).getEditingFILE()).getEnvPath() + File.separator + filename; } filename = filename.replaceAll("/", "\\\\"); if (!specifiedTemplate.isALLSaved()) { specifiedTemplate.stopEditing(); int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Utils-Would_you_like_to_save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", ProductConstants.PRODUCT_NAME, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (returnVal == JOptionPane.YES_OPTION && specifiedTemplate.saveTemplate()) { specifiedTemplate.saveTemplate(); FRLogger.getLogger().log(Level.INFO, Inter.getLocText(new String[]{"Template", "already-saved"}, new String[]{specifiedTemplate.getEditingFILE().getName(), "."})); HistoryTemplateListPane.getInstance().closeSelectedReport(specifiedTemplate); activeTemplate(filename); } else if (returnVal == JOptionPane.NO_OPTION) { //不保存 HistoryTemplateListPane.getInstance().closeSelectedReport(specifiedTemplate); activeTemplate(filename); } //若是点击取消关闭,则什么都不做 } else { //若是已经保存过了,则关闭即可 HistoryTemplateListPane.getInstance().closeSelectedReport(specifiedTemplate); activeTemplate(filename); } } /** * 关闭模板 * @param closedTemplate 模板 */ public void closeFormat(JTemplate closedTemplate) { //表单不需要处理 if (!closedTemplate.isJWorkBook()) { return; } if (DesignerContext.getFormatState() == DesignerContext.FORMAT_STATE_NULL) { return; } //是被参照的模板被关闭,则重置格式刷 closedTemplate.doConditionCancelFormat(); } /** * 关闭掉一个模板之后该激活的Tab * * @param fileName */ private void activeTemplate(String fileName) { if (openedTemplate.isEmpty()) { //新建并激活模板 DesignerContext.getDesignerFrame().addAndActivateJTemplate(); selectedIndex = 0; //此时刚自动新建的模板在HistoryTemplateListPane的editingTemplate temTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); } else { //如果关闭的模板是当前选中的模板,则重新激活 if (closeIconIndex == selectedIndex) { if (closeIconIndex == maxPaintIndex) { selectedIndex --; } } else if (isCloseCurrent) { //不是通过关闭按钮,而是通过文件关闭菜单关闭的当前模板的,也重新激活 if (selectedIndex > openedTemplate.size() - 1) { selectedIndex -= 1; if (selectedIndex < 0) { selectedIndex = 0; } isCloseCurrent = false; } } else { //如果关闭的模板不是当前选中的模板,则激活的模板不变 selectedIndex = HistoryTemplateListPane.getInstance().contains(fileName); } DesignerContext.getDesignerFrame().activateJTemplate(openedTemplate.get(selectedIndex)); } } /** * 鼠标释放 * @param e 鼠标事件 */ public void mouseReleased(MouseEvent e) { } /** * 鼠标进入 * @param e 鼠标事件 */ public void mouseEntered(MouseEvent e) { } private boolean isOverCloseIcon(int evtX) { boolean isOverCloseIcon = false; for (int i = 0; i < startX.length; i++) { if (evtX >= startX[i] && evtX <= startX[i] + CLOSE.getIconWidth()) { isOverCloseIcon = true; break; } } return isOverCloseIcon; } private boolean isOverListDown(int evtX) { int maxWidth = getWidth() - LIST_BUTTON_WIDTH; return evtX >= (maxWidth + SMALLGAP) && evtX <= (getWidth() - SMALLGAP); } private int getTemplateIndex(int evtX) { int textX = 0; for (int i = minPaintIndex; i <= maxPaintIndex; i++) { int textWidth = realWidth; if (evtX >= textX && evtX < textX + textWidth) { return i; } textX += textWidth; } return -1; } /** * 鼠标离开 * @param e 鼠标事件 */ public void mouseExited(MouseEvent e) { listDownMode = LIST_DOWN; closeIconIndex = -1; mouseOveredIndex = -1; this.repaint(); } /** * 鼠标拖拽 * @param e 鼠标事件 */ public void mouseDragged(MouseEvent e) { } /** * 鼠标移动 * @param e 鼠标事件 */ public void mouseMoved(MouseEvent e) { int evtX = e.getX(); mouseOveredIndex = getTemplateIndex(evtX); //看是否需要显示toolTip if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) { setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); } else { setToolTipText(null); } listDownMode = isOverListDown(evtX) ? MOUSE_OVER_LIST_DOWN : LIST_DOWN; boolean isOverCloseIcon = isOverCloseIcon(evtX); clodeMode = isOverCloseIcon ? MOUSE_OVER_CLOSE : CLOSE; closeIconIndex = isOverCloseIcon ? mouseOveredIndex : -1; this.repaint(); } private void setPressedXY(int x, int y) { this.xyPressedCoordinate[0] = x; this.xyPressedCoordinate[1] = y; } public Object getValue(String key) { return null; } /** * 加入值 * @param key 键 * @param value 值 */ public void putValue(String key, Object value) { } /** * 动作 * @param e 事件 */ public void actionPerformed(ActionEvent e) { } /** * 处理自动新建的模板 在切换时的处理 */ public void doWithtemTemplate() { //temtemplate保存的一定是手动新建的没有编辑或是编辑了没有保存的模板 //没有保存,说明有编辑;已经保存在磁盘里的文件,说明有过处理,并且已经保存,此时切换都不将其自动关闭 if (temTemplate == null || temTemplate == HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()) { return; } if (!temTemplate.isSaved() || !temTemplate.getEditingFILE().isMemFile()) { temTemplate = null; } //自动新建的模板B若没有进行任何编辑(新建模板没有进行任何编辑时saved都是true):还没有存盘 if (temTemplate != null && temTemplate.getEditingFILE().isMemFile() && temTemplate.isSaved()) { HistoryTemplateListPane.getInstance().closeSelectedReport(temTemplate); temTemplate = null; setSelectedIndex(HistoryTemplateListPane.getInstance().contains(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate())); } } private class UIListDownItemUI extends BasicMenuItemUI { @Override protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { if (menuItem.getIcon() == null) { super.paintBackground(g, menuItem, bgColor); return; } ButtonModel model = menuItem.getModel(); Color oldColor = g.getColor(); int menuWidth = menuItem.getWidth(); int menuHeight = menuItem.getHeight(); g.setColor(UIConstants.NORMAL_BACKGROUND); g.fillRect(0, 0, menuWidth, menuHeight); boolean itemIsSelected = menuItem instanceof JMenu && model.isSelected(); if (menuItem.isOpaque()) { if (model.isArmed() || itemIsSelected) { GUIPaintUtils.fillPaint((Graphics2D) g, GAP, 0, menuWidth - GAP, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, UIConstants.ARC); } else { GUIPaintUtils.fillPaint((Graphics2D) g, GAP, 0, menuWidth - GAP, menuHeight, true, Constants.NULL, menuItem.getBackground(), UIConstants.ARC); } g.setColor(oldColor); } else if (model.isArmed() || itemIsSelected) { GUIPaintUtils.fillPaint((Graphics2D) g, GAP, 0, menuWidth - GAP, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, UIConstants.ARC); g.setColor(oldColor); } } } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/formula/VariableResolverAdapter.java b/designer_base/src/com/fr/design/formula/VariableResolverAdapter.java index 2489c6ff4..eb80600ac 100644 --- a/designer_base/src/com/fr/design/formula/VariableResolverAdapter.java +++ b/designer_base/src/com/fr/design/formula/VariableResolverAdapter.java @@ -29,7 +29,7 @@ public abstract class VariableResolverAdapter implements VariableResolver { // 空值参数 "NULL", "NOFILTER", // request变量 - CalculatorProvider.REPORT_NAME, CalculatorProvider.SERVLET_URL, CalculatorProvider.SERVER_SCHEMA, CalculatorProvider.SERVER_NAME, + CalculatorProvider.REPORT_NAME, CalculatorProvider.FORMLET_NAME, CalculatorProvider.SERVLET_URL, CalculatorProvider.SERVER_SCHEMA, CalculatorProvider.SERVER_NAME, CalculatorProvider.SERVER_PORT, CalculatorProvider.SERVER_URL, CalculatorProvider.CONTEXT_PATH, CalculatorProvider.SESSION_ID }; } diff --git a/designer_base/src/com/fr/design/fun/ElementUIProvider.java b/designer_base/src/com/fr/design/fun/ElementUIProvider.java index 9f93c21ed..75c3c86e8 100644 --- a/designer_base/src/com/fr/design/fun/ElementUIProvider.java +++ b/designer_base/src/com/fr/design/fun/ElementUIProvider.java @@ -13,7 +13,7 @@ public interface ElementUIProvider extends Mutable { String MARK_STRING = "ElementUIProvider"; - int CURRENT_LEVEL = 1; + int CURRENT_LEVEL = 2; /** * 单元格元素编辑器 @@ -31,7 +31,7 @@ public interface ElementUIProvider extends Mutable { * 右侧的快速编辑器 * @return 编辑器 */ - QuickEditor quickEditor(); + Class quickEditor(); /** * 插件单元格元素 diff --git a/designer_base/src/com/fr/design/fun/FormElementCaseEditorProcessor.java b/designer_base/src/com/fr/design/fun/FormElementCaseEditorProcessor.java index e887d389b..21866a2c3 100644 --- a/designer_base/src/com/fr/design/fun/FormElementCaseEditorProcessor.java +++ b/designer_base/src/com/fr/design/fun/FormElementCaseEditorProcessor.java @@ -1,34 +1,31 @@ -package com.fr.design.fun; - -import com.fr.stable.fun.ReportFitAttrProvider; -import com.fr.stable.fun.mark.Immutable; - -import java.beans.PropertyDescriptor; - -/** - * Created by zhouping on 2015/9/10. - */ -public interface FormElementCaseEditorProcessor extends Immutable { - - String MARK_STRING = "PropertyEditor"; - - int CURRENT_LEVEL = 1; - - - /** - * 生成属性表 - * @param temp 传入当前操作的class - * @param reportFitAttr 传入的自适应属性 - * @return 返回属性表 - */ - PropertyDescriptor[] createPropertyDescriptor(Class temp, ReportFitAttrProvider reportFitAttr); - - /** - * 返回pc自适应属性值 - * @param fitAttrProvider 传入的自适应属性 - * @return 返回pc自适应属性值 - */ - int getFitStateInPC(ReportFitAttrProvider fitAttrProvider); - - -} \ No newline at end of file +package com.fr.design.fun; + +import com.fr.stable.fun.ReportFitAttrProvider; +import com.fr.stable.fun.mark.Immutable; + +import java.beans.PropertyDescriptor; + +/** + * Created by Slpire on 2016/10/28. + */ +public interface FormElementCaseEditorProcessor extends Immutable { + String MARK_STRING = "PropertyEditor"; + + int CURRENT_LEVEL = 1; + + + /** + * 生成属性表 + * @param temp 传入当前操作的class + * @param reportFitAttr 传入的自适应属性 + * @return 返回属性表 + */ + PropertyDescriptor[] createPropertyDescriptor(Class temp, ReportFitAttrProvider reportFitAttr); + + /** + * 返回pc自适应属性值 + * @param fitAttrProvider 传入的自适应属性 + * @return 返回pc自适应属性值 + */ + int getFitStateInPC(ReportFitAttrProvider fitAttrProvider); +} diff --git a/designer_base/src/com/fr/design/fun/FormElementCaseEditorProvider.java b/designer_base/src/com/fr/design/fun/FormElementCaseEditorProvider.java new file mode 100644 index 000000000..92a1a835f --- /dev/null +++ b/designer_base/src/com/fr/design/fun/FormElementCaseEditorProvider.java @@ -0,0 +1,35 @@ +package com.fr.design.fun; + +import com.fr.form.FormProvider; +import com.fr.form.ui.ElementCaseEditorProvider; +import com.fr.stable.fun.ReportFitAttrProvider; +import com.fr.stable.fun.mark.Mutable; + +import java.beans.PropertyDescriptor; + +/** + * Created by zhouping on 2015/9/10. + */ +public interface FormElementCaseEditorProvider extends Mutable { + + String MARK_STRING = "PropertyEditor"; + + int CURRENT_LEVEL = 1; + + PropertyDescriptor[] createPropertyDescriptor(Class temp, FormProvider formProvider, ElementCaseEditorProvider editor); + + /** + * 生成属性表 + * @param temp 传入当前操作的class + * @param reportFitAttr 传入的自适应属性 + * @return 返回属性表 + */ + PropertyDescriptor[] createPropertyDescriptor(Class temp, ReportFitAttrProvider reportFitAttr); + + /** + * 返回pc自适应属性值 + * @param fitAttrProvider 传入的自适应属性 + * @return 返回pc自适应属性值 + */ + int getFitStateInPC(ReportFitAttrProvider fitAttrProvider); +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProcessor.java b/designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProcessor.java index caafda0b8..08a5a1606 100644 --- a/designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProcessor.java +++ b/designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProcessor.java @@ -1,44 +1,44 @@ -package com.fr.design.fun.impl; - -import com.fr.design.fun.FormElementCaseEditorProcessor; -import com.fr.stable.fun.ReportFitAttrProvider; -import com.fr.stable.fun.mark.API; - -import java.beans.PropertyDescriptor; - -/** - * Created by zhouping on 2015/9/10. - */ -@API(level = FormElementCaseEditorProcessor.CURRENT_LEVEL) -public abstract class AbstractFormElementCaseEditorProcessor implements FormElementCaseEditorProcessor { - - public int currentAPILevel() { - return CURRENT_LEVEL; - } - - public int layerIndex() { - return DEFAULT_LAYER_INDEX; - } - - - /** - * 生成属性表 - * @param temp 传入当前操作的class - * @param reportFitAttr 传入的自适应属性 - * @return 返回属性表 - */ - @Override - public PropertyDescriptor[] createPropertyDescriptor(Class temp, ReportFitAttrProvider reportFitAttr) { - return new PropertyDescriptor[0]; - } - - /** - * 返回pc自适应属性值 - * @param fitAttrProvider 传入的自适应属性 - * @return 返回pc自适应属性值 - */ - @Override - public int getFitStateInPC(ReportFitAttrProvider fitAttrProvider) { - return 0; - } +package com.fr.design.fun.impl; + +import com.fr.design.fun.FormElementCaseEditorProcessor; +import com.fr.stable.fun.ReportFitAttrProvider; +import com.fr.stable.fun.mark.API; + +import java.beans.PropertyDescriptor; + +/** + * Created by zhouping on 2015/9/10. + */ +@API(level = FormElementCaseEditorProcessor.CURRENT_LEVEL) +public abstract class AbstractFormElementCaseEditorProcessor implements FormElementCaseEditorProcessor { + + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + public int layerIndex() { + return DEFAULT_LAYER_INDEX; + } + + + /** + * 生成属性表 + * @param temp 传入当前操作的class + * @param reportFitAttr 传入的自适应属性 + * @return 返回属性表 + */ + @Override + public PropertyDescriptor[] createPropertyDescriptor(Class temp, ReportFitAttrProvider reportFitAttr) { + return new PropertyDescriptor[0]; + } + + /** + * 返回pc自适应属性值 + * @param fitAttrProvider 传入的自适应属性 + * @return 返回pc自适应属性值 + */ + @Override + public int getFitStateInPC(ReportFitAttrProvider fitAttrProvider) { + return 0; + } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProvider.java b/designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProvider.java new file mode 100644 index 000000000..8764eaf89 --- /dev/null +++ b/designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProvider.java @@ -0,0 +1,51 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.FormElementCaseEditorProvider; +import com.fr.form.FormProvider; +import com.fr.form.ui.ElementCaseEditorProvider; +import com.fr.stable.fun.ReportFitAttrProvider; +import com.fr.stable.fun.mark.API; + +import java.beans.PropertyDescriptor; + +/** + * Created by zhouping on 2015/9/10. + */ +@API(level = FormElementCaseEditorProvider.CURRENT_LEVEL) +public abstract class AbstractFormElementCaseEditorProvider implements FormElementCaseEditorProvider { + + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public String mark4Provider() { + return this.getClass().getName(); + } + + @Override + public PropertyDescriptor[] createPropertyDescriptor(Class temp, FormProvider reportAttr, ElementCaseEditorProvider editor) { + return new PropertyDescriptor[0]; + } + + /** + * 生成属性表 + * @param temp 传入当前操作的class + * @param reportFitAttr 传入的自适应属性 + * @return 返回属性表 + */ + @Override + public PropertyDescriptor[] createPropertyDescriptor(Class temp, ReportFitAttrProvider reportFitAttr) { + return new PropertyDescriptor[0]; + } + + /** + * 返回pc自适应属性值 + * @param fitAttrProvider 传入的自适应属性 + * @return 返回pc自适应属性值 + */ + @Override + public int getFitStateInPC(ReportFitAttrProvider fitAttrProvider) { + return 0; + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/chart/BaseChartPropertyPane.java b/designer_base/src/com/fr/design/gui/chart/BaseChartPropertyPane.java index 2bedd08db..c5b58ae26 100644 --- a/designer_base/src/com/fr/design/gui/chart/BaseChartPropertyPane.java +++ b/designer_base/src/com/fr/design/gui/chart/BaseChartPropertyPane.java @@ -20,6 +20,8 @@ public abstract class BaseChartPropertyPane extends DockingView { public abstract void setSupportCellData(boolean supportCellData); public abstract void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane); - - public abstract void setWidgetPropertyPane(BaseWidgetPropertyPane pane); + + public abstract ChartEditPaneProvider getChartEditPane(); + + //public abstract void clear(); } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/chart/ChartEditPaneProvider.java b/designer_base/src/com/fr/design/gui/chart/ChartEditPaneProvider.java new file mode 100644 index 000000000..3d4119ab7 --- /dev/null +++ b/designer_base/src/com/fr/design/gui/chart/ChartEditPaneProvider.java @@ -0,0 +1,13 @@ +package com.fr.design.gui.chart; + +/** + * Created by daniel on 2016/11/2. + */ +public interface ChartEditPaneProvider { + + + void gotoPane(String... id); + + void fire(); + +} diff --git a/designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java b/designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java index f0a94f305..a8a72fc1e 100644 --- a/designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java +++ b/designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java @@ -1,40 +1,49 @@ 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; +import java.util.Arrays; 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 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); @@ -58,14 +67,30 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { controlPane = new JTreeControlPane(new NameableCreator[] { treeNode }, new TreeDataCardPane(), isEditor); autoBuildPane = new JTreeAutoBuildPane(); + 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); + 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(); @@ -101,8 +126,17 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { buildBox.setSelectedIndex(1); TableDataDictionary dictionary = treeEditor.getDictionary(); autoBuildPane.populate(dictionary); - } else { + } else if (treeEditor.isLayerBuild()) { buildBox.setSelectedIndex(0); + java.util.List 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 Layer Data", layerConfigs)); + } else { + buildBox.setSelectedIndex(2); } } @@ -121,10 +155,12 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { if (buildBox.getSelectedIndex() == 1) { TableDataDictionary dictionary = this.autoBuildPane.update(); te.setAutoBuild(true); + te.setLayerBuild(false); te.setDictionary(dictionary); te.setNodeOrDict(dictionary); - } else { + } else if (buildBox.getSelectedIndex() == 2) { te.setAutoBuild(false); + te.setLayerBuild(false); NameObject no = this.controlPane.update(); if (no != null) { TreeEditor editor = (TreeEditor) no.getObject(); @@ -141,6 +177,11 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { te.setNodeOrDict(editor.getTreeNodeAttr()); te.setPerformanceFirst(editor.isPerformanceFirst()); } + } else { + LayerConfig[] configs = (LayerConfig[]) layerDataControlPane.update().getObject(); + te.setAutoBuild(false); + te.setLayerBuild(true); + te.setLayerConfigs(Arrays.asList(configs)); } return te; } @@ -150,11 +191,14 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { * @return */ public Object updateTreeNodeAttrs() { - if(buildBox.getSelectedIndex() == 0) { + + if (buildBox.getSelectedIndex() == 2) { NameObject no = controlPane.update(); if (no != null) { return no.getObject(); } + } else if (buildBox.getSelectedIndex() == 0) { + return layerDataControlPane.update(); } else { return autoBuildPane.update(); } @@ -170,15 +214,17 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { if (buildBox.getSelectedIndex() == 1) { TableDataDictionary dictionary = this.autoBuildPane.update(); tcb.setAutoBuild(true); - tcb.setDictionary(dictionary); - tcb.setNodeOrDict(dictionary); - } else { - tcb.setAutoBuild(false); - NameObject no = this.controlPane.update(); - if (no != null) { - if (no.getObject() instanceof TreeComboBoxEditor) { - return (TreeComboBoxEditor) no.getObject(); - } + tcb.setLayerBuild(false); + tcb.setDictionary(dictionary); + tcb.setNodeOrDict(dictionary); + } else if (buildBox.getSelectedIndex() == 2) { + tcb.setAutoBuild(false); + tcb.setLayerBuild(false); + NameObject no = this.controlPane.update(); + if (no != null) { + if (no.getObject() instanceof TreeComboBoxEditor) { + return (TreeComboBoxEditor) no.getObject(); + } TreeEditor editor = (TreeEditor) no.getObject(); tcb.setAllowBlank(editor.isAllowBlank()); @@ -194,7 +240,12 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { tcb.setNodeOrDict(editor.getTreeNodeAttr()); tcb.setPerformanceFirst(editor.isPerformanceFirst()); } - } + }else { + LayerConfig[] configs = (LayerConfig[]) layerDataControlPane.update().getObject(); + tcb.setAutoBuild(false); + tcb.setLayerBuild(true); + tcb.setLayerConfigs(Arrays.asList(configs)); + } return tcb; } @@ -204,12 +255,15 @@ public class TreeSettingPane extends BasicPane implements DataCreatorUI { */ public void populate(Object nodeOrDict) { if(nodeOrDict instanceof TreeNodeAttr[] || nodeOrDict instanceof TreeNodeWrapper) { - buildBox.setSelectedIndex(0); + 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); } } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/frpane/UIComboBoxPane.java b/designer_base/src/com/fr/design/gui/frpane/UIComboBoxPane.java index 9d31cd4f3..99a126e12 100644 --- a/designer_base/src/com/fr/design/gui/frpane/UIComboBoxPane.java +++ b/designer_base/src/com/fr/design/gui/frpane/UIComboBoxPane.java @@ -25,7 +25,7 @@ public abstract class UIComboBoxPane extends BasicBeanPane { protected JPanel cardPane; protected List> cards; - private String[] cardNames; + protected String[] cardNames; public UIComboBoxPane() { cards = initPaneList(); @@ -49,6 +49,19 @@ public abstract class UIComboBoxPane extends BasicBeanPane { addComboBoxItem(cards, i); } + addItemChangeEvent(); + + initLayout(); + + jcb.setSelectedIndex(0); + } + + public FurtherBasicBeanPane getSelectedPane(){ + return cards.get(jcb.getSelectedIndex()); + } + + + protected void addItemChangeEvent() { jcb.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { @@ -57,10 +70,6 @@ public abstract class UIComboBoxPane extends BasicBeanPane { cl.show(cardPane, cardNames[jcb.getSelectedIndex()]); } }); - - initLayout(); - - jcb.setSelectedIndex(0); } protected UIComboBox createComboBox() { @@ -117,6 +126,8 @@ public abstract class UIComboBoxPane extends BasicBeanPane { } } + + @Override public T updateBean() { return cards.get(jcb.getSelectedIndex()).updateBean(); @@ -142,4 +153,7 @@ public abstract class UIComboBoxPane extends BasicBeanPane { return this.cards; } + public void clear() { + reset(); + } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/icombobox/FRTreeComboBox.java b/designer_base/src/com/fr/design/gui/icombobox/FRTreeComboBox.java index 3ddec17d2..a60942229 100644 --- a/designer_base/src/com/fr/design/gui/icombobox/FRTreeComboBox.java +++ b/designer_base/src/com/fr/design/gui/icombobox/FRTreeComboBox.java @@ -247,7 +247,17 @@ public class FRTreeComboBox extends UIComboBox { } @Override protected UIButton createArrowButton() { - arrowButton = new UIButton(UIConstants.ARROW_DOWN_ICON); + arrowButton = new UIButton(UIConstants.ARROW_DOWN_ICON){ + /** + * 组件是否需要响应添加的观察者事件 + * + * @return 如果需要响应观察者事件则返回true,否则返回false + */ + @Override + public boolean shouldResponseChangeListener() { + return false; + } + }; ((UIButton) arrowButton).setRoundBorder(true, Constants.LEFT); arrowButton.addMouseListener(this); comboBox.addMouseListener(this); diff --git a/designer_base/src/com/fr/design/gui/icombobox/UIComboBox.java b/designer_base/src/com/fr/design/gui/icombobox/UIComboBox.java index 90944c449..d6d149674 100644 --- a/designer_base/src/com/fr/design/gui/icombobox/UIComboBox.java +++ b/designer_base/src/com/fr/design/gui/icombobox/UIComboBox.java @@ -37,7 +37,7 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser private static final int SIZE5 = 5; - private UIObserverListener uiObserverListener; + protected UIObserverListener uiObserverListener; private String comboBoxName = ""; @@ -71,7 +71,7 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser initListener(); } - private void initListener() { + protected void initListener() { if (shouldResponseChangeListener()) { this.addFocusListener(new FocusAdapter() { @Override @@ -94,7 +94,7 @@ public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObser } } - private void fireSetGlobalName() { + protected void fireSetGlobalName() { if (globalNameListener != null && shouldResponseNameListener()) { globalNameListener.setGlobalName(comboBoxName); } diff --git a/designer_base/src/com/fr/design/gui/icontainer/UIResizableContainer.java b/designer_base/src/com/fr/design/gui/icontainer/UIResizableContainer.java index 22d1bb521..13ea214ec 100644 --- a/designer_base/src/com/fr/design/gui/icontainer/UIResizableContainer.java +++ b/designer_base/src/com/fr/design/gui/icontainer/UIResizableContainer.java @@ -3,6 +3,7 @@ package com.fr.design.gui.icontainer; import com.fr.base.BaseUtils; import com.fr.design.constants.UIConstants; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.stable.Constants; import com.fr.design.utils.gui.GUICoreUtils; @@ -21,11 +22,14 @@ public class UIResizableContainer extends JPanel { private JComponent upPane; private JComponent downPane; + //放参数面板 + private JComponent parameterPane = new JPanel(); private HorizotalToolPane horizontToolPane; private VerticalToolPane verticalToolPane; private int direction; + private boolean hasParameterPane; private static final int MAX_WIDTH = 300; private static final int MIN_WIDTH = 165; @@ -37,6 +41,7 @@ public class UIResizableContainer extends JPanel { private boolean isLeftRightDragEnabled = true; private boolean isDownPaneVisible = true ; + private int paraHeight; public UIResizableContainer(int direction) { this(new JPanel(), new JPanel(), direction); @@ -86,6 +91,7 @@ public class UIResizableContainer extends JPanel { add(downPane); add(verticalToolPane); } + public UIResizableContainer(JComponent upPane, int direction) { setBackground(UIConstants.NORMAL_BACKGROUND); @@ -119,6 +125,26 @@ public class UIResizableContainer extends JPanel { } } + /** + * 获取参数面板高度 + */ + public int getParameterPaneHeight() { + + return paraHeight; + + } + + /** + * 设置参数面板高度 + * + * @param height + */ + public void setParameterHeight(int height) { + paraHeight = hasParameterPane? height : 0; + refreshContainer(); + + } + /** * 得到上下子面板的高度 * @@ -183,7 +209,7 @@ public class UIResizableContainer extends JPanel { if(isDownPaneVisible){ upPane.setBounds(0, 0, containerWidth - toolPaneHeight, toolPaneY); horizontToolPane.setBounds(0, toolPaneY, containerWidth - toolPaneHeight, toolPaneHeight); - downPane.setBounds(0, toolPaneY + toolPaneHeight, containerWidth - toolPaneHeight, parent.getHeight() - toolPaneY - toolPaneHeight); + downPane.setBounds(0, toolPaneY + toolPaneHeight, containerWidth - toolPaneHeight, parent.getHeight() - toolPaneY - toolPaneHeight-30); verticalToolPane.setBounds(containerWidth - toolPaneHeight, 0, toolPaneHeight, getHeight()); }else{ upPane.setBounds(0, 0, containerWidth - toolPaneHeight, getHeight()); @@ -194,16 +220,17 @@ public class UIResizableContainer extends JPanel { if (toolPaneY > getHeight() - toolPaneHeight) { toolPaneY = getHeight() - toolPaneHeight; } - upPane.setBounds(toolPaneHeight, 0, containerWidth - toolPaneHeight, toolPaneY); - horizontToolPane.setBounds(toolPaneHeight, toolPaneY, containerWidth - toolPaneHeight, toolPaneHeight); - downPane.setBounds(toolPaneHeight, toolPaneY + toolPaneHeight, containerWidth - toolPaneHeight, parent.getHeight() - toolPaneY - toolPaneHeight); + parameterPane.setBounds(20, 0, 230, getParameterPaneHeight()); + upPane.setBounds(toolPaneHeight, getParameterPaneHeight(), containerWidth - toolPaneHeight, toolPaneY); + horizontToolPane.setBounds(toolPaneHeight, toolPaneY + getParameterPaneHeight(), containerWidth - toolPaneHeight, toolPaneHeight); + downPane.setBounds(toolPaneHeight, toolPaneY + toolPaneHeight + getParameterPaneHeight(), containerWidth - toolPaneHeight, parent.getHeight() - toolPaneY - toolPaneHeight - getParameterPaneHeight()); verticalToolPane.setBounds(0, 0, toolPaneHeight, getHeight()); - }else{ - upPane.setBounds(toolPaneHeight, 0, containerWidth - toolPaneHeight, getHeight()); + } else { + parameterPane.setBounds(20, 0, 230, getParameterPaneHeight()); + upPane.setBounds(toolPaneHeight, getParameterPaneHeight(), containerWidth - toolPaneHeight, getHeight() - getParameterPaneHeight()); verticalToolPane.setBounds(0, 0, toolPaneHeight, getHeight()); } } - } @Override @@ -244,6 +271,20 @@ public class UIResizableContainer extends JPanel { refreshContainer(); } + public void addParameterPane(JComponent pane) { + add(this.parameterPane = pane); + hasParameterPane = true; + refreshContainer(); + } + + public void removeParameterPane() { + remove(this.parameterPane); + setParameterHeight(0); + hasParameterPane = false; + refreshContainer(); + + } + /** * 得到上子面板 * @@ -262,6 +303,15 @@ public class UIResizableContainer extends JPanel { return this.downPane; } + /** + * 得到参数面板 + * + * @return + */ + public JComponent getParameterPane() { + return this.parameterPane; + } + /** * 刷新下面板 */ @@ -303,7 +353,7 @@ public class UIResizableContainer extends JPanel { public void mouseDragged(MouseEvent e) { toolPaneY = e.getYOnScreen() - UIResizableContainer.this.getLocationOnScreen().y; toolPaneY = toolPaneY < 0 ? 0 : toolPaneY; - toolPaneY = toolPaneY > UIResizableContainer.this.getHeight() - toolPaneHeight ? UIResizableContainer.this.getHeight() - toolPaneHeight : toolPaneY; + toolPaneY = toolPaneY > UIResizableContainer.this.getHeight() - toolPaneHeight ? UIResizableContainer.this.getHeight() - toolPaneHeight - getParameterPaneHeight() : toolPaneY - getParameterPaneHeight(); refreshContainer(); } }); @@ -326,7 +376,7 @@ public class UIResizableContainer extends JPanel { if (e.getX() <= ARROW_RANGE) { toolPaneY = 0; } else if (e.getX() >= getWidth() - ARROW_RANGE) { - toolPaneY = UIResizableContainer.this.getHeight() - toolPaneHeight; + toolPaneY = UIResizableContainer.this.getHeight() - toolPaneHeight - getParameterPaneHeight(); } else { return; } @@ -483,7 +533,7 @@ public class UIResizableContainer extends JPanel { jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel content = (JPanel) jf.getContentPane(); content.setLayout(new BorderLayout()); - UIResizableContainer bb = new UIResizableContainer(Constants.LEFT); + UIResizableContainer bb = new UIResizableContainer(Constants.RIGHT); JPanel cc = new JPanel(); cc.setBackground(Color.blue); content.add(bb, BorderLayout.EAST); diff --git a/designer_base/src/com/fr/design/gui/itree/filetree/EnvFileTree.java b/designer_base/src/com/fr/design/gui/itree/filetree/EnvFileTree.java index 436ea911c..c7d767600 100644 --- a/designer_base/src/com/fr/design/gui/itree/filetree/EnvFileTree.java +++ b/designer_base/src/com/fr/design/gui/itree/filetree/EnvFileTree.java @@ -2,13 +2,11 @@ package com.fr.design.gui.itree.filetree; import java.awt.Component; import java.awt.Dimension; -import java.awt.dnd.DnDConstants; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import com.fr.design.constants.UIConstants; -import com.fr.design.event.TemplateTreeDragSource; import com.fr.design.gui.ilable.UILabel; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; @@ -74,7 +72,6 @@ public class EnvFileTree extends RefreshableJTree { this.setRootVisible(false); this.setShowsRootHandles(true); this.setEditable(false); - new TemplateTreeDragSource(this, DnDConstants.ACTION_COPY); } // CellRenderer diff --git a/designer_base/src/com/fr/design/hyperlink/AbstractHyperlinkPane.java b/designer_base/src/com/fr/design/hyperlink/AbstractHyperlinkPane.java index 8a2773f58..36297d165 100644 --- a/designer_base/src/com/fr/design/hyperlink/AbstractHyperlinkPane.java +++ b/designer_base/src/com/fr/design/hyperlink/AbstractHyperlinkPane.java @@ -63,12 +63,12 @@ public abstract class AbstractHyperlinkPane extends BasicBe newWindowConfPane.add(new UILabel(Inter.getLocText("FR-Designer_Height") + ": ")); heightTextFiled = new UINumberField(); heightTextFiled.setText(String.valueOf(DEFAULT_H_VALUE)); - heightTextFiled.setPreferredSize(new Dimension(60, 20)); + heightTextFiled.setPreferredSize(new Dimension(40, 20)); newWindowConfPane.add(heightTextFiled); newWindowConfPane.add(new UILabel(" " + Inter.getLocText("FR-Designer_Width") + ": ")); widthTextFiled = new UINumberField(); widthTextFiled.setText(String.valueOf(DEFAULT_V_VALUE)); - widthTextFiled.setPreferredSize(new Dimension(60, 20)); + widthTextFiled.setPreferredSize(new Dimension(40, 20)); newWindowConfPane.add(widthTextFiled); JPanel centerPanel = new JPanel(new BorderLayout()); diff --git a/designer_base/src/com/fr/design/icon/IconPathConstants.java b/designer_base/src/com/fr/design/icon/IconPathConstants.java index c254e04d6..4a86bcf6f 100644 --- a/designer_base/src/com/fr/design/icon/IconPathConstants.java +++ b/designer_base/src/com/fr/design/icon/IconPathConstants.java @@ -1 +1 @@ -package com.fr.design.icon; /** * Created by IntelliJ IDEA. * Author : Richer * Version: 6.5.6 * Date: 12-12-18 * Time: 上午9:42 * 用于保存所有图标路径的类 */ public class IconPathConstants { private IconPathConstants() { } public static final String ADD_POPMENU_ICON_PATH = "/com/fr/design/images/control/addPopup.png"; public static final String DS_ICON_PATH = "/com/fr/design/images/data/datasource.png"; public static final String CLASS_TD_ICON_PATH = "/com/fr/design/images/data/source/classTableData.png"; public static final String EMB_TD_ICON_PATH = "/com/fr/design/images/data/dataTable.png"; public static final String DS_RELATION_TD_ICON_PATH = "/com/fr/design/images/data/multi.png"; public static final String FILE_TD_ICON_PATH = "/com/fr/design/images/data/file.png"; public static final String DS_TREE_TD_ICON_PATH = "/com/fr/design/images/data/tree.png"; public static final String DS_QUERY_ICON_PATH = "/com/fr/design/images/data/database.png"; public static final String PREVIEW_ICON_PATH = "/com/fr/design/images/m_file/preview.png"; public static final String TD_EDIT_ICON_PATH = "/com/fr/design/images/control/edit.png"; public static final String TD_REMOVE_ICON_PATH = "/com/fr/base/images/cell/control/remove.png"; public static final String TD_CONNECTION_ICON_PATH = "/com/fr/design/images/m_web/connection.png"; public static final String SP_SHOW_ICON_PATH = "/com/fr/design/images/data/store_procedure.png"; public static final String STD_SHOW_ICON_PATH = "/com/fr/design/images/data/dock/serverdatabase.png"; public static final String XMLA_ICON_PATH = "/com/fr/design/images/data/cube.png"; public static final String FORBID_ICON_PATH ="/com/fr/web/images/form/forbid.png"; } \ No newline at end of file +package com.fr.design.icon; /** * Created by IntelliJ IDEA. * Author : Richer * Version: 6.5.6 * Date: 12-12-18 * Time: 上午9:42 * 用于保存所有图标路径的类 */ public class IconPathConstants { private IconPathConstants() { } public static final String ADD_POPMENU_ICON_PATH = "/com/fr/design/images/control/addPopup.png"; public static final String DS_ICON_PATH = "/com/fr/design/images/data/datasource.png"; public static final String CLASS_TD_ICON_PATH = "/com/fr/design/images/data/source/classTableData.png"; public static final String EMB_TD_ICON_PATH = "/com/fr/design/images/data/dataTable.png"; public static final String DS_RELATION_TD_ICON_PATH = "/com/fr/design/images/data/multi.png"; public static final String FILE_TD_ICON_PATH = "/com/fr/design/images/data/file.png"; public static final String DS_TREE_TD_ICON_PATH = "/com/fr/design/images/data/tree.png"; public static final String DS_QUERY_ICON_PATH = "/com/fr/design/images/data/database.png"; public static final String PREVIEW_ICON_PATH = "/com/fr/design/images/m_file/preview.png"; public static final String TD_EDIT_ICON_PATH = "/com/fr/design/images/control/edit.png"; public static final String TD_EL_SHARE_HELP_ICON_PATH = "/com/fr/design/images/control/help_open.png"; public static final String TD_EL_SHARE_CLOSE_ICON_PATH = "/com/fr/design/images/control/help_close.png"; public static final String TD_REMOVE_ICON_PATH = "/com/fr/base/images/cell/control/remove.png"; public static final String TD_CONNECTION_ICON_PATH = "/com/fr/design/images/m_web/connection.png"; public static final String SP_SHOW_ICON_PATH = "/com/fr/design/images/data/store_procedure.png"; public static final String STD_SHOW_ICON_PATH = "/com/fr/design/images/data/dock/serverdatabase.png"; public static final String XMLA_ICON_PATH = "/com/fr/design/images/data/cube.png"; public static final String FORBID_ICON_PATH ="/com/fr/web/images/form/forbid.png"; } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/images/buttonicon/config.png b/designer_base/src/com/fr/design/images/buttonicon/config.png new file mode 100644 index 000000000..377bb9247 Binary files /dev/null and b/designer_base/src/com/fr/design/images/buttonicon/config.png differ diff --git a/designer_base/src/com/fr/design/images/control/help_close.png b/designer_base/src/com/fr/design/images/control/help_close.png new file mode 100644 index 000000000..036865c18 Binary files /dev/null and b/designer_base/src/com/fr/design/images/control/help_close.png differ diff --git a/designer_base/src/com/fr/design/images/control/help_open.png b/designer_base/src/com/fr/design/images/control/help_open.png new file mode 100644 index 000000000..b988d678f Binary files /dev/null and b/designer_base/src/com/fr/design/images/control/help_open.png differ diff --git a/designer_base/src/com/fr/design/insert/formula/variable/cn/formletName.txt b/designer_base/src/com/fr/design/insert/formula/variable/cn/formletName.txt new file mode 100644 index 000000000..95c5feec3 --- /dev/null +++ b/designer_base/src/com/fr/design/insert/formula/variable/cn/formletName.txt @@ -0,0 +1,3 @@ + +ʣhttp://localhost:8080/WebReport/ReportServer?formlet=Form1.frm +formNameForm1.frm \ No newline at end of file diff --git a/designer_base/src/com/fr/design/insert/formula/variable/en/formletName.txt b/designer_base/src/com/fr/design/insert/formula/variable/en/formletName.txt new file mode 100644 index 000000000..320a270d6 --- /dev/null +++ b/designer_base/src/com/fr/design/insert/formula/variable/en/formletName.txt @@ -0,0 +1,3 @@ +form name +http://localhost:8080/WebReport/ReportServer?formlet=Form1.frm +formName is Form1.frm \ No newline at end of file diff --git a/designer_base/src/com/fr/design/layout/TableLayoutHelper.java b/designer_base/src/com/fr/design/layout/TableLayoutHelper.java index 97dcf816b..b15aa99ba 100644 --- a/designer_base/src/com/fr/design/layout/TableLayoutHelper.java +++ b/designer_base/src/com/fr/design/layout/TableLayoutHelper.java @@ -47,6 +47,40 @@ public class TableLayoutHelper { return createCommonTableLayoutPane(components, rowSize, columnSize, LayoutConstants.VGAP_MEDIUM); } + /** + * 标题布局(二级菜单距左边框46) + * @param title 标题 + * @param component 组件 + * @return 布局好的组件 + */ + public static JPanel createTableLayoutPaneWithTitle(String title, Component component){ + return createTitlePane(title, component, LayoutConstants.CHART_ATTR_TOMARGIN); + } + + public static JPanel createTitlePane(String title, Component component, int gap){ + return createTitlePaneWithUILabel(new UILabel(title), component, gap); + } + + /** + * 标题布局(指定gap) + * @param label 标题label + * @param component 组件 + * @param gap 距左侧距离 + * @return 布局好的组件 + */ + public static JPanel createTitlePaneWithUILabel(UILabel label, Component component, int gap){ + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {gap, f}; + double[] rowSize = {p, p}; + Component[][] components = new Component[][]{ + new Component[]{label,null}, + new Component[]{null,component}, + }; + return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + } + + public static JPanel createCommonTableLayoutPane(Component[][] components, double[] rowSize, double[] columnSize, double gap) { return createGapTableLayoutPane(components, rowSize, columnSize, gap, gap); diff --git a/designer_base/src/com/fr/design/mainframe/HelpDialogHandler.java b/designer_base/src/com/fr/design/mainframe/HelpDialogHandler.java new file mode 100644 index 000000000..dec93e658 --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/HelpDialogHandler.java @@ -0,0 +1,13 @@ +package com.fr.design.mainframe; + +/** + * Coder: zack + * Date: 2016/11/3 + * Time: 10:43 + */ +public interface HelpDialogHandler { + /** + * 销毁 + */ + void destroyHelpDialog(); +} diff --git a/designer_base/src/com/fr/design/mainframe/HelpDialogManager.java b/designer_base/src/com/fr/design/mainframe/HelpDialogManager.java new file mode 100644 index 000000000..febda0a85 --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/HelpDialogManager.java @@ -0,0 +1,38 @@ +package com.fr.design.mainframe; + +/** + * 帮助信息的面板由于需要滚动条所以采用了很挫的dialog做,dialog很多情况下不能主动关闭,这边控制一下 + * Coder: zack + * Date: 2016/11/2 + * Time: 16:34 + */ +public class HelpDialogManager { + private static HelpDialogManager THIS; + private HelpDialogHandler handler; + + private HelpDialogManager() { + + } + + public HelpDialogHandler getPane() { + return handler; + } + + public void setPane(HelpDialogHandler dialog) { + if (dialog == this.handler) { + return; + } + //只允许一个dialog存在 + if (this.handler != null) { + handler.destroyHelpDialog(); + } + this.handler = dialog; + } + + public static HelpDialogManager getInstance() { + if (THIS == null) { + THIS = new HelpDialogManager(); + } + return THIS; + } +} diff --git a/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 8c2d49a07..8dfd3dfa3 100644 --- a/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -139,9 +139,30 @@ public abstract class ToolBarMenuDock { menuList.add(createHelpMenuDef()); // 添加社区菜单 - menuList.add(createCommunityMenuDef()); + addCommunityMenuDef(menuList); + return menuList.toArray(new MenuDef[menuList.size()]); } + + public void addCommunityMenuDef(java.util.List menuList){ + Locale locale = FRContext.getLocale(); + Locale [] locales =supportCommunityLocales(); + for(int i = 0; i < locales.length; i++) { + if(locale.equals(locales[i])){ + menuList.add(createCommunityMenuDef()); + break; + } + } + } + + public Locale[] supportCommunityLocales() { + return new Locale[]{ + Locale.CHINA, + Locale.JAPAN, + Locale.TAIWAN, + Locale.US, + }; + } public void insertTemplateExtendMenu(ToolBarMenuDockPlus plus, MenuDef[] menuDefs) { // 给菜单加插件入口 diff --git a/designer_base/src/com/fr/design/module/DesignModuleFactory.java b/designer_base/src/com/fr/design/module/DesignModuleFactory.java index b21d206c9..77233e4db 100644 --- a/designer_base/src/com/fr/design/module/DesignModuleFactory.java +++ b/designer_base/src/com/fr/design/module/DesignModuleFactory.java @@ -1 +1 @@ -package com.fr.design.module; import com.fr.base.FRContext; import com.fr.base.chart.BaseChartCollection; import com.fr.design.gui.chart.BaseChartPropertyPane; import com.fr.design.gui.chart.MiddleChartComponent; import com.fr.design.gui.chart.MiddleChartDialog; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.frpane.BaseHyperlinkGroup; import com.fr.design.gui.frpane.HyperlinkGroupType; import com.fr.design.mainframe.BaseFormDesigner; import com.fr.design.mainframe.BaseWidgetPropertyPane; import com.fr.design.parameter.HierarchyTreePane; import com.fr.design.parameter.ParameterDesignerProvider; import com.fr.design.parameter.ParameterReader; import com.fr.form.ui.Widget; import com.fr.stable.StableUtils; import java.awt.*; import java.lang.reflect.Constructor; import java.util.ArrayList; /** * Created by IntelliJ IDEA. * Author : Richer * Version: 7.0.3 * Date: 13-7-8 * Time: 下午1:57 */ public class DesignModuleFactory { private static DesignModuleFactory instance = new DesignModuleFactory(); private DesignModuleFactory() { } private HyperlinkGroupType hyperlinkGroupType = new BaseHyperlinkGroup(); private NameableCreator[] creators4Hyperlink; private WidgetOption[] extraOptions; private Class chartEditorClass; private Class chartComponentClass; private Class chartDialogClass; private Class chartPropertyPaneClass; private Class newFormAction; private Class formParaDesigner; private Class paraPropertyPane; private Class formHierarchyPaneCls; private Class chartWidgetPropertyPaneCls; private Class widgetPropertyPane; private Class buttonDetailPaneClass; private java.util.List parameterReaderList; public static void registerHyperlinkGroupType(HyperlinkGroupType hyperlinkGroupType) { instance.hyperlinkGroupType = hyperlinkGroupType; } public static HyperlinkGroupType getHyperlinkGroupType() { return instance.hyperlinkGroupType; } public static void registerCreators4Hyperlink(NameableCreator[] nameableCreators) { instance.creators4Hyperlink = nameableCreators; } public static NameableCreator[] getCreators4Hyperlink() { return instance.creators4Hyperlink; } public static void registerExtraWidgetOptions(WidgetOption[] options) { instance.extraOptions = options; } public static WidgetOption[] getExtraWidgetOptions() { if (instance.extraOptions == null) { instance.extraOptions = new WidgetOption[0]; } return instance.extraOptions; } public static void registerChartEditorClass(Class cls) { instance.chartEditorClass = cls; } public static Class getChartEditorClass() { return instance.chartEditorClass; } public static void registerChartComponentClass(Class bcc) { instance.chartComponentClass = bcc; } public static void registerChartDialogClass(Class cd) { instance.chartDialogClass = cd; } public static void registerChartAndWidgetPropertyPane(Class p) { instance.chartWidgetPropertyPaneCls = p; } public static void registerChartPropertyPaneClass(Class p) { instance.chartPropertyPaneClass = p; } public static BaseChartPropertyPane getChartWidgetPropertyPane(BaseFormDesigner fd) { BaseChartPropertyPane p = null; if (instance.chartWidgetPropertyPaneCls != null) { p = StableUtils.getInstance(instance.chartWidgetPropertyPaneCls); p.setWidgetPropertyPane(DesignModuleFactory.getWidgetPropertyPane(fd)); p.setSureProperty(); } return p; } public static void registerNewFormActionClass(Class f) { instance.newFormAction = f; } public static Class getNewFormAction() { return instance.newFormAction; } public static void registerParaPropertyPaneClass(Class p) { instance.paraPropertyPane = p; } /** * 获取参数属性界面 * * @return 参数属性界面. */ public static Object getParaPropertyPane() { if (instance.paraPropertyPane != null) { try { return instance.paraPropertyPane.newInstance(); } catch (Exception e) { FRContext.getLogger().error("Error in Para PropertyPane"); } } return null; } public static void registerFormParaDesignerClass(Class f) { instance.formParaDesigner = f; } public static ParameterDesignerProvider getFormParaDesigner() { if (instance.formParaDesigner != null) { try { return (ParameterDesignerProvider) instance.formParaDesigner.newInstance(); } catch (Exception e) { FRContext.getLogger().error("error in form para designer"); } } return null; } public static void registerFormHierarchyPaneClass(Class fClass) { instance.formHierarchyPaneCls = fClass; } public static HierarchyTreePane getFormHierarchyPane() { return StableUtils.getInstance(instance.formHierarchyPaneCls); } public static void registerWidgetPropertyPaneClass(Class wp) { instance.widgetPropertyPane = wp; } public static BaseWidgetPropertyPane getWidgetPropertyPane(BaseFormDesigner fd) { BaseWidgetPropertyPane wp = null; if (instance.widgetPropertyPane != null) { wp = StableUtils.getInstance(instance.widgetPropertyPane); wp.setEditingFormDesigner(fd); wp.refreshDockingView(); } return wp; } public static MiddleChartComponent getChartComponent(BaseChartCollection collection) { MiddleChartComponent bcc = null; if (instance.chartComponentClass != null) { try { bcc = instance.chartComponentClass.newInstance(); bcc.populate(collection); } catch (InstantiationException e) { FRContext.getLogger().error("Error in ChartComponent instant", e); } catch (IllegalAccessException e) { FRContext.getLogger().error("Error in Access", e); } } return bcc; } /** * kunsnat: 初始化图表向导对话框, 调用静态方法showWindow, 参数window. * * @return 返回调出的ChartDailog */ public static MiddleChartDialog getChartDialog(Window window) { try { Constructor c; if (window instanceof Frame) { c = instance.chartDialogClass.getConstructor(Frame.class); } else { c = instance.chartDialogClass.getConstructor(Dialog.class); } return c.newInstance(window); } catch (Exception e) { FRContext.getLogger().error(e.getMessage(), e); } return null; } /** * kunsnat: 获取图表属性界面 * * @return 返回界面. */ public static BaseChartPropertyPane getChartPropertyPane() { BaseChartPropertyPane bp = null; if (instance.chartPropertyPaneClass != null) { bp = StableUtils.getInstance(instance.chartPropertyPaneClass); bp.setSureProperty(); } return bp; } public static void registerButtonDetailPaneClass(Class clazz) { instance.buttonDetailPaneClass = clazz; } public static Class getButtonDetailPaneClass() { return instance.buttonDetailPaneClass; } public static void registerParameterReader(ParameterReader reader) { if (instance.parameterReaderList == null) { instance.parameterReaderList = new ArrayList(); } instance.parameterReaderList.add(reader); } public static ParameterReader[] getParameterReaders() { if (instance.parameterReaderList == null) { return new ParameterReader[0]; } return instance.parameterReaderList.toArray(new ParameterReader[instance.parameterReaderList.size()]); } } \ No newline at end of file +package com.fr.design.module; import com.fr.base.FRContext; import com.fr.base.chart.BaseChartCollection; import com.fr.design.gui.chart.BaseChartPropertyPane; import com.fr.design.gui.chart.MiddleChartComponent; import com.fr.design.gui.chart.MiddleChartDialog; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.core.WidgetOption; import com.fr.design.gui.frpane.BaseHyperlinkGroup; import com.fr.design.gui.frpane.HyperlinkGroupType; import com.fr.design.mainframe.BaseFormDesigner; import com.fr.design.mainframe.BaseWidgetPropertyPane; import com.fr.design.parameter.HierarchyTreePane; import com.fr.design.parameter.ParameterDesignerProvider; import com.fr.design.parameter.ParameterReader; import com.fr.form.ui.Widget; import com.fr.stable.StableUtils; import java.awt.*; import java.lang.reflect.Constructor; import java.util.ArrayList; /** * Created by IntelliJ IDEA. * Author : Richer * Version: 7.0.3 * Date: 13-7-8 * Time: 下午1:57 */ public class DesignModuleFactory { private static DesignModuleFactory instance = new DesignModuleFactory(); private DesignModuleFactory() { } private HyperlinkGroupType hyperlinkGroupType = new BaseHyperlinkGroup(); private NameableCreator[] creators4Hyperlink; private WidgetOption[] extraOptions; private Class chartEditorClass; private Class chartComponentClass; private Class chartDialogClass; private Class chartPropertyPaneClass; private Class newFormAction; private Class formParaDesigner; private Class paraPropertyPane; private Class formHierarchyPaneCls; private Class widgetPropertyPane; private Class buttonDetailPaneClass; private java.util.List parameterReaderList; public static void registerHyperlinkGroupType(HyperlinkGroupType hyperlinkGroupType) { instance.hyperlinkGroupType = hyperlinkGroupType; } public static HyperlinkGroupType getHyperlinkGroupType() { return instance.hyperlinkGroupType; } public static void registerCreators4Hyperlink(NameableCreator[] nameableCreators) { instance.creators4Hyperlink = nameableCreators; } public static NameableCreator[] getCreators4Hyperlink() { return instance.creators4Hyperlink; } public static void registerExtraWidgetOptions(WidgetOption[] options) { instance.extraOptions = options; } public static WidgetOption[] getExtraWidgetOptions() { if (instance.extraOptions == null) { instance.extraOptions = new WidgetOption[0]; } return instance.extraOptions; } public static void registerChartEditorClass(Class cls) { instance.chartEditorClass = cls; } public static Class getChartEditorClass() { return instance.chartEditorClass; } public static void registerChartComponentClass(Class bcc) { instance.chartComponentClass = bcc; } public static void registerChartDialogClass(Class cd) { instance.chartDialogClass = cd; } public static void registerChartPropertyPaneClass(Class p) { instance.chartPropertyPaneClass = p; } public static void registerNewFormActionClass(Class f) { instance.newFormAction = f; } public static Class getNewFormAction() { return instance.newFormAction; } public static void registerParaPropertyPaneClass(Class p) { instance.paraPropertyPane = p; } /** * 获取参数属性界面 * * @return 参数属性界面. */ public static Object getParaPropertyPane() { if (instance.paraPropertyPane != null) { try { return instance.paraPropertyPane.newInstance(); } catch (Exception e) { FRContext.getLogger().error("Error in Para PropertyPane"); } } return null; } public static void registerFormParaDesignerClass(Class f) { instance.formParaDesigner = f; } public static ParameterDesignerProvider getFormParaDesigner() { if (instance.formParaDesigner != null) { try { return (ParameterDesignerProvider) instance.formParaDesigner.newInstance(); } catch (Exception e) { FRContext.getLogger().error("error in form para designer"); } } return null; } public static void registerFormHierarchyPaneClass(Class fClass) { instance.formHierarchyPaneCls = fClass; } public static HierarchyTreePane getFormHierarchyPane() { return StableUtils.getInstance(instance.formHierarchyPaneCls); } public static void registerWidgetPropertyPaneClass(Class wp) { instance.widgetPropertyPane = wp; } public static BaseWidgetPropertyPane getWidgetPropertyPane(BaseFormDesigner fd) { BaseWidgetPropertyPane wp = null; if (instance.widgetPropertyPane != null) { wp = StableUtils.getInstance(instance.widgetPropertyPane); wp.setEditingFormDesigner(fd); wp.refreshDockingView(); } return wp; } public static MiddleChartComponent getChartComponent(BaseChartCollection collection) { MiddleChartComponent bcc = null; if (instance.chartComponentClass != null) { try { bcc = instance.chartComponentClass.newInstance(); bcc.populate(collection); } catch (InstantiationException e) { FRContext.getLogger().error("Error in ChartComponent instant", e); } catch (IllegalAccessException e) { FRContext.getLogger().error("Error in Access", e); } } return bcc; } /** * kunsnat: 初始化图表向导对话框, 调用静态方法showWindow, 参数window. * * @return 返回调出的ChartDailog */ public static MiddleChartDialog getChartDialog(Window window) { try { Constructor c; if (window instanceof Frame) { c = instance.chartDialogClass.getConstructor(Frame.class); } else { c = instance.chartDialogClass.getConstructor(Dialog.class); } return c.newInstance(window); } catch (Exception e) { FRContext.getLogger().error(e.getMessage(), e); } return null; } /** * kunsnat: 获取图表属性界面 * * @return 返回界面. */ public static BaseChartPropertyPane getChartPropertyPane() { BaseChartPropertyPane bp = null; if (instance.chartPropertyPaneClass != null) { bp = StableUtils.getInstance(instance.chartPropertyPaneClass); } return bp; } public static void clearChartPropertyPane() { if (instance.chartPropertyPaneClass != null) { StableUtils.clearInstance(instance.chartPropertyPaneClass); } } public static void registerButtonDetailPaneClass(Class clazz) { instance.buttonDetailPaneClass = clazz; } public static Class getButtonDetailPaneClass() { return instance.buttonDetailPaneClass; } public static void registerParameterReader(ParameterReader reader) { if (instance.parameterReaderList == null) { instance.parameterReaderList = new ArrayList(); } instance.parameterReaderList.add(reader); } public static ParameterReader[] getParameterReaders() { if (instance.parameterReaderList == null) { return new ParameterReader[0]; } return instance.parameterReaderList.toArray(new ParameterReader[instance.parameterReaderList.size()]); } } \ No newline at end of file diff --git a/designer_base/src/com/fr/design/selection/QuickEditor.java b/designer_base/src/com/fr/design/selection/QuickEditor.java index 9ca62f88d..1d46af929 100644 --- a/designer_base/src/com/fr/design/selection/QuickEditor.java +++ b/designer_base/src/com/fr/design/selection/QuickEditor.java @@ -41,6 +41,14 @@ public abstract class QuickEditor extends JComponent protected abstract void refresh(); + + /** + * for 关闭时候释放 + */ + public void release () { + tc = null; + } + public static QuickEditor DEFAULT_EDITOR = new QuickEditor() { @Override diff --git a/designer_base/src/com/fr/env/RemoteEnv.java b/designer_base/src/com/fr/env/RemoteEnv.java index 31b211e67..ce7118e69 100644 --- a/designer_base/src/com/fr/env/RemoteEnv.java +++ b/designer_base/src/com/fr/env/RemoteEnv.java @@ -31,8 +31,7 @@ import com.fr.plugin.Plugin; import com.fr.plugin.PluginLicense; import com.fr.plugin.PluginLicenseManager; import com.fr.plugin.PluginLoader; -import com.fr.plugin.dependence.PluginServiceCreator; -import com.fr.plugin.dependence.PluginServiceManager; +import com.fr.share.ShareConstants; import com.fr.stable.*; import com.fr.stable.file.XMLFileManagerProvider; import com.fr.stable.project.ProjectConstants; @@ -2106,4 +2105,108 @@ public class RemoteEnv implements Env { public void checkAndRegisterLic(FileNode node, Plugin plugin) throws Exception { } + + @Override + public File[] loadREUFile() throws Exception { + File target = new File(CacheManager.getProviderInstance().getCacheDirectory(), + ShareConstants.DIR_SHARE_CACHE); + StableUtils.deleteFile(target); + StableUtils.mkdirs(target); + File cacheDir = null; + File zip = null; + try { + HashMap para = new HashMap(); + para.put("op", "fr_remote_design"); + para.put("cmd", "design_read_reufile"); + para.put("current_uid", this.createUserID()); + para.put("currentUsername", this.getUser()); + + HttpClient client = createHttpMethod(para); + InputStream input = client.getResponseStream(); + zip = new File(StableUtils.pathJoin(CacheManager.getProviderInstance().getCacheDirectory().getAbsolutePath()), "share.zip"); + cacheDir = new File(StableUtils.pathJoin(CacheManager.getProviderInstance().getCacheDirectory().getAbsolutePath()), ShareConstants.DIR_SHARE_CACHE); + StableUtils.deleteFile(cacheDir); + StableUtils.mkdirs(cacheDir); + StableUtils.makesureFileExist(zip); + FileOutputStream out = new FileOutputStream(zip); + IOUtils.copyBinaryTo(input, out); + out.flush(); + out.close(); + IOUtils.unzip(zip, cacheDir.getAbsolutePath(), EncodeConstants.ENCODING_GBK);//先解压到临时目录 + if (cacheDir.exists() && cacheDir.isDirectory()) { + return cacheDir.listFiles(new FilenameFilter() { + public boolean accept(File file, String s) { + return s.endsWith("reu"); + } + }); + } + + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage()); + } finally { + StableUtils.deleteFile(zip); + } + return new File[0]; + } + + @Override + public boolean installREUFile(File reuFile) { +// if (reuFile == null) { +// return false; +// } +// try { +// HashMap para = new HashMap(); +// para.put("op", "fr_remote_design"); +// para.put("cmd", "design_install_reufile"); +// para.put("current_uid", this.createUserID()); +// para.put("currentUsername", this.getUser()); +// para.put("reuFileName", reuFile.getName()); +// +// HttpClient client = createHttpMethod(para); +// client.setContent(IOUtils.inputStream2Bytes(new FileInputStream(reuFile))); +// InputStream input = execute4InputStream(client); +// return ComparatorUtils.equals(stream2String(input), "true"); +// } catch (Exception e) { +// return false; +// } + return false; + } + + @Override + public boolean removeREUFilesByName(String fileName) { + if (StringUtils.isEmpty(fileName)) { + return true; + } + try { + HashMap para = new HashMap(); + para.put("op", "fr_remote_design"); + para.put("cmd", "design_remove_reufile"); + para.put("current_uid", this.createUserID()); + para.put("currentUsername", this.getUser()); + para.put("reuFileName", fileName); + + HttpClient client = createHttpMethod(para); + InputStream input = execute4InputStream(client); + return ComparatorUtils.equals(stream2String(input), "true"); + } catch (Exception e) { + return false; + } + } + + @Override + public String getSharePath() { + try { + HashMap para = new HashMap(); + para.put("op", "fr_remote_design"); + para.put("cmd", "design_get_share_path"); + para.put("current_uid", this.createUserID()); + para.put("currentUsername", this.getUser()); + + HttpClient client = createHttpMethod(para); + InputStream input = execute4InputStream(client); + return stream2String(input); + } catch (Exception e) { + return StringUtils.EMPTY; + } + } } \ No newline at end of file diff --git a/designer_base/src/com/fr/start/BaseDesigner.java b/designer_base/src/com/fr/start/BaseDesigner.java index 947e750a0..a76ec5f53 100644 --- a/designer_base/src/com/fr/start/BaseDesigner.java +++ b/designer_base/src/com/fr/start/BaseDesigner.java @@ -248,7 +248,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { }); df.setVisible(true); } catch (Exception e) { - FRLogger.getLogger().error(e.getMessage()); + FRLogger.getLogger().error(e.getMessage(), e); if (!isException) { showDesignerFrame(args, df, true); } else { diff --git a/designer_chart/build.dev.gradle b/designer_chart/build.dev.gradle new file mode 100644 index 000000000..ba6df992b --- /dev/null +++ b/designer_chart/build.dev.gradle @@ -0,0 +1,66 @@ + +apply plugin: 'java' +tasks.withType(JavaCompile){ + options.encoding = 'UTF-8' +} +//指定构建的jdk版本 +sourceCompatibility=1.7 +//指定生成jar包的版本 +version='8.0' + +def srcDir="." + +//对生成的jar包进行重命名 + +jar{ + baseName='fr-designer-chart' +} + +sourceSets{ + main{ + java{ + srcDirs=["${srcDir}/src"] + } + } +} +FileTree files =fileTree(dir:'./',include:'build.*.gradle') +def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf ('\\')) +buildDir=buildDir.substring(0,buildDir.lastIndexOf ('\\')) +def branchName=buildDir.substring(buildDir.lastIndexOf ('\\')+1) + +//指定外部依赖 +dependencies{ +compile fileTree(dir:"../../../finereport-lib-stable/${branchName}",include:'**/*.jar') +compile fileTree(dir:'../../../',include:"finereport-*-stable/${branchName}/**/build/libs/*.jar") + + testCompile 'junit:junit:4.12' +} +//将非.java 文件复制到classes文件夹下参与打包 +task copyFile(type:Copy,dependsOn:compileJava){ + copy{ + from ("${srcDir}/src"){ + exclude '**/.setting/**','.classpath','.project','**/*.java','**/*.db','**/*.g','**/package.html' + + } + into 'build/classes/main' + } + +} + +//压缩项目中的js文件 +task compressJS{ + ant.taskdef(name:'yuicompress',classname:'com.yahoo.platform.yui.compressor.YUICompressTask'){ + classpath { + fileset(dir:'../../../finereport-lib4build-stable',includes:'**/*.jar') + } + } + ant.yuicompress(linebreak:"500",warn:"false", munge:"yes",preserveallsemicolons:"false",charset:"utf-8",encoding:"utf-8",outputfolder:'build/classes/main'){ + fileset (dir:"${srcDir}/src"){ + include (name:'**/*.js') + include (name:'**/*.css') + } + + } +} +jar.dependsOn compressJS + diff --git a/designer_chart/build.release.gradle b/designer_chart/build.release.gradle new file mode 100644 index 000000000..e97176e24 --- /dev/null +++ b/designer_chart/build.release.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/master',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 + diff --git a/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java b/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java index 2dfb2b8cd..0b76dd2d7 100644 --- a/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java @@ -21,10 +21,7 @@ import com.fr.design.mainframe.chart.gui.data.table.AbstractTableDataContentPane import com.fr.design.module.DesignModuleFactory; import com.fr.file.XMLFileManager; import com.fr.form.ui.ChartEditor; -import com.fr.general.FRLogger; -import com.fr.general.GeneralContext; -import com.fr.general.IOUtils; -import com.fr.general.Inter; +import com.fr.general.*; import com.fr.plugin.PluginCollector; import com.fr.plugin.PluginLicenseManager; import com.fr.plugin.PluginMessage; @@ -38,10 +35,7 @@ import com.fr.stable.xml.XMLPrintWriter; import com.fr.stable.xml.XMLableReader; import javax.swing.*; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Created by eason on 14/12/29. @@ -54,13 +48,13 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh private static ClassLoader loader = Thread.currentThread().getContextClassLoader(); private static ChartTypeInterfaceManager classManager = null; - - private static LinkedHashMap chartTypeInterfaces = new LinkedHashMap(); + private static LinkedHashMap> chartTypeInterfaces = new LinkedHashMap>(); public synchronized static ChartTypeInterfaceManager getInstance() { if (classManager == null) { classManager = new ChartTypeInterfaceManager(); chartTypeInterfaces.clear(); + classManager.readDefault(); } return classManager; } @@ -77,7 +71,6 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh GeneralContext.addPluginReadListener(new PluginReadListener() { @Override public void success() { - ChartTypeInterfaceManager.getInstance().readDefault(); //重新注册designModuleFactory DesignModuleFactory.registerExtraWidgetOptions(initWidgetOption()); } @@ -88,23 +81,43 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstance().getAllChartBaseNames(); ChartWidgetOption[] child = new ChartWidgetOption[typeName.length]; + final Chart[][] allCharts = new Chart[typeName.length][]; for (int i = 0; i < typeName.length; i++) { String plotID = typeName[i].getPlotID(); Chart[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID); if(rowChart == null) { continue; } - - //初始化图表模型图片 - initChartsDemoImage(rowChart); - String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(plotID); Icon icon = IOUtils.readIcon(iconPath); child[i] = new ChartWidgetOption(Inter.getLocText(typeName[i].getName()), icon, ChartEditor.class, rowChart[0]); + + allCharts[i] = rowChart; } + + //异步加载图片 + new Thread(new Runnable() { + @Override + public void run() { + initAllChartsDemoImage(allCharts); + } + }).start(); + return child; } + //加载所有图表图片 + private static void initAllChartsDemoImage(Chart[][] allCharts){ + for (int i = 0; i < allCharts.length; i++) { + Chart[] rowChart = allCharts[i]; + if(rowChart == null) { + continue; + } + //加载初始化图表模型图片 + initChartsDemoImage(rowChart); + } + } + private static void initChartsDemoImage(Chart[] rowChart) { int rowChartsCount = rowChart.length; for (int j = 0; j < rowChartsCount; j++) { @@ -118,36 +131,67 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh } private static void readDefault() { - chartTypeInterfaces.put(ChartConstants.COLUMN_CHART, new ColumnIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.LINE_CHART, new LineIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.BAR_CHART, new BarIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.PIE_CHART, new PieIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.AREA_CHART, new AreaIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.SCATTER_CHART, new XYScatterIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.BUBBLE_CHART, new BubbleIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.RADAR_CHART, new RadarIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.STOCK_CHART, new StockIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.METER_CHART, new MeterIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.RANGE_CHART, new RangeIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.CUSTOM_CHART, new CustomIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.GANTT_CHART, new GanttIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.DONUT_CHART, new DonutIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.MAP_CHART, new MapIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.GIS_CHAER, new GisMapIndependentChartInterface()); - chartTypeInterfaces.put(ChartConstants.FUNNEL_CHART, new FunnelIndependentChartInterface()); + if (chartTypeInterfaces.containsKey(ChartTypeManager.CHART_PRIORITY)){ + return; + } + LinkedHashMap chartUIList = new LinkedHashMap(); + chartUIList.put(ChartConstants.COLUMN_CHART, new ColumnIndependentChartInterface()); + chartUIList.put(ChartConstants.LINE_CHART, new LineIndependentChartInterface()); + chartUIList.put(ChartConstants.BAR_CHART, new BarIndependentChartInterface()); + chartUIList.put(ChartConstants.PIE_CHART, new PieIndependentChartInterface()); + chartUIList.put(ChartConstants.AREA_CHART, new AreaIndependentChartInterface()); + chartUIList.put(ChartConstants.SCATTER_CHART, new XYScatterIndependentChartInterface()); + chartUIList.put(ChartConstants.BUBBLE_CHART, new BubbleIndependentChartInterface()); + chartUIList.put(ChartConstants.RADAR_CHART, new RadarIndependentChartInterface()); + chartUIList.put(ChartConstants.STOCK_CHART, new StockIndependentChartInterface()); + chartUIList.put(ChartConstants.METER_CHART, new MeterIndependentChartInterface()); + chartUIList.put(ChartConstants.RANGE_CHART, new RangeIndependentChartInterface()); + chartUIList.put(ChartConstants.CUSTOM_CHART, new CustomIndependentChartInterface()); + chartUIList.put(ChartConstants.GANTT_CHART, new GanttIndependentChartInterface()); + chartUIList.put(ChartConstants.DONUT_CHART, new DonutIndependentChartInterface()); + chartUIList.put(ChartConstants.MAP_CHART, new MapIndependentChartInterface()); + chartUIList.put(ChartConstants.GIS_CHAER, new GisMapIndependentChartInterface()); + chartUIList.put(ChartConstants.FUNNEL_CHART, new FunnelIndependentChartInterface()); + + chartTypeInterfaces.put(ChartTypeManager.CHART_PRIORITY, chartUIList); } public String getIconPath(String plotID) { - if (chartTypeInterfaces.get(plotID) != null) { - return chartTypeInterfaces.get(plotID).getIconPath(); + if (chartTypeInterfaces != null) { + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = (Map.Entry) iterator.next(); + String priority = (String) entry.getKey(); + String imagePath = getIconPath(priority, plotID); + if (!StringUtils.isEmpty(imagePath)) { + return imagePath; + } + } + } + return StringUtils.EMPTY; + } + + private String getIconPath(String priority, String plotID) { + if (chartTypeInterfaces.get(priority) != null && chartTypeInterfaces.get(priority).get(plotID) != null) { + return chartTypeInterfaces.get(priority).get(plotID).getIconPath(); }else { return StringUtils.EMPTY; } } - public static void addChartTypeInterface(IndependentChartUIProvider provider, String plotID) { - if (chartTypeInterfaces != null && !chartTypeInterfaces.containsKey(plotID)) { - chartTypeInterfaces.put(plotID, provider); + public static void addChartTypeInterface(IndependentChartUIProvider provider, String priority, String plotID) { + if (chartTypeInterfaces != null){ + if (!chartTypeInterfaces.containsKey(priority)){ + //新建一个具体图表列表 + LinkedHashMap chartUIList = new LinkedHashMap(); + chartUIList.put(plotID, provider); + chartTypeInterfaces.put(priority, chartUIList); + }else { + LinkedHashMap chartUIList = chartTypeInterfaces.get(priority); + if (!chartUIList.containsKey(plotID)) { + chartUIList.put(plotID, provider); + } + } } } @@ -157,7 +201,7 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh * @param className 类名 * @param plotID 标志ID */ - public void addChartInterface(String className, String plotID, PluginSimplify simplify) { + public void addChartInterface(String className, String priority, String plotID, PluginSimplify simplify) { if (StringUtils.isNotBlank(className)) { try { Class clazz = Class.forName(className); @@ -169,7 +213,7 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh if (PluginCollector.getCollector().isError(provider, IndependentChartUIProvider.CURRENT_API_LEVEL, simplify.getPluginName()) || !containsChart(plotID)) { PluginMessage.remindUpdate(className); } else { - ChartTypeInterfaceManager.getInstance().addChartTypeInterface(provider, plotID); + ChartTypeInterfaceManager.getInstance().addChartTypeInterface(provider, priority, plotID); } } catch (ClassNotFoundException e) { FRLogger.getLogger().error("class not found:" + e.getMessage()); @@ -184,44 +228,221 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh return ChartTypeManager.getInstance().containsPlot(plotID); } + /** * 把所有的pane加到list里 * * @param paneList pane容器 */ public void addPlotTypePaneList(List> paneList) { + List priorityList = getPriorityInOrder(); + for (int i = 0; i < priorityList.size(); i++){ + String priority = String.valueOf(priorityList.get(i)); + Iterator chartUIIterator = chartTypeInterfaces.get(priority).entrySet().iterator(); + while (chartUIIterator.hasNext()) { + Map.Entry chartUIEntry = (Map.Entry) chartUIIterator.next(); + IndependentChartUIProvider provider = (IndependentChartUIProvider) chartUIEntry.getValue(); + paneList.add(provider.getPlotTypePane()); + } + } + } + + public String[] getTitle4PopupWindow(String priority){ + if (priority.isEmpty()){ + return getTitle4PopupWindow(); + } + String[] names = new String[getChartSize(priority)]; + if (chartTypeInterfaces != null && chartTypeInterfaces.containsKey(priority)){ + HashMap chartUIList = chartTypeInterfaces.get(priority); + Iterator iterator = chartUIList.entrySet().iterator(); + int i = 0; + while (iterator.hasNext()){ + Map.Entry entry = (Map.Entry) iterator.next(); + IndependentChartUIProvider provider = (IndependentChartUIProvider) entry.getValue(); + names[i++] = provider.getPlotTypePane().title4PopupWindow(); + } + return names; + } + return new String[0]; + } + + /** + * 获取指定图表的标题 + * @param priority + * @return + */ + public String getTitle4PopupWindow(String priority, String plotID){ + if (chartTypeInterfaces != null && chartTypeInterfaces.containsKey(priority) && chartTypeInterfaces.get(priority).containsKey(plotID)){ + HashMap chartUIList = chartTypeInterfaces.get(priority); + IndependentChartUIProvider provider = chartTypeInterfaces.get(priority).get(plotID); + return provider.getPlotTypePane().title4PopupWindow(); + + } + return new String(); + } + + private String[] getTitle4PopupWindow(){ + List priorityList = getPriorityInOrder(); + if (priorityList.size() == 0){ + return new String[0]; + } + + int size = 0; + //获取总得图表格式 + for (int i = 0; i < priorityList.size(); i++) { + size += getChartSize(String.valueOf(priorityList.get(i))); + } + String[] names = new String[size]; + + int index = 0; + for (int i = 0; i < priorityList.size(); i++){ + String priority = String.valueOf(priorityList.get(i)); + Iterator chartUI = chartTypeInterfaces.get(priority).entrySet().iterator(); + index = fetchNames(chartUI, names, index); + } + + return names; + } + + private List getPriorityInOrder() { + List priorityList = new ArrayList(); + if (chartTypeInterfaces != null) { + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = (Map.Entry) iterator.next(); + String priority = (String) entry.getKey(); + priorityList.add(Integer.valueOf(priority)); + } + } + return ChartTypeManager.orderInPriority(priorityList); + } + + private int fetchNames(Iterator chartUI, String[] names, int index) { + while (chartUI.hasNext()) { + Map.Entry chartUIEntry = (Map.Entry) chartUI.next(); + IndependentChartUIProvider provider = (IndependentChartUIProvider) chartUIEntry.getValue(); + names[index++] = provider.getPlotTypePane().title4PopupWindow(); + } + return index; + } + + public ChartDataPane getChartDataPane(String plotID, AttributeChangeListener listener) { Iterator iterator = chartTypeInterfaces.entrySet().iterator(); - while (iterator.hasNext()) { + while (iterator.hasNext()){ Map.Entry entry = (Map.Entry) iterator.next(); - IndependentChartUIProvider creator = (IndependentChartUIProvider) entry.getValue(); - paneList.add(creator.getPlotTypePane()); + String priority = (String) entry.getKey(); + if (plotInChart(plotID, priority)) { + return getChartDataPane(priority, plotID, listener); + } } + return getChartDataPane(ChartTypeManager.CHART_PRIORITY, plotID, listener); + } + private ChartDataPane getChartDataPane(String priority, String plotID, AttributeChangeListener listener) { + return chartTypeInterfaces.get(priority).get(plotID).getChartDataPane(listener); } - public ChartDataPane getChartDataPane(String plotID, AttributeChangeListener listener) { - return chartTypeInterfaces.get(plotID).getChartDataPane(listener); + /** + * 获取对应ID的图表数量 + * @param key + * @return + */ + private int getChartSize(String key){ + if (chartTypeInterfaces != null && chartTypeInterfaces.containsKey(key)){ + return chartTypeInterfaces.get(key).size(); + } + return 0; } public AbstractChartAttrPane[] getAttrPaneArray(String plotID, AttributeChangeListener listener) { - return chartTypeInterfaces.get(plotID).getAttrPaneArray(listener); + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); + while (iterator.hasNext()){ + Map.Entry entry = (Map.Entry) iterator.next(); + String priority = (String) entry.getKey(); + if (plotInChart(plotID, priority)) { + return getAttrPaneArray(priority, plotID, listener); + } + } + return getAttrPaneArray(ChartTypeManager.CHART_PRIORITY, plotID, listener); + } + + private AbstractChartAttrPane[] getAttrPaneArray(String priority, String plotID, AttributeChangeListener listener) { + return chartTypeInterfaces.get(priority).get(plotID).getAttrPaneArray(listener); } public AbstractTableDataContentPane getTableDataSourcePane(Plot plot, ChartDataPane parent) { - return chartTypeInterfaces.get(plot.getPlotID()).getTableDataSourcePane(plot, parent); + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); + while (iterator.hasNext()){ + Map.Entry entry = (Map.Entry) iterator.next(); + String priority = (String) entry.getKey(); + if (plotInChart(plot.getPlotID(), priority)) { + return getTableDataSourcePane(priority, plot, parent); + } + } + return getTableDataSourcePane(ChartTypeManager.CHART_PRIORITY, plot, parent); } + private AbstractTableDataContentPane getTableDataSourcePane(String priority, Plot plot, ChartDataPane parent) { + return chartTypeInterfaces.get(priority).get(plot.getPlotID()).getTableDataSourcePane(plot, parent); + } + + public AbstractReportDataContentPane getReportDataSourcePane(Plot plot, ChartDataPane parent) { - return chartTypeInterfaces.get(plot.getPlotID()).getReportDataSourcePane(plot, parent); + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); + while (iterator.hasNext()){ + Map.Entry entry = (Map.Entry) iterator.next(); + String priority = (String) entry.getKey(); + String plotID = plot.getPlotID(); + if (plotInChart(plotID, priority)) { + return getReportDataSourcePane(priority, plot, parent); + } + } + return getReportDataSourcePane(ChartTypeManager.CHART_PRIORITY, plot, parent); } + private boolean plotInChart(String plotID, String priority) { + return chartTypeInterfaces != null + && chartTypeInterfaces.containsKey(priority) + && chartTypeInterfaces.get(priority).containsKey(plotID); + } + + private AbstractReportDataContentPane getReportDataSourcePane(String priority, Plot plot, ChartDataPane parent) { + return chartTypeInterfaces.get(priority).get(plot.getPlotID()).getReportDataSourcePane(plot, parent); + } + + public ConditionAttributesPane getPlotConditionPane(Plot plot) { - return chartTypeInterfaces.get(plot.getPlotID()).getPlotConditionPane(plot); + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); + while (iterator.hasNext()){ + Map.Entry entry = (Map.Entry) iterator.next(); + String priority = (String) entry.getKey(); + if (plotInChart(plot.getPlotID(), priority)) { + return getPlotConditionPane(priority, plot); + } + } + return getPlotConditionPane(ChartTypeManager.CHART_PRIORITY, plot); + } + + private ConditionAttributesPane getPlotConditionPane(String priority, Plot plot) { + return chartTypeInterfaces.get(priority).get(plot.getPlotID()).getPlotConditionPane(plot); } + public BasicBeanPane getPlotSeriesPane(ChartStylePane parent, Plot plot) { - return chartTypeInterfaces.get(plot.getPlotID()).getPlotSeriesPane(parent, plot); + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); + while (iterator.hasNext()){ + Map.Entry entry = (Map.Entry) iterator.next(); + String priority = (String) entry.getKey(); + if (plotInChart(plot.getPlotID(), priority)) { + return getPlotSeriesPane(priority, parent, plot); + } + } + return getPlotSeriesPane(ChartTypeManager.CHART_PRIORITY, parent, plot); + } + + private BasicBeanPane getPlotSeriesPane(String priority, ChartStylePane parent, Plot plot) { + return chartTypeInterfaces.get(priority).get(plot.getPlotID()).getPlotSeriesPane(parent, plot); } /** @@ -231,9 +452,22 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh * @return 是否使用默认的界面 */ public boolean isUseDefaultPane(String plotID) { + Iterator iterator = chartTypeInterfaces.entrySet().iterator(); + while (iterator.hasNext()){ + Map.Entry entry = (Map.Entry) iterator.next(); + String priority = (String) entry.getKey(); + if (chartTypeInterfaces.get(priority).containsKey(plotID)){ + return isUseDefaultPane(priority, plotID); + } + } + + return true; + } + + private boolean isUseDefaultPane(String priority, String plotID){ - if (chartTypeInterfaces.containsKey(plotID)) { - return chartTypeInterfaces.get(plotID).isUseDefaultPane(); + if (chartTypeInterfaces.containsKey(priority) && chartTypeInterfaces.get(priority).containsKey(plotID)) { + return chartTypeInterfaces.get(priority).get(plotID).isUseDefaultPane(); } return true; @@ -251,7 +485,7 @@ public class ChartTypeInterfaceManager extends XMLFileManager implements ExtraCh extraChartDesignInterfaceList.add(tagName); } if (IndependentChartUIProvider.XML_TAG.equals(tagName)) { - addChartInterface(reader.getAttrAsString("class", ""), reader.getAttrAsString("plotID", ""), simplify); + addChartInterface(reader.getAttrAsString("class", ""), reader.getAttrAsString("priority", ChartTypeManager.DEFAULT_PRIORITY),reader.getAttrAsString("plotID", ""), simplify); } } } diff --git a/designer_chart/src/com/fr/design/chart/ChartPlotFactory.java b/designer_chart/src/com/fr/design/chart/ChartPlotFactory.java index 48e018a59..aeb780add 100644 --- a/designer_chart/src/com/fr/design/chart/ChartPlotFactory.java +++ b/designer_chart/src/com/fr/design/chart/ChartPlotFactory.java @@ -72,7 +72,7 @@ public class ChartPlotFactory { .setAxisPaneCls(XYChartStyleAxisPane.class) .setDataLabelPaneClass(XYDataLabelPane.class)); map.put(FunnelPlot.class.getName(), new FactoryObject() - .setDataLabelPaneClass(PieDataLabelPane.class)); + .setDataLabelPaneClass(FunnelDataLabelPane.class)); } private ChartPlotFactory() { diff --git a/designer_chart/src/com/fr/design/chart/fun/impl/AbstractIndependentChartUIWithAPILevel.java b/designer_chart/src/com/fr/design/chart/fun/impl/AbstractIndependentChartUIWithAPILevel.java index ffe91cd0d..6c7ba66d8 100644 --- a/designer_chart/src/com/fr/design/chart/fun/impl/AbstractIndependentChartUIWithAPILevel.java +++ b/designer_chart/src/com/fr/design/chart/fun/impl/AbstractIndependentChartUIWithAPILevel.java @@ -15,7 +15,7 @@ import com.fr.general.ComparatorUtils; * Created by Mitisky on 16/3/7. */ public abstract class AbstractIndependentChartUIWithAPILevel implements IndependentChartUIProvider { - private static final int OLD_PLUGIN_LEVEL = -2; + private static final int OLD_PLUGIN_LEVEL = 3; @Override //以前的插件没有覆写这个方法,所以始终获取到-2,比当前level低,提示更新. diff --git a/designer_chart/src/com/fr/design/chart/gui/ChartComponent.java b/designer_chart/src/com/fr/design/chart/gui/ChartComponent.java index 9b4a91f1a..5ce350450 100644 --- a/designer_chart/src/com/fr/design/chart/gui/ChartComponent.java +++ b/designer_chart/src/com/fr/design/chart/gui/ChartComponent.java @@ -311,11 +311,11 @@ public class ChartComponent extends MiddleChartComponent implements MouseListene } else { chartGlyph.setBounds(new Rectangle2D.Double(0, 0, chartWidth, chartHeight)); } - // chartGlyph.draw(g2d, ScreenResolution.getScreenResolution()); + //不直接画chartGlyph而画image的原因是表单的柱形图会溢出表单 //其他图都ok,其实感觉应该是柱形图画的不对,应该也可以改那边 //处理画图事件 - Image chartImage = chartGlyph.toImage(chartWidth,chartHeight,ScreenResolution.getScreenResolution(), this); + Image chartImage = chartGlyph.toImage(chartWidth,chartHeight,ScreenResolution.getScreenResolution(), this, null); g2d.drawImage(chartImage, 0, 0, null); } } diff --git a/designer_chart/src/com/fr/design/chart/gui/active/DataSeriesActiveGlyph.java b/designer_chart/src/com/fr/design/chart/gui/active/DataSeriesActiveGlyph.java index 0543764e3..ea3fab977 100644 --- a/designer_chart/src/com/fr/design/chart/gui/active/DataSeriesActiveGlyph.java +++ b/designer_chart/src/com/fr/design/chart/gui/active/DataSeriesActiveGlyph.java @@ -6,8 +6,8 @@ import com.fr.base.chart.Glyph; import com.fr.chart.chartglyph.DataSeries; import com.fr.chart.chartglyph.PlotGlyph; import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.module.DesignModuleFactory; /** * Created by IntelliJ IDEA. @@ -35,8 +35,8 @@ public class DataSeriesActiveGlyph extends ActiveGlyph { if(chartComponent.getEditingChart() == null) { return; } - - ChartEditPane.getInstance().GoToPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_SERIES_TITLE); + + DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_SERIES_TITLE); } @Override diff --git a/designer_chart/src/com/fr/design/chart/gui/active/action/SetAnalysisLineStyleAction.java b/designer_chart/src/com/fr/design/chart/gui/active/action/SetAnalysisLineStyleAction.java index b4ca9a1c8..bac286c87 100644 --- a/designer_chart/src/com/fr/design/chart/gui/active/action/SetAnalysisLineStyleAction.java +++ b/designer_chart/src/com/fr/design/chart/gui/active/action/SetAnalysisLineStyleAction.java @@ -3,8 +3,8 @@ package com.fr.design.chart.gui.active.action; import java.awt.event.ActionEvent; import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.module.DesignModuleFactory; import com.fr.general.Inter; public class SetAnalysisLineStyleAction extends ChartComponentAction{ @@ -20,7 +20,7 @@ public class SetAnalysisLineStyleAction extends ChartComponentAction{ } public void showAnalysisLineStylePane(){ - ChartEditPane.getInstance().GoToPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_LINE_TITLE); + DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_LINE_TITLE); } diff --git a/designer_chart/src/com/fr/design/chart/gui/active/action/SetAxisStyleAction.java b/designer_chart/src/com/fr/design/chart/gui/active/action/SetAxisStyleAction.java index 26484bfb5..60893c6fc 100644 --- a/designer_chart/src/com/fr/design/chart/gui/active/action/SetAxisStyleAction.java +++ b/designer_chart/src/com/fr/design/chart/gui/active/action/SetAxisStyleAction.java @@ -3,8 +3,8 @@ package com.fr.design.chart.gui.active.action; import java.awt.event.ActionEvent; import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.module.DesignModuleFactory; import com.fr.general.Inter; import com.fr.stable.StringUtils; @@ -27,7 +27,7 @@ public class SetAxisStyleAction extends ChartComponentAction { public void showAxisStylePane() { String axisType = getActiveAxisGlyph() == null ? StringUtils.EMPTY : getActiveAxisGlyph().getAxisType(); - - ChartEditPane.getInstance().GoToPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_AXIS_TITLE, axisType); + + DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_AXIS_TITLE, axisType); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/chart/gui/active/action/SetChartStyleAciton.java b/designer_chart/src/com/fr/design/chart/gui/active/action/SetChartStyleAciton.java index b3effe37a..6d4ef617f 100644 --- a/designer_chart/src/com/fr/design/chart/gui/active/action/SetChartStyleAciton.java +++ b/designer_chart/src/com/fr/design/chart/gui/active/action/SetChartStyleAciton.java @@ -3,8 +3,8 @@ package com.fr.design.chart.gui.active.action; import java.awt.event.ActionEvent; import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.module.DesignModuleFactory; import com.fr.general.Inter; /** @@ -26,6 +26,6 @@ public class SetChartStyleAciton extends ChartComponentAction { } public void showChartStylePane() { - ChartEditPane.getInstance().GoToPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_AREA_TITLE, PaneTitleConstants.CHART_STYLE_AREA_AREA_TITLE); + DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_AREA_TITLE, PaneTitleConstants.CHART_STYLE_AREA_AREA_TITLE); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataLabelStyleAction.java b/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataLabelStyleAction.java index e565d8e16..bce590ab2 100644 --- a/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataLabelStyleAction.java +++ b/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataLabelStyleAction.java @@ -3,8 +3,8 @@ package com.fr.design.chart.gui.active.action; import java.awt.event.ActionEvent; import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.module.DesignModuleFactory; import com.fr.general.Inter; public class SetDataLabelStyleAction extends ChartComponentAction{ @@ -20,7 +20,7 @@ public class SetDataLabelStyleAction extends ChartComponentAction{ } public void showDataLabelStylePane() { - ChartEditPane.getInstance().GoToPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_LABEL_TITLE); + DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_LABEL_TITLE); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSeriesAttrAction.java b/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSeriesAttrAction.java index 96480ebd8..0ca8924d4 100644 --- a/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSeriesAttrAction.java +++ b/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSeriesAttrAction.java @@ -3,8 +3,8 @@ package com.fr.design.chart.gui.active.action; import java.awt.event.ActionEvent; import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.module.DesignModuleFactory; import com.fr.general.Inter; /** @@ -21,6 +21,6 @@ public class SetDataSeriesAttrAction extends ChartComponentAction { } public void actionPerformed(ActionEvent e) { - ChartEditPane.getInstance().GoToPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_SERIES_TITLE); + DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_SERIES_TITLE); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSheetAction.java b/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSheetAction.java index 6aedd01b1..23258796d 100644 --- a/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSheetAction.java +++ b/designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSheetAction.java @@ -3,8 +3,8 @@ package com.fr.design.chart.gui.active.action; import java.awt.event.ActionEvent; import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.module.DesignModuleFactory; import com.fr.general.Inter; /** @@ -28,6 +28,6 @@ public class SetDataSheetAction extends ChartComponentAction { } public void showDataSheetStylePane() { - ChartEditPane.getInstance().GoToPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_DATA_TITLE); + DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_DATA_TITLE); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/chart/gui/active/action/SetLegendStyleAction.java b/designer_chart/src/com/fr/design/chart/gui/active/action/SetLegendStyleAction.java index 0a203db88..bc33e90fe 100644 --- a/designer_chart/src/com/fr/design/chart/gui/active/action/SetLegendStyleAction.java +++ b/designer_chart/src/com/fr/design/chart/gui/active/action/SetLegendStyleAction.java @@ -3,8 +3,8 @@ package com.fr.design.chart.gui.active.action; import java.awt.event.ActionEvent; import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.module.DesignModuleFactory; import com.fr.general.Inter; /** @@ -27,6 +27,6 @@ public class SetLegendStyleAction extends ChartComponentAction { } public void showLegendStylePane() { - ChartEditPane.getInstance().GoToPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_LEGNED_TITLE); + DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_LEGNED_TITLE); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/chart/gui/active/action/SetPlotStyleAction.java b/designer_chart/src/com/fr/design/chart/gui/active/action/SetPlotStyleAction.java index b49fb6ac6..686d8238c 100644 --- a/designer_chart/src/com/fr/design/chart/gui/active/action/SetPlotStyleAction.java +++ b/designer_chart/src/com/fr/design/chart/gui/active/action/SetPlotStyleAction.java @@ -3,8 +3,8 @@ package com.fr.design.chart.gui.active.action; import java.awt.event.ActionEvent; import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.module.DesignModuleFactory; import com.fr.general.Inter; /** @@ -27,6 +27,6 @@ public class SetPlotStyleAction extends ChartComponentAction { } public void showPlotPane() { - ChartEditPane.getInstance().GoToPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_AREA_TITLE, PaneTitleConstants.CHART_STYLE_AREA_PLOT_TITLE); + DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_AREA_TITLE, PaneTitleConstants.CHART_STYLE_AREA_PLOT_TITLE); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/chart/gui/active/action/SetTitleStyleAction.java b/designer_chart/src/com/fr/design/chart/gui/active/action/SetTitleStyleAction.java index f86f302a5..dc9a60575 100644 --- a/designer_chart/src/com/fr/design/chart/gui/active/action/SetTitleStyleAction.java +++ b/designer_chart/src/com/fr/design/chart/gui/active/action/SetTitleStyleAction.java @@ -3,8 +3,8 @@ package com.fr.design.chart.gui.active.action; import java.awt.event.ActionEvent; import com.fr.design.chart.gui.ChartComponent; -import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.module.DesignModuleFactory; import com.fr.general.Inter; /** @@ -27,6 +27,6 @@ public class SetTitleStyleAction extends ChartComponentAction { } public void showTitlePane() { - ChartEditPane.getInstance().GoToPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_TITLE_TITLE); + DesignModuleFactory.getChartPropertyPane().getChartEditPane().gotoPane(PaneTitleConstants.CHART_STYLE_TITLE, PaneTitleConstants.CHART_STYLE_TITLE_TITLE); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/chart/series/PlotSeries/MapCustomPane.java b/designer_chart/src/com/fr/design/chart/series/PlotSeries/MapCustomPane.java index be5fdad60..d844631c0 100644 --- a/designer_chart/src/com/fr/design/chart/series/PlotSeries/MapCustomPane.java +++ b/designer_chart/src/com/fr/design/chart/series/PlotSeries/MapCustomPane.java @@ -194,8 +194,13 @@ refreshAreaNameBox(); } List columnNameList = tableDataWrappe.calculateColumnNameList(); + Object oldSelected = areaString.getSelectedItem(); areaString.removeAllItems(); - areaString.setItemList(columnNameList); + + for(String item : columnNameList) { + areaString.addItem(item); + } + areaString.getModel().setSelectedItem(oldSelected); } /** diff --git a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesConditionPane.java b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesConditionPane.java index fe2107fb4..8ba1bb431 100644 --- a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesConditionPane.java +++ b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesConditionPane.java @@ -27,13 +27,22 @@ import java.util.Iterator; * Time : 上午9:16 */ public class DataSeriesConditionPane extends ConditionAttributesPane { + protected Plot plot; - - public DataSeriesConditionPane() { + public DataSeriesConditionPane(Plot plot) { + this.plot = plot; initAvailableActionList(); initComponents(); } + public void setPlot(Plot plot) { + this.plot = plot; + } + + public DataSeriesConditionPane() { + this(null); + } + private void initAvailableActionList() { addBasicAction(); addAxisPositionAction(); diff --git a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/TooltipContentsPane.java b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/TooltipContentsPane.java index 0be84de39..c8f2fe394 100644 --- a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/TooltipContentsPane.java +++ b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/TooltipContentsPane.java @@ -1,28 +1,23 @@ package com.fr.design.chart.series.SeriesCondition; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.text.Format; - -import javax.swing.JPanel; -import javax.swing.SwingUtilities; - import com.fr.chart.base.AttrContents; import com.fr.chart.base.ChartConstants; +import com.fr.design.dialog.BasicPane; +import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.dialog.BasicPane; -import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.style.FormatPane; import com.fr.general.Inter; import com.fr.stable.StringUtils; -import com.fr.design.style.FormatPane; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.text.Format; /** * 数据点提示内容面板,包含系列值、系列百分比 @@ -58,7 +53,7 @@ public class TooltipContentsPane extends BasicPane{ protected JPanel createJPanel4Value() { if (showValueCB == null) { - showValueCB = new UICheckBox(Inter.getLocText("Value")); + showValueCB = new UICheckBox(getValueString()); } showValueCB.setSelected(true); @@ -75,7 +70,9 @@ public class TooltipContentsPane extends BasicPane{ return valuePane; } - + protected String getValueString() { + return Inter.getLocText("Value"); + } protected Component[] createComponents4PercentValue() { if (showPercent == null) { diff --git a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/DataLabelPane.java b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/DataLabelPane.java index 33f2dccb7..7d8b6c8ce 100644 --- a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/DataLabelPane.java +++ b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/DataLabelPane.java @@ -1,12 +1,5 @@ package com.fr.design.chart.series.SeriesCondition.dlp; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; - -import javax.swing.ButtonGroup; -import javax.swing.JPanel; - import com.fr.base.Utils; import com.fr.chart.base.AttrContents; import com.fr.chart.base.ChartConstants; @@ -21,6 +14,9 @@ import com.fr.general.Inter; import com.fr.stable.Constants; import com.fr.stable.StringUtils; +import javax.swing.*; +import java.awt.*; + /** * Created by IntelliJ IDEA. * Author : Richer @@ -80,11 +76,14 @@ public class DataLabelPane extends TooltipContentsPane { protected Component[] createComponents4ShowCategoryName() { if (showCategoryNameCB == null) { - showCategoryNameCB = new UICheckBox(Inter.getLocText(new String[]{"StyleFormat-Category", "WF-Name"})); + showCategoryNameCB = new UICheckBox(getCategoryString()); } return new Component[]{null, showCategoryNameCB}; } + protected String getCategoryString(){ + return Inter.getLocText(new String[]{"StyleFormat-Category", "WF-Name"}); + } protected Component[] createComponents4ShowGuidLine() { diff --git a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/FunnelDataLabelPane.java b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/FunnelDataLabelPane.java new file mode 100644 index 000000000..14b0c18ad --- /dev/null +++ b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/FunnelDataLabelPane.java @@ -0,0 +1,13 @@ +package com.fr.design.chart.series.SeriesCondition.dlp; + +import java.awt.*; + +/** + * Created by Mitisky on 16/11/9. + */ +public class FunnelDataLabelPane extends DataLabelPane { + @Override + protected Component[] createComponents4ShowCategoryName() { + return new Component[0]; + } +} diff --git a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/MapDataLabelPane.java b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/MapDataLabelPane.java index 355ec9eee..451197e2a 100644 --- a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/MapDataLabelPane.java +++ b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/MapDataLabelPane.java @@ -1,6 +1,9 @@ package com.fr.design.chart.series.SeriesCondition.dlp; +import com.fr.general.Inter; + import javax.swing.*; +import java.awt.*; /** @@ -13,6 +16,21 @@ import javax.swing.*; */ public class MapDataLabelPane extends DataLabelPane { + @Override + protected Component[] createComponents4ShowSeriesName() { + return new Component[0]; + } + + @Override + protected String getCategoryString() { + return Inter.getLocText("FR-Chart-Area_Name"); + } + + @Override + protected String getValueString() { + return Inter.getLocText("FR-Chart-Area_Value"); + } + protected JPanel createJPanel4Position() { return null; } diff --git a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java index fdcda38b2..94836c7a3 100644 --- a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java +++ b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java @@ -13,8 +13,8 @@ import com.fr.design.editor.ValueEditorPaneFactory; import com.fr.design.gui.itableeditorpane.ParameterTableModel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.ChartHyperEditPane; +import com.fr.design.module.DesignModuleFactory; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.FRLogger; import com.fr.general.Inter; @@ -129,8 +129,8 @@ public class ChartHyperPoplinkPane extends BasicBeanPane { public void updateBean(ChartHyperPoplink chartHyperlink) { hyperEditPane.updateHyperLink(chartHyperlink); chartHyperlink.setChartCollection(chartComponent.update()); - - ChartEditPane.getInstance().fire();// 响应整个图表保存事件等. + + DesignModuleFactory.getChartPropertyPane().getChartEditPane().fire();// 响应整个图表保存事件等. if(itemNameTextField != null){ chartHyperlink.setItemName(this.itemNameTextField.getText()); } diff --git a/designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/FunnelPlotDataSeriesConditionPane.java b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/FunnelPlotDataSeriesConditionPane.java new file mode 100644 index 000000000..99469ff3c --- /dev/null +++ b/designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/FunnelPlotDataSeriesConditionPane.java @@ -0,0 +1,28 @@ +package com.fr.design.chart.series.SeriesCondition.impl; + +import com.fr.chart.chartattr.FunnelPlot; +import com.fr.chart.chartattr.Plot; +import com.fr.design.chart.series.SeriesCondition.ChartConditionPane; +import com.fr.design.chart.series.SeriesCondition.DataSeriesConditionPane; +import com.fr.design.chart.series.SeriesCondition.PiePlotChartConditionPane; + +/** + * Created by Mitisky on 16/11/9. + */ +public class FunnelPlotDataSeriesConditionPane extends DataSeriesConditionPane { + + @Override + protected ChartConditionPane createListConditionPane() { + return new PiePlotChartConditionPane(); + } + + /** + * 返回class对象 + * @return class对象 + */ + @Override + public Class class4Correspond() { + return FunnelPlot.class; + } + +} diff --git a/designer_chart/src/com/fr/design/chartinterface/FunnelIndependentChartInterface.java b/designer_chart/src/com/fr/design/chartinterface/FunnelIndependentChartInterface.java index 43c71b46c..00891e628 100644 --- a/designer_chart/src/com/fr/design/chartinterface/FunnelIndependentChartInterface.java +++ b/designer_chart/src/com/fr/design/chartinterface/FunnelIndependentChartInterface.java @@ -3,6 +3,8 @@ package com.fr.design.chartinterface; import com.fr.chart.chartattr.Plot; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.fun.impl.AbstractIndependentChartUIWithAPILevel; +import com.fr.design.chart.series.SeriesCondition.impl.FunnelPlotDataSeriesConditionPane; +import com.fr.design.condition.ConditionAttributesPane; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.ChartStylePane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; @@ -34,6 +36,10 @@ public class FunnelIndependentChartInterface extends AbstractIndependentChartUIW return new FunnelSeriesPane(parent, plot); } + public ConditionAttributesPane getPlotConditionPane(Plot plot){ + return new FunnelPlotDataSeriesConditionPane(); + } + /** *图标路径 * @return 图标路径 diff --git a/designer_chart/src/com/fr/design/mainframe/ChartAndWidgetPropertyPane.java b/designer_chart/src/com/fr/design/mainframe/ChartAndWidgetPropertyPane.java deleted file mode 100644 index f5547b7e6..000000000 --- a/designer_chart/src/com/fr/design/mainframe/ChartAndWidgetPropertyPane.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright(c) 2001-2011, FineReport Inc, All Rights Reserved. - */ -package com.fr.design.mainframe; - -import java.awt.BorderLayout; -import java.awt.Component; - -import javax.swing.BorderFactory; -import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.SwingConstants; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import com.fr.chart.chartattr.ChartCollection; -import com.fr.design.constants.UIConstants; -import com.fr.design.designer.TargetComponent; -import com.fr.design.gui.ibutton.UIToggleButton; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.itabpane.TitleChangeListener; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.module.DesignModuleFactory; -import com.fr.general.Inter; - -public class ChartAndWidgetPropertyPane extends MiddleChartPropertyPane { - - public synchronized static ChartAndWidgetPropertyPane getInstance(BaseFormDesigner formEditor) { - if(singleton == null) { - singleton = new ChartAndWidgetPropertyPane(formEditor); - } - - singleton.setWidgetPropertyPane(DesignModuleFactory.getWidgetPropertyPane(formEditor)); - singleton.setSureProperty(); - return singleton; - } - - public static ChartAndWidgetPropertyPane getInstance() { - if(singleton == null) { - singleton = new ChartAndWidgetPropertyPane(); - } - return singleton; - } - - private static ChartAndWidgetPropertyPane singleton; - - private BaseWidgetPropertyPane widgetpane = null; - - private UIToggleButton hisButton; - - public ChartAndWidgetPropertyPane() { - - } - - public ChartAndWidgetPropertyPane(BaseFormDesigner formEditor) { - super(); - this.widgetpane = DesignModuleFactory.getWidgetPropertyPane(formEditor); - } - - public void setWidgetPropertyPane(BaseWidgetPropertyPane pane) { - this.widgetpane = pane; - } - - @Override - protected void createMainPane() { - this.add(chartEditPane, BorderLayout.CENTER); - } - - @Override - protected void createNameLabel() { - nameLabel = new UILabel(); - nameLabel.setHorizontalAlignment(SwingConstants.LEFT); - nameLabel.setBorder(BorderFactory.createEmptyBorder(-2, 6, 2, 0)); - } - - @Override - protected JComponent createNorthComponent() { - JPanel toolPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - - JPanel hisPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - hisPane.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); - hisButton = new UIToggleButton(Inter.getLocText(new String[]{"Widget", "Attribute"}), UIConstants.HISTORY_ICON); - hisButton.setNormalPainted(false); - hisButton.setBorderPaintedOnlyWhenPressed(true); - hisPane.add(hisButton, BorderLayout.CENTER); - - hisButton.addChangeListener(new ChangeListener() { - - @Override - public void stateChanged(ChangeEvent e) { - cardChange(); - } - }); - - toolPane.add(nameLabel, BorderLayout.CENTER); - toolPane.add(hisPane, BorderLayout.EAST); - - titleListener = new TitleChangeListener() { - - @Override - public void fireTitleChange(String addName) { - if(hisButton.isSelected()) { - nameLabel.setText(Inter.getLocText(new String[]{"Widget", "Form-Widget_Property_Table"})); - }else { - nameLabel.setText(Inter.getLocText("Chart-Property_Table") + '-' + addName); - } - } - }; - - return toolPane; - } - - /** - * 感觉ChartCollection加载图表属性界面. - * @param collection 收集图表 - * @param ePane 面板 - */ - public void populateChartPropertyPane(ChartCollection collection, TargetComponent ePane) { - super.populateChartPropertyPane(collection, ePane); - //表单中的图表切换界面上得更新 - resetChartEditPane(); - } - - protected void resetChartEditPane() { - cardChange(); - } - - private void cardChange() { - remove(chartEditPane); - remove((Component)widgetpane); - if(hisButton.isSelected()) { - nameLabel.setText(Inter.getLocText(new String[]{"Widget", "Form-Widget_Property_Table"})); - add((Component)widgetpane, BorderLayout.CENTER); - } else { - String tabname = chartEditPane.getSelectedTabName(); - nameLabel.setText(Inter.getLocText(new String[]{"Utils-The-Chart", "Form-Widget_Property_Table"}) + (tabname != null ? ('-' + chartEditPane.getSelectedTabName()) : "")); - add(chartEditPane, BorderLayout.CENTER); - } - validate(); - repaint(); - revalidate(); - } -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/ChartDesigner.java b/designer_chart/src/com/fr/design/mainframe/ChartDesigner.java index 715c02a32..f16fe98ec 100644 --- a/designer_chart/src/com/fr/design/mainframe/ChartDesigner.java +++ b/designer_chart/src/com/fr/design/mainframe/ChartDesigner.java @@ -29,40 +29,13 @@ public class ChartDesigner extends TargetComponent implements MouseL private ChartArea chartArea;//上层区域 private boolean hasCalGap = false; - private ChartDesignerUI designerUI; private ArrayList changeListeners = new ArrayList(); - private ChartToolBarPane chartToolBarPane; - public ChartDesigner(ChartBook chartBook) { super(chartBook); this.addMouseListener(this); - designerUI = new ChartDesignerUI(); - chartToolBarPane = new ChartToolBarPane(this){ - public Dimension getPreferredSize() { - Dimension size = super.getPreferredSize(); - return new Dimension(size.width, ChartToolBarPane.TOTAL_HEIGHT); - } - }; - this.addMouseMotionListener(new MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent e) { - if(designerUI!=null){ - designerUI.mouseMoved(e); - ChartDesigner.this.repaint(); - } - } - }); updateUI();// 初始化界面设计工具的UI实例 } - /** - * 设置其UI类为DesignerUI,负责渲染 - */ - @Override - public void updateUI() { - setUI(designerUI); - } - /** * 设置上层区域 * @param chartArea 图表区域 @@ -203,8 +176,6 @@ public class ChartDesigner extends TargetComponent implements MouseL * @param e 事件 */ public void mouseClicked(MouseEvent e) { - designerUI.mouseClicked(e); - this.chartToolBarPane.populate(); } /** @@ -247,18 +218,13 @@ public class ChartDesigner extends TargetComponent implements MouseL this.changeListeners.add(changeListener); } - public ChartToolBarPane getChartToolBarPane(){ - return this.chartToolBarPane; - } public void populate(){ - this.chartToolBarPane.populate(); } /** * 清除工具栏上面全局风格按钮的选中 */ public void clearToolBarStyleChoose(){ - chartToolBarPane.clearStyleChoose(); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/ChartDesignerPropertyPane.java b/designer_chart/src/com/fr/design/mainframe/ChartDesignerPropertyPane.java deleted file mode 100644 index efa1eea62..000000000 --- a/designer_chart/src/com/fr/design/mainframe/ChartDesignerPropertyPane.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - */ - -package com.fr.design.mainframe; - -import com.fr.base.chart.BaseChartCollection; -import com.fr.chart.chartattr.ChartCollection; -import com.fr.design.designer.TargetComponent; -import com.fr.design.gui.chart.BaseChartPropertyPane; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.itabpane.TitleChangeListener; -import com.fr.design.mainframe.chart.ChartDesignEditPane; -import com.fr.design.mainframe.chart.ChartEditPane; -import com.fr.general.Inter; - - -import javax.swing.*; -import java.awt.*; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-15 - * Time: 下午12:43 - */ -public class ChartDesignerPropertyPane extends BaseChartPropertyPane { - private static ChartDesignerPropertyPane instance; - private TargetComponentContainer container = new TargetComponentContainer(); - private ChartEditPane chartEditPane; - private UILabel nameLabel; - private TitleChangeListener titleListener = new TitleChangeListener() { - - @Override - public void fireTitleChange(String addName) { - nameLabel.setText(Inter.getLocText("Chart-Property_Table") + '-' + addName); - } - }; - - public synchronized static ChartDesignerPropertyPane getInstance() { - if (instance == null) { - instance = new ChartDesignerPropertyPane(); - } - instance.setSureProperty(); - return instance; - } - - public ChartDesignerPropertyPane() { - this.setLayout(new BorderLayout()); - this.setBorder(null); - - createNameLabel(); - this.add(nameLabel, BorderLayout.NORTH); - chartEditPane = ChartDesignEditPane.getInstance(); - this.add(chartEditPane, BorderLayout.CENTER); - } - - private void createNameLabel() { - nameLabel = new UILabel() { - @Override - public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, 18); - } - }; - nameLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 1, 0)); - nameLabel.setHorizontalAlignment(SwingConstants.CENTER); - } - - @Override - public void setSureProperty() { - chartEditPane.setContainer(container); - chartEditPane.addTitleChangeListener(titleListener); - String tabname = chartEditPane.getSelectedTabName(); - nameLabel.setText(Inter.getLocText("Chart-Property_Table") + (tabname != null ? ('-' + chartEditPane.getSelectedTabName()) : "")); - resetChartEditPane(); - - } - - protected void resetChartEditPane() { - remove(chartEditPane); - add(chartEditPane, BorderLayout.CENTER); - validate(); - repaint(); - revalidate(); - } - - @Override - public void setSupportCellData(boolean supportCellData){ - - } - - /** - * 感觉ChartCollection加载图表属性界面. - * @param collection 收集图表 - * @param chartDesigner 图表设计 - */ - public void populateChartPropertyPane(BaseChartCollection collection, TargetComponent chartDesigner) { - if (collection instanceof ChartCollection) { - this.container.setEPane(chartDesigner); - chartEditPane.populate((ChartCollection) collection); - } - } - - @Override - public void setWidgetPropertyPane(BaseWidgetPropertyPane pane) { - - } - - /** - * 刷新 - */ - public void refreshDockingView() { - - } - - @Override - public String getViewTitle() { - return null; - } - - @Override - public Icon getViewIcon() { - return null; - } - - /** - * 位置 - * @return 位置 - */ - public Location preferredLocation() { - return null; - } -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/ChartPropertyPane.java b/designer_chart/src/com/fr/design/mainframe/ChartPropertyPane.java index d11279fed..1c04543d6 100644 --- a/designer_chart/src/com/fr/design/mainframe/ChartPropertyPane.java +++ b/designer_chart/src/com/fr/design/mainframe/ChartPropertyPane.java @@ -17,15 +17,15 @@ public class ChartPropertyPane extends MiddleChartPropertyPane{ /** * 创建图表属性表实例. */ - public synchronized static ChartPropertyPane getInstance() { + private synchronized static ChartPropertyPane getInstance() { if(singleton == null) { singleton = new ChartPropertyPane(); } - + singleton.setSureProperty(); return singleton; } - + private static ChartPropertyPane singleton; @Override @@ -49,9 +49,8 @@ public class ChartPropertyPane extends MiddleChartPropertyPane{ protected JComponent createNorthComponent() { return nameLabel; } - - @Override - public void setWidgetPropertyPane(BaseWidgetPropertyPane pane) { - + + public synchronized static void clear() { + singleton = null; } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/ChartUndoState.java b/designer_chart/src/com/fr/design/mainframe/ChartUndoState.java deleted file mode 100644 index 04809b0de..000000000 --- a/designer_chart/src/com/fr/design/mainframe/ChartUndoState.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - */ - -package com.fr.design.mainframe; - -import com.fr.form.ui.ChartBook; - -import java.awt.*; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-13 - * Time: 下午2:32 - */ -public class ChartUndoState extends BaseUndoState { - private ChartBook chartBook; - private Dimension designerSize; - private double widthValue; - private double heightValue; - - public ChartUndoState(JChart t,ChartArea area) { - super(t); - try { - this.chartBook = (ChartBook) t.getTarget().clone(); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } - this.widthValue =area.getCustomWidth(); - this.heightValue = area.getCustomHeight(); - } - - - public ChartBook getChartBook(){ - return this.chartBook; - } - - /** - * 应用状态 - */ - public void applyState() { - this.getApplyTarget().applyUndoState(this); - - } -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/JChart.java b/designer_chart/src/com/fr/design/mainframe/JChart.java deleted file mode 100644 index 147c4d1b3..000000000 --- a/designer_chart/src/com/fr/design/mainframe/JChart.java +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - * 图表类型文件 - */ - -package com.fr.design.mainframe; - -import com.fr.base.BaseUtils; -import com.fr.base.FRContext; -import com.fr.file.FILEChooserPane; -import com.fr.file.FILEChooserPane4Chart; -import com.fr.form.ui.ChartBook; -import com.fr.design.DesignModelAdapter; -import com.fr.design.event.TargetModifiedEvent; -import com.fr.design.event.TargetModifiedListener; -import com.fr.design.gui.imenu.UIMenuItem; -import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.mainframe.actions.ExcelExportAction4Chart; -import com.fr.design.mainframe.actions.PDFExportAction4Chart; -import com.fr.design.mainframe.actions.PNGExportAction4Chart; -import com.fr.design.mainframe.form.FormECCompositeProvider; -import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; -import com.fr.design.menu.ShortCut; -import com.fr.design.menu.ToolBarDef; -import com.fr.file.FILE; -import com.fr.general.Inter; -import com.fr.json.JSONArray; -import com.fr.json.JSONException; -import com.fr.json.JSONObject; -import com.fr.stable.StringUtils; - -import javax.swing.*; -import java.awt.*; -import java.awt.datatransfer.StringSelection; - -/** - * 图表crt文件 - *

- * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-13 - * Time: 下午2:28 - */ -public class JChart extends JTemplate { - public static final String XML_TAG = "JChart"; - private static final String CHART_CARD = "FORM"; - private static final String ELEMENTCASE_CARD = "ELEMENTCASE"; - - private static final String[] CARDNAME = new String[]{CHART_CARD, ELEMENTCASE_CARD}; - private static final int TOOLBARPANEDIMHEIGHT_FORM = 60; - //图表设计器 - ChartDesigner chartDesigner; - - //中间编辑区域, carllayout布局 - private JPanel tabCenterPane; - private CardLayout cardLayout; - //当前编辑的组件对象 - private JComponent editingComponent; - private FormECCompositeProvider reportComposite; - - public JChart() { - super(new ChartBook(), "Chart"); - } - - public JChart(ChartBook chartFile, FILE file) { - super(chartFile, file); - } - - @Override - protected JPanel createCenterPane() { - tabCenterPane = FRGUIPaneFactory.createCardLayout_S_Pane(); - JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - centerPane.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 0, new Color(85, 85, 85))); - chartDesigner = new ChartDesigner(this.getTarget()); - ChartArea area = new ChartArea(chartDesigner); - centerPane.add(area, BorderLayout.CENTER); - tabCenterPane.add(centerPane, CHART_CARD, 0); - chartDesigner.addTargetModifiedListener(new TargetModifiedListener() { - public void targetModified(TargetModifiedEvent e) { - JChart.this.fireTargetModified();// 调用保存*, 调用刷新界面, 刷新工具栏按钮 - } - }); - - this.add(tabCenterPane, BorderLayout.CENTER); - return tabCenterPane; - } - - /** - * 移除选择 - */ - public void removeTemplateSelection() { - - } - - /** - * 刷新容器 - */ - public void refreshContainer() { - - } - - /** - * 移除参数面板选择 - */ - public void removeParameterPaneSelection() { - - } - - /** - * 创建设计模式 - * - * @return 返回模式 - */ - protected DesignModelAdapter createDesignModel() { - return null; - } - - /** - * 创建预览得菜单 - * - * @return 菜单 - */ - public UIMenuItem[] createMenuItem4Preview() { - return new UIMenuItem[0]; - } - - /** - * 创建撤销状态 - * - * @return 状态 - */ - protected ChartUndoState createUndoState() { - return new ChartUndoState(this,chartDesigner.getArea()); - } - - /** - * 应用撤销状态 - * - * @param chartUndoState 撤销状态 - */ - protected void applyUndoState(ChartUndoState chartUndoState) { - try { - this.setTarget((ChartBook)chartUndoState.getChartBook().clone()); - chartDesigner.setTarget(this.getTarget()); - chartDesigner.populate(); - }catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } - } - - /** - * 后缀 - * - * @return 后缀 - */ - public String suffix() { - return ".crt"; - } - - /** - * 复制 - */ - public void copy() { - - } - - /** - * 黏贴 - * - * @return 是否鸟贴成功 - */ - public boolean paste() { - return false; - } - - /** - * 是否剪切 - * - * @return 剪切成功 - */ - public boolean cut() { - return false; - } - - /** - * 创建权限编辑面板 - * - * @return 面板 - */ - public AuthorityEditPane createAuthorityEditPane() { - return null; - } - - /** - * 工具栏 - * - * @return 工具栏 - */ - public ToolBarMenuDockPlus getToolBarMenuDockPlus() { - return null; - } - - /** - * 东上面板 - * - * @return 面板 - */ - public JPanel getEastUpPane() { - return null; - } - - /** - * 东下面板 - * - * @return 面板 - */ - public JPanel getEastDownPane() { - return null; - } - - /** - * 工具栏菜单 - * - * @return 菜单 - */ - public ToolBarDef[] toolbars4Target() { - return new ToolBarDef[0]; - } - - /** - * 表单面板 - * - * @return 面板 - */ - public JPanel[] toolbarPanes4Form() { - return new JPanel[0]; - } - - /** - * 模版菜单 - * - * @return 模版菜单 - */ - public ShortCut[] shortcut4TemplateMenu() { - return new ShortCut[0]; - } - - /** - * 权限编辑菜单 - * - * @return 菜单 - */ - public ShortCut[] shortCuts4Authority() { - return new ShortCut[0]; - } - - /** - * 工具条表单 - * - * @return 表单 - */ - public JComponent[] toolBarButton4Form() { - return new JComponent[0]; - } - - /** - * 权限编辑工具栏,但是图表设计器里面用于正常工具栏不是全县编辑 - * - * @return 工具条 - */ - public JComponent toolBar4Authority() { - return chartDesigner.getChartToolBarPane(); - } - - /** - * 工具条高度 - * - * @return 工具条高度 - */ - public int getToolBarHeight() { - return 0; - } - - /** - * 是否是报表 - * - * @return 不是 - */ - public boolean isJWorkBook() { - return false; - } - - /** - * 是否是图表 - * - * @return 是则返回true - */ - public boolean isChartBook() { - return true; - } - - /** - * 设置权限编辑模式 - * - * @param isUpMode 没有权限编辑 - */ - public void setAuthorityMode(boolean isUpMode) { - - } - - /** - * 刷新工具区域 - */ - public void refreshToolArea() { - DesignerContext.getDesignerFrame().resetToolkitByPlus(JChart.this); - chartDesigner.populate(); - ChartDesignerPropertyPane.getInstance().populateChartPropertyPane(getTarget().getChartCollection(), chartDesigner); - EastRegionContainerPane.getInstance().replaceUpPane(ChartDesignerPropertyPane.getInstance()); - } - - /** - * 导出菜单的子菜单 ,目前用于图表设计器 - * - * @return 子菜单 - */ - public ShortCut[] shortcut4ExportMenu() { - return new ShortCut[]{new PNGExportAction4Chart(this), new ExcelExportAction4Chart(this), new PDFExportAction4Chart(this)}; - } - - public Icon getIcon() { - return BaseUtils.readIcon("/com/fr/design/images/chart.png"); - } - - public ChartDesigner getChartDesigner(){ - return chartDesigner; - } - - /** - * 复制JS代码 - */ - public void copyJS(){ - JSONObject jsonObject =this.getTarget().createExportConfig(); - String jsonString = StringUtils.EMPTY; - if(jsonObject != null){ - try{ - if(jsonObject.has("charts")){ - JSONArray charts = jsonObject.getJSONArray("charts"); - jsonString = charts.toString(2); - }else{ - jsonString = jsonObject.toString(2); - } - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Chart-CopyJS_Message"), Inter.getLocText("FR-Chart-Action_Copy")+"JS", JOptionPane.INFORMATION_MESSAGE); - }catch (JSONException ex){ - FRContext.getLogger().error(ex.getMessage()); - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Chart-CopyJS_Failed")+"!", Inter.getLocText("Error"), JOptionPane.ERROR_MESSAGE); - } - }else{ - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Chart-CopyJS_Failed")+"!", Inter.getLocText("Error"), JOptionPane.ERROR_MESSAGE); - } - StringSelection stringSelection = new StringSelection(jsonString); - Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null); - }; - - /** - * 系列风格改动 - */ - public void styleChange(){ - chartDesigner.clearToolBarStyleChoose(); - } - - protected FILEChooserPane getFILEChooserPane(boolean isShowLoc){ - return new FILEChooserPane4Chart(true, isShowLoc); - } - -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/MiddleChartPropertyPane.java b/designer_chart/src/com/fr/design/mainframe/MiddleChartPropertyPane.java index 59cfb383e..0b86c5a12 100644 --- a/designer_chart/src/com/fr/design/mainframe/MiddleChartPropertyPane.java +++ b/designer_chart/src/com/fr/design/mainframe/MiddleChartPropertyPane.java @@ -13,11 +13,13 @@ import com.fr.base.chart.BaseChartCollection; import com.fr.chart.chartattr.ChartCollection; import com.fr.design.designer.TargetComponent; import com.fr.design.gui.chart.BaseChartPropertyPane; +import com.fr.design.gui.chart.ChartEditPaneProvider; import com.fr.design.gui.frpane.UITitlePanel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itabpane.TitleChangeListener; import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.general.Inter; +import com.fr.stable.StableUtils; public abstract class MiddleChartPropertyPane extends BaseChartPropertyPane{ @@ -37,7 +39,7 @@ public abstract class MiddleChartPropertyPane extends BaseChartPropertyPane{ createNameLabel(); this.add(createNorthComponent(), BorderLayout.NORTH); - chartEditPane = ChartEditPane.getInstance(); + chartEditPane = StableUtils.construct(ChartEditPane.class); chartEditPane.setSupportCellData(true); this.createMainPane(); } @@ -48,6 +50,12 @@ public abstract class MiddleChartPropertyPane extends BaseChartPropertyPane{ protected abstract void createMainPane(); + + @Override + public ChartEditPaneProvider getChartEditPane() { + return chartEditPane; + } + public void setSureProperty() { chartEditPane.setContainer(container); chartEditPane.addTitleChangeListener(titleListener); @@ -93,6 +101,12 @@ public abstract class MiddleChartPropertyPane extends BaseChartPropertyPane{ } } +// public void clear() { +// this.container.setEPane(null); +// chartEditPane.clear(); +// getParent().remove(this); +// } + /** * 返回View的标题. */ diff --git a/designer_chart/src/com/fr/design/mainframe/actions/AbstractExportAction4JChart.java b/designer_chart/src/com/fr/design/mainframe/actions/AbstractExportAction4JChart.java deleted file mode 100644 index 0601bd4f4..000000000 --- a/designer_chart/src/com/fr/design/mainframe/actions/AbstractExportAction4JChart.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - */ - -package com.fr.design.mainframe.actions; - -import com.fr.base.FRContext; -import com.fr.design.gui.iprogressbar.FRProgressBar; -import com.fr.form.ui.ChartBook; -import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.DesignerFrame; -import com.fr.design.mainframe.JChart; -import com.fr.design.mainframe.exporter.Exporter4Chart; -import com.fr.file.FILE; -import com.fr.file.FILEChooserPane; -import com.fr.file.filter.ChooseFileFilter; -import com.fr.general.FRLogger; -import com.fr.general.Inter; - -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.io.FileOutputStream; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-15 - * Time: 上午9:48 - */ -public abstract class AbstractExportAction4JChart extends JChartAction { - protected AbstractExportAction4JChart(JChart chart){ - super(chart); - } - - private FRProgressBar progressbar; - - protected ChartBook getChartBook(){ - return this.getEditingComponent().getTarget(); - } - - /** - * 执行方法 - * @param e 事件 - */ - public void actionPerformed(ActionEvent e) { - JChart chart = this.getEditingComponent(); - FILE editingFILE = chart.getEditingFILE(); - DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); - - // 弹出参数 - final java.util.Map parameterMap = new java.util.HashMap(); - final ChartBook chartBook = getChartBook(); - - // Choose a file name.... - FILEChooserPane fileChooserPane = FILEChooserPane.getInstance(false, true); - fileChooserPane.setFILEFilter(this.getChooseFileFilter()); - - // 打开文件后输出文件名修改,eg:w.cpt.doc / w.svg.doc,去掉中间的后缀名~~ w.doc - String filenName = editingFILE.getName(); - if (filenName.indexOf('.') != -1) { - filenName = filenName.substring(0, editingFILE.getName().lastIndexOf('.')); - } - fileChooserPane.setFileNameTextField(filenName, "." + this.getDefaultExtension()); - int saveValue = fileChooserPane.showSaveDialog(designerFrame, "." + this.getDefaultExtension()); - if (saveValue == FILEChooserPane.CANCEL_OPTION || saveValue == FILEChooserPane.JOPTIONPANE_CANCEL_OPTION) { - fileChooserPane = null; - return; - } else if (saveValue == FILEChooserPane.JOPTIONPANE_OK_OPTION || saveValue == FILEChooserPane.OK_OPTION) { - FILE file = fileChooserPane.getSelectedFILE(); - try { - file.mkfile(); - } catch (Exception e1) { - FRLogger.getLogger().error("Error In Make New File"); - } - fileChooserPane = null; - FRContext.getLogger().info("\"" + file.getName() + "\"" + Inter.getLocText("Prepare_Export") + "!"); - - (progressbar = new FRProgressBar(createExportWork(file, chartBook), designerFrame, - Inter.getLocText("Exporting"), "", 0, 100)).start(); - } - - } - - private SwingWorker createExportWork(FILE file, final ChartBook chartBook) { - final String filePath = file.getPath(); - final String fileGetName = file.getName(); - - SwingWorker exportWorker = new SwingWorker() { - protected Void doInBackground() throws Exception { - Thread.sleep(100); //bug 10516 - try { - final FileOutputStream fileOutputStream = new FileOutputStream(filePath); - - this.setProgress(10); - dealExporter(fileOutputStream,chartBook); - this.setProgress(80); - fileOutputStream.close(); - this.setProgress(100); - - FRContext.getLogger().info("\"" + fileGetName + "\"" + Inter.getLocText("Finish_Export") + "!"); - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), - Inter.getLocText("Exported_successfully") + "\n" + filePath); - } catch (Exception exp) { - this.setProgress(100); - FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Export_failed") + "\n" + filePath); - } - return null; - } - - public void done() { - progressbar.close(); - } - }; - return exportWorker; - } - - private void dealExporter(FileOutputStream fileOutputStream, final ChartBook chartBook) throws Exception { - final Exporter4Chart exporter = AbstractExportAction4JChart.this.getExporter(); - exporter.export(fileOutputStream,this.getEditingComponent()); - } - - - - protected abstract ChooseFileFilter getChooseFileFilter(); - - protected abstract String getDefaultExtension(); - - protected abstract Exporter4Chart getExporter(); - -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/actions/ExcelExportAction4Chart.java b/designer_chart/src/com/fr/design/mainframe/actions/ExcelExportAction4Chart.java deleted file mode 100644 index e1e64395a..000000000 --- a/designer_chart/src/com/fr/design/mainframe/actions/ExcelExportAction4Chart.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - */ - -package com.fr.design.mainframe.actions; - -import com.fr.base.BaseUtils; -import com.fr.base.ExcelUtils; -import com.fr.design.mainframe.JChart; -import com.fr.design.mainframe.exporter.ExcelExporter4Chart; -import com.fr.design.mainframe.exporter.Exporter4Chart; -import com.fr.design.menu.MenuKeySet; -import com.fr.file.filter.ChooseFileFilter; -import com.fr.general.Inter; - -import javax.swing.*; -import java.awt.event.KeyEvent; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-15 - * Time: 上午9:52 - */ -public class ExcelExportAction4Chart extends AbstractExportAction4JChart { - - private MenuKeySet excel= new MenuKeySet() { - @Override - public char getMnemonic() { - return 'E'; - } - - @Override - public String getMenuName() { - return Inter.getLocText("FR-Chart-Format_Excel"); - } - - @Override - public KeyStroke getKeyStroke() { - return KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK); - } - }; - - public ExcelExportAction4Chart(JChart chart) { - super(chart); - this.setMenuKeySet(excel); - this.setName(getMenuKeySet().getMenuKeySetName()); - this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/excel.png")); - } - - - @Override - protected ChooseFileFilter getChooseFileFilter() { - return new ChooseFileFilter(new String[]{"xls", "xlsx"}, Inter.getLocText("Export-Excel")); - } - - @Override - protected String getDefaultExtension() { - return ExcelUtils.checkThirdJarSupportPOI() ? "xlsx" : "xls"; - } - - @Override - protected Exporter4Chart getExporter() { - return new ExcelExporter4Chart(); - } -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/actions/JChartAction.java b/designer_chart/src/com/fr/design/mainframe/actions/JChartAction.java deleted file mode 100644 index ba4667875..000000000 --- a/designer_chart/src/com/fr/design/mainframe/actions/JChartAction.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - */ - -package com.fr.design.mainframe.actions; - -import com.fr.design.actions.JTemplateAction; -import com.fr.design.mainframe.JChart; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-15 - * Time: 上午9:47 - */ -public abstract class JChartAction extends JTemplateAction { - public JChartAction(JChart jChart) { - super(jChart); - } -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/actions/NewChartAction.java b/designer_chart/src/com/fr/design/mainframe/actions/NewChartAction.java deleted file mode 100644 index bd62a689b..000000000 --- a/designer_chart/src/com/fr/design/mainframe/actions/NewChartAction.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - */ - -package com.fr.design.mainframe.actions; - -import com.fr.base.BaseUtils; -import com.fr.design.actions.UpdateAction; -import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.JChart; -import com.fr.design.menu.MenuKeySet; -import com.fr.general.Inter; - -import javax.swing.*; -import java.awt.event.ActionEvent; -import java.awt.event.InputEvent; -import java.awt.event.KeyEvent; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-13 - * Time: 下午3:22 - */ -public class NewChartAction extends UpdateAction{ - - public NewChartAction(){ - this.setMenuKeySet(NEW_CHART); - this.setName(getMenuKeySet().getMenuKeySetName()); - this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon(BaseUtils.readIcon("com/fr/design/images/newchart_normal.png")); - this.setAccelerator(getMenuKeySet().getKeyStroke()); - } - - - /** - * 执行事件 - * @param e 事件 - */ - public void actionPerformed(ActionEvent e) { - DesignerContext.getDesignerFrame().addAndActivateJTemplate(new JChart()); - } - - public static final MenuKeySet NEW_CHART = new MenuKeySet() { - @Override - public char getMnemonic() { - return 'F'; - } - - @Override - public String getMenuName() { - return Inter.getLocText("M-New_ChartBook"); - } - - @Override - public KeyStroke getKeyStroke() { - return KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK); - } - }; -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/actions/PDFExportAction4Chart.java b/designer_chart/src/com/fr/design/mainframe/actions/PDFExportAction4Chart.java deleted file mode 100644 index df2f95598..000000000 --- a/designer_chart/src/com/fr/design/mainframe/actions/PDFExportAction4Chart.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - */ - -package com.fr.design.mainframe.actions; - -import com.fr.base.BaseUtils; -import com.fr.design.mainframe.JChart; -import com.fr.design.mainframe.exporter.Exporter4Chart; -import com.fr.design.mainframe.exporter.PdfExporter4Chart; -import com.fr.design.menu.MenuKeySet; -import com.fr.file.filter.ChooseFileFilter; -import com.fr.general.Inter; - -import javax.swing.*; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-15 - * Time: 上午10:16 - */ -public class PDFExportAction4Chart extends AbstractExportAction4JChart { - - private MenuKeySet pdf = new MenuKeySet() { - @Override - public char getMnemonic() { - return 'P'; - } - - @Override - public String getMenuName() { - return Inter.getLocText("FR-Chart-Format_PDF"); - } - - @Override - public KeyStroke getKeyStroke() { - return null; - } - }; - - public PDFExportAction4Chart(JChart chart) { - super(chart); - this.setMenuKeySet(pdf); - this.setName(getMenuKeySet().getMenuKeySetName()); - this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/pdf.png")); - } - - @Override - protected ChooseFileFilter getChooseFileFilter() { - return new ChooseFileFilter(new String[]{"pdf"}, Inter.getLocText("Export-PDF")); - } - - @Override - protected String getDefaultExtension() { - return "pdf"; - } - - @Override - protected Exporter4Chart getExporter() { - return new PdfExporter4Chart(); - } -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/actions/PNGExportAction4Chart.java b/designer_chart/src/com/fr/design/mainframe/actions/PNGExportAction4Chart.java deleted file mode 100644 index 2b04f80d4..000000000 --- a/designer_chart/src/com/fr/design/mainframe/actions/PNGExportAction4Chart.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - */ - -package com.fr.design.mainframe.actions; - -import com.fr.base.BaseUtils; -import com.fr.design.mainframe.JChart; -import com.fr.design.mainframe.exporter.Exporter4Chart; -import com.fr.design.mainframe.exporter.ImageExporter4Chart; -import com.fr.design.menu.MenuKeySet; -import com.fr.file.filter.ChooseFileFilter; -import com.fr.general.Inter; - -import javax.swing.*; -import java.awt.event.KeyEvent; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-15 - * Time: 上午10:18 - */ -public class PNGExportAction4Chart extends AbstractExportAction4JChart { - - private MenuKeySet menuSet = new MenuKeySet() { - @Override - public char getMnemonic() { - return 'M'; - } - - @Override - public String getMenuName() { - return Inter.getLocText("FR-Chart-Format_Image"); - } - - @Override - public KeyStroke getKeyStroke() { - return KeyStroke.getKeyStroke(KeyEvent.VK_M, KeyEvent.CTRL_MASK); - } - }; - - public PNGExportAction4Chart(JChart chart) { - super(chart); - this.setMenuKeySet(menuSet); - this.setName(getMenuKeySet().getMenuKeySetName()); - this.setMnemonic(getMenuKeySet().getMnemonic()); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/exportimg.png")); - } - - @Override - protected ChooseFileFilter getChooseFileFilter() { - return new ChooseFileFilter(new String[]{"png"}, Inter.getLocText("Image")); - } - - @Override - protected String getDefaultExtension() { - return "png"; - } - - @Override - protected Exporter4Chart getExporter() { - return new ImageExporter4Chart(); - } -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/chart/AbstractChartAttrPane.java b/designer_chart/src/com/fr/design/mainframe/chart/AbstractChartAttrPane.java index 23f21463b..8c4a21c81 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/AbstractChartAttrPane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/AbstractChartAttrPane.java @@ -32,4 +32,5 @@ public abstract class AbstractChartAttrPane extends AbstractAttrNoScrollPane { public void refreshChartDataPane(ChartCollection collection){ } + } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/chart/ChartEditPane.java b/designer_chart/src/com/fr/design/mainframe/chart/ChartEditPane.java index c3a2e1d50..f19c49d66 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/ChartEditPane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/ChartEditPane.java @@ -9,6 +9,7 @@ import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.tabledata.Prepare4DataSourceChange; import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.chart.ChartEditPaneProvider; import com.fr.design.gui.frpane.AttributeChangeListener; import com.fr.design.gui.ibutton.UIHeadGroup; import com.fr.design.gui.itabpane.TitleChangeListener; @@ -30,20 +31,13 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.List; -public class ChartEditPane extends BasicPane implements AttributeChange,Prepare4DataSourceChange { - public synchronized static ChartEditPane getInstance() { - if (singleton == null) { - singleton = new ChartEditPane(); - } - return singleton; - } +public class ChartEditPane extends BasicPane implements AttributeChange,Prepare4DataSourceChange, ChartEditPaneProvider { private final static int CHANGE_MIN_TIME = 80; protected ChartCollection collection; protected boolean isDefaultPane = true;//是否是默认的界面 - private static ChartEditPane singleton; protected List paneList; protected ChartTypePane typePane; @@ -79,10 +73,6 @@ public class ChartEditPane extends BasicPane implements AttributeChange,Prepare4 registerDSChangeListener(); } - public static ChartEditPane getSingleton() { - return singleton; - } - //构建主面板 protected void createTabsPane() { Icon[] iconArray = new Icon[paneList.size()]; @@ -295,7 +285,7 @@ public class ChartEditPane extends BasicPane implements AttributeChange,Prepare4 * * @param id 界面的标志.id */ - public void GoToPane(String... id) { + public void gotoPane(String... id) { this.setSelectedIndex(id); EastRegionContainerPane.getInstance().setWindow2PreferWidth(); } diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/ChangeConfigPane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/ChangeConfigPane.java new file mode 100644 index 000000000..3ee84ceb7 --- /dev/null +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/ChangeConfigPane.java @@ -0,0 +1,208 @@ +package com.fr.design.mainframe.chart.gui; + +/** + * Created by hufan on 2016/10/20. + */ + +import com.fr.chart.chartattr.ChartCollection; +import com.fr.chart.base.AttrChangeConfig; +import com.fr.chart.base.AttrChangeType; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ispinner.UISpinner; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * 图表切换设置面板 + */ +public class ChangeConfigPane extends BasicBeanPane { + private static final int WIDTH = 100; + private static final int MIN_TIME = 0; + private static final int MAX_TIME = Integer.MAX_VALUE; + private JPanel contentPane; + //配置方式按钮 + private UIButtonGroup configStyleButton; + //配置界面 + private JPanel configPane; + //按钮切换方式配置界面 + private JPanel buttonConfigPane; + private ChartTextAttrPane styleAttrPane; + private ColorSelectBoxWithOutTransparent colorSelectBox4button; + + //轮播切换方式配置接界面 + private JPanel carouselConfigPane; + protected UISpinner timeInterval; + private ColorSelectBoxWithOutTransparent colorSelectBox4carousel; + + public ChangeConfigPane(){ + initButtonGroup(); + configPane = createConfigPane(); + contentPane = createContentPane(); + contentPane.setBorder(BorderFactory.createEmptyBorder(10, 30, 10, 30)); + this.add(contentPane, BorderLayout.CENTER); + } + + private JPanel createContentPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p,p,p,p}; + Component[][] components = new Component[][]{ + new Component[]{new UILabel(Inter.getLocText("Plugin-ChartF_Change_Style") + ":"),configStyleButton}, + new Component[]{null, null}, + new Component[]{new JSeparator(), null}, + new Component[]{configPane, null}, + }; + return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + } + + private JPanel createConfigPane() { + + buttonConfigPane = createButtonConfigPane(); + carouselConfigPane = createCarouseConfigPane(); + + JPanel panel = new JPanel(new CardLayout()){ + @Override + public Dimension getPreferredSize() { + if(configStyleButton.getSelectedIndex() == 0){ + return buttonConfigPane.getPreferredSize(); + } else{ + return carouselConfigPane.getPreferredSize(); + } + } + }; + + panel.add(buttonConfigPane, "button"); + panel.add(carouselConfigPane, "carousel"); + + return panel; + } + + private JPanel createCarouseConfigPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p,p,p}; + Component[][] components = new Component[][]{ + new Component[]{createTimeIntervalPane(),null}, + new Component[]{new JSeparator(),null}, + new Component[]{createCarouseBackgroundColorPane(),null}, + }; + + return TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); + } + + private Component createTimeIntervalPane() { + timeInterval = new UISpinner(MIN_TIME, MAX_TIME, 1, 0); + return TableLayoutHelper.createTableLayoutPaneWithTitle(Inter.getLocText("Plugin-ChartF_Time_Interval") + ":", timeInterval); + } + + private JPanel createCarouseBackgroundColorPane() { + colorSelectBox4carousel = new ColorSelectBoxWithOutTransparent(WIDTH); + return TableLayoutHelper.createTableLayoutPaneWithTitle(Inter.getLocText("Background") + ":", colorSelectBox4carousel); + } + + private JPanel createTitleStylePane(){ + styleAttrPane = new ChartTextAttrPane(); + styleAttrPane.setPreferredSize(new Dimension(WIDTH, (int) styleAttrPane.getPreferredSize().getHeight())); + return TableLayoutHelper.createTableLayoutPaneWithTitle(Inter.getLocText("FR-Designer-Widget_Style")+":", styleAttrPane); + } + + + private JPanel createButtonBackgroundColorPane(){ + colorSelectBox4button = new ColorSelectBoxWithOutTransparent(WIDTH); + return TableLayoutHelper.createTableLayoutPaneWithTitle(Inter.getLocText("Background") + ":", colorSelectBox4button); + } + + private JPanel createButtonConfigPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p,p,p}; + Component[][] components = new Component[][]{ + new Component[]{createTitleStylePane(),null}, + new Component[]{new JSeparator(),null}, + new Component[]{createButtonBackgroundColorPane(),null}, + }; + + return TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); + } + + private void initButtonGroup() { + configStyleButton = new UIButtonGroup(new String[]{Inter.getLocText("Plugin-ChartF_Button_Style"), + Inter.getLocText("Plugin-ChartF_Carousel_Style")}); + configStyleButton.setPreferredSize(new Dimension(WIDTH * 2, (int) configStyleButton.getPreferredSize().getHeight())); + configStyleButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + checkCardPane(); + } + }); + } + + private void checkCardPane() { + CardLayout cardLayout = (CardLayout) configPane.getLayout(); + if (configStyleButton.getSelectedIndex() == 0) { + cardLayout.show(configPane, "button"); + } else { + cardLayout.show(configPane, "carousel"); + } + } + + @Override + public void populateBean(ChartCollection ob) { + if (ob == null){ + return; + } + AttrChangeConfig changeConfigAttr = ob.getChangeConfigAttr(); + if (changeConfigAttr == null){ + return; + } + configStyleButton.setSelectedIndex(changeConfigAttr.getChangeType() == AttrChangeType.BUTTON ? 0 : 1); + + //按钮切换界面 + styleAttrPane.populate(changeConfigAttr.getStyleAttr()); + colorSelectBox4button.setSelectObject(changeConfigAttr.getButtonColor()); + + //轮播切换界面 + timeInterval.setValue(changeConfigAttr.getTimeInterval()); + colorSelectBox4carousel.setSelectObject(changeConfigAttr.getCarouselColor()); + + checkCardPane(); + + } + + @Override + public ChartCollection updateBean() { + return null; + } + + public void updateBean(ChartCollection ob) { + if (ob == null){ + return; + } + AttrChangeConfig changeConfigAttr = ob.getChangeConfigAttr(); + if (changeConfigAttr == null){ + return; + } + changeConfigAttr.setChangeType(configStyleButton.getSelectedIndex() == 0 ? AttrChangeType.BUTTON : AttrChangeType.CAROUSEL); + changeConfigAttr.setStyleAttr(styleAttrPane.update()); + changeConfigAttr.setButtonColor(colorSelectBox4button.getSelectObject()); + changeConfigAttr.setTimeInterval((int) timeInterval.getValue()); + changeConfigAttr.setCarouselColor(colorSelectBox4carousel.getSelectObject()); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("Chart-Change_Config_Attributes"); + } +} diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java index 0d6891050..8d9ed8153 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java @@ -1,20 +1,25 @@ package com.fr.design.mainframe.chart.gui; import com.fr.base.BaseUtils; +import com.fr.chart.base.AttrChangeConfig; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; -import com.fr.chart.charttypes.ColumnIndependentChart; +import com.fr.chart.chartattr.SwitchState; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.dialog.DialogActionListener; +import com.fr.design.dialog.UIDialog; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIToggleButton; +import com.fr.design.gui.imenutable.UIMenuNameableCreator; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.mainframe.chart.gui.ChartTypePane.ComboBoxPane; import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; import com.fr.general.Inter; +import com.fr.stable.StringUtils; import javax.swing.*; import java.awt.*; @@ -33,8 +38,11 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen private static final int B_W = 52; private static final int B_H = 20; private static final int COL_COUNT = 3; + private static final int P_W = 300; + private static final int P_H = 400; private UIButton addButton; + private UIButton configButton; private ArrayList indexList = new ArrayList(); private JPanel buttonPane; @@ -43,34 +51,41 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen private ComboBoxPane editChartType; private UITextField currentEditingEditor = null; - private boolean mouseOnChartTypeButtonPane = false; - - /** - * 鼠标事件是否在这个面板 - * @return 返回是否 - */ - public boolean isMouseOnChartTypeButtonPane() { - return this.mouseOnChartTypeButtonPane; + private ChartTypePane parent = null; + + //配置窗口属性 + private UIMenuNameableCreator configCreator; + + //处理 编辑一个button时,选中另一个button的问题. + //stopEditing不能直接relayout,否则click事件不响应了. + //所以:stopEditing--选中其他button则响应click之后relayout;普通失焦则直接relayout. + private boolean pressOtherButtonWhenEditing = false; + + +// private AWTEventListener awt = new AWTEventListener() { +// public void eventDispatched(AWTEvent event) { +// //没有进行鼠标点击,则返回 +// if (event instanceof MouseEvent && ((MouseEvent) event).getClickCount() > 0) { +// if (currentEditingEditor != null && !ComparatorUtils.equals(event.getSource(), currentEditingEditor)) { +// stopEditing(); +// if (event.getSource() instanceof ChartChangeButton) { +// ((ChartChangeButton) event.getSource()).mouseClick((MouseEvent) event); +// } +// populateBean(editingCollection); +// } +// } +// } +// }; + + public ChartTypeButtonPane(ChartTypePane chartTypePane){ + this(); + parent = chartTypePane; } - private AWTEventListener awt = new AWTEventListener() { - public void eventDispatched(AWTEvent event) { - //没有进行鼠标点击,则返回 - if (event instanceof MouseEvent && ((MouseEvent) event).getClickCount() > 0) { - if (currentEditingEditor != null && !ComparatorUtils.equals(event.getSource(), currentEditingEditor)) { - stopEditing(); - if (event.getSource() instanceof ChartChangeButton) { - ((ChartChangeButton) event.getSource()).mouseClick((MouseEvent) event); - } - populateBean(editingCollection); - } - } - } - }; - public ChartTypeButtonPane() { this.setLayout(new BorderLayout()); addButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); + configButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/config.png")); buttonPane = new JPanel(); this.add(buttonPane, BorderLayout.CENTER); @@ -80,19 +95,38 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen eastPane.setLayout(new BorderLayout()); - eastPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 20)); - eastPane.add(addButton, BorderLayout.NORTH); + eastPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 15)); + JPanel button = new JPanel(); + button.setPreferredSize(new Dimension(45, 20)); + button.setLayout(new GridLayout(1, 2, 5, 0)); + button.add(addButton); + button.add(configButton); + eastPane.add(button, BorderLayout.NORTH); + + initAddButton(); + initConfigButton(); + initConfigCreator(); + + // Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); + } + + private void initConfigCreator() { + configCreator = new UIMenuNameableCreator(Inter.getLocText("Chart-Change_Config_Attributes"), new AttrChangeConfig(), ChangeConfigPane.class); + } + private void initAddButton() { addButton.setPreferredSize(new Dimension(20, 20)); addButton.addActionListener(addListener); - addButton.addMouseListener(mouseListener); - Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); + } + + private void initConfigButton() { + configButton.setPreferredSize(new Dimension(20, 20)); + configButton.addActionListener(configListener); } ActionListener addListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - mouseOnChartTypeButtonPane = true; String name = getNewChartName(); ChartChangeButton button = new ChartChangeButton(name);// some set selected @@ -101,25 +135,50 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen indexList.add(button); if (editingCollection != null) { - Chart[] barChart = ColumnIndependentChart.columnChartTypes; + //点击添加按钮,则会触发切换状态 + Chart chart = editingCollection.getChangeStateNewChart(); try { - Chart newChart = (Chart) barChart[0].clone(); + Chart newChart = (Chart) chart.clone(); editingCollection.addNamedChart(name, newChart); editingCollection.addFunctionRecord(newChart); } catch (CloneNotSupportedException e1) { FRLogger.getLogger().error("Error in Clone"); } - + checkoutChange(); } layoutPane(buttonPane); } }; - MouseListener mouseListener = new MouseAdapter() { + //获取图表收集器的状态 + private void checkoutChange(){ + editingCollection.calculateMultiChartMode(); + if (parent != null){ + parent.reactorChartTypePane(editingCollection); + } + //检查是否可以配置切换 + configButton.setEnabled(editingCollection.changeEnable()); + } + + ActionListener configListener = new ActionListener() { @Override - public void mouseExited(MouseEvent e) { - super.mouseExited(e); - mouseOnChartTypeButtonPane = false; + public void actionPerformed(ActionEvent e) { + UIMenuNameableCreator ui = configCreator.clone(); + final BasicBeanPane pane = ui.getPane(); + pane.populateBean(editingCollection); + UIDialog dialog = pane.showUnsizedWindow(SwingUtilities.getWindowAncestor(new JPanel()), new DialogActionListener() { + @Override + public void doOk() { + pane.updateBean(editingCollection); + } + + @Override + public void doCancel() { + + } + }); + dialog.setSize(P_W, P_H); + dialog.setVisible(true); } }; @@ -246,17 +305,17 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen } layoutPane(buttonPane); - checkAddButtonVisible(); + checkConfigButtonVisible(); + //更新切换面板 + checkoutChange(); } - private void checkAddButtonVisible() { + private void checkConfigButtonVisible() { addButton.setVisible(true); //新建一个collection - if(editingCollection != null && editingCollection.getChartCount() == 1){ - //vanChart 不支持图表切换 目前 - if(!ComparatorUtils.equals(editingCollection.getSelectedChart().getClass(), Chart.class)){ - addButton.setVisible(false); - } + if(editingCollection.getState() == SwitchState.DEFAULT && editingCollection.getSelectedChart() != null){ + //Chart 不支持图表切换 + configButton.setVisible(editingCollection.getSelectedChart().supportChange()); } } @@ -277,12 +336,19 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen if (currentEditingEditor != null) { String newName = currentEditingEditor.getText(); int selectedIndex = editingCollection.getSelectedIndex(); + ChartChangeButton button = indexList.get(selectedIndex); + button.isMoveOn = false; if (!ComparatorUtils.equals(editingCollection.getChartName(selectedIndex), newName)) { editingCollection.setChartName(selectedIndex, newName); HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().fireTargetModified(); + button.changeChartName(newName); } buttonPane.remove(currentEditingEditor); currentEditingEditor = null; + + if(!pressOtherButtonWhenEditing) { + layoutPane(buttonPane); + } } } @@ -300,11 +366,25 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen buttonName = name; this.setToolTipText(name); - nameField.addActionListener(new ActionListener() { + nameField.addActionListener(new ActionListener() {//enter @Override public void actionPerformed(ActionEvent e) { + pressOtherButtonWhenEditing = false; stopEditing(); - populateBean(editingCollection); + } + }); + + nameField.addFocusListener(new FocusListener() { + @Override + public void focusGained(FocusEvent e) { + + } + + @Override + public void focusLost(FocusEvent e) {//编辑状态lost才走这边 + if (currentEditingEditor != null ) { + stopEditing(); + } } }); } @@ -313,6 +393,11 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen return buttonName; } + private void changeChartName(String name) { + this.setText(name); + buttonName = name; + } + public Dimension getPreferredSize() { return new Dimension(B_W, B_H); } @@ -367,12 +452,18 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen for (int i = 0; i < count; i++) { if (ComparatorUtils.equals(getButtonName(), editingCollection.getChartName(i))) { editingCollection.removeNameObject(i); + if (i <= editingCollection.getSelectedIndex()){ + editingCollection.setSelectedIndex(editingCollection.getSelectedIndex()-1); + } break; } } } } + //获取图表收集器的状态 + checkoutChange(); + relayoutPane(); } @@ -386,17 +477,20 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen @Override public void mouseClicked(MouseEvent e) { mouseClick(e); - mouseOnChartTypeButtonPane = true; + if(pressOtherButtonWhenEditing){ + relayoutPane(); + pressOtherButtonWhenEditing = false; + } } public void mouseEntered(MouseEvent e) { checkMoveOn(true); - mouseOnChartTypeButtonPane = true; + pressOtherButtonWhenEditing = currentEditingEditor != null; } public void mouseExited(MouseEvent e) { checkMoveOn(false); - mouseOnChartTypeButtonPane = false; + pressOtherButtonWhenEditing = false; } }; } @@ -422,9 +516,17 @@ public class ChartTypeButtonPane extends BasicBeanPane implemen if (isEnabled()) { noSelected(); + //记录改变前的plotID + String lastPlotID = editingCollection == null ? StringUtils.EMPTY : editingCollection.getSelectedChart().getPlot().getPlotID(); changeCollectionSelected(getButtonName()); setSelectedWithFireListener(true); fireSelectedChanged(); + + //需要先更新,最后重构面板 + //重构面板 + if (parent != null ){ + parent.reLayoutEditPane(lastPlotID, editingCollection); + } } } diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypePane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypePane.java index 2203f4963..964b5bc97 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypePane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypePane.java @@ -4,18 +4,26 @@ import com.fr.base.FRContext; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartattr.Plot; +import com.fr.chart.chartattr.SwitchState; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.dialog.BasicScrollPane; import com.fr.design.gui.frpane.UIComboBoxPane; +import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.mainframe.chart.AbstractChartAttrPane; import com.fr.design.mainframe.chart.ChartEditPane; import com.fr.design.mainframe.chart.PaneTitleConstants; +import com.fr.design.mainframe.chart.gui.item.FlexibleComboBox; +import com.fr.design.mainframe.chart.gui.item.ItemEventType; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; +import com.fr.general.ComparatorUtils; +import com.fr.stable.StringUtils; import javax.swing.*; import java.awt.*; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; @@ -29,12 +37,36 @@ public class ChartTypePane extends AbstractChartAttrPane{ private ChartTypeButtonPane buttonPane; private ChartEditPane editPane; private ChartCollection editingCollection; - + private PaneState paneState = new PaneState(); + + private class PaneState{ + //记录面板所处状态 + private SwitchState paneState = SwitchState.DEFAULT; + //记录当前面板是谁在使用切换状态 + private String chartID = StringUtils.EMPTY; + + public SwitchState getPaneState() { + return paneState; + } + + public void setPaneState(SwitchState paneState) { + this.paneState = paneState; + } + + public String getChartID() { + return chartID; + } + + public void setChartID(String chartID) { + this.chartID = chartID; + } + } + @Override protected JPanel createContentPane() { JPanel content = new JPanel(new BorderLayout()); - buttonPane = new ChartTypeButtonPane(); + buttonPane = new ChartTypeButtonPane(this); content.add(buttonPane, BorderLayout.NORTH); chartTypePane = new ComboBoxPane(); @@ -46,6 +78,7 @@ public class ChartTypePane extends AbstractChartAttrPane{ @Override protected void layoutContentPane() { + leftcontentPane = createContentPane(); this.add(leftcontentPane); } @@ -93,12 +126,20 @@ public class ChartTypePane extends AbstractChartAttrPane{ protected String title4PopupWindow() { return null; } - + + /** + * 不同图表切换分同一个selected的不同图表切换和不同selected的不同图表切换 + * 如果是切换图表的某个图表发生变化,则collection的选择下标不会变 + * 如果是切换图表的不同图表之间切换,则collection的选择下标会改变 + * @param chart + */ public void updateBean(Chart chart) { - int lastSelectIndex = editPane.getSelectedChartIndex(chart); + + Plot oldPlot = chart.getPlot(); + String lastPlotID = oldPlot == null ? StringUtils.EMPTY : oldPlot.getPlotID(); try{ - Chart newDefaultChart = (Chart)((AbstractChartTypePane)cards.get(jcb.getSelectedIndex())).getDefaultChart().clone(); + Chart newDefaultChart = (Chart)((AbstractChartTypePane)getSelectedPane()).getDefaultChart().clone(); if(!chart.accept(newDefaultChart.getClass())){ //vanChart 和 chart 之间切换 editingCollection.removeNameObject(editingCollection.getSelectedIndex()); @@ -110,7 +151,7 @@ public class ChartTypePane extends AbstractChartAttrPane{ } //这一步会替换plot - ((AbstractChartTypePane) cards.get(jcb.getSelectedIndex())).updateBean(chart); + ((AbstractChartTypePane)getSelectedPane()).updateBean(chart); Plot plot = chart.getPlot(); @@ -125,11 +166,133 @@ public class ChartTypePane extends AbstractChartAttrPane{ boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(plotID); - if(editPane.isDefaultPane() != isUseDefault || (!isUseDefault && lastSelectIndex != jcb.getSelectedIndex())){ + if(editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, plotID))){ editPane.reLayout(chart); } } } + + protected UIComboBox createComboBox() { + return new FlexibleComboBox(); + } + + @Override + protected void addItemChangeEvent() { + jcb.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + FlexibleComboBox fcb = (FlexibleComboBox)jcb; + if (fcb.isReactor()){ + return; + } + comboBoxItemStateChanged(); + CardLayout cl = (CardLayout)cardPane.getLayout(); + cl.show(cardPane, cardNames[jcb.getSelectedIndex()]); + } + }); + } + + public void reactor(ChartCollection collection){ + //重构需要重构下拉框选项和cardNames + Chart chart = collection.getSelectedChart(); + String chartID = chart.getPriority(); + if (collection.getState() == SwitchState.DEFAULT){ + chartID = StringUtils.EMPTY; + } + //第一步就是重构cardNames + cardNames = ChartTypeInterfaceManager.getInstance().getTitle4PopupWindow(chartID); + //重构下拉框选项 + reactorComboBox(); + //重新选择选中的下拉项 + chartID = chart.getPriority(); + String plotID = chart.getPlot().getPlotID(); + Object item = ChartTypeInterfaceManager.getInstance().getTitle4PopupWindow(chartID, plotID); + jcb.setSelectedItem(item); + //重新选中 + checkPlotPane(); + } + + private void checkPlotPane() { + CardLayout cl = (CardLayout)cardPane.getLayout(); + cl.show(cardPane, cardNames[jcb.getSelectedIndex()]); + } + + private void reactorComboBox() { + FlexibleComboBox fcb = (FlexibleComboBox)jcb; + fcb.setItemEvenType(ItemEventType.REACTOR); + fcb.removeAllItems(); + for (int i = 0; i < this.cardNames.length; i++) { + fcb.addItem(cardNames[i]); + } + fcb.setItemEvenType(ItemEventType.DEFAULT); + } + + @Override + public void populateBean(Chart ob) { + for (int i = 0; i < this.cards.size(); i++) { + FurtherBasicBeanPane pane = cards.get(i); + if (pane.accept(ob)) { + pane.populateBean(ob); + Object item = pane.title4PopupWindow(); + for (int j = 0; j < cardNames.length; j++) { + if (ComparatorUtils.equals(item, cardNames[j])) { + jcb.setSelectedIndex(j); + } + } + return; + } + } + } + + @Override + public Chart updateBean() { + return getSelectedPane().updateBean(); + } + + @Override + public FurtherBasicBeanPane getSelectedPane(){ + Object item = jcb.getSelectedItem(); + for (int i = 0; i < cards.size(); i++){ + if (ComparatorUtils.equals(item, cards.get(i).title4PopupWindow())){ + return cards.get(i); + } + } + return cards.get(0); + } + + } + + + /** + * 面板重构 + * @param lastPlotID + * @param collection + */ + public void reLayoutEditPane(String lastPlotID, ChartCollection collection){ + Chart chart = collection.getSelectedChart(); + String plotID = chart.getPlot().getPlotID(); + boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(plotID); + if (editPane != null && editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, plotID))){ + editPane.reLayout(chart); + } + } + + + public void reactorChartTypePane(ChartCollection collection){ + if (needReactor(collection)) { + chartTypePane.reactor(collection); + //设置面板切换状态 + updatePaneState(collection); + } + } + + private void updatePaneState(ChartCollection collection) { + paneState.setChartID(collection.getRepresentChartID()); + paneState.setPaneState(collection.getState()); + } + + private boolean needReactor(ChartCollection collection) { + return paneState.getChartID() != collection.getRepresentChartID() || paneState.getPaneState() != collection.getState(); } /** @@ -137,9 +300,12 @@ public class ChartTypePane extends AbstractChartAttrPane{ */ public void populate(ChartCollection collection) { Chart chart = collection.getSelectedChart(); - chartTypePane.populateBean(chart); - + this.remove(leftContentPane); + initContentPane(); + this.removeAttributeChangeListener(); buttonPane.populateBean(collection); + chartTypePane.populateBean(chart); + this.initAllListeners(); } /** @@ -149,7 +315,6 @@ public class ChartTypePane extends AbstractChartAttrPane{ editingCollection = collection; buttonPane.update(collection);// 内部操作时 已经做过处理. Chart chart = collection.getSelectedChart(); - chartTypePane.updateBean(chart); } diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/ColorSelectBoxWithOutTransparent.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/ColorSelectBoxWithOutTransparent.java new file mode 100644 index 000000000..ba0b03241 --- /dev/null +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/ColorSelectBoxWithOutTransparent.java @@ -0,0 +1,20 @@ +package com.fr.design.mainframe.chart.gui; + +import com.fr.design.style.color.ColorSelectBox; +import com.fr.design.style.color.ColorSelectPane; + +/** + * Created by Fangjie on 2016/4/8. + * 没有透明度的颜色选择器 + */ +public class ColorSelectBoxWithOutTransparent extends ColorSelectBox { + public ColorSelectBoxWithOutTransparent(int preferredWidth){ + super(preferredWidth); + } + + + @Override + protected ColorSelectPane getColorSelectPane(){ + return new ColorSelectPaneWithOutTransparent(); + } +} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/ColorSelectPaneWithOutTransparent.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/ColorSelectPaneWithOutTransparent.java new file mode 100644 index 000000000..a32d5d929 --- /dev/null +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/ColorSelectPaneWithOutTransparent.java @@ -0,0 +1,33 @@ +package com.fr.design.mainframe.chart.gui; + +import com.fr.chart.base.ChartConstants; +import com.fr.design.style.color.ColorCell; +import com.fr.design.style.color.ColorSelectPane; + +import javax.swing.*; +import java.awt.*; + +/** + * Created by Fangjie on 2016/4/8. + */ +public class ColorSelectPaneWithOutTransparent extends ColorSelectPane { + + public ColorSelectPaneWithOutTransparent(){ + super(false); + } + + public void initCenterPaneChildren(JPanel centerPane) { + JPanel menuColorPane1 = new JPanel(); + centerPane.add(menuColorPane1); + menuColorPane1.setLayout(new GridLayout(5, 8, 5, 5)); + for (int i = 0; i < ChartConstants.MAP_COLOR_ARRAY.length; i++) { + menuColorPane1.add(new ColorCell(ChartConstants.MAP_COLOR_ARRAY[i], this)); + } + centerPane.add(Box.createVerticalStrut(5)); + centerPane.add(new JSeparator()); + } + + protected Color[] getColorArray(){ + return ChartConstants.MAP_COLOR_ARRAY; + } +} diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/data/DatabaseTableDataPane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/data/DatabaseTableDataPane.java index 4cb51f8f4..6c74211b8 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/gui/data/DatabaseTableDataPane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/data/DatabaseTableDataPane.java @@ -102,4 +102,5 @@ public class DatabaseTableDataPane extends BasicPane{ } }); } + } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java index bf64e4957..d5aa2d93e 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java @@ -133,4 +133,5 @@ public class NormalChartDataPane extends DataContentsPane { public void setSupportCellData(boolean supportCellData) { dataPane.justSupportOneSelect(supportCellData); } + } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/data/ReportDataPane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/data/ReportDataPane.java index cedc08a48..a3ede1b9f 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/gui/data/ReportDataPane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/data/ReportDataPane.java @@ -52,7 +52,7 @@ public class ReportDataPane extends FurtherBasicBeanPane{ * 界面重置 */ public void reset() { - + clear(); } /** @@ -98,4 +98,8 @@ public class ReportDataPane extends FurtherBasicBeanPane{ public ChartCollection updateBean() { return null; } + + public void clear() { + this.removeAll(); + } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/MeterPlotReportDataContentPane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/MeterPlotReportDataContentPane.java index b785373bc..b447c7d09 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/MeterPlotReportDataContentPane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/MeterPlotReportDataContentPane.java @@ -46,8 +46,8 @@ public class MeterPlotReportDataContentPane extends AbstractReportDataContentPan double[] rowSize = { p, p, p}; Component[][] components = new Component[][]{ - new Component[]{new UILabel(CATENAME), getSingCatePane()}, - new Component[]{new UILabel(NVALUE), singValuePane = new TinyFormulaPane()}, + new Component[]{new UILabel(getCateNameString(), SwingConstants.RIGHT), getSingCatePane()}, + new Component[]{new UILabel(getNValueString(), SwingConstants.RIGHT), singValuePane = new TinyFormulaPane()}, new Component[]{null, null} }; @@ -66,6 +66,14 @@ public class MeterPlotReportDataContentPane extends AbstractReportDataContentPan this.add(pane, BorderLayout.CENTER); } + + protected String getCateNameString() { + return CATENAME; + } + + protected String getNValueString() { + return NVALUE; + } public void populateBean(ChartCollection collection) { TopDefinitionProvider definition = collection.getSelectedChart().getFilterDefinition(); diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/item/FlexibleComboBox.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/item/FlexibleComboBox.java new file mode 100644 index 000000000..991858a9a --- /dev/null +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/item/FlexibleComboBox.java @@ -0,0 +1,54 @@ +package com.fr.design.mainframe.chart.gui.item; + +import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.gui.icombobox.UIComboBox; + +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +/** + * Created by hufan on 2016/10/11. + */ +public class FlexibleComboBox extends UIComboBox { + //当前下拉框处理的事件类型 + private ItemEventType itemEvenType = ItemEventType.DEFAULT; + + public boolean isReactor(){ + return itemEvenType == ItemEventType.REACTOR; + } + + public ItemEventType getItemEvenType() { + return itemEvenType; + } + + public void setItemEvenType(ItemEventType itemEvenType) { + this.itemEvenType = itemEvenType; + } + + @Override + protected void initListener() { + if (shouldResponseChangeListener()) { + this.addFocusListener(new FocusAdapter() { + @Override + public void focusGained(FocusEvent e) { + fireSetGlobalName(); + } + }); + this.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + if (uiObserverListener == null) { + return; + } + fireSetGlobalName(); + //只有不在重构状态才会触发下拉框选择时的改变事件 + if (e.getStateChange() == ItemEvent.SELECTED && !isReactor()) { + uiObserverListener.doChange(); + } + } + }); + } + } +} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/item/ItemEventType.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/item/ItemEventType.java new file mode 100644 index 000000000..4a7332d53 --- /dev/null +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/item/ItemEventType.java @@ -0,0 +1,37 @@ +package com.fr.design.mainframe.chart.gui.item; + +import com.fr.general.ComparatorUtils; + +/** + * Created by hufan on 2016/10/11. + */ +public enum ItemEventType { + REACTOR("reactor"),//重构选项 + DEFAULT("default")//默认选项操作 + ; + + //这个String会存起来的,不能随意更改。 + private String type; + + private ItemEventType(String type){ + this.type = type; + } + + public String getType() { + return this.type; + } + + private static ItemEventType[] types; + + public static ItemEventType parse(String type){ + if(types == null){ + types = ItemEventType.values(); + } + for(ItemEventType itemEventType : types){ + if(ComparatorUtils.equals(itemEventType.getType(), type)){ + return itemEventType; + } + } + return DEFAULT; + } +} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartSwitchPane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartSwitchPane.java index 6fdf74ce9..6b1b9d998 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartSwitchPane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartSwitchPane.java @@ -49,8 +49,8 @@ public class ChartSwitchPane extends AbstractAttrNoScrollPane{ if(currentChartEditPane != null) { currentChartEditPane.populate(editingChartCollection);// 选中新Plot之后 刷新对应界面, 比如超级链接等, 然后才能update. - currentChartEditPane.GoToPane(PaneTitleConstants.CHART_TYPE_TITLE); - currentChartEditPane.GoToPane(PaneTitleConstants.CHART_OTHER_TITLE, PaneTitleConstants.CHART_OTHER_TITLE_CHANGE); + currentChartEditPane.gotoPane(PaneTitleConstants.CHART_TYPE_TITLE); + currentChartEditPane.gotoPane(PaneTitleConstants.CHART_OTHER_TITLE, PaneTitleConstants.CHART_OTHER_TITLE_CHANGE); currentChartEditPane.fire(); } } diff --git a/designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartDatapointLabelPane.java b/designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartDatapointLabelPane.java index 1cfdb220f..6afc7b7d7 100644 --- a/designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartDatapointLabelPane.java +++ b/designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartDatapointLabelPane.java @@ -432,7 +432,7 @@ public class ChartDatapointLabelPane extends BasicPane{ this.percentFormatPane = new FormatPane(); } if(this.percentFormat == null){ - DecimalFormat defaultFormat = new CoreDecimalFormat(new DecimalFormat(), "#.##%"); + DecimalFormat defaultFormat = new CoreDecimalFormat(new DecimalFormat("#.##%"), "#.##%"); percentFormatPane.populateBean(defaultFormat); this.percentFormat = defaultFormat; } diff --git a/designer_chart/src/com/fr/design/mainframe/exporter/ExcelExporter4Chart.java b/designer_chart/src/com/fr/design/mainframe/exporter/ExcelExporter4Chart.java deleted file mode 100644 index 71e02d173..000000000 --- a/designer_chart/src/com/fr/design/mainframe/exporter/ExcelExporter4Chart.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.fr.design.mainframe.exporter; - -import com.fr.base.ExcelUtils; -import com.fr.design.mainframe.ChartDesigner; -import com.fr.design.mainframe.JChart; -import com.fr.general.FRLogger; -import com.fr.general.IOUtils; -import com.fr.stable.CoreGraphHelper; -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; -import java.io.IOException; -import java.io.OutputStream; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-22 - * Time: 上午10:47 - */ -public class ExcelExporter4Chart extends ImageExporter4Chart { - private static final int PICTURE_TYPE_PNG = 6 ; - private static final int DEFAULT_COLUMN_SPAN = 12; - private static final int DEFAULT_ROW_SPAN = 26; - private Workbook workbook; - private ClientAnchor anchor; - - - - /** - * 导出 - * - * @param out 输出流 - * @param chart 图表文件 - * @throws Exception 异常 - */ - public void export(OutputStream out, JChart chart) throws Exception { - try { - ChartDesigner designer = chart.getChartDesigner(); - int imageWidth = designer.getArea().getCustomWidth(); - int imageHeight = designer.getArea().getCustomHeight(); - BufferedImage image = CoreGraphHelper.createBufferedImage(imageWidth, (int) imageHeight, BufferedImage.TYPE_INT_RGB); - Graphics2D g2d = image.createGraphics(); - paintGlyph(g2d,imageWidth,imageHeight,designer); - g2d.dispose(); - if (checkExcelExportVersion()) { - workbook = new XSSFWorkbook(); - }else{ - workbook = new HSSFWorkbook(); - } - Sheet sheet = workbook.createSheet(); - if(checkExcelExportVersion()){ - anchor = new XSSFClientAnchor(0,0,0,0,1,1,DEFAULT_COLUMN_SPAN,DEFAULT_ROW_SPAN); - }else{ - anchor = new HSSFClientAnchor(0,0,0,0,(short)1,1,(short)DEFAULT_COLUMN_SPAN,DEFAULT_ROW_SPAN); - } - Drawing patriarch = sheet.createDrawingPatriarch(); - patriarch.createPicture(anchor,loadPicture(image)); - workbook.write(out); - out.flush(); - }catch (Exception e){ - FRLogger.getLogger().error(e.getMessage()); - } - } - - private boolean checkExcelExportVersion() { - return ExcelUtils.checkThirdJarSupportPOI(); - } - // 加载图片. - private int loadPicture(BufferedImage bufferedImage)throws IOException { - ByteArrayOutputStream bos = null; - try { - bos = new ByteArrayOutputStream(); - IOUtils.writeImage(bufferedImage, "png", bos); - //引用这个参数是jdk1.5的版本 XSSFWorkbook.PICTURE_TYPE_PNG, 在1.4下无法编译, 所有手动去掉这个参数. - return workbook.addPicture(bos.toByteArray(), PICTURE_TYPE_PNG); - } finally { - if (bos != null) { - bos.flush(); - bos.close(); - } - bufferedImage.flush(); - } - } -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/exporter/Exporter4Chart.java b/designer_chart/src/com/fr/design/mainframe/exporter/Exporter4Chart.java deleted file mode 100644 index 3e4a36d12..000000000 --- a/designer_chart/src/com/fr/design/mainframe/exporter/Exporter4Chart.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.fr.design.mainframe.exporter; -import com.fr.design.mainframe.JChart; - -import java.io.OutputStream; - -/** - * 图表设计器crt文件的导出成其他类型文件的接口 - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-21 - * Time: 下午7:14 - */ -public interface Exporter4Chart { - - /** - * 将结果crt导出成目标文件 - * - * @param out 输出流 - * @param chart chart文件 - * @throws Exception 导出失败则抛出此异常 - */ - public void export(OutputStream out, JChart chart) throws Exception; - -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/exporter/ImageExporter4Chart.java b/designer_chart/src/com/fr/design/mainframe/exporter/ImageExporter4Chart.java deleted file mode 100644 index 4f3651d1f..000000000 --- a/designer_chart/src/com/fr/design/mainframe/exporter/ImageExporter4Chart.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - */ - -package com.fr.design.mainframe.exporter; - -import com.fr.base.chart.BaseChartGlyph; -import com.fr.base.chart.chartdata.BaseTableDefinition; -import com.fr.base.chart.chartdata.ChartData; -import com.fr.base.chart.chartdata.TopDefinitionProvider; -import com.fr.chart.chartattr.Chart; -import com.fr.chart.chartattr.ChartCollection; -import com.fr.chart.chartglyph.ChartGlyph; -import com.fr.data.TableDataSource; -import com.fr.design.mainframe.ChartDesigner; -import com.fr.design.mainframe.JChart; -import com.fr.script.Calculator; -import com.fr.stable.Constants; -import com.fr.stable.CoreGraphHelper; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.OutputStream; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-15 - * Time: 上午10:04 - */ -public class ImageExporter4Chart implements Exporter4Chart{ - private int resolution = Constants.DEFAULT_WEBWRITE_AND_SCREEN_RESOLUTION; - protected Calculator calculator; - - - public ImageExporter4Chart() { - - } - - /** - * 导出 - * - * @param out 输出流 - * @param chart 图表文件 - * @throws Exception 异常 - */ - public void export(OutputStream out, JChart chart) throws Exception { - ChartDesigner designer = chart.getChartDesigner(); - int imageWidth = designer.getArea().getCustomWidth(); - int imageHeight = designer.getArea().getCustomHeight(); - BufferedImage image = CoreGraphHelper.createBufferedImage(imageWidth, (int) imageHeight, BufferedImage.TYPE_INT_RGB); - Graphics2D g2d = image.createGraphics(); - paintGlyph(g2d,imageWidth,imageHeight,designer); - ImageIO.write(image, "png", out); - } - - protected void paintGlyph(Graphics2D g2d,int imageWidth,int imageHeight,ChartDesigner designer){ - if (imageWidth == 0 || imageHeight == 0) { - return; - } - this.calculator = Calculator.createCalculator(); - this.calculator.setAttribute(TableDataSource.class, null); - g2d.setColor(Color.white); - g2d.fillRect(0, 0, imageWidth,imageHeight); - ChartCollection chartCollection = (ChartCollection) designer.getTarget().getChartCollection(); - Chart editingChart = chartCollection.getSelectedChart(); - - TopDefinitionProvider topDefinition = editingChart.getFilterDefinition(); - ChartData chartData4Glyph = null; - if (topDefinition instanceof BaseTableDefinition) { - chartData4Glyph = ((BaseTableDefinition) topDefinition).calcu4ChartData(calculator, editingChart.getDataProcessor()); - } - - if (chartData4Glyph == null) { - chartData4Glyph = editingChart.defaultChartData(); - } - - BaseChartGlyph chartGlyph = null; - if (editingChart != null && editingChart.getPlot() != null) { - chartGlyph = editingChart.createGlyph(chartData4Glyph); - } - if (chartGlyph instanceof ChartGlyph) { - Image glyphImage = ((ChartGlyph) chartGlyph).toImage(imageWidth, imageHeight, resolution); - g2d.drawImage(glyphImage, 0, 0, null); - } - } -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/mainframe/exporter/PdfExporter4Chart.java b/designer_chart/src/com/fr/design/mainframe/exporter/PdfExporter4Chart.java deleted file mode 100644 index b7a33e4d1..000000000 --- a/designer_chart/src/com/fr/design/mainframe/exporter/PdfExporter4Chart.java +++ /dev/null @@ -1,382 +0,0 @@ -package com.fr.design.mainframe.exporter; - -import com.fr.base.FRContext; -import com.fr.design.mainframe.ChartDesigner; -import com.fr.design.mainframe.JChart; -import com.fr.general.ComparatorUtils; -import com.fr.general.FRLogger; -import com.fr.stable.OperatingSystem; -import com.fr.stable.StableUtils; -import com.fr.third.com.lowagie.text.Document; -import com.fr.third.com.lowagie.text.ExceptionConverter; -import com.fr.third.com.lowagie.text.Rectangle; -import com.fr.third.com.lowagie.text.pdf.*; - -import java.awt.*; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.util.HashMap; -import java.util.Locale; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-22 - * Time: 上午10:20 - */ -public class PdfExporter4Chart extends ImageExporter4Chart { - protected static MyFontMapper fontMapper = null; - - - /** - * 将结果crt导出成目标文件 - * - * @param out 输出流 - * @param chart chart文件 - * @throws Exception 导出失败则抛出此异常 - */ - public void export(OutputStream out, JChart chart) throws Exception { - ChartDesigner designer = chart.getChartDesigner(); - int imageWidth = designer.getArea().getCustomWidth(); - int imageHeight = designer.getArea().getCustomHeight(); - Document document = null; - PdfWriter writer = null; - ByteArrayOutputStream bo = new ByteArrayOutputStream(); - - if (document == null) { - document = new Document(new Rectangle(imageWidth, imageHeight)); - writer = PdfWriter.getInstance(document, bo); - document.open(); - } - //将chart画到PDF上去 - PdfContentByte cb = writer.getDirectContent(); - Graphics2D g2d = cb.createGraphics(imageWidth, imageHeight, prepareFontMapper()); - paintGlyph(g2d, imageWidth, imageHeight, designer); - g2d.dispose(); - if (document != null) { - document.close(); - } - - try { - out.write(bo.toByteArray()); - out.flush(); - out.close(); - } catch (IOException e) { - FRLogger.getLogger().error(e.getMessage()); - } - - - } - - private static void insertDirectory4Linux() { - /* - * alex:在222这台Redhat的机器上测试,发现把从windows拷来的simsun.ttc只有放在usr/share/fonts/default/Type1里面才可以用起来 - * 如果是放在usr/share/fonts目录或是${env}/resources/fonts目录下面,虽然可以读到,但是awtToPdf之后返回出去却依旧无法起作用 - * 中文字依然挤在一起 - * - * 觉得实在很诡异,可能必须放在系统字体的文件夹下面才行吧 - * - * PS:这是在用Graphics drawString的时候遇到的问题 - */ - //Linux - InsertDirectory(fontMapper, new File("/usr/X11R6/lib/X11/fonts")); - InsertDirectory(fontMapper, new File("/usr/share/fonts")); - String path = StableUtils.pathJoin(new String[]{FRContext.getCurrentEnv().getPath(), "fonts"}); - //再去web-inf/fonts里面找一下, 省去客户四处找jdk安装路径的麻烦 - InsertDirectory(fontMapper, new File(path)); - - //Solaris - InsertDirectory(fontMapper, new File("/usr/X/lib/X11/fonts/TrueType")); - InsertDirectory(fontMapper, new File("/usr/openwin/lib/X11/fonts/TrueType")); - } - - private static void insertDirectory4Windows() { - String libraryPath = System.getProperty("java.library.path"); - String[] libraryPathArray = StableUtils.splitString(libraryPath, ";"); - for (int i = 0; i < libraryPathArray.length; i++) { - File libraryFile = new File(libraryPathArray[i]); - InsertDirectory(fontMapper, new File(libraryFile, "Fonts")); - } - - InsertDirectory(fontMapper, new File("C:\\WINNT\\Fonts")); - InsertDirectory(fontMapper, new File("C:\\WINDOWS\\Fonts")); - } - - //peter:循环所有的目录,遍历所有的FontMapper. - protected static void InsertDirectory(MyFontMapper fontMapper, File dir) { - if (dir == null || !dir.exists() || !dir.isDirectory()) { - return; - } - - fontMapper.insertDirectory(dir.getAbsolutePath()); - - File[] listFiles = dir.listFiles(); - for (int i = 0; i < listFiles.length; i++) { - InsertDirectory(fontMapper, listFiles[i]); - } - } - - - /** - * Prepares FontMapper. - */ - protected static MyFontMapper prepareFontMapper() { - if (fontMapper != null) { - return fontMapper; - } - - fontMapper = new MyFontMapper(); - try { - //然后加载系统Font字体. - if (OperatingSystem.isWindows()) { - insertDirectory4Windows(); - - } else { - insertDirectory4Linux(); - - } - - String javaHomeProp = System.getProperty("java.home"); - if (javaHomeProp != null) { - File javaFontFile = new File(StableUtils.pathJoin(new String[]{ - javaHomeProp, "lib", "fonts" - })); - if (javaFontFile.exists() && javaFontFile.isDirectory()) { - InsertDirectory(fontMapper, javaFontFile); - } - } - - if (FRContext.getLocale() == Locale.CHINA || FRContext.getLocale() == Locale.CHINESE) { - MyFontMapper.defaultFont = BaseFont.createFont(MyFontMapper.CHINESE_SIMPLIFIED_FONT, MyFontMapper.CHINESE_SIMPLIFIED_ENCODING_H, BaseFont.NOT_EMBEDDED); - } else if (FRContext.getLocale() == Locale.TAIWAN || FRContext.getLocale() == Locale.TRADITIONAL_CHINESE) { - MyFontMapper.defaultFont = BaseFont.createFont(MyFontMapper.CHINESE_TRADITIONAL_FONT_M_SUNG, MyFontMapper.CHINESE_TRADITIONAL_ENCODING_H, BaseFont.NOT_EMBEDDED); - } else if (FRContext.getLocale() == Locale.JAPAN || FRContext.getLocale() == Locale.JAPANESE) { - MyFontMapper.defaultFont = BaseFont.createFont(MyFontMapper.JAPANESE_FONT_GO, MyFontMapper.JAPANESE_ENCODING_H, BaseFont.NOT_EMBEDDED); - } else if (FRContext.getLocale() == Locale.KOREA || FRContext.getLocale() == Locale.KOREAN) { - MyFontMapper.defaultFont = BaseFont.createFont(MyFontMapper.KOREAN_FONT_GO_THIC, MyFontMapper.KOREAN_ENCODING_H, BaseFont.NOT_EMBEDDED); - } else { - //默认也设置一个吧45422 , 不设置默认字体, linux英文环境导不出来 - MyFontMapper.defaultFont = BaseFont.createFont(MyFontMapper.CHINESE_SIMPLIFIED_FONT, MyFontMapper.CHINESE_SIMPLIFIED_ENCODING_H, BaseFont.NOT_EMBEDDED); - } - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - } - - return fontMapper; - } - - public static class MyFontMapper implements FontMapper { - - public static final String CHINESE_SIMPLIFIED_FONT = "STSong-Light"; - public static final String CHINESE_SIMPLIFIED_ENCODING_H = "UniGB-UCS2-H"; - public static final String CHINESE_SIMPLIFIED_ENCODING_V = "UniGB-UCS2-V"; - - public static final String CHINESE_TRADITIONAL_FONT_M_HEI = "MHei-Medium"; - public static final String CHINESE_TRADITIONAL_FONT_M_SUNG = "MSung-Light"; - public static final String CHINESE_TRADITIONAL_ENCODING_H = "UniCNS-UCS2-H"; - public static final String CHINESE_TRADITIONAL_ENCODING_V = "UniCNS-UCS2-V"; - - public static final String JAPANESE_FONT_GO = "HeiseiKakuGo-W5"; - public static final String JAPANESE_FONT_MIN = "HeiseiMin-W3"; - public static final String JAPANESE_ENCODING_H = "UniJIS-UCS2-H"; - public static final String JAPANESE_ENCODING_V = "UniJIS-UCS2-V"; - public static final String JAPANESE_ENCODING_HW_H = "UniJIS-UCS2-HW-H"; - public static final String JAPANESE_ENCODING_HW_V = "UniJIS-UCS2-HW-V"; - - public static final String KOREAN_FONT_GO_THIC = "HYGoThic-Medium"; - public static final String KOREAN_FONT_S_MYEONG_JO = "HYSMyeongJo-Medium"; - public static final String KOREAN_ENCODING_H = "UniKS-UCS2-H"; - public static final String KOREAN_ENCODING_V = "UniKS-UCS2-V"; - - public static BaseFont defaultFont; - private HashMap mapper; - - public static class BaseFontParameters { - - public String fontName; - public String encoding; - public boolean embedded; - public boolean cached; - public byte ttfAfm[]; - public byte pfb[]; - - public BaseFontParameters(String fontName) { - this.fontName = fontName; - encoding = BaseFont.IDENTITY_H; - embedded = true; - cached = true; - } - - /** - * toString方法 - * - * @return 对象说明 - */ - public String toString() { - return "{fontName:" + fontName + ",encoding:" + encoding + ",embedded:" + embedded + ",cached:" + cached; - } - } - - public MyFontMapper() { - mapper = new HashMap(); - } - - /** - * 转化字体 - * - * @param font awt字体 - * @return pdf字体 - */ - public BaseFont awtToPdf(Font font) { - try { - BaseFontParameters p = getBaseFontParameters(font.getFontName()); - - /* - * alex:不明真相 - * 经测试,Arial粗体在getFontName返回的是Arial Bold,可以在上面的方法中得到对应的p - * 所以getFontName是有用的 - * 但是在linux上测试,宋体在getFontName返回的却是Dialog这种逻辑字体,只有getName才返回SimSun - * 所以还需要getBaseFontParameters一下 - */ - if (p == null) { - p = getBaseFontParameters(font.getName()); - } - - if (p != null) { - return BaseFont.createFont(p.fontName, p.encoding, p.embedded, p.cached, p.ttfAfm, p.pfb); - } else { - // FRContext.getLogger().info(Inter.getLocText("Utils-Font_Not_Found") + ":" + font.getFontName()); - - // alex:未找到合适的字体,如果有默认字体,用之,没有的话,根据Bold & Italic设置字体 - if (defaultFont != null) { - return defaultFont; - } else { - String fontKey = BaseFont.COURIER; - if (font.isBold() && font.isItalic()) { - fontKey = BaseFont.COURIER_BOLDOBLIQUE; - } else if (font.isBold()) { - fontKey = BaseFont.COURIER_BOLD; - } else if (font.isItalic()) { - fontKey = BaseFont.COURIER_OBLIQUE; - } - - return BaseFont.createFont(fontKey, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); - } - } - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - throw new ExceptionConverter(e); - } - } - - /** - * 转化字体 - * - * @param font pdf字体 - * @param size 大小 - * @return 转化后awt字体 - */ - public Font pdfToAwt(BaseFont font, int size) { - String[][] names = font.getFullFontName(); - if (names.length == 1) { - return new Font(names[0][3], 0, size); - } - String name10 = null; - String name3x = null; - for (int k = 0; k < names.length; ++k) { - String[] name = names[k]; - if (ComparatorUtils.equals(name[0], "1") && ComparatorUtils.equals(name[1], "0")) { - name10 = name[3]; - } else if (ComparatorUtils.equals(name[2], "1033")) { - name3x = name[3]; - break; - } - } - String finalName = name3x; - if (finalName == null) { - finalName = name10; - } - if (finalName == null) { - finalName = names[0][3]; - } - return new Font(finalName, 0, size); - } - - private BaseFontParameters getBaseFontParameters(String name) { - return (BaseFontParameters) mapper.get(name); - } - - protected void insertNames(String names[][], String path) { - String main = null; - int k = 0; - do { - if (k >= names.length) { - break; - } - String[] name = names[k]; - if (ComparatorUtils.equals(name[2], "1033")) { - main = name[3]; - break; - } - k++; - } while (true); - if (main == null) { - main = names[0][3]; - } - BaseFontParameters p = new BaseFontParameters(path); - - // alex:不一样的名字可能对应同样的BaseFontParameters,比如simsun和宋体都对应同样的p - mapper.put(main, p); - for (k = 0; k < names.length; k++) { - mapper.put(names[k][3], p); - } - } - - /** - * 插入目录里的字体 - * - * @param dir 目录 - * @return 插入数量 - */ - public int insertDirectory(String dir) { - File file = new File(dir); - if (!file.exists() || !file.isDirectory()) { - return 0; - } - - File[] files = file.listFiles(); - int count = 0; - for (int k = 0; k < files.length; k++) { - file = files[k]; - String name = file.getPath().toLowerCase(); - try { - if (matchPostfix(name)) { - String[][] names = BaseFont.getFullFontName(file.getPath(), BaseFont.CP1252, null); - insertNames(names, file.getPath()); - count++; - } else if (name.endsWith(".ttc")) { - String[] ttcs = BaseFont.enumerateTTCNames(file.getPath()); - for (int j = 0; j < ttcs.length; j++) { - String nt = String.valueOf(new StringBuffer(file.getPath()).append(',').append(j)); - String[][] names = BaseFont.getFullFontName(nt, BaseFont.CP1252, null); - insertNames(names, nt); - } - - count++; - } - } catch (Exception exception) { - FRContext.getLogger().error(exception.getMessage(), exception); - } - } - - return count; - } - - private boolean matchPostfix(String name) { - return name.endsWith(".ttf") || name.endsWith(".otf") || name.endsWith(".afm"); - } - } -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/module/ChartDesignerModule.java b/designer_chart/src/com/fr/design/module/ChartDesignerModule.java index d86c469ff..38034efd0 100644 --- a/designer_chart/src/com/fr/design/module/ChartDesignerModule.java +++ b/designer_chart/src/com/fr/design/module/ChartDesignerModule.java @@ -1 +1 @@ -package com.fr.design.module; import com.fr.chart.base.ChartInternationalNameContentBean; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.actions.core.ActionFactory; import com.fr.design.chart.ChartDialog; import com.fr.design.chart.gui.ChartComponent; import com.fr.design.chart.gui.ChartWidgetOption; import com.fr.design.gui.core.WidgetOption; import com.fr.design.mainframe.App; import com.fr.design.mainframe.ChartAndWidgetPropertyPane; import com.fr.design.mainframe.ChartPropertyPane; import com.fr.form.ui.ChartEditor; import com.fr.general.IOUtils; import com.fr.general.Inter; import com.fr.stable.bridge.StableFactory; import com.fr.stable.plugin.ExtraChartDesignClassManagerProvider; import javax.swing.*; /** * Created by IntelliJ IDEA. * Author : Richer * Version: 7.0.3 * Date: 13-7-8 * Time: 上午9:13 */ public class ChartDesignerModule extends DesignModule { public void start() { super.start(); dealBeforeRegister(); register(); registerFloatEditor(); } protected void dealBeforeRegister(){ StableFactory.registerMarkedClass(ExtraChartDesignClassManagerProvider.XML_TAG, ChartTypeInterfaceManager.class); StableFactory.getStaticMarkedInstanceObjectFromClass(ExtraChartDesignClassManagerProvider.XML_TAG, ExtraChartDesignClassManagerProvider.class); } private void register(){ DesignModuleFactory.registerHyperlinkGroupType(new ChartHyperlinkGroup()); DesignModuleFactory.registerChartEditorClass(ChartEditor.class); DesignModuleFactory.registerChartComponentClass(ChartComponent.class); DesignModuleFactory.registerChartDialogClass(ChartDialog.class); DesignModuleFactory.registerChartAndWidgetPropertyPane(ChartAndWidgetPropertyPane.class); DesignModuleFactory.registerChartPropertyPaneClass(ChartPropertyPane.class); ActionFactory.registerChartPreStyleAction(new ChartPreStyleAction()); } protected void registerFloatEditor() { ActionFactory.registerChartCollection(ChartCollection.class); } /** * 返回设计器能打开的模板类型的一个数组列表 * * @return 可以打开的模板类型的数组 */ public App[] apps4TemplateOpener() { return new App[0]; } protected WidgetOption[] options4Show() { ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstance().getAllChartBaseNames(); ChartWidgetOption[] child = new ChartWidgetOption[typeName.length]; for (int i = 0; i < typeName.length; i++) { String plotID = typeName[i].getPlotID(); Chart[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID); if(rowChart == null) { continue; } String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(plotID); Icon icon = IOUtils.readIcon(iconPath); child[i] = new ChartWidgetOption(Inter.getLocText(typeName[i].getName()), icon, ChartEditor.class, rowChart[0]); } return child; } public String getInterNationalName() { return Inter.getLocText("FR-Chart-Design_ChartModule"); } } \ No newline at end of file +package com.fr.design.module; import com.fr.chart.base.ChartInternationalNameContentBean; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.charttypes.ChartTypeManager; import com.fr.design.ChartTypeInterfaceManager; import com.fr.design.actions.core.ActionFactory; import com.fr.design.chart.ChartDialog; import com.fr.design.chart.gui.ChartComponent; import com.fr.design.chart.gui.ChartWidgetOption; import com.fr.design.gui.core.WidgetOption; import com.fr.design.mainframe.App; import com.fr.design.mainframe.ChartPropertyPane; import com.fr.form.ui.ChartEditor; import com.fr.general.IOUtils; import com.fr.general.Inter; import com.fr.stable.bridge.StableFactory; import com.fr.stable.plugin.ExtraChartDesignClassManagerProvider; import javax.swing.*; /** * Created by IntelliJ IDEA. * Author : Richer * Version: 7.0.3 * Date: 13-7-8 * Time: 上午9:13 */ public class ChartDesignerModule extends DesignModule { public void start() { super.start(); dealBeforeRegister(); register(); registerFloatEditor(); } protected void dealBeforeRegister(){ StableFactory.registerMarkedClass(ExtraChartDesignClassManagerProvider.XML_TAG, ChartTypeInterfaceManager.class); StableFactory.getStaticMarkedInstanceObjectFromClass(ExtraChartDesignClassManagerProvider.XML_TAG, ExtraChartDesignClassManagerProvider.class); } private void register(){ DesignModuleFactory.registerHyperlinkGroupType(new ChartHyperlinkGroup()); DesignModuleFactory.registerChartEditorClass(ChartEditor.class); DesignModuleFactory.registerChartComponentClass(ChartComponent.class); DesignModuleFactory.registerChartDialogClass(ChartDialog.class); DesignModuleFactory.registerChartPropertyPaneClass(ChartPropertyPane.class); ActionFactory.registerChartPreStyleAction(new ChartPreStyleAction()); } protected void registerFloatEditor() { ActionFactory.registerChartCollection(ChartCollection.class); } /** * 返回设计器能打开的模板类型的一个数组列表 * * @return 可以打开的模板类型的数组 */ public App[] apps4TemplateOpener() { return new App[0]; } protected WidgetOption[] options4Show() { ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstance().getAllChartBaseNames(); ChartWidgetOption[] child = new ChartWidgetOption[typeName.length]; for (int i = 0; i < typeName.length; i++) { String plotID = typeName[i].getPlotID(); Chart[] rowChart = ChartTypeManager.getInstance().getChartTypes(plotID); if(rowChart == null) { continue; } String iconPath = ChartTypeInterfaceManager.getInstance().getIconPath(plotID); Icon icon = IOUtils.readIcon(iconPath); child[i] = new ChartWidgetOption(Inter.getLocText(typeName[i].getName()), icon, ChartEditor.class, rowChart[0]); } return child; } public String getInterNationalName() { return Inter.getLocText("FR-Chart-Design_ChartModule"); } } \ No newline at end of file diff --git a/designer_chart/src/com/fr/design/module/ChartStartModule.java b/designer_chart/src/com/fr/design/module/ChartStartModule.java deleted file mode 100644 index 0dab6e923..000000000 --- a/designer_chart/src/com/fr/design/module/ChartStartModule.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. - */ - -package com.fr.design.module; - -import com.fr.base.BaseUtils; -import com.fr.base.FRContext; -import com.fr.base.io.XMLEncryptUtils; -import com.fr.chart.base.ChartInternationalNameContentBean; -import com.fr.chart.chartattr.Chart; -import com.fr.chart.charttypes.ChartTypeManager; -import com.fr.chart.module.ChartModule; -import com.fr.design.DesignerEnvManager; -import com.fr.design.chart.gui.ChartWidgetOption; -import com.fr.design.gui.core.WidgetOption; -import com.fr.design.mainframe.*; -import com.fr.file.FILE; -import com.fr.form.ui.ChartBook; -import com.fr.form.ui.ChartEditor; -import com.fr.general.Inter; -import com.fr.general.ModuleContext; - -/** - * Created by IntelliJ IDEA. - * Author : daisy - * Version: 6.5.6 - * Date: 14-10-13 - * Time: 下午2:56 - */ -public class ChartStartModule extends ChartDesignerModule { - - protected void dealBeforeRegister(){ - ModuleContext.startModule(ChartModule.class.getName()); - } - - protected void registerFloatEditor() { - - } - - protected WidgetOption[] options4Show() { - ChartInternationalNameContentBean[] typeName = ChartTypeManager.getInstance().getAllChartBaseNames(); - ChartWidgetOption[] child = new ChartWidgetOption[typeName.length]; - for (int i = 0; i < typeName.length; i++) { - Chart[] rowChart = ChartTypeManager.getInstance().getChartTypes(typeName[i].getPlotID()); - child[i] = new ChartWidgetOption(Inter.getLocText(typeName[i].getName()), BaseUtils - .readIcon("com/fr/design/images/form/toolbar/" + typeName[i].getName() + ".png"), - ChartEditor.class, rowChart[0]); - } - return child; - } - - /** - * 应用打开器 - * @return 应用 - */ - public App[] apps4TemplateOpener() { - return new App[]{new AbstractAppProvider() { - - @Override - public String[] defaultExtentions() { - return new String[]{"crt"}; - } - - @Override - public JTemplate openTemplate(FILE tplFile) { - return new JChart(asIOFile(tplFile), tplFile); - } - - @Override - public ChartBook asIOFile(FILE file) { - if (XMLEncryptUtils.isCptEncoded() && - !XMLEncryptUtils.checkVaild(DesignerEnvManager.getEnvManager().getEncryptionKey())) { - if (!new DecodeDialog(file).isPwdRight()) { - FRContext.getLogger().error(Inter.getLocText("FR-Chart-Password_Error")); - return new ChartBook(); - } - } - - - ChartBook tpl = new ChartBook(); - //打开通知 - FRContext.getLogger().info(Inter.getLocText(new String[]{"LOG-Is_Being_Openned", "LOG-Please_Wait"}, - new String[]{"\"" + file.getName() + "\"" + ",", "..."})); - try { - tpl.readStream(file.asInputStream()); - } catch (Exception exp) { - FRContext.getLogger().error("Failed to generate frm from " + file, exp); - return null; - } - return tpl; - } - }}; - } -} \ No newline at end of file diff --git a/designer_chart/src/com/fr/start/ChartSplashPane.java b/designer_chart/src/com/fr/start/ChartSplashPane.java deleted file mode 100644 index d081d2164..000000000 --- a/designer_chart/src/com/fr/start/ChartSplashPane.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.fr.start; - -import java.awt.Image; - -import com.fr.base.BaseUtils; - -public class ChartSplashPane extends SplashPane{ - - /** - * 创建启动画面的背景图片 - * - * @return 背景图片 - * - */ - public Image createSplashBackground() { - return BaseUtils.readImage("/com/fr/design/images/splash4Chart.png"); - } -} \ No newline at end of file diff --git a/designer_form/build.dev.gradle b/designer_form/build.dev.gradle new file mode 100644 index 000000000..2b727caac --- /dev/null +++ b/designer_form/build.dev.gradle @@ -0,0 +1,89 @@ + +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) + +//显示依赖jar包 +FileTree f=fileTree(dir:'../../../',include:"finereport-*-stable/${branchName}/**/build/libs/*.jar") +f.each{File file-> + println "----${file.path}" +} + +//声明外部依赖 +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 + diff --git a/designer_form/build.dev.gradle.bak b/designer_form/build.dev.gradle.bak new file mode 100644 index 000000000..24ee9430a --- /dev/null +++ b/designer_form/build.dev.gradle.bak @@ -0,0 +1,89 @@ + +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) + +//显示依赖jar包 +FileTree f=fileTree(dir:'../../../',include:"finereport-*-stable/${branchName}/**/build/libs/*.jar") +f.each{File file-> + println "----${f.path}" +} + +//声明外部依赖 +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 + diff --git a/designer_form/build.master.gradle b/designer_form/build.release.gradle similarity index 94% rename from designer_form/build.master.gradle rename to designer_form/build.release.gradle index 9c9764727..90abcb81e 100644 --- a/designer_form/build.master.gradle +++ b/designer_form/build.release.gradle @@ -4,7 +4,7 @@ tasks.withType(JavaCompile){ options.encoding = 'UTF-8' } //指定构建的jdk版本 -sourceCompatibility=1.7 +sourceCompatibility=1.8 //指定生成的jar包版本 version='8.0' @@ -30,10 +30,9 @@ 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:'../../../finereport-lib-stable/master',include:'**/*.jar') compile fileTree(dir:'../../../',include:"finereport-*-stable/${branchName}/**/build/libs/*.jar") testCompile 'junit:junit:4.12' @@ -63,6 +62,7 @@ task copyFile(type:Copy,dependsOn:compileJava){ task compressJS{ ant.taskdef(name:'yuicompress',classname:'com.yahoo.platform.yui.compressor.YUICompressTask'){ classpath { + fileset(dir:'../../../finereport-lib4build-stable',includes:'**/*.jar') } } diff --git a/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java b/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java index c49ecf0f3..3ab61eb38 100644 --- a/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java +++ b/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java @@ -308,19 +308,23 @@ public class FRAbsoluteLayoutAdapter extends FRBodyLayoutAdapter { * @param y 坐标y */ public void fix(XCreator creator ,int x, int y) { + int height = creator.getHeight(); + int width = creator.getWidth(); if (x < 0) { + width += x; x = 0; } else if (x + creator.getWidth() > container.getWidth()) { - x = container.getWidth() - creator.getWidth(); + width = container.getWidth() - x; } if (y < 0) { + height += y; y = 0; } else if (y + creator.getHeight() > container.getHeight()) { - y = container.getHeight() - creator.getHeight(); + height = container.getHeight() - y; } - creator.setLocation(x, y); + creator.setBounds(x, y, width, height); } @Override diff --git a/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java b/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java index daf6e2dbc..e02dbd8fc 100644 --- a/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java +++ b/designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java @@ -1,5 +1,5 @@ /** - * + * */ package com.fr.design.designer.beans.adapters.layout; @@ -24,6 +24,7 @@ import com.fr.design.designer.properties.FRFitLayoutConstraints; import com.fr.design.designer.properties.FRFitLayoutPropertiesGroupModel; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.mainframe.JForm; +import com.fr.design.utils.ComponentUtils; import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget; import com.fr.form.ui.container.WLayout; @@ -32,620 +33,666 @@ import com.fr.general.ComparatorUtils; /** * 自适应布局的容器适配器 - * + * * @author jim * @date 2014-6-24 */ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter { - - public static final String WIDGETPANEICONPATH="/com/fr/web/images/form/resources/layout_absolute.png"; - private static final int DEPENDING_SCOPE = 3; - private HoverPainter painter; - - /** - * 构造函数 - * @param container XWFitLayout容器 - */ - public FRFitLayoutAdapter(XLayoutContainer container) { - super(container); - painter = new FRFitLayoutPainter(container); - initMinSize(); - } - - private void initMinSize() { - XWFitLayout layout = (XWFitLayout) container; - minWidth = layout.getActualMinWidth(); - minHeight = layout.getActualMinHeight(); - actualVal = layout.getAcualInterval(); - margin = layout.toData().getMargin(); - } - - @Override - public HoverPainter getPainter() { - return painter; - } - - /** - * 返回布局自身属性,方便一些特有设置在layout刷新时处理 - */ - @Override + + public static final String WIDGETPANEICONPATH = "/com/fr/web/images/form/resources/layout_absolute.png"; + private static final int DEPENDING_SCOPE = 3; + private HoverPainter painter; + + /** + * 构造函数 + * + * @param container XWFitLayout容器 + */ + public FRFitLayoutAdapter(XLayoutContainer container) { + super(container); + painter = new FRFitLayoutPainter(container); + initMinSize(); + } + + private void initMinSize() { + XWFitLayout layout = (XWFitLayout) container; + minWidth = layout.getActualMinWidth(); + minHeight = layout.getActualMinHeight(); + actualVal = layout.getAcualInterval(); + margin = layout.toData().getMargin(); + } + + @Override + public HoverPainter getPainter() { + return painter; + } + + /** + * 返回布局自身属性,方便一些特有设置在layout刷新时处理 + */ + @Override public GroupModel getLayoutProperties() { - XWFitLayout xfl = (XWFitLayout) container; + XWFitLayout xfl = (XWFitLayout) container; return new FRFitLayoutPropertiesGroupModel(xfl); } - - /** - * 添加组件 - * - * @param child 待添加的组件 - *@param x 坐标x - *@param y 坐标y - */ - @Override - public void addComp(XCreator child, int x, int y) { - fix(child, x, y); - if (child.shouldScaleCreator() || child.hasTitleStyle()) { - addParentCreator(child); - } else { - container.add(child, child.toData().getWidgetName()); - } - XWFitLayout layout = (XWFitLayout) container; - // 更新对应的BoundsWidget - layout.updateBoundsWidget(); - updateCreatorBackBound(); + + /** + * 添加组件 + * + * @param child 待添加的组件 + * @param x 坐标x + * @param y 坐标y + */ + @Override + public void addComp(XCreator child, int x, int y) { + fix(child, x, y); + if (child.shouldScaleCreator() || child.hasTitleStyle()) { + addParentCreator(child); + } else { + container.add(child, child.toData().getWidgetName()); + } + XWFitLayout layout = (XWFitLayout) container; + // 更新对应的BoundsWidget + layout.updateBoundsWidget(); + updateCreatorBackBound(); + } + + public void updateCreatorBackBound() { + for (int i = 0, size = container.getComponentCount(); i < size; i++) { + XCreator creator = (XCreator) container.getComponent(i); + creator.updateChildBound(minHeight); + creator.setBackupBound(creator.getBounds()); + } + } + + + private void addParentCreator(XCreator child) { + XLayoutContainer parentPanel = child.initCreatorWrapper(minHeight); + container.add(parentPanel, child.toData().getWidgetName()); } - - public void updateCreatorBackBound() { - for (int i=0,size=container.getComponentCount(); i= minWidth * 2 + actualVal; - boolean verticalValid = componentHeight >= minHeight * 2 + actualVal; - return y > upHeight && y < downHeight ? horizonValid : verticalValid; + // 计算是否能拖入鼠标区域时,会用到fix 的方法 + isFindRelatedComps = false; + //拖入组件判断时,先判断是否为交叉点区域,其次三等分区域,再次平分区域 + Component comp = container.getComponentAt(x, y); + if (checkInterval(comp)) { + return false; + } + //如果当前处于边缘地带, 那么就把他贴到父容器上 + boolean isMatchEdge = matchEdge(x, y); + + int componentHeight = comp.getHeight(); + int componentWidth = comp.getWidth(); + //上半部分高度 + int upHeight = (int) (componentHeight * TOP_HALF) + comp.getY(); + //下半部分高度 + int downHeight = (int) (componentHeight * BOTTOM_HALF) + comp.getY(); + + //布局控件要先判断是不是可编辑 + XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer((XCreator) comp).getTopLayout(); + if (topLayout != null && !isMatchEdge && !topLayout.isEditable()) { + return false; + } + + if (isCrossPointArea(comp, x, y)) { + return canAcceptWhileCrossPoint(comp, x, y); + } + + if (isTrisectionArea(comp, x, y)) { + return canAcceptWhileTrisection(comp, x, y); + } + + boolean horizonValid = componentWidth >= minWidth * 2 + actualVal; + boolean verticalValid = componentHeight >= minHeight * 2 + actualVal; + return y > upHeight && y < downHeight ? horizonValid : verticalValid; } - + // 间隔区域 - private boolean checkInterval(Component comp){ - return container.getComponentCount()>0 && comp == container; + private boolean checkInterval(Component comp) { + return container.getComponentCount() > 0 && comp == container; } - + /** * 是否在组件边缘 + * * @param x 横坐标 * @param y 纵坐标 * @return 是否在组件边缘 */ - public boolean matchEdge(int x, int y){ - if(intersectsEdge(x, y,container)){ - //寻找最近的fit, 在边缘地段添加的控件, 将其送给该fit - XLayoutContainer parent = container.findNearestFit(); - container = parent != null ? parent : container; - return true; - } - return false; + public boolean matchEdge(int x, int y) { + if (intersectsEdge(x, y, container)) { + //寻找最近的fit, 在边缘地段添加的控件, 将其送给该fit + XLayoutContainer parent = container.findNearestFit(); + container = parent != null ? parent : container; + return true; + } + return false; } - - /** - * 是否在组件边缘 - * @param x 横坐标 - * @param y 纵坐标 - * @param container 参照组件 - * @return 是否在组件边缘 - */ + + /** + * 是否在组件边缘 + * + * @param x 横坐标 + * @param y 纵坐标 + * @param container 参照组件 + * @return 是否在组件边缘 + */ //是否包含于边缘地段, 按顺序上, 下, 左, 右检测 - public boolean intersectsEdge(int x, int y,XLayoutContainer container) { - int containerX = container.getX(); - int containerY = container.getY(); - int containerWidth = container.getWidth(); - int containerHeight = container.getHeight(); - - // 当前坐标点 - Rectangle currentXY = new Rectangle(x, y, 1, 1); - // 上边缘 - Rectangle upEdge = new Rectangle(containerX, containerY, containerWidth, BORDER_PROPORTION); - if(upEdge.intersects(currentXY)){ - return true; - } - - int bottomY = containerY + containerHeight - BORDER_PROPORTION; - // 下边缘 - Rectangle bottomEdge = new Rectangle(containerX, bottomY, containerWidth, BORDER_PROPORTION); - if(bottomEdge.intersects(currentXY)){ - return true; - } - - //左右边缘的高度 -10*2 是为了不和上下边缘重合 - int verticalHeight = containerHeight - BORDER_PROPORTION * 2; - int leftY = containerY + BORDER_PROPORTION; - // 左边缘 - Rectangle leftEdge = new Rectangle(containerX, leftY, BORDER_PROPORTION, verticalHeight); - if(leftEdge.intersects(currentXY)){ - return true; - } - - int rightY = containerY + BORDER_PROPORTION; - int rightX = containerX + containerWidth - BORDER_PROPORTION; - // 右边缘 - Rectangle rightEdge = new Rectangle(rightX, rightY, BORDER_PROPORTION, verticalHeight); - return rightEdge.intersects(currentXY); - } - + public boolean intersectsEdge(int x, int y, XLayoutContainer container) { + int containerX = container.getX(); + int containerY = container.getY(); + int containerWidth = container.getWidth(); + int containerHeight = container.getHeight(); + + // 当前坐标点 + Rectangle currentXY = new Rectangle(x, y, 1, 1); + // 上边缘 + Rectangle upEdge = new Rectangle(containerX, containerY, containerWidth, BORDER_PROPORTION); + if (upEdge.intersects(currentXY)) { + return true; + } + + int bottomY = containerY + containerHeight - BORDER_PROPORTION; + // 下边缘 + Rectangle bottomEdge = new Rectangle(containerX, bottomY, containerWidth, BORDER_PROPORTION); + if (bottomEdge.intersects(currentXY)) { + return true; + } + + //左右边缘的高度 -10*2 是为了不和上下边缘重合 + int verticalHeight = containerHeight - BORDER_PROPORTION * 2; + int leftY = containerY + BORDER_PROPORTION; + // 左边缘 + Rectangle leftEdge = new Rectangle(containerX, leftY, BORDER_PROPORTION, verticalHeight); + if (leftEdge.intersects(currentXY)) { + return true; + } + + int rightY = containerY + BORDER_PROPORTION; + int rightX = containerX + containerWidth - BORDER_PROPORTION; + // 右边缘 + Rectangle rightEdge = new Rectangle(rightX, rightY, BORDER_PROPORTION, verticalHeight); + return rightEdge.intersects(currentXY); + } + /** * 交叉点区域时,能否对应位置放入组件 */ protected boolean canAcceptWhileCrossPoint(Component comp, int x, int y) { - return super.canAcceptWhileCrossPoint(comp, x, y); + return super.canAcceptWhileCrossPoint(comp, x, y); } protected boolean canAcceptWhileTrisection(Component comp, int x, int y) { - return super.canAcceptWhileTrisection(comp, x, y); + return super.canAcceptWhileTrisection(comp, x, y); } - + /** * 判断是否鼠标在组件的三等分区域,如果组件在布局管理器中间,上下左右都可能会三等分 + * * @param parentComp 鼠标所在区域的组件 - * @param x 坐标x - * @param y 坐标y + * @param x 坐标x + * @param y 坐标y * @return 是则返回true */ public boolean isTrisectionArea(Component parentComp, int x, int y) { - return super.isTrisectionArea(parentComp, x, y); + return super.isTrisectionArea(parentComp, x, y); } - + /** * 是否为组件交叉点区域 或者是相邻三组建中间点 + * * @param currentComp 当前组件 - * @param x 坐标x - * @param y 坐标y + * @param x 坐标x + * @param y 坐标y * @return 是则返回true */ public boolean isCrossPointArea(Component currentComp, int x, int y) { - return super.isCrossPointArea(currentComp, x, y); + return super.isCrossPointArea(currentComp, x, y); } protected void initCompsList() { - super.initCompsList(); + super.initCompsList(); } protected void clearCompsList() { - super.clearCompsList(); + super.clearCompsList(); } - private Rectangle adjustBackupBound(Rectangle backupBound,XWCardMainBorderLayout mainLayout){ - // 参数界面高度对纵坐标产生的影响 - JForm jform = (JForm)(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); - if(jform.getFormDesign().getParaComponent()!= null){ - backupBound.y -= jform.getFormDesign().getParaHeight(); - } - - Rectangle rec = mainLayout.getBounds(); - // XWTabLayout里面的横纵坐标收到外层XWCardMainBorderLayout的横纵坐标影响 - // 减掉之后可以按照它原来的逻辑执行 - backupBound.x -= rec.x; - backupBound.y -= rec.y; - XWCardLayout cardLayout = mainLayout.getCardPart(); - LayoutBorderStyle style = cardLayout.toData().getBorderStyle(); - // 当tab布局为标题样式时,才需要处理标题栏高度产生的影响 - if(ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)){ - backupBound.y -= WCardMainBorderLayout.TAB_HEIGHT; - } - return backupBound; + + private Rectangle adjustBackupBound(Rectangle backupBound, XWCardMainBorderLayout mainLayout) { + // 参数界面高度对纵坐标产生的影响 + JForm jform = (JForm) (HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()); + if (jform.getFormDesign().getParaComponent() != null) { + backupBound.y -= jform.getFormDesign().getParaHeight(); + } + + Rectangle rec = mainLayout.getBounds(); + // XWTabLayout里面的横纵坐标收到外层XWCardMainBorderLayout的横纵坐标影响 + // 减掉之后可以按照它原来的逻辑执行 + backupBound.x -= rec.x; + backupBound.y -= rec.y; + XWCardLayout cardLayout = mainLayout.getCardPart(); + LayoutBorderStyle style = cardLayout.toData().getBorderStyle(); + // 当tab布局为标题样式时,才需要处理标题栏高度产生的影响 + if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { + backupBound.y -= WCardMainBorderLayout.TAB_HEIGHT; + } + return backupBound; } - + /** * 拖拽控件边框后,根据控件的大小尺寸,进行相关组件的调整 + * * @param creator 组件 */ @Override public void fix(XCreator creator) { - //拖拽组件原大小、位置 - Rectangle backupBound = creator.getBackupBound(); - backupBound.x -= container.getX(); - backupBound.y -= container.getY(); - //当前拖拽组件的位置 - int x = creator.getX(); - int y = creator.getY(); - - // 获取容器所有内部组件横坐标 - int[] posXs = container.getHors(); - // 获取容器所有内部组件纵坐标 - int[] posYs = container.getVeris(); - - XLayoutContainer outerLayout = container.getOuterLayout(); - if(!ComparatorUtils.equals(outerLayout, container.getBackupParent())){ - XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout)outerLayout; - backupBound = adjustBackupBound(backupBound, mainLayout); - } - - //拖拽组件拖拽以后的大小 - int w = creator.getWidth(); - int h = creator.getHeight(); - initCompsList(); - creator.setBounds(backupBound); - int difference = 0; - if (x!=backupBound.x) { - dealLeft(backupBound, x, posXs, difference, creator); - } else if(w!=backupBound.width) { - dealRight(backupBound, x, w, posXs, difference, creator); - } else if (y!=backupBound.y) { - dealTop(backupBound, y, posYs, difference, creator); - } else if (h!=backupBound.height) { - dealButtom(backupBound, y, h, posYs, difference, creator); - } - clearCompsList(); - XWFitLayout layout = (XWFitLayout) container; - layout.updateBoundsWidget(); // 更新对应的BoundsWidget - updateCreatorBackBound(); + //拖拽组件原大小、位置 + Rectangle backupBound = creator.getBackupBound(); + backupBound.x -= container.getX(); + backupBound.y -= container.getY(); + //当前拖拽组件的位置 + int x = creator.getX(); + int y = creator.getY(); + + // 获取容器所有内部组件横坐标 + int[] posXs = container.getHors(); + // 获取容器所有内部组件纵坐标 + int[] posYs = container.getVeris(); + + XLayoutContainer outerLayout = container.getOuterLayout(); + if (!ComparatorUtils.equals(outerLayout, container.getBackupParent())) { + XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout) outerLayout; + backupBound = adjustBackupBound(backupBound, mainLayout); + } + + //拖拽组件拖拽以后的大小 + int w = creator.getWidth(); + int h = creator.getHeight(); + initCompsList(); + creator.setBounds(backupBound); + int difference = 0; + if (x != backupBound.x) { + dealLeft(backupBound, x, posXs, difference, creator); + } else if (w != backupBound.width) { + dealRight(backupBound, x, w, posXs, difference, creator); + } else if (y != backupBound.y) { + dealTop(backupBound, y, posYs, difference, creator); + } else if (h != backupBound.height) { + dealButtom(backupBound, y, h, posYs, difference, creator); + } + clearCompsList(); + XWFitLayout layout = (XWFitLayout) container; + layout.updateBoundsWidget(); // 更新对应的BoundsWidget + updateCreatorBackBound(); } - - private void dealLeft(Rectangle backupBound,int x,int[] posXs,int difference,XCreator creator){ - if (backupBound.x == margin.getLeft()) { - return; - } - x = adjustCoordinateByDependingLine(x,posXs); - difference = x-backupBound.x; - dealDirectionAtLeft(backupBound, difference, creator); + + /** + * 拖拽控件边框后,根据控件的大小尺寸,进行相关组件的调整 + * + * @param backupBound 边界备份 + * @param bounds 组件边界 + * @param xCreator 组件 + * @param row 选中的行 + * @param difference 偏移量 + */ + public void calculateBounds(Rectangle backupBound, Rectangle bounds, XCreator xCreator, int row, int difference) { + Rectangle rc = new Rectangle(0,0,0,0); + XLayoutContainer parent = XCreatorUtils.getParentXLayoutContainer(xCreator); + if (parent != null) { + Rectangle rec = ComponentUtils.getRelativeBounds(parent); + rc.x = rec.x; + rc.y = rec.y; + } + int x = backupBound.x - rc.x, y = backupBound.y - rc.y; + //处理左右延伸 + switch (row) { + case 0: + if (backupBound.width + backupBound.x == container.getWidth() - margin.getRight() +rc.x) { + x += difference; + } + break; + case 1: + if(backupBound.y + backupBound.height == container.getHeight() - margin.getBottom() +rc.y){ + y += difference; + } + break; + } + bounds.setLocation(x,y); + xCreator.setBackupBound(backupBound); + xCreator.setBounds(bounds); + this.fix(xCreator); } - - private void dealRight(Rectangle backupBound,int x,int w,int[] posXs,int difference,XCreator creator){ - if (backupBound.width+backupBound.x== container.getWidth() - margin.getRight()) { - return; - } - w = adjustDiffByDependingLine(x, posXs, w); - difference = w-backupBound.width; //拖拽长度 - dealDirectionAtRight(backupBound, difference, creator); + + private void dealLeft(Rectangle backupBound, int x, int[] posXs, int difference, XCreator creator) { + if (backupBound.x == margin.getLeft()) { + return; + } + x = adjustCoordinateByDependingLine(x, posXs); + difference = x - backupBound.x; + dealDirectionAtLeft(backupBound, difference, creator); } - - private void dealTop(Rectangle backupBound,int y,int[] posYs,int difference,XCreator creator){ - if (backupBound.y== margin.getTop()) { - return; - } - y = adjustCoordinateByDependingLine(y, posYs); - difference = y-backupBound.y; - dealDirectionAtTop(backupBound, difference, creator); + + private void dealRight(Rectangle backupBound, int x, int w, int[] posXs, int difference, XCreator creator) { + if (backupBound.width + backupBound.x == container.getWidth() - margin.getRight()) { + return; + } + w = adjustDiffByDependingLine(x, posXs, w); + difference = w - backupBound.width; //拖拽长度 + dealDirectionAtRight(backupBound, difference, creator); } - - private void dealButtom(Rectangle backupBound,int y,int h,int[] posYs,int difference,XCreator creator){ - if (backupBound.y+backupBound.height==container.getHeight() - margin.getBottom()) { - return; - } - h = adjustDiffByDependingLine(y, posYs, h); - difference = h-backupBound.height; - dealDirectionABottom(backupBound, difference, creator); + + private void dealTop(Rectangle backupBound, int y, int[] posYs, int difference, XCreator creator) { + if (backupBound.y == margin.getTop()) { + return; + } + y = adjustCoordinateByDependingLine(y, posYs); + difference = y - backupBound.y; + dealDirectionAtTop(backupBound, difference, creator); + } + + private void dealButtom(Rectangle backupBound, int y, int h, int[] posYs, int difference, XCreator creator) { + if (backupBound.y + backupBound.height == container.getHeight() - margin.getBottom()) { + return; + } + h = adjustDiffByDependingLine(y, posYs, h); + difference = h - backupBound.height; + dealDirectionABottom(backupBound, difference, creator); } - + // 根据需要依附的位置调整拖拽的坐标值 - private int adjustCoordinateByDependingLine(int coordinate,int[] coordinates){ - for(int i=0; i coordinates[i]-DEPENDING_SCOPE && coordinate < coordinates[i] + DEPENDING_SCOPE){ - coordinate = coordinates[i]; - break; - } - } - return coordinate; + private int adjustCoordinateByDependingLine(int coordinate, int[] coordinates) { + for (int i = 0; i < coordinates.length; i++) { + if (coordinate == coordinates[i]) { + continue; + } + if (coordinate > coordinates[i] - DEPENDING_SCOPE && coordinate < coordinates[i] + DEPENDING_SCOPE) { + coordinate = coordinates[i]; + break; + } + } + return coordinate; } - + // 根据需要依附的位置调整拖拽的距离 - private int adjustDiffByDependingLine(int coordinate,int[] coordinates,int diff){ - for(int i=0; i coordinates[i]-DEPENDING_SCOPE && coordinate+diff < coordinates[i] + DEPENDING_SCOPE){ - diff = coordinates[i] - coordinate; - break; - } - } - return diff; + private int adjustDiffByDependingLine(int coordinate, int[] coordinates, int diff) { + for (int i = 0; i < coordinates.length; i++) { + if (coordinate + diff > coordinates[i] - DEPENDING_SCOPE && coordinate + diff < coordinates[i] + DEPENDING_SCOPE) { + diff = coordinates[i] - coordinate; + break; + } + } + return diff; } - + // 左侧边框拉伸,循环找出对齐的两侧控件 private void dealDirectionAtLeft(Rectangle backupBound, int difference, Component creator) { - rightComps.add(creator); - Component rightComp = null; - int leftx = backupBound.x-DEFAULT_AREA_LENGTH - actualVal; - // 取左侧边框右面的组件x值 - int rightx = backupBound.x+DEFAULT_AREA_LENGTH; - Component leftComp = container.getLeftComp(backupBound.x, backupBound.y); - leftComps.add(leftComp); - //先找上侧对齐时(y相等)的左右两边组件 - int ry = backupBound.y; - int ly = leftComp.getY(); - int min = margin.getTop(); - int max = container.getHeight() - margin.getBottom(); - while (ry>= min && ly>= min) { - if (ry == ly) { - break; - } else { - if (ry>ly) { - rightComp = container.getTopComp(rightx, ry); - ry = rightComp.getY(); - rightComps.add(rightComp); - } else { - leftComp = container.getTopComp(leftx, ly); - ly = leftComp.getY(); - leftComps.add(leftComp); - } - } - } - // 下侧对齐时(y+h相等)两边组件 - ry = backupBound.y + backupBound.height ; - ly = leftComps.get(0).getY() + leftComps.get(0).getHeight(); - while(ry<= max && ly<= max) { - if (ry==ly) { - break; - } else { - if (ry>ly) { - leftComp = container.getComponentAt(leftx, ly+DEFAULT_AREA_LENGTH+actualVal); - ly = leftComp.getY() + leftComp.getHeight(); - leftComps.add(leftComp); - } else { - rightComp = container.getComponentAt(rightx, ry+DEFAULT_AREA_LENGTH+actualVal); - ry = rightComp.getY() + rightComp.getHeight(); - rightComps.add(rightComp); - } - } - } - dealHorDirection(backupBound.x, difference); + rightComps.add(creator); + Component rightComp = null; + int leftx = backupBound.x - DEFAULT_AREA_LENGTH - actualVal; + // 取左侧边框右面的组件x值 + int rightx = backupBound.x + DEFAULT_AREA_LENGTH; + Component leftComp = container.getLeftComp(backupBound.x, backupBound.y); + leftComps.add(leftComp); + //先找上侧对齐时(y相等)的左右两边组件 + int ry = backupBound.y; + int ly = leftComp.getY(); + int min = margin.getTop(); + int max = container.getHeight() - margin.getBottom(); + while (ry >= min && ly >= min) { + if (ry == ly) { + break; + } else { + if (ry > ly) { + rightComp = container.getTopComp(rightx, ry); + ry = rightComp.getY(); + rightComps.add(rightComp); + } else { + leftComp = container.getTopComp(leftx, ly); + ly = leftComp.getY(); + leftComps.add(leftComp); + } + } + } + // 下侧对齐时(y+h相等)两边组件 + ry = backupBound.y + backupBound.height; + ly = leftComps.get(0).getY() + leftComps.get(0).getHeight(); + while (ry <= max && ly <= max) { + if (ry == ly) { + break; + } else { + if (ry > ly) { + leftComp = container.getComponentAt(leftx, ly + DEFAULT_AREA_LENGTH + actualVal); + ly = leftComp.getY() + leftComp.getHeight(); + leftComps.add(leftComp); + } else { + rightComp = container.getComponentAt(rightx, ry + DEFAULT_AREA_LENGTH + actualVal); + ry = rightComp.getY() + rightComp.getHeight(); + rightComps.add(rightComp); + } + } + } + dealHorDirection(backupBound.x, difference); } - + // 右侧边框拉伸,循环找出对齐的两侧控件 private void dealDirectionAtRight(Rectangle backupBound, int difference, Component creator) { - leftComps.add(creator); - Component leftComp = null; - int leftx = backupBound.x+backupBound.width-DEFAULT_AREA_LENGTH; - // 取右侧边框右面的组件x值 - int rightx = backupBound.x+backupBound.width+DEFAULT_AREA_LENGTH+actualVal; - Component rightComp = container.getRightComp(backupBound.x, backupBound.y, backupBound.width); - rightComps.add(rightComp); - int ly = backupBound.y, ry = rightComp.getY(); - int min = margin.getTop(); - int max = container.getHeight() - margin.getBottom(); - while (ry>= min && ly>= min) { - if (ry == ly) { - break; - } else { - if (ry>ly) { - rightComp = container.getTopComp(rightx, ry); - ry = rightComp.getY(); - rightComps.add(rightComp); - } else { - leftComp = container.getTopComp(leftx, ly); - ly = leftComp.getY(); - leftComps.add(leftComp); - } - } - } - ly = backupBound.y + backupBound.height; - ry = rightComps.get(0).getY() + rightComps.get(0).getHeight(); - while(ry<= max && ly<= max) { - if (ry==ly) { - break; - } else { - if (ry>ly) { - leftComp = container.getComponentAt(leftx, ly+DEFAULT_AREA_LENGTH+actualVal); - ly = leftComp.getY() + leftComp.getHeight(); - leftComps.add(leftComp); - } else { - rightComp = container.getComponentAt(rightx, ry+DEFAULT_AREA_LENGTH+actualVal); - ry = rightComp.getY() + rightComp.getHeight(); - rightComps.add(rightComp); - } - } - } - dealHorDirection(backupBound.x+backupBound.width+actualVal, difference); + leftComps.add(creator); + Component leftComp = null; + int leftx = backupBound.x + backupBound.width - DEFAULT_AREA_LENGTH; + // 取右侧边框右面的组件x值 + int rightx = backupBound.x + backupBound.width + DEFAULT_AREA_LENGTH + actualVal; + Component rightComp = container.getRightComp(backupBound.x, backupBound.y, backupBound.width); + rightComps.add(rightComp); + int ly = backupBound.y, ry = rightComp.getY(); + int min = margin.getTop(); + int max = container.getHeight() - margin.getBottom(); + while (ry >= min && ly >= min) { + if (ry == ly) { + break; + } else { + if (ry > ly) { + rightComp = container.getTopComp(rightx, ry); + ry = rightComp.getY(); + rightComps.add(rightComp); + } else { + leftComp = container.getTopComp(leftx, ly); + ly = leftComp.getY(); + leftComps.add(leftComp); + } + } + } + ly = backupBound.y + backupBound.height; + ry = rightComps.get(0).getY() + rightComps.get(0).getHeight(); + while (ry <= max && ly <= max) { + if (ry == ly) { + break; + } else { + if (ry > ly) { + leftComp = container.getComponentAt(leftx, ly + DEFAULT_AREA_LENGTH + actualVal); + ly = leftComp.getY() + leftComp.getHeight(); + leftComps.add(leftComp); + } else { + rightComp = container.getComponentAt(rightx, ry + DEFAULT_AREA_LENGTH + actualVal); + ry = rightComp.getY() + rightComp.getHeight(); + rightComps.add(rightComp); + } + } + } + dealHorDirection(backupBound.x + backupBound.width + actualVal, difference); } - + /** - * 水平方向上拉伸边框的处理 + * 水平方向上拉伸边框的处理 */ private void dealHorDirection(int objx, int difference) { - if (difference>0) { - difference = Math.min(getMinWidth(rightComps)-minWidth, difference); - } else { - difference = Math.max(difference, minWidth-getMinWidth(leftComps)); - } - //重新计算左右两侧组件size、point - if(CalculateLefttRelatComponent(difference)){ - CalculateRightRelatComponent(objx+difference, -difference); - } + if (difference > 0) { + difference = Math.min(getMinWidth(rightComps) - minWidth, difference); + } else { + difference = Math.max(difference, minWidth - getMinWidth(leftComps)); + } + //重新计算左右两侧组件size、point + if (CalculateLefttRelatComponent(difference)) { + CalculateRightRelatComponent(objx + difference, -difference); + } } - + // 上侧边框拉伸,循环找出对齐的两侧控件 private void dealDirectionAtTop(Rectangle backupBound, int difference, Component creator) { - downComps.add(creator); - // 取上侧边框上面的组件用的y值 - int topy = backupBound.y-DEFAULT_AREA_LENGTH - actualVal; - // 上侧边框下面的组件y值 - int bottomy = backupBound.y+DEFAULT_AREA_LENGTH; - Component topComp = container.getTopComp(backupBound.x, backupBound.y); - upComps.add(topComp); - Component bottomComp = null; - int min = margin.getLeft(); - int max = container.getWidth() - margin.getRight(); - //先找左侧侧对齐时(x相等)的上下两边组件 - int ux = topComp.getX(); - int dx = backupBound.x; - while(ux>= min && dx>=min) { - if (ux == dx) { - break; - } else { - if (ux= min && dx >= min) { + if (ux == dx) { + break; + } else { + if (ux < dx) { + bottomComp = container.getLeftComp(dx, bottomy); + dx = bottomComp.getX(); + downComps.add(bottomComp); + } else { + topComp = container.getLeftComp(ux, topy); + ux = topComp.getX(); + upComps.add(topComp); + } + } + } + // 右侧对齐时(x+w相等)两边组件 + ux = upComps.get(0).getX() + upComps.get(0).getWidth(); + dx = backupBound.x + backupBound.width; + while (ux <= max && dx <= max) { + if (ux == dx) { + break; + } else { + if (ux < dx) { + topComp = container.getComponentAt(ux + DEFAULT_AREA_LENGTH + actualVal, topy); + ux = topComp.getX() + topComp.getWidth(); + upComps.add(topComp); + } else { + bottomComp = container.getComponentAt(dx + DEFAULT_AREA_LENGTH + actualVal, bottomy); + dx = bottomComp.getX() + bottomComp.getWidth(); + downComps.add(bottomComp); + } + } + } + + dealVertiDirection(backupBound.y, difference); } - + // 下侧边框拉伸,循环找出对齐的两侧控件 private void dealDirectionABottom(Rectangle backupBound, int difference, Component creator) { - upComps.add(creator); - Component topComp = null; - Component bottomComp = container.getBottomComp(backupBound.x, backupBound.y, backupBound.height); - // 下侧边框下面的组件y坐标 - int bottomy = backupBound.y+backupBound.height+DEFAULT_AREA_LENGTH + actualVal; - // 取下侧边框上面的组件用的y值 - int topy = backupBound.y+backupBound.height-DEFAULT_AREA_LENGTH; - downComps.add(bottomComp); - int dx = bottomComp.getX(); - int ux = backupBound.x; - int min = margin.getLeft(); - int max = container.getWidth() - margin.getRight(); - while(ux>= min && dx>= min) { - if (ux == dx) { - break; - } else { - if (ux= min && dx >= min) { + if (ux == dx) { + break; + } else { + if (ux < dx) { + bottomComp = container.getLeftComp(dx, bottomy); + dx = bottomComp.getX(); + downComps.add(bottomComp); + } else { + topComp = container.getLeftComp(ux, topy); + ux = topComp.getX(); + upComps.add(topComp); + } + } + } + dx = downComps.get(0).getX() + downComps.get(0).getWidth(); + ux = backupBound.x + backupBound.width; + while (ux <= max && dx <= max) { + if (ux == dx) { + break; + } else { + if (ux < dx) { + topComp = container.getComponentAt(ux + DEFAULT_AREA_LENGTH + actualVal, topy); + ux = topComp.getX() + topComp.getWidth(); + upComps.add(topComp); + } else { + bottomComp = container.getComponentAt(dx + DEFAULT_AREA_LENGTH + actualVal, bottomy); + dx = bottomComp.getX() + bottomComp.getWidth(); + downComps.add(bottomComp); + } + } + } + dealVertiDirection(backupBound.y + backupBound.height + actualVal, difference); } - + /** - * 垂直方向上拉伸边框的处理 + * 垂直方向上拉伸边框的处理 */ private void dealVertiDirection(int objY, int difference) { - if (difference>0) { - difference = Math.min(getMinHeight(downComps) - minHeight, difference); - } else { - difference = Math.max(difference, minHeight - getMinHeight(upComps)); - } - //重新计算上下两侧组件size、point - if(CalculateUpRelatComponent(difference)){ - CalculateDownRelatComponent(objY+difference, -difference); - }; + if (difference > 0) { + difference = Math.min(getMinHeight(downComps) - minHeight, difference); + } else { + difference = Math.max(difference, minHeight - getMinHeight(upComps)); + } + //重新计算上下两侧组件size、point + if (CalculateUpRelatComponent(difference)) { + CalculateDownRelatComponent(objY + difference, -difference); + } + ; } - + /** - * 新拖入组件时,计算调整其他关联组件位置大小 - * @param child 新拖入的组件 - * @param x 鼠标所在x坐标 - * @param y 鼠标所在y坐标 + * 新拖入组件时,计算调整其他关联组件位置大小 + * + * @param child 新拖入的组件 + * @param x 鼠标所在x坐标 + * @param y 鼠标所在y坐标 */ public void fix(XCreator child, int x, int y) { - Component parentComp = container.getComponentAt(x, y); - if (container.getComponentCount()==0){ - child.setLocation(0, 0); - child.setSize(parentComp.getWidth(), parentComp.getHeight()); - } else if(isCrossPointArea(parentComp, x, y)){ - //交叉区域插入组件时,根据具体位置进行上下或者左右或者相邻三个组件的位置大小插入 - fixCrossPointArea(parentComp, child, x, y); - return; - } else if (isTrisectionArea(parentComp, x, y)) { - // 在边界三等分区域,就不再和组件二等分了 - fixTrisect(parentComp, child, x, y); - return; - } else{ - fixHalve(parentComp, child, x, y); - } + Component parentComp = container.getComponentAt(x, y); + if (container.getComponentCount() == 0) { + child.setLocation(0, 0); + child.setSize(parentComp.getWidth(), parentComp.getHeight()); + } else if (isCrossPointArea(parentComp, x, y)) { + //交叉区域插入组件时,根据具体位置进行上下或者左右或者相邻三个组件的位置大小插入 + fixCrossPointArea(parentComp, child, x, y); + return; + } else if (isTrisectionArea(parentComp, x, y)) { + // 在边界三等分区域,就不再和组件二等分了 + fixTrisect(parentComp, child, x, y); + return; + } else { + fixHalve(parentComp, child, x, y); + } } - + /** * 平分,正常情况拖入组件时,按照上1/4区域、下1/4区域为上下平分,中左侧1/2区域、中右侧1/2区域为左右平分 */ protected void fixHalve(Component currentComp, XCreator child, int x, int y) { - super.fixHalve(currentComp, child, x, y); + super.fixHalve(currentComp, child, x, y); } /** @@ -654,58 +701,60 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter { * 右上角和左下角是水平方向插入组件,这样避免田字块时重复 */ protected void fixCrossPointArea(Component currentComp, XCreator child, int x, int y) { - super.fixCrossPointArea(currentComp, child, x, y); + super.fixCrossPointArea(currentComp, child, x, y); } /** * 三等分区域时,调整相关联的组件 - * @param currentComp 鼠标所在组件 - * @param child 待插入组件 + * + * @param currentComp 鼠标所在组件 + * @param child 待插入组件 */ protected void fixTrisect(Component currentComp, XCreator child, int x, int y) { - super.fixTrisect(currentComp, child, x, y); + super.fixTrisect(currentComp, child, x, y); } /** - * 删除组件或者重新拖动时,其它组件重新计算位置大小 - */ - protected void delete(XCreator creator, int creatorWidth, int creatorHeight) { - int x = creator.getX(); - int y = creator.getY(); - recalculateChildrenSize(x, y, creatorWidth, creatorHeight); + * 删除组件或者重新拖动时,其它组件重新计算位置大小 + */ + protected void delete(XCreator creator, int creatorWidth, int creatorHeight) { + int x = creator.getX(); + int y = creator.getY(); + recalculateChildrenSize(x, y, creatorWidth, creatorHeight); } - + /** * 重新计算内部组件大小 - * @param x 坐标x - * @param y 坐标y - * @param creatorWidth 删除的组件之前所在布局的宽度 + * + * @param x 坐标x + * @param y 坐标y + * @param creatorWidth 删除的组件之前所在布局的宽度 * @param creatorHeight 删除的组件之前所在布局的高度 */ public void recalculateChildrenSize(int x, int y, int creatorWidth, int creatorHeight) { - if (container.getComponentCount() == 0){ - return; - } else{ - initCompsList(); - int width = creatorWidth; - int height = creatorHeight; - calculateRelatedComponent(x, y, width, height); - if (!rightComps.isEmpty() && getAllHeight(rightComps)==height){ - CalculateRightRelatComponent(x, width+actualVal); - } else if (!leftComps.isEmpty() && getAllHeight(leftComps)==height) { - CalculateLefttRelatComponent(width+actualVal); - } else if (!downComps.isEmpty() && getAllWidth(downComps)==width) { - CalculateDownRelatComponent(y, height+actualVal); - } else if(!upComps.isEmpty() && getAllWidth(upComps)==width) { - CalculateUpRelatComponent(height+actualVal); - } else { - // 由于布局三等分的存在,可能会出现删除组件时,找不到关联的组件填充,此时特殊处理 - calculateNoRelatedComponent(x, y, width, height); - } - } - clearCompsList(); + if (container.getComponentCount() == 0) { + return; + } else { + initCompsList(); + int width = creatorWidth; + int height = creatorHeight; + calculateRelatedComponent(x, y, width, height); + if (!rightComps.isEmpty() && getAllHeight(rightComps) == height) { + CalculateRightRelatComponent(x, width + actualVal); + } else if (!leftComps.isEmpty() && getAllHeight(leftComps) == height) { + CalculateLefttRelatComponent(width + actualVal); + } else if (!downComps.isEmpty() && getAllWidth(downComps) == width) { + CalculateDownRelatComponent(y, height + actualVal); + } else if (!upComps.isEmpty() && getAllWidth(upComps) == width) { + CalculateUpRelatComponent(height + actualVal); + } else { + // 由于布局三等分的存在,可能会出现删除组件时,找不到关联的组件填充,此时特殊处理 + calculateNoRelatedComponent(x, y, width, height); + } + } + clearCompsList(); } - + /** * 四侧边框都没有对齐的,此时每侧有且只有一个方向不对齐 * 比如右侧不对齐,那么必然右上或右下没对齐,不会同时不对齐,否则不会出现此情况 @@ -713,416 +762,420 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter { * 右侧不对齐时的组件先上下微调,再向左侧填充。 */ private void calculateNoRelatedComponent(int x, int y, int width, int height) { - // 只有最后一个组件了,直接删除 - if (container.getComponentCount() <= 1) { - return; - } - // 删除当前组件时,由于没有刚好边框对齐的其他组件,这时候需要调整的组件 - Component rightComp = container.getRightComp(x, y, width); - if(rightComp == null){ - return; - } - - int ry = rightComp.getY(); - clearCompsList(); - initCompsList(); - Rectangle rec = new Rectangle(x, y, width, height); - if (ry != y ) { - calculateNoRelatedWhileRightTop(rec, rightComp); - } else { - calculateNoRelatedWhileRightBott(rec, rightComp); - } - + // 只有最后一个组件了,直接删除 + if (container.getComponentCount() <= 1) { + return; + } + // 删除当前组件时,由于没有刚好边框对齐的其他组件,这时候需要调整的组件 + Component rightComp = container.getRightComp(x, y, width); + if (rightComp == null) { + return; + } + + int ry = rightComp.getY(); + clearCompsList(); + initCompsList(); + Rectangle rec = new Rectangle(x, y, width, height); + if (ry != y) { + calculateNoRelatedWhileRightTop(rec, rightComp); + } else { + calculateNoRelatedWhileRightBott(rec, rightComp); + } + } - + private void calculateNoRelatedWhileRightTop(Rectangle bound, Component rcomp) { - if(rcomp == null){ - return; - } - - int ry = rcomp.getY(); - int rh = rcomp.getHeight(); - int rw = rcomp.getWidth(); - int dh = bound.y - ry - actualVal; - // 没法缩小高度 - if (dh < minHeight) { - // 没法缩小时则拉伸rcomp的上边框 - dealDirectionAtTop(rcomp.getBounds(), dh + actualVal, rcomp); - //调整的时候可能有组件达到最小高度,判断下 - if (rcomp.getY() != bound.y) { - clearCompsList(); - initCompsList(); - dealDirectionAtTop(rcomp.getBounds(), bound.y - rcomp.getY()-minHeight - actualVal, rcomp); - ry = rcomp.getY(); - int rx = rcomp.getX(); - rcomp.setBounds(rx, ry, rw, minHeight); - recalculateChildrenSize(rx, bound.y, rw, rh-dh - actualVal); - recalculateChildrenSize(bound.x, bound.y, bound.width, bound.height); - return; - } - } else { - // 右侧控件底部对齐 - if (rh+ry == bound.y+bound.height) { - rcomp.setSize(rw, dh); - bound.width += rw; - bound.width += actualVal; - } else { - recalculateChildrenSize(bound.x, ry+rh + actualVal, bound.width, bound.height+bound.y-rh-ry - actualVal); - recalculateChildrenSize(bound.x, bound.y, bound.width, ry+rh-bound.y); - return; - } - } - recalculateChildrenSize(bound.x, bound.y, bound.width, bound.height); + if (rcomp == null) { + return; + } + + int ry = rcomp.getY(); + int rh = rcomp.getHeight(); + int rw = rcomp.getWidth(); + int dh = bound.y - ry - actualVal; + // 没法缩小高度 + if (dh < minHeight) { + // 没法缩小时则拉伸rcomp的上边框 + dealDirectionAtTop(rcomp.getBounds(), dh + actualVal, rcomp); + //调整的时候可能有组件达到最小高度,判断下 + if (rcomp.getY() != bound.y) { + clearCompsList(); + initCompsList(); + dealDirectionAtTop(rcomp.getBounds(), bound.y - rcomp.getY() - minHeight - actualVal, rcomp); + ry = rcomp.getY(); + int rx = rcomp.getX(); + rcomp.setBounds(rx, ry, rw, minHeight); + recalculateChildrenSize(rx, bound.y, rw, rh - dh - actualVal); + recalculateChildrenSize(bound.x, bound.y, bound.width, bound.height); + return; + } + } else { + // 右侧控件底部对齐 + if (rh + ry == bound.y + bound.height) { + rcomp.setSize(rw, dh); + bound.width += rw; + bound.width += actualVal; + } else { + recalculateChildrenSize(bound.x, ry + rh + actualVal, bound.width, bound.height + bound.y - rh - ry - actualVal); + recalculateChildrenSize(bound.x, bound.y, bound.width, ry + rh - bound.y); + return; + } + } + recalculateChildrenSize(bound.x, bound.y, bound.width, bound.height); } - + private void calculateNoRelatedWhileRightBott(Rectangle bound, Component rcomp) { - rcomp = container.getBottomRightComp(bound.x, bound.y, bound.height, bound.width); - int ry = rcomp.getY(); - int rh = rcomp.getHeight(); - int rw = rcomp.getWidth(); - int dh = ry + rh - bound.y - bound.height - actualVal; - if (dh < minHeight) { - dealDirectionABottom(rcomp.getBounds(), -dh - actualVal, rcomp); - //调整的时候可能有组件达到最小高度,判断下 - if (rcomp.getHeight()+ry != bound.y + bound.height) { - clearCompsList(); - initCompsList(); - dh = ry + rcomp.getHeight() - bound.y - bound.height - actualVal; - dealDirectionABottom(rcomp.getBounds(), minHeight-dh, rcomp); - rh = rcomp.getHeight(); - int rx = rcomp.getX(); - rcomp.setBounds(rx, bound.y+bound.height + actualVal, rw, minHeight); - recalculateChildrenSize(rx, ry, rw, rh-minHeight - actualVal); - recalculateChildrenSize(bound.x, bound.y, bound.width, bound.height); - return; - } - } else { - if (ry == bound.y) { - rcomp.setBounds(rcomp.getX(), bound.y+bound.height + actualVal, rw, dh); - bound.width += rw; - bound.width += actualVal; - } else { - recalculateChildrenSize(bound.x, bound.y, bound.width, ry-bound.y - actualVal); - recalculateChildrenSize(bound.x, ry, bound.width, bound.height-ry+bound.y); - return; - } - } - recalculateChildrenSize(bound.x, bound.y, bound.width, bound.height); + rcomp = container.getBottomRightComp(bound.x, bound.y, bound.height, bound.width); + int ry = rcomp.getY(); + int rh = rcomp.getHeight(); + int rw = rcomp.getWidth(); + int dh = ry + rh - bound.y - bound.height - actualVal; + if (dh < minHeight) { + dealDirectionABottom(rcomp.getBounds(), -dh - actualVal, rcomp); + //调整的时候可能有组件达到最小高度,判断下 + if (rcomp.getHeight() + ry != bound.y + bound.height) { + clearCompsList(); + initCompsList(); + dh = ry + rcomp.getHeight() - bound.y - bound.height - actualVal; + dealDirectionABottom(rcomp.getBounds(), minHeight - dh, rcomp); + rh = rcomp.getHeight(); + int rx = rcomp.getX(); + rcomp.setBounds(rx, bound.y + bound.height + actualVal, rw, minHeight); + recalculateChildrenSize(rx, ry, rw, rh - minHeight - actualVal); + recalculateChildrenSize(bound.x, bound.y, bound.width, bound.height); + return; + } + } else { + if (ry == bound.y) { + rcomp.setBounds(rcomp.getX(), bound.y + bound.height + actualVal, rw, dh); + bound.width += rw; + bound.width += actualVal; + } else { + recalculateChildrenSize(bound.x, bound.y, bound.width, ry - bound.y - actualVal); + recalculateChildrenSize(bound.x, ry, bound.width, bound.height - ry + bound.y); + return; + } + } + recalculateChildrenSize(bound.x, bound.y, bound.width, bound.height); } - + private int getMinWidth(List comps) { - if (comps.isEmpty()) { - return 0; - } - int minWidth =container.getWidth() - margin.getLeft() - margin.getRight(); - for (int i=0, size=comps.size(); icomps.get(i).getWidth() ? comps.get(i).getWidth() : minWidth; - } - return minWidth; + if (comps.isEmpty()) { + return 0; + } + int minWidth = container.getWidth() - margin.getLeft() - margin.getRight(); + for (int i = 0, size = comps.size(); i < size; i++) { + minWidth = minWidth > comps.get(i).getWidth() ? comps.get(i).getWidth() : minWidth; + } + return minWidth; } - + private int getMinHeight(List comps) { - if (comps.isEmpty()) { - return 0; - } - int minH =container.getHeight() - margin.getTop() - margin.getBottom(); - for (int i=0, size=comps.size(); icomps.get(i).getHeight() ? comps.get(i).getHeight() : minH; - } - return minH; + if (comps.isEmpty()) { + return 0; + } + int minH = container.getHeight() - margin.getTop() - margin.getBottom(); + for (int i = 0, size = comps.size(); i < size; i++) { + minH = minH > comps.get(i).getHeight() ? comps.get(i).getHeight() : minH; + } + return minH; } - + // 删除时计算待删除组件上下侧的组件是否何其对齐 private int getAllHeight(List comps) { - int allHeight = 0; - if (comps.isEmpty()) { - return allHeight; - } - int n=comps.size(); - for (int i=0; i comps) { - int allWidth = 0; - if (comps.isEmpty()) { - return allWidth; - } - int n=comps.size(); - for (int i=0; i=0 && objHeight>=(rheight+verti); - boolean isVerti = hori>=0 && objWidth>=(rwidth+hori); - if (isHori && (objX+objWidth+actualVal)==rx) { - rightComps.add(relatComp); - } else if(isHori && objX==(rx+rwidth+actualVal)) { - leftComps.add(relatComp); - } else if(isVerti && (objY+objHeight+actualVal)==ry) { - downComps.add(relatComp); - } else if(isVerti && objY==(ry+rheight+actualVal)) { - upComps.add(relatComp); - } - } + int count = container.getComponentCount(); + for (int i = 0; i < count; i++) { + Component relatComp = container.getComponent(i); + int rx = relatComp.getX(); + int ry = relatComp.getY(); + int rwidth = relatComp.getWidth(); + int rheight = relatComp.getHeight(); + int verti = ry - objY; + int hori = rx - objX; + boolean isHori = verti >= 0 && objHeight >= (rheight + verti); + boolean isVerti = hori >= 0 && objWidth >= (rwidth + hori); + if (isHori && (objX + objWidth + actualVal) == rx) { + rightComps.add(relatComp); + } else if (isHori && objX == (rx + rwidth + actualVal)) { + leftComps.add(relatComp); + } else if (isVerti && (objY + objHeight + actualVal) == ry) { + downComps.add(relatComp); + } else if (isVerti && objY == (ry + rheight + actualVal)) { + upComps.add(relatComp); + } + } } - + /** * 拖拽组件时遍历某一侧组件得到该侧组件能够缩放的最小宽度,tab布局最小宽度 = 内部组件数 * 单个组件最小宽度 + * * @param list 某一侧组件的集合 如:leftComps * @return int 最小宽度 - * */ - private int getCompsMinWidth(List list){ - return getMaxCompsNum(list, true) * WLayout.MIN_WIDTH; + private int getCompsMinWidth(List list) { + return getMaxCompsNum(list, true) * WLayout.MIN_WIDTH; } - + /** * 拖拽组件遍历某一侧得到该侧组件能够缩放的最小高度,tab布局最小高度 = 内部组件数 * 单个组件最小高度 + 标题高度 + * * @param list 某一侧组件集合 * @return int 最小高度 - * */ - private int getCompsMinHeight(List list){ - for(int i=0;i childrenList = creator.getTargetChildrenList(); - if(!childrenList.isEmpty()){ - return getMaxCompsNum(list,false) * WLayout.MIN_HEIGHT + WCardMainBorderLayout.TAB_HEIGHT; - } - } - return WLayout.MIN_HEIGHT; + private int getCompsMinHeight(List list) { + for (int i = 0; i < list.size(); i++) { + XCreator creator = (XCreator) list.get(i); + ArrayList childrenList = creator.getTargetChildrenList(); + if (!childrenList.isEmpty()) { + return getMaxCompsNum(list, false) * WLayout.MIN_HEIGHT + WCardMainBorderLayout.TAB_HEIGHT; + } + } + return WLayout.MIN_HEIGHT; } - + /** * 根据子组件的横(纵)坐标获取某一侧组件的最大内部组件数 - * @param list 某一侧组件集合 + * + * @param list 某一侧组件集合 * @param isHor 是否以横坐标为准 * @return int 最大内部组件数 - * */ - private int getMaxCompsNum(List list,boolean isHor){ - int maxCompNums = 1; - for(int i=0,size=list.size();i childrenList = creator.getTargetChildrenList(); - int count = childrenList.size(); - if(count > 0){ - for(int j=0;j list, boolean isHor) { + int maxCompNums = 1; + for (int i = 0, size = list.size(); i < size; i++) { + XCreator creator = (XCreator) list.get(i); + ArrayList childrenList = creator.getTargetChildrenList(); + int count = childrenList.size(); + if (count > 0) { + for (int j = 0; j < count; j++) { + XWTabFitLayout tabLayout = (XWTabFitLayout) childrenList.get(j); + int[] positions = isHor ? tabLayout.getHors(true) : tabLayout.getVeris(true); + int compNums = positions.length - 1; + maxCompNums = Math.max(compNums, maxCompNums); + } + } + } + return maxCompNums; } - + /** * 根据偏移量缩放内部组件大小,(tab布局用到) + * * @param creator tab布局 - * @param offset 偏移量 - * @param isHor 是否为横向拖拽 + * @param offset 偏移量 + * @param isHor 是否为横向拖拽 */ - private void adjustCompsSize(XCreator creator,int offset,boolean isHor){ - ArrayList childrenList = creator.getTargetChildrenList(); - int size = childrenList.size(); - if(size > 0){ - for(int j=0;j childrenList = creator.getTargetChildrenList(); + int size = childrenList.size(); + if (size > 0) { + for (int j = 0; j < size; j++) { + XWTabFitLayout tabLayout = (XWTabFitLayout) childrenList.get(j); + tabLayout.setBackupBound(tabLayout.getBounds()); + int refSize = isHor ? tabLayout.getWidth() : tabLayout.getHeight(); + double percent = (double) offset / refSize; + if (percent < 0 && !tabLayout.canReduce(percent)) { + return; + } + setAdjustedSize(tabLayout, offset, isHor); + for (int m = 0; m < tabLayout.getComponentCount(); m++) { + XCreator childCreator = tabLayout.getXCreator(m); + BoundsWidget wgt = tabLayout.toData().getBoundsWidget(childCreator.toData()); + wgt.setBounds(tabLayout.getComponent(m).getBounds()); + } + adjustCreatorsSize(percent, tabLayout, isHor); + } + + } } - + // 纵向拖拽,先将tab布局的高度设置为拖拽后的实际高度 - private void setAdjustedHeight(XWTabFitLayout tabLayout,int offset){ - tabLayout.setSize(tabLayout.getWidth(),tabLayout.getHeight() + offset); + private void setAdjustedHeight(XWTabFitLayout tabLayout, int offset) { + tabLayout.setSize(tabLayout.getWidth(), tabLayout.getHeight() + offset); } - + // 横向拖拽,先将tab布局的宽度设置为拖拽后的实际宽度 - private void setAdjustedSize(XWTabFitLayout tabLayout,int offset,boolean isHor){ - if(offset < 0){ - // 缩放时需要备份原tab布局宽高 - tabLayout.setReferDim(new Dimension(tabLayout.getWidth(),tabLayout.getHeight())); - } - if(isHor){ - tabLayout.setSize(tabLayout.getWidth() + offset, tabLayout.getHeight()); - return; - } - setAdjustedHeight(tabLayout,offset); + private void setAdjustedSize(XWTabFitLayout tabLayout, int offset, boolean isHor) { + if (offset < 0) { + // 缩放时需要备份原tab布局宽高 + tabLayout.setReferDim(new Dimension(tabLayout.getWidth(), tabLayout.getHeight())); + } + if (isHor) { + tabLayout.setSize(tabLayout.getWidth() + offset, tabLayout.getHeight()); + return; + } + setAdjustedHeight(tabLayout, offset); } - + // 按照拖拽偏移量,对tab布局进行缩放 - private void adjustCreatorsSize(double percent,XWTabFitLayout tabLayout,boolean isHor){ - if(isHor){ - tabLayout.adjustCreatorsWidth(percent); - return; - } - tabLayout.adjustCreatorsHeight(percent); + private void adjustCreatorsSize(double percent, XWTabFitLayout tabLayout, boolean isHor) { + if (isHor) { + tabLayout.adjustCreatorsWidth(percent); + return; + } + tabLayout.adjustCreatorsHeight(percent); } - - + + /** * 删除或拉伸控件右边框 调整右侧组件位置大小 - * @param objX 调整后的坐标x + * + * @param objX 调整后的坐标x * @param objWidth 调整后的宽度 */ - protected void CalculateRightRelatComponent(int objX, int objWidth){ - int count = rightComps.size(); - for(int i=0; i compsList){ - int compMinWidth = getCompsMinWidth(compsList); - for(int i=0;i (creator.getWidth() - compMinWidth)){ - return true; - } - } - return false; + private boolean isBeyondWidthScope(int offset, List compsList) { + int compMinWidth = getCompsMinWidth(compsList); + for (int i = 0; i < compsList.size(); i++) { + XCreator creator = (XCreator) compsList.get(i); + if (Math.abs(offset) > (creator.getWidth() - compMinWidth)) { + return true; + } + } + return false; } - + /** * 删除或拉伸控件左边框时 调整左侧的组件位置大小; */ - protected boolean CalculateLefttRelatComponent(int objWidth){ - if(isBeyondAdjustWidthScope(objWidth)){ - return false; - } - int count = leftComps.size(); - for(int i=0; i compsList){ - int minHeight = getCompsMinHeight(compsList); - for(int i=0;i (creator.getHeight() - minHeight)){ - return true; - } - } - return false; + private boolean isBeyondHeightScope(int offset, List compsList) { + int minHeight = getCompsMinHeight(compsList); + for (int i = 0; i < compsList.size(); i++) { + XCreator creator = (XCreator) compsList.get(i); + if (Math.abs(offset) > (creator.getHeight() - minHeight)) { + return true; + } + } + return false; } + /** * 删除或拉伸上边框 调整上方的组件位置大小 */ - protected boolean CalculateUpRelatComponent(int objHeight){ - if(isBeyondAdjustHeightScope(objHeight)){ - return false; - } - int count = upComps.size(); - for(int i=0; i set = ExtraDesignClassManager.getInstance().getArray(AbstractFormElementCaseEditorProvider.MARK_STRING); + for (FormElementCaseEditorProvider provider : set) { + if (provider == null) { + continue; + } + this.designer = WidgetPropertyPane.getInstance().getEditingFormDesigner(); + FormProvider formProvider = designer.getTarget(); + ElementCaseEditorProvider elementCaseEditorProvider = this.toData(); + PropertyDescriptor[] extraEditor = provider.createPropertyDescriptor(this.data.getClass(), formProvider, elementCaseEditorProvider); + propertyTableEditor = (CRPropertyDescriptor[]) ArrayUtils.addAll(propertyTableEditor, extraEditor); + } + FormElementCaseEditorProcessor processor = ExtraDesignClassManager.getInstance().getSingle(FormElementCaseEditorProcessor.MARK_STRING); if (processor == null) { return propertyTableEditor; @@ -114,11 +128,11 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme } ReportFitAttrProvider reportFitAttr = editor.getReportFitAttr() == null ? fitAttr : editor.getReportFitAttr(); PropertyDescriptor[] extraEditor = processor.createPropertyDescriptor(this.data.getClass(), reportFitAttr); - if (editor.getReportFitAttr() == null) { editor.setReportFitInPc(processor.getFitStateInPC(fitAttr)); } - return (CRPropertyDescriptor[]) ArrayUtils.addAll(propertyTableEditor, extraEditor); + + return (CRPropertyDescriptor[]) ArrayUtils.addAll(propertyTableEditor, extraEditor); } @Override @@ -181,11 +195,17 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme * @param display 是否 */ public void displayCoverPane(boolean display){ - coverPanel.setVisible(display); - coverPanel.setPreferredSize(editor.getPreferredSize()); - coverPanel.setBounds(editor.getBounds()); - editor.repaint(); - } + coverPanel.setVisible(display); + coverPanel.setBounds(1, 1, (int) editor.getBounds().getWidth(), (int) editor.getBounds().getHeight()); + editor.repaint(); + } + + /** + * 销毁帮助提示框 + */ + public void destroyHelpDialog(){ + coverPanel.destroyHelpDialog(); + } public JComponent getCoverPane(){ return coverPanel; @@ -262,8 +282,13 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme * @param e 点击事件 */ public void respondClick(EditingMouseListener editingMouseListener,MouseEvent e){ + HelpDialogManager.getInstance().setPane(coverPanel); super.respondClick(editingMouseListener, e); - switchTab(e,editingMouseListener); + if (this.isHelpBtnOnFocus()) { + coverPanel.setMsgDisplay(e); + } else { + switchTab(e, editingMouseListener); + } } @@ -280,4 +305,9 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { return new WidgetPropertyUIProvider[]{ new ElementCasePropertyUI(this)}; } + + @Override + public void setXDescrption(String msg) { + coverPanel.setHelpMsg(msg); + } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/XLayoutContainer.java b/designer_form/src/com/fr/design/designer/creator/XLayoutContainer.java index ea27490fa..47f4270a5 100644 --- a/designer_form/src/com/fr/design/designer/creator/XLayoutContainer.java +++ b/designer_form/src/com/fr/design/designer/creator/XLayoutContainer.java @@ -66,7 +66,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Inter .getLocText("FR-Designer_Form-Widget_Name")), new CRPropertyDescriptor("borderStyle", this.data.getClass()).setEditorClass( - WLayoutBorderStyleEditor.class).setRendererClass(LayoutBorderStyleRenderer.class).setI18NName( + WLayoutBorderStyleEditor.class).setI18NName( Inter.getLocText("FR-Engine_Style")).putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Advanced") .setPropertyChangeListener(new PropertyChangeAdapter() { @@ -76,7 +76,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme } }), new CRPropertyDescriptor("margin", this.data.getClass()).setEditorClass(PaddingMarginEditor.class) - .setRendererClass(PaddingMarginCellRenderer.class).setI18NName(Inter.getLocText("FR-Designer_Layout-Padding")) + .setI18NName(Inter.getLocText("FR-Designer_Layout-Padding")) .putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Advanced"), }; } diff --git a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java index b9fea0a0b..e41ac8cba 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java @@ -2,9 +2,19 @@ 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.design.form.util.XCreatorConstants; +import com.fr.design.mainframe.widget.editors.PaddingMarginEditor; +import com.fr.design.mainframe.widget.editors.WLayoutBorderStyleEditor; +import com.fr.design.mainframe.widget.renderer.LayoutBorderStyleRenderer; +import com.fr.design.mainframe.widget.renderer.PaddingMarginCellRenderer; +import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.container.WAbsoluteBodyLayout; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.stable.core.PropertyChangeAdapter; import java.awt.*; +import java.beans.IntrospectionException; /** * Created by zhouping on 2016/10/14. @@ -42,4 +52,43 @@ public class XWAbsoluteBodyLayout extends XWAbsoluteLayout { public void setEditable(boolean isEditable) { super.setEditable(true); } + + /** + * 该组件是否可以拖拽(表单中绝对布局不可以拖拽) + * + * @return 是则返回true + */ + @Override + public boolean isSupportDrag() { + return false; + } + + /** + * 得到属性名 + * + * @return 属性名 + * @throws java.beans.IntrospectionException + */ + @Override + public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException { + return new CRPropertyDescriptor[] { + new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Inter + .getLocText("FR-Designer_Form-Widget_Name")), + new CRPropertyDescriptor("borderStyle", this.data.getClass()).setEditorClass( + WLayoutBorderStyleEditor.class).setRendererClass(LayoutBorderStyleRenderer.class).setI18NName( + Inter.getLocText("FR-Engine_Style")).putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Advanced") + .setPropertyChangeListener(new PropertyChangeAdapter() { + + @Override + public void propertyChange() { + initStyle(); + } + }) + }; + } + + @Override + protected void initStyle() { + initBorderStyle(); + } } diff --git a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java index 210343f8e..df2875939 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java @@ -444,4 +444,36 @@ public class XWAbsoluteLayout extends XLayoutContainer { } } } + + /** + * body大小手动调整的时候 + * 按照比例调整组件的宽度 + * @param percent 比例 + */ + @Override + public void adjustCompWidth(double percent) { + for (int i = 0; i < getComponentCount(); i++) { + XCreator xCreator = (XCreator) getComponent(i); + Rectangle rectangle = xCreator.getBounds(); + xCreator.setBounds((int) (rectangle.x * percent), rectangle.y, (int) (rectangle.width * percent), rectangle.height); + BoundsWidget widget = toData().getBoundsWidget(xCreator.toData()); + widget.setBounds(xCreator.getBounds()); + } + } + + /** + * body大小手动调整的时候 + * 按照比例调整组件的高度 + * @param percent 比例 + */ + @Override + public void adjustCompHeight(double percent) { + for (int i = 0; i < getComponentCount(); i++) { + XCreator xCreator = (XCreator) getComponent(i); + Rectangle rectangle = xCreator.getBounds(); + xCreator.setBounds(rectangle.x, (int) (rectangle.y * percent), rectangle.width, (int) (rectangle.height * percent)); + BoundsWidget widget = toData().getBoundsWidget(xCreator.toData()); + widget.setBounds(xCreator.getBounds()); + } + } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/creator/XWFitLayout.java b/designer_form/src/com/fr/design/designer/creator/XWFitLayout.java index 20b12d888..04904a723 100644 --- a/designer_form/src/com/fr/design/designer/creator/XWFitLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/XWFitLayout.java @@ -21,6 +21,7 @@ import com.fr.design.utils.gui.LayoutUtils; import com.fr.form.ui.PaddingMargin; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget; +import com.fr.form.ui.container.WBodyLayoutType; import com.fr.form.ui.container.WFitLayout; import com.fr.form.ui.container.WLayout; import com.fr.general.FRScreen; @@ -380,6 +381,7 @@ public class XWFitLayout extends XLayoutContainer { needAddWidth = Math.max(needAddWidth, MIN_WIDTH-width); } } + creator.adjustCompWidth((double) creator.getBounds().width / rec.width); toData().setBounds(creator.toData(), creator.getBounds()); } @@ -503,6 +505,7 @@ public class XWFitLayout extends XLayoutContainer { needAddHeight = Math.max(needAddHeight, MIN_HEIGHT-h); } } + creator.adjustCompHeight((double) creator.getBounds().height / rec.height); toData().setBounds(creator.toData(), creator.getBounds()); } @@ -685,7 +688,10 @@ public class XWFitLayout extends XLayoutContainer { if (isRefreshing) { return; } - LayoutUtils.layoutContainer(this); + //当前的body布局为绝对布局的时候不要doLayout + if (toData().getBodyLayoutType() != WBodyLayoutType.ABSOLUTE){ + LayoutUtils.layoutContainer(this); + } WFitLayout layout = this.toData(); //自适应布局新增控件后,其他控件位置也会变 XWidgetCreator creator = (XWidgetCreator) e.getChild(); @@ -834,7 +840,7 @@ public class XWFitLayout extends XLayoutContainer { * 处理自适应布局的directions * @param xcreator 组件 */ - private void dealDirections(XCreator xcreator, boolean isInit) { + public void dealDirections(XCreator xcreator, boolean isInit) { if (xcreator == null) { return; } diff --git a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardLayout.java b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardLayout.java index b5c155c70..4f2492ee9 100644 --- a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardLayout.java @@ -283,7 +283,7 @@ public class XWCardLayout extends XLayoutContainer { } }), new CRPropertyDescriptor("borderStyle", this.data.getClass()).setEditorClass( - CardTagWLayoutBorderStyleEditor.class).setRendererClass(LayoutBorderStyleRenderer.class).setI18NName( + CardTagWLayoutBorderStyleEditor.class).setI18NName( Inter.getLocText("FR-Engine_Style")).putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Advanced") .setPropertyChangeListener(new PropertyChangeAdapter() { diff --git a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java index b247d0bfc..230e7671d 100644 --- a/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java +++ b/designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java @@ -64,7 +64,7 @@ public class XWTabFitLayout extends XWFitLayout { new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Inter .getLocText("FR-Designer_Form-Widget_Name")), new CRPropertyDescriptor("margin", this.data.getClass()).setEditorClass(PaddingMarginEditor.class) - .setRendererClass(PaddingMarginCellRenderer.class).setI18NName(Inter.getLocText("FR-Designer_Layout-Padding")) + .setI18NName(Inter.getLocText("FR-Designer_Layout-Padding")) .putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Advanced"), }; } diff --git a/designer_form/src/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java b/designer_form/src/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java index fff14f03d..b290bcccf 100644 --- a/designer_form/src/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java +++ b/designer_form/src/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java @@ -9,6 +9,7 @@ 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.FRLogger; import com.fr.general.FRScreen; import com.fr.general.Inter; @@ -92,48 +93,7 @@ public class FRAbsoluteBodyLayoutPropertiesGroupModel extends FRAbsoluteLayoutPr } else { if (row == 0) { if (state == WBodyLayoutType.FIT.getTypeValue()) { - XWFitLayout xfl = (XWFitLayout) xwAbsoluteLayout.getBackupParent(); - //备份一下组件间隔 - int compInterval = xfl.toData().getCompInterval(); - 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) { - XCreator xCreator = (XCreator)comp; - if (xCreator.shouldScaleCreator()){ - XLayoutContainer parentPanel = xCreator.initCreatorWrapper(xCreator.getHeight()); - xfl.add(parentPanel, xCreator.toData().getWidgetName()); - continue; - } - xfl.add(xCreator); - } - //这边计算的时候会先把组件间隔去掉 - moveComponents2FitLayout(xfl); - FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); - formDesigner.getSelectionModel().setSelectedCreator(xfl); - xfl.convert(); - LayoutUtils.layoutContainer(xfl); - xfl.adjustCreatorsWhileSlide(xfl.getContainerPercent() - 1.0); - - for (int i = 0; i < components.length; i++) { - Component comp = xfl.getComponent(i); - XCreator creator = (XCreator) comp; - creator.setBackupBound(components[i].getBounds()); - } - - //把组件间隔加上 - if (xfl.toData().getCompInterval() != compInterval) { - xfl.moveContainerMargin(); - xfl.moveCompInterval(xfl.getAcualInterval()); - xfl.toData().setCompInterval(compInterval); - xfl.addCompInterval(xfl.getAcualInterval()); - } - return true; + return switch2FitBodyLayout(); } } if (row == 1) { @@ -168,11 +128,62 @@ public class FRAbsoluteBodyLayoutPropertiesGroupModel extends FRAbsoluteLayoutPr return true; } - //把绝对布局中的元素按规则移动到自适应布局中 + private boolean switch2FitBodyLayout() { + try { + XWFitLayout xfl = (XWFitLayout) xwAbsoluteLayout.getBackupParent(); + //备份一下组件间隔 + int compInterval = xfl.toData().getCompInterval(); + Component[] components = xwAbsoluteLayout.getComponents(); + + Arrays.sort(components, new ComparatorComponentLocation()); + + xfl.getLayoutAdapter().removeBean(xwAbsoluteLayout, xwAbsoluteLayout.getWidth(), xwAbsoluteLayout.getHeight()); + xfl.remove(xwAbsoluteLayout); + + for (Component comp : components) { + XCreator xCreator = (XCreator) comp; + if (xCreator.shouldScaleCreator()) { + XLayoutContainer parentPanel = xCreator.initCreatorWrapper(xCreator.getHeight()); + xfl.add(parentPanel, xCreator.toData().getWidgetName()); + parentPanel.updateChildBound(xfl.getActualMinHeight()); + continue; + } + xfl.add(xCreator); + } + //这边计算的时候会先把组件间隔去掉 + moveComponents2FitLayout(xfl); + FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); + formDesigner.getSelectionModel().setSelectedCreator(xfl); + + for (int i = 0; i < components.length; i++) { + Component comp = xfl.getComponent(i); + XCreator creator = (XCreator) comp; + creator.setBackupBound(components[i].getBounds()); + } + + //把组件间隔加上 + if (xfl.toData().getCompInterval() != compInterval) { + xfl.moveContainerMargin(); + xfl.moveCompInterval(xfl.getAcualInterval()); + xfl.toData().setCompInterval(compInterval); + xfl.addCompInterval(xfl.getAcualInterval()); + } + xfl.toData().setLayoutType(WBodyLayoutType.FIT); + return true; + } + catch (Exception e){ + FRLogger.getLogger().error(e.getMessage()); + return false; + } + } + + // 把绝对布局中的元素按规则移动到自适应布局中 + // 规则:各元素按顺序放置,其中每行最多4个元素,超出则换行,各元素均分body的高度和宽度 private void moveComponents2FitLayout(XWFitLayout xwFitLayout) { int eachRowCount = 4; Component[] components = xwFitLayout.getComponents(); if (components.length <= 1){ + xwFitLayout.updateBoundsWidget(); return; } int layoutWidth = xwFitLayout.getWidth() - xwFitLayout.toData().getMargin().getLeft() - xwFitLayout.toData().getMargin().getRight(); @@ -211,6 +222,7 @@ public class FRAbsoluteBodyLayoutPropertiesGroupModel extends FRAbsoluteLayoutPr ((XWCardMainBorderLayout)components[i]).recalculateChildWidth(components[i].getWidth()); ((XWCardMainBorderLayout)components[i]).recalculateChildHeight(components[i].getHeight()); } + xwFitLayout.dealDirections((XCreator)components[i], false); } xwFitLayout.updateBoundsWidget(); } diff --git a/designer_form/src/com/fr/design/designer/properties/FRFitLayoutConstraints.java b/designer_form/src/com/fr/design/designer/properties/FRFitLayoutConstraints.java index 9ea31f90c..cf177f791 100644 --- a/designer_form/src/com/fr/design/designer/properties/FRFitLayoutConstraints.java +++ b/designer_form/src/com/fr/design/designer/properties/FRFitLayoutConstraints.java @@ -1,11 +1,18 @@ package com.fr.design.designer.properties; +import com.fr.design.designer.beans.AdapterBus; +import com.fr.design.designer.beans.adapters.layout.FRFitLayoutAdapter; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.design.mainframe.widget.editors.IntegerPropertyEditor; import com.fr.design.mainframe.widget.editors.PropertyCellEditor; import com.fr.design.designer.beans.ConstraintsGroupModel; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XWFitLayout; +import com.fr.design.utils.ComponentUtils; +import com.fr.form.ui.PaddingMargin; import com.fr.form.ui.container.WFitLayout; +import com.fr.form.ui.container.WLayout; import com.fr.general.Inter; import javax.swing.*; @@ -22,7 +29,8 @@ import java.awt.*; */ //控件在自适应布局中宽度、高度属性,7.1.1不可编辑 public class FRFitLayoutConstraints implements ConstraintsGroupModel { - private static final int MINHEIGHT = XCreator.SMALL_PREFERRED_SIZE.height; + private static final int MINHEIGHT = WLayout.MIN_HEIGHT; + private static final int MINWIDTH = WLayout.MIN_WIDTH; private static final int ROWNUM = 2; private DefaultTableCellRenderer renderer; @@ -39,7 +47,7 @@ public class FRFitLayoutConstraints implements ConstraintsGroupModel { @Override public String getGroupName() { - return Inter.getLocText("Widget-Size"); + return Inter.getLocText("FR-Designer-Widget_Size"); } @Override @@ -62,9 +70,9 @@ public class FRFitLayoutConstraints implements ConstraintsGroupModel { if (column == 0) { switch (row) { case 0: - return Inter.getLocText("Tree-Width"); + return Inter.getLocText("FR-Designer-Tree_Width"); default: - return Inter.getLocText("Tree-Height"); + return Inter.getLocText("FR-Designer-Tree_Height"); } } else { switch (row) { @@ -80,41 +88,73 @@ public class FRFitLayoutConstraints implements ConstraintsGroupModel { public boolean setValue(Object value, int row, int column) { if (column == 1) { int v = value == null ? 0 : ((Number) value).intValue(); - Rectangle bounds = new Rectangle(xCreator.getBounds()); + int difference = 0; + Rectangle bounds = getBounds(); + Rectangle rec = ComponentUtils.getRelativeBounds(parent); + WFitLayout wFitLayout = parent.toData(); + int minHeight = (int)(MINHEIGHT * wFitLayout.getResolutionScaling()); + int minWidth = (int)(MINWIDTH * wFitLayout.getResolutionScaling()); + PaddingMargin margin= wFitLayout.getMargin(); switch (row) { case 0: if (bounds.width == v){ return false; } + if(bounds.width == rec.width - margin.getLeft() - margin.getRight()){ + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Beyond_Bounds")); + }else if(v < minWidth){ + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Min_Width") + Integer.toString(minWidth)); + v = xCreator.getWidth(); + } + difference = bounds.width - v; bounds.width = v; break; case 1: - if(v < MINHEIGHT){ - JOptionPane.showMessageDialog(null, Inter.getLocText("Min-Height") + Integer.toString(MINHEIGHT)); - v = xCreator.getHeight(); - } if (bounds.height == v){ return false; } + if(bounds.height == rec.height - margin.getTop() - margin.getBottom()){ + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Beyond_Bounds")); + }else if(v < minHeight){ + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Min_Height") + Integer.toString(minHeight)); + v = xCreator.getHeight(); + } + difference = bounds.height - v; bounds.height = v; break; } - WFitLayout wFitLayout = parent.toData(); wFitLayout.setBounds(xCreator.toData(),bounds); - xCreator.setBounds(bounds); - + FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); + Rectangle backupBounds = getBounds(); + FRFitLayoutAdapter layoutAdapter = (FRFitLayoutAdapter) AdapterBus.searchLayoutAdapter(formDesigner, xCreator); + if (layoutAdapter != null) { + layoutAdapter.calculateBounds(backupBounds, bounds, xCreator, row, difference); + } return true; } else { return false; } } + public Rectangle getBounds(){ + Rectangle bounds = new Rectangle(xCreator.getBounds()); + if (parent == null) { + return bounds; + } + Rectangle rec = ComponentUtils.getRelativeBounds(parent); + bounds.x += rec.x; + bounds.y += rec.y; + return bounds; + + } + /** * 该行是否可编辑 * @param row 行 * @return 第row行可编辑返回true,否则返回false */ public boolean isEditable(int row) { - return false; + return true; } + } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java b/designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java index c9654e26d..9ffad4533 100644 --- a/designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java +++ b/designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java @@ -17,6 +17,7 @@ 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.FRLogger; import com.fr.general.Inter; import javax.swing.table.DefaultTableCellRenderer; @@ -145,34 +146,38 @@ public class FRFitLayoutPropertiesGroupModel implements GroupModel { 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) { - XCreator xCreator = (XCreator)component; - //部分控件被ScaleLayout包裹着,绝对布局里面要放出来 - if (xCreator.acceptType(XWScaleLayout.class)){ - if (xCreator.getComponentCount() > 0 && ((XCreator)xCreator.getComponent(0)).shouldScaleCreator()) { - component = xCreator.getComponent(0); - component.setBounds(xCreator.getBounds()); + try { + 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) { + XCreator xCreator = (XCreator) component; + //部分控件被ScaleLayout包裹着,绝对布局里面要放出来 + if (xCreator.acceptType(XWScaleLayout.class)) { + if (xCreator.getComponentCount() > 0 && ((XCreator) xCreator.getComponent(0)).shouldScaleCreator()) { + component = xCreator.getComponent(0); + component.setBounds(xCreator.getBounds()); + } } + xwAbsoluteBodyLayout.add(component); } - 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()})); } - 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()})); + }catch (Exception e){ + FRLogger.getLogger().error(e.getMessage()); + return false; } + layout.setLayoutType(WBodyLayoutType.parse(state)); return true; } return false; diff --git a/designer_form/src/com/fr/design/designer/properties/WidgetPropertyTable.java b/designer_form/src/com/fr/design/designer/properties/WidgetPropertyTable.java index 9f53dddcc..f69771a54 100644 --- a/designer_form/src/com/fr/design/designer/properties/WidgetPropertyTable.java +++ b/designer_form/src/com/fr/design/designer/properties/WidgetPropertyTable.java @@ -21,6 +21,7 @@ import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.designer.creator.cardlayout.XWCardLayout; +import com.fr.general.ComparatorUtils; public class WidgetPropertyTable extends AbstractPropertyTable { @@ -71,7 +72,7 @@ public class WidgetPropertyTable extends AbstractPropertyTable { if (size == 0 || size == 1) { XCreator creator = size == 0 ? designer.getRootComponent() : designer.getSelectionModel().getSelection() .getSelectedCreator(); - if (designer.isRoot(creator)) { + if (ComparatorUtils.equals(creator, designer.getRootComponent())) { groups = designer.getDesignerMode().createRootDesignerPropertyGroup(); } else { groups = getCreatorPropertyGroup(designer, creator); diff --git a/designer_form/src/com/fr/design/designer/properties/items/FRLayoutTypeItems.java b/designer_form/src/com/fr/design/designer/properties/items/FRLayoutTypeItems.java index cd9ddb439..a19d97517 100644 --- a/designer_form/src/com/fr/design/designer/properties/items/FRLayoutTypeItems.java +++ b/designer_form/src/com/fr/design/designer/properties/items/FRLayoutTypeItems.java @@ -7,8 +7,8 @@ import com.fr.form.ui.container.WBodyLayoutType; */ 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())*/}; + new Item(WBodyLayoutType.FIT.description(), WBodyLayoutType.FIT.getTypeValue()), + new Item(WBodyLayoutType.ABSOLUTE.description(), WBodyLayoutType.ABSOLUTE.getTypeValue())}; public Item[] getItems() { return ITEMS; diff --git a/designer_form/src/com/fr/design/form/images/delete icon.png b/designer_form/src/com/fr/design/form/images/delete icon.png new file mode 100644 index 000000000..398c5db5c Binary files /dev/null and b/designer_form/src/com/fr/design/form/images/delete icon.png differ diff --git a/designer_form/src/com/fr/design/form/images/download icon.png b/designer_form/src/com/fr/design/form/images/download icon.png new file mode 100644 index 000000000..68ff09ac4 Binary files /dev/null and b/designer_form/src/com/fr/design/form/images/download icon.png differ diff --git a/designer_form/src/com/fr/design/form/images/download.png b/designer_form/src/com/fr/design/form/images/download.png new file mode 100644 index 000000000..57c328d73 Binary files /dev/null and b/designer_form/src/com/fr/design/form/images/download.png differ diff --git a/designer_form/src/com/fr/design/form/images/install icon.png b/designer_form/src/com/fr/design/form/images/install icon.png new file mode 100644 index 000000000..37877a62c Binary files /dev/null and b/designer_form/src/com/fr/design/form/images/install icon.png differ diff --git a/designer_form/src/com/fr/design/form/images/marked.png b/designer_form/src/com/fr/design/form/images/marked.png new file mode 100644 index 000000000..e022f1cfb Binary files /dev/null and b/designer_form/src/com/fr/design/form/images/marked.png differ diff --git a/designer_form/src/com/fr/design/form/images/refresh.png b/designer_form/src/com/fr/design/form/images/refresh.png new file mode 100644 index 000000000..d0efaf048 Binary files /dev/null and b/designer_form/src/com/fr/design/form/images/refresh.png differ diff --git a/designer_form/src/com/fr/design/form/images/showmenu.png b/designer_form/src/com/fr/design/form/images/showmenu.png new file mode 100644 index 000000000..fa7b09dea Binary files /dev/null and b/designer_form/src/com/fr/design/form/images/showmenu.png differ diff --git a/designer_form/src/com/fr/design/form/images/unmarked.png b/designer_form/src/com/fr/design/form/images/unmarked.png new file mode 100644 index 000000000..259d1dd7c Binary files /dev/null and b/designer_form/src/com/fr/design/form/images/unmarked.png differ diff --git a/designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java b/designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java index f46334dd5..692359bbd 100644 --- a/designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java +++ b/designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java @@ -110,45 +110,48 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP public void initBeforeUpEdit() { WidgetToolBarPane.getInstance(this); EastRegionContainerPane.getInstance().replaceDownPane( - FormWidgetDetailPane.getInstance(this)); + FormWidgetDetailPane.getInstance(this)); if (!BaseUtils.isAuthorityEditing()) { + EastRegionContainerPane.getInstance().addParameterPane(ParameterPropertyPane.getInstance(this)); + EastRegionContainerPane.getInstance().setParameterHeight(ParameterPropertyPane.getInstance(this).getPreferredSize().height); EastRegionContainerPane.getInstance().replaceUpPane( WidgetPropertyPane.getInstance(this)); } else { + EastRegionContainerPane.getInstance().removeParameterPane(); showAuthorityEditPane(); } } - /** - * 创建权限编辑面板 - * @return 面板 - */ + /** + * 创建权限编辑面板 + * @return 面板 + */ public AuthorityEditPane createAuthorityEditPane() { return new FormWidgetAuthorityEditPane(this); } - /** - * 内容属性表面板 - * @return 内容属性表面板 - */ + /** + * 内容属性表面板 + * @return 内容属性表面板 + */ public JPanel getEastUpPane() { return WidgetPropertyPane.getInstance(this); } - /** - * 参数属性表 - * @return 参数属性表 - */ + /** + * 参数属性表 + * @return 参数属性表 + */ public JPanel getEastDownPane() { return FormWidgetDetailPane.getInstance(this); } - /** - * 权限编辑面板 - * @return 权限编辑面板 - */ + /** + * 权限编辑面板 + * @return 权限编辑面板 + */ public AuthorityEditPane getAuthorityEditPane() { FormWidgetAuthorityEditPane formWidgetAuthorityEditPane = new FormWidgetAuthorityEditPane(this); formWidgetAuthorityEditPane.populateDetials(); @@ -230,7 +233,8 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP } ParameterPropertyPane.getInstance().getParameterToolbarPane().populateBean( p.getParameterArray() == null ? new Parameter[0] : p.getParameterArray()); - ParameterPropertyPane.getInstance().repaintContainer(); + EastRegionContainerPane.getInstance().setParameterHeight(ParameterPropertyPane.getInstance().getPreferredSize().height); + } /** @@ -244,9 +248,9 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP return xx.isEmpty(); } - protected void setToolbarButtons(boolean flag) { - DesignerContext.getDesignerFrame().checkCombineUp(!flag, NAME_ARRAY_LIST); - } + protected void setToolbarButtons(boolean flag) { + DesignerContext.getDesignerFrame().checkCombineUp(!flag, NAME_ARRAY_LIST); + } /** * 看看参数面板中的控件是否有和模板参数同名的 @@ -308,17 +312,17 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP return SearchQueryCreators(rootContainer); } - /** - * 返回复制粘贴删除等动作 - * @return 同上 - */ - public Action[] getActions() { - if (designer_actions == null) { - designer_actions = new Action[]{new CutAction(this), new CopyAction(this), new PasteAction(this), - new FormDeleteAction(this)}; - } - return designer_actions; - } + /** + * 返回复制粘贴删除等动作 + * @return 同上 + */ + public Action[] getActions() { + if (designer_actions == null) { + designer_actions = new Action[]{new CutAction(this), new CopyAction(this), new PasteAction(this), + new FormDeleteAction(this)}; + } + return designer_actions; + } private boolean SearchQueryCreators(XLayoutContainer rootContainer) { boolean b = false; @@ -350,9 +354,9 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP ParameterPropertyPane.getInstance().populateBean(p); } - /** - * 初始化 - */ + /** + * 初始化 + */ public void initWidgetToolbarPane() { WidgetToolBarPane.getInstance(this); } @@ -374,38 +378,38 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP this.refreshRoot(); } - /** - * 报表直接判断底层是否是绝对布局 - * @return 是则返回true - */ - public boolean hasWAbsoluteLayout() { - return this.getTarget().getContainer() instanceof WAbsoluteLayout; - } - - /** - * 刷新底层容器 - */ - public void refreshRoot() { - XLayoutContainer layoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator(this.getTarget() - .getContainer()); - if (layoutContainer == null) { - layoutContainer = new XWParameterLayout(); - } - layoutContainer.setSize(LARGE_PREFERRED_SIZE); - setRootComponent(layoutContainer); - } - - /** - * 是否是报表的参数面板 - * @return 是 - */ - public boolean isFormParaDesigner(){ - return true; - } - - public XLayoutContainer getParaComponent() { - return getRootComponent(); - } + /** + * 报表直接判断底层是否是绝对布局 + * @return 是则返回true + */ + public boolean hasWAbsoluteLayout() { + return this.getTarget().getContainer() instanceof WAbsoluteLayout; + } + + /** + * 刷新底层容器 + */ + public void refreshRoot() { + XLayoutContainer layoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator(this.getTarget() + .getContainer()); + if (layoutContainer == null) { + layoutContainer = new XWParameterLayout(); + } + layoutContainer.setSize(LARGE_PREFERRED_SIZE); + setRootComponent(layoutContainer); + } + + /** + * 是否是报表的参数面板 + * @return 是 + */ + public boolean isFormParaDesigner(){ + return true; + } + + public XLayoutContainer getParaComponent() { + return getRootComponent(); + } private void paintLinkParameters(Graphics clipg) { Parameter[] paras = DesignModelAdapter.getCurrentModelAdapter().getParameters(); @@ -490,8 +494,8 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP public void populateRootSize() { ((FormParameterUI) getTarget()).setDesignSize(getRootComponent().getSize()); if (getParaComponent().acceptType(XWParameterLayout.class)) { - WParameterLayout layout = (WParameterLayout)getParaComponent().toData(); - layout.setDesignWidth(getRootComponent().getWidth()); + WParameterLayout layout = (WParameterLayout)getParaComponent().toData(); + layout.setDesignWidth(getRootComponent().getWidth()); } } @@ -548,12 +552,12 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP return true; } - /** - * 加入参数 - * @param parameter 参数 c - * @param currentIndex 位置 w - * @return 是否加入 s - */ + /** + * 加入参数 + * @param parameter 参数 c + * @param currentIndex 位置 w + * @return 是否加入 s + */ public boolean addingParameter2Editor(Parameter parameter, int currentIndex) { com.fr.form.ui.Label label = new com.fr.form.ui.Label(); String name = parameter.getName(); @@ -574,12 +578,12 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP } - /** - * 加入参数 - * @param parameter 参数 c - * @param currentIndex 位置 w - * @return 是否加入 s - */ + /** + * 加入参数 + * @param parameter 参数 c + * @param currentIndex 位置 w + * @return 是否加入 s + */ public boolean addingParameter2EditorWithQueryButton(Parameter parameter, int currentIndex) { com.fr.form.ui.Label label = new com.fr.form.ui.Label(); String name = parameter.getName(); @@ -608,12 +612,12 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP return true; } - /** - * 加入参数 - * @param parameterArray 参数 c - * @param currentIndex 位置 w - * @return 是否加入 s - */ + /** + * 加入参数 + * @param parameterArray 参数 c + * @param currentIndex 位置 w + * @return 是否加入 s + */ public void addingAllParameter2Editor(Parameter[] parameterArray, int currentIndex) { for (int i = 0; i < parameterArray.length; i++) { com.fr.form.ui.Label label = new com.fr.form.ui.Label(); @@ -666,18 +670,18 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP return true; } - /** - * 工具栏 - * @return 工具栏面板 g - */ + /** + * 工具栏 + * @return 工具栏面板 g + */ public JPanel[] toolbarPanes4Form() { return new JPanel[]{FormParaPane.getInstance(this)}; } - /** - * 复制等按钮 - * @return 按钮组 a - */ + /** + * 复制等按钮 + * @return 按钮组 a + */ public JComponent[] toolBarButton4Form() { return new JComponent[]{new CutAction(this).createToolBarComponent(), new CopyAction(this).createToolBarComponent(), new PasteAction(this).createToolBarComponent(), new FormDeleteAction(this).createToolBarComponent()}; diff --git a/designer_form/src/com/fr/design/gui/core/FormWidgetOption.java b/designer_form/src/com/fr/design/gui/core/FormWidgetOption.java index 545ffadf7..b3fa73a26 100644 --- a/designer_form/src/com/fr/design/gui/core/FormWidgetOption.java +++ b/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 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); } \ No newline at end of file +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 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); } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/gui/xpane/LayoutBorderPane.java b/designer_form/src/com/fr/design/gui/xpane/LayoutBorderPane.java index d009c3e64..45713c623 100644 --- a/designer_form/src/com/fr/design/gui/xpane/LayoutBorderPane.java +++ b/designer_form/src/com/fr/design/gui/xpane/LayoutBorderPane.java @@ -280,7 +280,7 @@ public class LayoutBorderPane extends BasicPane { Constants.LINE_THICK, //3px }; - public final static String[] BORDER_TYPE = new String[]{Inter.getLocText("FR-Designer-Widget-Style_Standard"), Inter.getLocText("FR-Designer-Widget-Style_Title")}; + public final static String[] BORDER_TYPE = new String[]{Inter.getLocText("FR-Designer-Widget-Style_Standard"), Inter.getLocText("FR-Designer-Widget-Style_Custom")}; public final static String[] BORDER_STYLE= new String[]{Inter.getLocText("FR-Designer-Widget-Style_Common"), Inter.getLocText("FR-Designer-Widget-Style_Shadow")}; private final static Dimension BUTTON_SIZE = new Dimension(24, 20); diff --git a/designer_form/src/com/fr/design/mainframe/ComponentTree.java b/designer_form/src/com/fr/design/mainframe/ComponentTree.java index cc242f369..4d58c4887 100644 --- a/designer_form/src/com/fr/design/mainframe/ComponentTree.java +++ b/designer_form/src/com/fr/design/mainframe/ComponentTree.java @@ -36,34 +36,7 @@ public class ComponentTree extends JTree { this.setDropMode(DropMode.ON_OR_INSERT); this.setTransferHandler(new TreeTransferHandler()); this.refreshTreeRoot(); - TreePath[] paths = getSelectedTreePath(); addTreeSelectionListener(designer); - setSelectionPaths(paths); - - designer.addDesignerEditListener(new TreeDesignerEditAdapter()); - this.addMouseListener(new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - if (e.isPopupTrigger()) { - popupMenu(e); - } - } - - @Override - public void mousePressed(MouseEvent e) { - if (e.isPopupTrigger()) { - popupMenu(e); - } - } - - @Override - public void mouseReleased(MouseEvent e) { - if (e.isPopupTrigger()) { - popupMenu(e); - } - } - }); setEditable(true); } @@ -124,19 +97,6 @@ public class ComponentTree extends JTree { 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()); - } /** * 刷新 @@ -159,40 +119,7 @@ public class ComponentTree extends JTree { 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(); - } - } /** @@ -277,12 +204,14 @@ public class ComponentTree extends JTree { creator.notShowInComponentTree(path); } //绝对布局作为body的时候不显示自适应布局父层 - if (((XCreator) parent).acceptType(XWAbsoluteBodyLayout.class) - && (parent.getParent() != null) - && ((XCreator)parent.getParent()).acceptType(XWFitLayout.class)){ - parent = parent.getParent().getParent(); - continue; + if (((XCreator) parent).acceptType(XWAbsoluteBodyLayout.class)) { + if ((parent.getParent() != null) + && ((XCreator)parent.getParent()).acceptType(XWFitLayout.class)){ + parent = parent.getParent().getParent(); + continue; + } } + parent = parent.getParent(); } Object[] components = path.toArray(); diff --git a/designer_form/src/com/fr/design/mainframe/CoverPane.java b/designer_form/src/com/fr/design/mainframe/CoverPane.java new file mode 100644 index 000000000..b6cdd472a --- /dev/null +++ b/designer_form/src/com/fr/design/mainframe/CoverPane.java @@ -0,0 +1,97 @@ +package com.fr.design.mainframe; + +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.icon.IconPathConstants; +import com.fr.general.IOUtils; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; + +/** + * Created with IntelliJ IDEA. + * User: zx + * Date: 14-7-24 + * Time: 上午9:09 + */ +public class CoverPane extends JPanel { + + private UIButton editButton; + private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 60 / 100.0F); + + public CoverPane() { + setLayout(getCoverLayout()); + setBackground(null); + setOpaque(false); + + editButton = new UIButton(Inter.getLocText("Edit"), IOUtils.readIcon(IconPathConstants.TD_EDIT_ICON_PATH)) { + @Override + public Dimension getPreferredSize() { + return new Dimension(60, 24); + } + }; + editButton.setBorderPainted(false); + editButton.setExtraPainted(false); + editButton.setBackground(new Color(176, 196, 222)); + add(editButton); + } + + public AlphaComposite getComposite() { + return composite; + } + + public void setComposite(AlphaComposite composite) { + this.composite = composite; + } + + public UIButton getEditButton() { + return editButton; + } + + public void setEditButton(UIButton editButton) { + this.editButton = editButton; + } + + protected LayoutManager getCoverLayout() { + return new LayoutManager() { + + @Override + public void removeLayoutComponent(Component comp) { + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return parent.getPreferredSize(); + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + @Override + public void layoutContainer(Container parent) { + int width = parent.getParent().getWidth(); + int height = parent.getParent().getHeight(); + int preferWidth = editButton.getPreferredSize().width; + int preferHeight = editButton.getPreferredSize().height; + editButton.setBounds((width - preferWidth) / 2, (height - preferHeight) / 2, preferWidth, preferHeight); + } + + @Override + public void addLayoutComponent(String name, Component comp) { + } + }; + } + + + public void paint(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + Composite oldComposite = g2d.getComposite(); + g2d.setComposite(composite); + g2d.setColor(Color.white); + g2d.fillRect(0, 0, getWidth(), getHeight()); + g2d.setComposite(oldComposite); + super.paint(g); + } +} \ No newline at end of file diff --git a/designer_form/src/com/fr/design/mainframe/CoverReportPane.java b/designer_form/src/com/fr/design/mainframe/CoverReportPane.java index 183cf24ee..196d8752a 100644 --- a/designer_form/src/com/fr/design/mainframe/CoverReportPane.java +++ b/designer_form/src/com/fr/design/mainframe/CoverReportPane.java @@ -1,80 +1,136 @@ package com.fr.design.mainframe; -import com.fr.base.BaseUtils; +import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.icon.IconPathConstants; -import com.fr.general.Inter; +import com.fr.share.ShareConstants; +import com.fr.general.FRScreen; +import com.fr.general.IOUtils; +import com.fr.stable.StringUtils; import javax.swing.*; import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; /** - * Created with IntelliJ IDEA. - * User: zx - * Date: 14-7-24 - * Time: 上午9:09 + * 报表块的封面(如果后面所有的组件都有帮助信息的话就抽接口吧) + * Coder: zack + * Date: 2016/11/2 + * Time: 11:32 */ -public class CoverReportPane extends JPanel{ +public class CoverReportPane extends CoverPane implements HelpDialogHandler{ + private Icon controlMode = IOUtils.readIcon(IconPathConstants.TD_EL_SHARE_HELP_ICON_PATH); + private JComponent controlButton = new JComponent() { + protected void paintComponent(Graphics g) { + g.setColor(UIConstants.NORMAL_BACKGROUND); + g.fillArc(0, 0, ShareConstants.SHARE_EL_CONTROL_BUTTON_HW, ShareConstants.SHARE_EL_CONTROL_BUTTON_HW, + 0, 360); + controlMode.paintIcon(this, g, 0, 0); + } + }; - private UIButton editButton; - private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 60 / 100.0F); + private String helpMsg;//帮助信息(后续帮助信息可能会变成标配,就直接放这边了) - public CoverReportPane(){ - setLayout(coverLayout); - setBackground(null); - setOpaque(false); + private ElementCaseHelpDialog helpDialog = null; - editButton = new UIButton(Inter.getLocText("Edit"), BaseUtils.readIcon(IconPathConstants.TD_EDIT_ICON_PATH)){ - @Override - public Dimension getPreferredSize() { - return new Dimension(60,24); - } - }; - editButton.setBorderPainted(false); - editButton.setExtraPainted(false); - editButton.setBackground(new Color(176,196,222)); - add(editButton); + public CoverReportPane() { + this(StringUtils.EMPTY); + } + public CoverReportPane(String helpMsg) { + super(); + this.helpMsg = helpMsg; } - private LayoutManager coverLayout = new LayoutManager() { + public String getHelpMsg() { + return helpMsg; + } - @Override - public void removeLayoutComponent(Component comp) { + public void setHelpMsg(String helpMsg) { + this.helpMsg = helpMsg; + //帮助信息为空就不显示帮助按钮 + if (StringUtils.isNotEmpty(helpMsg)) { + add(controlButton); } + } - @Override - public Dimension preferredLayoutSize(Container parent) { - return parent.getPreferredSize(); + public void setMsgDisplay(MouseEvent e) { + if (helpDialog == null) { +// controlMode = IOUtils.readIcon(IconPathConstants.TD_EL_SHARE_CLOSE_ICON_PATH); + controlButton.setVisible(false); + helpDialog = new ElementCaseHelpDialog(DesignerContext.getDesignerFrame(), helpMsg); + double screenValue = FRScreen.getByDimension(Toolkit.getDefaultToolkit().getScreenSize()).getValue(); + int offsetX = 0; + if (screenValue < FormArea.DEFAULT_SLIDER) { + offsetX = (int) ((1 - screenValue / FormArea.DEFAULT_SLIDER) + * WidgetPropertyPane.getInstance().getEditingFormDesigner().getRootComponent().getWidth() / 2); + } + int rX = WestRegionContainerPane.getInstance().getWidth() + e.getX() + offsetX - 227;//弹出框宽度190加上图标的宽度27加上10的偏移 + int rY = 165 + e.getY();//165是设计器最上面几个面板的高度 + helpDialog.setLocationRelativeTo(DesignerContext.getDesignerFrame(), rX, rY); + helpDialog.showWindow(); + helpDialog.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + helpDialog = null; + controlButton.setVisible(true); + } + }); + HelpDialogManager.getInstance().setPane(this); } + } - @Override - public Dimension minimumLayoutSize(Container parent) { - return null; - } + protected LayoutManager getCoverLayout() { + return new LayoutManager() { - @Override - public void layoutContainer(Container parent) { - int width = parent.getParent().getWidth(); - int height = parent.getParent().getHeight(); - int preferWidth = editButton.getPreferredSize().width; - int preferHeight = editButton.getPreferredSize().height; - editButton.setBounds((width - preferWidth)/2, (height - preferHeight)/2, preferWidth, preferHeight); - } + @Override + public void removeLayoutComponent(Component comp) { + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return parent.getPreferredSize(); + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + @Override + public void layoutContainer(Container parent) { + UIButton editButton = getEditButton(); + int width = parent.getParent().getWidth(); + int height = parent.getParent().getHeight(); + int preferWidth = editButton.getPreferredSize().width; + int preferHeight = editButton.getPreferredSize().height; + editButton.setBounds((width - preferWidth) / 2, (height - preferHeight) / 2, preferWidth, preferHeight); + controlButton.setBounds((width - 28), 0, 27, 27); + } - @Override - public void addLayoutComponent(String name, Component comp) { + @Override + public void addLayoutComponent(String name, Component comp) { + } + }; + } + + public void destroyHelpDialog() { + if (helpDialog != null) { + controlMode = IOUtils.readIcon(IconPathConstants.TD_EL_SHARE_HELP_ICON_PATH); + controlButton.repaint(); + helpDialog.dispose(); + helpDialog = null; } - }; + } - public void paint(Graphics g) { - Graphics2D g2d = (Graphics2D) g; - Composite oldComposite = g2d.getComposite(); - g2d.setComposite(composite); - g2d.setColor(Color.white); - g2d.fillRect(0, 0, getWidth(), getHeight()); - g2d.setComposite(oldComposite); - super.paint(g); + @Override + public void setVisible(boolean aFlag) { + super.setVisible(aFlag); +// if (aFlag) { +// HelpDialogManager.getInstance().setPane(this); +// } } -} \ No newline at end of file +} diff --git a/designer_form/src/com/fr/design/mainframe/EditingMouseListener.java b/designer_form/src/com/fr/design/mainframe/EditingMouseListener.java index fc25bd124..0f916dd1d 100644 --- a/designer_form/src/com/fr/design/mainframe/EditingMouseListener.java +++ b/designer_form/src/com/fr/design/mainframe/EditingMouseListener.java @@ -1,14 +1,5 @@ package com.fr.design.mainframe; -import java.awt.Color; -import java.awt.Container; -import java.awt.Cursor; -import java.awt.Rectangle; -import java.awt.event.MouseEvent; - -import javax.swing.*; -import javax.swing.event.MouseInputAdapter; - import com.fr.base.BaseUtils; import com.fr.design.beans.location.MoveUtils; import com.fr.design.designer.beans.AdapterBus; @@ -29,6 +20,11 @@ import com.fr.design.utils.gui.LayoutUtils; import com.fr.general.Inter; import com.fr.stable.Constants; +import javax.swing.*; +import javax.swing.event.MouseInputAdapter; +import java.awt.*; +import java.awt.event.MouseEvent; + /** * 普通模式下的鼠标点击、位置处理器 */ @@ -260,7 +256,7 @@ public class EditingMouseListener extends MouseInputAdapter { public void mouseMoved(MouseEvent e) { XCreator component = designer.getComponentAt(e); - setCoverPaneNotDisplay(); + setCoverPaneNotDisplay(e, false); if(processTopLayoutMouseMove(component, e)){ return; @@ -291,18 +287,30 @@ public class EditingMouseListener extends MouseInputAdapter { if (component.isReport()) { xElementCase = (XElementCase)component; - UIButton button = (UIButton)xElementCase.getCoverPane().getComponent(0); + UIButton button = (UIButton)xElementCase.getCoverPane().getComponent(0); if(designer.getCursor().getType() ==Cursor.HAND_CURSOR) { - designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } // component.getParent() 是报表块所在的XWTitleLayout - int minX = button.getX() + getParentPositionX(component, 0) - designer.getArea().getHorizontalValue(); - int minY = button.getY() + getParentPositionY(component, 0) - designer.getArea().getVerticalValue(); - if(e.getX() + GAP > minX && e.getX() - GAP < minX + button.getWidth()){ - if( e.getY() + GAP > minY && e.getY() - GAP < minY + button.getHeight()){ - designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - } - } - xElementCase.displayCoverPane(true); + designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } // component.getParent() 是报表块所在的XWTitleLayout + int minX = button.getX() + getParentPositionX(component, 0) - designer.getArea().getHorizontalValue(); + int minY = button.getY() + getParentPositionY(component, 0) - designer.getArea().getVerticalValue(); + if (e.getX() + GAP - xElementCase.getInsets().left > minX && e.getX() - GAP - xElementCase.getInsets().left < minX + button.getWidth()) { + if (e.getY() + GAP - xElementCase.getInsets().top > minY && e.getY() - GAP - xElementCase.getInsets().top < minY + button.getHeight()) { + designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + } + } + xElementCase.setHelpBtnOnFocus(false); + if (xElementCase.getCoverPane().getComponentCount() > 1) { + JComponent button1 = (JComponent) xElementCase.getCoverPane().getComponent(1); + int minX1 = button1.getX() + getParentPositionX(component, 0) - designer.getArea().getHorizontalValue(); + int minY1 = button1.getY() + getParentPositionY(component, 0) - designer.getArea().getVerticalValue(); + if (e.getX() + GAP - xElementCase.getInsets().left > minX1 && e.getX() - GAP - xElementCase.getInsets().left < minX1 + button1.getWidth()) { + if (e.getY() + GAP - xElementCase.getInsets().top > minY1 && e.getY() - GAP - xElementCase.getInsets().top < minY1 + button1.getHeight()) { + designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + xElementCase.setHelpBtnOnFocus(true); + } + } + } + xElementCase.displayCoverPane(true); xElementCase.setDirections(Direction.TOP_BOTTOM_LEFT_RIGHT); designer.repaint(); @@ -314,8 +322,17 @@ public class EditingMouseListener extends MouseInputAdapter { designer.repaint(); } - private void setCoverPaneNotDisplay(){ - if (xElementCase != null){ + private void setCoverPaneNotDisplay(MouseEvent e, boolean isLinkedHelpDialog) { + if (xElementCase != null) { + int x = getParentPositionX(xElementCase, 0) - designer.getArea().getHorizontalValue(); + int y = getParentPositionY(xElementCase, 0) - designer.getArea().getVerticalValue(); + Rectangle rect = new Rectangle(x, y, xElementCase.getWidth(), xElementCase.getHeight()); + if (rect.contains(e.getPoint())) { + return; + } + if(isLinkedHelpDialog){ + xElementCase.destroyHelpDialog(); + } xElementCase.displayCoverPane(false); } if (xChartEditor != null){ @@ -519,7 +536,7 @@ public class EditingMouseListener extends MouseInputAdapter { designer.setCursor(Cursor.getDefaultCursor()); } - setCoverPaneNotDisplay(); + setCoverPaneNotDisplay(e, true); cancelPromptWidgetForbidEnter(); } diff --git a/designer_form/src/com/fr/design/mainframe/ElementCaseHelpDialog.java b/designer_form/src/com/fr/design/mainframe/ElementCaseHelpDialog.java new file mode 100644 index 000000000..2f2c6e3b5 --- /dev/null +++ b/designer_form/src/com/fr/design/mainframe/ElementCaseHelpDialog.java @@ -0,0 +1,75 @@ +package com.fr.design.mainframe; + +import com.fr.design.dialog.UIDialog; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; + +/** + * @author zack + * @date 2016-10-14 + * @since 8.0 + */ +public class ElementCaseHelpDialog extends UIDialog { + + private static final int OUTER_WIDTH = 190; + private static final int OUTER_HEIGHT = 280; + + + private String helpMsg; + private UIScrollPane helpArea; + + + public ElementCaseHelpDialog(Frame parent, String helpMsg) { + super(parent); + this.helpMsg = helpMsg; + initHelpArea(); + JPanel panel = (JPanel) getContentPane(); + initComponents(panel); + setSize(new Dimension(OUTER_WIDTH, OUTER_HEIGHT)); + } + + private void initHelpArea() { + UITextArea textArea = new UITextArea(helpMsg); + textArea.setEditable(false); + textArea.setBorder(null); + helpArea = new UIScrollPane(textArea); + helpArea.setBounds(0, 0, OUTER_WIDTH, OUTER_HEIGHT); + helpArea.setBorder(null); + } + + private void initComponents(JPanel contentPane) { + contentPane.setLayout(new BorderLayout()); + add(helpArea, BorderLayout.CENTER); + this.applyClosingAction(); + this.setTitle(Inter.getLocText("FR-Designer_Help")); + } + + /** + * 打开帮助框 + */ + public void showWindow() { + this.setResizable(false); + setVisible(true); + } + + /** + * 略 + */ + @Override + public void checkValid() throws Exception { + + } + + public void setLocationRelativeTo(JFrame c, int x, int y) { + int dx = 0, dy = 0; + Point compLocation = c.getLocationOnScreen();//获取设计器Jframe坐标作为相对位置原点 + setLocation(dx + x, dy + y); + dx = compLocation.x; + dy = compLocation.y + c.getRootPane().getY();//加上底层容器的y坐标(其实就是设计器最上方图标栏的高度) + setLocation(dx + x, dy + y); + } +} \ No newline at end of file diff --git a/designer_form/src/com/fr/design/mainframe/FormArea.java b/designer_form/src/com/fr/design/mainframe/FormArea.java index 26f3b0490..4f6c86fee 100644 --- a/designer_form/src/com/fr/design/mainframe/FormArea.java +++ b/designer_form/src/com/fr/design/mainframe/FormArea.java @@ -433,17 +433,17 @@ public class FormArea extends JComponent implements ScrollRulerComponent { if (rec.width <= dWidth&&rec.x < getHorizontalValue()) { //在边界内部且x位置小于水平滚动条的值 horScrollBar.setValue(rec.x); - } else if (rec.x+rec.width > dWidth) { + } else if (rec.x + rec.width > dWidth + horizontalValue) { //超出边界宽度 - horScrollBar.setValue(rec.x+rec.width-dWidth); + horScrollBar.setValue(rec.x + rec.width - dWidth); } int dHeight = getDesignerHeight(); if (rec.height < dHeight && rec.y < getVerticalValue()) { //在边界内部且y位置小于竖直滚动条的值 verScrollBar.setValue(rec.y); - } else if (rec.y+rec.height > dHeight) { + } else if (rec.y + rec.height > dHeight + verticalValue) { //超出边界高度 - verScrollBar.setValue(rec.y+rec.height-dHeight); + verScrollBar.setValue(rec.y + rec.height - dHeight); } } diff --git a/designer_form/src/com/fr/design/mainframe/FormCreatorDropTarget.java b/designer_form/src/com/fr/design/mainframe/FormCreatorDropTarget.java index 1172a4b64..7e7035bb7 100644 --- a/designer_form/src/com/fr/design/mainframe/FormCreatorDropTarget.java +++ b/designer_form/src/com/fr/design/mainframe/FormCreatorDropTarget.java @@ -1,20 +1,8 @@ package com.fr.design.mainframe; -import java.awt.Color; -import java.awt.Component; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Toolkit; -import java.awt.dnd.DropTarget; -import java.awt.dnd.DropTargetDragEvent; -import java.awt.dnd.DropTargetDropEvent; -import java.awt.dnd.DropTargetEvent; -import java.util.ArrayList; - -import javax.swing.BorderFactory; -import javax.swing.JWindow; - import com.fr.base.BaseUtils; +import com.fr.design.DesignModelAdapter; +import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.HoverPainter; import com.fr.design.designer.beans.Painter; @@ -25,177 +13,195 @@ import com.fr.design.form.util.XCreatorConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.icon.IconPathConstants; import com.fr.design.utils.ComponentUtils; +import com.fr.form.share.ShareLoader; +import com.fr.form.ui.ElCaseBindInfo; +import com.fr.form.ui.SharableElementCaseEditor; import com.fr.form.ui.Widget; import com.fr.general.Inter; import com.fr.stable.Constants; +import javax.swing.*; +import java.awt.*; +import java.awt.dnd.DropTarget; +import java.awt.dnd.DropTargetDragEvent; +import java.awt.dnd.DropTargetDropEvent; +import java.awt.dnd.DropTargetEvent; + /** * 添加模式下鼠标事件处理器。 */ public class FormCreatorDropTarget extends DropTarget { - private FormDesigner designer; - /** - * 当前鼠标的设计组件 - */ - private Component current; - /** - * 当前添加模式对应的model - */ - private AddingModel addingModel; + private FormDesigner designer; + /** + * 当前鼠标的设计组件 + */ + private Component current; + /** + * 当前添加模式对应的model + */ + private AddingModel addingModel; private final static int GAP = 30; private JWindow promptWindow = new JWindow(); private UIButton promptButton = new UIButton("", BaseUtils.readIcon(IconPathConstants.FORBID_ICON_PATH)); - public FormCreatorDropTarget(FormDesigner designer) { - this.designer = designer; - this.addingModel = designer.getAddingModel(); + public FormCreatorDropTarget(FormDesigner designer) { + this.designer = designer; + this.addingModel = designer.getAddingModel(); this.promptWindow.add(promptButton); - } + } + + private void adding(int x, int y) { + // 当前鼠标所在的组件 + XCreator hoveredComponent = designer.getComponentAt(x, y); - private void adding(int x, int y) { - // 当前鼠标所在的组件 - XCreator hoveredComponent = designer.getComponentAt(x, y); + // 获取该组件所在的焦点容器 + XLayoutContainer container = XCreatorUtils.getHotspotContainer(hoveredComponent); - // 获取该组件所在的焦点容器 - XLayoutContainer container = XCreatorUtils.getHotspotContainer(hoveredComponent); - - //cardTagLayout里用到 - container.stopAddingState(designer); + //cardTagLayout里用到 + container.stopAddingState(designer); - boolean success = false; + boolean success = false; - if (container != null) { - // 如果是容器,则调用其acceptComponent接受组件 - AddingModel model = designer.getAddingModel(); + if (container != null) { + // 如果是容器,则调用其acceptComponent接受组件 + AddingModel model = designer.getAddingModel(); - boolean chartEnter2Para =!addingModel.getXCreator().canEnterIntoParaPane() && container.acceptType(XWParameterLayout.class); + boolean chartEnter2Para = !addingModel.getXCreator().canEnterIntoParaPane() && container.acceptType(XWParameterLayout.class); boolean formSubmit2Adapt = !addingModel.getXCreator().canEnterIntoAdaptPane() && container.acceptType(XWFitLayout.class); - if (model != null && !chartEnter2Para && !formSubmit2Adapt) { - success = model.add2Container(designer, container, x, y); - } + if (model != null && !chartEnter2Para && !formSubmit2Adapt) { + success = model.add2Container(designer, container, x, y); + } cancelPromptWidgetForbidEnter(); - } + } - if (success) { - // 如果添加成功,则触发相应事件 + if (success) { + // 如果添加成功,则触发相应事件 XCreator xCreator = container.acceptType(XWParameterLayout.class) ? designer.getParaComponent() : designer.getRootComponent(); - //SetSelection时要确保选中的是最顶层的布局 - //tab布局添加的时候是初始化了XWCardLayout,实际上最顶层的布局是XWCardMainBorderLayout - XCreator addingXCreator = addingModel.getXCreator(); - Widget widget = (addingXCreator.getTopLayout() != null) ? (addingXCreator.getTopLayout().toData()) : addingXCreator.toData(); - designer.getSelectionModel().setSelectedCreators( - FormSelectionUtils.rebuildSelection(xCreator, new Widget[]{widget})); - designer.getEditListenerTable().fireCreatorModified(addingModel.getXCreator(), DesignerEvent.CREATOR_ADDED); - } else { - Toolkit.getDefaultToolkit().beep(); - } - - // 取消提示 - designer.setPainter(null); - // 切换添加状态到普通状态 - designer.stopAddingState(); - } - - private void entering(int x, int y) { - // 将要添加的组件图标移动到鼠标下的位置 - addingModel.moveTo(x, y); - designer.repaint(); - } - - private void exiting() { + //SetSelection时要确保选中的是最顶层的布局 + //tab布局添加的时候是初始化了XWCardLayout,实际上最顶层的布局是XWCardMainBorderLayout + XCreator addingXCreator = addingModel.getXCreator(); + if (addingXCreator.isShared()) { + String shareId = addingXCreator.getShareId(); + SharableElementCaseEditor sharableEditor = ShareLoader.getLoader().getSharedElCaseEditorById(shareId); + ElCaseBindInfo bindInfo = ShareLoader.getLoader().getElCaseBindInfoById(shareId); + if (sharableEditor != null && bindInfo != null) { + TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()).addTableData(bindInfo.getName(),sharableEditor.getTableDataSource()); + } + } + Widget widget = (addingXCreator.getTopLayout() != null) ? (addingXCreator.getTopLayout().toData()) : addingXCreator.toData(); + designer.getSelectionModel().setSelectedCreators( + FormSelectionUtils.rebuildSelection(xCreator, new Widget[]{widget})); + designer.getEditListenerTable().fireCreatorModified(addingModel.getXCreator(), DesignerEvent.CREATOR_ADDED); + } else { + Toolkit.getDefaultToolkit().beep(); + } + + // 取消提示 + designer.setPainter(null); + // 切换添加状态到普通状态 + designer.stopAddingState(); + } + + private void entering(int x, int y) { + // 将要添加的组件图标移动到鼠标下的位置 + addingModel.moveTo(x, y); + designer.repaint(); + } + + private void exiting() { cancelPromptWidgetForbidEnter(); - // 隐藏组件图标 - addingModel.reset(); - designer.setPainter(null); - designer.repaint(); - } - - private void hovering(int x, int y) { - // 当前位置移植鼠标e所在的位置 - addingModel.moveTo(x, y); - // 获取e所在的焦点组件 - XCreator hotspot = designer.getComponentAt(x, y); - // 获取焦点组件所在的焦点容器 - XLayoutContainer container = XCreatorUtils.getHotspotContainer(hotspot); + // 隐藏组件图标 + addingModel.reset(); + designer.setPainter(null); + designer.repaint(); + } + + private void hovering(int x, int y) { + // 当前位置移植鼠标e所在的位置 + addingModel.moveTo(x, y); + // 获取e所在的焦点组件 + XCreator hotspot = designer.getComponentAt(x, y); + // 获取焦点组件所在的焦点容器 + XLayoutContainer container = XCreatorUtils.getHotspotContainer(hotspot); //提示组件是否可以拖入 promptUser(x, y, container); - if (container != null) { - HoverPainter painter = null; - - if (container != current || designer.getPainter() == null) { - // 如果焦点容器不是当前容器 - if (current != null) { - // 取消前一个焦点容器的提示渲染器 - designer.setPainter(null); - } - //获取painter的时候要考虑布局之间嵌套的问题 - XLayoutContainer xLayoutContainer = container.getTopLayout(); - if (xLayoutContainer != null && xLayoutContainer.getParent() != null - && ((XLayoutContainer)xLayoutContainer.getParent()).acceptType(XWAbsoluteLayout.class)){ - if(!xLayoutContainer.isEditable()){ - xLayoutContainer = (XLayoutContainer)xLayoutContainer.getParent(); - } - } - painter = AdapterBus.getContainerPainter(designer, - xLayoutContainer != null && xLayoutContainer.acceptType(XWAbsoluteLayout.class) ? xLayoutContainer : container); - - // 为界面设计器设置提示渲染提示器 - designer.setPainter(painter); - - // 将当前容器更新为新的容器 - current = container; - } else { - // 获取当前设计界面的提示渲染器 - Painter p = designer.getPainter(); - if (p instanceof HoverPainter) { - painter = (HoverPainter) p; - } - } - - if (painter != null) { - // 为提示渲染器设置焦点位置、区域等渲染参数 - Rectangle rect = ComponentUtils.getRelativeBounds(container); - rect.x -= designer.getArea().getHorizontalValue(); - rect.y -= designer.getArea().getVerticalValue(); - painter.setRenderingBounds(rect); - painter.setHotspot(new Point(x, y)); - painter.setCreator(addingModel.getXCreator()); - } - } else { - // 如果鼠标不在任何组件上,则取消提示器 - designer.setPainter(null); - current = null; - } - designer.repaint(); - } - - private void promptUser(int x, int y, XLayoutContainer container){ - if (!addingModel.getXCreator().canEnterIntoParaPane() && container.acceptType(XWParameterLayout.class)){ + if (container != null) { + HoverPainter painter = null; + + if (container != current || designer.getPainter() == null) { + // 如果焦点容器不是当前容器 + if (current != null) { + // 取消前一个焦点容器的提示渲染器 + designer.setPainter(null); + } + //获取painter的时候要考虑布局之间嵌套的问题 + XLayoutContainer xLayoutContainer = container.getTopLayout(); + if (xLayoutContainer != null && xLayoutContainer.getParent() != null + && ((XLayoutContainer) xLayoutContainer.getParent()).acceptType(XWAbsoluteLayout.class)) { + if (!xLayoutContainer.isEditable()) { + xLayoutContainer = (XLayoutContainer) xLayoutContainer.getParent(); + } + } + painter = AdapterBus.getContainerPainter(designer, + xLayoutContainer != null && xLayoutContainer.acceptType(XWAbsoluteLayout.class) ? xLayoutContainer : container); + + // 为界面设计器设置提示渲染提示器 + designer.setPainter(painter); + + // 将当前容器更新为新的容器 + current = container; + } else { + // 获取当前设计界面的提示渲染器 + Painter p = designer.getPainter(); + if (p instanceof HoverPainter) { + painter = (HoverPainter) p; + } + } + + if (painter != null) { + // 为提示渲染器设置焦点位置、区域等渲染参数 + Rectangle rect = ComponentUtils.getRelativeBounds(container); + rect.x -= designer.getArea().getHorizontalValue(); + rect.y -= designer.getArea().getVerticalValue(); + painter.setRenderingBounds(rect); + painter.setHotspot(new Point(x, y)); + painter.setCreator(addingModel.getXCreator()); + } + } else { + // 如果鼠标不在任何组件上,则取消提示器 + designer.setPainter(null); + current = null; + } + designer.repaint(); + } + + private void promptUser(int x, int y, XLayoutContainer container) { + if (!addingModel.getXCreator().canEnterIntoParaPane() && container.acceptType(XWParameterLayout.class)) { promptButton.setText(Inter.getLocText("FR-Designer_Forbid_Drag_into_Para_Pane")); - promptWidgetForbidEnter(x ,y ,container); - } else if (!addingModel.getXCreator().canEnterIntoAdaptPane() && container.acceptType(XWFitLayout.class)){ + promptWidgetForbidEnter(x, y, container); + } else if (!addingModel.getXCreator().canEnterIntoAdaptPane() && container.acceptType(XWFitLayout.class)) { promptButton.setText(Inter.getLocText("FR-Designer_Forbid_Drag_into_Adapt_Pane")); - promptWidgetForbidEnter(x ,y , container); + promptWidgetForbidEnter(x, y, container); } else { cancelPromptWidgetForbidEnter(); } } - private void promptWidgetForbidEnter(int x,int y, XLayoutContainer container){ + private void promptWidgetForbidEnter(int x, int y, XLayoutContainer container) { container.setBorder(BorderFactory.createLineBorder(Color.RED, Constants.LINE_MEDIUM)); - int screen_X = (int)designer.getArea().getLocationOnScreen().getX(); - int screen_Y = (int)designer.getArea().getLocationOnScreen().getY(); + int screen_X = (int) designer.getArea().getLocationOnScreen().getX(); + int screen_Y = (int) designer.getArea().getLocationOnScreen().getY(); this.promptWindow.setSize(promptWindow.getPreferredSize()); this.promptWindow.setPreferredSize(promptWindow.getPreferredSize()); - promptWindow.setLocation( screen_X + x + GAP ,screen_Y + y + GAP); + promptWindow.setLocation(screen_X + x + GAP, screen_Y + y + GAP); promptWindow.setVisible(true); } - private void cancelPromptWidgetForbidEnter(){ - if (designer.getParaComponent() != null){ + private void cancelPromptWidgetForbidEnter() { + if (designer.getParaComponent() != null) { designer.getParaComponent().setBorder(BorderFactory.createLineBorder(XCreatorConstants.LAYOUT_SEP_COLOR, Constants.LINE_THIN)); } designer.getRootComponent().setBorder(BorderFactory.createLineBorder(XCreatorConstants.LAYOUT_SEP_COLOR, Constants.LINE_THIN)); @@ -204,45 +210,50 @@ public class FormCreatorDropTarget extends DropTarget { /** * 拖拽进入 - * @param dtde 事件 + * + * @param dtde 事件 */ - public void dragEnter(DropTargetDragEvent dtde) { - Point loc = dtde.getLocation(); - this.entering(loc.x, loc.y); - } + public void dragEnter(DropTargetDragEvent dtde) { + Point loc = dtde.getLocation(); + this.entering(loc.x, loc.y); + } /** * 拖拽移动经过 - * @param dtde 事件 + * + * @param dtde 事件 */ - public void dragOver(DropTargetDragEvent dtde) { - Point loc = dtde.getLocation(); - hovering(loc.x, loc.y); - } + public void dragOver(DropTargetDragEvent dtde) { + Point loc = dtde.getLocation(); + hovering(loc.x, loc.y); + } /** * 拖拽事件 - * @param dtde 事件 + * + * @param dtde 事件 */ - public void dropActionChanged(DropTargetDragEvent dtde) { - } + public void dropActionChanged(DropTargetDragEvent dtde) { + } /** * 拖拽离开 - * @param dte 事件 + * + * @param dte 事件 */ - public void dragExit(DropTargetEvent dte) { - this.exiting(); - } + public void dragExit(DropTargetEvent dte) { + this.exiting(); + } /** * 拖拽释放 - * @param dtde 事件 + * + * @param dtde 事件 */ - public void drop(DropTargetDropEvent dtde) { - Point loc = dtde.getLocation(); - this.adding(loc.x, loc.y); + public void drop(DropTargetDropEvent dtde) { + Point loc = dtde.getLocation(); + this.adding(loc.x, loc.y); //针对在表单中拖入一个控件直接ctrl+s无反应 designer.requestFocus(); - } + } } \ No newline at end of file diff --git a/designer_form/src/com/fr/design/mainframe/FormDesigner.java b/designer_form/src/com/fr/design/mainframe/FormDesigner.java index 544d89ec7..a3b197e91 100644 --- a/designer_form/src/com/fr/design/mainframe/FormDesigner.java +++ b/designer_form/src/com/fr/design/mainframe/FormDesigner.java @@ -121,7 +121,7 @@ public class FormDesigner extends TargetComponent

implements TreeSelection private static final int H_GAP = 105; public FormDesigner(Form form) { - this(form, null); + this(form, null); } public FormDesigner(Form form, Action switchAction) { @@ -186,29 +186,30 @@ public class FormDesigner extends TargetComponent implements TreeSelection public void refreshParameter(){ XLayoutContainer rootContainer = this.getParaComponent(); if (rootContainer != null){ - java.util.List namelist = new ArrayList(); - rootContainer.getAllXCreatorNameList(rootContainer,namelist); - // parameterArray是报表的所有参数, nameList是已经在参数面板添加过控件的参数名 - // 与已有的参数列表比较 如果已经存在 就除去 - Parameter[] ps = getParameterArray(); - if (ps != null) { - removeSame(ps, namelist); - } + java.util.List namelist = new ArrayList(); + rootContainer.getAllXCreatorNameList(rootContainer,namelist); + // parameterArray是报表的所有参数, nameList是已经在参数面板添加过控件的参数名 + // 与已有的参数列表比较 如果已经存在 就除去 + Parameter[] ps = getParameterArray(); + if (ps != null) { + removeSame(ps, namelist); + } } ParameterPropertyPane.getInstance().getParameterToolbarPane().populateBean( getParameterArray() == null ? new Parameter[0] : getParameterArray()); ParameterPropertyPane.getInstance().repaintContainer(); + EastRegionContainerPane.getInstance().setParameterHeight(ParameterPropertyPane.getInstance(this).getPreferredSize().height); } - private void removeSame(Parameter[] parameters, List namelist){ - for (Parameter parameter : parameters) { - for (String name : namelist) { - if (name.equalsIgnoreCase(parameter.getName())) { - setParameterArray((Parameter[]) ArrayUtils.removeElement(getParameterArray(), parameter)); - } - } - } - } + private void removeSame(Parameter[] parameters, List namelist){ + for (Parameter parameter : parameters) { + for (String name : namelist) { + if (name.equalsIgnoreCase(parameter.getName())) { + setParameterArray((Parameter[]) ArrayUtils.removeElement(getParameterArray(), parameter)); + } + } + } + } /** @@ -404,10 +405,10 @@ public class FormDesigner extends TargetComponent implements TreeSelection * 加入参数面板 */ public void addParaComponent(){ - if (paraComponent != null) { - return ; - } - paraHeight = WBorderLayout.DEFAULT_SIZE; + if (paraComponent != null) { + return ; + } + paraHeight = WBorderLayout.DEFAULT_SIZE; paraComponent = new XWParameterLayout(); paraComponent.toData().setWidgetName("para"); paraComponent.setSize(paraComponent.initEditorSize()); @@ -427,10 +428,10 @@ public class FormDesigner extends TargetComponent implements TreeSelection * @return 父容器 */ public Component getTopContainer(){ - if(rootComponent != null){ - // 返回root所在的父容器,非designer - return LayoutUtils.getTopContainer(rootComponent); - } + if(rootComponent != null){ + // 返回root所在的父容器,非designer + return LayoutUtils.getTopContainer(rootComponent); + } return XCreatorUtils.createXCreator(this.getTarget().getContainer()); } @@ -447,9 +448,9 @@ public class FormDesigner extends TargetComponent implements TreeSelection * @param height 高度 */ public void setParaHeight(int height){ - XWBorderLayout container = (XWBorderLayout) getTopContainer(); - container.toData().setNorthSize(height); - container.setSize(container.getWidth(), container.getHeight() + height - getParaHeight()); + XWBorderLayout container = (XWBorderLayout) getTopContainer(); + container.toData().setNorthSize(height); + container.setSize(container.getWidth(), container.getHeight() + height - getParaHeight()); paraHeight = height; } @@ -463,6 +464,8 @@ public class FormDesigner extends TargetComponent implements TreeSelection paraComponent = null; formLayoutContainer.setSize(rootComponent.getWidth(), rootComponent.getHeight()); EastRegionContainerPane.getInstance().replaceDownPane(this.getEastDownPane()); + //atat + //EastRegionContainerPane.getInstance().addTitlePane(ParameterPropertyPane.getInstance(FormDesigner.this)); //删除后重绘下 invalidateLayout(); } @@ -472,39 +475,39 @@ public class FormDesigner extends TargetComponent implements TreeSelection * @param elementCaseContainer 容器 */ public void switchTab(FormElementCaseContainerProvider elementCaseContainer){ - if(this.switchAction == null){ - return; - } - this.elementCaseContainer = elementCaseContainer; - this.switchAction.actionPerformed(null); + if(this.switchAction == null){ + return; + } + this.elementCaseContainer = elementCaseContainer; + this.switchAction.actionPerformed(null); } public void setElementCaseContainer(FormElementCaseContainerProvider elementCaseContainer){ - this.elementCaseContainer = elementCaseContainer; + this.elementCaseContainer = elementCaseContainer; } public FormElementCaseProvider getElementCase(){ - return this.elementCaseContainer.getElementCase(); + return this.elementCaseContainer.getElementCase(); } public String getElementCaseContainerName(){ - return this.elementCaseContainer.getElementCaseContainerName(); + return this.elementCaseContainer.getElementCaseContainerName(); } public void setElementCase(FormElementCaseProvider elementCase){ - this.elementCaseContainer.setElementCase(elementCase); + this.elementCaseContainer.setElementCase(elementCase); } public void setElementCaseBackground(BufferedImage image){ - this.elementCaseContainer.setBackground(image); + this.elementCaseContainer.setBackground(image); } public Dimension getElementCaseContainerSize(){ - return this.elementCaseContainer.getSize(); + return this.elementCaseContainer.getSize(); } public FormElementCaseContainerProvider getElementCaseContainer(){ - return this.elementCaseContainer; + return this.elementCaseContainer; } protected FormDesignerModeForSpecial createFormDesignerTargetMode() { @@ -601,7 +604,7 @@ public class FormDesigner extends TargetComponent implements TreeSelection * @param width 指定的宽度 */ public void updateWidth(int width) { - //TODO + //TODO } /** @@ -612,12 +615,12 @@ public class FormDesigner extends TargetComponent implements TreeSelection * @return 不返回任何对象 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - if(rootComponent != null){ - LayoutUtils.layoutRootContainer(rootComponent); - } - if(paraComponent != null){ - LayoutUtils.layoutRootContainer(paraComponent); - } + if(rootComponent != null){ + LayoutUtils.layoutRootContainer(rootComponent); + } + if(paraComponent != null){ + LayoutUtils.layoutRootContainer(paraComponent); + } repaint(); return null; } @@ -637,7 +640,7 @@ public class FormDesigner extends TargetComponent implements TreeSelection @Override public void fireCreatorModified(DesignerEvent evt) { - // 只有选择组件时不触发模版更新,其他都要触发 + // 只有选择组件时不触发模版更新,其他都要触发 if (evt.getCreatorEventID() != DesignerEvent.CREATOR_SELECTED) { FormDesigner.this.fireTargetModified(); //bug59192 @@ -699,7 +702,7 @@ public class FormDesigner extends TargetComponent implements TreeSelection * 从root组件递归查找x,y所在的组件,注意是正在被设计的组件,因此其name属性必须不为空 */ private XCreator xCreatorAt(int x, int y, XCreator root, XCreator[] except) { - if (root == null || !root.isVisible()) { + if (root == null || !root.isVisible()) { return null; } x -= root.getX(); @@ -755,21 +758,21 @@ public class FormDesigner extends TargetComponent implements TreeSelection * 刷新底层容器 */ public void refreshRoot() { - // 撤销恢复操作都会refreshRoot,这时候的target.getContainer里的widget会和之前不一样,所以不用root判断来取 - XLayoutContainer formLayoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator(this.getTarget().getContainer()); + // 撤销恢复操作都会refreshRoot,这时候的target.getContainer里的widget会和之前不一样,所以不用root判断来取 + XLayoutContainer formLayoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator(this.getTarget().getContainer()); // 布局默认都是1,底层的border改为0,不然没意义 this.getTarget().getContainer().setMargin(new PaddingMargin(0,0,0,0)); formLayoutContainer.setBorder(null); if (formLayoutContainer.acceptType(XWBorderLayout.class)) { - WBorderLayout borderLayout = (WBorderLayout) formLayoutContainer.toData(); + WBorderLayout borderLayout = (WBorderLayout) formLayoutContainer.toData(); Widget northWidget = borderLayout.getLayoutWidget(WBorderLayout.NORTH); - Widget centerWidget = borderLayout.getLayoutWidget(WBorderLayout.CENTER); + Widget centerWidget = borderLayout.getLayoutWidget(WBorderLayout.CENTER); //本身含有,这儿得先清空再加 formLayoutContainer.removeAll(); refreshNorth(northWidget, formLayoutContainer); - refreshCenter(centerWidget, formLayoutContainer); + refreshCenter(centerWidget, formLayoutContainer); } else { formLayoutContainer.setSize(LARGE_PREFERRED_SIZE); @@ -778,43 +781,43 @@ public class FormDesigner extends TargetComponent implements TreeSelection } private void refreshNorth(Widget northWidget, XLayoutContainer formLayoutContainer) { - // 如果没有参数界面, 那么就处理下高度以及参数界面的按钮要点亮 - if (northWidget == null) { - paraComponent = null; - paraHeight = 0; - FormParaWidgetPane.getInstance(this); - return; - } - - XLayoutContainer northContainer = (XLayoutContainer) XCreatorUtils.createXCreator(northWidget); - paraHeight = ((XWBorderLayout)formLayoutContainer).toData().getNorthSize(); - paraComponent = northContainer; - northContainer.setSize(0,paraHeight); - formLayoutContainer.add(northContainer, WBorderLayout.NORTH); - } - - private void refreshCenter(Widget centerWidget, XLayoutContainer formLayoutContainer) { - // 不存在center块, 说明是新建的模板 - if (centerWidget == null) { - XLayoutContainer layoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator(new WFitLayout("body")); - layoutContainer.setSize(LARGE_PREFERRED_SIZE); - setRootComponent(layoutContainer); - formLayoutContainer.add(rootComponent, WBorderLayout.CENTER); - return; - } - - XLayoutContainer centerContainer = (XLayoutContainer) XCreatorUtils.createXCreator(centerWidget); - Dimension d = new Dimension(); - d.width = ((WFitLayout) centerWidget).getContainerWidth(); - d.height = ((WFitLayout) centerWidget).getContainerHeight(); - centerContainer.setSize(d); - formLayoutContainer.setSize(d.width, d.height + paraHeight); - setRootComponent(centerContainer); - // 再次打开时,layout下root,有内边距的话组件加上 - LayoutUtils.layoutContainer(centerContainer); - formLayoutContainer.add(rootComponent, WBorderLayout.CENTER); + // 如果没有参数界面, 那么就处理下高度以及参数界面的按钮要点亮 + if (northWidget == null) { + paraComponent = null; + paraHeight = 0; + FormParaWidgetPane.getInstance(this); + return; } + XLayoutContainer northContainer = (XLayoutContainer) XCreatorUtils.createXCreator(northWidget); + paraHeight = ((XWBorderLayout)formLayoutContainer).toData().getNorthSize(); + paraComponent = northContainer; + northContainer.setSize(0,paraHeight); + formLayoutContainer.add(northContainer, WBorderLayout.NORTH); + } + + private void refreshCenter(Widget centerWidget, XLayoutContainer formLayoutContainer) { + // 不存在center块, 说明是新建的模板 + if (centerWidget == null) { + XLayoutContainer layoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator(new WFitLayout("body")); + layoutContainer.setSize(LARGE_PREFERRED_SIZE); + setRootComponent(layoutContainer); + formLayoutContainer.add(rootComponent, WBorderLayout.CENTER); + return; + } + + XLayoutContainer centerContainer = (XLayoutContainer) XCreatorUtils.createXCreator(centerWidget); + Dimension d = new Dimension(); + d.width = ((WFitLayout) centerWidget).getContainerWidth(); + d.height = ((WFitLayout) centerWidget).getContainerHeight(); + centerContainer.setSize(d); + formLayoutContainer.setSize(d.width, d.height + paraHeight); + setRootComponent(centerContainer); + // 再次打开时,layout下root,有内边距的话组件加上 + LayoutUtils.layoutContainer(centerContainer); + formLayoutContainer.add(rootComponent, WBorderLayout.CENTER); + } + protected Insets getOutlineInsets() { return new Insets(10, 10, 10, 10); @@ -850,7 +853,7 @@ public class FormDesigner extends TargetComponent implements TreeSelection * @return 是则返回true */ public boolean isRoot(XCreator comp) { - return comp == rootComponent; + return comp == rootComponent || comp.acceptType(XWAbsoluteBodyLayout.class); } // 计算鼠标事件e所发生的位置相对根组件的位置关系 @@ -959,8 +962,8 @@ public class FormDesigner extends TargetComponent implements TreeSelection public void startDraggingComponent(XCreator xCreator, MouseEvent lastPressEvent, int x, int y) { // 根据所选择的组件的BeanInfo生成相应的AddingModel // AddingModel和StateModel不一样,适合当前选择的组件相关的 - int creatorWidth = xCreator.getWidth(); - int creatorHeight = xCreator.getHeight(); + int creatorWidth = xCreator.getWidth(); + int creatorHeight = xCreator.getHeight(); this.addingModel = new AddingModel(xCreator, x, y); TransferHandler handler = new DesignerTransferHandler(this, addingModel); setTransferHandler(handler); @@ -1004,9 +1007,9 @@ public class FormDesigner extends TargetComponent implements TreeSelection } } - /** - * 显示权限编辑界面 - */ + /** + * 显示权限编辑界面 + */ public void showAuthorityEditPane() { HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().setAuthorityMode(true); if (isSupportAuthority()) { @@ -1020,9 +1023,9 @@ public class FormDesigner extends TargetComponent implements TreeSelection } /** - * 是否支持权限编辑 - * @return 是则返回true - */ + * 是否支持权限编辑 + * @return 是则返回true + */ public boolean isSupportAuthority() { int size = getSelectionModel().getSelection().size(); XCreator creator = size == 0 ? getRootComponent() : getSelectionModel().getSelection() @@ -1033,7 +1036,7 @@ public class FormDesigner extends TargetComponent implements TreeSelection protected void setToolbarButtons(boolean flag) { //自适应布局和底层都不能删除 - DesignerContext.getDesignerFrame().checkCombineUp(!(isRoot(getSelectionModel().getSelection().getSelectedCreator()) || flag), NAME_ARRAY_LIST); + DesignerContext.getDesignerFrame().checkCombineUp(!(isRoot(getSelectionModel().getSelection().getSelectedCreator()) || flag), NAME_ARRAY_LIST); } private void invalidateLayout() { @@ -1089,7 +1092,7 @@ public class FormDesigner extends TargetComponent implements TreeSelection */ public Action[] getActions() { if (designer_actions == null) { - //先把复制粘贴按钮去掉,只留下删除 + //先把复制粘贴按钮去掉,只留下删除 // designer_actions = new Action[]{new CutAction(this), new CopyAction(this), new PasteAction(this), // new FormDeleteAction(this)}; designer_actions = new Action[]{new FormDeleteAction(this)}; @@ -1233,7 +1236,7 @@ public class FormDesigner extends TargetComponent implements TreeSelection public ToolBarMenuDockPlus getToolBarMenuDockPlus() { - return StableFactory.getMarkedInstanceObjectFromClass(BaseJForm.XML_TAG, ToolBarMenuDockPlus.class); + return StableFactory.getMarkedInstanceObjectFromClass(BaseJForm.XML_TAG, ToolBarMenuDockPlus.class); } /** diff --git a/designer_form/src/com/fr/design/mainframe/FormHierarchyTreePane.java b/designer_form/src/com/fr/design/mainframe/FormHierarchyTreePane.java index ccf2f2c88..5bfbfa630 100644 --- a/designer_form/src/com/fr/design/mainframe/FormHierarchyTreePane.java +++ b/designer_form/src/com/fr/design/mainframe/FormHierarchyTreePane.java @@ -1,39 +1,27 @@ package com.fr.design.mainframe; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.event.ActionEvent; +import java.awt.*; import javax.swing.BorderFactory; import javax.swing.Icon; - -import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWAbsoluteBodyLayout; +import com.fr.design.mainframe.widget.UITreeComboBox; + import com.fr.design.parameter.HierarchyTreePane; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.designer.treeview.ComponentTreeModel; -import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.icontainer.UIScrollPane; - -import javax.swing.JComponent; import com.fr.design.gui.ilable.UILabel; import javax.swing.JPanel; import javax.swing.JScrollPane; -import com.fr.design.gui.itextfield.UITextField; import javax.swing.SwingConstants; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.tree.TreePath; import com.fr.base.BaseUtils; import com.fr.general.Inter; -import com.fr.stable.StringUtils; -import com.fr.design.actions.UpdateAction; import com.fr.design.layout.FRGUIPaneFactory; @@ -45,11 +33,12 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree public static final int NODE_LENGTH = 2; public static final int PARA = 0; public static final int BODY = 1; - + private ComponentTree componentTree; + private UITreeComboBox treeComboBox; // richer:搜寻树节点的的文本框 - private UITextField searchTextField; - private SearchResultPane searchResult; +// private UITextField searchTextField; +// private SearchResultPane searchResult; public static FormHierarchyTreePane getInstance() { return HOLDER.singleton; @@ -66,7 +55,7 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree } private FormHierarchyTreePane() { - setLayout(new BorderLayout(0, 6)); + setLayout(new BorderLayout(0, 0)); } @Override @@ -88,9 +77,9 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree */ public void clearDockingView() { this.componentTree = null; - this.searchTextField = null; - this.searchResult = null; - add(new JScrollPane(), BorderLayout.CENTER); +// this.searchTextField = null; +// this.searchResult = null; +// add(new JScrollPane(), BorderLayout.CENTER); } @Override @@ -100,58 +89,75 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree public void refreshDockingView() { FormDesigner formDesigner = this.getEditingFormDesigner(); removeAll(); + if(this.componentTree != null) { + this.componentTree.removeAll(); + } + if(this.treeComboBox != null) { + this.treeComboBox.removeAll(); + } if (formDesigner == null) { clearDockingView(); return; } componentTree = new ComponentTree(formDesigner); - + ComponentTreeModel treeModel = (ComponentTreeModel) componentTree.getModel(); XCreator root = (XCreator)treeModel.getRoot(); int childCount = treeModel.getChildCount(root); //按照节点添加para在下的,但这里需要para节点在上,调整一下位置 if(childCount == NODE_LENGTH){ - adjustPosition(treeModel,formDesigner); + adjustPosition(treeModel, formDesigner); } - UIScrollPane scrollPane = new UIScrollPane(componentTree); - scrollPane.setBorder(null); - add(scrollPane, BorderLayout.CENTER); - JPanel searchPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - add(searchPane, BorderLayout.NORTH); - searchPane.add(new UILabel(Inter.getLocText("FR-Designer_Search") + ":", + JPanel widgetPane = new JPanel(); + widgetPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); + widgetPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + add(widgetPane, BorderLayout.NORTH); + widgetPane.add(new UILabel(Inter.getLocText("FR-Designer-Selected_Widget") + " ", SwingConstants.HORIZONTAL), BorderLayout.WEST); - searchTextField = new UITextField(); - searchPane.add(searchTextField, BorderLayout.CENTER); - searchTextField.getDocument().addDocumentListener(new DocumentListener() { - @Override - public void insertUpdate(DocumentEvent e) { - search(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - search(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - search(); - } - - private void search() { - String text = searchTextField.getText(); - if (StringUtils.isEmpty(text)) { - removeSearchResult(); - } else { - populate(componentTree.search(text)); - } - } - }); + treeComboBox = new UITreeComboBox(componentTree); + widgetPane.add(treeComboBox, BorderLayout.CENTER); + add(widgetPane, BorderLayout.CENTER); + + +// UIScrollPane scrollPane = new UIScrollPane(componentTree); +// scrollPane.setBorder(null); +// add(scrollPane, BorderLayout.CENTER); +// JPanel searchPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); +// add(searchPane, BorderLayout.NORTH); +// searchPane.add(new UILabel(Inter.getLocText("FR-Designer_Search") + ":", +// SwingConstants.HORIZONTAL), BorderLayout.WEST); +// searchTextField = new UITextField(); +// searchPane.add(searchTextField, BorderLayout.CENTER); +// searchTextField.getDocument().addDocumentListener(new DocumentListener() { +// @Override +// public void insertUpdate(DocumentEvent e) { +// search(); +// } +// +// @Override +// public void removeUpdate(DocumentEvent e) { +// search(); +// } +// +// @Override +// public void changedUpdate(DocumentEvent e) { +// search(); +// } +// +// private void search() { +// String text = searchTextField.getText(); +// if (StringUtils.isEmpty(text)) { +// removeSearchResult(); +// } else { +// populate(componentTree.search(text)); +// } +// } +// }); } - + /** * 调整结构树para和body的位置 - * + * * @param treeModel * @param formDesigner */ @@ -185,114 +191,114 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree /** * 删除搜索结果 */ - public void removeSearchResult() { - componentTree.setSelectionPath(null); - if (searchResult != null) { - this.remove(searchResult); - } - } - - public void populate(TreePath[] treepath) { - if (this.searchResult == null) { - searchResult = new SearchResultPane(); - } - if (((BorderLayout) getLayout()).getLayoutComponent(BorderLayout.SOUTH) == null) { - add(searchResult, BorderLayout.SOUTH); - } - searchResult.populate(treepath); - } - - private class SearchResultPane extends JPanel { - private UILabel resultLabel = new UILabel(); - private BackAction backAction = new BackAction(); - private ForWardAction forwardAction = new ForWardAction(); - private TreePath[] tree; - private int number = 0; - - SearchResultPane() { - this.setLayout(FRGUIPaneFactory.createBorderLayout()); - JPanel actionJPanel = FRGUIPaneFactory.createCenterFlowInnerContainer_S_Pane(); - addButtonToJPanel(actionJPanel, backAction.createToolBarComponent()); - addButtonToJPanel(actionJPanel, forwardAction.createToolBarComponent()); - - this.add(actionJPanel, BorderLayout.EAST); - this.add(resultLabel, BorderLayout.WEST); - } - - private void addButtonToJPanel(JPanel actionLabel, - JComponent toolBarComponent) { - actionLabel.add(toolBarComponent); - if (toolBarComponent instanceof UIButton) { - toolBarComponent.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - } - } - - public void populate(TreePath[] search) { - tree = search; - resultLabel.setText(Inter.getLocText("FR-Designer_Total") + ":" + tree.length); - number = 0; - check(); - } - - public void next() { - if (number < tree.length - 1) { - componentTree.setAndScrollSelectionPath(tree[++number]); - } - check(); - } - - public void last() { - if (number > 0) { - componentTree.setAndScrollSelectionPath(tree[--number]); - } - check(); - } - - public void check() { - if (tree.length < 1) { - backAction.setEnabled(false); - forwardAction.setEnabled(false); - } else { - backAction.setEnabled(number > 0); - forwardAction.setEnabled(number < tree.length - 1); - } - - } - - } - - private class BackAction extends UpdateAction { - - public BackAction() { - this.setName(Inter.getLocText("Form-Hierarchy_Tree_Last")); - this.setSmallIcon(BaseUtils - .readIcon("com/fr/design/images/m_help/back.png")); - this.setEnabled(false); - } - - public void actionPerformed(ActionEvent e) { - searchResult.last(); - } - } - - private class ForWardAction extends UpdateAction { - - public ForWardAction() { - this.setName(Inter.getLocText("Form-Hierarchy_Tree_Next")); - this.setSmallIcon(BaseUtils - .readIcon("com/fr/design/images/m_help/forward.png")); - this.setEnabled(false); - } - - public void actionPerformed(ActionEvent e) { - searchResult.next(); - } - } +// public void removeSearchResult() { +// componentTree.setSelectionPath(null); +// if (searchResult != null) { +// this.remove(searchResult); +// } +// } +// +// public void populate(TreePath[] treepath) { +// if (this.searchResult == null) { +// searchResult = new SearchResultPane(); +// } +// if (((BorderLayout) getLayout()).getLayoutComponent(BorderLayout.SOUTH) == null) { +// add(searchResult, BorderLayout.SOUTH); +// } +// searchResult.populate(treepath); +// } + +// private class SearchResultPane extends JPanel { +// private UILabel resultLabel = new UILabel(); +// private BackAction backAction = new BackAction(); +// private ForWardAction forwardAction = new ForWardAction(); +// private TreePath[] tree; +// private int number = 0; +// +// SearchResultPane() { +// this.setLayout(FRGUIPaneFactory.createBorderLayout()); +// JPanel actionJPanel = FRGUIPaneFactory.createCenterFlowInnerContainer_S_Pane(); +// addButtonToJPanel(actionJPanel, backAction.createToolBarComponent()); +// addButtonToJPanel(actionJPanel, forwardAction.createToolBarComponent()); +// +// this.add(actionJPanel, BorderLayout.EAST); +// this.add(resultLabel, BorderLayout.WEST); +// } +// +// private void addButtonToJPanel(JPanel actionLabel, +// JComponent toolBarComponent) { +// actionLabel.add(toolBarComponent); +// if (toolBarComponent instanceof UIButton) { +// toolBarComponent.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); +// } +// } +// +// public void populate(TreePath[] search) { +// tree = search; +// resultLabel.setText(Inter.getLocText("FR-Designer_Total") + ":" + tree.length); +// number = 0; +// check(); +// } +// +// public void next() { +// if (number < tree.length - 1) { +// componentTree.setAndScrollSelectionPath(tree[++number]); +// } +// check(); +// } +// +// public void last() { +// if (number > 0) { +// componentTree.setAndScrollSelectionPath(tree[--number]); +// } +// check(); +// } +// +// public void check() { +// if (tree.length < 1) { +// backAction.setEnabled(false); +// forwardAction.setEnabled(false); +// } else { +// backAction.setEnabled(number > 0); +// forwardAction.setEnabled(number < tree.length - 1); +// } +// +// } + + //} + +// private class BackAction extends UpdateAction { +// +// public BackAction() { +// this.setName(Inter.getLocText("Form-Hierarchy_Tree_Last")); +// this.setSmallIcon(BaseUtils +// .readIcon("com/fr/design/images/m_help/back.png")); +// this.setEnabled(false); +// } +// +// public void actionPerformed(ActionEvent e) { +// searchResult.last(); +// } +// } +// +// private class ForWardAction extends UpdateAction { +// +// public ForWardAction() { +// this.setName(Inter.getLocText("Form-Hierarchy_Tree_Next")); +// this.setSmallIcon(BaseUtils +// .readIcon("com/fr/design/images/m_help/forward.png")); +// this.setEnabled(false); +// } +// +// public void actionPerformed(ActionEvent e) { +// searchResult.next(); +// } +// } @Override /** * 位置 - * + * * @return 位置 */ public Location preferredLocation() { diff --git a/designer_form/src/com/fr/design/mainframe/FormWidgetDetailPane.java b/designer_form/src/com/fr/design/mainframe/FormWidgetDetailPane.java index b412f4202..c33e1b113 100644 --- a/designer_form/src/com/fr/design/mainframe/FormWidgetDetailPane.java +++ b/designer_form/src/com/fr/design/mainframe/FormWidgetDetailPane.java @@ -1,29 +1,36 @@ package com.fr.design.mainframe; -import java.awt.BorderLayout; -import java.awt.CardLayout; -import java.awt.Color; - -import javax.swing.BorderFactory; -import javax.swing.Icon; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingConstants; -import javax.swing.border.LineBorder; - import com.fr.base.BaseUtils; +import com.fr.base.FRContext; import com.fr.design.gui.frpane.UITabbedPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.imenu.UIMenuItem; +import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.parameter.ParameterPropertyPane; -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.XCreatorUtils; -import com.fr.design.designer.creator.XLayoutContainer; -import com.fr.design.designer.creator.XWParameterLayout; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.form.share.ShareLoader; +import com.fr.form.ui.ElCaseBindInfo; +import com.fr.general.FRLogger; import com.fr.general.Inter; +import com.fr.general.SiteCenter; +import com.fr.share.ShareConstants; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; +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.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; /** * Created with IntelliJ IDEA. @@ -32,16 +39,22 @@ import com.fr.general.Inter; * Time: 下午8:18 */ public class FormWidgetDetailPane extends FormDockView{ - public static final String PARA = "para"; - public static final String BODY = "body"; private UITabbedPane tabbedPane; - private ParameterPropertyPane parameterPropertyPane; - private MobileWidgetTable mobileWidgetTable; - private MobileBodyWidgetTable mobileBodyWidgetTable; - private UIScrollPane downPanel; - private JPanel centerPane; - private CardLayout cardLayout; + private UIScrollPane downPane; + private JPanel reuWidgetPanel; + private UIComboBox comboBox; + private ElCaseBindInfo[] elCaseBindInfoList; + private UIButton deleteButton; + private UIButton resetButton; + private JPanel editPanel; + private JPanel resetPanel; + private JPanel menutPanel; + private static final int OFFSET_X = 140; + private static final int OFFSET_Y = 26; + private SwingWorker sw; + //组件面板是否可以编辑 + private boolean isEdit; public static FormWidgetDetailPane getInstance() { if (HOLDER.singleton == null) { @@ -84,101 +97,335 @@ public class FormWidgetDetailPane extends FormDockView{ clearDockingView(); return; } - parameterPropertyPane = ParameterPropertyPane.getInstance(designer); - parameterPropertyPane.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); - - JPanel esp = FRGUIPaneFactory.createBorderLayout_S_Pane(); - esp.setBorder(null); - mobileWidgetTable = new MobileWidgetTable(designer); - mobileBodyWidgetTable = new MobileBodyWidgetTable(designer); - designer.addDesignerEditListener(new mobileWidgetDesignerAdapter()); - centerPane = FRGUIPaneFactory.createCardLayout_S_Pane(); - cardLayout = (CardLayout) centerPane.getLayout(); - centerPane.add(mobileWidgetTable,PARA); - centerPane.add(mobileBodyWidgetTable,BODY); - if(hasSelectParaPane(designer)){ - cardLayout.show(centerPane,PARA); - - } else { - cardLayout.show(centerPane,BODY); + reuWidgetPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + reuWidgetPanel.setBorder(null); + if (elCaseBindInfoList == null) { + if (sw != null) { + sw.cancel(true); + } + sw = new SwingWorker() { + @Override + protected Object doInBackground() throws Exception { + elCaseBindInfoList = ShareLoader.getLoader().getAllBindInfoList(); + refreshDownPanel(false); + return null; + } + }; + sw.execute(); } - downPanel = new UIScrollPane(centerPane); - downPanel.setBorder(new LineBorder(Color.gray)); - esp.add(downPanel,BorderLayout.CENTER); - UILabel upLabel = new UILabel(Inter.getLocText("FR-Widget_Mobile_Table"),SwingConstants.CENTER); - upLabel.setBorder(BorderFactory.createEmptyBorder(6,0,6,0)); - esp.add(upLabel,BorderLayout.NORTH); - + initReuWidgetPanel(); + initMenuPanel(); tabbedPane = new UITabbedPane(); tabbedPane.setOpaque(true); tabbedPane.setBorder(null); tabbedPane.setTabPlacement(SwingConstants.BOTTOM); - tabbedPane.addTab(Inter.getLocText("FR-Widget_Mobile_Tree"), parameterPropertyPane); - tabbedPane.addTab(Inter.getLocText("FR-Widget_Mobile_Terminal"), esp); + tabbedPane.addTab(Inter.getLocText("FR-Engine_Report"), reuWidgetPanel); + tabbedPane.addTab(Inter.getLocText("FR-Designer-Form-ToolBar_Chart"), new JPanel()); add(tabbedPane, BorderLayout.CENTER); } - public void setSelectedIndex(int index){ - tabbedPane.setSelectedIndex(index); + /** + * 初始化组件共享和复用面板 + */ + private void initReuWidgetPanel() { + elCaseBindInfoList = ShareLoader.getLoader().getAllBindInfoList(); + downPane = new UIScrollPane(new ShareWidgetPane(elCaseBindInfoList, false)); + reuWidgetPanel.add(downPane); } /** - * 选中的组件是否在参数面板里 - * @param designer 设计器 - * @return 是则返回true + * 初始化菜单栏面板 */ - public boolean hasSelectParaPane(FormDesigner designer){ - XCreator xCreator = designer.getSelectionModel().getSelection().getSelectedCreator(); - if(xCreator == null){ - xCreator = designer.getRootComponent(); - } - XLayoutContainer container = XCreatorUtils.getHotspotContainer(xCreator); - return xCreator.acceptType(XWParameterLayout.class) || container.acceptType(XWParameterLayout.class); + private void initMenuPanel() { + menutPanel = new JPanel(); + menutPanel.setLayout(FRGUIPaneFactory.createBorderLayout()); + menutPanel.setBorder(BorderFactory.createEmptyBorder(3, 8, 3, 3)); + menutPanel.setPreferredSize(new Dimension(240, 48)); + menutPanel.add(new UILabel(Inter.getLocText("FR-Designer_LocalWidget"), + SwingConstants.HORIZONTAL), BorderLayout.WEST); + + menutPanel.add(initEditButtonPane(), BorderLayout.EAST); + menutPanel.add(new JPanel(), BorderLayout.CENTER); + comboBox = new UIComboBox(getFormCategories()); + comboBox.setPreferredSize(new Dimension(240, 30)); + initComboBoxSelectedListener(); + menutPanel.add(comboBox, BorderLayout.SOUTH); + reuWidgetPanel.add(menutPanel, BorderLayout.NORTH); + } /** - * 清除数据 + * 创建菜单栏按钮面板 */ - public void clearDockingView() { - parameterPropertyPane = null; - mobileWidgetTable = null; - JScrollPane psp = new JScrollPane(); - psp.setBorder(null); - this.add(psp, BorderLayout.CENTER); + private JPanel initEditButtonPane() { + editPanel = new JPanel(); + editPanel.setLayout(FRGUIPaneFactory.createBorderLayout()); + editPanel.add(createRefreshButton(), BorderLayout.WEST); + editPanel.add(createDownloadButton(), BorderLayout.EAST); + return editPanel; + } + + /** + * 创建取消删除面板 + */ + private JPanel initResetButtonPane() { + resetPanel = new JPanel(); + resetButton = new UIButton(Inter.getLocText("FR-Designer_Reset")); + resetPanel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); + resetButton.set4ToolbarButton(); + resetButton.setOpaque(true); + resetButton.setBackground(new Color(184, 220, 242)); + resetButton.setForeground(Color.WHITE); + resetButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + refreshDownPanel(false); + replaceButtonPanel(false); + reuWidgetPanel.remove(deleteButton); + } + }); + resetPanel.setLayout(FRGUIPaneFactory.createBorderLayout()); + resetPanel.add(resetButton, BorderLayout.CENTER); + return resetPanel; + + } + + + private void initComboBoxSelectedListener() { + comboBox.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + ShareLoader.getLoader().resetRemovedModuleList(); + int filterIndex = comboBox.getSelectedIndex(); + if (filterIndex == 0) { + elCaseBindInfoList = ShareLoader.getLoader().getAllBindInfoList(); + } else { + String filterName = comboBox.getSelectedItem().toString(); + elCaseBindInfoList = ShareLoader.getLoader().getFilterBindInfoList(filterName); + } + refreshDownPanel(isEdit); + + } + }); + } + + /** + * 创建刷新按钮 + */ + private UIButton createRefreshButton() { + UIButton refreshButton = new UIButton(); + refreshButton.setIcon(BaseUtils.readIcon("/com/fr/design/form/images/refresh.png")); + refreshButton.setToolTipText(Inter.getLocText("FR-Designer_Refresh")); + refreshButton.set4ToolbarButton(); + refreshButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (sw != null) { + sw.cancel(true); + } + sw = new SwingWorker() { + @Override + protected Object doInBackground() throws Exception { + ShareLoader.getLoader().refreshModule(); + elCaseBindInfoList = ShareLoader.getLoader().getAllBindInfoList(); + refreshComboxData(); + refreshDownPanel(false); + return null; + } + }; + sw.execute(); + } + }); + return refreshButton; + + } + + private void refreshComboxData() { + comboBox.setSelectedIndex(0); + comboBox.setModel(new DefaultComboBoxModel(getFormCategories())); + } + + /** + * 创建下载模板的按钮 + */ + private UIButton createDownloadButton() { + UIButton downloadButton = new UIButton(); + downloadButton.setIcon(BaseUtils.readIcon("/com/fr/design/form/images/showmenu.png")); + downloadButton.set4ToolbarButton(); + downloadButton.setToolTipText(Inter.getLocText("FR-Designer_Download_Template")); + downloadButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + initPopMenu(); + } + }); + return downloadButton; + } + + /** + * 初始化下拉面板 + */ + private void initPopMenu() { + UIPopupMenu menu = new UIPopupMenu(); + UIMenuItem downloadItem = new UIMenuItem(Inter.getLocText("FR-Designer_Download_Template"), BaseUtils.readIcon("/com/fr/design/form/images/download icon.png")); + UIMenuItem installItem = new UIMenuItem(Inter.getLocText("FR-Designer_Install_Template"), BaseUtils.readIcon("/com/fr/design/form/images/install icon.png")); + UIMenuItem deleteItem = new UIMenuItem(Inter.getLocText("FR-Designer_Delete_Template"), BaseUtils.readIcon("/com/fr/design/form/images/delete icon.png")); + menu.add(downloadItem); + menu.add(installItem); + menu.add(deleteItem); + downloadItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String url = SiteCenter.getInstance().acquireUrlByKind("reuse.url"); + if (StringUtils.isEmpty(url)) { + FRContext.getLogger().info("The URL is empty!"); + return; + } + try { + Desktop.getDesktop().browse(new URI(url)); + } catch (IOException exp) { + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer_Set_default_browser")); + FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); + } catch (URISyntaxException exp) { + FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); + } catch (Exception exp) { + FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); + FRContext.getLogger().error("Can not open the browser for URL: " + url); + } + } + }); + installItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); + fileChooser.setFileFilter(new FileNameExtensionFilter(".reu", "reu")); + int returnValue = fileChooser.showDialog(new UILabel(), Inter.getLocText("FR-Designer_Select")); + if (returnValue == JFileChooser.APPROVE_OPTION) { + final File chosenFile = fileChooser.getSelectedFile(); + installFromDiskZipFile(chosenFile); + } + } + }); + deleteItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + replaceButtonPanel(true); + deleteFromDiskZipFile(); + } + }); + GUICoreUtils.showPopupMenu(menu, tabbedPane, tabbedPane.getX() + OFFSET_X, OFFSET_Y); } - public class mobileWidgetDesignerAdapter implements DesignerEditListener { + private void deleteFromDiskZipFile() { + deleteButton = new UIButton(Inter.getLocText("FR-Designer-CommitTab_Remove")); + deleteButton.setBackground(Color.red); + deleteButton.repaint(); + deleteButton.setPreferredSize(new Dimension(240, 40)); + reuWidgetPanel.add(deleteButton, BorderLayout.SOUTH); + deleteButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (ShareLoader.getLoader().removeModulesFromList()) { + refreshShareMoudule(); + reuWidgetPanel.remove(deleteButton); + elCaseBindInfoList = ShareLoader.getLoader().getAllBindInfoList(); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Share_Module_Removed_Successful")); + refreshDownPanel(false); + replaceButtonPanel(false); + refreshComboxData(); + } else { + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Share_Module_Removed_Failed")); + } + + } + }); + refreshDownPanel(true); - public mobileWidgetDesignerAdapter() { + } + + private void replaceButtonPanel(boolean isEdit) { + this.isEdit = isEdit; + if (isEdit) { + menutPanel.remove(editPanel); + menutPanel.add(initResetButtonPane(), BorderLayout.EAST); + } else { + menutPanel.remove(resetPanel); + menutPanel.add(initEditButtonPane(), BorderLayout.EAST); + ShareLoader.getLoader().resetRemovedModuleList(); } - /** - * 响应界面改变事件 - * @param evt 事件 - */ - public void fireCreatorModified(DesignerEvent evt) { - if (evt.getCreatorEventID() == DesignerEvent.CREATOR_RESIZED - || evt.getCreatorEventID() == DesignerEvent.CREATOR_EDITED - || evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED - || evt.getCreatorEventID() == DesignerEvent.CREATOR_ADDED) { - int value = downPanel.getVerticalScrollBar().getValue(); - if(hasSelectParaPane(getEditingFormDesigner())){ - cardLayout.show(centerPane,PARA); - mobileWidgetTable.refresh(); + + } + + private void installFromDiskZipFile(File chosenFile) { + if (chosenFile != null && chosenFile.getName().endsWith(ShareConstants.SUFFIX_MODULE)) { + try { + if (ShareLoader.getLoader().installModuleFromDiskZipFile(chosenFile)) { + refreshShareMoudule(); + elCaseBindInfoList = ShareLoader.getLoader().getAllBindInfoList(); + refreshDownPanel(false); + refreshComboxData(); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Share_Module_OK")); } else { - cardLayout.show(centerPane,BODY); - mobileBodyWidgetTable.refresh(); + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Share_Module_Error")); } - //出现滚动条 - downPanel.doLayout(); - //控件列表选中某组件,触发表单中选中控件,选中事件又触发列表刷新,滚动条回到0 - //此处设置滚动条值为刷新前 - downPanel.getVerticalScrollBar().setValue(value); + } catch (IOException e) { + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Share_Module_Error")); + FRLogger.getLogger().error(e.getMessage(), e); } } } + private void refreshShareMoudule() { + try { + ShareLoader.getLoader().refreshModule(); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage(), e); + } + } + + /** + * 获取报表块组件分类 + */ + public String[] getFormCategories() { + return ArrayUtils.addAll(new String[] {Inter.getLocText("FR-Designer_AllCategories")}, ShareLoader.getLoader().getModuleCategory()); + } + + + + public void refreshDownPanel(boolean isEdit) { + reuWidgetPanel.remove(downPane); + downPane = new UIScrollPane(new ShareWidgetPane(elCaseBindInfoList, isEdit)); + reuWidgetPanel.add(downPane); + repaintContainer(); + + } + + public void repaintContainer() { + validate(); + repaint(); + revalidate(); + } + + + public void setSelectedIndex(int index){ + tabbedPane.setSelectedIndex(index); + } + + + /** + * 清除数据 + */ + public void clearDockingView() { + JScrollPane psp = new JScrollPane(); + psp.setBorder(null); + this.add(psp, BorderLayout.CENTER); + } + + + /** * 定位 * @return 位置 diff --git a/designer_form/src/com/fr/design/mainframe/JForm.java b/designer_form/src/com/fr/design/mainframe/JForm.java index 661ba0ab9..4c015811c 100644 --- a/designer_form/src/com/fr/design/mainframe/JForm.java +++ b/designer_form/src/com/fr/design/mainframe/JForm.java @@ -28,6 +28,7 @@ import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; +import com.fr.design.parameter.ParameterPropertyPane; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; import com.fr.design.utils.gui.LayoutUtils; import com.fr.file.FILE; @@ -247,6 +248,7 @@ public class JForm extends JTemplate implements BaseJForm { ComparatorUtils.equals(editingComponent.getClass(), NoSupportAuthorityEdit.class) ? editingComponent : createAuthorityEditPane()); } else { EastRegionContainerPane.getInstance().replaceUpPane(editingComponent); + } } @@ -607,8 +609,10 @@ public class JForm extends JTemplate implements BaseJForm { EastRegionContainerPane.getInstance().replaceDownPane(RolesAlreadyEditedPane.getInstance()); return; } + if (formDesign.isReportBlockEditing()) { if (elementCaseDesign != null) { + EastRegionContainerPane.getInstance().removeParameterPane(); EastRegionContainerPane.getInstance().replaceDownPane(elementCaseDesign.getEastDownPane()); EastRegionContainerPane.getInstance().replaceUpPane(elementCaseDesign.getEastUpPane()); return; @@ -616,7 +620,8 @@ public class JForm extends JTemplate implements BaseJForm { } EastRegionContainerPane.getInstance().replaceUpPane(WidgetPropertyPane.getInstance(formDesign)); - + EastRegionContainerPane.getInstance().addParameterPane(ParameterPropertyPane.getInstance(formDesign)); + EastRegionContainerPane.getInstance().setParameterHeight(ParameterPropertyPane.getInstance(formDesign).getPreferredSize().height); if (EastRegionContainerPane.getInstance().getDownPane() == null) { new Thread() { public void run() { @@ -636,6 +641,7 @@ public class JForm extends JTemplate implements BaseJForm { pane.setLayout(new BorderLayout()); pane.add(FormWidgetDetailPane.getInstance(formDesign), BorderLayout.CENTER); EastRegionContainerPane.getInstance().replaceDownPane(pane); + } } @@ -653,7 +659,8 @@ public class JForm extends JTemplate implements BaseJForm { * @return 是则返回true */ public boolean isSelectRootPane() { - return formDesign.getRootComponent() == formDesign.getSelectionModel().getSelection().getSelectedCreator(); + return (formDesign.getRootComponent() == formDesign.getSelectionModel().getSelection().getSelectedCreator()) + || (formDesign.getSelectionModel().getSelection().getSelectedCreator().acceptType(XWAbsoluteBodyLayout.class)); } diff --git a/designer_form/src/com/fr/design/mainframe/ShareWidgetButton.java b/designer_form/src/com/fr/design/mainframe/ShareWidgetButton.java index 3054bea32..12e5302b0 100644 --- a/designer_form/src/com/fr/design/mainframe/ShareWidgetButton.java +++ b/designer_form/src/com/fr/design/mainframe/ShareWidgetButton.java @@ -1,17 +1,19 @@ package com.fr.design.mainframe; -import com.fr.base.BaseUtils; +import com.fr.base.*; 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.share.ShareConstants; 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.general.IOUtils; import com.fr.stable.StringUtils; import javax.swing.*; +import javax.swing.Icon; import java.awt.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; @@ -20,7 +22,6 @@ 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; @@ -32,46 +33,98 @@ import java.io.Serializable; public class ShareWidgetButton extends JPanel implements MouseListener, MouseMotionListener, Serializable { private ElCaseBindInfo bindInfo; private MouseEvent lastPressEvent; + private JPanel reportPane; + private boolean isEdit; + private boolean isMarked; + private Icon markedMode = IOUtils.readIcon("/com/fr/design/form/images/marked.png"); + private Icon unMarkedMode = IOUtils.readIcon("/com/fr/design/form/images/unmarked.png"); + private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 60 / 100.0F); + private JComponent markedButton = new JComponent() { + protected void paintComponent(Graphics g) { + markedMode.paintIcon(this, g, 0, 0); + } + }; + private JComponent unMarkedButton = new JComponent() { + protected void paintComponent(Graphics g) { + unMarkedMode.paintIcon(this, g, 0, 0); + } + }; public ShareWidgetButton(ElCaseBindInfo bindInfo) { this.bindInfo = bindInfo; + this.setPreferredSize(new Dimension(108, 68)); initUI(); - this.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); + this.setLayout(getCoverLayout()); this.addMouseListener(this); this.addMouseMotionListener(this); new DragAndDropDragGestureListener(this, DnDConstants.ACTION_COPY_OR_MOVE); } + public void paint(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + Composite oldComposite = g2d.getComposite(); + g2d.setComposite(composite); + g2d.setColor(Color.white); + g2d.fillRect(0, 0, getWidth(), getHeight()); + g2d.setComposite(oldComposite); + super.paint(g); + } + + public void setElementCaseEdit(boolean isEdit) { + this.isEdit = isEdit; + if (isEdit) { + this.add(unMarkedButton, 0); + repaint(); + } + + + } 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); + reportPane = new JPanel(new BorderLayout()); + reportPane.add(new UILabel(new ImageIcon(bindInfo.getCover())), BorderLayout.CENTER); + JPanel labelPane = new JPanel(new BorderLayout()); + UILabel label = new UILabel(bindInfo.getName(), UILabel.CENTER); + labelPane.setBackground(new Color(184, 220, 242)); + labelPane.add(label, BorderLayout.CENTER); + reportPane.add(labelPane, BorderLayout.SOUTH); + add(reportPane); } - private class ImagePanel extends JPanel { + protected LayoutManager getCoverLayout() { + return new LayoutManager() { - private BufferedImage image; + @Override + public void removeLayoutComponent(Component comp) { + } - public ImagePanel(BufferedImage image) { - this.image = image; - this.setPreferredSize(new Dimension(110, 50)); - } + @Override + public Dimension preferredLayoutSize(Container parent) { + return parent.getPreferredSize(); + } - @Override - public void paintComponent(Graphics g) { - g.drawImage(image, 0, 0, 110, 70, null); - } + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + @Override + public void layoutContainer(Container parent) { + int width = parent.getWidth(); + int height = parent.getHeight(); + markedButton.setBounds((width - 25), 0, 25, 25); + unMarkedButton.setBounds((width - 25), 0, 25, 25); + reportPane.setBounds(0, 0, width, height); + + + + } + @Override + public void addLayoutComponent(String name, Component comp) { + } + }; } public ElCaseBindInfo getBindInfo() { @@ -82,9 +135,25 @@ public class ShareWidgetButton extends JPanel implements MouseListener, MouseMot this.bindInfo = bindInfo; } + public String getFileName() { + return bindInfo.getName() +"." + bindInfo.getId() + ShareConstants.SUFFIX_MODULE; + } + @Override public void mouseClicked(MouseEvent e) { + if (isEdit) { + if (isMarked) { + remove(markedButton); + ShareLoader.getLoader().removeModuleForList(getFileName()); + isMarked = false; + } else { + add(markedButton,0); + ShareLoader.getLoader().addModuleToList(getFileName()); + isMarked = true; + } + } + repaint(); } @Override diff --git a/designer_form/src/com/fr/design/mainframe/ShareWidgetPane.java b/designer_form/src/com/fr/design/mainframe/ShareWidgetPane.java index 79f15b364..c5659d9bc 100644 --- a/designer_form/src/com/fr/design/mainframe/ShareWidgetPane.java +++ b/designer_form/src/com/fr/design/mainframe/ShareWidgetPane.java @@ -3,27 +3,26 @@ 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 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()); - } + public ShareWidgetPane(ElCaseBindInfo[] elCaseBindInfoList, boolean isEdit) { + this.setBorder(BorderFactory.createEmptyBorder(10, 3, 0, 0));// 设置面板的边框 ,距离上、左、下、右 的距离 + if (elCaseBindInfoList != null) { + int rowCount = (elCaseBindInfoList.length + 1) / 2; + this.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 10)); + for (ElCaseBindInfo rbModuleInfo : elCaseBindInfoList) { + ShareWidgetButton widgetButton = new ShareWidgetButton(rbModuleInfo); + widgetButton.setElementCaseEdit(isEdit); + this.add(widgetButton); + } + this.setPreferredSize(new Dimension(240, rowCount * 80)); + } } -} +} \ No newline at end of file diff --git a/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java b/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java index a385aed28..cc7f1d769 100644 --- a/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java +++ b/designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java @@ -4,17 +4,26 @@ import com.fr.base.BaseUtils; import com.fr.design.ExtraDesignClassManager; 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.XCreatorUtils; +import com.fr.design.designer.creator.XLayoutContainer; +import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.designer.properties.EventPropertyTable; import com.fr.design.designer.properties.WidgetPropertyTable; +import com.fr.design.designer.treeview.ComponentTreeModel; import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itable.AbstractPropertyTable; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.parameter.ParameterPropertyPane; import com.fr.general.Inter; import com.fr.stable.ArrayUtils; + import javax.swing.*; +import javax.swing.border.LineBorder; import java.awt.*; import java.util.ArrayList; import java.util.List; @@ -29,6 +38,18 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper private EventPropertyTable eventTable; private List widgetPropertyTables; private FormDesigner designer; + private ComponentTree componentTree; + private JPanel wsp; + private MobileWidgetTable mobileWidgetTable; + private MobileBodyWidgetTable mobileBodyWidgetTable; + private UIScrollPane downPanel; + private JPanel centerPane; + private CardLayout cardLayout; + public static final String PARA = "para"; + public static final String BODY = "body"; + public static final int NODE_LENGTH = 2; + public boolean isrefresh = true; + public static WidgetPropertyPane getInstance() { if (HOLDER.singleton == null) { @@ -43,7 +64,6 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper return HOLDER.singleton; } - private static class HOLDER { private static WidgetPropertyPane singleton = new WidgetPropertyPane(); } @@ -52,6 +72,37 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper setLayout(FRGUIPaneFactory.createBorderLayout()); } + public class mobileWidgetDesignerAdapter implements DesignerEditListener { + + public mobileWidgetDesignerAdapter() { + } + + /** + * 响应界面改变事件 + * @param evt 事件 + */ + public void fireCreatorModified(DesignerEvent evt) { + if (evt.getCreatorEventID() == DesignerEvent.CREATOR_RESIZED + || evt.getCreatorEventID() == DesignerEvent.CREATOR_EDITED + || evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED + || evt.getCreatorEventID() == DesignerEvent.CREATOR_ADDED) { + int value = downPanel.getVerticalScrollBar().getValue(); + if(hasSelectParaPane(getEditingFormDesigner())){ + cardLayout.show(centerPane,PARA); + mobileWidgetTable.refresh(); + } else { + cardLayout.show(centerPane,BODY); + mobileBodyWidgetTable.refresh(); + } + //出现滚动条 + downPanel.doLayout(); + //控件列表选中某组件,触发表单中选中控件,选中事件又触发列表刷新,滚动条回到0 + //此处设置滚动条值为刷新前 + downPanel.getVerticalScrollBar().setValue(value); + } + } + } + @Override public String getViewTitle() { return Inter.getLocText("Form-Widget_Property_Table"); @@ -64,12 +115,15 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper @Override public void refreshDockingView() { + designer = this.getEditingFormDesigner(); removeAll(); if (designer == null) { clearDockingView(); return; } + + componentTree = new ComponentTree(designer); widgetPropertyTables = new ArrayList(); propertyTable = new WidgetPropertyTable(designer); designer.addDesignerEditListener(new WidgetPropertyDesignerAdapter(propertyTable)); @@ -81,30 +135,73 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper eventTable.setBorder(null); UIScrollPane esp = new UIScrollPane(eventTable); esp.setBorder(null); -// JTabbedPane tabbedPane = new JTabbedPane(); + + wsp = FRGUIPaneFactory.createBorderLayout_S_Pane(); + wsp.setBorder(null); + mobileWidgetTable = new MobileWidgetTable(designer); + mobileBodyWidgetTable = new MobileBodyWidgetTable(designer); + designer.addDesignerEditListener(new mobileWidgetDesignerAdapter()); + centerPane = FRGUIPaneFactory.createCardLayout_S_Pane(); + cardLayout = (CardLayout) centerPane.getLayout(); + centerPane.add(mobileWidgetTable,PARA); + centerPane.add(mobileBodyWidgetTable,BODY); + if(hasSelectParaPane(designer)){ + cardLayout.show(centerPane,PARA); + + } else { + cardLayout.show(centerPane,BODY); + } + downPanel = new UIScrollPane(centerPane); + downPanel.setBorder(new LineBorder(Color.gray)); + wsp.add(downPanel,BorderLayout.CENTER); + UITabbedPane tabbedPane = new UITabbedPane(); + tabbedPane.setOpaque(true); tabbedPane.setBorder(null); tabbedPane.setTabPlacement(SwingConstants.BOTTOM); tabbedPane.addTab(Inter.getLocText("Form-Properties"), psp); tabbedPane.addTab(Inter.getLocText("Form-Events"), esp); + tabbedPane.addTab(Inter.getLocText("FR-Widget_Mobile_Terminal"), wsp); WidgetPropertyUIProvider[] widgetAttrProviders = getExtraPropertyUIProviders(); - for (WidgetPropertyUIProvider widgetAttrProvider : widgetAttrProviders) { - AbstractPropertyTable propertyTable = widgetAttrProvider.createWidgetAttrTable(); - widgetPropertyTables.add(propertyTable); - designer.addDesignerEditListener(new WidgetPropertyDesignerAdapter(propertyTable)); - UIScrollPane uiScrollPane = new UIScrollPane(propertyTable); - uiScrollPane.setBorder(null); - tabbedPane.addTab(widgetAttrProvider.tableTitle(), uiScrollPane); + if (widgetAttrProviders.length == 0) { + UILabel upLabel = new UILabel(Inter.getLocText("FR-Widget_Mobile_Table"),SwingConstants.CENTER); + upLabel.setBorder(BorderFactory.createEmptyBorder(6,0,6,0)); + wsp.add(upLabel,BorderLayout.NORTH); + } else { + for (WidgetPropertyUIProvider widgetAttrProvider : widgetAttrProviders) { + AbstractPropertyTable propertyTable = widgetAttrProvider.createWidgetAttrTable(); + widgetPropertyTables.add(propertyTable); + designer.addDesignerEditListener(new WidgetPropertyDesignerAdapter(propertyTable)); + UIScrollPane uiScrollPane = new UIScrollPane(propertyTable); + uiScrollPane.setBorder(null); + wsp.add(uiScrollPane); + + } } add(tabbedPane, BorderLayout.CENTER); - propertyTable.initPropertyGroups(null); eventTable.refresh(); for (AbstractPropertyTable propertyTable : widgetPropertyTables) { propertyTable.initPropertyGroups(designer); } + isrefresh = false; + } + + // + /** + * 选中的组件是否在参数面板里 + * @param designer 设计器 + * @return 是则返回true + */ + public boolean hasSelectParaPane(FormDesigner designer){ + XCreator xCreator = designer.getSelectionModel().getSelection().getSelectedCreator(); + if(xCreator == null){ + xCreator = designer.getRootComponent(); + } + XLayoutContainer container = XCreatorUtils.getHotspotContainer(xCreator); + return xCreator.acceptType(XWParameterLayout.class) || container.acceptType(XWParameterLayout.class); } /** diff --git a/designer_form/src/com/fr/design/mainframe/widget/UITreeComboBox.java b/designer_form/src/com/fr/design/mainframe/widget/UITreeComboBox.java index 7f55ddeaf..0d7b224f6 100644 --- a/designer_form/src/com/fr/design/mainframe/widget/UITreeComboBox.java +++ b/designer_form/src/com/fr/design/mainframe/widget/UITreeComboBox.java @@ -15,6 +15,7 @@ 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.gui.icontainer.UIScrollPane; import com.fr.design.mainframe.ComponentTree; import com.sun.java.swing.plaf.motif.*; import com.sun.java.swing.plaf.windows.*; @@ -107,8 +108,9 @@ public class UITreeComboBox extends JComboBox{ class UITreeComboBoxRenderer extends DefaultListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){ - if(value != null){ - TreePath path = (TreePath)value; + if(tree != null && tree.getSelectedTreePath().length > 0){ + TreePath path = tree.getSelectedTreePath()[0]; + tree.setAndScrollSelectionPath(path); Object node = path.getLastPathComponent(); value = node; TreeCellRenderer r = tree.getCellRenderer(); @@ -127,18 +129,29 @@ public class UITreeComboBox extends JComboBox{ @Override public void fireCreatorModified(DesignerEvent evt) { - if (evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED || evt.getCreatorEventID() == DesignerEvent.CREATOR_PASTED) { + if (evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED) { TreePath[] paths = tree.getSelectedTreePath(); + if (tree != null && paths.length > 0) { + tree.setAndScrollSelectionPath(paths[0]); + setSelectedItem(paths[0]); + MenuSelectionManager.defaultManager().clearSelectedPath(); + } - if (paths.length == 1) { + } else if (evt.getCreatorEventID() == DesignerEvent.CREATOR_PASTED) { + tree.refreshUI(); + TreePath[] paths = tree.getSelectedTreePath(); + if (tree != null && paths.length > 0) { tree.setAndScrollSelectionPath(paths[0]); - } else { - tree.setSelectionPaths(paths); + setSelectedItem(paths[0]); + MenuSelectionManager.defaultManager().clearSelectedPath(); } - setSelectedItem(paths[0]); + } else if (evt.getCreatorEventID() == DesignerEvent.CREATOR_CUTED) { + tree.refreshUI(); + setSelectedItem(null); MenuSelectionManager.defaultManager().clearSelectedPath(); - } else { - return; + } else { + tree.refreshUI(); + repaint(); } } @@ -191,18 +204,17 @@ class TreePopup extends JPopupMenu implements ComboPopup{ 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); + scrollPane = new UIScrollPane(tree); + scrollPane.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 0)); add(scrollPane, BorderLayout.CENTER); } } - public void show(){ + public void show() { updatePopup(); show(comboBox, 0, comboBox.getHeight()); comboBox.getTree().requestFocus(); diff --git a/designer_form/src/com/fr/design/parameter/ParameterPropertyPane.java b/designer_form/src/com/fr/design/parameter/ParameterPropertyPane.java index 09799e37a..f093a1432 100644 --- a/designer_form/src/com/fr/design/parameter/ParameterPropertyPane.java +++ b/designer_form/src/com/fr/design/parameter/ParameterPropertyPane.java @@ -45,15 +45,15 @@ public class ParameterPropertyPane extends JPanel{ toolbarPane = new ParameterToolBarPane(); initParameterListener(); - + this.setLayout(new BorderLayout(0, 6)); - this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - this.add(toolbarPane, BorderLayout.NORTH); + this.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); + this.add(toolbarPane, BorderLayout.CENTER); } private void setEditor(FormDesigner editor) { this.remove(FormHierarchyTreePane.getInstance()); - this.add(FormHierarchyTreePane.getInstance(editor), BorderLayout.CENTER); + this.add(FormHierarchyTreePane.getInstance(editor), BorderLayout.NORTH); } private void initParameterListener() { diff --git a/designer_form/src/com/fr/design/parameter/ParameterToolBarPane.java b/designer_form/src/com/fr/design/parameter/ParameterToolBarPane.java index d495e9c06..aa7c11660 100644 --- a/designer_form/src/com/fr/design/parameter/ParameterToolBarPane.java +++ b/designer_form/src/com/fr/design/parameter/ParameterToolBarPane.java @@ -29,16 +29,18 @@ public class ParameterToolBarPane extends BasicBeanPane { private UIButton addAll; private UILabel label; private int breakid; - + private static final int GAP_H = 4; private static final int GAP_V = 6; private static final int GAP_BV = 4; - + private static final int BUTTON_HEIGHT = 20; + private static final int WIDTH = 225; + private static final int L_H = 18; public ParameterToolBarPane() { this.setLayout(new FlowParameterPaneLayout()); - + label = new UILabel() { private static final long serialVersionUID = 1L; @@ -47,12 +49,12 @@ public class ParameterToolBarPane extends BasicBeanPane { return new Dimension(super.getPreferredSize().width, 18); } }; - label.setText(Inter.getLocText("Following_parameters_are_not_generated")+":"); + label.setText(Inter.getLocText("FR-Following_parameters_are_not_generated")+":"); label.setHorizontalAlignment(SwingConstants.LEFT); label.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0)); this.add(label); - - addAll = new UIButton(Inter.getLocText("Add-all")); + + addAll = new UIButton(Inter.getLocText("FR-Designer_Add_all")); this.add(addAll); } @@ -61,7 +63,7 @@ public class ParameterToolBarPane extends BasicBeanPane { protected String title4PopupWindow() { return null; } - + public Parameter getTargetParameter(UIButton button) { int index = parameterSelectedLabellist.indexOf(button); if(index < 0 || index > parameterList.length - 1) { @@ -74,9 +76,9 @@ public class ParameterToolBarPane extends BasicBeanPane { public void populateBean(Parameter[] parameterArray) { parameterSelectedLabellist.clear(); this.removeAll(); - + this.add(label); - + if (parameterArray.length == 0) { this.setVisible(false); this.repaint(); @@ -84,14 +86,14 @@ public class ParameterToolBarPane extends BasicBeanPane { } else { this.setVisible(true); } - + parameterList = parameterArray; for (int i = 0; i < parameterList.length; i++) { UIButton parameterSelectedLabel = new UIButton(parameterList[i].getName()); parameterSelectedLabellist.add(parameterSelectedLabel); this.add(parameterSelectedLabel); } - + for(UIButton parameterSelectedLabel : parameterSelectedLabellist) { parameterSelectedLabel.addMouseListener(paraMouseListner); } @@ -128,10 +130,10 @@ public class ParameterToolBarPane extends BasicBeanPane { public Dimension preferredLayoutSize(Container parent) { int w = parent.getWidth(); - + layoutContainer(parent); - - int h= ((parameterSelectedLabellist.size() == 0) ? L_H : breakid * (20 + GAP_V) + GAP_BV + L_H + GAP_H + addAll.getPreferredSize().height); + + int h= ((parameterSelectedLabellist.size() == 0) ? L_H : breakid * (BUTTON_HEIGHT + GAP_V) + GAP_BV + L_H + GAP_H + addAll.getPreferredSize().height); return new Dimension(w, h); } @@ -140,12 +142,12 @@ public class ParameterToolBarPane extends BasicBeanPane { } public void layoutContainer(Container parent) { - int width = parent.getWidth(); + int width = parent.getWidth() == 0 ? WIDTH : parent.getWidth(); int x = 0; int y = L_H + GAP_H; - + label.setBounds(0, 0, width, L_H); - + breakid = 1; for (UIButton tab : parameterSelectedLabellist) { Dimension dim = tab.getPreferredSize(); @@ -154,12 +156,12 @@ public class ParameterToolBarPane extends BasicBeanPane { x = 0; y += (dim.height + GAP_V); } - + tab.setBounds(x, y, dim.width, dim.height); - + x += (dim.width + GAP_H); } - addAll.setBounds(0, y + GAP_V+ 20, width, addAll.getPreferredSize().height); + addAll.setBounds(0, y + GAP_V + BUTTON_HEIGHT, width, addAll.getPreferredSize().height); } }