From a6b2f9f9bccab3be14387cdbfac0e52cec2c8b8f Mon Sep 17 00:00:00 2001 From: richie Date: Mon, 23 Apr 2018 13:53:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E8=BE=91=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E6=BA=90=E4=BB=A3=E7=A0=81=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 3561 --- .gitignore | 9 +- build.10.0.gradle | 75 - build.9.0.gradle | 75 - build.applet.gradle | 75 - build.dev.gradle | 86 - build.master.gradle | 86 - build.master.gradle.bak | 86 - build.performance.gradle | 75 - build.performance.gradle.bak | 76 - build.release.gradle | 86 - build.release.gradle.bak | 85 - build.report-designer.gradle | 45 - designer-base/.gitignore | 5 + designer-base/build.base.gradle | 104 + {designer_base => designer-base}/clean.gradle | 0 .../aspectj/designerbase/AlphaFineReminder.aj | 0 .../designerbase/TemplateProcessTracker.aj | 0 .../common/inputevent/InputEventBaseOnOS.java | 0 .../src/com/fr/design/DesignModelAdapter.java | 149 + .../src/com/fr/design/DesignState.java | 73 + .../src/com/fr/design/DesignerEnvManager.java | 1793 ++ .../design/Exception/ValidationException.java | 11 + .../fr/design/ExtraDesignClassManager.java | 0 .../src/com/fr/design/RestartHelper.java | 0 .../actions/AllowAuthorityEditAction.java | 0 .../com/fr/design/actions/CheckBoxAction.java | 41 + .../actions/ExitAuthorityEditAction.java | 0 .../design/actions/HyperlinkPluginAction.java | 57 + .../fr/design/actions/JTemplateAction.java | 0 .../src/com/fr/design/actions/MenuAction.java | 46 + .../design/actions/TableDataSourceAction.java | 84 + .../actions/TemplateComponentAction.java | 0 .../TemplateComponentActionInterface.java | 0 .../actions/ToggleButtonUpdateAction.java | 15 + .../com/fr/design/actions/UndoableAction.java | 0 .../com/fr/design/actions/UpdateAction.java | 559 + .../design/actions/community/BBSAction.java | 0 .../design/actions/community/BugAction.java | 0 .../design/actions/community/NeedAction.java | 0 .../actions/community/QuestionAction.java | 0 .../design/actions/community/SignAction.java | 0 .../fr/design/actions/community/UpAction.java | 0 .../design/actions/community/VideoAction.java | 0 .../fr/design/actions/core/ActionFactory.java | 0 .../actions/core/WorkBookSupportable.java | 0 .../fr/design/actions/edit/CopyAction.java | 0 .../com/fr/design/actions/edit/CutAction.java | 41 + .../fr/design/actions/edit/PasteAction.java | 41 + .../fr/design/actions/edit/RedoAction.java | 59 + .../fr/design/actions/edit/UndoAction.java | 60 + .../file/CloseCurrentTemplateAction.java | 0 .../actions/file/CloseTemplateAction.java | 29 + .../fr/design/actions/file/EditEnvAction.java | 22 + .../actions/file/ExitDesignerAction.java | 32 + .../fr/design/actions/file/LocalePane.java | 0 .../actions/file/OpenRecentReportMenuDef.java | 78 + .../actions/file/OpenTemplateAction.java | 45 + .../design/actions/file/PreferenceAction.java | 49 + .../design/actions/file/PreferencePane.java | 679 + .../actions/file/SaveAsTemplateAction.java | 48 + .../actions/file/SaveTemplateAction.java | 0 .../design/actions/file/SwitchExistEnv.java | 129 + .../design/actions/file/WebPreviewUtils.java | 95 + .../fr/design/actions/help/AboutAction.java | 53 + .../fr/design/actions/help/AboutDialog.java | 100 + .../com/fr/design/actions/help/AboutPane.java | 262 + .../design/actions/help/FeedBackAction.java | 57 + .../fr/design/actions/help/FeedBackPane.java | 350 + .../fr/design/actions/help/ForumAction.java | 76 + .../design/actions/help/SupportQQAction.java | 63 + .../design/actions/help/SystemInfoPane.java | 69 + .../design/actions/help/TutorialAction.java | 101 + .../fr/design/actions/help/WebDemoAction.java | 46 + .../help/alphafine/AlphaFineAction.java | 0 .../alphafine/AlphaFineConfigManager.java | 0 .../help/alphafine/AlphaFineConfigPane.java | 0 .../help/alphafine/AlphaFineContext.java | 0 .../help/alphafine/AlphaFineListener.java | 0 .../actions/help/alphafine/RemindDialog.java | 0 .../actions/help/alphafine/RemindPane.java | 0 .../actions/server/ConnectionListAction.java | 0 .../actions/server/FunctionManagerAction.java | 86 + .../actions/server/GlobalParameterAction.java | 96 + .../actions/server/GlobalTableDataAction.java | 186 + .../actions/server/PlatformManagerAction.java | 44 + .../actions/server/PluginManagerAction.java | 0 .../actions/server/ProcedureListAction.java | 0 .../actions/tabledata/TableDataAction.java | 97 + .../src/com/fr/design/bbs/BBSLoginUtils.java | 0 .../com/fr/design/beans/BasicBeanPane.java | 41 + .../fr/design/beans/FurtherBasicBeanPane.java | 32 + .../src/com/fr/design/beans/GroupModel.java | 56 + .../design/beans/location/Absorptionline.java | 393 + .../fr/design/beans/location/MoveUtils.java | 557 + .../com/fr/design/border/UIRoundedBorder.java | 50 + .../com/fr/design/border/UITitledBorder.java | 30 + .../design/bridge/DesignToolbarProvider.java | 0 .../fr/design/cell/FloatElementsProvider.java | 15 + .../condition/CellHighlightAddMenuDef.java | 66 + .../ConditionAttrSingleConditionPane.java | 0 .../condition/ConditionAttributesPane.java | 133 + .../ContinuousTreeSelectionModel.java | 128 + .../condition/DSColumnLiteConditionPane.java | 0 .../DSColumnSimpleLiteConditionPane.java | 21 + .../condition/HighLightConditionAction.java | 0 .../design/condition/LiteConditionPane.java | 968 + .../condition/ObjectLiteConditionPane.java | 0 .../design/condition/SingleConditionPane.java | 54 + .../src/com/fr/design/constants/KeyWords.java | 0 .../fr/design/constants/LayoutConstants.java | 0 .../com/fr/design/constants/UIConstants.java | 0 .../design/data/BasicTableDataTreePane.java | 0 .../src/com/fr/design/data/DataCreatorUI.java | 0 .../design/data/DesignTableDataManager.java | 538 + .../fr/design/data/datapane/ChoosePane.java | 604 + .../datapane/ChoosePaneSupportFormula.java | 0 .../design/data/datapane/DSButtonGroup.java | 48 + .../design/data/datapane/DataBaseItems.java | 49 + .../design/data/datapane/EditOrNewLabel.java | 34 + .../datapane/FlashLookLabelMouseAdapter.java | 57 + .../datapane/GlobalTableDataComboBox.java | 22 + .../datapane/GlobalTreeTableDataDictPane.java | 21 + .../fr/design/data/datapane/RefreshLabel.java | 37 + .../data/datapane/ReportTableDataPane.java | 62 + .../data/datapane/TableDataComboBox.java | 150 + .../datapane/TableDataCreatorProducer.java | 0 .../datapane/TableDataNameObjectCreator.java | 178 + .../datapane/TableDataPaneController.java | 0 .../data/datapane/TableDataPaneListPane.java | 0 .../data/datapane/TableDataSourceOP.java | 240 + .../design/data/datapane/TableDataTree.java | 250 + .../datapane/TableDataTreeDragSource.java | 102 + .../data/datapane/TableDataTreePane.java | 0 .../data/datapane/TreeTableDataComboBox.java | 86 + .../data/datapane/TreeTableDataDictPane.java | 309 + .../data/datapane/VerticalChoosePane.java | 69 + .../connect/ConnectionComboBoxPanel.java | 0 .../datapane/connect/ConnectionListPane.java | 0 .../connect/ConnectionManagerPane.java | 0 .../datapane/connect/ConnectionShowPane.java | 0 .../connect/ConnectionTableProcedurePane.java | 217 + .../connect/DataConnectionAction.java | 67 + .../connect/DatabaseConnectionPane.java | 241 + .../connect/ItemEditableComboBoxPanel.java | 122 + .../data/datapane/connect/JDBCDefPane.java | 377 + .../data/datapane/connect/JNDIDefPane.java | 266 + .../datapane/preview/LoadedEventListener.java | 18 + .../data/datapane/preview/PreviewLabel.java | 37 + .../datapane/preview/PreviewTableModel.java | 212 + .../datapane/preview/PreviewTablePane.java | 485 + .../data/datapane/sqlpane/SQLEditPane.java | 0 .../tabledata/Prepare4DataSourceChange.java | 15 + .../tabledata/ResponseDataSourceChange.java | 25 + .../StoreProcedureWorkerListener.java | 14 + .../fr/design/data/tabledata/gui/CONTENT.txt | 14 + .../fr/design/data/tabledata/gui/EXPLAN1.txt | 6 + .../fr/design/data/tabledata/gui/EXPLAN2.txt | 17 + .../tabledatapane/AbstractTableDataPane.java | 15 + .../AutoStoreProcedureTableModel.java | 158 + .../tabledatapane/ClassNameSelectPane.java | 63 + .../tabledatapane/ClassTableDataPane.java | 177 + .../tabledatapane/CustomDictModel.java | 130 + .../tabledatapane/DBTableDataPane.java | 388 + .../tabledatapane/DecoratedTableDataPane.java | 0 .../EmbeddedTableDataDefinedPane.java | 321 + .../tabledatapane/EmbeddedTableDataPane.java | 355 + .../tabledatapane/EmbeddedTableModel.java | 103 + .../tabledatapane/FileTableDataPane.java | 1006 + .../FileTableDataSmallHeightPane.java | 19 + .../tabledatapane/FileTableDataSmallPane.java | 19 + .../tabledatapane/FormatExplanationPane.java | 0 .../GlobalMultiTDTableDataPane.java | 22 + .../GlobalTreeTableDataPane.java | 19 + .../tabledatapane/MaxMemRowCountPanel.java | 97 + .../tabledatapane/MultiTDTableDataPane.java | 405 + .../tabledatapane/OneListTableModel.java | 111 + .../tabledatapane/ProcedureDataPane.java | 380 + .../tabledatapane/ProcedureListPane.java | 0 .../tabledatapane/ProcedureManagerPane.java | 0 .../StoreProcedureParameterPane.java | 0 .../StoreProcedureTableModel.java | 139 + .../tabledatapane/TableDataManagerPane.java | 100 + .../tabledatapane/TreeTableDataPane.java | 45 + .../wrapper/AbstractTableDataWrapper.java | 138 + .../wrapper/ServerTableDataWrapper.java | 57 + .../wrapper/StoreProcedureDataWrapper.java | 311 + .../wrapper/StoreProcedureNameWrapper.java | 153 + .../tabledata/wrapper/TableDataFactory.java | 196 + .../tabledata/wrapper/TableDataWrapper.java | 68 + .../wrapper/TemplateTableDataWrapper.java | 37 + .../com/fr/design/designer/EditingState.java | 0 .../fr/design/designer/IntervalConstants.java | 0 .../fr/design/designer/TargetComponent.java | 179 + .../creator/CRPropertyDescriptor.java | 0 .../design/designer/properties/Decoder.java | 0 .../design/designer/properties/Encoder.java | 0 .../com/fr/design/dialog/AttrScrollPane.java | 0 .../src/com/fr/design/dialog/BasicDialog.java | 62 + .../src/com/fr/design/dialog/BasicPane.java | 442 + .../com/fr/design/dialog/BasicScrollPane.java | 211 + .../fr/design/dialog/DialogActionAdapter.java | 9 + .../design/dialog/DialogActionListener.java | 8 + .../fr/design/dialog/InformationWarnPane.java | 171 + .../com/fr/design/dialog/JWizardDialog.java | 368 + .../com/fr/design/dialog/JWizardPanel.java | 229 + .../com/fr/design/dialog/MultiTabPane.java | 88 + .../src/com/fr/design/dialog/UIDialog.java | 234 + .../dialog/mobile/MobileRadioCheckPane.java | 0 .../src/com/fr/design/dialog/package.html | 8 + .../editor/DoubleDeckValueEditorPane.java | 0 .../com/fr/design/editor/ValueEditorPane.java | 0 .../design/editor/ValueEditorPaneFactory.java | 507 + .../design/editor/editor/BooleanEditor.java | 113 + .../editor/editor/ColumnIndexEditor.java | 110 + .../editor/editor/ColumnNameEditor.java | 79 + .../design/editor/editor/ColumnRowEditor.java | 74 + .../editor/editor/ColumnRowGroupEditor.java | 0 .../editor/editor/ColumnSelectedEditor.java | 110 + .../design/editor/editor/ConstantsEditor.java | 23 + .../fr/design/editor/editor/CursorEditor.java | 42 + .../fr/design/editor/editor/DateEditor.java | 183 + .../fr/design/editor/editor/DoubleEditor.java | 46 + .../com/fr/design/editor/editor/Editor.java | 203 + .../design/editor/editor/EditorListener.java | 29 + .../fr/design/editor/editor/FloatEditor.java | 46 + .../design/editor/editor/FormulaEditor.java | 181 + .../design/editor/editor/IntegerEditor.java | 49 + .../fr/design/editor/editor/LongEditor.java | 41 + .../fr/design/editor/editor/NoneEditor.java | 54 + .../fr/design/editor/editor/NumberEditor.java | 128 + .../editor/editor/OldColumnIndexEditor.java | 163 + .../design/editor/editor/ParameterEditor.java | 64 + .../editor/editor/SpinnerIntegerEditor.java | 0 .../fr/design/editor/editor/TextEditor.java | 153 + .../editor/editor/WidgetNameEditor.java | 110 + .../design/editor/editor/XMLANameEditor.java | 117 + .../src/com/fr/design/event/ChangeEvent.java | 0 .../com/fr/design/event/ChangeListener.java | 0 .../fr/design/event/GlobalNameListener.java | 0 .../fr/design/event/GlobalNameObserver.java | 0 .../fr/design/event/TargetModifiedEvent.java | 19 + .../design/event/TargetModifiedListener.java | 16 + .../src/com/fr/design/event/UIObserver.java | 0 .../fr/design/event/UIObserverListener.java | 14 + .../src/com/fr/design/extra/After.java | 0 .../com/fr/design/extra/AppStoreBuilder.java | 0 .../fr/design/extra/LoginCheckContext.java | 30 + .../fr/design/extra/LoginCheckListener.java | 8 + .../fr/design/extra/LoginContextListener.java | 0 .../src/com/fr/design/extra/LoginDialog.java | 0 .../com/fr/design/extra/LoginWebBridge.java | 0 .../src/com/fr/design/extra/LoginWebPane.java | 0 .../extra/PluginAbstractLoadingViewPane.java | 0 .../design/extra/PluginAbstractViewPane.java | 0 .../com/fr/design/extra/PluginConstants.java | 15 + .../fr/design/extra/PluginControlPane.java | 0 .../design/extra/PluginDescriptionLabel.java | 0 .../com/fr/design/extra/PluginDetailPane.java | 0 .../fr/design/extra/PluginFromStorePane.java | 0 .../fr/design/extra/PluginInstalledPane.java | 0 .../com/fr/design/extra/PluginListPane.java | 0 .../fr/design/extra/PluginOperateUtils.java | 0 .../fr/design/extra/PluginSelectListener.java | 0 .../extra/PluginStatusCheckCompletePane.java | 0 .../src/com/fr/design/extra/PluginTask.java | 0 .../com/fr/design/extra/PluginUpdatePane.java | 0 .../src/com/fr/design/extra/PluginUtils.java | 0 .../com/fr/design/extra/PluginWebBridge.java | 0 .../com/fr/design/extra/PluginWebPane.java | 0 .../design/extra/PluginsReaderFromStore.java | 0 .../src/com/fr/design/extra/Process.java | 0 .../com/fr/design/extra/QQLoginDialog.java | 0 .../com/fr/design/extra/QQLoginWebPane.java | 0 .../src/com/fr/design/extra/ShopDialog.java | 0 .../com/fr/design/extra/ShopManagerPane.java | 0 .../com/fr/design/extra/ShopPaneConfig.java | 0 .../com/fr/design/extra/UserLoginContext.java | 0 .../com/fr/design/extra/WebViewDlgHelper.java | 0 .../src/com/fr/design/extra/exe/Command.java | 0 .../src/com/fr/design/extra/exe/Executor.java | 0 .../exe/GetPluginCategoriesExecutor.java | 0 .../extra/exe/GetPluginFromStoreExecutor.java | 0 .../extra/exe/GetPluginPrefixExecutor.java | 0 .../design/extra/exe/PluginLoginExecutor.java | 0 .../extra/exe/ReadUpdateOnlineExecutor.java | 0 .../extra/exe/SearchOnlineExecutor.java | 0 .../callback/AbstractPluginTaskCallback.java | 0 .../exe/callback/InstallFromDiskCallback.java | 0 .../exe/callback/InstallOnlineCallback.java | 0 .../design/extra/exe/callback/JSCallback.java | 0 .../design/extra/exe/callback/JSExecutor.java | 0 .../exe/callback/ModifyStatusCallback.java | 0 .../exe/callback/UninstallPluginCallback.java | 0 .../exe/callback/UpdateFromDiskCallback.java | 0 .../exe/callback/UpdateOnlineCallback.java | 0 .../extratask/AbstractExtraPluginTask.java | 0 .../extra/exe/extratask/ExtraPluginTask.java | 0 .../src/com/fr/design/extra/modal-dialog.css | 0 .../src/com/fr/design/extra/plugin.properties | 0 .../callback/UpdateOnlineCallback.java | 0 .../design/extra/ucenter/AbstractClient.java | 0 .../com/fr/design/extra/ucenter/Client.java | 0 .../fr/design/extra/ucenter/XMLHelper.java | 0 .../com/fr/design/file/FileOperations.java | 45 + .../file/FileToolbarStateChangeListener.java | 5 + .../design/file/HistoryTemplateListPane.java | 441 + .../fr/design/file/MutilTempalteTabPane.java | 957 + .../com/fr/design/file/NewTemplatePane.java | 164 + .../fr/design/file/SaveSomeTemplatePane.java | 0 .../com/fr/design/file/TemplateTreePane.java | 334 + .../fr/design/foldablepane/HeaderPane.java | 0 .../design/foldablepane/UIExpandablePane.java | 0 .../formula/AbstractNameAndDescription.java | 0 .../formula/CustomVariableResolver.java | 22 + .../formula/DefaultUIFormulaProcessor.java | 0 .../com/fr/design/formula/FormulaFactory.java | 0 .../com/fr/design/formula/FormulaPane.java | 1028 + .../FormulaPaneWhenReserveFormula.java | 0 .../fr/design/formula/FunctionConstants.java | 264 + .../com/fr/design/formula/FunctionDefNAD.java | 22 + .../com/fr/design/formula/FunctionGroup.java | 7 + .../design/formula/FunctionManagerPane.java | 226 + .../com/fr/design/formula/FunctionNAD.java | 42 + .../com/fr/design/formula/JavaEditorPane.java | 0 .../fr/design/formula/NameAndDescription.java | 10 + .../design/formula/NameAndFunctionList.java | 31 + .../formula/NameAndTypeAndFunctionList.java | 21 + .../fr/design/formula/SortFormulaPane.java | 83 + .../fr/design/formula/TinyFormulaPane.java | 0 .../src/com/fr/design/formula/UIFormula.java | 0 .../fr/design/formula/VariableResolver.java | 30 + .../formula/VariableResolverAdapter.java | 105 + .../design/fun/BackgroundQuickUIProvider.java | 0 .../fr/design/fun/BackgroundUIProvider.java | 0 .../fr/design/fun/CellAttributeProvider.java | 20 + .../design/fun/CellWidgetOptionProvider.java | 0 .../com/fr/design/fun/ConnectionProvider.java | 0 .../fr/design/fun/DBTableDataMenuHandler.java | 0 .../fr/design/fun/DesignerEnvProcessor.java | 0 .../fun/DesignerFrameUpButtonProvider.java | 0 .../fun/DesignerStartOpenFileProcessor.java | 0 .../com/fr/design/fun/ElementUIProvider.java | 0 .../fr/design/fun/ExportAttrTabProvider.java | 0 .../fr/design/fun/ExportToolBarProvider.java | 35 + .../fun/ExtraButtonToolBarProvider.java | 0 .../src/com/fr/design/fun/Feedback.java | 0 .../fun/FormElementCaseEditorProcessor.java | 0 .../fun/FormElementCaseEditorProvider.java | 0 .../design/fun/FormWidgetOptionProvider.java | 0 .../fr/design/fun/GlobalListenerProvider.java | 23 + .../com/fr/design/fun/GridUIProcessor.java | 0 .../com/fr/design/fun/HighlightProvider.java | 0 .../com/fr/design/fun/HyperlinkProvider.java | 21 + .../design/fun/IndentationUnitProcessor.java | 31 + .../design/fun/JavaScriptActionProvider.java | 21 + .../src/com/fr/design/fun/MenuHandler.java | 0 .../fun/ParameterWidgetOptionProvider.java | 0 .../fun/ParameterWindowEditorProcessor.java | 0 .../fr/design/fun/PresentKindProvider.java | 0 .../com/fr/design/fun/PreviewProvider.java | 0 .../fun/ServerTableDataDefineProvider.java | 0 .../src/com/fr/design/fun/SubmitProvider.java | 0 .../design/fun/TableDataCreatorProvider.java | 0 .../design/fun/TableDataDefineProvider.java | 0 .../fr/design/fun/TableDataPaneProcessor.java | 0 .../fr/design/fun/TitlePlaceProcessor.java | 0 .../fr/design/fun/ToolbarItemProvider.java | 0 .../com/fr/design/fun/UIFormulaProcessor.java | 0 .../fr/design/fun/VerifyDefineProvider.java | 0 .../fr/design/fun/WidgetDesignHandler.java | 0 .../design/fun/WidgetPropertyUIProvider.java | 0 .../AbstractBackgroundQuickUIProvider.java | 0 .../impl/AbstractBackgroundUIProvider.java | 0 .../impl/AbstractCellAttributeProvider.java | 20 + .../AbstractCellWidgetOptionProvider.java | 0 .../fun/impl/AbstractConnectionProvider.java | 0 .../impl/AbstractDBTableDataMenuHandler.java | 0 .../impl/AbstractDesignerEnvProcessor.java | 0 ...bstractDesignerStartOpenFileProcessor.java | 0 .../AbstractDsinFrameUpButtonProvider.java | 0 .../fun/impl/AbstractElementUIProvider.java | 0 .../impl/AbstractExportAttrTabProvider.java | 0 .../AbstractExtraButtonToolBarProvider.java | 0 ...bstractFormElementCaseEditorProcessor.java | 0 ...AbstractFormElementCaseEditorProvider.java | 0 .../AbstractFormWidgetOptionProvider.java | 0 .../impl/AbstractGlobalListenerProvider.java | 21 + .../fun/impl/AbstractGridUIProcessor.java | 0 .../fun/impl/AbstractHighlightProvider.java | 0 .../fun/impl/AbstractHyperlinkProvider.java | 21 + .../AbstractIndentationUnitProcessor.java | 47 + .../AbstractJavaScriptActionProvider.java | 29 + .../design/fun/impl/AbstractMenuHandler.java | 0 ...AbstractParameterWidgetOptionProvider.java | 0 ...bstractParameterWindowEditorProcessor.java | 0 .../fun/impl/AbstractPresentKindProvider.java | 0 .../fun/impl/AbstractPreviewProvider.java | 0 ...AbstractServerTableDataDefineProvider.java | 0 .../fun/impl/AbstractSubmitProvider.java | 0 .../fun/impl/AbstractTDPaneProcessor.java | 0 .../impl/AbstractTableDataDefineProvider.java | 0 .../fun/impl/AbstractTitleProcessor.java | 0 .../design/fun/impl/AbstractToolbarItem.java | 0 .../fun/impl/AbstractUIFormulaProcessor.java | 0 .../impl/AbstractVerifyDefineProvider.java | 0 .../fun/impl/AbstractWidgetDesignHandler.java | 0 .../AbstractWidgetPropertyUIProvider.java | 0 .../impl/GlobalListenerProviderManager.java | 0 .../fr/design/gui/HyperlinkFilterHelper.java | 0 .../src/com/fr/design/gui/UIDefaultTheme.java | 199 + .../src/com/fr/design/gui/UILookAndFeel.java | 202 + .../gui/autocomplete/AbstractCompletion.java | 153 + .../AbstractCompletionProvider.java | 245 + .../gui/autocomplete/AutoCompleteDemo.java | 0 .../autocomplete/AutoCompleteDescWindow.java | 591 + .../autocomplete/AutoCompletePopupWindow.java | 972 + .../gui/autocomplete/AutoCompletion.java | 1329 + .../AutoCompletionStyleContext.java | 120 + .../gui/autocomplete/BasicCompletion.java | 144 + .../design/gui/autocomplete/Completion.java | 153 + .../autocomplete/CompletionCellRenderer.java | 625 + .../gui/autocomplete/CompletionListModel.java | 88 + .../gui/autocomplete/CompletionProvider.java | 213 + .../autocomplete/CompletionProviderBase.java | 261 + .../gui/autocomplete/CompletionXMLParser.java | 446 + .../design/gui/autocomplete/CompletionXml.dtd | 30 + .../DefaultCompletionProvider.java | 374 + .../autocomplete/DelegatingCellRenderer.java | 94 + .../gui/autocomplete/DescWindowCallback.java | 35 + .../fr/design/gui/autocomplete/EmptyIcon.java | 49 + .../gui/autocomplete/ExternalURLHandler.java | 46 + .../design/gui/autocomplete/FastListUI.java | 189 + .../gui/autocomplete/FunctionCompletion.java | 322 + .../LanguageAwareCompletionProvider.java | 429 + .../gui/autocomplete/LinkRedirector.java | 20 + .../gui/autocomplete/MarkupTagCompletion.java | 240 + .../autocomplete/OutlineHighlightPainter.java | 143 + .../ParameterChoicesProvider.java | 40 + .../autocomplete/ParameterizedCompletion.java | 172 + .../ParameterizedCompletionChoicesWindow.java | 301 + .../ParameterizedCompletionContext.java | 1190 + ...meterizedCompletionDescriptionToolTip.java | 204 + .../ParameterizedCompletionInsertionInfo.java | 251 + .../gui/autocomplete/ShorthandCompletion.java | 117 + .../fr/design/gui/autocomplete/SizeGrip.java | 256 + .../SortByRelevanceComparator.java | 33 + .../gui/autocomplete/TemplateCompletion.java | 363 + .../gui/autocomplete/TemplatePiece.java | 86 + .../fr/design/gui/autocomplete/TipUtil.java | 179 + .../com/fr/design/gui/autocomplete/Util.java | 323 + .../gui/autocomplete/VariableCompletion.java | 196 + .../fr/design/gui/autocomplete/arrow_left.png | Bin .../design/gui/autocomplete/arrow_right.png | Bin .../design/gui/autocomplete/bullet_black.png | Bin .../design/gui/autocomplete/osx_sizegrip.png | Bin .../fr/design/gui/borders/UIFrameBorder.java | 583 + .../gui/borders/UIInternalFrameBorder.java | 592 + .../gui/borders/UITableHeaderBorder.java | 66 + .../borders/UITableHeaderRolloverBorder.java | 37 + .../gui/borders/UITableScrollPaneBorder.java | 37 + .../design/gui/borders/UITextFieldBorder.java | 61 + .../gui/chart/BaseChartPropertyPane.java | 28 + .../gui/chart/ChartEditPaneProvider.java | 0 .../gui/chart/MiddleChartComponent.java | 25 + .../design/gui/chart/MiddleChartDialog.java | 28 + .../design/gui/columnrow/ColumnRowPane.java | 260 + .../gui/columnrow/ColumnRowVerticalPane.java | 43 + .../controlpane/AbstractNameableCreator.java | 117 + .../design/gui/controlpane/ControlPane.java | 38 + .../design/gui/controlpane/JControlPane.java | 212 + .../gui/controlpane/JListControlPane.java | 0 .../gui/controlpane/NameObjectCreator.java | 0 .../gui/controlpane/NameableCreator.java | 29 + .../gui/controlpane/NameableSelfCreator.java | 0 .../gui/controlpane/ObjectJControlPane.java | 76 + .../gui/controlpane/ObjectUIControlPane.java | 0 .../controlpane/ShortCut4JControlPane.java | 16 + .../design/gui/controlpane/UIControlPane.java | 0 .../gui/controlpane/UIListControlPane.java | 0 .../UINameableListCellRenderer.java | 0 .../gui/controlpane/UnrepeatedNameHelper.java | 0 .../design/gui/core/CustomWidgetOption.java | 48 + .../gui/core/UIFurtherTabComponent.java | 24 + .../design/gui/core/UISelectedComponent.java | 32 + .../fr/design/gui/core/UITabComponent.java | 35 + .../gui/core/UserDefinedWidgetOption.java | 36 + .../fr/design/gui/core/WidgetConstants.java | 78 + .../com/fr/design/gui/core/WidgetOption.java | 228 + .../design/gui/core/WidgetOptionFactory.java | 17 + .../design/gui/date/CalendarNumberField.java | 108 + .../com/fr/design/gui/date/JDateDocument.java | 329 + .../gui/date/SingleObjectComboBoxModel.java | 72 + .../fr/design/gui/date/UICalendarPanel.java | 772 + .../com/fr/design/gui/date/UIDatePicker.java | 289 + .../com/fr/design/gui/date/UIDayLabel.java | 49 + .../com/fr/design/gui/demo/ComboBoxDemo.java | 176 + .../src/com/fr/design/gui/demo/LabelDemo.java | 62 + .../src/com/fr/design/gui/demo/ListDemo.java | 42 + .../fr/design/gui/demo/LoadingPaneDemo.java | 55 + .../design/gui/demo/MultiLineTooltipDemo.java | 34 + .../design/gui/demo/SwingComponentsDemo.java | 52 + .../gui/frpane/AbstractAttrNoScrollPane.java | 162 + .../gui/frpane/AttributeChangeListener.java | 7 + .../design/gui/frpane/BaseHyperlinkGroup.java | 23 + .../design/gui/frpane/CommitTabbedPane.java | 538 + .../gui/frpane/EditingStringListPane.java | 208 + .../design/gui/frpane/HyperlinkGroupPane.java | 132 + .../HyperlinkGroupPaneActionProvider.java | 0 .../design/gui/frpane/HyperlinkGroupType.java | 18 + .../fr/design/gui/frpane/ImgChoosePane.java | 122 + .../design/gui/frpane/JTreeAutoBuildPane.java | 0 .../design/gui/frpane/JTreeControlPane.java | 270 + .../fr/design/gui/frpane/LimitedDocument.java | 46 + .../design/gui/frpane/ListenerUpdatePane.java | 53 + .../design/gui/frpane/LoadingBasicPane.java | 90 + .../gui/frpane/LoadingBasicPaneTest.java | 41 + .../gui/frpane/ObjectProperiesPane.java | 164 + .../fr/design/gui/frpane/RegFieldPane.java | 0 .../src/com/fr/design/gui/frpane/RegPane.java | 0 .../frpane/ReportletParameterViewPane.java | 146 + .../gui/frpane/TemplateParameterPane.java | 89 + .../fr/design/gui/frpane/TreeSettingPane.java | 270 + .../design/gui/frpane/UIAdvancedTextPane.java | 199 + .../gui/frpane/UIBasicOptionPaneUI.java | 266 + .../design/gui/frpane/UIBubbleFloatPane.java | 318 + .../fr/design/gui/frpane/UIComboBoxPane.java | 0 .../gui/frpane/UICorrelationComboBoxPane.java | 414 + .../design/gui/frpane/UICorrelationPane.java | 409 + .../fr/design/gui/frpane/UIExtensionPane.java | 0 .../design/gui/frpane/UINumberDragPane.java | 140 + .../design/gui/frpane/UINumberSlidePane.java | 137 + .../com/fr/design/gui/frpane/UIRadioPane.java | 107 + .../fr/design/gui/frpane/UITabbedPane.java | 122 + .../fr/design/gui/frpane/UITabbedPaneUI.java | 0 .../com/fr/design/gui/frpane/UITextPane.java | 93 + .../fr/design/gui/frpane/UITitlePanel.java | 46 + .../fr/design/gui/frpane/UnitInputPane.java | 170 + .../layer/config/LayerDataConfigPane.java | 0 .../layer/config/LayerDataControlPane.java | 0 .../config/LayerDependenceSettingPane.java | 0 .../design/gui/ibutton/FiveButtonLayout.java | 61 + .../design/gui/ibutton/SpecialUIButton.java | 30 + .../design/gui/ibutton/UIBasicButtonUI.java | 346 + .../com/fr/design/gui/ibutton/UIButton.java | 365 + .../fr/design/gui/ibutton/UIButtonBorder.java | 84 + .../fr/design/gui/ibutton/UIButtonGroup.java | 449 + .../com/fr/design/gui/ibutton/UIButtonUI.java | 171 + .../fr/design/gui/ibutton/UIColorButton.java | 251 + .../gui/ibutton/UICombinationButton.java | 143 + .../fr/design/gui/ibutton/UIHeadGroup.java | 182 + .../design/gui/ibutton/UIPasswordField.java | 0 .../design/gui/ibutton/UIPreviewButton.java | 0 .../fr/design/gui/ibutton/UIRadioButton.java | 46 + .../design/gui/ibutton/UIRadioButtonIcon.java | 328 + .../gui/ibutton/UIRadioButtonMenuItemUI.java | 67 + .../design/gui/ibutton/UIRadioButtonUI.java | 112 + .../fr/design/gui/ibutton/UISliderButton.java | 0 .../design/gui/ibutton/UISliderButtonUI.java | 0 .../fr/design/gui/ibutton/UITabButton.java | 181 + .../com/fr/design/gui/ibutton/UITabGroup.java | 75 + .../fr/design/gui/ibutton/UIToggleButton.java | 223 + .../gui/ibutton/UIToolButtonBorder.java | 104 + .../fr/design/gui/icheckbox/UICheckBox.java | 201 + .../design/gui/icheckbox/UICheckBoxIcon.java | 314 + .../fr/design/gui/icheckbox/UICheckBoxUI.java | 88 + .../gui/icombobox/AlignmentComboBox.java | 83 + .../design/gui/icombobox/ComboCheckBox.java | 195 + .../gui/icombobox/DictionaryComboBox.java | 61 + .../gui/icombobox/DictionaryConstants.java | 86 + .../gui/icombobox/ExtendedComboBox.java | 118 + .../gui/icombobox/ExtendedComboBoxTest.java | 34 + .../design/gui/icombobox/FRTreeComboBox.java | 621 + .../design/gui/icombobox/FilterComboBox.java | 128 + .../icombobox/FilterableComboBoxModel.java | 103 + .../gui/icombobox/FixedHeightComboBox.java | 103 + .../gui/icombobox/FunctionComboBox.java | 69 + .../fr/design/gui/icombobox/IntComboBox.java | 51 + .../fr/design/gui/icombobox/LazyComboBox.java | 214 + .../gui/icombobox/LazyComboBoxTest.java | 62 + .../fr/design/gui/icombobox/LineComboBox.java | 148 + .../gui/icombobox/ParameterComboBox.java | 87 + .../gui/icombobox/SortOrderComboBox.java | 73 + .../gui/icombobox/TextFontComboBox.java | 0 .../design/gui/icombobox/TreeComboBoxUI.java | 95 + .../gui/icombobox/UIBasicComboBoxEditor.java | 107 + .../gui/icombobox/UIBasicComboBoxUI.java | 347 + .../fr/design/gui/icombobox/UIComboBox.java | 214 + .../gui/icombobox/UIComboBoxButton.java | 278 + .../gui/icombobox/UIComboBoxEditor.java | 88 + .../gui/icombobox/UIComboBoxRenderer.java | 42 + .../fr/design/gui/icombobox/UIComboBoxUI.java | 273 + .../gui/icombobox/UIDictionaryComboBox.java | 44 + .../design/gui/icombobox/filter/Filter.java | 8 + .../icombobox/filter/LastStartWithFilter.java | 18 + .../icombobox/filter/StartsWithFilter.java | 11 + .../icombotree/CheckBoxTreeCellRenderer.java | 86 + .../icombotree/CheckBoxTreeLabel.java | 73 + .../icombotree/CheckBoxTreeNode.java | 88 + .../CheckBoxTreeNodeSelectionListener.java | 65 + .../icontainer/UIEastResizableContainer.java | 0 .../icontainer/UIModeControlContainer.java | 458 + .../gui/icontainer/UIResizableContainer.java | 547 + .../design/gui/icontainer/UIScrollPane.java | 49 + .../gui/icontainer/UIScrollPaneBorder.java | 33 + .../design/gui/icontainer/UIScrollPaneUI.java | 58 + .../icontainer/UITableScrollPaneBorder.java | 38 + .../gui/icontainer/UIVerticalScrollPane.java | 0 .../com/fr/design/gui/ilable/ActionLabel.java | 87 + .../design/gui/ilable/BoldFontTextLabel.java | 36 + .../fr/design/gui/ilable/FRExplainLabel.java | 24 + .../fr/design/gui/ilable/MultilineLabel.java | 75 + .../src/com/fr/design/gui/ilable/UILabel.java | 66 + .../fr/design/gui/ilist/ArrayListModel.java | 24 + .../com/fr/design/gui/ilist/CheckBoxList.java | 300 + .../gui/ilist/DefaultListCellEditor.java | 50 + .../com/fr/design/gui/ilist/JNameEdList.java | 395 + .../fr/design/gui/ilist/ListCellEditor.java | 8 + .../fr/design/gui/ilist/ListModelElement.java | 0 .../gui/ilist/ModNameActionListener.java | 11 + .../com/fr/design/gui/ilist/QuickList.java | 41 + .../fr/design/gui/ilist/TableViewList.java | 276 + .../src/com/fr/design/gui/ilist/UIList.java | 86 + .../com/fr/design/gui/ilist/UINameEdList.java | 0 .../design/gui/imenu/UIBasicMenuItemUI.java | 1095 + .../fr/design/gui/imenu/UIBasicMenuUI.java | 689 + .../design/gui/imenu/UICheckBoxMenuItem.java | 29 + .../com/fr/design/gui/imenu/UIHeadMenu.java | 0 .../com/fr/design/gui/imenu/UIListPopup.java | 0 .../src/com/fr/design/gui/imenu/UIMenu.java | 343 + .../com/fr/design/gui/imenu/UIMenuBar.java | 29 + .../com/fr/design/gui/imenu/UIMenuBarUI.java | 33 + .../design/gui/imenu/UIMenuEastAttrItem.java | 0 .../fr/design/gui/imenu/UIMenuHighLight.java | 25 + .../com/fr/design/gui/imenu/UIMenuItem.java | 107 + .../src/com/fr/design/gui/imenu/UIMenuUI.java | 83 + .../design/gui/imenu/UIPopupEastAttrMenu.java | 0 .../com/fr/design/gui/imenu/UIPopupMenu.java | 48 + .../design/gui/imenu/UIPopupMenuBorder.java | 62 + .../gui/imenu/UIPopupMenuSeparatorUI.java | 29 + .../com/fr/design/gui/imenu/UIScrollMenu.java | 0 .../fr/design/gui/imenu/UIScrollMenuDemo.java | 0 .../design/gui/imenu/UIScrollPopUpMenu.java | 0 .../gui/imenutable/UIMenuNameableCreator.java | 69 + .../fr/design/gui/imenutable/UIMenuTable.java | 232 + .../gui/imenutable/UIMenuTableDataModel.java | 119 + .../design/gui/imenutable/UIMenuTableUI.java | 124 + .../gui/ipasswordfield/UIPassWordField.java | 72 + .../fr/design/gui/ipoppane/PopupHider.java | 5 + .../gui/iprogressbar/AutoProgressBar.java | 50 + .../gui/iprogressbar/FRProgressBar.java | 43 + .../gui/iprogressbar/MonitorCancelWork.java | 12 + .../gui/iprogressbar/UIProgressBarBorder.java | 67 + .../gui/iprogressbar/UIProgressBarUI.java | 409 + .../gui/iscrollbar/UIBasicScrollBarUI.java | 348 + .../fr/design/gui/iscrollbar/UISBChooser.java | 452 + .../fr/design/gui/iscrollbar/UIScrollBar.java | 50 + .../design/gui/iscrollbar/UIScrollBarUI.java | 1332 + .../design/gui/iscrollbar/UIScrollButton.java | 229 + .../com/fr/design/gui/islider/UISlider.java | 37 + .../design/gui/ispinner/ColumnRowSpinner.java | 0 .../design/gui/ispinner/UIBasicSpinner.java | 86 + .../com/fr/design/gui/ispinner/UISpinner.java | 361 + .../gui/ispinner/UISpinnerButtonUI.java | 146 + .../fr/design/gui/ispinner/UISpinnerUI.java | 277 + .../design/gui/ispinner/UpperCaseSpinner.java | 132 + .../isplitpanedivider/UISplitPaneDivider.java | 275 + .../gui/isplitpanedivider/UISplitPaneUI.java | 33 + .../gui/itable/AbstractPropertyTable.java | 0 .../fr/design/gui/itable/GroupRenderer.java | 0 .../fr/design/gui/itable/HeaderRenderer.java | 0 .../fr/design/gui/itable/PropertyGroup.java | 0 .../fr/design/gui/itable/SortableJTable.java | 10 + .../com/fr/design/gui/itable/TableSorter.java | 496 + .../fr/design/gui/itable/UIBasicTableUI.java | 40 + .../design/gui/itable/UIComponentTable.java | 35 + .../gui/itable/UIDefaultTableCellEditor.java | 0 .../fr/design/gui/itable/UISelectTable.java | 108 + .../src/com/fr/design/gui/itable/UITable.java | 388 + .../gui/itable/UITableComponentModel.java | 23 + .../design/gui/itable/UITableDataModel.java | 146 + .../fr/design/gui/itable/UITableEditor.java | 0 .../design/gui/itable/UITableNoOptionUI.java | 25 + .../com/fr/design/gui/itable/UITableUI.java | 225 + .../gui/itableeditorpane/ActionStyle.java | 16 + .../itableeditorpane/ParameterTableModel.java | 263 + .../UIArrayFormulaTableModel.java | 0 .../itableeditorpane/UIArrayTableModel.java | 74 + .../itableeditorpane/UITableEditAction.java | 8 + .../itableeditorpane/UITableEditorLoader.java | 12 + .../itableeditorpane/UITableEditorPane.java | 156 + .../itableeditorpane/UITableModelAdapter.java | 330 + .../gui/itabpane/TitleChangeListener.java | 6 + .../design/gui/itabpane/UITabPaneCreator.java | 44 + .../gui/itabpane/UITabsHeaderIconPane.java | 249 + .../gui/itextarea/DescriptionTextArea.java | 27 + .../gui/itextarea/FRExplainTextArea.java | 66 + .../fr/design/gui/itextarea/UITextArea.java | 137 + .../fr/design/gui/itextarea/UITextAreaUI.java | 43 + .../gui/itextfield/AutoCompletionDemo.java | 0 .../gui/itextfield/CompletionFilter.java | 0 .../itextfield/DefaultCompletionFilter.java | 0 .../design/gui/itextfield/EditTextField.java | 55 + .../design/gui/itextfield/FRGraphics2D.java | 397 + .../gui/itextfield/PlaceholderTextField.java | 0 .../fr/design/gui/itextfield/TextFieldUI.java | 53 + .../gui/itextfield/UIAutoCompletionField.java | 0 .../gui/itextfield/UIGridTextField.java | 0 .../design/gui/itextfield/UINumberField.java | 247 + .../gui/itextfield/UISearchTextField.java | 296 + .../fr/design/gui/itextfield/UITextField.java | 228 + .../design/gui/itextfield/UITextFieldUI.java | 74 + .../design/gui/itoolbar/UILargeToolbar.java | 18 + .../design/gui/itoolbar/UIToolBarBorder.java | 106 + .../gui/itoolbar/UIToolBarSeparatorUI.java | 98 + .../fr/design/gui/itoolbar/UIToolBarUI.java | 112 + .../com/fr/design/gui/itoolbar/UIToolbar.java | 34 + .../design/gui/itooltip/MultiLineToolTip.java | 0 .../gui/itooltip/MultiLineToolTipUI.java | 0 .../com/fr/design/gui/itooltip/UIToolTip.java | 88 + .../design/gui/itooltip/UIToolTipBorder.java | 44 + .../fr/design/gui/itooltip/UIToolTipUI.java | 118 + .../src/com/fr/design/gui/itree/UITreeUI.java | 40 + .../gui/itree/checkboxtree/CheckBoxTree.java | 453 + .../CheckBoxTreeCellRenderer.java | 134 + .../CheckBoxTreeSelectionModel.java | 483 + .../gui/itree/checkboxtree/NullLabel.java | 86 + .../gui/itree/checkboxtree/NullPanel.java | 79 + .../checkboxtree/NullTristateCheckBox.java | 76 + .../itree/checkboxtree/TristateCheckBox.java | 307 + .../gui/itree/filetree/AbstractFileTree.java | 105 + .../gui/itree/filetree/ClassFileTree.java | 63 + .../gui/itree/filetree/EnvFileTree.java | 362 + .../gui/itree/filetree/FileComparator.java | 23 + .../gui/itree/filetree/FileDirectoryNode.java | 56 + .../itree/filetree/FileNodeComparator.java | 78 + .../gui/itree/filetree/FileTreeIcon.java | 274 + .../design/gui/itree/filetree/JFileTree.java | 324 + .../gui/itree/filetree/ReportletPane.java | 136 + .../design/gui/itree/filetree/RootFile.java | 28 + .../gui/itree/filetree/TemplateFileTree.java | 99 + .../ExpandMutableTreeNode.java | 78 + .../refreshabletree/RefreshableJTree.java | 283 + .../refreshabletree/RefreshableJTreeTest.java | 85 + .../refreshabletree/TreeDataCardPane.java | 55 + .../itree/refreshabletree/TreeNodePane.java | 46 + .../itree/refreshabletree/TreeRootPane.java | 85 + .../itree/refreshabletree/UserObjectOP.java | 33 + .../UserObjectRefreshJTree.java | 168 + .../loader/ChildrenLoaderFactory.java | 17 + .../loader/ChildrenNodesLoader.java | 29 + .../gui/style/AbstractBasicStylePane.java | 29 + .../fr/design/gui/style/AlignmentPane.java | 433 + .../gui/style/BackgroundNoImagePane.java | 45 + .../fr/design/gui/style/BackgroundPane.java | 0 .../gui/style/BackgroundSpecialPane.java | 71 + .../com/fr/design/gui/style/BorderPane.java | 255 + .../DefaultIndentationUnitProcessor.java | 36 + .../com/fr/design/gui/style/FRFontPane.java | 418 + .../com/fr/design/gui/style/FormatPane.java | 0 .../design/gui/style/FormatePaneNumField.java | 44 + .../fr/design/gui/style/NumberDragBar.java | 226 + .../design/gui/syntax/io/DocumentReader.java | 218 + .../design/gui/syntax/io/UnicodeReader.java | 270 + .../design/gui/syntax/io/UnicodeWriter.java | 258 + .../com/fr/design/gui/syntax/io/package.html | 5 + .../gui/syntax/print/RPrintUtilities.java | 530 + .../fr/design/gui/syntax/print/package.html | 5 + .../AbstractJFlexCTokenMaker.java | 243 + .../AbstractJFlexTokenMaker.java | 52 + .../rsyntaxtextarea/AbstractTokenMaker.java | 67 + .../AbstractTokenMakerFactory.java | 134 + .../rsyntaxtextarea/ActiveLineRangeEvent.java | 0 .../ActiveLineRangeListener.java | 0 .../ChangeableColorHighlightPainter.java | 67 + .../rsyntaxtextarea/CodeTemplateManager.java | 389 + .../DefaultOccurrenceMarker.java | 55 + .../rsyntaxtextarea/DefaultTokenFactory.java | 137 + .../DefaultTokenMakerFactory.java | 75 + .../rsyntaxtextarea/DefaultTokenPainter.java | 268 + .../ui/rsyntaxtextarea/DocumentRange.java | 153 + .../syntax/ui/rsyntaxtextarea/ErrorStrip.java | 843 + .../ui/rsyntaxtextarea/ErrorStrip.properties | 3 + .../rsyntaxtextarea/ErrorStrip_ar.properties | 3 + .../rsyntaxtextarea/ErrorStrip_de.properties | 3 + .../rsyntaxtextarea/ErrorStrip_es.properties | 3 + .../rsyntaxtextarea/ErrorStrip_fr.properties | 3 + .../rsyntaxtextarea/ErrorStrip_hu.properties | 3 + .../rsyntaxtextarea/ErrorStrip_in.properties | 3 + .../rsyntaxtextarea/ErrorStrip_it.properties | 3 + .../rsyntaxtextarea/ErrorStrip_ja.properties | 3 + .../rsyntaxtextarea/ErrorStrip_ko.properties | 3 + .../rsyntaxtextarea/ErrorStrip_nl.properties | 3 + .../rsyntaxtextarea/ErrorStrip_pl.properties | 3 + .../ErrorStrip_pt_BR.properties | 3 + .../rsyntaxtextarea/ErrorStrip_ru.properties | 3 + .../rsyntaxtextarea/ErrorStrip_tr.properties | 3 + .../ErrorStrip_zh_CN.properties | 3 + .../ErrorStrip_zh_TW.properties | 3 + .../ui/rsyntaxtextarea/FileFileLocation.java | 121 + .../ui/rsyntaxtextarea/FileLocation.java | 141 + .../FoldingAwareIconRowHeader.java | 248 + .../ui/rsyntaxtextarea/LinkGenerator.java | 50 + .../rsyntaxtextarea/LinkGeneratorResult.java | 53 + .../MarkOccurrencesHighlightPainter.java | 139 + .../MarkOccurrencesSupport.java | 316 + .../ui/rsyntaxtextarea/OccurrenceMarker.java | 38 + .../ui/rsyntaxtextarea/ParserManager.java | 745 + .../rsyntaxtextarea/PopupWindowDecorator.java | 68 + .../syntax/ui/rsyntaxtextarea/RSTAView.java | 62 + .../ui/rsyntaxtextarea/RSyntaxDocument.java | 639 + .../ui/rsyntaxtextarea/RSyntaxTextArea.java | 3128 ++ .../RSyntaxTextArea.properties | 14 + .../RSyntaxTextAreaDefaultInputMap.java | 77 + .../RSyntaxTextAreaEditorKit.java | 1943 ++ .../RSyntaxTextAreaHighlighter.java | 275 + .../ui/rsyntaxtextarea/RSyntaxTextAreaUI.java | 265 + .../RSyntaxTextArea_ar.properties | 14 + .../RSyntaxTextArea_de.properties | 14 + .../RSyntaxTextArea_es.properties | 14 + .../RSyntaxTextArea_fr.properties | 14 + .../RSyntaxTextArea_hu.properties | 14 + .../RSyntaxTextArea_in.properties | 14 + .../RSyntaxTextArea_it.properties | 14 + .../RSyntaxTextArea_ja.properties | 14 + .../RSyntaxTextArea_ko.properties | 14 + .../RSyntaxTextArea_nl.properties | 14 + .../RSyntaxTextArea_pl.properties | 15 + .../RSyntaxTextArea_pt_BR.properties | 14 + .../RSyntaxTextArea_ru.properties | 14 + .../RSyntaxTextArea_tr.properties | 14 + .../RSyntaxTextArea_zh_CN.properties | 14 + .../RSyntaxTextArea_zh_TW.properties | 14 + .../ui/rsyntaxtextarea/RSyntaxUtilities.java | 1310 + .../syntax/ui/rsyntaxtextarea/RTfToText.java | 229 + .../ui/rsyntaxtextarea/RtfGenerator.java | 479 + .../ui/rsyntaxtextarea/RtfTransferable.java | 91 + .../SelectRegionLinkGeneratorResult.java | 59 + .../SquiggleUnderlineHighlightPainter.java | 120 + .../gui/syntax/ui/rsyntaxtextarea/Style.java | 196 + .../ui/rsyntaxtextarea/SyntaxConstants.java | 264 + .../ui/rsyntaxtextarea/SyntaxScheme.java | 715 + .../syntax/ui/rsyntaxtextarea/SyntaxView.java | 1008 + .../ui/rsyntaxtextarea/TextEditorPane.java | 711 + .../gui/syntax/ui/rsyntaxtextarea/Theme.java | 847 + .../gui/syntax/ui/rsyntaxtextarea/Token.java | 566 + .../ui/rsyntaxtextarea/TokenFactory.java | 67 + .../syntax/ui/rsyntaxtextarea/TokenImpl.java | 836 + .../ui/rsyntaxtextarea/TokenIterator.java | 91 + .../syntax/ui/rsyntaxtextarea/TokenMaker.java | 170 + .../ui/rsyntaxtextarea/TokenMakerBase.java | 300 + .../ui/rsyntaxtextarea/TokenMakerFactory.java | 124 + .../syntax/ui/rsyntaxtextarea/TokenMap.java | 277 + .../ui/rsyntaxtextarea/TokenOrientedView.java | 61 + .../ui/rsyntaxtextarea/TokenPainter.java | 96 + .../syntax/ui/rsyntaxtextarea/TokenTypes.java | 85 + .../syntax/ui/rsyntaxtextarea/TokenUtils.java | 166 + .../ui/rsyntaxtextarea/URLFileLocation.java | 160 + .../VisibleWhitespaceTokenPainter.java | 191 + .../ui/rsyntaxtextarea/WrappedSyntaxView.java | 1418 + .../rsyntaxtextarea/WrappedSyntaxView2.java | 157 + .../rsyntaxtextarea/XmlOccurrenceMarker.java | 187 + .../focusabletip/FocusableTip.java | 346 + .../focusabletip/FocusableTip.properties | 1 + .../focusabletip/FocusableTip_ar.properties | 1 + .../focusabletip/FocusableTip_de.properties | 0 .../focusabletip/FocusableTip_es.properties | 1 + .../focusabletip/FocusableTip_fr.properties | 1 + .../focusabletip/FocusableTip_hu.properties | 1 + .../focusabletip/FocusableTip_in.properties | 1 + .../focusabletip/FocusableTip_it.properties | 1 + .../focusabletip/FocusableTip_ja.properties | 1 + .../focusabletip/FocusableTip_ko.properties | 1 + .../focusabletip/FocusableTip_nl.properties | 1 + .../focusabletip/FocusableTip_pl.properties | 1 + .../FocusableTip_pt_BR.properties | 1 + .../focusabletip/FocusableTip_ru.properties | 1 + .../focusabletip/FocusableTip_tr.properties | 1 + .../FocusableTip_zh_CN.properties | 1 + .../FocusableTip_zh_TW.properties | 1 + .../focusabletip/SizeGrip.java | 255 + .../rsyntaxtextarea/focusabletip/TipUtil.java | 235 + .../focusabletip/TipWindow.java | 341 + .../focusabletip/osx_sizegrip.png | Bin .../rsyntaxtextarea/focusabletip/package.html | 5 + .../folding/CurlyFoldParser.java | 317 + .../ui/rsyntaxtextarea/folding/Fold.java | 567 + .../folding/FoldCollapser.java | 106 + .../rsyntaxtextarea/folding/FoldManager.java | 707 + .../rsyntaxtextarea/folding/FoldParser.java | 41 + .../folding/FoldParserManager.java | 124 + .../ui/rsyntaxtextarea/folding/FoldType.java | 59 + .../folding/HtmlFoldParser.java | 0 .../folding/JsonFoldParser.java | 161 + .../folding/LatexFoldParser.java | 108 + .../folding/LispFoldParser.java | 35 + .../folding/NsisFoldParser.java | 156 + .../folding/XmlFoldParser.java | 0 .../ui/rsyntaxtextarea/folding/package.html | 5 + .../modes/AbstractMarkupTokenMaker.java | 56 + .../modes/ActionScriptTokenMaker.flex | 500 + .../modes/ActionScriptTokenMaker.java | 2074 ++ .../modes/AssemblerX86TokenMaker.flex | 1037 + .../modes/AssemblerX86TokenMaker.java | 1870 ++ .../modes/BBCodeTokenMaker.flex | 273 + .../modes/BBCodeTokenMaker.java | 729 + .../modes/CPlusPlusTokenMaker.flex | 671 + .../modes/CPlusPlusTokenMaker.java | 2322 ++ .../rsyntaxtextarea/modes/CSSTokenMaker.flex | 414 + .../rsyntaxtextarea/modes/CSSTokenMaker.java | 979 + .../modes/CSharpTokenMaker.flex | 519 + .../modes/CSharpTokenMaker.java | 1603 + .../ui/rsyntaxtextarea/modes/CTokenMaker.flex | 645 + .../ui/rsyntaxtextarea/modes/CTokenMaker.java | 2075 ++ .../modes/ClojureTokenMaker.flex | 566 + .../modes/ClojureTokenMaker.java | 2309 ++ .../modes/DelphiTokenMaker.flex | 564 + .../modes/DelphiTokenMaker.java | 1634 + .../rsyntaxtextarea/modes/DtdTokenMaker.flex | 346 + .../rsyntaxtextarea/modes/DtdTokenMaker.java | 831 + .../modes/FormulaTokenMaker.flex | 0 .../modes/FormulaTokenMaker.java | 0 .../modes/FortranTokenMaker.flex | 482 + .../modes/FortranTokenMaker.java | 1014 + .../modes/GroovyTokenMaker.flex | 890 + .../rsyntaxtextarea/modes/HTMLTokenMaker.flex | 1189 + .../rsyntaxtextarea/modes/HTMLTokenMaker.java | 2987 ++ .../modes/HtaccessTokenMaker.flex | 500 + .../modes/HtaccessTokenMaker.java | 1505 + .../rsyntaxtextarea/modes/JSPTokenMaker.flex | 1565 + .../rsyntaxtextarea/modes/JSPTokenMaker.java | 5319 ++++ .../modes/JavaScriptTokenMaker.flex | 890 + .../modes/JavaScriptTokenMaker.java | 2134 ++ .../rsyntaxtextarea/modes/JavaTokenMaker.flex | 756 + .../rsyntaxtextarea/modes/JavaTokenMaker.java | 4969 +++ .../rsyntaxtextarea/modes/JsonTokenMaker.flex | 261 + .../rsyntaxtextarea/modes/JsonTokenMaker.java | 704 + .../modes/LatexTokenMaker.flex | 270 + .../modes/LatexTokenMaker.java | 719 + .../rsyntaxtextarea/modes/LispTokenMaker.flex | 434 + .../rsyntaxtextarea/modes/LispTokenMaker.java | 1311 + .../rsyntaxtextarea/modes/LuaTokenMaker.flex | 374 + .../rsyntaxtextarea/modes/LuaTokenMaker.java | 970 + .../modes/MakefileTokenMaker.flex | 338 + .../modes/MakefileTokenMaker.java | 867 + .../rsyntaxtextarea/modes/MxmlTokenMaker.flex | 811 + .../rsyntaxtextarea/modes/MxmlTokenMaker.java | 2708 ++ .../rsyntaxtextarea/modes/NSISTokenMaker.flex | 747 + .../rsyntaxtextarea/modes/NSISTokenMaker.java | 2982 ++ .../rsyntaxtextarea/modes/PHPTokenMaker.flex | 2323 ++ .../rsyntaxtextarea/modes/PHPTokenMaker.java | 25471 ++++++++++++++++ .../rsyntaxtextarea/modes/PerlTokenMaker.flex | 812 + .../rsyntaxtextarea/modes/PerlTokenMaker.java | 2110 ++ .../modes/PlainTextTokenMaker.flex | 227 + .../modes/PlainTextTokenMaker.java | 647 + .../modes/PropertiesFileTokenMaker.flex | 237 + .../modes/PropertiesFileTokenMaker.java | 664 + .../modes/PythonTokenMaker.flex | 443 + .../modes/PythonTokenMaker.java | 1092 + .../rsyntaxtextarea/modes/RubyTokenMaker.flex | 765 + .../rsyntaxtextarea/modes/RubyTokenMaker.java | 1670 + .../rsyntaxtextarea/modes/SASTokenMaker.flex | 677 + .../rsyntaxtextarea/modes/SASTokenMaker.java | 1492 + .../rsyntaxtextarea/modes/SQLTokenMaker.flex | 465 + .../rsyntaxtextarea/modes/SQLTokenMaker.java | 1129 + .../modes/ScalaTokenMaker.flex | 388 + .../modes/ScalaTokenMaker.java | 998 + .../rsyntaxtextarea/modes/TclTokenMaker.flex | 406 + .../rsyntaxtextarea/modes/TclTokenMaker.java | 1078 + .../modes/UnixShellTokenMaker.java | 1117 + .../modes/VisualBasicTokenMaker.flex | 464 + .../modes/VisualBasicTokenMaker.java | 1622 + .../modes/WindowsBatchTokenMaker.java | 605 + .../rsyntaxtextarea/modes/XMLTokenMaker.flex | 487 + .../rsyntaxtextarea/modes/XMLTokenMaker.java | 997 + .../ui/rsyntaxtextarea/modes/package.html | 5 + .../syntax/ui/rsyntaxtextarea/package.html | 5 + .../parser/AbstractParser.java | 95 + .../parser/DefaultParseResult.java | 145 + .../parser/DefaultParserNotice.java | 273 + .../parser/ExtendedHyperlinkListener.java | 38 + .../rsyntaxtextarea/parser/ParseResult.java | 84 + .../ui/rsyntaxtextarea/parser/Parser.java | 76 + .../rsyntaxtextarea/parser/ParserNotice.java | 130 + .../rsyntaxtextarea/parser/TaskTagParser.java | 158 + .../rsyntaxtextarea/parser/ToolTipInfo.java | 95 + .../ui/rsyntaxtextarea/parser/XmlParser.java | 224 + .../ui/rsyntaxtextarea/parser/package.html | 9 + .../templates/AbstractCodeTemplate.java | 134 + .../templates/CodeTemplate.java | 74 + .../templates/StaticCodeTemplate.java | 263 + .../ui/rsyntaxtextarea/templates/package.html | 5 + .../ui/rtextarea/AbstractGutterComponent.java | 114 + .../rtextarea/BackgroundPainterStrategy.java | 44 + ...ufferedImageBackgroundPainterStrategy.java | 124 + .../rtextarea/ChangeableHighlightPainter.java | 440 + .../ColorBackgroundPainterStrategy.java | 110 + .../ui/rtextarea/ConfigurableCaret.java | 712 + .../syntax/ui/rtextarea/FoldIndicator.java | 696 + .../gui/syntax/ui/rtextarea/Gutter.java | 969 + .../syntax/ui/rtextarea/GutterIconInfo.java | 53 + .../gui/syntax/ui/rtextarea/IconGroup.java | 247 + .../syntax/ui/rtextarea/IconRowHeader.java | 875 + .../ImageBackgroundPainterStrategy.java | 171 + .../ui/rtextarea/LineHighlightManager.java | 208 + .../syntax/ui/rtextarea/LineNumberList.java | 718 + .../design/gui/syntax/ui/rtextarea/Macro.java | 427 + .../gui/syntax/ui/rtextarea/RDocument.java | 65 + .../ui/rtextarea/RDocumentCharSequence.java | 119 + .../ui/rtextarea/RTADefaultInputMap.java | 145 + .../ui/rtextarea/RTATextTransferHandler.java | 485 + .../gui/syntax/ui/rtextarea/RTextArea.java | 1710 ++ .../syntax/ui/rtextarea/RTextArea.properties | 29 + .../syntax/ui/rtextarea/RTextAreaBase.java | 1214 + .../ui/rtextarea/RTextAreaEditorKit.java | 2689 ++ .../ui/rtextarea/RTextAreaHighlighter.java | 0 .../gui/syntax/ui/rtextarea/RTextAreaUI.java | 590 + .../ui/rtextarea/RTextArea_ar.properties | 29 + .../ui/rtextarea/RTextArea_de.properties | 29 + .../ui/rtextarea/RTextArea_es.properties | 29 + .../ui/rtextarea/RTextArea_fr.properties | 29 + .../ui/rtextarea/RTextArea_hu.properties | 29 + .../ui/rtextarea/RTextArea_in.properties | 29 + .../ui/rtextarea/RTextArea_it.properties | 29 + .../ui/rtextarea/RTextArea_ja.properties | 29 + .../ui/rtextarea/RTextArea_ko.properties | 29 + .../ui/rtextarea/RTextArea_nl.properties | 29 + .../ui/rtextarea/RTextArea_pl.properties | 29 + .../ui/rtextarea/RTextArea_pt_BR.properties | 29 + .../ui/rtextarea/RTextArea_ru.properties | 29 + .../ui/rtextarea/RTextArea_tr.properties | 29 + .../ui/rtextarea/RTextArea_zh_CN.properties | 29 + .../ui/rtextarea/RTextArea_zh_TW.properties | 29 + .../syntax/ui/rtextarea/RTextScrollPane.java | 286 + .../gui/syntax/ui/rtextarea/RUndoManager.java | 258 + .../ui/rtextarea/RecordableTextAction.java | 289 + .../syntax/ui/rtextarea/RegExReplaceInfo.java | 85 + .../syntax/ui/rtextarea/SearchContext.java | 391 + .../gui/syntax/ui/rtextarea/SearchEngine.java | 1017 + .../gui/syntax/ui/rtextarea/SearchResult.java | 0 .../ui/rtextarea/SmartHighlightPainter.java | 159 + .../syntax/ui/rtextarea/ToolTipSupplier.java | 39 + ...olatileImageBackgroundPainterStrategy.java | 138 + .../gui/syntax/ui/rtextarea/package.html | 5 + .../gui/syntax/util/DynamicIntArray.java | 423 + .../fr/design/gui/syntax/util/package.html | 5 + .../src/com/fr/design/gui/toast/Toast.java | 0 .../hyperlink/AbstractHyperLinkPane.java | 0 .../hyperlink/AbstractHyperNorthPane.java | 0 .../hyperlink/HyperlinkTargetFrame.java | 0 .../hyperlink/ReporletHyperNorthPane.java | 184 + .../hyperlink/ReportletHyperlinkPane.java | 156 + .../design/hyperlink/WebHyperNorthPane.java | 111 + .../fr/design/hyperlink/WebHyperlinkPane.java | 128 + .../src/com/fr/design/icon/BorderIcon.java | 90 + .../com/fr/design/icon/IconPathConstants.java | 0 .../src/com/fr/design/icon/LockIcon.java | 105 + .../src/com/fr/design/icon/WarningIcon.java | 109 + .../com/fr/design/images/arrow/arrow_down.png | Bin .../com/fr/design/images/arrow/arrow_up.png | Bin .../src/com/fr/design/images/bbs.png | Bin .../src/com/fr/design/images/browser/360.png | Bin .../src/com/fr/design/images/browser/back.png | Bin .../com/fr/design/images/browser/chrome.png | Bin .../com/fr/design/images/browser/firefox.png | Bin .../com/fr/design/images/browser/forward.png | Bin .../src/com/fr/design/images/browser/go.png | Bin .../src/com/fr/design/images/browser/home.png | Bin .../src/com/fr/design/images/browser/ie.png | Bin .../com/fr/design/images/browser/reload.png | Bin .../src/com/fr/design/images/browser/stop.png | Bin .../src/com/fr/design/images/bug.png | Bin .../com/fr/design/images/buttonicon/add.png | Bin .../fr/design/images/buttonicon/add_over.png | Bin .../fr/design/images/buttonicon/add_press.png | Bin .../fr/design/images/buttonicon/addicon.png | Bin .../images/buttonicon/additicon_grey.png | Bin .../fr/design/images/buttonicon/anab24.png | Bin .../com/fr/design/images/buttonicon/anas.png | Bin .../com/fr/design/images/buttonicon/arrow.png | Bin .../fr/design/images/buttonicon/arrowdown.png | Bin .../fr/design/images/buttonicon/arrowup.png | Bin .../images/buttonicon/bind_ds_column.png | Bin .../fr/design/images/buttonicon/button_0.png | Bin .../images/buttonicon/card_layout_16.png | Bin .../com/fr/design/images/buttonicon/cell.png | Bin .../design/images/buttonicon/cell_group.png | Bin .../design/images/buttonicon/close_icon.png | Bin .../fr/design/images/buttonicon/column.png | Bin .../fr/design/images/buttonicon/config.png | Bin .../com/fr/design/images/buttonicon/cube.png | Bin .../fr/design/images/buttonicon/delete.png | Bin .../design/images/buttonicon/downSelected.png | Bin .../fr/design/images/buttonicon/ds_column.png | Bin .../images/buttonicon/ds_column_index.png | Bin .../images/buttonicon/ds_column_name.png | Bin .../fr/design/images/buttonicon/dscolumn.png | Bin .../com/fr/design/images/buttonicon/editn.png | Bin .../com/fr/design/images/buttonicon/editp.png | Bin .../com/fr/design/images/buttonicon/hiden.png | Bin .../com/fr/design/images/buttonicon/hidep.png | Bin .../fr/design/images/buttonicon/history.png | Bin .../images/buttonicon/layout_absolute_new.png | Bin .../design/images/buttonicon/leftNormal.png | Bin .../design/images/buttonicon/list_cover.png | Bin .../design/images/buttonicon/list_covered.png | Bin .../fr/design/images/buttonicon/list_icon.png | Bin .../design/images/buttonicon/list_normal.png | Bin .../design/images/buttonicon/list_press.png | Bin .../design/images/buttonicon/list_pressed.png | Bin .../com/fr/design/images/buttonicon/minus.png | Bin .../com/fr/design/images/buttonicon/more.png | Bin .../com/fr/design/images/buttonicon/more2.png | Bin .../com/fr/design/images/buttonicon/more3.png | Bin .../com/fr/design/images/buttonicon/more4.png | Bin .../images/buttonicon/mouseoverclose icon.png | Bin .../fr/design/images/buttonicon/new_form3.png | Bin .../fr/design/images/buttonicon/newcpts.png | Bin .../com/fr/design/images/buttonicon/open.png | Bin .../fr/design/images/buttonicon/pageb24.png | Bin .../com/fr/design/images/buttonicon/pages.png | Bin .../fr/design/images/buttonicon/parameter.png | Bin .../com/fr/design/images/buttonicon/plus.png | Bin .../design/images/buttonicon/popdownarrow.png | Bin .../design/images/buttonicon/popuparrow.png | Bin .../images/buttonicon/pressclose icon.png | Bin .../images/buttonicon/prevew_down_icon.png | Bin .../fr/design/images/buttonicon/prewidget.png | Bin .../propertiestab/authorityedit_disabled.png | Bin .../propertiestab/authorityedit_normal.png | Bin .../propertiestab/authorityedit_selected.png | Bin .../propertiestab/cellattr_disabled.png | Bin .../propertiestab/cellattr_normal.png | Bin .../propertiestab/cellattr_selected.png | Bin .../propertiestab/cellelement_disabled.png | Bin .../propertiestab/cellelement_normal.png | Bin .../propertiestab/cellelement_selected.png | Bin .../propertiestab/conditionattr_disabled.png | Bin .../propertiestab/conditionattr_normal.png | Bin .../propertiestab/conditionattr_selected.png | Bin .../configuredroles_disabled.png | Bin .../propertiestab/configuredroles_normal.png | Bin .../configuredroles_selected.png | Bin .../propertiestab/floatelement_disabled.png | Bin .../propertiestab/floatelement_normal.png | Bin .../propertiestab/floatelement_selected.png | Bin .../propertiestab/hyperlink_disabled.png | Bin .../propertiestab/hyperlink_normal.png | Bin .../propertiestab/hyperlink_selected.png | Bin .../propertiestab/widgetlib_disabled.png | Bin .../propertiestab/widgetlib_normal.png | Bin .../propertiestab/widgetlib_selected.png | Bin .../propertiestab/widgetsettings_diabled.png | Bin .../propertiestab/widgetsettings_disabled.png | Bin .../propertiestab/widgetsettings_normal.png | Bin .../propertiestab/widgetsettings_selected.png | Bin .../com/fr/design/images/buttonicon/redo.png | Bin .../fr/design/images/buttonicon/refresh.png | Bin .../fr/design/images/buttonicon/report_16.png | Bin .../com/fr/design/images/buttonicon/run24.png | Bin .../com/fr/design/images/buttonicon/runs.png | Bin .../com/fr/design/images/buttonicon/save.png | Bin .../fr/design/images/buttonicon/select.png | Bin .../design/images/buttonicon/select_item.png | Bin .../fr/design/images/buttonicon/setting.png | Bin .../images/buttonicon/switchShortCuts.png | Bin .../fr/design/images/buttonicon/type_bool.png | Bin .../design/images/buttonicon/type_cursor.png | Bin .../fr/design/images/buttonicon/type_date.png | Bin .../design/images/buttonicon/type_double.png | Bin .../design/images/buttonicon/type_formula.png | Bin .../fr/design/images/buttonicon/type_int.png | Bin .../fr/design/images/buttonicon/type_none.png | Bin .../design/images/buttonicon/type_string.png | Bin .../com/fr/design/images/buttonicon/undo.png | Bin .../com/fr/design/images/buttonicon/viewn.png | Bin .../com/fr/design/images/buttonicon/viewp.png | Bin .../com/fr/design/images/buttonicon/warn.png | Bin .../images/buttonicon/widget/button_16.png | Bin .../buttonicon/widget/button_group_16.png | Bin .../images/buttonicon/widget/check_box_16.png | Bin .../buttonicon/widget/checkbox_group_16.png | Bin .../images/buttonicon/widget/combo_box_16.png | Bin .../buttonicon/widget/combo_check_16.png | Bin .../images/buttonicon/widget/comboboxtree.png | Bin .../images/buttonicon/widget/date_16.png | Bin .../images/buttonicon/widget/files_up.png | Bin .../images/buttonicon/widget/label_16.png | Bin .../buttonicon/widget/number_field_16.png | Bin .../buttonicon/widget/password_field_16.png | Bin .../images/buttonicon/widget/text_area_16.png | Bin .../buttonicon/widget/text_field_16.png | Bin .../images/buttonicon/widget/tree_16.png | Bin .../fr/design/images/buttonicon/widgets.png | Bin .../fr/design/images/buttonicon/writeb24.png | Bin .../fr/design/images/buttonicon/writes.png | Bin .../com/fr/design/images/buttonicon/yes.png | Bin .../fr/design/images/calculate/average.png | Bin .../com/fr/design/images/calculate/count.png | Bin .../com/fr/design/images/calculate/max.png | Bin .../com/fr/design/images/calculate/min.png | Bin .../com/fr/design/images/calculate/none.png | Bin .../com/fr/design/images/calculate/sum.png | Bin .../fr/design/images/calender/month_add.png | Bin .../images/calender/month_add_click.png | Bin .../images/calender/month_add_hover.png | Bin .../design/images/calender/month_reduce.png | Bin .../images/calender/month_reduce_click.png | Bin .../images/calender/month_reduce_hover.png | Bin .../fr/design/images/calender/year_add.png | Bin .../design/images/calender/year_add_click.png | Bin .../design/images/calender/year_add_hover.png | Bin .../fr/design/images/calender/year_reduce.png | Bin .../images/calender/year_reduce_click.png | Bin .../images/calender/year_reduce_hover.png | Bin .../design/images/chart/AreaPlot/layout/0.png | Bin .../design/images/chart/AreaPlot/layout/1.png | Bin .../design/images/chart/AreaPlot/layout/2.png | Bin .../design/images/chart/AreaPlot/layout/3.png | Bin .../design/images/chart/AreaPlot/type/0.png | Bin .../design/images/chart/AreaPlot/type/1.png | Bin .../design/images/chart/AreaPlot/type/2.png | Bin .../design/images/chart/AreaPlot/type/3.png | Bin .../design/images/chart/AreaPlot/type/4.png | Bin .../design/images/chart/AreaPlot/type/5.png | Bin .../design/images/chart/BarPlot/layout/0.png | Bin .../design/images/chart/BarPlot/layout/1.png | Bin .../design/images/chart/BarPlot/layout/2.png | Bin .../design/images/chart/BarPlot/layout/3.png | Bin .../fr/design/images/chart/BarPlot/type/0.png | Bin .../fr/design/images/chart/BarPlot/type/1.png | Bin .../fr/design/images/chart/BarPlot/type/2.png | Bin .../fr/design/images/chart/BarPlot/type/3.png | Bin .../fr/design/images/chart/BarPlot/type/4.png | Bin .../fr/design/images/chart/BarPlot/type/5.png | Bin .../fr/design/images/chart/BarPlot/type/6.png | Bin .../images/chart/BubblePlot/layout/0.png | Bin .../images/chart/BubblePlot/layout/1.png | Bin .../images/chart/BubblePlot/layout/2.png | Bin .../images/chart/BubblePlot/layout/3.png | Bin .../design/images/chart/BubblePlot/type/0.png | Bin .../fr/design/images/chart/ChangeChart.png | Bin .../images/chart/ChartAxisLineStyle/cross.png | Bin .../chart/ChartAxisLineStyle/external.png | Bin .../chart/ChartAxisLineStyle/inside.png | Bin .../com/fr/design/images/chart/ChartData.png | Bin .../chart/ChartLegend/layout_bottom.png | Bin .../images/chart/ChartLegend/layout_left.png | Bin .../images/chart/ChartLegend/layout_right.png | Bin .../images/chart/ChartLegend/layout_top.png | Bin .../chart/ChartLegend/layout_top_right.png | Bin .../com/fr/design/images/chart/ChartStyle.png | Bin .../com/fr/design/images/chart/ChartType.png | Bin .../images/chart/ColumnPlot/layout/0.png | Bin .../images/chart/ColumnPlot/layout/1.png | Bin .../images/chart/ColumnPlot/layout/2.png | Bin .../images/chart/ColumnPlot/layout/3.png | Bin .../design/images/chart/ColumnPlot/type/0.png | Bin .../design/images/chart/ColumnPlot/type/1.png | Bin .../design/images/chart/ColumnPlot/type/2.png | Bin .../design/images/chart/ColumnPlot/type/3.png | Bin .../design/images/chart/ColumnPlot/type/4.png | Bin .../design/images/chart/ColumnPlot/type/5.png | Bin .../design/images/chart/ColumnPlot/type/6.png | Bin .../fr/design/images/chart/ConditionAttr.png | Bin .../images/chart/CustomPlot/layout/0.png | Bin .../images/chart/CustomPlot/layout/1.png | Bin .../images/chart/CustomPlot/layout/2.png | Bin .../images/chart/CustomPlot/layout/3.png | Bin .../design/images/chart/CustomPlot/type/0.png | Bin .../images/chart/DonutPlot/layout/0.png | Bin .../images/chart/DonutPlot/layout/1.png | Bin .../images/chart/DonutPlot/layout/2.png | Bin .../images/chart/DonutPlot/layout/3.png | Bin .../design/images/chart/DonutPlot/type/0.png | Bin .../design/images/chart/DonutPlot/type/1.png | Bin .../design/images/chart/FunnelPlot/type/0.png | Bin .../design/images/chart/GanttPlot/type/0.png | Bin .../images/chart/GisMapPlot/layout/0.png | Bin .../images/chart/GisMapPlot/layout/1.png | Bin .../design/images/chart/GisMapPlot/type/0.png | Bin .../com/fr/design/images/chart/InterAttr.png | Bin .../design/images/chart/LinePlot/layout/0.png | Bin .../design/images/chart/LinePlot/layout/1.png | Bin .../design/images/chart/LinePlot/layout/2.png | Bin .../design/images/chart/LinePlot/layout/3.png | Bin .../design/images/chart/LinePlot/type/0.png | Bin .../design/images/chart/LinePlot/type/1.png | Bin .../design/images/chart/LinePlot/type/2.png | Bin .../fr/design/images/chart/MapPlot/type/0.png | Bin .../fr/design/images/chart/MapPlot/type/1.png | Bin .../fr/design/images/chart/MapPlot/type/2.png | Bin .../fr/design/images/chart/MapPlot/type/3.png | Bin .../design/images/chart/MeterPlot/type/0.png | Bin .../design/images/chart/MeterPlot/type/1.png | Bin .../design/images/chart/MeterPlot/type/2.png | Bin .../design/images/chart/PiePlot/layout/0.png | Bin .../design/images/chart/PiePlot/layout/1.png | Bin .../design/images/chart/PiePlot/layout/2.png | Bin .../design/images/chart/PiePlot/layout/3.png | Bin .../fr/design/images/chart/PiePlot/type/0.png | Bin .../fr/design/images/chart/PiePlot/type/1.png | Bin .../design/images/chart/RadarPlot/type/0.png | Bin .../design/images/chart/RangePlot/type/0.png | Bin .../design/images/chart/StockPlot/type/0.png | Bin .../images/chart/XYScatterPlot/layout/0.png | Bin .../images/chart/XYScatterPlot/layout/1.png | Bin .../images/chart/XYScatterPlot/layout/2.png | Bin .../images/chart/XYScatterPlot/layout/3.png | Bin .../images/chart/XYScatterPlot/type/0.png | Bin .../com/fr/design/images/chart/default.png | Bin .../src/com/fr/design/images/chart/link.png | Bin .../src/com/fr/design/images/chart/moved.png | Bin .../src/com/fr/design/images/chart/normal.png | Bin .../com/fr/design/images/chart/pressed.png | Bin .../fr/design/images/condition/bracket.png | Bin .../fr/design/images/condition/unBracket.png | Bin .../com/fr/design/images/control/addPopup.png | Bin .../fr/design/images/control/arrow_down.png | Bin .../fr/design/images/control/bar-light.png | Bin .../src/com/fr/design/images/control/bar.png | Bin .../src/com/fr/design/images/control/barl.png | Bin .../src/com/fr/design/images/control/barm.png | Bin .../com/fr/design/images/control/clear.png | Bin .../com/fr/design/images/control/close.png | Bin .../design/images/control/close_rollover.png | Bin .../com/fr/design/images/control/closet.png | Bin .../com/fr/design/images/control/combobox.png | Bin .../design/images/control/control-center2.png | Bin .../src/com/fr/design/images/control/copy.png | Bin .../com/fr/design/images/control/dot-line.png | Bin .../src/com/fr/design/images/control/dot.png | Bin .../src/com/fr/design/images/control/dotv.png | Bin .../src/com/fr/design/images/control/down.png | Bin .../fr/design/images/control/down_arrow.png | Bin .../com/fr/design/images/control/downdis.png | Bin .../com/fr/design/images/control/downnor.png | Bin .../com/fr/design/images/control/downpre.png | Bin .../fr/design/images/control/east_arrow.png | Bin .../src/com/fr/design/images/control/edit.png | Bin .../fr/design/images/control/edit_white.png | Bin .../fr/design/images/control/help_close.png | Bin .../fr/design/images/control/help_open.png | Bin .../images/control/icon_thumb_normal.png | Bin .../src/com/fr/design/images/control/left.png | Bin .../com/fr/design/images/control/leftleft.png | Bin .../com/fr/design/images/control/leftnor.png | Bin .../com/fr/design/images/control/leftpre.png | Bin .../src/com/fr/design/images/control/lock.png | Bin .../src/com/fr/design/images/control/more.png | Bin .../com/fr/design/images/control/refresh.png | Bin .../com/fr/design/images/control/remove.png | Bin .../com/fr/design/images/control/right.png | Bin .../com/fr/design/images/control/rightnor.png | Bin .../com/fr/design/images/control/rightpre.png | Bin .../fr/design/images/control/rightright.png | Bin .../com/fr/design/images/control/sortAsc.png | Bin .../com/fr/design/images/control/tab/end.png | Bin .../fr/design/images/control/tab/end_not.png | Bin .../fr/design/images/control/tab/first.png | Bin .../design/images/control/tab/first_not.png | Bin .../com/fr/design/images/control/tab/next.png | Bin .../fr/design/images/control/tab/next_not.png | Bin .../com/fr/design/images/control/tab/prev.png | Bin .../fr/design/images/control/tab/prev_not.png | Bin .../fr/design/images/control/tab/remove.png | Bin .../fr/design/images/control/to_bottom.png | Bin .../com/fr/design/images/control/to_top.png | Bin .../com/fr/design/images/control/unlock.png | Bin .../src/com/fr/design/images/control/up.png | Bin .../com/fr/design/images/control/up_arrow.png | Bin .../com/fr/design/images/control/updis.png | Bin .../com/fr/design/images/control/upnor.png | Bin .../com/fr/design/images/control/uppre.png | Bin .../src/com/fr/design/images/control/warn.png | Bin .../fr/design/images/control/west_arrow.png | Bin .../design/images/custombtn/baobiaozhuti.png | Bin .../images/custombtn/baobiaozhuti_click.png | Bin .../images/custombtn/baobiaozhuti_hover.png | Bin .../design/images/custombtn/canshujiemian.png | Bin .../images/custombtn/canshujiemian_click.png | Bin .../images/custombtn/canshujiemian_hover.png | Bin .../com/fr/design/images/custombtn/edit.png | Bin .../fr/design/images/custombtn/edit_click.png | Bin .../fr/design/images/custombtn/edit_hover.png | Bin .../com/fr/design/images/custombtn/form.png | Bin .../fr/design/images/custombtn/form_click.png | Bin .../fr/design/images/custombtn/form_hover.png | Bin .../com/fr/design/images/custombtn/left.gif | Bin .../com/fr/design/images/custombtn/page.png | Bin .../fr/design/images/custombtn/page_click.png | Bin .../fr/design/images/custombtn/page_hover.png | Bin .../fr/design/images/custombtn/preview.png | Bin .../design/images/custombtn/preview_click.png | Bin .../design/images/custombtn/preview_hover.png | Bin .../com/fr/design/images/custombtn/right.gif | Bin .../fr/design/images/custombtn/setting.png | Bin .../design/images/custombtn/setting_click.png | Bin .../design/images/custombtn/setting_hover.png | Bin .../com/fr/design/images/dashboard/chart.png | Bin .../com/fr/design/images/dashboard/files.png | Bin .../com/fr/design/images/dashboard/form.png | Bin .../com/fr/design/images/dashboard/guide.png | Bin .../com/fr/design/images/dashboard/img/0.gif | Bin .../com/fr/design/images/dashboard/img/1.gif | Bin .../com/fr/design/images/dashboard/img/1.png | Bin .../com/fr/design/images/dashboard/img/10.gif | Bin .../com/fr/design/images/dashboard/img/10.png | Bin .../com/fr/design/images/dashboard/img/11.gif | Bin .../com/fr/design/images/dashboard/img/11.png | Bin .../com/fr/design/images/dashboard/img/12.gif | Bin .../com/fr/design/images/dashboard/img/12.png | Bin .../com/fr/design/images/dashboard/img/13.gif | Bin .../com/fr/design/images/dashboard/img/13.png | Bin .../com/fr/design/images/dashboard/img/14.gif | Bin .../com/fr/design/images/dashboard/img/14.png | Bin .../com/fr/design/images/dashboard/img/15.gif | Bin .../com/fr/design/images/dashboard/img/15.png | Bin .../com/fr/design/images/dashboard/img/16.gif | Bin .../com/fr/design/images/dashboard/img/16.png | Bin .../com/fr/design/images/dashboard/img/17.gif | Bin .../com/fr/design/images/dashboard/img/17.png | Bin .../com/fr/design/images/dashboard/img/18.gif | Bin .../com/fr/design/images/dashboard/img/18.png | Bin .../com/fr/design/images/dashboard/img/19.gif | Bin .../com/fr/design/images/dashboard/img/19.png | Bin .../com/fr/design/images/dashboard/img/2.gif | Bin .../com/fr/design/images/dashboard/img/2.png | Bin .../com/fr/design/images/dashboard/img/20.png | Bin .../com/fr/design/images/dashboard/img/21.png | Bin .../com/fr/design/images/dashboard/img/22.png | Bin .../com/fr/design/images/dashboard/img/23.png | Bin .../com/fr/design/images/dashboard/img/24.png | Bin .../com/fr/design/images/dashboard/img/25.png | Bin .../com/fr/design/images/dashboard/img/26.png | Bin .../com/fr/design/images/dashboard/img/27.png | Bin .../com/fr/design/images/dashboard/img/28.png | Bin .../com/fr/design/images/dashboard/img/29.png | Bin .../com/fr/design/images/dashboard/img/3.gif | Bin .../com/fr/design/images/dashboard/img/3.png | Bin .../com/fr/design/images/dashboard/img/30.png | Bin .../com/fr/design/images/dashboard/img/31.png | Bin .../com/fr/design/images/dashboard/img/32.png | Bin .../com/fr/design/images/dashboard/img/33.png | Bin .../com/fr/design/images/dashboard/img/34.png | Bin .../com/fr/design/images/dashboard/img/35.png | Bin .../com/fr/design/images/dashboard/img/36.png | Bin .../com/fr/design/images/dashboard/img/37.png | Bin .../com/fr/design/images/dashboard/img/38.png | Bin .../com/fr/design/images/dashboard/img/39.png | Bin .../com/fr/design/images/dashboard/img/4.gif | Bin .../com/fr/design/images/dashboard/img/4.png | Bin .../com/fr/design/images/dashboard/img/40.png | Bin .../com/fr/design/images/dashboard/img/41.png | Bin .../com/fr/design/images/dashboard/img/42.png | Bin .../com/fr/design/images/dashboard/img/43.png | Bin .../com/fr/design/images/dashboard/img/44.png | Bin .../com/fr/design/images/dashboard/img/45.png | Bin .../com/fr/design/images/dashboard/img/46.png | Bin .../com/fr/design/images/dashboard/img/47.png | Bin .../com/fr/design/images/dashboard/img/48.png | Bin .../com/fr/design/images/dashboard/img/49.png | Bin .../com/fr/design/images/dashboard/img/5.gif | Bin .../com/fr/design/images/dashboard/img/5.png | Bin .../com/fr/design/images/dashboard/img/50.png | Bin .../com/fr/design/images/dashboard/img/52.png | Bin .../com/fr/design/images/dashboard/img/54.png | Bin .../com/fr/design/images/dashboard/img/55.png | Bin .../com/fr/design/images/dashboard/img/56.png | Bin .../com/fr/design/images/dashboard/img/57.png | Bin .../com/fr/design/images/dashboard/img/6.gif | Bin .../com/fr/design/images/dashboard/img/6.png | Bin .../com/fr/design/images/dashboard/img/7.gif | Bin .../com/fr/design/images/dashboard/img/7.png | Bin .../com/fr/design/images/dashboard/img/8.gif | Bin .../com/fr/design/images/dashboard/img/8.png | Bin .../com/fr/design/images/dashboard/img/9.gif | Bin .../com/fr/design/images/dashboard/img/9.png | Bin .../fr/design/images/dashboard/img/Thumbs.db | Bin .../fr/design/images/data/arrow_branch.png | Bin .../com/fr/design/images/data/bind/add.png | Bin .../images/data/bind/distanceconnect.png | Bin .../images/data/bind/groupAscColumn.png | Bin .../design/images/data/bind/groupColumn.png | Bin .../images/data/bind/groupDescColumn.png | Bin .../design/images/data/bind/localconnect.png | Bin .../com/fr/design/images/data/bind/modify.png | Bin .../design/images/data/bind/normalColumn.png | Bin .../design/images/data/bind/selectColumn.png | Bin .../design/images/data/bind/sortAscColumn.png | Bin .../fr/design/images/data/bind/sortColumn.png | Bin .../images/data/bind/sortDescColumn.png | Bin .../design/images/data/bind/summaryColumn.png | Bin .../fr/design/images/data/black_search.png | Bin .../com/fr/design/images/data/comb_widget.png | Bin .../fr/design/images/data/convertEmbedded.png | Bin .../src/com/fr/design/images/data/cube.png | Bin .../fr/design/images/data/custom_widget.png | Bin .../fr/design/images/data/dataDictionary.png | Bin .../com/fr/design/images/data/dataTable.png | Bin .../com/fr/design/images/data/database.png | Bin .../com/fr/design/images/data/datakubiao.png | Bin .../com/fr/design/images/data/datasource.png | Bin .../fr/design/images/data/default_widget.png | Bin .../src/com/fr/design/images/data/diy.png | Bin .../com/fr/design/images/data/dock/XML.png | Bin .../images/data/dock/classTableData.png | Bin .../fr/design/images/data/dock/dataTable.png | Bin .../fr/design/images/data/dock/database.png | Bin .../com/fr/design/images/data/dock/excel.png | Bin .../images/data/dock/relation_table_data.png | Bin .../images/data/dock/serverclasstabledata.png | Bin .../images/data/dock/serverdatabase.png | Bin .../images/data/dock/serverdatatable.png | Bin .../fr/design/images/data/dock/table_proc.png | Bin .../fr/design/images/data/dock/table_text.png | Bin .../com/fr/design/images/data/editQuery.png | Bin .../src/com/fr/design/images/data/field.png | Bin .../src/com/fr/design/images/data/file.png | Bin .../src/com/fr/design/images/data/multi.png | Bin .../com/fr/design/images/data/newQuery.png | Bin .../src/com/fr/design/images/data/private.png | Bin .../src/com/fr/design/images/data/public.png | Bin .../src/com/fr/design/images/data/sap.png | Bin .../src/com/fr/design/images/data/search.png | Bin .../images/data/source/classTableData.png | Bin .../fr/design/images/data/source/clear.png | Bin .../images/data/source/dataDictionary.png | Bin .../fr/design/images/data/source/delete.png | Bin .../images/data/source/hibernateTableData.png | Bin .../design/images/data/source/hoverDown.png | Bin .../design/images/data/source/hoverDown20.png | Bin .../images/data/source/hoverDown@2x.png | Bin .../design/images/data/source/hoverUp20.png | Bin .../images/data/source/jdbcDataquery.png | Bin .../images/data/source/jdbcTableData.png | Bin .../fr/design/images/data/source/moveDown.png | Bin .../fr/design/images/data/source/moveUp.png | Bin .../design/images/data/source/newDatabase.png | Bin .../images/data/source/newDatasource.png | Bin .../design/images/data/source/normalDown.png | Bin .../images/data/source/normalDown20.png | Bin .../images/data/source/normalDown@2x.png | Bin .../design/images/data/source/normalUp20.png | Bin .../fr/design/images/data/source/rename.png | Bin .../design/images/data/source/scaleDown.png | Bin .../fr/design/images/data/source/scaleUp.png | Bin .../fr/design/images/data/source/schema.png | Bin .../images/data/source/selectwizard/Thumbs.db | Bin .../data/source/selectwizard/accept.png | Bin .../data/source/selectwizard/bullet_key.png | Bin .../data/source/selectwizard/bullet_pink.png | Bin .../data/source/selectwizard/cart_add.png | Bin .../data/source/selectwizard/cart_delete.png | Bin .../selectwizard/chart_organisation.png | Bin .../data/source/selectwizard/database.png | Bin .../source/selectwizard/database_connect.png | Bin .../source/selectwizard/database_gear.png | Bin .../selectwizard/database_lightning.png | Bin .../source/selectwizard/database_save.png | Bin .../source/selectwizard/database_table.png | Bin .../source/selectwizard/database_tables.png | Bin .../data/source/selectwizard/filter.png | Bin .../source/selectwizard/folder_database.png | Bin .../data/source/selectwizard/folder_page.png | Bin .../data/source/selectwizard/folder_table.png | Bin .../data/source/selectwizard/page_edit.png | Bin .../data/source/selectwizard/page_gear.png | Bin .../data/source/selectwizard/page_save.png | Bin .../selectwizard/page_white_database.png | Bin .../data/source/selectwizard/table_error.png | Bin .../data/source/selectwizard/table_gear.png | Bin .../data/source/selectwizard/table_link.png | Bin .../source/selectwizard/table_multiple.png | Bin .../selectwizard/table_relationship.png | Bin .../source/selectwizard/table_row_delete.png | Bin .../source/selectwizard/table_row_insert.png | Bin .../data/source/selectwizard/table_sort.png | Bin .../data/source/selectwizard/textfield.png | Bin .../data/source/selectwizard/wizard.png | Bin .../data/source/selectwizard/wrench.png | Bin .../images/data/source/sqlAscColumn.png | Bin .../design/images/data/source/sqlColumn.png | Bin .../images/data/source/sqlConditionColumn.png | Bin .../images/data/source/sqlDescColumn.png | Bin .../fr/design/images/data/source/sqlTable.png | Bin .../images/data/source/sqlViewTable.png | Bin .../fr/design/images/data/source/table.png | Bin .../images/data/source/textDatasource.png | Bin .../com/fr/design/images/data/source/view.png | Bin .../fr/design/images/data/store_procedure.png | Bin .../src/com/fr/design/images/data/string.png | Bin .../src/com/fr/design/images/data/table.png | Bin .../src/com/fr/design/images/data/table2.png | Bin .../src/com/fr/design/images/data/tables.png | Bin .../src/com/fr/design/images/data/text.png | Bin .../src/com/fr/design/images/data/today.gif | Bin .../src/com/fr/design/images/data/tree.png | Bin .../com/fr/design/images/data/user_widget.png | Bin .../src/com/fr/design/images/data/views.png | Bin .../src/com/fr/design/images/data/xml.png | Bin .../com/fr/design/images/dialog/appfit/H0.png | Bin .../com/fr/design/images/dialog/appfit/H1.png | Bin .../com/fr/design/images/dialog/appfit/H2.png | Bin .../com/fr/design/images/dialog/appfit/H3.png | Bin .../com/fr/design/images/dialog/appfit/H4.png | Bin .../com/fr/design/images/dialog/appfit/V0.png | Bin .../com/fr/design/images/dialog/appfit/V1.png | Bin .../com/fr/design/images/dialog/appfit/V2.png | Bin .../com/fr/design/images/dialog/appfit/V3.png | Bin .../com/fr/design/images/dialog/appfit/V4.png | Bin .../com/fr/design/images/dialog/column.png | Bin .../com/fr/design/images/dialog/function.gif | Bin .../com/fr/design/images/dialog/parameter.gif | Bin .../src/com/fr/design/images/dialog/table.png | Bin .../com/fr/design/images/dialog/variable.png | Bin .../src/com/fr/design/images/dock/desktop.png | Bin .../src/com/fr/design/images/dock/project.png | Bin .../com/fr/design/images/dock/projectVer.png | Bin .../com/fr/design/images/dock/properties.png | Bin .../com/fr/design/images/docking/close.gif | Bin .../src/com/fr/design/images/docking/down.gif | Bin .../src/com/fr/design/images/docking/left.gif | Bin .../src/com/fr/design/images/docking/left.png | Bin .../com/fr/design/images/docking/right.gif | Bin .../com/fr/design/images/docking/right.png | Bin .../src/com/fr/design/images/docking/up.gif | Bin .../com/fr/design/images/edit/deleteRow.png | Bin .../src/com/fr/design/images/edit/format.png | Bin .../com/fr/design/images/edit/insertRow_B.png | Bin .../src/com/fr/design/images/expand/asc.png | Bin .../fr/design/images/expand/asc_selected.png | Bin .../com/fr/design/images/expand/cellAttr.gif | Bin .../src/com/fr/design/images/expand/des.png | Bin .../fr/design/images/expand/des_selected.png | Bin .../com/fr/design/images/expand/landspace.png | Bin .../images/expand/landspace_selected@1x.png | Bin .../com/fr/design/images/expand/none16x16.png | Bin .../images/expand/none16x16_selected@1x.png | Bin .../com/fr/design/images/expand/vertical.png | Bin .../images/expand/vertical_selected@1x.png | Bin .../src/com/fr/design/images/file/disk.gif | Bin .../src/com/fr/design/images/file/disk.png | Bin .../src/com/fr/design/images/file/fold.png | Bin .../src/com/fr/design/images/file/folder.gif | Bin .../src/com/fr/design/images/file/gifFile.gif | Bin .../src/com/fr/design/images/file/jpgFile.gif | Bin .../com/fr/design/images/file/newfolder.png | Bin .../src/com/fr/design/images/file/nostar.png | Bin .../src/com/fr/design/images/file/pngFile.png | Bin .../src/com/fr/design/images/file/star.png | Bin .../src/com/fr/design/images/form/Button.gif | Bin .../com/fr/design/images/form/CheckBox.gif | Bin .../src/com/fr/design/images/form/Choice.gif | Bin .../src/com/fr/design/images/form/List.gif | Bin .../com/fr/design/images/form/RadioButton.gif | Bin .../com/fr/design/images/form/TextField.gif | Bin .../adapters/container/bottom_border.png | Bin .../adapters/container/bottom_border_.png | Bin .../beans/adapters/container/bottom_left.png | Bin .../beans/adapters/container/bottom_left_.png | Bin .../beans/adapters/container/bottom_right.png | Bin .../adapters/container/bottom_right_.png | Bin .../adapters/container/control_close.png | Bin .../adapters/container/control_close_.png | Bin .../beans/adapters/container/control_max.png | Bin .../beans/adapters/container/control_max_.png | Bin .../beans/adapters/container/control_min.png | Bin .../beans/adapters/container/control_min_.png | Bin .../beans/adapters/container/controls.png | Bin .../beans/adapters/container/controls_.png | Bin .../beans/adapters/container/left_border.png | Bin .../beans/adapters/container/left_border_.png | Bin .../beans/adapters/container/right_border.png | Bin .../adapters/container/right_border_.png | Bin .../beans/adapters/container/title_pane.png | Bin .../beans/adapters/container/top_border.png | Bin .../beans/adapters/container/top_border_.png | Bin .../beans/adapters/container/top_left.png | Bin .../beans/adapters/container/top_left_.png | Bin .../beans/adapters/container/top_right.png | Bin .../beans/adapters/container/top_right_.png | Bin .../images/form/designer/bottom_align.png | Bin .../images/form/designer/center_align.png | Bin .../images/form/designer/cursor/add.png | Bin .../form/designer/cursor/connectorcursor.png | Bin .../images/form/designer/cursor/move.png | Bin .../design/images/form/designer/drop_down.png | Bin .../design/images/form/designer/drop_over.png | Bin .../design/images/form/designer/drop_up.png | Bin .../fr/design/images/form/designer/holder.png | Bin .../images/form/designer/left_align.png | Bin .../images/form/designer/middle_align.png | Bin .../images/form/designer/properties/minus.png | Bin .../images/form/designer/properties/plus.png | Bin .../images/form/designer/right_align.png | Bin .../images/form/designer/same_height.png | Bin .../images/form/designer/same_width.png | Bin .../design/images/form/designer/top_align.png | Bin .../src/com/fr/design/images/form/hover.png | Bin .../com/fr/design/images/form/parameter.png | Bin .../design/images/form/toolbar/Chart-Map.png | Bin .../images/form/toolbar/ChartF-Area.png | Bin .../design/images/form/toolbar/ChartF-Bar.png | Bin .../images/form/toolbar/ChartF-Column.png | Bin .../images/form/toolbar/ChartF-Comb_Chart.png | Bin .../images/form/toolbar/ChartF-Donut.png | Bin .../images/form/toolbar/ChartF-Funnel.png | Bin .../images/form/toolbar/ChartF-Gantt.png | Bin .../design/images/form/toolbar/ChartF-Gis.png | Bin .../images/form/toolbar/ChartF-Line.png | Bin .../images/form/toolbar/ChartF-Meter.png | Bin .../design/images/form/toolbar/ChartF-Pie.png | Bin .../images/form/toolbar/ChartF-Radar.png | Bin .../form/toolbar/ChartF-Range_Chart.png | Bin .../images/form/toolbar/ChartF-Stock.png | Bin .../images/form/toolbar/ChartF-XYScatter.png | Bin .../images/form/toolbar/Chart_BubbleChart.png | Bin .../toolbar/FR-Chart-Chart_BubbleChart.png | Bin .../fr/design/images/form/toolbar/default.png | Bin .../design/images/form/toolbar/ec_columns.png | Bin .../design/images/form/toolbar/ec_frozen.png | Bin .../src/com/fr/design/images/gc.png | Bin .../fr/design/images/general/close-rolver.png | Bin .../com/fr/design/images/general/close.png | Bin .../fr/design/images/general/mini-rolver.png | Bin .../src/com/fr/design/images/general/mini.png | Bin .../design/images/general/resize-rolver.png | Bin .../com/fr/design/images/general/resize.png | Bin .../src/com/fr/design/images/gui/blank.gif | Bin .../src/com/fr/design/images/gui/bmpFile.gif | Bin .../src/com/fr/design/images/gui/cell.gif | Bin .../src/com/fr/design/images/gui/cht.png | Bin .../com/fr/design/images/gui/chtlocked.png | Bin .../com/fr/design/images/gui/classFile.gif | Bin .../src/com/fr/design/images/gui/close.png | Bin .../fr/design/images/gui/color/background.png | Bin .../fr/design/images/gui/color/foreground.png | Bin .../design/images/gui/color/foreground2.png | Bin .../images/gui/colorPicker/colorPicker16.png | Bin .../images/gui/colorPicker/colorPicker18.png | Bin .../gui/colorPicker/colorPickerFrame.png | Bin .../src/com/fr/design/images/gui/cptFile.png | Bin .../design/images/gui/documentFolderClose.gif | Bin .../src/com/fr/design/images/gui/folder.gif | Bin .../src/com/fr/design/images/gui/folder.png | Bin .../fr/design/images/gui/folder/expanded.png | Bin .../fr/design/images/gui/folder/foldered.png | Bin .../images/gui/folder/hovered_expanded.png | Bin .../images/gui/folder/hovered_foldered.png | Bin .../src/com/fr/design/images/gui/frm.png | Bin .../com/fr/design/images/gui/frmlocked.png | Bin .../src/com/fr/design/images/gui/gifFile.gif | Bin .../src/com/fr/design/images/gui/htmlFile.gif | Bin .../src/com/fr/design/images/gui/jarFile.gif | Bin .../src/com/fr/design/images/gui/javaFile.gif | Bin .../src/com/fr/design/images/gui/jpgFile.gif | Bin .../src/com/fr/design/images/gui/jsFile.gif | Bin .../src/com/fr/design/images/gui/jspFile.gif | Bin .../src/com/fr/design/images/gui/locked.gif | Bin .../src/com/fr/design/images/gui/minimize.gif | Bin .../src/com/fr/design/images/gui/pngFile.png | Bin .../src/com/fr/design/images/gui/popup.gif | Bin .../com/fr/design/images/gui/popupCenter.png | Bin .../com/fr/design/images/gui/popupLarge.gif | Bin .../fr/design/images/gui/tab_add_click.png | Bin .../fr/design/images/gui/tab_add_hover.png | Bin .../fr/design/images/gui/tab_add_normal.png | Bin .../com/fr/design/images/gui/tab_delete.png | Bin .../src/com/fr/design/images/gui/textFile.png | Bin .../src/com/fr/design/images/gui/warning.png | Bin .../src/com/fr/design/images/gui/xmlFile.gif | Bin .../src/com/fr/design/images/help.png | Bin .../com/fr/design/images/load/busy-icon0.png | Bin .../com/fr/design/images/load/busy-icon1.png | Bin .../com/fr/design/images/load/busy-icon10.png | Bin .../com/fr/design/images/load/busy-icon11.png | Bin .../com/fr/design/images/load/busy-icon12.png | Bin .../com/fr/design/images/load/busy-icon13.png | Bin .../com/fr/design/images/load/busy-icon14.png | Bin .../com/fr/design/images/load/busy-icon2.png | Bin .../com/fr/design/images/load/busy-icon3.png | Bin .../com/fr/design/images/load/busy-icon4.png | Bin .../com/fr/design/images/load/busy-icon5.png | Bin .../com/fr/design/images/load/busy-icon6.png | Bin .../com/fr/design/images/load/busy-icon7.png | Bin .../com/fr/design/images/load/busy-icon8.png | Bin .../com/fr/design/images/load/busy-icon9.png | Bin .../src/com/fr/design/images/log/clear.png | Bin .../com/fr/design/images/log/selectedall.png | Bin .../src/com/fr/design/images/log/setting.png | Bin .../images/lookandfeel/ComboBoxFocus.png | Bin .../images/lookandfeel/ComputerIcon.png | Bin .../images/lookandfeel/DirectoryIcon.png | Bin .../design/images/lookandfeel/ErrorIcon.png | Bin .../images/lookandfeel/FileDetailsIcon.png | Bin .../fr/design/images/lookandfeel/FileIcon.png | Bin .../images/lookandfeel/FileListIcon.png | Bin .../design/images/lookandfeel/FloppyIcon.png | Bin .../images/lookandfeel/HarddiskIcon.png | Bin .../images/lookandfeel/HomeFolderIcon.png | Bin .../images/lookandfeel/InformationIcon.png | Bin .../images/lookandfeel/InternalFrameIcon.png | Bin .../images/lookandfeel/NewFolderIcon.png | Bin .../lookandfeel/ParentDirectoryIcon.png | Bin .../images/lookandfeel/QuestionIcon.png | Bin .../lookandfeel/TreeFolderClosedIcon.png | Bin .../lookandfeel/TreeFolderOpenedIcon.png | Bin .../images/lookandfeel/TreeLeafIcon.png | Bin .../images/lookandfeel/TreeMinusIcon.png | Bin .../images/lookandfeel/TreePlusIcon.png | Bin .../design/images/lookandfeel/WarningIcon.png | Bin .../design/images/lookandfeel/brightmask.png | Bin .../fr/design/images/m_edit/bringForward.png | Bin .../fr/design/images/m_edit/bringToFront.png | Bin .../src/com/fr/design/images/m_edit/copy.png | Bin .../src/com/fr/design/images/m_edit/cut.png | Bin .../fr/design/images/m_edit/directShare.png | Bin .../fr/design/images/m_edit/formatBrush.png | Bin .../src/com/fr/design/images/m_edit/merge.png | Bin .../fr/design/images/m_edit/modifyShare.png | Bin .../src/com/fr/design/images/m_edit/paste.png | Bin .../fr/design/images/m_edit/pluralundo.png | Bin .../src/com/fr/design/images/m_edit/redo.png | Bin .../fr/design/images/m_edit/sendBackward.png | Bin .../fr/design/images/m_edit/sendToBack.png | Bin .../src/com/fr/design/images/m_edit/share.png | Bin .../src/com/fr/design/images/m_edit/undo.png | Bin .../com/fr/design/images/m_edit/unmerge.png | Bin .../src/com/fr/design/images/m_file/close.png | Bin .../fr/design/images/m_file/crossTable.png | Bin .../src/com/fr/design/images/m_file/csv.png | Bin .../com/fr/design/images/m_file/design.png | Bin .../fr/design/images/m_file/design_large.png | Bin .../src/com/fr/design/images/m_file/edit.png | Bin .../src/com/fr/design/images/m_file/excel.png | Bin .../com/fr/design/images/m_file/export.png | Bin .../fr/design/images/m_file/formExport.png | Bin .../fr/design/images/m_file/groupTable.png | Bin .../src/com/fr/design/images/m_file/help.png | Bin .../src/com/fr/design/images/m_file/html.png | Bin .../com/fr/design/images/m_file/hyperLink.png | Bin .../com/fr/design/images/m_file/import.png | Bin .../src/com/fr/design/images/m_file/merge.png | Bin .../src/com/fr/design/images/m_file/new.png | Bin .../src/com/fr/design/images/m_file/open.png | Bin .../com/fr/design/images/m_file/pageSetup.png | Bin .../src/com/fr/design/images/m_file/pdf.png | Bin .../com/fr/design/images/m_file/preview.png | Bin .../src/com/fr/design/images/m_file/print.png | Bin .../src/com/fr/design/images/m_file/save.png | Bin .../com/fr/design/images/m_file/saveAs.png | Bin .../src/com/fr/design/images/m_file/svg.png | Bin .../com/fr/design/images/m_file/switch.png | Bin .../src/com/fr/design/images/m_file/text.png | Bin .../fr/design/images/m_file/view_folder.png | Bin .../src/com/fr/design/images/m_file/web.png | Bin .../src/com/fr/design/images/m_file/word.png | Bin .../fr/design/images/m_format/allborders.png | Bin .../com/fr/design/images/m_format/border.png | Bin .../com/fr/design/images/m_format/bottom.png | Bin .../com/fr/design/images/m_format/cell.png | Bin .../fr/design/images/m_format/cellAttr.png | Bin .../design/images/m_format/cellWriteAttr.png | Bin .../design/images/m_format/cellstyle/bold.png | Bin .../images/m_format/cellstyle/bold_white.png | Bin .../m_format/cellstyle/bottom_white.png | Bin .../m_format/cellstyle/centerAlignment.png | Bin .../images/m_format/cellstyle/default.png | Bin .../m_format/cellstyle/defaultAlignment.png | Bin .../cellstyle/defaultAlignment_white.png | Bin .../m_format/cellstyle/generalAlignment.png | Bin .../m_format/cellstyle/h_center_normal.png | Bin .../cellstyle/h_center_normal_white.png | Bin .../m_format/cellstyle/h_center_pressed.png | Bin .../m_format/cellstyle/h_left_normal.png | Bin .../cellstyle/h_left_normal_white.png | Bin .../m_format/cellstyle/h_left_pressed.png | Bin .../m_format/cellstyle/h_right_normal.png | Bin .../cellstyle/h_right_normal_white.png | Bin .../m_format/cellstyle/h_right_pressed.png | Bin .../images/m_format/cellstyle/h_s_normal.png | Bin .../m_format/cellstyle/h_s_normal_white.png | Bin .../images/m_format/cellstyle/h_s_pressed.png | Bin .../m_format/cellstyle/horizontal_white.png | Bin .../images/m_format/cellstyle/in_white.png | Bin .../images/m_format/cellstyle/italic.png | Bin .../m_format/cellstyle/italic_white.png | Bin .../m_format/cellstyle/leftAlignment.png | Bin .../images/m_format/cellstyle/left_white.png | Bin .../images/m_format/cellstyle/otherset.png | Bin .../images/m_format/cellstyle/out_white.png | Bin .../m_format/cellstyle/rightAlignment.png | Bin .../images/m_format/cellstyle/right_white.png | Bin .../images/m_format/cellstyle/shadow.png | Bin .../m_format/cellstyle/strikethrough.png | Bin .../design/images/m_format/cellstyle/sub.png | Bin .../design/images/m_format/cellstyle/sup.png | Bin .../images/m_format/cellstyle/top_white.png | Bin .../images/m_format/cellstyle/underline.png | Bin .../m_format/cellstyle/underline_white.png | Bin .../m_format/cellstyle/v_center_normal.png | Bin .../cellstyle/v_center_normal_white.png | Bin .../m_format/cellstyle/v_center_pressed.png | Bin .../m_format/cellstyle/v_down_normal.png | Bin .../cellstyle/v_down_normal_white.png | Bin .../m_format/cellstyle/v_down_pressed.png | Bin .../m_format/cellstyle/v_top_normal.png | Bin .../m_format/cellstyle/v_top_normal_white.png | Bin .../m_format/cellstyle/v_top_pressed.png | Bin .../m_format/cellstyle/vertical_white.png | Bin .../design/images/m_format/doublebottom.png | Bin .../fr/design/images/m_format/editChart.png | Bin .../fr/design/images/m_format/highlight.png | Bin .../src/com/fr/design/images/m_format/in.png | Bin .../com/fr/design/images/m_format/left.png | Bin .../fr/design/images/m_format/modified.png | Bin .../com/fr/design/images/m_format/noboder.png | Bin .../com/fr/design/images/m_format/note.png | Bin .../src/com/fr/design/images/m_format/out.png | Bin .../design/images/m_format/outsideborders.png | Bin .../com/fr/design/images/m_format/right.png | Bin .../com/fr/design/images/m_format/shape.png | Bin .../fr/design/images/m_format/thickbottom.png | Bin .../images/m_format/thickoutsideborders.png | Bin .../images/m_format/topanddoublebotttom.png | Bin .../images/m_format/topandthickbottom.png | Bin .../fr/design/images/m_format/topbottom.png | Bin .../src/com/fr/design/images/m_help/back.png | Bin .../src/com/fr/design/images/m_help/demo.png | Bin .../com/fr/design/images/m_help/feedback.png | Bin .../src/com/fr/design/images/m_help/forum.png | Bin .../com/fr/design/images/m_help/forward.png | Bin .../src/com/fr/design/images/m_help/help.png | Bin .../fr/design/images/m_help/preview_analy.png | Bin .../fr/design/images/m_help/preview_form.png | Bin .../fr/design/images/m_help/preview_page.png | Bin .../fr/design/images/m_help/preview_write.png | Bin .../fr/design/images/m_help/product_forum.png | Bin .../fr/design/images/m_help/support_qq.png | Bin .../fr/design/images/m_insert/Pivottable.gif | Bin .../com/fr/design/images/m_insert/account.png | Bin .../design/images/m_insert/accountTitle.png | Bin .../com/fr/design/images/m_insert/barcode.png | Bin .../com/fr/design/images/m_insert/bias.png | Bin .../fr/design/images/m_insert/bindCell.png | Bin .../fr/design/images/m_insert/bindColumn.png | Bin .../com/fr/design/images/m_insert/blank.gif | Bin .../com/fr/design/images/m_insert/boolean.png | Bin .../com/fr/design/images/m_insert/cell.png | Bin .../com/fr/design/images/m_insert/cellPop.png | Bin .../com/fr/design/images/m_insert/chart.png | Bin .../fr/design/images/m_insert/composite.png | Bin .../design/images/m_insert/compositePop.png | Bin .../fr/design/images/m_insert/crossTable.png | Bin .../com/fr/design/images/m_insert/date.png | Bin .../com/fr/design/images/m_insert/default.png | Bin .../fr/design/images/m_insert/expandCell.gif | Bin .../com/fr/design/images/m_insert/float.png | Bin .../fr/design/images/m_insert/floatPop.png | Bin .../com/fr/design/images/m_insert/formula.png | Bin .../fr/design/images/m_insert/groupTable.png | Bin .../fr/design/images/m_insert/hyperLink.png | Bin .../com/fr/design/images/m_insert/image.png | Bin .../design/images/m_insert/insertColumn.png | Bin .../fr/design/images/m_insert/insertRow.png | Bin .../fr/design/images/m_insert/newchart.png | Bin .../fr/design/images/m_insert/richtext.png | Bin .../com/fr/design/images/m_insert/shape.png | Bin .../m_insert/shape_issosceles_triangle.png | Bin .../fr/design/images/m_insert/shape_line.png | Bin .../fr/design/images/m_insert/shape_oval.png | Bin .../images/m_insert/shape_rectangle.png | Bin .../m_insert/shape_rounded_rectangle.png | Bin .../fr/design/images/m_insert/subReport.png | Bin .../com/fr/design/images/m_insert/text.png | Bin .../com/fr/design/images/m_insert/textBox.png | Bin .../images/m_report/allow_authority_edit.png | Bin .../fr/design/images/m_report/attributes.png | Bin .../fr/design/images/m_report/background.png | Bin .../fr/design/images/m_report/bindData.png | Bin .../com/fr/design/images/m_report/close.png | Bin .../fr/design/images/m_report/close_over.png | Bin .../fr/design/images/m_report/close_press.png | Bin .../com/fr/design/images/m_report/delete.png | Bin .../design/images/m_report/deleteColumn.png | Bin .../fr/design/images/m_report/deleteRow.png | Bin .../images/m_report/exit_authority_edit.png | Bin .../fr/design/images/m_report/exportAttr.png | Bin .../com/fr/design/images/m_report/footer.png | Bin .../com/fr/design/images/m_report/header.png | Bin .../fr/design/images/m_report/linearAttr.png | Bin .../com/fr/design/images/m_report/mobile.png | Bin .../src/com/fr/design/images/m_report/p.gif | Bin .../src/com/fr/design/images/m_report/p.png | Bin .../fr/design/images/m_report/parameter.png | Bin .../com/fr/design/images/m_report/process.gif | Bin .../src/com/fr/design/images/m_report/qb.png | Bin .../images/m_report/reportEngineAttr.png | Bin .../images/m_report/reportWorkFlowAttr.png | Bin .../images/m_report/reportWriteAttr.png | Bin .../com/fr/design/images/m_report/tree.png | Bin .../images/m_report/webreportattribute.png | Bin .../src/com/fr/design/images/m_web/cache.png | Bin .../com/fr/design/images/m_web/connection.png | Bin .../com/fr/design/images/m_web/datasource.png | Bin .../src/com/fr/design/images/m_web/edit.png | Bin .../src/com/fr/design/images/m_web/face.gif | Bin .../com/fr/design/images/m_web/formula.png | Bin .../com/fr/design/images/m_web/function.png | Bin .../src/com/fr/design/images/m_web/log.png | Bin .../design/images/m_web/privilegeManager.gif | Bin .../fr/design/images/m_web/reportletdemo.png | Bin .../com/fr/design/images/m_web/schedule.png | Bin .../src/com/fr/design/images/m_web/server.png | Bin .../src/com/fr/design/images/m_web/style.png | Bin .../src/com/fr/design/images/m_web/sync.png | Bin .../com/fr/design/images/m_window/cascade.png | Bin .../fr/design/images/m_window/formdesign.png | Bin .../com/fr/design/images/m_window/frozen.png | Bin .../design/images/m_window/generaldesign.png | Bin .../com/fr/design/images/m_window/next.png | Bin .../fr/design/images/m_window/previous.png | Bin .../fr/design/images/m_window/title_hor.png | Bin .../fr/design/images/m_window/title_ver.png | Bin .../fr/design/images/mainframe/attribute.png | Bin .../com/fr/design/images/mainframe/class.png | Bin .../fr/design/images/mainframe/datasource.png | Bin .../com/fr/design/images/mainframe/fpt.png | Bin .../com/fr/design/images/mainframe/jar.png | Bin .../com/fr/design/images/mainframe/java.png | Bin .../com/fr/design/images/mainframe/server.png | Bin .../com/fr/design/images/mainframe/xml.png | Bin .../src/com/fr/design/images/minimize.gif | Bin .../src/com/fr/design/images/need.png | Bin .../src/com/fr/design/images/parameter.png | Bin .../images/poly/Chart-Map/Chart-Map-0.png | Bin .../images/poly/ChartF-Area/ChartF-Area-0.png | Bin .../images/poly/ChartF-Area/ChartF-Area-1.png | Bin .../images/poly/ChartF-Area/ChartF-Area-2.png | Bin .../images/poly/ChartF-Area/ChartF-Area-3.png | Bin .../images/poly/ChartF-Area/ChartF-Area-4.png | Bin .../images/poly/ChartF-Area/ChartF-Area-5.png | Bin .../images/poly/ChartF-Bar/ChartF-Bar-0.png | Bin .../images/poly/ChartF-Bar/ChartF-Bar-1.png | Bin .../images/poly/ChartF-Bar/ChartF-Bar-2.png | Bin .../images/poly/ChartF-Bar/ChartF-Bar-3.png | Bin .../images/poly/ChartF-Bar/ChartF-Bar-4.png | Bin .../images/poly/ChartF-Bar/ChartF-Bar-5.png | Bin .../images/poly/ChartF-Bar/ChartF-Bar-6.png | Bin .../poly/ChartF-Column/ChartF-Column-0.png | Bin .../poly/ChartF-Column/ChartF-Column-1.png | Bin .../poly/ChartF-Column/ChartF-Column-2.png | Bin .../poly/ChartF-Column/ChartF-Column-3.png | Bin .../poly/ChartF-Column/ChartF-Column-4.png | Bin .../poly/ChartF-Column/ChartF-Column-5.png | Bin .../poly/ChartF-Column/ChartF-Column-6.png | Bin .../ChartF-Comb_Chart/ChartF-Comb_Chart-0.png | Bin .../ChartF-Comb_Chart/ChartF-Comb_Chart-1.png | Bin .../poly/ChartF-Donut/ChartF-Donut-0.png | Bin .../poly/ChartF-Donut/ChartF-Donut-1.png | Bin .../poly/ChartF-Gantt/ChartF-Gantt-0.png | Bin .../poly/ChartF-Gantt/ChartF-Gantt-1.png | Bin .../poly/ChartF-Gantt/ChartF-Gantt-2.png | Bin .../poly/ChartF-Gantt/ChartF-Gantt-3.png | Bin .../images/poly/ChartF-Gis/ChartF-Gis-0.png | Bin .../images/poly/ChartF-Line/ChartF-Line-0.png | Bin .../images/poly/ChartF-Line/ChartF-Line-1.png | Bin .../images/poly/ChartF-Line/ChartF-Line-2.png | Bin .../images/poly/ChartF-Line/ChartF-Line-3.png | Bin .../images/poly/ChartF-Line/ChartF-Line-4.png | Bin .../images/poly/ChartF-Line/ChartF-Line-5.png | Bin .../poly/ChartF-Meter/ChartF-Meter-0.png | Bin .../poly/ChartF-Meter/ChartF-Meter-1.png | Bin .../images/poly/ChartF-Pie/ChartF-Pie-0.png | Bin .../images/poly/ChartF-Pie/ChartF-Pie-1.png | Bin .../images/poly/ChartF-Pie/ChartF-Pie-2.png | Bin .../images/poly/ChartF-Pie/ChartF-Pie-3.png | Bin .../images/poly/ChartF-Pie/ChartF-Pie-4.png | Bin .../images/poly/ChartF-Pie/ChartF-Pie-5.png | Bin .../poly/ChartF-Radar/ChartF-Radar-0.png | Bin .../poly/ChartF-Radar/ChartF-Radar-1.png | Bin .../poly/ChartF-Radar/ChartF-Radar-2.png | Bin .../poly/ChartF-Radar/ChartF-Radar-3.png | Bin .../ChartF-Range_Chart-0.png | Bin .../poly/ChartF-Stock/ChartF-Stock-0.png | Bin .../poly/ChartF-Stock/ChartF-Stock-1.png | Bin .../poly/ChartF-Stock/ChartF-Stock-2.png | Bin .../poly/ChartF-Stock/ChartF-Stock-3.png | Bin .../ChartF-XYScatter/ChartF-XYScatter-0.png | Bin .../ChartF-XYScatter/ChartF-XYScatter-1.png | Bin .../ChartF-XYScatter/ChartF-XYScatter-2.png | Bin .../Chart_BubbleChart/Chart_BubbleChart-0.png | Bin .../FR-Chart-Chart_BubbleChart-0.png | Bin .../src/com/fr/design/images/poly/normal.png | Bin .../design/images/poly/toolbar/Chart-Map.png | Bin .../images/poly/toolbar/Chart-SVG_MAP.png | Bin .../images/poly/toolbar/ChartF-Area.png | Bin .../design/images/poly/toolbar/ChartF-Bar.png | Bin .../images/poly/toolbar/ChartF-Column.png | Bin .../images/poly/toolbar/ChartF-Comb_Chart.png | Bin .../images/poly/toolbar/ChartF-Donut.png | Bin .../images/poly/toolbar/ChartF-Funnel.png | Bin .../images/poly/toolbar/ChartF-Gantt.png | Bin .../design/images/poly/toolbar/ChartF-Gis.png | Bin .../images/poly/toolbar/ChartF-Line.png | Bin .../images/poly/toolbar/ChartF-Meter.png | Bin .../design/images/poly/toolbar/ChartF-Pie.png | Bin .../images/poly/toolbar/ChartF-Radar.png | Bin .../poly/toolbar/ChartF-Range_Chart.png | Bin .../images/poly/toolbar/ChartF-Stock.png | Bin .../images/poly/toolbar/ChartF-XYScatter.png | Bin .../images/poly/toolbar/Chart_BubbleChart.png | Bin .../images/poly/toolbar/FR-Chart-Bit_Map.png | Bin .../toolbar/FR-Chart-Chart_BubbleChart.png | Bin .../toolbar/FR-Chart-ThreeD_Custom_Chart.png | Bin .../images/poly/toolbar/FR-Chart_Bit_Map.png | Bin .../poly/toolbar/Plugin-ChartF_NewArea.png | Bin .../poly/toolbar/Plugin-ChartF_NewBar.png | Bin .../poly/toolbar/Plugin-ChartF_NewColumn.png | Bin .../poly/toolbar/Plugin-ChartF_NewLine.png | Bin .../poly/toolbar/Plugin-ChartF_NewPie.png | Bin .../toolbar/Plugin-ChartF_VerticalLine.png | Bin .../images/poly/toolbar/Poly-Report_Block.png | Bin .../src/com/fr/design/images/questions.png | Bin .../src/com/fr/design/images/report/form.png | Bin .../fr/design/images/report/groupReport.png | Bin .../com/fr/design/images/report/position.png | Bin .../fr/design/images/reportcolumns/col.png | Bin .../fr/design/images/reportcolumns/col_en.png | Bin .../fr/design/images/reportcolumns/row.png | Bin .../fr/design/images/reportcolumns/row_en.png | Bin .../com/fr/design/images/server/change.png | Bin .../com/fr/design/images/server/manage.png | Bin .../design/images/server/platform_16_16.png | Bin .../com/fr/design/images/server/plugin.png | Bin .../fr/design/images/server/printerconf.png | Bin .../src/com/fr/design/images/server/start.png | Bin .../src/com/fr/design/images/server/stop.png | Bin .../src/com/fr/design/images/server/view.png | Bin .../src/com/fr/design/images/serverM/fs.png | Bin .../src/com/fr/design/images/serverM/org.png | Bin .../fr/design/images/serverM/organization.png | Bin .../src/com/fr/design/images/serverM/role.png | Bin .../com/fr/design/images/serverM/roleAdd.png | Bin .../fr/design/images/serverM/roleRemove.png | Bin .../src/com/fr/design/images/serverM/rtr.png | Bin .../src/com/fr/design/images/serverM/use.png | Bin .../src/com/fr/design/images/serverM/user.png | Bin .../fr/design/images/sheet/addpolysheet.png | Bin .../fr/design/images/sheet/left_hover@1x.png | Bin .../fr/design/images/sheet/left_normal@1x.png | Bin .../fr/design/images/sheet/left_right_btn.png | Bin .../com/fr/design/images/sheet/polysheet.png | Bin .../fr/design/images/sheet/right_hover@1x.png | Bin .../design/images/sheet/right_normal@1x.png | Bin .../src/com/fr/design/images/signature.png | Bin .../com/fr/design/images/toolbarbtn/chart.png | Bin .../images/toolbarbtn/chartChangeClose.png | Bin .../com/fr/design/images/toolbarbtn/close.png | Bin .../design/images/toolbarbtn/close_tags.png | Bin .../design/images/toolbarbtn/closehover.png | Bin .../fr/design/images/toolbarbtn/connector.png | Bin .../com/fr/design/images/toolbarbtn/down.png | Bin .../images/toolbarbtn/parameter-hover.png | Bin .../images/toolbarbtn/parametersetting.png | Bin .../com/fr/design/images/toolbarbtn/pop.gif | Bin .../fr/design/images/toolbarbtn/setting.png | Bin .../images/toolbarbtn/toolbarbtnclear.png | Bin .../images/toolbarbtn/toolbarbtnsetting.png | Bin .../com/fr/design/images/toolbarbtn/up.png | Bin .../com/fr/design/images/toolbarbtn/xiala.png | Bin .../src/com/fr/design/images/tree/close.png | Bin .../src/com/fr/design/images/tree/open.png | Bin .../src/com/fr/design/images/update.png | Bin .../src/com/fr/design/images/video.png | Bin .../src/com/fr/design/images/wait.gif | Bin .../fr/design/images/warnings/warning 2.png | Bin .../com/fr/design/images/warnings/warning.png | Bin .../fr/design/images/warnings/warning3.png | Bin .../design/insert/formula/variable/cn/$$$.txt | 0 .../formula/variable/cn/$$page_number.txt | 0 .../variable/cn/$$totalPage_number.txt | 0 .../formula/variable/cn/$fr_authority.txt | 0 .../formula/variable/cn/$fr_username.txt | 0 .../formula/variable/cn/$fr_userposition.txt | 0 .../insert/formula/variable/cn/NOFILTER.txt | 0 .../insert/formula/variable/cn/NULL.txt | 0 .../formula/variable/cn/contextPath.txt | 0 .../insert/formula/variable/cn/curReport.txt | 0 .../formula/variable/cn/formletName.txt | 0 .../formula/variable/cn/fr_submitinfo.txt | 0 .../insert/formula/variable/cn/reportName.txt | 0 .../insert/formula/variable/cn/serverName.txt | 0 .../insert/formula/variable/cn/serverPort.txt | 0 .../formula/variable/cn/serverSchema.txt | 0 .../insert/formula/variable/cn/serverURL.txt | 0 .../insert/formula/variable/cn/servletURL.txt | 0 .../insert/formula/variable/cn/sessionID.txt | 0 .../design/insert/formula/variable/en/$$$.txt | 0 .../formula/variable/en/$$page_number.txt | 0 .../variable/en/$$totalPage_number.txt | 0 .../formula/variable/en/$fr_authority.txt | 0 .../formula/variable/en/$fr_username.txt | 0 .../formula/variable/en/$fr_userposition.txt | 0 .../insert/formula/variable/en/NOFILTER.txt | 0 .../insert/formula/variable/en/NULL.txt | 0 .../formula/variable/en/contextPath.txt | 0 .../insert/formula/variable/en/curReport.txt | 0 .../formula/variable/en/formletName.txt | 0 .../formula/variable/en/fr_submitinfo.txt | 0 .../insert/formula/variable/en/reportName.txt | 0 .../insert/formula/variable/en/serverName.txt | 0 .../insert/formula/variable/en/serverPort.txt | 0 .../formula/variable/en/serverSchema.txt | 0 .../insert/formula/variable/en/serverURL.txt | 0 .../insert/formula/variable/en/servletURL.txt | 0 .../insert/formula/variable/en/sessionID.txt | 0 .../javascript/Commit2DBJavaScriptPane.java | 164 + .../design/javascript/CustomActionPane.java | 0 .../com/fr/design/javascript/EmailPane.java | 154 + .../javascript/FormSubmitJavaScriptPane.java | 135 + .../fr/design/javascript/JSContentPane.java | 0 .../javascript/JavaScriptActionPane.java | 197 + .../design/javascript/JavaScriptImplPane.java | 231 + .../javascript/ParameterJavaScriptPane.java | 82 + .../design/javascript/ProcessJSImplPane.java | 0 .../ProcessParameterTableModel.java | 0 .../javascript/ProcessTransitionAdapter.java | 0 .../javascript/beautify/BeautifyOption.java | 0 .../beautify/JavaScriptFormatHelper.java | 0 .../fr/design/javascript/beautify/beautify.js | 0 .../fr/design/layout/FRGUIPaneFactory.java | 519 + .../com/fr/design/layout/FRGridLayout.java | 16 + .../fr/design/layout/FRLeftFlowLayout.java | 85 + .../design/layout/LeftCenterRightLayout.java | 150 + .../src/com/fr/design/layout/TableLayout.java | 2057 ++ .../design/layout/TableLayoutConstraints.java | 231 + .../fr/design/layout/TableLayoutHelper.java | 0 .../com/fr/design/layout/TableLayoutTest.java | 82 + .../fr/design/layout/VerticalFlowLayout.java | 457 + .../design/mainframe/AbstractAppProvider.java | 32 + .../src/com/fr/design/mainframe/App.java | 40 + .../design/mainframe/AuthorityEditPane.java | 0 .../mainframe/AuthorityPropertyPane.java | 0 .../fr/design/mainframe/BaseFormDesigner.java | 0 .../com/fr/design/mainframe/BaseJForm.java | 0 .../fr/design/mainframe/BaseUndoState.java | 0 .../mainframe/BaseWidgetPropertyPane.java | 0 .../com/fr/design/mainframe/DecodeDialog.java | 91 + .../com/fr/design/mainframe/DesignerBean.java | 17 + .../fr/design/mainframe/DesignerContext.java | 156 + .../fr/design/mainframe/DesignerFrame.java | 1027 + .../DesignerFrameFileDealerPane.java | 572 + .../fr/design/mainframe/DesktopCardPane.java | 51 + .../com/fr/design/mainframe/DockingView.java | 0 .../com/fr/design/mainframe/DottedLine.java | 0 .../mainframe/EastRegionContainerPane.java | 1105 + .../fr/design/mainframe/FormScrollBar.java | 156 + .../design/mainframe/HelpDialogHandler.java | 0 .../design/mainframe/HelpDialogManager.java | 0 .../fr/design/mainframe/JFormSliderPane.java | 0 .../com/fr/design/mainframe/JSliderPane.java | 0 .../com/fr/design/mainframe/JTemplate.java | 1112 + .../mainframe/JTemplateActionListener.java | 0 .../design/mainframe/JTemplateProvider.java | 6 + .../fr/design/mainframe/JViewContainer.java | 174 + .../fr/design/mainframe/JVirtualTemplate.java | 0 .../mainframe/NoSupportAuthorityEdit.java | 0 .../fr/design/mainframe/SiteCenterToken.java | 0 .../com/fr/design/mainframe/TemplatePane.java | 278 + .../fr/design/mainframe/UndoStateEdit.java | 74 + .../mainframe/WestRegionContainerPane.java | 57 + .../backgroundpane/BackgroundQuickPane.java | 0 .../ColorBackgroundQuickPane.java | 0 .../GradientBackgroundQuickPane.java | 0 .../ImageBackgroundQuickPane.java | 0 .../backgroundpane/ImagePreviewPane.java | 288 + .../NullBackgroundQuickPane.java | 0 .../PatternBackgroundQuickPane.java | 0 .../TextureBackgroundQuickPane.java | 0 .../dnd/ArrayListTransferHandler.java | 206 + .../mainframe/dnd/ArrayListTransferable.java | 49 + .../mainframe/dnd/ArrayTransferable.java | 33 + .../dnd/SerializableTransferable.java | 64 + .../form/FormECCompositeProvider.java | 17 + .../form/FormECDesignerProvider.java | 92 + .../loghandler/DesignerLogAppender.java | 0 .../loghandler/DesignerLogHandler.java | 344 + .../mainframe/loghandler/DesignerLogImpl.java | 46 + .../mainframe/loghandler/LogDetailPane.java | 30 + .../mainframe/loghandler/LogHandlerBar.java | 186 + .../mainframe/loghandler/LogHandlerBarUI.java | 158 + .../mainframe/loghandler/LogMessageBar.java | 69 + .../templateinfo/TemplateInfoCollector.java | 0 .../templateinfo/TemplateProcessInfo.java | 0 .../AuthorityEditToolBarComponent.java | 0 .../mainframe/toolbar/ToolBarMenuDock.java | 0 .../toolbar/ToolBarMenuDockPlus.java | 0 .../toolbar/UpdateActionManager.java | 0 .../mainframe/toolbar/UpdateActionModel.java | 0 .../mainframe/widget/BasicPropertyPane.java | 0 .../AccessibleBackgroundEditor.java | 0 .../AccessibleDictionaryEditor.java | 0 .../widget/accessibles/AccessibleEditor.java | 0 .../accessibles/AccessibleIconEditor.java | 0 .../AccessibleImgBackgroundEditor.java | 0 .../AccessibleTemplateStyleEditor.java | 0 .../AccessibleTreeModelEditor.java | 0 .../accessibles/BaseAccessibleEditor.java | 0 .../widget/accessibles/RendererField.java | 0 .../widget/accessibles/TemplateStylePane.java | 0 .../accessibles/TemplateStylePreviewPane.java | 0 .../UneditableAccessibleEditor.java | 0 .../editors/AbstractPropertyEditor.java | 79 + .../widget/editors/DataBindingEditor.java | 151 + .../widget/editors/DataTableEditor.java | 84 + .../editors/ExtendedPropertyEditor.java | 0 .../widget/editors/FormattedEditor.java | 76 + .../widget/editors/ITextComponent.java | 0 .../widget/editors/IntegerPropertyEditor.java | 19 + .../widget/editors/PropertyCellEditor.java | 91 + .../editors/ServerDataBindingEditor.java | 13 + .../widget/editors/ServerDataTableEditor.java | 13 + .../widget/editors/StringEditor.java | 66 + .../mainframe/widget/editors/TextField.java | 0 .../widget/editors/WidgetValueEditor.java | 123 + .../widget/renderer/GenericCellRenderer.java | 0 .../widget/renderer/IconCellRenderer.java | 0 .../widget/wrappers/BackgroundWrapper.java | 0 .../widget/wrappers/DictionaryWrapper.java | 0 .../widget/wrappers/IconWrapper.java | 0 .../widget/wrappers/TemplateStyleWrapper.java | 0 .../widget/wrappers/TreeModelWrapper.java | 0 .../com/fr/design/menu/DottedSeparator.java | 75 + .../com/fr/design/menu/DottedSeparatorUI.java | 67 + .../src/com/fr/design/menu/KeySetUtils.java | 1088 + .../src/com/fr/design/menu/LineSeparator.java | 72 + .../src/com/fr/design/menu/MenuDef.java | 435 + .../src/com/fr/design/menu/MenuKeySet.java | 34 + .../src/com/fr/design/menu/MenuManager.java | 56 + .../src/com/fr/design/menu/NameSeparator.java | 97 + .../src/com/fr/design/menu/SeparatorDef.java | 45 + .../src/com/fr/design/menu/ShortCut.java | 74 + .../src/com/fr/design/menu/ToolBarDef.java | 80 + .../fr/design/menu/TwoDottedSeparatorUI.java | 65 + .../src/com/fr/design/menu/UISeparatorUI.java | 58 + .../src/com/fr/design/mingche.java | 0 .../com/fr/design/module/DesignModule.java | 102 + .../fr/design/module/DesignModuleFactory.java | 0 .../src/com/fr/design/object/NameObject.java | 70 + .../parameter/AbstractParameterReader.java | 0 .../design/parameter/HierarchyTreePane.java | 0 .../fr/design/parameter/ParaDefinitePane.java | 0 .../design/parameter/ParameterArrayPane.java | 98 + .../fr/design/parameter/ParameterBridge.java | 0 .../parameter/ParameterDesignerProvider.java | 0 .../fr/design/parameter/ParameterGroup.java | 21 + .../design/parameter/ParameterInputPane.java | 220 + .../parameter/ParameterManagerPane.java | 61 + .../fr/design/parameter/ParameterPane.java | 92 + .../fr/design/parameter/ParameterReader.java | 0 .../fr/design/present/DictPresentPane.java | 53 + .../fr/design/present/FormulaPresentPane.java | 47 + .../fr/design/present/NonePresentPane.java | 38 + .../design/present/dict/AbstractDicPane.java | 10 + .../dict/CustomDictCorrelationPane.java | 32 + .../design/present/dict/CustomDictPane.java | 82 + .../design/present/dict/DatabaseDictPane.java | 300 + .../design/present/dict/DictionaryPane.java | 81 + .../design/present/dict/FormulaDictPane.java | 0 .../present/dict/TableDataDictPane.java | 0 .../com/fr/design/preview/PagePreview.java | 0 .../com/fr/design/preview/ViewPreview.java | 0 .../design/preview/WriteEnhancePreview.java | 0 .../com/fr/design/preview/WritePreview.java | 0 .../fr/design/report/AbstractExportPane.java | 0 .../roleAuthority/ReportAndFSManagePane.java | 0 .../design/roleAuthority/RoleDataWrapper.java | 0 .../fr/design/roleAuthority/RoleSourceOP.java | 0 .../com/fr/design/roleAuthority/RoleTree.java | 0 .../roleAuthority/RolesAlreadyEditedPane.java | 0 .../roleAuthority/RolesEditedSourceOP.java | 0 .../fr/design/roleAuthority/UIRoleTreeUI.java | 26 + .../com/fr/design/scrollruler/BaseRuler.java | 118 + .../design/scrollruler/HorizontalRuler.java | 18 + .../design/scrollruler/HorizontalRulerUI.java | 70 + .../fr/design/scrollruler/ModLineBorder.java | 166 + .../fr/design/scrollruler/RulerLayout.java | 154 + .../com/fr/design/scrollruler/RulerUI.java | 90 + .../scrollruler/ScrollRulerComponent.java | 28 + .../fr/design/scrollruler/VerticalRuler.java | 18 + .../design/scrollruler/VerticalRulerUI.java | 67 + .../com/fr/design/selection/QuickEditor.java | 61 + .../design/selection/SelectableElement.java | 20 + .../com/fr/design/selection/Selectedable.java | 25 + .../fr/design/selection/SelectionEvent.java | 16 + .../design/selection/SelectionListener.java | 14 + .../com/fr/design/style/AbstractPopBox.java | 232 + .../fr/design/style/AbstractSelectBox.java | 147 + .../com/fr/design/style/AlignmentPane.java | 386 + .../src/com/fr/design/style/AlphaPane.java | 124 + .../src/com/fr/design/style/BorderPane.java | 731 + .../com/fr/design/style/ChooseFileView.java | 185 + .../com/fr/design/style/CustomSelectBox.java | 64 + .../src/com/fr/design/style/FRFontPane.java | 404 + .../fr/design/style/FRFontPreviewArea.java | 74 + .../com/fr/design/style/FontFamilyPane.java | 79 + .../fr/design/style/FontSizeStylePane.java | 106 + .../src/com/fr/design/style/FormatBox.java | 208 + .../src/com/fr/design/style/FormatPane.java | 491 + .../background/BackgroundButtonPane.java | 0 .../BackgroundCustomJComponent.java | 66 + .../background/BackgroundDetailPane.java | 0 .../style/background/BackgroundFactory.java | 0 .../background/BackgroundJComponent.java | 44 + .../style/background/BackgroundPane.java | 158 + .../background/BackgroundPane4BoxChange.java | 26 + .../background/BackgroundPane4Browser.java | 0 .../background/BackgroundPreviewLabel.java | 74 + .../background/BackgroundSelectPane.java | 79 + .../BackgroundUIComboBoxNoImagePane.java | 34 + .../background/BackgroundUIComboBoxPane.java | 167 + .../style/background/BackgroundUIWrapper.java | 0 .../background/gradient/FixedGradientBar.java | 0 .../gradient/GradientBackgroundPane.java | 0 .../GradientBackgroundSelectPane.java | 118 + .../background/gradient/GradientBar.java | 307 + .../gradient/GradientChangeBoxPane.java | 129 + .../gradient/GradientFromToPixPane.java | 67 + .../gradient/GradientSelectBox.java | 84 + .../gradient/SelectColorPointBtn.java | 96 + .../background/image/ImageFileChooser.java | 255 + .../background/image/ImagePreviewPane.java | 257 + .../background/image/ImageSelectPane.java | 164 + .../design/style/background/impl/BPane.java | 0 .../background/impl/ColorBackgroundPane.java | 0 .../background/impl/ImageBackgroundPane.java | 0 .../impl/ImageBackgroundPane4Browser.java | 0 .../impl/ImageButtonBackgroundPane.java | 0 .../background/impl/NullBackgroundPane.java | 0 .../impl/PatternBackgroundPane.java | 0 .../impl/PatternBackgroundPaneNoFore.java | 0 .../impl/TextureBackgroundPane.java | 0 .../background/pattern/PatternSelectBox.java | 51 + .../background/pattern/PatternSelectPane.java | 34 + .../pattern/PatternUIComboBoxPane.java | 63 + .../background/texture/TextureSelectBox.java | 51 + .../background/texture/TextureSelectPane.java | 32 + .../texture/TextureUIComboBoxPane.java | 43 + .../com/fr/design/style/color/ColorCell.java | 119 + .../style/color/ColorChooserPreview.java | 203 + .../style/color/ColorControlWindow.java | 81 + .../fr/design/style/color/ColorFactory.java | 75 + .../fr/design/style/color/ColorPicker.java | 0 .../fr/design/style/color/ColorSelectBox.java | 104 + .../style/color/ColorSelectConfigManager.java | 173 + .../ColorSelectConfigManagerProvider.java | 0 .../style/color/ColorSelectDetailPane.java | 104 + .../design/style/color/ColorSelectDialog.java | 179 + .../design/style/color/ColorSelectPane.java | 200 + .../design/style/color/ColorSelectable.java | 15 + .../style/color/ColorUIComboBoxPane.java | 59 + .../style/color/CustomChooserPanel.java | 1079 + .../style/color/DetailColorSelectPane.java | 106 + .../design/style/color/NewColorSelectBox.java | 118 + .../style/color/NewColorSelectPane.java | 205 + .../style/color/PickColorButtonFactory.java | 0 .../style/color/RecentUseColorPane.java | 48 + .../style/color/SwatchChooserPanel.java | 616 + .../color/TransparentColorControlWindow.java | 24 + .../design/style/color/TransparentPane.java | 85 + .../style/color/UIToolbarColorButton.java | 253 + .../fr/design/style/color/UsedColorPane.java | 112 + .../com/fr/design/utils/ColorRoutines.java | 1012 + .../com/fr/design/utils/ComponentUtils.java | 0 .../src/com/fr/design/utils/DesignUtils.java | 521 + .../src/com/fr/design/utils/DrawRoutines.java | 354 + .../src/com/fr/design/utils/ThemeUtils.java | 185 + .../concurrent/ThreadFactoryBuilder.java | 0 .../com/fr/design/utils/gui/GUICoreUtils.java | 847 + .../fr/design/utils/gui/GUIPaintUtils.java | 242 + .../com/fr/design/utils/gui/JListUtils.java | 68 + .../com/fr/design/utils/gui/LayoutUtils.java | 81 + .../src/com/fr/design/web/CustomIconPane.java | 481 + .../src/com/fr/design/widget/Appearance.java | 0 .../src/com/fr/design/widget/DataModify.java | 0 .../com/fr/design/widget/EventCreator.java | 0 .../com/fr/design/widget/IconDefinePane.java | 94 + .../src/com/fr/design/widget/Operator.java | 0 .../widget/WidgetBoundsPaneFactory.java | 0 .../fr/design/widget/btn/ButtonConstants.java | 47 + .../design/widget/btn/ButtonDetailPane.java | 62 + .../btn/ButtonWithHotkeysDetailPane.java | 84 + .../widget/component/BackgroundCompPane.java | 0 .../component/ButtonBackgroundPane.java | 0 .../widget/component/CheckBoxDictPane.java | 0 .../widget/component/DateValuePane.java | 0 .../component/NumberEditorValidatePane.java | 0 .../widget/component/UIComboBoxNoArrow.java | 0 .../fr/design/write/submit/CustomJobPane.java | 0 .../write/submit/CustomSubmitJobPane.java | 19 + .../DBManipulationInWidgetEventPane.java | 37 + .../write/submit/DBManipulationPane.java | 1088 + .../fr/design/write/submit/DMLJobPane.java | 37 + .../write/submit/SubmitJobListPane.java | 63 + designer-base/src/com/fr/env/EnvListPane.java | 593 + designer-base/src/com/fr/env/RemoteEnv.java | 2244 ++ .../src/com/fr/env/RemoteSignInPane.java | 47 + designer-base/src/com/fr/env/SignIn.java | 43 + designer-base/src/com/fr/file/FILE.java | 93 + .../src/com/fr/file/FILEChooserPane.java | 1403 + .../src/com/fr/file/FILEFactory.java | 56 + designer-base/src/com/fr/file/FileFILE.java | 270 + .../src/com/fr/file/FileNodeFILE.java | 414 + designer-base/src/com/fr/file/MemFILE.java | 155 + .../com/fr/file/filter/ChooseFileFilter.java | 260 + .../src/com/fr/file/filter/FILEFilter.java | 27 + .../filter/OnlyShowDirectoryFileFilter.java | 13 + .../com/fr/start/BBSGuestPaneProvider.java | 15 + .../src/com/fr/start/BaseDesigner.java | 161 + designer-base/src/com/fr/start/Demo.java | 49 + .../src/com/fr/start/SplashPane.java | 72 + .../src/com/fr/start/SplashWindow.java | 64 + .../src/com/fr/start/StartDocURL.java | 48 + .../src/com/fr/start/StartServer.java | 232 + .../src/com/fr/start/TomcatFRHost.java | 0 .../src/com/fr/start/server/FRTomcat.java | 0 .../fr/start/server/MultiOutputStream.java | 62 + .../fr/start/server/ServerManageFrame.java | 168 + .../src/com/fr/start/server/ServerTray.java | 207 + .../src/com/fr/start/server/TomcatHost.java | 0 .../fr/start/server/TomcatServerListener.java | 0 designer-chart/.gitignore | 5 + designer-chart/build.chart.gradle | 98 + .../clean.gradle | 0 .../designerchart/TemplateProcessTracker.aj | 0 .../fr/design/ChartTypeInterfaceManager.java | 0 .../com/fr/design/chart/ChartAxisFactory.java | 55 + .../design/chart/ChartCommonWizardPane.java | 22 + .../fr/design/chart/ChartComponentPane.java | 170 + .../com/fr/design/chart/ChartControlPane.java | 128 + .../src/com/fr/design/chart/ChartDialog.java | 103 + .../com/fr/design/chart/ChartPlotFactory.java | 132 + .../com/fr/design/chart/ChartSwingUtils.java | 76 + .../com/fr/design/chart/ChartTypePane.java | 197 + .../com/fr/design/chart/ChartWizardPane.java | 20 + .../com/fr/design/chart/FactoryObject.java | 40 + .../fr/design/chart/axis/AxisStyleObject.java | 29 + .../fr/design/chart/axis/AxisStylePane.java | 17 + .../chart/axis/BinaryChartStyleAxisPane.java | 63 + .../design/chart/axis/ChartAlertLinePane.java | 63 + .../axis/ChartAlertValueInTopBottomPane.java | 20 + .../chart/axis/ChartAlertValuePane.java | 229 + .../design/chart/axis/ChartStyleAxisPane.java | 87 + .../chart/axis/CustomChartStyleAxisPane.java | 19 + .../chart/axis/GanntChartStyleAxisPane.java | 28 + .../fr/design/chart/axis/MinMaxValuePane.java | 204 + .../chart/axis/RadarChartStyleAxisPane.java | 26 + .../chart/axis/TernaryChartStyleAxisPane.java | 42 + .../chart/axis/ValueChartStyleAxisPane.java | 25 + .../chart/axis/XYChartStyleAxisPane.java | 26 + .../fr/design/chart/comp/BorderAttriPane.java | 59 + .../com/fr/design/chart/demo/GlyphDemo.java | 123 + .../chart/fun/IndependentChartUIProvider.java | 0 .../fun/impl/AbstractIndependentChartUI.java | 0 ...bstractIndependentChartUIWithAPILevel.java | 0 .../fun/impl/AbstractIndependentChartsUI.java | 0 .../design/chart/gui/ActiveGlyphFactory.java | 97 + .../fr/design/chart/gui/ChartComponent.java | 334 + .../design/chart/gui/ChartWidgetOption.java | 79 + .../design/chart/gui/active/ActiveGlyph.java | 161 + .../gui/active/AlertValueActiveGlyph.java | 38 + .../chart/gui/active/AxisActiveGlyph.java | 43 + .../gui/active/CategoryAxisActiveGlyph.java | 19 + .../chart/gui/active/ChartActiveGlyph.java | 39 + .../gui/active/DataLabelActiveGlyph.java | 44 + .../gui/active/DataSeriesActiveGlyph.java | 53 + .../gui/active/DataSheetActiveGlyph.java | 30 + .../chart/gui/active/DateAxisActiveGlyph.java | 18 + .../chart/gui/active/LegendActiveGlyph.java | 30 + .../chart/gui/active/PlotActiveGlyph.java | 34 + .../gui/active/RadarAxisActiveGlyph.java | 18 + .../gui/active/RangeAxisActiveGlyph.java | 18 + .../chart/gui/active/TextActiveGlyph.java | 35 + .../gui/active/TrendLineActiveGlyph.java | 43 + .../gui/active/ValueAxisActiveGlyph.java | 19 + .../active/action/ChartComponentAction.java | 47 + .../action/SetAnalysisLineStyleAction.java | 27 + .../gui/active/action/SetAxisStyleAction.java | 33 + .../active/action/SetChartStyleAciton.java | 31 + .../action/SetDataLabelStyleAction.java | 26 + .../action/SetDataSeriesAttrAction.java | 26 + .../gui/active/action/SetDataSheetAction.java | 33 + .../active/action/SetLegendStyleAction.java | 32 + .../gui/active/action/SetPlotStyleAction.java | 32 + .../active/action/SetTitleStyleAction.java | 32 + .../chart/javascript/ChartEmailPane.java | 90 + .../design/chart/report/GisMapDataPane.java | 155 + .../report/GisMapReportDataContentPane.java | 0 .../report/GisMapTableDataContentPane.java | 356 + .../design/chart/report/MapCubeDataPane.java | 76 + .../design/chart/report/MapCubeLayerPane.java | 309 + .../chart/report/MapCubeSetDataPane.java | 130 + .../fr/design/chart/report/MapDataPane.java | 138 + .../chart/report/MapMoreCubeLayerPane.java | 106 + .../chart/report/MapMoreReportIndexPane.java | 0 .../chart/report/MapMoreTableIndexPane.java | 209 + .../chart/report/MapReportCubeDataPane.java | 74 + .../chart/report/MapReportDataSinglePane.java | 226 + .../design/chart/report/MapReportEditor.java | 62 + .../chart/report/MapReportRenderer.java | 32 + .../fr/design/chart/report/MapSinglePane.java | 113 + .../chart/report/MapTableCubeDataPane.java | 110 + .../chart/report/MapTableDataSinglePane.java | 268 + .../PlotSeries/AbstrctMapAttrEditPane.java | 0 .../series/PlotSeries/MapCustomPane.java | 250 + .../PlotSeries/MapDefiAreaNamePane.java | 237 + .../PlotSeries/MapGroupExtensionPane.java | 0 .../series/PlotSeries/MapImageEditPane.java | 763 + .../series/PlotSeries/MapSelectShape.java | 86 + .../PlotSeries/UIGroupExtensionPane.java | 590 + .../series/PlotStyle/ChartSelectDemoPane.java | 166 + .../BubblePlotChartConditionPane.java | 27 + .../SeriesCondition/ChartConditionPane.java | 25 + .../ChartConditionPaneFactory.java | 46 + .../ConditionTrendLinePane.java | 233 + .../DataLabelContentsPane.java | 53 + .../SeriesCondition/DataLabelStylePane.java | 121 + .../DataSeriesAttrCustomPane.java | 25 + .../SeriesCondition/DataSeriesAttrPane.java | 80 + .../DataSeriesConditionPane.java | 191 + .../DataSeriesCustomConditionPane.java | 21 + .../GanttPlotChartConditionPane.java | 21 + .../SeriesCondition/LabelAlphaPane.java | 0 .../LabelAxisPositionPane.java | 0 .../SeriesCondition/LabelBackgroundPane.java | 0 .../SeriesCondition/LabelBorderAttrPane.java | 0 .../SeriesCondition/LabelBorderPane.java | 0 .../SeriesCondition/LabelColorPane.java | 0 .../SeriesCondition/LabelContentsPane.java | 0 .../SeriesCondition/LabelLineStylePane.java | 0 .../SeriesCondition/LineMarkerTypePane.java | 0 .../MapPlotChartConditionPane.java | 18 + .../PiePlotChartConditionPane.java | 20 + .../SeriesCondition/TooltipContentsPane.java | 183 + .../SeriesCondition/TrendLineControlPane.java | 64 + .../series/SeriesCondition/TrendLinePane.java | 0 .../XYPlotChartConditionPane.java | 27 + .../dlp/AreaDataLabelPane.java | 16 + .../dlp/Bar2DDataLabelPane.java | 70 + .../dlp/Bar3DDataLabelPane.java | 16 + .../dlp/BubbleDataLabelPane.java | 68 + .../SeriesCondition/dlp/DataLabelPane.java | 242 + .../dlp/FunnelDataLabelPane.java | 0 .../dlp/GanttDataLabelPane.java | 30 + .../dlp/LineDataLabelPane.java | 16 + .../SeriesCondition/dlp/MapDataLabelPane.java | 37 + .../dlp/MeterDataLabelPane.java | 17 + .../SeriesCondition/dlp/PieDataLabelPane.java | 118 + .../dlp/RadarDataLabelPane.java | 17 + .../dlp/RangeDataLabelPane.java | 65 + .../dlp/StockDataLabelPane.java | 29 + .../SeriesCondition/dlp/XYDataLabelPane.java | 25 + .../Area3DPlotDataSeriesConditionPane.java | 38 + .../impl/AreaPlotDataSeriesCondtionPane.java | 25 + .../impl/Bar2DTrendLineDSConditionPane.java | 20 + .../Bar3DPlotDataSeriesConditionPane.java | 19 + .../impl/BarPlotDataSeriesConditionPane.java | 27 + .../BubblePlotDataSeriesConditionPane.java | 31 + .../impl/ChartHyperPopAttrPane.java | 153 + .../impl/ChartHyperPoplinkPane.java | 136 + .../impl/ChartHyperRelateCellLinkPane.java | 125 + .../impl/ChartHyperRelateFloatLinkPane.java | 145 + .../impl/CustomPlot4AreaConditionPane.java | 17 + ...ustomPlot4BarNoTrendLineConditionPane.java | 17 + .../CustomPlot4BarTrendLineConditionPane.java | 17 + .../impl/CustomPlot4LineConditionPane.java | 17 + .../CustomPlotDataSeriesConditionPane.java | 22 + .../impl/DataSeriesConditionPaneFactory.java | 75 + .../Donut2DPlotDataSeriesConditionPane.java | 20 + .../impl/FormHyperlinkNorthPane.java | 135 + .../impl/FormHyperlinkPane.java | 102 + .../FunnelPlotDataSeriesConditionPane.java | 0 .../GanttPlotDataSeriesConditionPane.java | 41 + .../impl/LinePlotDataSeriesConditionPane.java | 30 + .../impl/MapPlotDataSeriesConditionPane.java | 31 + .../MeterPlotDataSeriesConditionPane.java | 21 + .../Pie3DPlotDataSeriesConditionPane.java | 27 + .../impl/PiePlotDataSeriesConditionPane.java | 28 + .../RadarPlotDataSeriesConditionPane.java | 33 + .../StockPlotDataSeriesConditionPane.java | 27 + .../XYScatterPlotDataSeriesConditionPane.java | 35 + .../AreaIndependentChartInterface.java | 0 .../BarIndependentChartInterface.java | 0 .../BubbleIndependentChartInterface.java | 0 .../ColumnIndependentChartInterface.java | 0 .../CustomIndependentChartInterface.java | 0 .../DonutIndependentChartInterface.java | 0 .../FunnelIndependentChartInterface.java | 0 .../GanttIndependentChartInterface.java | 0 .../GisMapIndependentChartInterface.java | 0 .../LineIndependentChartInterface.java | 0 .../MapIndependentChartInterface.java | 0 .../MeterIndependentChartInterface.java | 0 .../PieIndependentChartInterface.java | 0 .../RadarIndependentChartInterface.java | 0 .../RangeIndependentChartInterface.java | 0 .../StockIndependentChartInterface.java | 0 .../XYScatterIndependentChartInterface.java | 0 .../design/gui/xcombox/ComboBoxUseEditor.java | 160 + .../fr/design/gui/xcombox/MarkerComboBox.java | 102 + .../src/com/fr/design/images/add.png | Bin .../src/com/fr/design/images/chart.png | Bin .../src/com/fr/design/images/copyjs.png | Bin .../src/com/fr/design/images/del.png | Bin .../src/com/fr/design/images/exportimg.png | Bin .../fr/design/images/form/toolbar/area.png | Bin .../com/fr/design/images/form/toolbar/bar.png | Bin .../fr/design/images/form/toolbar/bubble.png | Bin .../fr/design/images/form/toolbar/column.png | Bin .../fr/design/images/form/toolbar/custom.png | Bin .../design/images/form/toolbar/drillmap.png | Bin .../fr/design/images/form/toolbar/funnel.png | Bin .../fr/design/images/form/toolbar/gantt.png | Bin .../fr/design/images/form/toolbar/gauge.png | Bin .../fr/design/images/form/toolbar/heatmap.png | Bin .../fr/design/images/form/toolbar/line.png | Bin .../com/fr/design/images/form/toolbar/map.png | Bin .../design/images/form/toolbar/multiPie.png | Bin .../com/fr/design/images/form/toolbar/pie.png | Bin .../fr/design/images/form/toolbar/radar.png | Bin .../fr/design/images/form/toolbar/scatter.png | Bin .../design/images/form/toolbar/structure.png | Bin .../fr/design/images/form/toolbar/treeMap.png | Bin .../design/images/form/toolbar/wordcloud.png | Bin .../com/fr/design/images/newchart_normal.png | Bin .../com/fr/design/images/newchart_over.png | Bin .../com/fr/design/images/newchart_press.png | Bin .../poly/toolbar/Plugin-ChartF_Drill_Map.png | Bin .../poly/toolbar/Plugin-ChartF_NewBubble.png | Bin .../poly/toolbar/Plugin-ChartF_NewCustom.png | Bin .../poly/toolbar/Plugin-ChartF_NewFunnel.png | Bin .../poly/toolbar/Plugin-ChartF_NewGantt.png | Bin .../poly/toolbar/Plugin-ChartF_NewGauge.png | Bin .../poly/toolbar/Plugin-ChartF_NewHeatMap.png | Bin .../poly/toolbar/Plugin-ChartF_NewMap.png | Bin .../toolbar/Plugin-ChartF_NewMultiPie.png | Bin .../poly/toolbar/Plugin-ChartF_NewRadar.png | Bin .../poly/toolbar/Plugin-ChartF_NewScatter.png | Bin .../poly/toolbar/Plugin-ChartF_NewTreeMap.png | Bin .../src/com/fr/design/images/splash4Chart.png | Bin .../fr/design/images/toolbar/area/0_gray.png | Bin .../design/images/toolbar/area/0_normal.png | Bin .../fr/design/images/toolbar/area/0_over.png | Bin .../fr/design/images/toolbar/area/1_gray.png | Bin .../design/images/toolbar/area/1_normal.png | Bin .../fr/design/images/toolbar/area/1_over.png | Bin .../fr/design/images/toolbar/area/2_gray.png | Bin .../design/images/toolbar/area/2_normal.png | Bin .../fr/design/images/toolbar/area/2_over.png | Bin .../fr/design/images/toolbar/area/3_gray.png | Bin .../design/images/toolbar/area/3_normal.png | Bin .../fr/design/images/toolbar/area/3_over.png | Bin .../fr/design/images/toolbar/bar/0_gray.png | Bin .../fr/design/images/toolbar/bar/0_normal.png | Bin .../fr/design/images/toolbar/bar/0_over.png | Bin .../fr/design/images/toolbar/bar/1_gray.png | Bin .../fr/design/images/toolbar/bar/1_normal.png | Bin .../fr/design/images/toolbar/bar/1_over.png | Bin .../fr/design/images/toolbar/bar/2_gray.png | Bin .../fr/design/images/toolbar/bar/2_normal.png | Bin .../fr/design/images/toolbar/bar/2_over.png | Bin .../fr/design/images/toolbar/bar/3_gary.png | Bin .../fr/design/images/toolbar/bar/3_gray.png | Bin .../fr/design/images/toolbar/bar/3_normal.png | Bin .../fr/design/images/toolbar/bar/3_over.png | Bin .../fr/design/images/toolbar/bar/4_gray.png | Bin .../fr/design/images/toolbar/bar/4_normal.png | Bin .../fr/design/images/toolbar/bar/4_over.png | Bin .../fr/design/images/toolbar/bar/5_gray.png | Bin .../fr/design/images/toolbar/bar/5_normal.png | Bin .../fr/design/images/toolbar/bar/5_over.png | Bin .../fr/design/images/toolbar/bar/6_gray.png | Bin .../fr/design/images/toolbar/bar/6_normal.png | Bin .../fr/design/images/toolbar/bar/6_over.png | Bin .../com/fr/design/images/toolbar/border.png | Bin .../design/images/toolbar/bubble/0_gray.png | Bin .../design/images/toolbar/bubble/0_normal.png | Bin .../design/images/toolbar/bubble/0_over.png | Bin .../design/images/toolbar/column/0_gray.png | Bin .../design/images/toolbar/column/0_normal.png | Bin .../design/images/toolbar/column/0_over.png | Bin .../design/images/toolbar/column/1_gray.png | Bin .../design/images/toolbar/column/1_normal.png | Bin .../design/images/toolbar/column/1_over.png | Bin .../design/images/toolbar/column/2_gray.png | Bin .../design/images/toolbar/column/2_normal.png | Bin .../design/images/toolbar/column/2_over.png | Bin .../design/images/toolbar/column/3_gray.png | Bin .../design/images/toolbar/column/3_normal.png | Bin .../design/images/toolbar/column/3_over.png | Bin .../design/images/toolbar/column/4_gray.png | Bin .../design/images/toolbar/column/4_normal.png | Bin .../design/images/toolbar/column/4_over.png | Bin .../design/images/toolbar/column/5_gray.png | Bin .../design/images/toolbar/column/5_normal.png | Bin .../design/images/toolbar/column/5_over.png | Bin .../design/images/toolbar/column/6_gray.png | Bin .../design/images/toolbar/column/6_normal.png | Bin .../design/images/toolbar/column/6_over.png | Bin .../design/images/toolbar/custom/0_gray.png | Bin .../design/images/toolbar/custom/0_normal.png | Bin .../design/images/toolbar/custom/0_over.png | Bin .../fr/design/images/toolbar/donut/0_gray.png | Bin .../design/images/toolbar/donut/0_normal.png | Bin .../fr/design/images/toolbar/donut/0_over.png | Bin .../fr/design/images/toolbar/donut/1_gray.png | Bin .../design/images/toolbar/donut/1_normal.png | Bin .../fr/design/images/toolbar/donut/1_over.png | Bin .../design/images/toolbar/funnel/0_gray.png | Bin .../design/images/toolbar/funnel/0_normal.png | Bin .../design/images/toolbar/funnel/0_over.png | Bin .../fr/design/images/toolbar/gantt/0_gray.png | Bin .../design/images/toolbar/gantt/0_normal.png | Bin .../fr/design/images/toolbar/gantt/0_over.png | Bin .../fr/design/images/toolbar/gis/0_gray.png | Bin .../fr/design/images/toolbar/gis/0_normal.png | Bin .../fr/design/images/toolbar/gis/0_over.png | Bin .../fr/design/images/toolbar/gis/1_gray.png | Bin .../fr/design/images/toolbar/gis/1_normal.png | Bin .../fr/design/images/toolbar/gis/1_over.png | Bin .../fr/design/images/toolbar/line/0_gray.png | Bin .../design/images/toolbar/line/0_normal.png | Bin .../fr/design/images/toolbar/line/0_over.png | Bin .../fr/design/images/toolbar/map/0_gray.png | Bin .../fr/design/images/toolbar/map/0_normal.png | Bin .../fr/design/images/toolbar/map/0_over.png | Bin .../fr/design/images/toolbar/meter/0_gray.png | Bin .../design/images/toolbar/meter/0_normal.png | Bin .../fr/design/images/toolbar/meter/0_over.png | Bin .../fr/design/images/toolbar/meter/1_gray.png | Bin .../design/images/toolbar/meter/1_normal.png | Bin .../fr/design/images/toolbar/meter/1_over.png | Bin .../fr/design/images/toolbar/meter/2_gray.png | Bin .../design/images/toolbar/meter/2_normal.png | Bin .../fr/design/images/toolbar/meter/2_over.png | Bin .../fr/design/images/toolbar/pie/0_gray.png | Bin .../fr/design/images/toolbar/pie/0_normal.png | Bin .../fr/design/images/toolbar/pie/0_over.png | Bin .../fr/design/images/toolbar/pie/1_gray.png | Bin .../fr/design/images/toolbar/pie/1_normal.png | Bin .../fr/design/images/toolbar/pie/1_over.png | Bin .../fr/design/images/toolbar/radar/0_gray.png | Bin .../design/images/toolbar/radar/0_normal.png | Bin .../fr/design/images/toolbar/radar/0_over.png | Bin .../fr/design/images/toolbar/range/0_gray.png | Bin .../design/images/toolbar/range/0_normal.png | Bin .../fr/design/images/toolbar/range/0_over.png | Bin .../fr/design/images/toolbar/stock/0_gray.png | Bin .../design/images/toolbar/stock/0_normal.png | Bin .../fr/design/images/toolbar/stock/0_over.png | Bin .../images/toolbar/xyscatter/0_gray.png | Bin .../images/toolbar/xyscatter/0_normal.png | Bin .../images/toolbar/xyscatter/0_over.png | Bin .../design/mainframe/ChartPropertyPane.java | 50 + .../com/fr/design/mainframe/MapEditPane.java | 0 .../mainframe/MiddleChartPropertyPane.java | 163 + .../mainframe/TargetComponentContainer.java | 15 + .../chart/AbstractChartAttrPane.java | 45 + .../mainframe/chart/AttributeChange.java | 8 + .../design/mainframe/chart/ChartEditPane.java | 351 + .../mainframe/chart/ChartHyperEditPane.java | 102 + .../mainframe/chart/ChartsConfigPane.java | 0 .../mainframe/chart/ChartsEditPane.java | 0 .../mainframe/chart/PaneTitleConstants.java | 25 + .../mainframe/chart/gui/ChangeConfigPane.java | 0 .../mainframe/chart/gui/ChartDataPane.java | 117 + .../chart/gui/ChartDesignerOtherPane.java | 0 .../mainframe/chart/gui/ChartOtherPane.java | 139 + .../mainframe/chart/gui/ChartStylePane.java | 196 + .../chart/gui/ChartTypeButtonPane.java | 548 + .../mainframe/chart/gui/ChartTypePane.java | 372 + .../gui/ColorSelectBoxWithOutTransparent.java | 0 .../ColorSelectPaneWithOutTransparent.java | 0 .../mainframe/chart/gui/StylePane4Chart.java | 0 .../mainframe/chart/gui/UIEditLabel.java | 0 .../chart/gui/data/CalculateComboBox.java | 68 + .../chart/gui/data/ChartDataFilterPane.java | 592 + .../chart/gui/data/DataContentsPane.java | 39 + .../chart/gui/data/DatabaseTableDataPane.java | 110 + .../chart/gui/data/NormalChartDataPane.java | 154 + .../chart/gui/data/PresentComboBox.java | 113 + .../chart/gui/data/ReportDataPane.java | 105 + .../chart/gui/data/TableDataPane.java | 174 + .../report/AbstractReportDataContentPane.java | 212 + .../BubblePlotReportDataContentPane.java | 101 + ...goryPlotMoreCateReportDataContentPane.java | 207 + .../CategoryPlotReportDataContentPane.java | 141 + .../GanttPlotReportDataContentPane.java | 112 + .../MeterPlotReportDataContentPane.java | 126 + .../report/PiePlotReportDataContentPane.java | 74 + .../StockPlotReportDataContentPane.java | 283 + .../XYScatterPlotReportDataContentPane.java | 91 + .../table/AbstractTableDataContentPane.java | 147 + .../table/BubblePlotTableDataContentPane.java | 168 + ...egoryPlotMoreCateTableDataContentPane.java | 256 + .../CategoryPlotTableDataContentPane.java | 169 + .../table/Factory4TableDataContentPane.java | 0 .../table/GanttPlotTableDataContentPane.java | 198 + .../table/MeterPlotTableDataContentPane.java | 136 + .../table/PiePlotTableDataContentPane.java | 55 + .../table/SeriesNameUseFieldNamePane.java | 368 + .../table/SeriesNameUseFieldValuePane.java | 303 + .../data/table/SeriesTypeUseComboxPane.java | 172 + .../table/StockPlotTableDataContentPane.java | 197 + .../XYScatterPlotTableDataContentPane.java | 153 + .../chart/gui/item/FlexibleComboBox.java | 0 .../chart/gui/item/ItemEventType.java | 0 .../gui/other/ChartConditionAttrPane.java | 84 + .../other/ChartDesignerConditionAttrPane.java | 0 .../other/ChartDesignerInteractivePane.java | 0 .../chart/gui/other/ChartInteractivePane.java | 931 + .../chart/gui/other/ChartSwitchPane.java | 94 + .../chart/gui/other/TimeSwitchPane.java | 0 .../chart/gui/style/AbstractChartTabPane.java | 21 + .../chart/gui/style/ChartAccColorPane.java | 232 + .../chart/gui/style/ChartAxisLabelPane.java | 0 .../gui/style/ChartAxisLineStylePane.java | 91 + .../style/ChartAxisTitleNoFormulaPane.java | 0 .../chart/gui/style/ChartAxisTitlePane.java | 146 + .../gui/style/ChartAxisValueTypePane.java | 136 + .../gui/style/ChartBackgroundNoImagePane.java | 23 + .../chart/gui/style/ChartBackgroundPane.java | 142 + .../chart/gui/style/ChartBeautyPane.java | 74 + .../chart/gui/style/ChartBorderPane.java | 73 + .../style/ChartDataPointLabel4GisPane.java | 0 .../style/ChartDataPointLabel4MapPane.java | 173 + .../gui/style/ChartDatapointLabelPane.java | 449 + .../chart/gui/style/ChartFillStylePane.java | 226 + .../gui/style/ChartPreFillStylePane.java | 97 + .../gui/style/ChartTextAttrNoColorPane.java | 0 .../style/ChartTextAttrNoFontSizePane.java | 62 + .../chart/gui/style/ChartTextAttrPane.java | 175 + .../chart/gui/style/DateAxisValuePane.java | 0 .../chart/gui/style/ThirdTabPane.java | 140 + .../analysisline/ChartAnalysisLinePane.java | 286 + .../chart/gui/style/area/ChartAreaPane.java | 90 + .../gui/style/area/ChartAxisAreaPane.java | 23 + .../gui/style/area/ChartPlotAreaPane.java | 150 + .../gui/style/area/ChartWholeAreaPane.java | 83 + .../gui/style/area/DefaultAxisAreaPane.java | 119 + .../gui/style/area/Plot3DAxisAreaPane.java | 57 + .../gui/style/area/RadarAxisAreaPane.java | 69 + .../style/axis/ChartAxisNoFormulaPane.java | 0 .../chart/gui/style/axis/ChartAxisPane.java | 131 + .../gui/style/axis/ChartAxisUsePane.java | 17 + .../axis/ChartCategoryNoFormulaPane.java | 0 .../gui/style/axis/ChartCategoryPane.java | 273 + .../axis/ChartPercentValueNoFormulaPane.java | 0 .../gui/style/axis/ChartPercentValuePane.java | 16 + .../chart/gui/style/axis/ChartRadarPane.java | 84 + .../axis/ChartSecondValueNoFormulaPane.java | 0 .../gui/style/axis/ChartSecondValuePane.java | 49 + .../style/axis/ChartValueNoFormulaPane.java | 0 .../chart/gui/style/axis/ChartValuePane.java | 418 + .../style/datalabel/ChartDataLabelPane.java | 125 + .../style/datalabel/ChartLabelFontPane.java | 0 .../style/datasheet/ChartDatasheetPane.java | 158 + .../gui/style/legend/AutoSelectedPane.java | 6 + .../gui/style/legend/ChartLegendPane.java | 154 + .../style/series/AbstractPlotSeriesPane.java | 136 + .../gui/style/series/Area3DSeriesPane.java | 57 + .../gui/style/series/AreaSeriesPane.java | 96 + .../gui/style/series/Bar2DSeriesPane.java | 91 + .../gui/style/series/Bar3DSeriesPane.java | 84 + .../gui/style/series/BubbleSeriesPane.java | 83 + .../gui/style/series/ChartSeriesPane.java | 90 + .../style/series/ColorPickerPaneNumFiled.java | 41 + .../series/ColorPickerPaneWithFormula.java | 0 .../style/series/CombinedBar2DSeriesPane.java | 0 .../series/CombinedBubbleSeriesPane.java | 0 .../style/series/CombinedPie2DSeriesPane.java | 0 .../style/series/CustomDefaultSeriesPane.java | 0 .../gui/style/series/CustomSeriesPane.java | 111 + .../series/CustomTypeConditionSeriesPane.java | 0 .../gui/style/series/Donut2DSeriesPane.java | 111 + .../gui/style/series/Donut3DSeriesPane.java | 0 .../gui/style/series/FunnelSeriesPane.java | 25 + .../gui/style/series/LineSeriesPane.java | 137 + .../series/MapColorPickerPaneWithFormula.java | 0 .../chart/gui/style/series/MapSeriesPane.java | 219 + .../series/MapSeriesPane4ChartDesigner.java | 0 .../gui/style/series/MeterSeriesPane.java | 146 + .../series/MeterSeriesPane4ChartDesigner.java | 0 .../gui/style/series/Pie2DSeriesPane.java | 128 + .../gui/style/series/Pie3DSeriesPane.java | 26 + .../gui/style/series/RadarSeriesPane.java | 116 + .../gui/style/series/RangeSeriesPane.java | 45 + .../series/SeriesPane4ChartDesigner.java | 0 .../gui/style/series/StockSeriesPane.java | 105 + .../gui/style/series/UIColorPickerPane.java | 779 + .../style/series/UIColorPickerPane4Map.java | 0 .../gui/style/series/XYScatterSeriesPane.java | 65 + .../chart/gui/style/title/ChartTitlePane.java | 0 .../style/title/ChartTitlePaneNoFormula.java | 0 .../chart/gui/type/AbstractBarPane.java | 54 + .../chart/gui/type/AbstractChartTypePane.java | 624 + .../chart/gui/type/AreaPlotPane.java | 148 + .../mainframe/chart/gui/type/BarPlotPane.java | 126 + .../chart/gui/type/BubblePlotPane.java | 79 + .../chart/gui/type/ChartImagePane.java | 78 + .../chart/gui/type/ChartTabPane.java | 0 .../chart/gui/type/ColumnPlotPane.java | 119 + .../chart/gui/type/CustomPlotPane.java | 72 + .../chart/gui/type/DonutPlotPane.java | 137 + .../chart/gui/type/FunnelPlotPane.java | 95 + .../chart/gui/type/GanttPlotPane.java | 75 + .../chart/gui/type/GisMapPlotPane.java | 190 + .../chart/gui/type/LinePlotPane.java | 93 + .../mainframe/chart/gui/type/MapPlotPane.java | 158 + .../chart/gui/type/MeterPlotPane.java | 124 + .../mainframe/chart/gui/type/PiePlotPane.java | 130 + .../chart/gui/type/RadarPlotPane.java | 76 + .../chart/gui/type/RangePlotPane.java | 79 + .../chart/gui/type/StockPlotPane.java | 76 + .../gui/type/UserDefinedChartTypePane.java | 0 .../chart/gui/type/XYScatterPlotPane.java | 89 + .../fr/design/module/ChartDesignerModule.java | 92 + .../fr/design/module/ChartHyperlinkGroup.java | 42 + .../fr/design/module/ChartPreStyleAction.java | 77 + .../module/ChartPreStyleManagerPane.java | 87 + .../fr/design/module/ChartPreStylePane.java | 108 + .../fr/design/module/FormHyperlinkGroup.java | 37 + .../AbstractExtendedChartReportDataPane.java | 0 .../AbstractExtendedChartTableDataPane.java | 0 .../AbstractExtendedChartUIProvider.java | 0 .../chart/AbstractExtendedStylePane.java | 0 .../chart/ExtendedChartHyperLinkPane.java | 0 .../fr/extended/chart/ExtendedOtherPane.java | 0 .../fr/extended/chart/ExtendedScrollPane.java | 0 .../fr/extended/chart/ExtendedTypePane.java | 0 .../com/fr/file/FILEChooserPane4Chart.java | 0 .../chart/DownloadOnlineSourcesHelper.java | 0 .../AreaIndependentVanChartInterface.java | 0 .../chart/area/VanChartAreaConditionPane.java | 0 .../van/chart/area/VanChartAreaPlotPane.java | 0 .../chart/area/VanChartAreaSeriesPane.java | 0 .../src/com/fr/van/chart/area/images/area.png | Bin .../com/fr/van/chart/area/images/custom.png | Bin .../fr/van/chart/area/images/percentStack.png | Bin .../com/fr/van/chart/area/images/stack.png | Bin .../src/com/fr/van/chart/background.png | Bin .../bar/BarIndependentVanChartInterface.java | 0 .../fr/van/chart/bar/VanChartBarPlotPane.java | 0 .../van/chart/bar/VanChartBarStylePane.java | 0 .../src/com/fr/van/chart/bar/images/bar.png | Bin .../com/fr/van/chart/bar/images/custom.png | Bin .../fr/van/chart/bar/images/percentstack.png | Bin .../src/com/fr/van/chart/bar/images/stack.png | Bin .../BubbleIndependentVanChartInterface.java | 0 .../bubble/VanChartBubbleConditionPane.java | 0 .../VanChartBubbleConditionSelectionPane.java | 0 .../bubble/VanChartBubbleInteractivePane.java | 0 .../chart/bubble/VanChartBubblePlotPane.java | 0 .../bubble/VanChartBubbleSeriesPane.java | 0 .../chart/bubble/VanChartBubbleStylePane.java | 0 .../bubble/component/VanChartBubblePane.java | 0 ...anChartBubblePlotTableDataContentPane.java | 0 .../VanChartBubbleRefreshTooltipPane.java | 0 ...VanChartForceBubbleAreaBackgroundPane.java | 0 .../force/VanChartForceBubbleAreaPane.java | 0 .../force/VanChartForceBubbleLabelPane.java | 0 .../force/VanChartForceBubbleTooltipPane.java | 0 .../com/fr/van/chart/bubble/images/bubble.png | Bin .../com/fr/van/chart/bubble/images/force.png | Bin .../com/fr/van/chart/bubble/images/large.png | Bin .../chart/column/ColumnBorderAttriPane.java | 0 .../ColumnIndependentVanChartInterface.java | 0 .../column/VanChartColumnConditionPane.java | 0 .../column/VanChartColumnLabelBorderPane.java | 0 .../chart/column/VanChartColumnPlotPane.java | 0 .../column/VanChartColumnSeriesPane.java | 0 ...nChartCustomStackAndAxisConditionPane.java | 0 .../com/fr/van/chart/column/images/column.png | Bin .../com/fr/van/chart/column/images/custom.png | Bin .../van/chart/column/images/percentstack.png | Bin .../com/fr/van/chart/column/images/stack.png | Bin .../CustomIndependentVanChartInterface.java | 0 .../custom/CustomPlotDesignerPaneFactory.java | 0 .../chart/custom/VanChartCustomDataPane.java | 0 ...VanChartCustomPlotDataContentsTabPane.java | 0 .../chart/custom/VanChartCustomPlotPane.java | 0 ...ategoryCustomPlotTableDataContentPane.java | 0 .../component/ChartImageCheckOutPane.java | 0 .../component/CustomPlotLocationPane.java | 0 .../MeterCustomPlotReportDataContentPane.java | 0 .../MeterCustomPlotTableDataContentPane.java | 0 .../VanChartCustomAreaBackgroundPane.java | 0 .../VanChartCustomAxisConditionPane.java | 0 .../component/VanChartCustomPlotAxisPane.java | 0 .../VanChartCustomPlotSelectPane.java | 0 .../component/VanChartCustomPlotTabPane.java | 0 .../VanChartCustomPlotUITabGroup.java | 0 .../custom/component/VanChartDataPane.java | 0 .../component/VanChartHyperLinkPane.java | 0 .../van/chart/custom/images/column_area.png | Bin .../van/chart/custom/images/column_line.png | Bin .../com/fr/van/chart/custom/images/custom.png | Bin .../chart/custom/images/custom/icon/area.png | Bin .../custom/images/custom/icon/bubble.png | Bin .../custom/images/custom/icon/column.png | Bin .../custom/images/custom/icon/cuvette.png | Bin .../images/custom/icon/different_pie.png | Bin .../chart/custom/images/custom/icon/line.png | Bin .../chart/custom/images/custom/icon/pie.png | Bin .../custom/images/custom/icon/pointer_180.png | Bin .../custom/images/custom/icon/pointer_360.png | Bin .../chart/custom/images/custom/icon/radar.png | Bin .../chart/custom/images/custom/icon/ring.png | Bin .../custom/images/custom/icon/same_pie.png | Bin .../custom/images/custom/icon/scatter.png | Bin .../images/custom/icon/selected/area.png | Bin .../images/custom/icon/selected/bubble.png | Bin .../images/custom/icon/selected/column.png | Bin .../images/custom/icon/selected/cuvette.png | Bin .../custom/icon/selected/different_pie.png | Bin .../images/custom/icon/selected/line.png | Bin .../images/custom/icon/selected/pie.png | Bin .../custom/icon/selected/pointer_180.png | Bin .../custom/icon/selected/pointer_360.png | Bin .../images/custom/icon/selected/radar.png | Bin .../images/custom/icon/selected/ring.png | Bin .../images/custom/icon/selected/same_pie.png | Bin .../images/custom/icon/selected/scatter.png | Bin .../images/custom/icon/selected/slot.png | Bin .../custom/icon/selected/stack_radar.png | Bin .../chart/custom/images/custom/icon/slot.png | Bin .../custom/images/custom/icon/stack_radar.png | Bin .../chart/custom/images/stack_column_line.png | Bin .../VanChartCustomConditionAttrPane.java | 0 .../other/VanChartCustomInteractivePane.java | 0 .../custom/other/VanChartCustomOtherPane.java | 0 ...anChartCustomPlotConditionAttrTabPane.java | 0 .../VanChartCustomPlotHyperlinkPane.java | 0 .../VanChartCustomPlotHyperlinkTabPane.java | 0 .../custom/style/VanChartCustomAreaPane.java | 0 .../style/VanChartCustomAxisAreaPane.java | 0 .../custom/style/VanChartCustomAxisPane.java | 0 .../style/VanChartCustomAxisTabPane.java | 0 .../custom/style/VanChartCustomLabelPane.java | 0 .../style/VanChartCustomPlotLabelTabPane.java | 0 .../style/VanChartCustomPlotSeriesPane.java | 0 .../VanChartCustomPlotSeriesTabPane.java | 0 .../VanChartCustomPlotTooltipTabPane.java | 0 .../style/VanChartCustomSeriesPane.java | 0 .../custom/style/VanChartCustomStylePane.java | 0 .../style/VanChartCustomTooltipPane.java | 0 .../designer/AbstractVanChartScrollPane.java | 0 .../fr/van/chart/designer/PlotFactory.java | 0 .../designer/TableLayout4VanChartHelper.java | 0 .../component/ChartUIMenuNameableCreator.java | 0 .../VanChartAreaSeriesFillColorPane.java | 0 .../component/VanChartBeautyPane.java | 0 .../component/VanChartFillStylePane.java | 0 .../VanChartFillStylePane4Condition.java | 0 .../component/VanChartFloatPositionPane.java | 0 .../component/VanChartHtmlLabelPane.java | 0 ...artHtmlLabelPaneWithOutWidthAndHeight.java | 0 .../component/VanChartLabelContentPane.java | 0 .../component/VanChartLineTypePane.java | 0 .../component/VanChartLineWidthPane.java | 0 .../component/VanChartMarkerPane.java | 0 .../component/VanChartPlotMultiTabPane.java | 0 .../VanChartRefreshTooltipContentPane.java | 0 .../component/VanChartTooltipContentPane.java | 0 .../component/VanChartTrendLinePane.java | 0 .../component/VanChartUIListControlPane.java | 0 .../VanChartUIMenuNameableCreator.java | 0 .../background/VanChartBackgroundPane.java | 0 ...rtBackgroundPaneWithOutImageAndShadow.java | 0 .../VanChartBackgroundWithOutImagePane.java | 0 ...BackgroundWithOutShadowWithRadiusPane.java | 0 .../background/VanChartGradientPane.java | 0 .../VanChartMarkerBackgroundPane.java | 0 .../component/border/VanChartBorderPane.java | 0 .../border/VanChartBorderWithAlphaPane.java | 0 .../border/VanChartBorderWithRadiusPane.java | 0 .../CategoryNameFormatPaneWithCheckBox.java | 0 .../ChangedPercentFormatPaneWithCheckBox.java | 0 .../ChangedValueFormatPaneWithCheckBox.java | 0 .../format/FormatPaneWithNormalType.java | 0 .../format/FormatPaneWithOutFont.java | 0 .../MapAreaNameFormatPaneWithCheckBox.java | 0 .../format/PercentFormatPaneWithCheckBox.java | 0 .../SeriesNameFormatPaneWithCheckBox.java | 0 .../format/ValueFormatPaneWithCheckBox.java | 0 .../VanChartFormatPaneWithCheckBox.java | 0 .../format/XFormatPaneWithCheckBox.java | 0 .../format/YFormatPaneWithCheckBox.java | 0 .../label/GaugeLabelContentPane.java | 0 .../label/LabelContentPaneWithCate.java | 0 .../label/LabelContentPaneWithCateValue.java | 0 .../label/LabelContentPaneWithOutCate.java | 0 .../label/LabelContentPaneWithPercent.java | 0 .../marker/VanChartCommonMarkerPane.java | 0 .../marker/VanChartImageMarkerPane.java | 0 ...efreshTooltipContentPaneWithOutSeries.java | 0 .../TooltipContentPaneWithOutSeries.java | 0 ...eDimensionalPlotReportDataContentPane.java | 0 ...VanChartMoreCateReportDataContentPane.java | 0 .../VanChartMoreCateTableDataContentPane.java | 0 .../AbstractConditionAttrContentPane.java | 0 .../chart/designer/other/AutoRefreshPane.java | 0 .../other/AutoRefreshPaneWithoutTooltip.java | 0 .../VanChartConditionAttrContentPane.java | 0 .../other/VanChartConditionAttrPane.java | 0 .../VanChartConditionListControlPane.java | 0 .../other/VanChartInteractivePane.java | 0 .../VanChartInteractivePaneWithMapZoom.java | 0 .../VanChartInteractivePaneWithOutSort.java | 0 .../designer/other/VanChartOtherPane.java | 0 .../AbstractNormalMultiLineConditionPane.java | 0 .../VanChartAreaFillColorConditionPane.java | 0 .../item/VanChartBubbleSetConditionPane.java | 0 .../item/VanChartCurveConditionPane.java | 0 .../item/VanChartDataSheetContentPane.java | 0 .../item/VanChartEffectConditionPane.java | 0 .../item/VanChartFloatColorConditionPane.java | 0 .../item/VanChartLabelConditionPane.java | 0 .../item/VanChartLineEffectConditionPane.java | 0 .../VanChartLineMapTooltipConditionPane.java | 0 .../item/VanChartLineTypeConditionPane.java | 0 .../item/VanChartLineWidthConditionPane.java | 0 .../item/VanChartMarkerConditionPane.java | 0 .../VanChartSeriesColorConditionPane.java | 0 ...artSeriesImageBackgroundConditionPane.java | 0 .../VanChartStructureNodeConditionPane.java | 0 .../item/VanChartTooltipConditionPane.java | 0 .../item/VanChartTrendLineConditionPane.java | 0 .../style/HeatMapRangeLegendPane.java | 0 .../designer/style/VanChartLegendPane.java | 0 .../style/VanChartPlotLegendPane.java | 0 .../style/VanChartRangeLegendPane.java | 0 .../designer/style/VanChartStylePane.java | 0 .../designer/style/VanChartTitlePane.java | 0 .../style/VanLegendPaneWidthOutHighlight.java | 0 .../designer/style/axis/AxisPaneFactory.java | 0 .../designer/style/axis/VanChartAxisPane.java | 0 ...nChartAxisScrollPaneWithOutTypeSelect.java | 0 .../VanChartAxisScrollPaneWithTypeSelect.java | 0 .../style/axis/VanChartBaseAxisPane.java | 0 .../style/axis/VanChartTimeAxisPane.java | 0 .../style/axis/VanChartValueAxisPane.java | 0 .../axis/VanChartXYAxisPaneInterface.java | 0 .../style/axis/bar/VanChartBarAxisPane.java | 0 ...ChartXAxisScrollPaneWithOutTypeSelect.java | 0 ...VanChartYAxisScrollPaneWithTypeSelect.java | 0 .../MinMaxValuePaneWithOutSecTick.java | 0 .../component/MinMaxValuePaneWithOutTick.java | 0 .../component/VanChartAxisButtonPane.java | 0 .../component/VanChartMinMaxValuePane.java | 0 .../VanChartAxisScrollPaneWithGauge.java | 0 .../axis/gauge/VanChartGaugeAxisPane.java | 0 .../gauge/VanChartGaugeDetailAxisPane.java | 0 .../axis/radar/RadarTableContentPane.java | 0 .../style/axis/radar/RadarTableDataPane.java | 0 .../axis/radar/VanChartRadarXAxisPane.java | 0 .../axis/radar/VanChartRadarYAxisPane.java | 0 .../VanChartXAxisScrollPaneWithRadar.java | 0 .../VanChartYAxisScrollPaneWithRadar.java | 0 .../scatter/VanChartDoubleValueAxisPane.java | 0 .../background/AlertLineListControlPane.java | 0 .../background/BackgroundListControlPane.java | 0 .../BackgroundNameObjectCreator.java | 0 .../background/ChartNameObjectCreator.java | 0 .../background/VanChartAlertValuePane.java | 0 .../VanChartAreaBackgroundPane.java | 0 .../style/background/VanChartAreaPane.java | 0 .../background/VanChartAxisAreaPane.java | 0 .../VanChartCustomIntervalBackgroundPane.java | 0 .../radar/VanChartRadarAlertValuePane.java | 0 .../radar/VanChartRadarAxisAreaPane.java | 0 ...hartRadarCustomIntervalBackgroundPane.java | 0 .../datasheet/VanChartDataSheetPane.java | 0 .../VanchartDataSheetNoCheckPane.java | 0 ...hartGaugeCateOrPercentLabelDetailPane.java | 0 .../label/VanChartGaugeLabelDetailPane.java | 0 .../label/VanChartGaugePlotLabelPane.java | 0 .../VanChartGaugeValueLabelDetailPane.java | 0 .../style/label/VanChartLabelPane.java | 0 .../label/VanChartPlotLabelDetailPane.java | 0 .../label/VanChartPlotLabelNoCheckPane.java | 0 .../style/label/VanChartPlotLabelPane.java | 0 .../StackedAndAxisNameObjectCreator.java | 0 .../VanChartAbstractPlotSeriesPane.java | 0 .../style/series/VanChartEffectPane.java | 0 .../series/VanChartSeriesConditionPane.java | 0 ...VanChartStackedAndAxisListControlPane.java | 0 .../VanChartPlotRefreshTooltipPane.java | 0 .../VanChartPlotTooltipNoCheckPane.java | 0 .../tooltip/VanChartPlotTooltipPane.java | 0 .../style/tooltip/VanChartTooltipPane.java | 0 .../type/AbstractVanChartTypePane.java | 0 .../DrillMapIndependentVanChartInterface.java | 0 .../data/VanChartDrillMapContentsPane.java | 0 .../data/VanChartDrillMapDataPane.java | 0 .../data/VanChartMapLayerAndDataTabPane.java | 0 .../designer/data/comp/DrillMapDataPane.java | 0 .../designer/data/comp/DrillMapLayerPane.java | 0 .../comp/EachLayerDataDefinitionPane.java | 0 .../designer/data/comp/MapDataTree.java | 0 .../comp/SingleLayerDataDefinitionPane.java | 0 .../other/VanChartCatalogHyperLinkPane.java | 0 .../VanChartDrillMapInteractivePane.java | 0 .../other/VanChartDrillMapOtherPane.java | 0 .../type/VanChartDrillMapPlotPane.java | 0 .../fr/van/chart/drillmap/images/area-map.png | Bin .../van/chart/drillmap/images/custom-map.png | Bin .../van/chart/drillmap/images/point-map.png | Bin .../FunnelIndependentVanChartInterface.java | 0 .../other/VanChartFunnelConditionPane.java | 0 .../FunnelPercentFormatPaneWithCheckBox.java | 0 .../style/VanChartFunnelLabelContentPane.java | 0 ...nChartFunnelRefreshTooltipContentPane.java | 0 .../style/VanChartFunnelSeriesPane.java | 0 .../VanChartFunnelTooltipContentPane.java | 0 .../designer/type/VanChartFunnelTypePane.java | 0 .../com/fr/van/chart/funnel/images/funnel.png | Bin .../GanttIndependentVanChartInterface.java | 0 .../data/VanChartGanttContentsPane.java | 0 .../data/VanChartGanttDataAndLinkPane.java | 0 .../designer/data/VanChartGanttDataPane.java | 0 .../data/data/GanttDataPaneHelper.java | 0 .../data/GanttPlotReportDataContentPane.java | 0 .../data/GanttPlotTableDataContentPane.java | 0 .../component/ComboBoxWithButtonPane.java | 0 .../component/GanttReportDataContentPane.java | 0 .../component/GanttReportDataProjectPane.java | 0 .../component/GanttTableDataContentPane.java | 0 .../component/GanttTableDataProjectPane.java | 0 .../component/TinyFormulaWithButtonPane.java | 0 .../link/GanttLinkReportDataContentPane.java | 0 .../data/link/GanttLinkReportDataPane.java | 0 .../link/GanttLinkTableDataContentPane.java | 0 .../data/link/GanttLinkTableDataPane.java | 0 .../other/VanChartGanttConditionPane.java | 0 .../other/VanChartGanttInteractivePane.java | 0 .../style/VanChartGanttLabelContentPane.java | 0 .../style/VanChartGanttStylePane.java | 0 .../style/axis/GanttAxisStylePane.java | 0 .../style/axis/GanttProcessAxisPane.java | 0 .../style/axis/GanttTimeAxisPane.java | 0 .../series/VanChartGanttCommonMarkerPane.java | 0 .../style/series/VanChartGanttSeriesPane.java | 0 ...tImageMarkerWithoutWidthAndHeightPane.java | 0 .../tooltip/VanChartGanttPlotTooltipPane.java | 0 .../VanChartGanttTooltipContentPane.java | 0 .../designer/type/VanChartGanttPlotPane.java | 0 .../com/fr/van/chart/gantt/images/gantt.png | Bin .../GaugeIndependentVanChartInterface.java | 0 .../chart/gauge/VanChartGaugePlotPane.java | 0 .../VanChartGaugePlotRefreshTooltipPane.java | 0 .../gauge/VanChartGaugePlotTooltipPane.java | 0 .../chart/gauge/VanChartGaugeSeriesPane.java | 0 .../chart/gauge/VanChartGaugeStylePane.java | 0 .../com/fr/van/chart/gauge/images/cuvette.png | Bin .../com/fr/van/chart/gauge/images/pointer.png | Bin .../fr/van/chart/gauge/images/pointer_180.png | Bin .../com/fr/van/chart/gauge/images/ring.png | Bin .../com/fr/van/chart/gauge/images/slot.png | Bin .../HeatMapIndependentVanChartInterface.java | 0 .../other/VanChartHeatMapConditionPane.java | 0 .../style/VanChartHeatMapSeriesPane.java | 0 .../type/VanChartHeatMapSourceChoosePane.java | 0 .../type/VanChartHeatMapTypePane.java | 0 .../fr/van/chart/heatmap/images/heatmap.png | Bin .../chart/layout/VanChartCardLayoutPane.java | 0 .../LineIndependentVanChartInterface.java | 0 .../chart/line/VanChartLineConditionPane.java | 0 ...rtLineCustomStackAndAxisConditionPane.java | 0 .../van/chart/line/VanChartLinePlotPane.java | 0 .../chart/line/VanChartLineSeriesPane.java | 0 .../com/fr/van/chart/line/images/custom.png | Bin .../src/com/fr/van/chart/line/images/line.png | Bin .../com/fr/van/chart/line/images/stack.png | Bin .../map/MapIndependentVanChartInterface.java | 0 .../van/chart/map/VanChartMapSeriesPane.java | 0 .../chart/map/designer/VanChartGroupPane.java | 0 .../designer/VanMapAreaAndPointGroupPane.java | 0 .../VanMapAreaPointAndLineGroupPane.java | 0 .../data/CustomMapChartDataContentsPane.java | 0 .../map/designer/data/MapDataPaneHelper.java | 0 .../designer/data/VanChartMapDataPane.java | 0 .../component/LongitudeLatitudeAndArea.java | 0 ...riesNameUseFieldNamePaneWithOutFilter.java | 0 ...iesNameUseFieldValuePaneWithOutFilter.java | 0 .../SeriesTypeUseComboxPaneWithOutFilter.java | 0 .../report/AbstractLongLatAreaPane.java | 0 .../data/component/report/AreaPane.java | 0 .../component/report/LineMapAreaPane.java | 0 .../report/LineMapLongLatAreaPane.java | 0 .../component/report/LongLatAreaPane.java | 0 .../component/report/PointMapAreaPane.java | 0 .../report/PointMapLongLatAreaPane.java | 0 .../table/AbstractLongLatAreaPane.java | 0 .../data/component/table/AreaPane.java | 0 .../data/component/table/LineMapAreaPane.java | 0 .../table/LineMapLongLatAreaPane.java | 0 .../data/component/table/LongLatAreaPane.java | 0 .../component/table/PointMapAreaPane.java | 0 .../table/PointMapLongLatAreaPane.java | 0 .../VanAreaMapPlotReportDataContentPane.java | 0 .../VanLineMapPlotReportDataContentPane.java | 0 .../VanPointMapPlotReportDataContentPane.java | 0 .../VanAreaMapPlotTableDataContentPane.java | 0 .../VanLineMapPlotTableDataContentPane.java | 0 .../VanPointMapPlotTableDataContentPane.java | 0 .../VanChartMapConditionAttrContentPane.java | 0 .../other/VanChartMapConditionAttrPane.java | 0 .../other/VanChartMapHyperLinkPane.java | 0 .../other/VanChartMapInteractivePane.java | 0 .../designer/other/VanChartMapOtherPane.java | 0 ...VanChartLineMapConditionSelectionPane.java | 0 .../VanChartMapConditionSelectionPane.java | 0 .../VanChartBorderWithAlphaConditionPane.java | 0 .../VanChartBubbleMarkerConditionPane.java | 0 .../VanChartCommonMarkerConditionPane.java | 0 .../VanChartImageMarkerConditionPane.java | 0 .../VanChartBubblePointMapConditionPane.java | 0 .../VanChartCommonPointMapConditionPane.java | 0 .../VanChartDefaultPointMapConditionPane.java | 0 .../VanChartImagePointMapConditionPane.java | 0 .../pane/VanChartLineMapConditionPane.java | 0 .../pane/VanChartMapConditionPane.java | 0 .../designer/style/VanChartMapStylePane.java | 0 .../label/VanChartMapLabelContentPane.java | 0 .../style/label/VanChartMapLabelPane.java | 0 .../series/VanChartMapScatterMarkerPane.java | 0 .../VanChartMapRefreshTooltipContentPane.java | 0 .../VanChartMapTooltipContentPane.java | 0 .../style/tooltip/VanChartMapTooltipPane.java | 0 .../designer/type/VanChartMapPlotPane.java | 0 .../type/VanChartMapSourceChoosePane.java | 0 .../com/fr/van/chart/map/images/area-map.png | Bin .../src/com/fr/van/chart/map/images/area.png | Bin .../fr/van/chart/map/images/custom-map.png | Bin .../src/com/fr/van/chart/map/images/image.png | Bin .../com/fr/van/chart/map/images/line-map.png | Bin .../com/fr/van/chart/map/images/mapData.png | Bin .../fr/van/chart/map/images/marker-icon.png | Bin .../fr/van/chart/map/images/marker-iconx2.png | Bin .../com/fr/van/chart/map/images/point-map.png | Bin .../src/com/fr/van/chart/map/images/point.png | Bin ...StartAndEndNameFormatPaneWithCheckBox.java | 0 .../van/chart/map/line/VanChartCurvePane.java | 0 .../map/line/VanChartLineMapEffectPane.java | 0 .../line/VanChartLineMapPlotTooltipPane.java | 0 .../VanChartLineMapTooltipContentPane.java | 0 .../map/server/ChartMapEditorAction.java | 0 .../MultiPieIndependentVanChartInterface.java | 0 .../multilayer/VanChartMultiPiePlotPane.java | 0 .../MultiPiePlotReportDataContentPane.java | 0 .../MultiPiePlotTableDataContentPane.java | 0 .../van/chart/multilayer/image/multiPie.png | Bin .../other/VanChartMultiPieConditionPane.java | 0 ...anChartMultiPieConditionSelectionPane.java | 0 ...anChartMultiPiePlotTooltipNoCheckPane.java | 0 .../VanChartMultiPieTooltipConditionPane.java | 0 ...ltiPieLevelNameFormatPaneWithCheckBox.java | 0 ...tiPieSeriesNameFormatPaneWithCheckBox.java | 0 .../VanChartMultiPieLabelContentPane.java | 0 .../VanChartMultiPiePlotTooltipPane.java | 0 .../style/VanChartMultiPieSeriesPane.java | 0 .../VanChartMultiPieTooltipContentPane.java | 0 ...ChartMutiPieRefreshTooltipContentPane.java | 0 .../pie/PieIndependentVanChartInterface.java | 0 .../van/chart/pie/RadiusCardLayoutPane.java | 0 .../chart/pie/VanChartPieConditionPane.java | 0 .../fr/van/chart/pie/VanChartPiePlotPane.java | 0 .../van/chart/pie/VanChartPieSeriesPane.java | 0 .../com/fr/van/chart/pie/images/different.png | Bin .../src/com/fr/van/chart/pie/images/pie.png | Bin .../src/com/fr/van/chart/pie/images/same.png | Bin .../RadarIndependentVanChartInterface.java | 0 .../radar/VanChartRadarConditionPane.java | 0 .../chart/radar/VanChartRadarPlotPane.java | 0 .../chart/radar/VanChartRadarSeriesPane.java | 0 .../com/fr/van/chart/radar/images/radar.png | Bin .../com/fr/van/chart/radar/images/stack.png | Bin .../component/GradualIntervalConfigPane.java | 0 .../range/component/GradualLegendPane.java | 0 .../range/component/LegendGradientBar.java | 0 .../component/LegendLabelFormatPane.java | 0 .../component/SectionIntervalConfigPane.java | 0 .../SectionIntervalConfigPaneWithOutNum.java | 0 .../range/component/SectionLegendPane.java | 0 .../ScatterIndependentVanChartInterface.java | 0 .../scatter/VanChartScatterConditionPane.java | 0 .../VanChartScatterLabelContentPane.java | 0 .../scatter/VanChartScatterPlotPane.java | 0 .../VanChartScatterPlotTooltipPane.java | 0 ...ChartScatterRefreshTooltipContentPane.java | 0 .../scatter/VanChartScatterSeriesPane.java | 0 .../VanChartScatterTooltipContentPane.java | 0 .../VanChartScatterLineTypeConditionPane.java | 0 .../VanChartScatterLineTypePane.java | 0 .../component/VanChartScatterStylePane.java | 0 .../VanChartScatterLabelConditionPane.java | 0 .../VanChartScatterPlotLabelDetailPane.java | 0 .../VanChartScatterPlotLabelNoCheckPane.java | 0 .../label/VanChartScatterPlotLabelPane.java | 0 ...VanChartScatterPlotTooltipNoCheckPane.java | 0 .../VanChartScatterTooltipConditionPane.java | 0 ...nChartScatterPlotTableDataContentPane.java | 0 .../com/fr/van/chart/scatter/images/large.png | Bin .../fr/van/chart/scatter/images/scatter.png | Bin ...VanChartLargeModelMarkerConditionPane.java | 0 .../large/VanChartLargeModelMarkerPane.java | 0 ...StructureIndependentVanChartInterface.java | 0 .../StructurePlotReportDataContentPane.java | 0 .../StructurePlotTableDataContentPane.java | 0 .../other/VanChartStructureConditionPane.java | 0 .../style/StructureNodeStylePane.java | 0 .../VanChartStructureLabelContentPane.java | 0 ...artStructureRefreshTooltipContentPane.java | 0 .../style/VanChartStructureSeriesPane.java | 0 .../VanChartStructureTooltipContentPane.java | 0 .../type/VanChartStructureTypePane.java | 0 .../van/chart/structure/images/horizontal.png | Bin .../fr/van/chart/structure/images/radial.png | Bin .../van/chart/structure/images/vertical.png | Bin .../TreeMapIndependentVanChartInterface.java | 0 .../treemap/VanChartTreeMapPlotPane.java | 0 .../fr/van/chart/treemap/images/treeMap.png | Bin .../style/VanChartTreeMapSeriesPane.java | 0 .../AbstractIndependentVanChartUI.java | 0 .../AbstractMultiCategoryVanChartUI.java | 0 ...WordCloudIndependentVanChartInterface.java | 0 .../WordCloudPlotReportDataContentPane.java | 0 .../WordCloudPlotTableDataContentPane.java | 0 .../other/VanChartWordCloudConditionPane.java | 0 ...hartWordCloudRefreshTootipContentPane.java | 0 .../style/VanChartWordCloudSeriesPane.java | 0 .../VanChartWordCloudTooltipContentPane.java | 0 .../type/VanChartWordCloudTypePane.java | 0 .../van/chart/wordcloud/images/wordcloud.png | Bin designer-form/.gitignore | 5 + designer-form/build.form.gradle | 109 + {designer_form => designer-form}/clean.gradle | 0 .../designerform/TemplateProcessTracker.aj | 0 .../fr/design/designer/beans/AdapterBus.java | 78 + .../designer/beans/ComponentAdapter.java | 61 + .../designer/beans/ConnectorCreator.java | 214 + .../designer/beans/ConstraintsGroupModel.java | 0 .../design/designer/beans/HoverPainter.java | 23 + .../fr/design/designer/beans/Incremental.java | 0 .../design/designer/beans/LayoutAdapter.java | 0 .../com/fr/design/designer/beans/Painter.java | 0 .../beans/actions/ChangeNameAction.java | 0 .../beans/actions/ConnectionAction.java | 34 + .../designer/beans/actions/CopyAction.java | 0 .../designer/beans/actions/CutAction.java | 33 + .../beans/actions/FormDeleteAction.java | 0 .../beans/actions/FormEditAction.java | 17 + .../beans/actions/FormUndoableAction.java | 0 .../beans/actions/MoveDownAction.java | 0 .../beans/actions/MoveToBottomAction.java | 0 .../beans/actions/MoveToTopAction.java | 0 .../designer/beans/actions/MoveUpAction.java | 0 .../designer/beans/actions/PasteAction.java | 37 + .../component/CompositeComponentAdapter.java | 203 + .../layout/AbsoluteLayoutAdapter.java | 33 + .../layout/AbstractAnchorPainter.java | 0 .../layout/AbstractLayoutAdapter.java | 0 .../adapters/layout/DefaultLayoutAdapter.java | 29 + .../layout/FRAbsoluteBodyLayoutAdapter.java | 0 .../layout/FRAbsoluteLayoutAdapter.java | 341 + .../adapters/layout/FRBodyLayoutAdapter.java | 0 .../layout/FRBorderLayoutAdapter.java | 192 + .../adapters/layout/FRCardLayoutAdapter.java | 141 + .../adapters/layout/FRFitLayoutAdapter.java | 1221 + .../adapters/layout/FRFormLayoutAdapter.java | 0 .../adapters/layout/FRGridLayoutAdapter.java | 48 + .../layout/FRHorizontalLayoutAdapter.java | 82 + .../FRHorizontalSplitLayoutAdapter.java | 26 + .../layout/FRParameterLayoutAdapter.java | 110 + .../adapters/layout/FRScaleLayoutAdapter.java | 57 + .../layout/FRTabFitLayoutAdapter.java | 0 .../adapters/layout/FRTitleLayoutAdapter.java | 52 + .../layout/FRVerticalLayoutAdapter.java | 84 + .../layout/FRVerticalSplitLayoutAdapter.java | 52 + .../events/CreatorEventListenerTable.java | 0 .../beans/events/DesignerEditListener.java | 14 + .../designer/beans/events/DesignerEditor.java | 82 + .../designer/beans/events/DesignerEvent.java | 43 + .../beans/location/AccessDirection.java | 0 .../design/designer/beans/location/Add.java | 19 + .../designer/beans/location/Bottom.java | 30 + .../designer/beans/location/Direction.java | 45 + .../design/designer/beans/location/Inner.java | 217 + .../design/designer/beans/location/Left.java | 30 + .../designer/beans/location/LeftBottom.java | 32 + .../designer/beans/location/LeftTop.java | 32 + .../designer/beans/location/Location.java | 35 + .../design/designer/beans/location/Outer.java | 27 + .../design/designer/beans/location/Right.java | 30 + .../designer/beans/location/RightBottom.java | 31 + .../designer/beans/location/RightTop.java | 31 + .../beans/location/RootResizeDirection.java | 96 + .../design/designer/beans/location/Top.java | 30 + .../designer/beans/models/AddingModel.java | 0 .../designer/beans/models/SelectionModel.java | 0 .../designer/beans/models/StateModel.java | 0 .../beans/painters/AbstractPainter.java | 0 .../painters/FRAbsoluteLayoutPainter.java | 0 .../beans/painters/FRBorderLayoutPainter.java | 143 + .../beans/painters/FRBoxLayoutPainter.java | 0 .../beans/painters/FRFitLayoutPainter.java | 250 + .../painters/FRGridLayoutAnchorPainter.java | 0 .../beans/painters/FRGridLayoutPainter.java | 0 .../painters/FRHorizontalLayoutPainter.java | 0 .../painters/FRParameterLayoutPainter.java | 17 + .../painters/FRVerticalLayoutPainter.java | 0 .../beans/painters/NullLayoutPainter.java | 29 + .../designer/beans/painters/NullPainter.java | 0 .../creator/CRPropertyDescriptorPane.java | 0 .../creator/DedicateLayoutContainer.java | 0 .../design/designer/creator/ErrorCreator.java | 0 .../design/designer/creator/FormCardPane.java | 244 + .../design/designer/creator/NullCreator.java | 37 + .../designer/creator/PropertyGroupPane.java | 0 .../creator/XAbstractSplitLayout.java | 49 + .../creator/XBorderStyleWidgetCreator.java | 0 .../fr/design/designer/creator/XButton.java | 0 .../design/designer/creator/XChartEditor.java | 281 + .../fr/design/designer/creator/XCheckBox.java | 0 .../designer/creator/XCheckBoxGroup.java | 0 .../fr/design/designer/creator/XComboBox.java | 0 .../designer/creator/XComboCheckBox.java | 0 .../design/designer/creator/XComponent.java | 32 + .../design/designer/creator/XConnector.java | 186 + .../fr/design/designer/creator/XCreator.java | 0 .../designer/creator/XCreatorTools.java | 58 + .../designer/creator/XCreatorUtils.java | 0 .../creator/XCustomWriteAbleRepeatEditor.java | 0 .../design/designer/creator/XDataTable.java | 94 + .../design/designer/creator/XDateEditor.java | 0 .../designer/creator/XDirectWriteEditor.java | 0 .../designer/creator/XEditorHolder.java | 96 + .../design/designer/creator/XElementCase.java | 338 + .../design/designer/creator/XFieldEditor.java | 0 .../designer/creator/XFileUploader.java | 0 .../designer/creator/XIframeEditor.java | 0 .../fr/design/designer/creator/XLabel.java | 0 .../designer/creator/XLayoutContainer.java | 0 .../design/designer/creator/XListEditor.java | 0 .../designer/creator/XMultiFileUploader.java | 0 .../design/designer/creator/XNameWidget.java | 146 + .../designer/creator/XNumberEditor.java | 0 .../fr/design/designer/creator/XPassword.java | 0 .../fr/design/designer/creator/XRadio.java | 0 .../design/designer/creator/XRadioGroup.java | 0 .../design/designer/creator/XTableEditor.java | 0 .../design/designer/creator/XTableTree.java | 57 + .../fr/design/designer/creator/XTextArea.java | 0 .../design/designer/creator/XTextEditor.java | 0 .../designer/creator/XTreeComboBoxEditor.java | 0 .../design/designer/creator/XTreeEditor.java | 0 .../creator/XWAbsoluteBodyLayout.java | 0 .../designer/creator/XWAbsoluteLayout.java | 0 .../designer/creator/XWBorderLayout.java | 0 .../design/designer/creator/XWFitLayout.java | 1188 + .../design/designer/creator/XWGridLayout.java | 0 .../creator/XWHorizontalBoxLayout.java | 0 .../creator/XWHorizontalSplitLayout.java | 40 + .../designer/creator/XWParameterLayout.java | 0 .../designer/creator/XWScaleLayout.java | 169 + .../designer/creator/XWTitleLayout.java | 178 + .../designer/creator/XWVerticalBoxLayout.java | 0 .../creator/XWVerticalSplitLayout.java | 40 + .../designer/creator/XWidgetCreator.java | 0 .../creator/XWrapperedFieldEditor.java | 69 + .../creator/XWriteAbleRepeatEditor.java | 0 .../creator/cardlayout/TabMoveAction.java | 0 .../cardlayout/TabMoveCustomAction.java | 0 .../creator/cardlayout/TabMoveEndAction.java | 0 .../cardlayout/TabMoveFirstAction.java | 0 .../creator/cardlayout/TabMoveNextAction.java | 0 .../creator/cardlayout/TabMovePrevAction.java | 0 .../creator/cardlayout/XCardAddButton.java | 194 + .../creator/cardlayout/XCardSwitchButton.java | 439 + .../creator/cardlayout/XWCardLayout.java | 0 .../cardlayout/XWCardMainBorderLayout.java | 331 + .../creator/cardlayout/XWCardTagLayout.java | 436 + .../creator/cardlayout/XWCardTitleLayout.java | 195 + .../creator/cardlayout/XWTabFitLayout.java | 580 + .../properties/AbsoluteStateRenderer.java | 0 .../properties/AbsoluteStateWrapper.java | 0 .../properties/BodyLayoutAttrRenderer.java | 0 .../designer/properties/BoundsGroupModel.java | 139 + .../properties/CardDefaultShowEditor.java | 11 + .../properties/CardDefaultShowRenderer.java | 11 + .../properties/CardDefaultShowWrapper.java | 11 + .../properties/CardLayoutConstraints.java | 86 + .../CardLayoutPropertiesGroupModel.java | 0 .../designer/properties/DelegateEditor.java | 123 + .../properties/EnumerationEditor.java | 0 .../properties/EventPropertyTable.java | 0 ...bsoluteBodyLayoutPropertiesGroupModel.java | 0 .../FRAbsoluteLayoutPropertiesGroupModel.java | 0 .../properties/FRBorderConstraintsEditor.java | 0 .../properties/FRBorderLayoutConstraints.java | 0 .../FRBorderLayoutConstraintsRenderer.java | 0 .../FRBorderLayoutPropertiesGroupModel.java | 0 .../properties/FRCardConstraintsEditor.java | 10 + .../properties/FRFitLayoutConstraints.java | 161 + .../FRFitLayoutPropertiesGroupModel.java | 207 + .../FRFormLayoutPropertiesGroupModel.java | 0 .../FRGridLayoutPropertiesGroupModel.java | 0 .../FRTabFitLayoutPropertiesGroupModel.java | 157 + .../designer/properties/FitStateRenderer.java | 19 + .../designer/properties/FitStateWrapper.java | 21 + .../FormWidgetAuthorityEditPane.java | 210 + .../properties/HVLayoutConstraints.java | 65 + .../properties/HorizontalAlignmentEditor.java | 0 .../HorizontalAlignmentRenderer.java | 0 .../HorizontalAlignmentWrapper.java | 0 .../HorizontalLayoutConstraints.java | 0 .../HorizontalLayoutPropertiesGroupModel.java | 0 .../properties/HorizontalSplitProperties.java | 15 + .../designer/properties/IconCellEditor.java | 0 .../designer/properties/ItemWrapper.java | 0 .../properties/LayoutConstraintsEditor.java | 0 .../properties/LayoutTypeRenderer.java | 0 .../properties/LayoutTypeWrapper.java | 0 .../properties/MultiSelectionBoundsModel.java | 121 + .../properties/NameWithListeners.java | 0 .../properties/VerticalBoxProperties.java | 102 + .../properties/VerticalLayoutConstraints.java | 0 .../properties/VerticalSplitProperties.java | 105 + .../properties/WidgetPropertyTable.java | 137 + .../items/FRAbsoluteConstraintsItems.java | 0 .../items/FRBorderConstraintsItems.java | 0 .../items/FRFitConstraintsItems.java | 23 + .../properties/items/FRLayoutTypeItems.java | 0 .../items/HorizontalAlignmentItems.java | 0 .../designer/properties/items/Item.java | 0 .../properties/items/ItemProvider.java | 0 .../items/LabelHorizontalAlignmentItems.java | 19 + .../properties/items/LayoutIndexItems.java | 0 .../properties/items/UnderlineItems.java | 17 + .../items/WidgetDisplayPositionItems.java | 24 + .../mobile/BodyAppRelayoutTable.java | 0 .../mobile/BodyMobilePropertyUI.java | 0 .../properties/mobile/BooleanRender.java | 0 .../mobile/ElementCasePropertyTable.java | 0 .../mobile/ElementCasePropertyUI.java | 0 .../mobile/MobileFitAlignmentItems.java | 0 .../properties/mobile/MobileFitEditor.java | 0 .../properties/mobile/MobileFitRender.java | 0 .../properties/mobile/MobileFitWrapper.java | 0 .../treeview/ComponentTreeCellRenderer.java | 65 + .../designer/treeview/ComponentTreeModel.java | 158 + .../src/com/fr/design/form/images/add.png | Bin .../com/fr/design/form/images/delete icon.png | Bin .../design/form/images/delete_hover&click.png | Bin .../fr/design/form/images/delete_normal.png | Bin .../fr/design/form/images/download icon.png | Bin .../com/fr/design/form/images/download.png | Bin .../fr/design/form/images/install icon.png | Bin .../src/com/fr/design/form/images/marked.png | Bin .../src/com/fr/design/form/images/refresh.png | Bin .../com/fr/design/form/images/showmenu.png | Bin .../com/fr/design/form/images/unmarked.png | Bin .../design/form/javascript/FormEmailPane.java | 34 + .../design/form/layout/FRAbsoluteLayout.java | 45 + .../fr/design/form/layout/FRBorderLayout.java | 0 .../fr/design/form/layout/FRCardLayout.java | 0 .../fr/design/form/layout/FRFitLayout.java | 139 + .../fr/design/form/layout/FRFlowLayout.java | 104 + .../fr/design/form/layout/FRFormLayout.java | 0 .../fr/design/form/layout/FRGridLayout.java | 0 .../form/layout/FRHorizontalLayout.java | 0 .../form/layout/FRHorizontalSplitLayout.java | 77 + .../design/form/layout/FRLayoutManager.java | 0 .../form/layout/FRPolyReportLayout.java | 0 .../fr/design/form/layout/FRScaleLayout.java | 87 + .../fr/design/form/layout/FRSplitLayout.java | 180 + .../fr/design/form/layout/FRTitleLayout.java | 160 + .../design/form/layout/FRVerticalLayout.java | 0 .../form/layout/FRVerticalSplitLayout.java | 78 + .../form/mobile/FormMobileAttrPane.java | 0 .../design/form/mobile/MobileToolBarPane.java | 0 .../form/parameter/FormParaDesigner.java | 0 .../form/parameter/FormParaTargetMode.java | 52 + .../form/parameter/RootDesignGroupModel.java | 0 .../fr/design/form/parameter/XFormSubmit.java | 0 .../design/form/util/XCreatorConstants.java | 0 .../fr/design/gui/core/FormWidgetOption.java | 107 + .../gui/xpane/CardTagLayoutBorderPane.java | 112 + .../xpane/CardTagLayoutBorderPreviewPane.java | 14 + .../gui/xpane/FormHyperlinkGroupPane.java | 42 + .../xpane/FormHyperlinkGroupPaneNoPop.java | 0 .../design/gui/xpane/JTreeAutoBuildPane.java | 194 + .../fr/design/gui/xpane/LayoutBorderPane.java | 934 + .../gui/xpane/LayoutBorderPreviewPane.java | 178 + .../fr/design/gui/xpane/ToolTipEditor.java | 249 + .../xtable/AbstractPropertyGroupModel.java | 0 .../design/gui/xtable/PropertyGroupModel.java | 154 + .../xtable/ReportAppPropertyGroupModel.java | 0 .../com/fr/design/gui/xtable/TableUtils.java | 0 .../fr/design/mainframe/AutoScrollSource.java | 69 + .../fr/design/mainframe/ComponentTree.java | 359 + .../fr/design/mainframe/ConnectorHelper.java | 110 + .../com/fr/design/mainframe/CoverPane.java | 0 .../fr/design/mainframe/CoverReportPane.java | 136 + .../mainframe/DesignerTransferHandler.java | 27 + .../mainframe/EditingMouseListener.java | 0 .../mainframe/ElementCaseHelpDialog.java | 0 .../mainframe/ElementCaseThumbnail.java | 0 .../src/com/fr/design/mainframe/FormArea.java | 801 + .../mainframe/FormCreatorDropTarget.java | 261 + .../com/fr/design/mainframe/FormDesigner.java | 1467 + .../mainframe/FormDesignerDropTarget.java | 96 + .../mainframe/FormDesignerModeForSpecial.java | 29 + .../fr/design/mainframe/FormDesignerUI.java | 425 + .../com/fr/design/mainframe/FormDockView.java | 0 .../fr/design/mainframe/FormEditToolBar.java | 0 .../mainframe/FormEditorKeyListener.java | 55 + .../mainframe/FormHierarchyTreePane.java | 222 + .../fr/design/mainframe/FormModelAdapter.java | 104 + .../com/fr/design/mainframe/FormParaPane.java | 189 + .../design/mainframe/FormParaWidgetPane.java | 440 + .../fr/design/mainframe/FormSelection.java | 329 + .../design/mainframe/FormSelectionUtils.java | 0 .../design/mainframe/FormSettingToolBar.java | 0 .../fr/design/mainframe/FormTargetMode.java | 46 + .../com/fr/design/mainframe/FormToolBar.java | 0 .../design/mainframe/FormToolBarButton.java | 0 .../fr/design/mainframe/FormToolBarPane.java | 0 .../fr/design/mainframe/FormUndoState.java | 0 .../mainframe/FormWebWidgetConstants.java | 0 .../mainframe/FormWidgetDetailPane.java | 457 + .../design/mainframe/FormWidgetPopWindow.java | 147 + .../src/com/fr/design/mainframe/JForm.java | 0 .../mainframe/MobileParaWidgetTable.java | 0 .../design/mainframe/MobileWidgetTable.java | 0 .../design/mainframe/ShareWidgetButton.java | 0 .../fr/design/mainframe/ShareWidgetPane.java | 0 .../fr/design/mainframe/TabChangeAction.java | 30 + .../fr/design/mainframe/ToolBarButton.java | 162 + .../design/mainframe/TreeTransferHandler.java | 177 + .../mainframe/WLayoutSelectionPane.java | 0 .../design/mainframe/WidgetPropertyPane.java | 0 .../design/mainframe/WidgetToolBarPane.java | 257 + .../EmbeddedFormExportExportAction.java | 157 + .../actions/FormMobileAttrAction.java | 0 .../mainframe/actions/NewFormAction.java | 56 + .../actions/TemplateParameterAction.java | 0 .../templateinfo/JFormProcessInfo.java | 0 .../mainframe/widget/UITreeComboBox.java | 0 ...ssibleCardTagWLayoutBorderStyleEditor.java | 48 + .../accessibles/AccessibleColorEditor.java | 114 + .../accessibles/AccessibleDateEditor.java | 40 + .../AccessibleDimensionEditor.java | 41 + .../AccessibleElementCaseToolBarEditor.java | 0 .../accessibles/AccessibleFontEditor.java | 45 + .../accessibles/AccessibleFormulaEditor.java | 0 .../AccessibleGridWidgetEditor.java | 39 + .../AccessibleParameterEditor.java | 37 + .../AccessiblePropertyCellEditor.java | 0 .../accessibles/AccessiblePropertyEditor.java | 55 + .../accessibles/AccessibleRegexEditor.java | 51 + .../AccessibleWLayoutBorderStyleEditor.java | 48 + .../AccessibleWidgetValueEditor.java | 5 + .../AccessilePaddingMarginEditor.java | 0 .../widget/accessibles/ColorIcon.java | 0 .../widget/accessibles/ColorPalette.java | 0 .../AbsoluteLayoutDirectionEditor.java | 0 .../widget/editors/AdjustModeEditor.java | 0 .../widget/editors/BackgroundEditor.java | 0 .../widget/editors/BooleanEditor.java | 49 + .../editors/BorderLayoutDirectionEditor.java | 79 + .../widget/editors/ButtonTypeEditor.java | 29 + .../CardTagWLayoutBorderStyleEditor.java | 12 + .../mainframe/widget/editors/ColorEditor.java | 18 + .../widget/editors/ColorTextField.java | 0 .../mainframe/widget/editors/ComboEditor.java | 91 + .../widget/editors/DataTableConfigPane.java | 275 + .../widget/editors/DateFormatEditor.java | 10 + .../widget/editors/DateRangeEditor.java | 60 + .../widget/editors/DecorationEditor.java | 0 .../widget/editors/DictionaryEditor.java | 15 + .../widget/editors/DimensionEditingPane.java | 0 .../widget/editors/DimensionEditor.java | 11 + .../widget/editors/DoubleEditor.java | 0 .../editors/ElementCaseToolBarEditor.java | 0 .../editors/ElementCaseToolBarPane.java | 0 .../editors/FitLayoutDirectionEditor.java | 19 + .../mainframe/widget/editors/FloatEditor.java | 0 .../mainframe/widget/editors/FontEditor.java | 11 + .../widget/editors/FormulaEditor.java | 0 .../mainframe/widget/editors/IconEditor.java | 0 .../widget/editors/ImgBackgroundEditor.java | 12 + .../widget/editors/InChangeBooleanEditor.java | 9 + .../widget/editors/ItemCellEditor.java | 41 + .../widget/editors/LayoutTypeEditor.java | 0 .../mainframe/widget/editors/LongEditor.java | 0 .../editors/NameWidgetComboboxEditor.java | 62 + .../widget/editors/PaddingMarginEditor.java | 0 .../widget/editors/PaddingMarginPane.java | 127 + .../widget/editors/ParameterEditor.java | 11 + .../widget/editors/PercentageEditor.java | 10 + .../widget/editors/RefinedDoubleEditor.java | 0 .../mainframe/widget/editors/RegexEditor.java | 17 + .../widget/editors/ShortCutTextEditor.java | 0 .../editors/SpinnerMaxNumberEditor.java | 0 .../editors/SpinnerMinNumberEditor.java | 0 .../widget/editors/SpinnerNumberEditor.java | 0 .../widget/editors/TreeModelEditor.java | 15 + .../editors/WLayoutBorderStyleEditor.java | 13 + .../widget/editors/WidgetDisplayPosition.java | 46 + .../widget/renderer/BackgroundRenderer.java | 0 .../widget/renderer/ColorCellRenderer.java | 57 + .../widget/renderer/DateCellRenderer.java | 9 + .../widget/renderer/DictionaryRenderer.java | 0 .../renderer/DimensionCellRenderer.java | 10 + .../widget/renderer/EncoderCellRenderer.java | 47 + .../widget/renderer/FontCellRenderer.java | 51 + .../widget/renderer/GridWidgetRenderer.java | 9 + .../renderer/HyperlinkGroupRenderer.java | 0 .../LabelHorizontalAlignmentRenderer.java | 10 + .../renderer/LayoutBorderStyleRenderer.java | 0 .../renderer/PaddingMarginCellRenderer.java | 0 .../widget/renderer/ParameterRenderer.java | 11 + .../widget/renderer/PointCellRenderer.java | 10 + .../widget/renderer/PropertyCellRenderer.java | 24 + .../renderer/RectangleCellRenderer.java | 10 + .../widget/renderer/RegexCellRencerer.java | 9 + .../widget/renderer/TreeModelRenderer.java | 9 + .../renderer/WidgetDisplayPositionRender.java | 16 + .../ui/BasicSetVisiblePropertyPane.java | 0 .../widget/ui/FormBasicPropertyPane.java | 0 .../ui/FormBasicWidgetPropertyPane.java | 0 .../widget/ui/FormWidgetCardPane.java | 0 .../ui/WidgetBasicPropertyPaneFactory.java | 0 .../widget/wrappers/ColorWrapper.java | 134 + .../widget/wrappers/DSColumnWrapper.java | 0 .../widget/wrappers/DateWrapper.java | 24 + .../widget/wrappers/DimensionWrapper.java | 48 + .../wrappers/ElementCaseToolBarWrapper.java | 0 .../widget/wrappers/EventHandlerWrapper.java | 0 .../widget/wrappers/FontWrapper.java | 63 + .../widget/wrappers/FormulaWrapper.java | 0 .../widget/wrappers/GridWidgetWrapper.java | 15 + .../wrappers/HyperlinkGroupWrapper.java | 0 .../LabelHorizontalAlignmentWrapper.java | 11 + .../wrappers/LayoutBorderStyleWrapper.java | 48 + .../widget/wrappers/PaddingMarginWrapper.java | 0 .../widget/wrappers/ParameterWrapper.java | 29 + .../widget/wrappers/PointWrapper.java | 50 + .../widget/wrappers/RectangleWrapper.java | 50 + .../widget/wrappers/RegexWrapper.java | 35 + .../WidgetDisplayPositionWrapper.java | 16 + .../widget/wrappers/WrapperUtils.java | 54 + .../wrappers/primitive/BooleanWrapper.java | 0 .../wrappers/primitive/ByteWrapper.java | 0 .../wrappers/primitive/CharWrapper.java | 0 .../wrappers/primitive/DoubleWrapper.java | 0 .../wrappers/primitive/FloatWrapper.java | 0 .../wrappers/primitive/IntegerWrapper.java | 0 .../wrappers/primitive/LongWrapper.java | 0 .../wrappers/primitive/ShortWrapper.java | 0 .../wrappers/primitive/StringWrapper.java | 0 .../fr/design/module/FormDesignerModule.java | 105 + .../design/parameter/FormParameterReader.java | 0 .../parameter/ParameterPropertyPane.java | 170 + .../parameter/ParameterToolBarPane.java | 174 + .../parameter/RootDesignDefinePane.java | 0 .../FormWidgetDefinePaneFactoryBase.java | 0 .../ui/btn/FormSubmitButtonDetailPane.java | 40 + .../ui/designer/AbstractDataModify.java | 0 .../widget/ui/designer/ButtonDefinePane.java | 0 .../ui/designer/ButtonGroupDictPane.java | 0 .../ui/designer/CheckBoxDefinePane.java | 0 .../ui/designer/CheckBoxGroupDefinePane.java | 0 .../ui/designer/ComboBoxDefinePane.java | 0 .../ui/designer/ComboCheckBoxDefinePane.java | 0 .../CustomWritableRepeatEditorPane.java | 0 .../ui/designer/DateEditorDefinePane.java | 0 .../ui/designer/DefaultWidgetDefinePane.java | 0 .../ui/designer/DictEditorDefinePane.java | 0 .../designer/DirectWriteEditorDefinePane.java | 0 .../ui/designer/FieldEditorDefinePane.java | 0 .../ui/designer/FreeButtonDefinePane.java | 0 .../ui/designer/IframeEditorDefinePane.java | 0 .../widget/ui/designer/LabelDefinePane.java | 0 .../ui/designer/MultiFileEditorPane.java | 0 .../ui/designer/NoneWidgetDefinePane.java | 0 .../ui/designer/NumberEditorDefinePane.java | 0 .../ui/designer/ParameterTreeComboBox.java | 0 .../ui/designer/PasswordDefinePane.java | 0 .../widget/ui/designer/RadioDefinePane.java | 0 .../ui/designer/RadioGroupDefinePane.java | 0 .../ui/designer/TextAreaDefinePane.java | 0 .../designer/TextFieldEditorDefinePane.java | 0 .../TreeComboBoxEditorDefinePane.java | 0 .../ui/designer/TreeEditorDefinePane.java | 0 .../ui/designer/UserEditorDefinePane.java | 0 .../widget/ui/designer/WaterMarkDictPane.java | 0 .../widget/ui/designer/WidgetDefinePane.java | 0 .../ui/designer/WritableRepeatEditorPane.java | 0 .../designer/WriteUnableRepeatEditorPane.java | 0 .../designer/btn/ButtonGroupDefinePane.java | 0 .../designer/component/FontSizeComboPane.java | 0 .../component/FormWidgetValuePane.java | 0 .../designer/component/PaddingBoundPane.java | 0 .../component/TabFitLayoutBackgroundPane.java | 0 .../ui/designer/component/UIBoundSpinner.java | 0 .../component/WidgetAbsoluteBoundPane.java | 0 .../designer/component/WidgetBoundPane.java | 0 .../component/WidgetCardTagBoundPane.java | 0 .../layout/BorderStyleWidgetDefinePane.java | 0 .../layout/ElementEditorDefinePane.java | 0 .../FRAbsoluteBodyLayoutDefinePane.java | 0 .../layout/FRAbsoluteLayoutDefinePane.java | 0 .../layout/FRFitLayoutDefinePane.java | 0 .../layout/WCardLayoutDefinePane.java | 0 .../layout/WCardMainLayoutDefinePane.java | 0 .../layout/WCardTagLayoutDefinePane.java | 0 .../layout/WTabFitLayoutDefinePane.java | 0 .../layout/WTitleLayoutDefinePane.java | 0 .../mobile/ElementCaseDefinePane.java | 0 .../mobile/MobileWidgetDefinePane.java | 0 .../src/com/fr/start/Designer4Form.java | 0 designer-realize/.gitignore | 5 + .../designer/TemplateProcessTracker.aj | 0 .../fr/design/actions/ButtonGroupAction.java | 56 + .../design/actions/CellSelectionAction.java | 0 .../fr/design/actions/ElementCaseAction.java | 0 .../design/actions/FloatSelectionAction.java | 0 .../fr/design/actions/JWorkBookAction.java | 0 .../design/actions/PresentCheckBoxAction.java | 26 + .../design/actions/ReportComponentAction.java | 0 .../actions/SelectionListenerAction.java | 0 .../cell/AbstractCellElementAction.java | 106 + .../fr/design/actions/cell/BorderAction.java | 85 + .../actions/cell/CellAttributeAction.java | 23 + .../cell/CellAttributeTableAction.java | 29 + .../actions/cell/CellExpandAttrAction.java | 24 + .../actions/cell/CellWidgetAttrAction.java | 33 + .../actions/cell/CleanAuthorityAction.java | 0 .../cell/ConditionAttributesAction.java | 0 .../design/actions/cell/EditCellAction.java | 41 + .../design/actions/cell/FloatStyleAction.java | 52 + .../actions/cell/GlobalStyleMenuDef.java | 194 + .../design/actions/cell/NewPresentAction.java | 84 + .../fr/design/actions/cell/StyleAction.java | 33 + .../actions/cell/UIToolbarBorderButton.java | 308 + .../cell/style/AbstractStyleAction.java | 82 + .../actions/cell/style/AlignmentAction.java | 120 + .../cell/style/ReportFontBoldAction.java | 95 + .../style/ReportFontForegroundAction.java | 68 + .../cell/style/ReportFontItalicAction.java | 42 + .../cell/style/ReportFontNameAction.java | 104 + .../cell/style/ReportFontSizeAction.java | 127 + .../cell/style/ReportFontUnderlineAction.java | 43 + .../cell/style/StyleActionInterface.java | 17 + .../cell/style/StyleBackgroundAction.java | 77 + .../AbstractColumnRowIndexAction.java | 0 .../actions/columnrow/CancelColumnAction.java | 38 + .../actions/columnrow/CancelRowAction.java | 40 + .../actions/columnrow/ColumnHideAction.java | 29 + .../columnrow/ColumnRowRepeatAction.java | 0 .../columnrow/ColumnRowSizingAction.java | 0 .../actions/columnrow/ColumnWidthAction.java | 46 + .../columnrow/DSColumnAdvancedAction.java | 36 + .../columnrow/DSColumnBasicAction.java | 88 + .../columnrow/DSColumnConditionAction.java | 51 + .../actions/columnrow/DeleteColumnAction.java | 62 + .../actions/columnrow/DeleteRowAction.java | 63 + .../actions/columnrow/FootColumnAction.java | 24 + .../actions/columnrow/FootRowAction.java | 23 + .../actions/columnrow/HeadColumnAction.java | 23 + .../actions/columnrow/HeadRowAction.java | 24 + .../actions/columnrow/InsertColumnAction.java | 62 + .../actions/columnrow/InsertRowAction.java | 62 + .../columnrow/ResetColumnHideAction.java | 57 + .../actions/columnrow/ResetRowHideAction.java | 57 + .../actions/columnrow/RowHeightAction.java | 47 + .../actions/columnrow/RowHideAction.java | 29 + .../fr/design/actions/edit/DeleteAction.java | 37 + .../edit/EditFloatElementNameAction.java | 70 + .../design/actions/edit/HyperlinkAction.java | 0 .../actions/edit/clear/ClearAction.java | 0 .../actions/edit/clear/ClearAllAction.java | 31 + .../edit/clear/ClearContentsAction.java | 31 + .../edit/clear/ClearFormatsAction.java | 31 + .../actions/edit/clear/ClearWidgetAction.java | 27 + .../actions/edit/merge/MergeCellAction.java | 46 + .../actions/edit/merge/UnmergeCellAction.java | 45 + .../AbstractFloatElementOrderAction.java | 31 + .../order/BringFloatElementForwardAction.java | 38 + .../order/BringFloatElementToFrontAction.java | 39 + .../order/SendFloatElementBackwardAction.java | 39 + .../order/SendFloatElementToBackAction.java | 39 + .../export/AbstractExcelExportAction.java | 42 + .../file/export/AbstractExportAction.java | 184 + .../actions/file/export/CSVExportAction.java | 55 + .../export/EmbeddedExportExportAction.java | 42 + .../file/export/ExcelExportAction.java | 0 .../actions/file/export/PDFExportAction.java | 45 + .../file/export/PageExcelExportAction.java | 31 + .../export/PageToSheetExcelExportAction.java | 39 + .../actions/file/export/SVGExportAction.java | 44 + .../actions/file/export/TextExportAction.java | 43 + .../actions/file/export/WordExportAction.java | 43 + .../file/newReport/NewOEMWorkBookAction.java | 0 .../file/newReport/NewPolyReportAction.java | 0 .../file/newReport/NewWorkBookAction.java | 57 + .../actions/form/AbastractFormECAction.java | 17 + .../actions/form/FormECBackgroundAction.java | 47 + .../actions/form/FormECColumnsAction.java | 52 + .../actions/form/FormECFrozenAction.java | 55 + .../insert/cell/AbstractCellAction.java | 55 + .../actions/insert/cell/BiasCellAction.java | 58 + .../actions/insert/cell/ChartCellAction.java | 57 + .../insert/cell/DSColumnCellAction.java | 32 + .../insert/cell/FormulaCellAction.java | 53 + .../insert/cell/GeneralCellAction.java | 55 + .../actions/insert/cell/ImageCellAction.java | 56 + .../insert/cell/RichTextCellAction.java | 71 + .../insert/cell/SubReportCellAction.java | 71 + .../insert/flot/AbstractShapeAction.java | 31 + .../actions/insert/flot/ChartFloatAction.java | 134 + .../insert/flot/FormulaFloatAction.java | 0 .../actions/insert/flot/ImageFloatAction.java | 136 + .../insert/flot/TextBoxFloatAction.java | 99 + .../report/ReportBackgroundAction.java | 50 + .../actions/report/ReportColumnsAction.java | 46 + .../report/ReportEngineAttrAction.java | 57 + .../report/ReportExportAttrAction.java | 47 + .../actions/report/ReportFooterAction.java | 92 + .../actions/report/ReportHeaderAction.java | 94 + .../report/ReportMobileAttrAction.java | 0 .../actions/report/ReportPageAttrAction.java | 62 + .../actions/report/ReportPageSetupAction.java | 62 + .../actions/report/ReportParameterAction.java | 80 + .../actions/report/ReportWebAttrAction.java | 78 + .../actions/report/ReportWriteAttrAction.java | 77 + .../server/ServerConfigManagerAction.java | 94 + .../actions/server/StyleListAction.java | 84 + .../actions/server/StyleManagerPane.java | 49 + .../actions/server/WidgetManagerAction.java | 90 + .../utils/DeprecatedActionManager.java | 163 + .../actions/utils/ReportActionUtils.java | 0 .../src/com/fr/design/cell/bar/BarHelper.java | 0 .../fr/design/cell/bar/DynamicScrollBar.java | 297 + .../design/cell/bar/DynamicScrollBarUI.java | 221 + .../design/cell/bar/DynamicScrollButton.java | 171 + .../design/cell/bar/ScrollBarUIConstant.java | 34 + .../cell/clipboard/CellElementsClip.java | 148 + .../cell/clipboard/ElementsTransferable.java | 129 + .../cell/clipboard/FloatElementsClip.java | 103 + .../cell/editor/AbstractCellEditor.java | 142 + .../cell/editor/AbstractFloatEditor.java | 108 + .../editor/BiasTextPainterCellEditor.java | 201 + .../com/fr/design/cell/editor/CellEditor.java | 93 + .../design/cell/editor/ChartCellEditor.java | 87 + .../design/cell/editor/ChartFloatEditor.java | 85 + .../cell/editor/ComboBoxCellEditor.java | 62 + .../cell/editor/DSColumnCellEditor.java | 92 + .../fr/design/cell/editor/DateCellEditor.java | 62 + .../fr/design/cell/editor/FloatEditor.java | 77 + .../design/cell/editor/FormulaCellEditor.java | 87 + .../cell/editor/FormulaFloatEditor.java | 82 + .../design/cell/editor/GeneralCellEditor.java | 61 + .../cell/editor/GeneralFloatEditor.java | 34 + .../design/cell/editor/ImageCellEditor.java | 83 + .../design/cell/editor/ImageFloatEditor.java | 78 + .../cell/editor/RichTextCellEditor.java | 102 + .../design/cell/editor/RichTextToolBar.java | 656 + .../cell/editor/SubReportCellEditor.java | 64 + .../fr/design/cell/editor/TextCellEditor.java | 179 + .../design/cell/editor/TextFloatEditor.java | 174 + .../com/fr/design/cell/editor/package.html | 13 + .../AbstractSmartJTablePaneAction.java | 49 + .../cell/smartaction/SmartJTablePane.java | 117 + .../smartaction/SmartJTablePaneAction.java | 8 + .../src/com/fr/design/condition/BackPane.java | 0 .../design/condition/BorderHighlightPane.java | 0 .../fr/design/condition/ColumnWidthPane.java | 0 .../src/com/fr/design/condition/FontPane.java | 0 .../fr/design/condition/ForeGroundPane.java | 0 .../HighLightConditionAttributesPane.java | 110 + .../fr/design/condition/HyperlinkPane.java | 0 .../fr/design/condition/NewRealValuePane.java | 0 .../com/fr/design/condition/PaddingPane.java | 0 .../src/com/fr/design/condition/PagePane.java | 0 .../condition/PresentHighlightPane.java | 0 .../fr/design/condition/RowHeightPane.java | 0 .../src/com/fr/design/condition/WHPane.java | 0 .../design/condition/WidgetHighlightPane.java | 0 .../design/dscolumn/DSColumnAdvancedPane.java | 0 .../fr/design/dscolumn/DSColumnBasicPane.java | 171 + .../dscolumn/DSColumnConditionsPane.java | 106 + .../com/fr/design/dscolumn/DSColumnPane.java | 154 + .../dscolumn/ResultSetGroupDockingPane.java | 237 + .../design/dscolumn/ResultSetGroupPane.java | 118 + .../dscolumn/ResultSetGroupPopUpPane.java | 191 + .../SelectedConfirmedDataColumnPane.java | 45 + .../dscolumn/SelectedDataColumnPane.java | 0 .../dscolumn/SpecifiedGroupAttrPane.java | 401 + .../fr/design/expand/ConditionParentPane.java | 74 + .../src/com/fr/design/expand/Expand.java | 0 .../fr/design/expand/ExpandDirectionPane.java | 101 + .../fr/design/expand/ExpandFatherPane.java | 0 .../design/expand/ExpandLeftFatherPane.java | 24 + .../fr/design/expand/ExpandUpFatherPane.java | 24 + .../src/com/fr/design/expand/ParentPane.java | 353 + .../fr/design/expand/SortExpandAttrPane.java | 92 + .../design/headerfooter/EditFooterPane.java | 28 + .../design/headerfooter/EditHeaderPane.java | 29 + .../headerfooter/HFAttributesEditDialog.java | 375 + .../fr/design/headerfooter/HFComponent.java | 306 + .../fr/design/headerfooter/HFContainer.java | 421 + .../headerfooter/HeaderFooterEditPane.java | 679 + .../design/headerfooter/HeaderFooterPane.java | 238 + .../com/fr/design/headerfooter/ImagePane.java | 109 + .../headerfooter/MoveActionListener.java | 11 + .../design/javascript/ListenerEditPane.java | 167 + .../fr/design/mainframe/AbstractAttrPane.java | 115 + .../design/mainframe/ActiveKeyGenerator.java | 268 + .../mainframe/AuthorityEditToolBarPane.java | 0 .../mainframe/AuthoritySheetEditedPane.java | 53 + .../mainframe/AuthorityToolBarPane.java | 367 + .../mainframe/CellElementPropertyPane.java | 182 + .../mainframe/CellWidgetPropertyPane.java | 0 .../fr/design/mainframe/ElementCasePane.java | 1380 + .../ElementCasePaneAuthorityEditPane.java | 0 .../mainframe/ElementCasePaneDelegate.java | 211 + .../design/mainframe/FormatBrushAction.java | 171 + .../HyperlinkGroupPaneActionImpl.java | 0 .../mainframe/InformationCollector.java | 536 + .../fr/design/mainframe/JPolyWorkBook.java | 46 + .../com/fr/design/mainframe/JWorkBook.java | 1065 + .../mainframe/PolySheetNameTabPane.java | 35 + .../com/fr/design/mainframe/RGridLayout.java | 157 + .../fr/design/mainframe/ReportComponent.java | 81 + .../mainframe/ReportComponentCardPane.java | 0 .../mainframe/ReportComponentComposite.java | 252 + .../fr/design/mainframe/ReportFloatPane.java | 0 .../mainframe/ReportHyperlinkGroupPane.java | 0 .../ReportHyperlinkGroupPaneNoPop.java | 0 .../mainframe/SheetAuthorityEditPane.java | 167 + .../fr/design/mainframe/SheetNameTabPane.java | 976 + .../mainframe/WorkBookModelAdapter.java | 159 + .../design/mainframe/WorkBookUndoState.java | 0 .../design/mainframe/WorkSheetDesigner.java | 0 .../alphafine/AlphaFineConstants.java | 0 .../mainframe/alphafine/AlphaFineHelper.java | 0 .../design/mainframe/alphafine/CellType.java | 0 .../alphafine/cell/CellModelHelper.java | 0 .../alphafine/cell/model/ActionModel.java | 0 .../alphafine/cell/model/AlphaCellModel.java | 0 .../alphafine/cell/model/DocumentModel.java | 0 .../alphafine/cell/model/FileModel.java | 0 .../alphafine/cell/model/MoreModel.java | 0 .../alphafine/cell/model/NoResultModel.java | 0 .../alphafine/cell/model/PluginModel.java | 0 .../cell/render/ContentCellRender.java | 0 .../cell/render/TitleCellRender.java | 0 .../alphafine/component/AlphaFineDialog.java | 0 .../alphafine/component/AlphaFinePane.java | 0 .../component/AlphaFineTextField.java | 0 .../mainframe/alphafine/images/alphafine1.png | Bin .../alphafine/images/alphafine1@2x.png | Bin .../mainframe/alphafine/images/alphafine2.png | Bin .../alphafine/images/alphafine2@2x.png | Bin .../mainframe/alphafine/images/alphafine3.png | Bin .../alphafine/images/alphafine3@2x.png | Bin .../mainframe/alphafine/images/alphafine4.png | Bin .../alphafine/images/alphafine4@2x.png | Bin .../mainframe/alphafine/images/alphafine5.png | Bin .../alphafine/images/alphafine5@2x.png | Bin .../alphafine/images/alphafine_close.png | Bin .../alphafine/images/alphafine_close@2x.png | Bin .../mainframe/alphafine/images/bigloading.gif | Bin .../mainframe/alphafine/images/bigsearch.png | Bin .../alphafine/images/bigsearch@2x.png | Bin .../mainframe/alphafine/images/check.png | Bin .../alphafine/images/default_product.png | Bin .../mainframe/alphafine/images/loading.gif | Bin .../mainframe/alphafine/images/no_result.png | Bin .../alphafine/images/no_result@2x.png | Bin .../mainframe/alphafine/images/noresult.png | Bin .../alphafine/images/noresult@2x.png | Bin .../mainframe/alphafine/images/open.png | Bin .../mainframe/alphafine/images/opening.gif | Bin .../mainframe/alphafine/images/opening@2x.gif | Bin .../mainframe/alphafine/images/remind.png | Bin .../alphafine/images/remind_close.png | Bin .../mainframe/alphafine/images/selected1.png | Bin .../alphafine/images/selected1@2x.png | Bin .../mainframe/alphafine/images/selected2.png | Bin .../alphafine/images/selected2@2x.png | Bin .../mainframe/alphafine/images/selected3.png | Bin .../alphafine/images/selected3@2x.png | Bin .../mainframe/alphafine/images/selected4.png | Bin .../alphafine/images/selected4@2x.png | Bin .../mainframe/alphafine/images/selected5.png | Bin .../alphafine/images/selected5@2x.png | Bin .../alphafine/images/smallsearch.png | Bin .../alphafine/images/smallsearch@2x.png | Bin .../mainframe/alphafine/images/uncheck.png | Bin .../alphafine/listener/ComponentHandler.java | 0 .../alphafine/listener/DocumentAdapter.java | 0 .../alphafine/model/SearchResult.java | 0 .../preview/DocumentPreviewPane.java | 0 .../alphafine/preview/FilePreviewPane.java | 0 .../alphafine/preview/NoResultPane.java | 0 .../alphafine/preview/PluginPreviewPane.java | 0 .../manager/fun/AlphaFineSearchProvider.java | 0 .../manager/impl/ActionSearchManager.java | 0 .../manager/impl/DocumentSearchManager.java | 0 .../manager/impl/FileSearchManager.java | 0 .../manager/impl/PluginSearchManager.java | 0 .../manager/impl/RecentSearchManager.java | 0 .../manager/impl/RecommendSearchManager.java | 0 .../fr/design/mainframe/bbs/BBSConstants.java | 69 + .../fr/design/mainframe/bbs/BBSDialog.java | 0 .../fr/design/mainframe/bbs/BBSGuestPane.java | 92 + .../design/mainframe/bbs/BBSLoginDialog.java | 0 .../fr/design/mainframe/bbs/ExitLabel.java | 81 + .../design/mainframe/bbs/UserInfoLabel.java | 279 + .../fr/design/mainframe/bbs/UserInfoPane.java | 183 + .../fr/design/mainframe/bbs/bbs.properties | 11 + .../fr/design/mainframe/bbs/images/switch.png | Bin .../cell/AbstractDSCellEditorPane.java | 0 .../mainframe/cell/CellElementEditPane.java | 0 .../mainframe/cell/QuickEditorRegion.java | 0 .../settingpane/AbstractCellAttrPane.java | 51 + .../cell/settingpane/CellExpandAttrPane.java | 0 .../cell/settingpane/CellOtherSetPane.java | 528 + .../cell/settingpane/CellPresentPane.java | 122 + .../cell/settingpane/CellStylePane.java | 0 .../settingpane/style/CustomStylePane.java | 0 .../style/PredefinedStylePane.java | 0 .../cell/settingpane/style/StylePane.java | 70 + .../design/mainframe/errorinfo/ErrorInfo.java | 0 .../errorinfo/ErrorInfoLogAppender.java | 0 .../errorinfo/ErrorInfoUploader.java | 0 .../form/FormElementCaseDesigner.java | 312 + .../form/FormElementCasePaneDelegate.java | 163 + .../form/FormReportComponentComposite.java | 206 + .../fr/design/mainframe/form/FormTabPane.java | 245 + .../templateinfo/JWorkBookProcessInfo.java | 0 .../com/fr/design/module/DesignerModule.java | 0 .../parameter/ParameterDefinitePane.java | 0 .../parameter/WorkBookParameterReader.java | 0 .../com/fr/design/present/BarCodePane.java | 0 .../fr/design/present/CellWriteAttrPane.java | 127 + .../design/present/ColumnRowTableModel.java | 94 + .../present/ConditionAttributesGroupPane.java | 128 + .../fr/design/present/CurrencyLinePane.java | 0 .../com/fr/design/present/PresentPane.java | 0 .../com/fr/design/present/StyleArrayPane.java | 106 + .../fr/design/report/BuildInVerifierPane.java | 0 .../fr/design/report/CustomVerifierPane.java | 0 .../fr/design/report/CustomVerifyJobPane.java | 0 .../com/fr/design/report/ExcelExportPane.java | 137 + .../com/fr/design/report/LayerReportPane.java | 159 + .../com/fr/design/report/PDFExportPane.java | 84 + .../com/fr/design/report/PageSetupPane.java | 1108 + .../design/report/ReportBackgroundPane.java | 0 .../fr/design/report/ReportColumnsPane.java | 599 + .../design/report/ReportExportAttrPane.java | 89 + .../com/fr/design/report/ReportStylePane.java | 51 + .../fr/design/report/RichTextEditingPane.java | 198 + .../com/fr/design/report/RichTextPane.java | 326 + .../com/fr/design/report/RowColumnPane.java | 76 + .../com/fr/design/report/SelectImagePane.java | 205 + .../com/fr/design/report/SubReportPane.java | 157 + .../com/fr/design/report/UnitFieldPane.java | 106 + .../design/report/ValueVerifierEditPane.java | 0 .../fr/design/report/VerifierListPane.java | 0 .../fr/design/report/VerifyJobListPane.java | 0 .../com/fr/design/report/WordExportPane.java | 75 + .../fr/design/report/WriteShortCutsPane.java | 121 + .../fr/design/report/freeze/ColSpinner.java | 26 + .../FormECRepeatAndFreezeSettingPane.java | 35 + .../report/freeze/FreezeAndRepeatPane.java | 71 + .../design/report/freeze/FreezePagePane.java | 47 + .../report/freeze/FreezeWriteColPane.java | 41 + .../report/freeze/FreezeWriteRowPane.java | 44 + .../freeze/RepeatAndFreezeSettingPane.java | 599 + .../design/report/freeze/RepeatColPane.java | 38 + .../design/report/freeze/RepeatRowPane.java | 38 + .../fr/design/report/freeze/RowSpinner.java | 32 + .../report/freeze/UICapitalLetterField.java | 63 + .../report/freeze/UIIntNumberField.java | 49 + .../report/mobile/AppFitBrowserPane.java | 0 .../report/mobile/AppFitPreviewPane.java | 0 .../report/mobile/MobileRadioGroupPane.java | 0 .../report/mobile/MobileToolBarPane.java | 0 .../report/mobile/ReportMobileAttrPane.java | 0 .../report/share/ConfuseTabledataAction.java | 73 + .../fr/design/report/share/ConfusionInfo.java | 95 + .../report/share/ConfusionManagerPane.java | 83 + .../report/share/ConfusionTableDataPane.java | 259 + .../fr/design/report/share/ShareButton.java | 194 + .../fr/design/report/share/shareToolTip.html | 50 + .../src/com/fr/design/style/BorderUtils.java | 678 + .../src/com/fr/design/style/StylePane.java | 469 + .../webattr/AbstractEditToolBarPane.java | 50 + .../src/com/fr/design/webattr/CommonPane.java | 73 + .../fr/design/webattr/DragToolBarPane.java | 187 + .../EditReportServerParameterPane.java | 109 + .../com/fr/design/webattr/EditToolBar.java | 677 + .../fr/design/webattr/ErrorTemplatePane.java | 0 .../src/com/fr/design/webattr/EventPane.java | 259 + .../src/com/fr/design/webattr/FToolBar.java | 65 + .../design/webattr/NameOptionSelection.java | 42 + .../fr/design/webattr/PageToolBarPane.java | 196 + .../fr/design/webattr/PageWebSettingPane.java | 135 + .../webattr/ReportSelectToolBarPane.java | 93 + .../webattr/ReportServerPrinterPane.java | 38 + .../fr/design/webattr/ReportWebAttrPane.java | 93 + .../webattr/ReportWebWidgetConstants.java | 0 .../design/webattr/ReportWriteAttrPane.java | 98 + .../fr/design/webattr/ServerPrinterPane.java | 373 + .../com/fr/design/webattr/SettingToolBar.java | 86 + .../com/fr/design/webattr/ToolBarButton.java | 157 + .../fr/design/webattr/ToolBarDragPane.java | 283 + .../com/fr/design/webattr/ToolBarPane.java | 231 + .../fr/design/webattr/ViewToolBarPane.java | 173 + .../fr/design/webattr/ViewWebSettingPane.java | 102 + .../src/com/fr/design/webattr/WebCssPane.java | 125 + .../src/com/fr/design/webattr/WebJsPane.java | 286 + .../com/fr/design/webattr/WebSettingPane.java | 232 + .../fr/design/webattr/WidgetManagerPane.java | 54 + .../fr/design/webattr/WidgetToolBarPane.java | 60 + .../fr/design/webattr/WriteToolBarPane.java | 283 + .../design/webattr/WriteWebSettingPane.java | 197 + .../fr/design/widget/CellWidgetCardPane.java | 0 .../widget/UserDefinedWidgetConfigPane.java | 35 + .../com/fr/design/widget/ValueWidgetPane.java | 90 + .../fr/design/widget/WidgetConfigPane.java | 61 + .../widget/WidgetDefinePaneFactory.java | 95 + .../com/fr/design/widget/WidgetEventPane.java | 155 + .../design/widget/WidgetEventPaneNoPop.java | 0 .../design/widget/WidgetManageCardPane.java | 0 .../src/com/fr/design/widget/WidgetPane.java | 0 .../design/widget/ui/AbstractDataModify.java | 0 .../ui/BasicWidgetPropertySettingPane.java | 0 .../fr/design/widget/ui/ButtonDefinePane.java | 60 + .../design/widget/ui/ButtonGroupDictPane.java | 81 + .../design/widget/ui/CheckBoxDefinePane.java | 59 + .../widget/ui/CheckBoxGroupDefinePane.java | 81 + .../design/widget/ui/ComboBoxDefinePane.java | 56 + .../widget/ui/ComboCheckBoxDefinePane.java | 78 + .../ui/CustomWritableRepeatEditorPane.java | 0 .../widget/ui/DateEditorDefinePane.java | 237 + .../ui/DirectWriteEditorDefinePane.java | 70 + .../widget/ui/FieldEditorDefinePane.java | 0 .../widget/ui/IframeEditorDefinePane.java | 132 + .../widget/ui/ListEditorDefinePane.java | 70 + .../design/widget/ui/MultiFileEditorPane.java | 0 .../widget/ui/NoneWidgetDefinePane.java | 25 + .../widget/ui/NumberEditorDefinePane.java | 56 + .../widget/ui/ParameterTreeComboBox.java | 180 + .../design/widget/ui/PasswordDefinePane.java | 19 + .../fr/design/widget/ui/RadioDefinePane.java | 44 + .../widget/ui/RadioGroupDefinePane.java | 50 + .../design/widget/ui/TextAreaDefinePane.java | 19 + .../widget/ui/TextFieldEditorDefinePane.java | 91 + .../ui/TreeComboBoxEditorDefinePane.java | 76 + .../widget/ui/TreeEditorDefinePane.java | 94 + .../widget/ui/UserEditorDefinePane.java | 46 + .../design/widget/ui/WaterMarkDictPane.java | 0 .../widget/ui/WritableRepeatEditorPane.java | 0 .../ui/WriteUnableRepeatEditorPane.java | 73 + .../ui/btn/AppendRowButtonDefinePane.java | 58 + .../ui/btn/ButtonDetailPaneFactory.java | 69 + .../widget/ui/btn/ButtonSytleDefinedPane.java | 144 + .../ui/btn/DefaultButtonDetailPane.java | 30 + .../widget/ui/btn/DefaultButtonStylePane.java | 56 + .../ui/btn/DefineAppendColumnRowPane.java | 72 + .../ui/btn/DefineDeleteColumnRowPane.java | 62 + .../ui/btn/DeleteRowButtonDefinePane.java | 51 + .../widget/ui/btn/FreeButtonDetailPane.java | 38 + .../btn/TreeNodeToogleButtonDefinePane.java | 62 + .../fr/design/write/submit/DefaultSubmit.java | 0 ...InsertDBManipulationInWidgetEventPane.java | 38 + .../submit/SmartInsertDBManipulationPane.java | 593 + .../write/submit/SmartInsertDMLJobPane.java | 38 + .../write/submit/SubmitVisitorListPane.java | 0 .../grid/AbstractGridHeaderMouseHandler.java | 514 + .../src/com/fr/grid/BaseGridComponent.java | 40 + .../src/com/fr/grid/CellElementPainter.java | 23 + .../com/fr/grid/DefaultGridUIProcessor.java | 0 .../src/com/fr/grid/DrawFlowRect.java | 235 + designer-realize/src/com/fr/grid/Grid.java | 1439 + .../src/com/fr/grid/GridColumn.java | 78 + .../com/fr/grid/GridColumnMouseHandler.java | 183 + .../src/com/fr/grid/GridColumnUI.java | 214 + .../src/com/fr/grid/GridCorner.java | 101 + .../com/fr/grid/GridCornerMouseHandler.java | 57 + .../src/com/fr/grid/GridHeader.java | 107 + .../src/com/fr/grid/GridKeyAction.java | 196 + .../src/com/fr/grid/GridKeyListener.java | 220 + .../src/com/fr/grid/GridMouseAdapter.java | 835 + designer-realize/src/com/fr/grid/GridRow.java | 86 + .../src/com/fr/grid/GridRowMouseHandler.java | 173 + .../src/com/fr/grid/GridRowUI.java | 179 + .../src/com/fr/grid/GridUI.java | 0 .../src/com/fr/grid/GridUtils.java | 482 + .../src/com/fr/grid/IntelliElements.java | 0 .../src/com/fr/grid/KeyEventWork.java | 202 + .../grid/dnd/ElementCasePaneDropTarget.java | 284 + .../com/fr/grid/event/CellEditorEvent.java | 19 + .../com/fr/grid/event/CellEditorListener.java | 21 + .../com/fr/grid/event/FloatEditorEvent.java | 19 + .../fr/grid/event/FloatEditorListener.java | 21 + .../src/com/fr/grid/event/package.html | 6 + .../com/fr/grid/selection/CellSelection.java | 0 .../com/fr/grid/selection/FloatSelection.java | 0 .../src/com/fr/grid/selection/Selection.java | 0 .../src/com/fr/poly/JPolyBlockPane.java | 31 + .../src/com/fr/poly/PolyArea.java | 30 + .../src/com/fr/poly/PolyBlockProperPane.java | 58 + .../src/com/fr/poly/PolyBlockProperTable.java | 115 + .../src/com/fr/poly/PolyComponetsBar.java | 141 + .../src/com/fr/poly/PolyConstants.java | 18 + .../src/com/fr/poly/PolyDesignUI.java | 0 .../src/com/fr/poly/PolyDesigner.java | 0 .../src/com/fr/poly/PolyDesignerLayout.java | 112 + .../src/com/fr/poly/PolyEditorLayout.java | 65 + .../src/com/fr/poly/PolyUtils.java | 0 .../fr/poly/actions/DeleteBlockAction.java | 52 + .../src/com/fr/poly/creator/BlockCreator.java | 178 + .../src/com/fr/poly/creator/BlockEditor.java | 223 + .../fr/poly/creator/BlockEditorLayout.java | 140 + .../fr/poly/creator/ChartBlockCreator.java | 0 .../com/fr/poly/creator/ChartBlockEditor.java | 288 + .../com/fr/poly/creator/ECBlockCreator.java | 159 + .../com/fr/poly/creator/ECBlockEditor.java | 186 + .../src/com/fr/poly/creator/ECBlockPane.java | 170 + .../fr/poly/creator/PolyElementCasePane.java | 28 + .../com/fr/poly/group/PolyBoundsGroup.java | 127 + .../src/com/fr/poly/group/PolyNameGroup.java | 66 + .../fr/poly/hanlder/BlockForbiddenWindow.java | 55 + .../hanlder/BlockOperationMouseHandler.java | 27 + .../hanlder/BottomCornerMouseHanlder.java | 249 + .../hanlder/ColumnOperationMouseHandler.java | 150 + .../fr/poly/hanlder/DataEditingListener.java | 48 + .../poly/hanlder/PolyDesignerDropTarget.java | 233 + .../hanlder/RowOperationMouseHandler.java | 147 + .../src/com/fr/poly/model/AddedData.java | 64 + .../src/com/fr/poly/model/AddingData.java | 62 + .../com/fr/quickeditor/CellQuickEditor.java | 0 .../com/fr/quickeditor/FloatQuickEditor.java | 24 + .../cellquick/CellBiasTextPainterEditor.java | 0 .../cellquick/CellDSColumnEditor.java | 0 .../cellquick/CellFormulaQuickEditor.java | 0 .../cellquick/CellImageQuickEditor.java | 0 .../cellquick/CellRichTextEditor.java | 0 .../cellquick/CellStringQuickEditor.java | 0 .../cellquick/CellSubReportEditor.java | 0 .../layout/CellElementBarLayout.java | 0 .../chartquick/BasicChartQuickEditor.java | 0 .../chartquick/FloatChartQuickEditor.java | 0 .../chartquick/PolyChartQuickEditor.java | 0 .../floatquick/FloatImageQuickEditor.java | 0 .../floatquick/FloatStringQuickEditor.java | 0 .../src/com/fr/start/BISplashPane.java | 27 + .../start/CollectUserInformationDialog.java | 204 + .../src/com/fr/start/Designer.java | 0 .../src/com/fr/start/Designer4Debug.java | 0 .../src/com/fr/start/EnvSwitcher.java | 0 .../src/com/fr/start/ReportSplashPane.java | 189 + .../fr/start/module/DesignerEnvProvider.java | 0 .../start/module/DesignerModuleActivator.java | 0 .../com/fr/start/module/DesignerStartup.java | 0 .../fr/start/module/PreStartActivator.java | 0 .../fr/start/module/StartFinishActivator.java | 0 .../src/com/fr/start/module/StartupArgs.java | 0 designer/.classpath | 62 - designer/.project | 1 - .../fr/design/actions/ButtonGroupAction.java | 56 - .../design/actions/PresentCheckBoxAction.java | 26 - .../cell/AbstractCellElementAction.java | 106 - .../fr/design/actions/cell/BorderAction.java | 85 - .../actions/cell/CellAttributeAction.java | 23 - .../cell/CellAttributeTableAction.java | 29 - .../actions/cell/CellExpandAttrAction.java | 24 - .../actions/cell/CellWidgetAttrAction.java | 33 - .../design/actions/cell/EditCellAction.java | 41 - .../design/actions/cell/FloatStyleAction.java | 52 - .../actions/cell/GlobalStyleMenuDef.java | 194 - .../design/actions/cell/NewPresentAction.java | 84 - .../fr/design/actions/cell/StyleAction.java | 33 - .../actions/cell/UIToolbarBorderButton.java | 308 - .../cell/style/AbstractStyleAction.java | 82 - .../actions/cell/style/AlignmentAction.java | 120 - .../cell/style/ReportFontBoldAction.java | 95 - .../style/ReportFontForegroundAction.java | 68 - .../cell/style/ReportFontItalicAction.java | 42 - .../cell/style/ReportFontNameAction.java | 104 - .../cell/style/ReportFontSizeAction.java | 127 - .../cell/style/ReportFontUnderlineAction.java | 43 - .../cell/style/StyleActionInterface.java | 17 - .../cell/style/StyleBackgroundAction.java | 77 - .../actions/columnrow/CancelColumnAction.java | 38 - .../actions/columnrow/CancelRowAction.java | 40 - .../actions/columnrow/ColumnHideAction.java | 29 - .../actions/columnrow/ColumnWidthAction.java | 46 - .../columnrow/DSColumnAdvancedAction.java | 36 - .../columnrow/DSColumnBasicAction.java | 88 - .../columnrow/DSColumnConditionAction.java | 51 - .../actions/columnrow/DeleteColumnAction.java | 62 - .../actions/columnrow/DeleteRowAction.java | 63 - .../actions/columnrow/FootColumnAction.java | 24 - .../actions/columnrow/FootRowAction.java | 23 - .../actions/columnrow/HeadColumnAction.java | 23 - .../actions/columnrow/HeadRowAction.java | 24 - .../actions/columnrow/InsertColumnAction.java | 62 - .../actions/columnrow/InsertRowAction.java | 62 - .../columnrow/ResetColumnHideAction.java | 57 - .../actions/columnrow/ResetRowHideAction.java | 57 - .../actions/columnrow/RowHeightAction.java | 47 - .../actions/columnrow/RowHideAction.java | 29 - .../fr/design/actions/edit/DeleteAction.java | 37 - .../edit/EditFloatElementNameAction.java | 70 - .../actions/edit/clear/ClearAllAction.java | 31 - .../edit/clear/ClearContentsAction.java | 31 - .../edit/clear/ClearFormatsAction.java | 31 - .../actions/edit/clear/ClearWidgetAction.java | 27 - .../actions/edit/merge/MergeCellAction.java | 46 - .../actions/edit/merge/UnmergeCellAction.java | 45 - .../AbstractFloatElementOrderAction.java | 31 - .../order/BringFloatElementForwardAction.java | 38 - .../order/BringFloatElementToFrontAction.java | 39 - .../order/SendFloatElementBackwardAction.java | 39 - .../order/SendFloatElementToBackAction.java | 39 - .../export/AbstractExcelExportAction.java | 42 - .../file/export/AbstractExportAction.java | 184 - .../actions/file/export/CSVExportAction.java | 55 - .../export/EmbeddedExportExportAction.java | 42 - .../actions/file/export/PDFExportAction.java | 45 - .../file/export/PageExcelExportAction.java | 31 - .../export/PageToSheetExcelExportAction.java | 39 - .../actions/file/export/SVGExportAction.java | 44 - .../actions/file/export/TextExportAction.java | 43 - .../actions/file/export/WordExportAction.java | 43 - .../file/newReport/NewWorkBookAction.java | 57 - .../actions/form/AbastractFormECAction.java | 17 - .../actions/form/FormECBackgroundAction.java | 47 - .../actions/form/FormECColumnsAction.java | 52 - .../actions/form/FormECFrozenAction.java | 55 - .../insert/cell/AbstractCellAction.java | 55 - .../actions/insert/cell/BiasCellAction.java | 58 - .../actions/insert/cell/ChartCellAction.java | 57 - .../insert/cell/DSColumnCellAction.java | 32 - .../insert/cell/FormulaCellAction.java | 53 - .../insert/cell/GeneralCellAction.java | 55 - .../actions/insert/cell/ImageCellAction.java | 56 - .../insert/cell/RichTextCellAction.java | 71 - .../insert/cell/SubReportCellAction.java | 71 - .../insert/flot/AbstractShapeAction.java | 31 - .../actions/insert/flot/ChartFloatAction.java | 134 - .../actions/insert/flot/ImageFloatAction.java | 136 - .../insert/flot/TextBoxFloatAction.java | 99 - .../report/ReportBackgroundAction.java | 50 - .../actions/report/ReportColumnsAction.java | 46 - .../report/ReportEngineAttrAction.java | 57 - .../report/ReportExportAttrAction.java | 47 - .../actions/report/ReportFooterAction.java | 92 - .../actions/report/ReportHeaderAction.java | 94 - .../actions/report/ReportPageAttrAction.java | 62 - .../actions/report/ReportPageSetupAction.java | 62 - .../actions/report/ReportParameterAction.java | 80 - .../actions/report/ReportWebAttrAction.java | 78 - .../actions/report/ReportWriteAttrAction.java | 77 - .../server/ServerConfigManagerAction.java | 94 - .../actions/server/StyleListAction.java | 84 - .../actions/server/StyleManagerPane.java | 49 - .../actions/server/WidgetManagerAction.java | 90 - .../utils/DeprecatedActionManager.java | 163 - .../fr/design/cell/bar/DynamicScrollBar.java | 297 - .../design/cell/bar/DynamicScrollBarUI.java | 221 - .../design/cell/bar/DynamicScrollButton.java | 171 - .../design/cell/bar/ScrollBarUIConstant.java | 34 - .../cell/clipboard/CellElementsClip.java | 148 - .../cell/clipboard/ElementsTransferable.java | 129 - .../cell/clipboard/FloatElementsClip.java | 103 - .../cell/editor/AbstractCellEditor.java | 142 - .../cell/editor/AbstractFloatEditor.java | 108 - .../editor/BiasTextPainterCellEditor.java | 201 - .../com/fr/design/cell/editor/CellEditor.java | 93 - .../design/cell/editor/ChartCellEditor.java | 87 - .../design/cell/editor/ChartFloatEditor.java | 85 - .../cell/editor/ComboBoxCellEditor.java | 62 - .../cell/editor/DSColumnCellEditor.java | 92 - .../fr/design/cell/editor/DateCellEditor.java | 62 - .../fr/design/cell/editor/FloatEditor.java | 77 - .../design/cell/editor/FormulaCellEditor.java | 87 - .../cell/editor/FormulaFloatEditor.java | 82 - .../design/cell/editor/GeneralCellEditor.java | 61 - .../cell/editor/GeneralFloatEditor.java | 34 - .../design/cell/editor/ImageCellEditor.java | 83 - .../design/cell/editor/ImageFloatEditor.java | 78 - .../cell/editor/RichTextCellEditor.java | 102 - .../design/cell/editor/RichTextToolBar.java | 656 - .../cell/editor/SubReportCellEditor.java | 64 - .../fr/design/cell/editor/TextCellEditor.java | 179 - .../design/cell/editor/TextFloatEditor.java | 174 - .../com/fr/design/cell/editor/package.html | 13 - .../AbstractSmartJTablePaneAction.java | 49 - .../cell/smartaction/SmartJTablePane.java | 117 - .../smartaction/SmartJTablePaneAction.java | 8 - .../HighLightConditionAttributesPane.java | 110 - .../fr/design/dscolumn/DSColumnBasicPane.java | 171 - .../dscolumn/DSColumnConditionsPane.java | 106 - .../com/fr/design/dscolumn/DSColumnPane.java | 154 - .../dscolumn/ResultSetGroupDockingPane.java | 237 - .../design/dscolumn/ResultSetGroupPane.java | 118 - .../dscolumn/ResultSetGroupPopUpPane.java | 191 - .../SelectedConfirmedDataColumnPane.java | 45 - .../dscolumn/SpecifiedGroupAttrPane.java | 401 - .../fr/design/expand/ConditionParentPane.java | 74 - .../fr/design/expand/ExpandDirectionPane.java | 101 - .../design/expand/ExpandLeftFatherPane.java | 24 - .../fr/design/expand/ExpandUpFatherPane.java | 24 - .../src/com/fr/design/expand/ParentPane.java | 353 - .../fr/design/expand/SortExpandAttrPane.java | 92 - .../design/headerfooter/EditFooterPane.java | 28 - .../design/headerfooter/EditHeaderPane.java | 29 - .../headerfooter/HFAttributesEditDialog.java | 375 - .../fr/design/headerfooter/HFComponent.java | 306 - .../fr/design/headerfooter/HFContainer.java | 421 - .../headerfooter/HeaderFooterEditPane.java | 679 - .../design/headerfooter/HeaderFooterPane.java | 238 - .../com/fr/design/headerfooter/ImagePane.java | 109 - .../headerfooter/MoveActionListener.java | 11 - .../design/javascript/ListenerEditPane.java | 167 - .../fr/design/mainframe/AbstractAttrPane.java | 115 - .../design/mainframe/ActiveKeyGenerator.java | 268 - .../mainframe/AuthoritySheetEditedPane.java | 53 - .../mainframe/AuthorityToolBarPane.java | 367 - .../mainframe/CellElementPropertyPane.java | 182 - .../fr/design/mainframe/ElementCasePane.java | 1380 - .../mainframe/ElementCasePaneDelegate.java | 211 - .../design/mainframe/FormatBrushAction.java | 171 - .../mainframe/InformationCollector.java | 536 - .../fr/design/mainframe/JPolyWorkBook.java | 46 - .../com/fr/design/mainframe/JWorkBook.java | 1065 - .../mainframe/PolySheetNameTabPane.java | 35 - .../com/fr/design/mainframe/RGridLayout.java | 157 - .../fr/design/mainframe/ReportComponent.java | 81 - .../mainframe/ReportComponentComposite.java | 252 - .../mainframe/SheetAuthorityEditPane.java | 167 - .../fr/design/mainframe/SheetNameTabPane.java | 976 - .../mainframe/WorkBookModelAdapter.java | 159 - .../fr/design/mainframe/bbs/BBSConstants.java | 69 - .../fr/design/mainframe/bbs/BBSGuestPane.java | 92 - .../fr/design/mainframe/bbs/ExitLabel.java | 81 - .../design/mainframe/bbs/UserInfoLabel.java | 279 - .../fr/design/mainframe/bbs/UserInfoPane.java | 183 - .../fr/design/mainframe/bbs/bbs.properties | 11 - .../settingpane/AbstractCellAttrPane.java | 51 - .../cell/settingpane/CellOtherSetPane.java | 528 - .../cell/settingpane/CellPresentPane.java | 122 - .../cell/settingpane/style/StylePane.java | 70 - .../form/FormElementCaseDesigner.java | 312 - .../form/FormElementCasePaneDelegate.java | 163 - .../form/FormReportComponentComposite.java | 206 - .../fr/design/mainframe/form/FormTabPane.java | 245 - .../fr/design/present/CellWriteAttrPane.java | 127 - .../design/present/ColumnRowTableModel.java | 94 - .../present/ConditionAttributesGroupPane.java | 128 - .../com/fr/design/present/StyleArrayPane.java | 106 - .../com/fr/design/report/ExcelExportPane.java | 137 - .../com/fr/design/report/LayerReportPane.java | 159 - .../com/fr/design/report/PDFExportPane.java | 84 - .../com/fr/design/report/PageSetupPane.java | 1108 - .../fr/design/report/ReportColumnsPane.java | 599 - .../design/report/ReportExportAttrPane.java | 89 - .../com/fr/design/report/ReportStylePane.java | 51 - .../fr/design/report/RichTextEditingPane.java | 198 - .../com/fr/design/report/RichTextPane.java | 326 - .../com/fr/design/report/RowColumnPane.java | 76 - .../com/fr/design/report/SelectImagePane.java | 205 - .../com/fr/design/report/SubReportPane.java | 157 - .../com/fr/design/report/UnitFieldPane.java | 106 - .../com/fr/design/report/WordExportPane.java | 75 - .../fr/design/report/WriteShortCutsPane.java | 121 - .../fr/design/report/freeze/ColSpinner.java | 26 - .../FormECRepeatAndFreezeSettingPane.java | 35 - .../report/freeze/FreezeAndRepeatPane.java | 71 - .../design/report/freeze/FreezePagePane.java | 47 - .../report/freeze/FreezeWriteColPane.java | 41 - .../report/freeze/FreezeWriteRowPane.java | 44 - .../freeze/RepeatAndFreezeSettingPane.java | 599 - .../design/report/freeze/RepeatColPane.java | 38 - .../design/report/freeze/RepeatRowPane.java | 38 - .../fr/design/report/freeze/RowSpinner.java | 32 - .../report/freeze/UICapitalLetterField.java | 63 - .../report/freeze/UIIntNumberField.java | 49 - .../report/share/ConfuseTabledataAction.java | 73 - .../fr/design/report/share/ConfusionInfo.java | 95 - .../report/share/ConfusionManagerPane.java | 83 - .../report/share/ConfusionTableDataPane.java | 259 - .../fr/design/report/share/ShareButton.java | 194 - .../fr/design/report/share/shareToolTip.html | 50 - .../src/com/fr/design/style/BorderUtils.java | 678 - .../src/com/fr/design/style/StylePane.java | 469 - .../webattr/AbstractEditToolBarPane.java | 50 - .../src/com/fr/design/webattr/CommonPane.java | 73 - .../fr/design/webattr/DragToolBarPane.java | 187 - .../EditReportServerParameterPane.java | 109 - .../com/fr/design/webattr/EditToolBar.java | 677 - .../src/com/fr/design/webattr/EventPane.java | 259 - .../src/com/fr/design/webattr/FToolBar.java | 65 - .../design/webattr/NameOptionSelection.java | 42 - .../fr/design/webattr/PageToolBarPane.java | 196 - .../fr/design/webattr/PageWebSettingPane.java | 135 - .../webattr/ReportSelectToolBarPane.java | 93 - .../webattr/ReportServerPrinterPane.java | 38 - .../fr/design/webattr/ReportWebAttrPane.java | 93 - .../design/webattr/ReportWriteAttrPane.java | 98 - .../fr/design/webattr/ServerPrinterPane.java | 373 - .../com/fr/design/webattr/SettingToolBar.java | 86 - .../com/fr/design/webattr/ToolBarButton.java | 157 - .../fr/design/webattr/ToolBarDragPane.java | 283 - .../com/fr/design/webattr/ToolBarPane.java | 231 - .../fr/design/webattr/ViewToolBarPane.java | 173 - .../fr/design/webattr/ViewWebSettingPane.java | 102 - .../src/com/fr/design/webattr/WebCssPane.java | 125 - .../src/com/fr/design/webattr/WebJsPane.java | 286 - .../com/fr/design/webattr/WebSettingPane.java | 232 - .../fr/design/webattr/WidgetManagerPane.java | 54 - .../fr/design/webattr/WidgetToolBarPane.java | 60 - .../fr/design/webattr/WriteToolBarPane.java | 283 - .../design/webattr/WriteWebSettingPane.java | 197 - .../widget/UserDefinedWidgetConfigPane.java | 35 - .../com/fr/design/widget/ValueWidgetPane.java | 90 - .../fr/design/widget/WidgetConfigPane.java | 61 - .../widget/WidgetDefinePaneFactory.java | 95 - .../com/fr/design/widget/WidgetEventPane.java | 155 - .../fr/design/widget/ui/ButtonDefinePane.java | 60 - .../design/widget/ui/ButtonGroupDictPane.java | 81 - .../design/widget/ui/CheckBoxDefinePane.java | 59 - .../widget/ui/CheckBoxGroupDefinePane.java | 81 - .../design/widget/ui/ComboBoxDefinePane.java | 56 - .../widget/ui/ComboCheckBoxDefinePane.java | 78 - .../widget/ui/DateEditorDefinePane.java | 237 - .../ui/DirectWriteEditorDefinePane.java | 70 - .../widget/ui/IframeEditorDefinePane.java | 132 - .../widget/ui/ListEditorDefinePane.java | 70 - .../widget/ui/NoneWidgetDefinePane.java | 25 - .../widget/ui/NumberEditorDefinePane.java | 56 - .../widget/ui/ParameterTreeComboBox.java | 180 - .../design/widget/ui/PasswordDefinePane.java | 19 - .../fr/design/widget/ui/RadioDefinePane.java | 44 - .../widget/ui/RadioGroupDefinePane.java | 50 - .../design/widget/ui/TextAreaDefinePane.java | 19 - .../widget/ui/TextFieldEditorDefinePane.java | 91 - .../ui/TreeComboBoxEditorDefinePane.java | 76 - .../widget/ui/TreeEditorDefinePane.java | 94 - .../widget/ui/UserEditorDefinePane.java | 46 - .../ui/WriteUnableRepeatEditorPane.java | 73 - .../ui/btn/AppendRowButtonDefinePane.java | 58 - .../ui/btn/ButtonDetailPaneFactory.java | 69 - .../widget/ui/btn/ButtonSytleDefinedPane.java | 144 - .../ui/btn/DefaultButtonDetailPane.java | 30 - .../widget/ui/btn/DefaultButtonStylePane.java | 56 - .../ui/btn/DefineAppendColumnRowPane.java | 72 - .../ui/btn/DefineDeleteColumnRowPane.java | 62 - .../ui/btn/DeleteRowButtonDefinePane.java | 51 - .../widget/ui/btn/FreeButtonDetailPane.java | 38 - .../btn/TreeNodeToogleButtonDefinePane.java | 62 - ...InsertDBManipulationInWidgetEventPane.java | 38 - .../submit/SmartInsertDBManipulationPane.java | 593 - .../write/submit/SmartInsertDMLJobPane.java | 38 - .../grid/AbstractGridHeaderMouseHandler.java | 514 - .../src/com/fr/grid/BaseGridComponent.java | 40 - .../src/com/fr/grid/CellElementPainter.java | 23 - designer/src/com/fr/grid/DrawFlowRect.java | 235 - designer/src/com/fr/grid/Grid.java | 1439 - designer/src/com/fr/grid/GridColumn.java | 78 - .../com/fr/grid/GridColumnMouseHandler.java | 183 - designer/src/com/fr/grid/GridColumnUI.java | 214 - designer/src/com/fr/grid/GridCorner.java | 101 - .../com/fr/grid/GridCornerMouseHandler.java | 57 - designer/src/com/fr/grid/GridHeader.java | 107 - designer/src/com/fr/grid/GridKeyAction.java | 196 - designer/src/com/fr/grid/GridKeyListener.java | 220 - .../src/com/fr/grid/GridMouseAdapter.java | 835 - designer/src/com/fr/grid/GridRow.java | 86 - .../src/com/fr/grid/GridRowMouseHandler.java | 173 - designer/src/com/fr/grid/GridRowUI.java | 179 - designer/src/com/fr/grid/GridUtils.java | 482 - designer/src/com/fr/grid/KeyEventWork.java | 202 - .../grid/dnd/ElementCasePaneDropTarget.java | 284 - .../com/fr/grid/event/CellEditorEvent.java | 19 - .../com/fr/grid/event/CellEditorListener.java | 21 - .../com/fr/grid/event/FloatEditorEvent.java | 19 - .../fr/grid/event/FloatEditorListener.java | 21 - designer/src/com/fr/grid/event/package.html | 6 - designer/src/com/fr/poly/JPolyBlockPane.java | 31 - designer/src/com/fr/poly/PolyArea.java | 30 - .../src/com/fr/poly/PolyBlockProperPane.java | 58 - .../src/com/fr/poly/PolyBlockProperTable.java | 115 - .../src/com/fr/poly/PolyComponetsBar.java | 141 - designer/src/com/fr/poly/PolyConstants.java | 18 - .../src/com/fr/poly/PolyDesignerLayout.java | 112 - .../src/com/fr/poly/PolyEditorLayout.java | 65 - .../fr/poly/actions/DeleteBlockAction.java | 52 - .../src/com/fr/poly/creator/BlockCreator.java | 178 - .../src/com/fr/poly/creator/BlockEditor.java | 223 - .../fr/poly/creator/BlockEditorLayout.java | 140 - .../com/fr/poly/creator/ChartBlockEditor.java | 288 - .../com/fr/poly/creator/ECBlockCreator.java | 159 - .../com/fr/poly/creator/ECBlockEditor.java | 186 - .../src/com/fr/poly/creator/ECBlockPane.java | 170 - .../fr/poly/creator/PolyElementCasePane.java | 28 - .../com/fr/poly/group/PolyBoundsGroup.java | 127 - .../src/com/fr/poly/group/PolyNameGroup.java | 66 - .../fr/poly/hanlder/BlockForbiddenWindow.java | 55 - .../hanlder/BlockOperationMouseHandler.java | 27 - .../hanlder/BottomCornerMouseHanlder.java | 249 - .../hanlder/ColumnOperationMouseHandler.java | 150 - .../fr/poly/hanlder/DataEditingListener.java | 48 - .../poly/hanlder/PolyDesignerDropTarget.java | 233 - .../hanlder/RowOperationMouseHandler.java | 147 - designer/src/com/fr/poly/model/AddedData.java | 64 - .../src/com/fr/poly/model/AddingData.java | 62 - .../com/fr/quickeditor/FloatQuickEditor.java | 24 - designer/src/com/fr/start/BISplashPane.java | 27 - .../start/CollectUserInformationDialog.java | 204 - .../src/com/fr/start/ReportSplashPane.java | 189 - designer_base/.classpath | 59 - designer_base/.project | 1 - designer_base/build.9.0.gradle | 96 - designer_base/build.9.0.gradle.bak | 96 - designer_base/build.base.gradle | 104 - designer_base/build.dev.gradle | 87 - designer_base/build.dev.gradle.bak | 70 - designer_base/build.master.gradle | 88 - designer_base/build.master.gradle.bak | 89 - designer_base/build.performance.gradle | 69 - designer_base/build.performance.gradle.bak | 69 - designer_base/build.release.gradle | 91 - .../src/com/fr/design/DesignModelAdapter.java | 149 - .../src/com/fr/design/DesignState.java | 73 - .../src/com/fr/design/DesignerEnvManager.java | 1793 -- .../design/Exception/ValidationException.java | 11 - .../com/fr/design/actions/CheckBoxAction.java | 41 - .../design/actions/HyperlinkPluginAction.java | 57 - .../src/com/fr/design/actions/MenuAction.java | 46 - .../design/actions/TableDataSourceAction.java | 84 - .../actions/ToggleButtonUpdateAction.java | 15 - .../com/fr/design/actions/UpdateAction.java | 559 - .../com/fr/design/actions/edit/CutAction.java | 41 - .../fr/design/actions/edit/PasteAction.java | 41 - .../fr/design/actions/edit/RedoAction.java | 59 - .../fr/design/actions/edit/UndoAction.java | 60 - .../actions/file/CloseTemplateAction.java | 29 - .../fr/design/actions/file/EditEnvAction.java | 22 - .../actions/file/ExitDesignerAction.java | 32 - .../actions/file/OpenRecentReportMenuDef.java | 78 - .../actions/file/OpenTemplateAction.java | 45 - .../design/actions/file/PreferenceAction.java | 49 - .../design/actions/file/PreferencePane.java | 679 - .../actions/file/SaveAsTemplateAction.java | 48 - .../design/actions/file/SwitchExistEnv.java | 129 - .../design/actions/file/WebPreviewUtils.java | 95 - .../fr/design/actions/help/AboutAction.java | 53 - .../fr/design/actions/help/AboutDialog.java | 100 - .../com/fr/design/actions/help/AboutPane.java | 262 - .../design/actions/help/FeedBackAction.java | 57 - .../fr/design/actions/help/FeedBackPane.java | 350 - .../fr/design/actions/help/ForumAction.java | 76 - .../design/actions/help/SupportQQAction.java | 63 - .../design/actions/help/SystemInfoPane.java | 69 - .../design/actions/help/TutorialAction.java | 101 - .../fr/design/actions/help/WebDemoAction.java | 46 - .../actions/server/FunctionManagerAction.java | 86 - .../actions/server/GlobalParameterAction.java | 96 - .../actions/server/GlobalTableDataAction.java | 186 - .../actions/server/PlatformManagerAction.java | 44 - .../actions/tabledata/TableDataAction.java | 97 - .../com/fr/design/beans/BasicBeanPane.java | 41 - .../fr/design/beans/FurtherBasicBeanPane.java | 32 - .../src/com/fr/design/beans/GroupModel.java | 56 - .../design/beans/location/Absorptionline.java | 393 - .../fr/design/beans/location/MoveUtils.java | 557 - .../com/fr/design/border/UIRoundedBorder.java | 50 - .../com/fr/design/border/UITitledBorder.java | 30 - .../fr/design/cell/FloatElementsProvider.java | 15 - .../condition/CellHighlightAddMenuDef.java | 66 - .../condition/ConditionAttributesPane.java | 133 - .../ContinuousTreeSelectionModel.java | 128 - .../DSColumnSimpleLiteConditionPane.java | 21 - .../design/condition/LiteConditionPane.java | 968 - .../design/condition/SingleConditionPane.java | 54 - .../design/data/DesignTableDataManager.java | 538 - .../fr/design/data/datapane/ChoosePane.java | 604 - .../design/data/datapane/DSButtonGroup.java | 48 - .../design/data/datapane/DataBaseItems.java | 49 - .../design/data/datapane/EditOrNewLabel.java | 34 - .../datapane/FlashLookLabelMouseAdapter.java | 57 - .../datapane/GlobalTableDataComboBox.java | 22 - .../datapane/GlobalTreeTableDataDictPane.java | 21 - .../fr/design/data/datapane/RefreshLabel.java | 37 - .../data/datapane/ReportTableDataPane.java | 62 - .../data/datapane/TableDataComboBox.java | 150 - .../datapane/TableDataNameObjectCreator.java | 178 - .../data/datapane/TableDataSourceOP.java | 240 - .../design/data/datapane/TableDataTree.java | 250 - .../datapane/TableDataTreeDragSource.java | 102 - .../data/datapane/TreeTableDataComboBox.java | 86 - .../data/datapane/TreeTableDataDictPane.java | 309 - .../data/datapane/VerticalChoosePane.java | 69 - .../connect/ConnectionTableProcedurePane.java | 217 - .../connect/DataConnectionAction.java | 67 - .../connect/DatabaseConnectionPane.java | 241 - .../connect/ItemEditableComboBoxPanel.java | 122 - .../data/datapane/connect/JDBCDefPane.java | 377 - .../data/datapane/connect/JNDIDefPane.java | 266 - .../datapane/preview/LoadedEventListener.java | 18 - .../data/datapane/preview/PreviewLabel.java | 37 - .../datapane/preview/PreviewTableModel.java | 212 - .../datapane/preview/PreviewTablePane.java | 485 - .../tabledata/Prepare4DataSourceChange.java | 15 - .../tabledata/ResponseDataSourceChange.java | 25 - .../StoreProcedureWorkerListener.java | 14 - .../fr/design/data/tabledata/gui/CONTENT.txt | 14 - .../fr/design/data/tabledata/gui/EXPLAN1.txt | 6 - .../fr/design/data/tabledata/gui/EXPLAN2.txt | 17 - .../tabledatapane/AbstractTableDataPane.java | 15 - .../AutoStoreProcedureTableModel.java | 158 - .../tabledatapane/ClassNameSelectPane.java | 63 - .../tabledatapane/ClassTableDataPane.java | 177 - .../tabledatapane/CustomDictModel.java | 130 - .../tabledatapane/DBTableDataPane.java | 388 - .../EmbeddedTableDataDefinedPane.java | 321 - .../tabledatapane/EmbeddedTableDataPane.java | 355 - .../tabledatapane/EmbeddedTableModel.java | 103 - .../tabledatapane/FileTableDataPane.java | 1006 - .../FileTableDataSmallHeightPane.java | 19 - .../tabledatapane/FileTableDataSmallPane.java | 19 - .../GlobalMultiTDTableDataPane.java | 22 - .../GlobalTreeTableDataPane.java | 19 - .../tabledatapane/MaxMemRowCountPanel.java | 97 - .../tabledatapane/MultiTDTableDataPane.java | 405 - .../tabledatapane/OneListTableModel.java | 111 - .../tabledatapane/ProcedureDataPane.java | 380 - .../StoreProcedureTableModel.java | 139 - .../tabledatapane/TableDataManagerPane.java | 100 - .../tabledatapane/TreeTableDataPane.java | 45 - .../wrapper/AbstractTableDataWrapper.java | 138 - .../wrapper/ServerTableDataWrapper.java | 57 - .../wrapper/StoreProcedureDataWrapper.java | 311 - .../wrapper/StoreProcedureNameWrapper.java | 153 - .../tabledata/wrapper/TableDataFactory.java | 196 - .../tabledata/wrapper/TableDataWrapper.java | 68 - .../wrapper/TemplateTableDataWrapper.java | 37 - .../fr/design/designer/TargetComponent.java | 179 - .../src/com/fr/design/dialog/BasicDialog.java | 62 - .../src/com/fr/design/dialog/BasicPane.java | 442 - .../com/fr/design/dialog/BasicScrollPane.java | 211 - .../fr/design/dialog/DialogActionAdapter.java | 9 - .../design/dialog/DialogActionListener.java | 8 - .../fr/design/dialog/InformationWarnPane.java | 171 - .../com/fr/design/dialog/JWizardDialog.java | 368 - .../com/fr/design/dialog/JWizardPanel.java | 229 - .../com/fr/design/dialog/MultiTabPane.java | 88 - .../src/com/fr/design/dialog/UIDialog.java | 234 - .../src/com/fr/design/dialog/package.html | 8 - .../design/editor/ValueEditorPaneFactory.java | 507 - .../design/editor/editor/BooleanEditor.java | 113 - .../editor/editor/ColumnIndexEditor.java | 110 - .../editor/editor/ColumnNameEditor.java | 79 - .../design/editor/editor/ColumnRowEditor.java | 74 - .../editor/editor/ColumnSelectedEditor.java | 110 - .../design/editor/editor/ConstantsEditor.java | 23 - .../fr/design/editor/editor/CursorEditor.java | 42 - .../fr/design/editor/editor/DateEditor.java | 183 - .../fr/design/editor/editor/DoubleEditor.java | 46 - .../com/fr/design/editor/editor/Editor.java | 203 - .../design/editor/editor/EditorListener.java | 29 - .../fr/design/editor/editor/FloatEditor.java | 46 - .../design/editor/editor/FormulaEditor.java | 181 - .../design/editor/editor/IntegerEditor.java | 49 - .../fr/design/editor/editor/LongEditor.java | 41 - .../fr/design/editor/editor/NoneEditor.java | 54 - .../fr/design/editor/editor/NumberEditor.java | 128 - .../editor/editor/OldColumnIndexEditor.java | 163 - .../design/editor/editor/ParameterEditor.java | 64 - .../fr/design/editor/editor/TextEditor.java | 153 - .../editor/editor/WidgetNameEditor.java | 110 - .../design/editor/editor/XMLANameEditor.java | 117 - .../fr/design/event/TargetModifiedEvent.java | 19 - .../design/event/TargetModifiedListener.java | 16 - .../fr/design/event/UIObserverListener.java | 14 - .../fr/design/extra/LoginCheckContext.java | 30 - .../fr/design/extra/LoginCheckListener.java | 8 - .../com/fr/design/extra/PluginConstants.java | 15 - .../com/fr/design/file/FileOperations.java | 45 - .../file/FileToolbarStateChangeListener.java | 5 - .../design/file/HistoryTemplateListPane.java | 441 - .../fr/design/file/MutilTempalteTabPane.java | 957 - .../com/fr/design/file/NewTemplatePane.java | 164 - .../com/fr/design/file/TemplateTreePane.java | 334 - .../formula/CustomVariableResolver.java | 22 - .../com/fr/design/formula/FormulaPane.java | 1028 - .../fr/design/formula/FunctionConstants.java | 264 - .../com/fr/design/formula/FunctionDefNAD.java | 22 - .../com/fr/design/formula/FunctionGroup.java | 7 - .../design/formula/FunctionManagerPane.java | 226 - .../com/fr/design/formula/FunctionNAD.java | 42 - .../fr/design/formula/NameAndDescription.java | 10 - .../design/formula/NameAndFunctionList.java | 31 - .../formula/NameAndTypeAndFunctionList.java | 21 - .../fr/design/formula/SortFormulaPane.java | 83 - .../fr/design/formula/VariableResolver.java | 30 - .../formula/VariableResolverAdapter.java | 105 - .../fr/design/fun/CellAttributeProvider.java | 20 - .../fr/design/fun/ExportToolBarProvider.java | 35 - .../fr/design/fun/GlobalListenerProvider.java | 23 - .../com/fr/design/fun/HyperlinkProvider.java | 21 - .../design/fun/IndentationUnitProcessor.java | 31 - .../design/fun/JavaScriptActionProvider.java | 21 - .../impl/AbstractCellAttributeProvider.java | 20 - .../impl/AbstractGlobalListenerProvider.java | 21 - .../fun/impl/AbstractHyperlinkProvider.java | 21 - .../AbstractIndentationUnitProcessor.java | 47 - .../AbstractJavaScriptActionProvider.java | 29 - .../src/com/fr/design/gui/UIDefaultTheme.java | 199 - .../src/com/fr/design/gui/UILookAndFeel.java | 202 - .../gui/autocomplete/AbstractCompletion.java | 153 - .../AbstractCompletionProvider.java | 245 - .../autocomplete/AutoCompleteDescWindow.java | 591 - .../autocomplete/AutoCompletePopupWindow.java | 972 - .../gui/autocomplete/AutoCompletion.java | 1329 - .../AutoCompletionStyleContext.java | 120 - .../gui/autocomplete/BasicCompletion.java | 144 - .../design/gui/autocomplete/Completion.java | 153 - .../autocomplete/CompletionCellRenderer.java | 625 - .../gui/autocomplete/CompletionListModel.java | 88 - .../gui/autocomplete/CompletionProvider.java | 213 - .../autocomplete/CompletionProviderBase.java | 261 - .../gui/autocomplete/CompletionXMLParser.java | 446 - .../design/gui/autocomplete/CompletionXml.dtd | 30 - .../DefaultCompletionProvider.java | 374 - .../autocomplete/DelegatingCellRenderer.java | 94 - .../gui/autocomplete/DescWindowCallback.java | 35 - .../fr/design/gui/autocomplete/EmptyIcon.java | 49 - .../gui/autocomplete/ExternalURLHandler.java | 46 - .../design/gui/autocomplete/FastListUI.java | 189 - .../gui/autocomplete/FunctionCompletion.java | 322 - .../LanguageAwareCompletionProvider.java | 429 - .../gui/autocomplete/LinkRedirector.java | 20 - .../gui/autocomplete/MarkupTagCompletion.java | 240 - .../autocomplete/OutlineHighlightPainter.java | 143 - .../ParameterChoicesProvider.java | 40 - .../autocomplete/ParameterizedCompletion.java | 172 - .../ParameterizedCompletionChoicesWindow.java | 301 - .../ParameterizedCompletionContext.java | 1190 - ...meterizedCompletionDescriptionToolTip.java | 204 - .../ParameterizedCompletionInsertionInfo.java | 251 - .../gui/autocomplete/ShorthandCompletion.java | 117 - .../fr/design/gui/autocomplete/SizeGrip.java | 256 - .../SortByRelevanceComparator.java | 33 - .../gui/autocomplete/TemplateCompletion.java | 363 - .../gui/autocomplete/TemplatePiece.java | 86 - .../fr/design/gui/autocomplete/TipUtil.java | 179 - .../com/fr/design/gui/autocomplete/Util.java | 323 - .../gui/autocomplete/VariableCompletion.java | 196 - .../fr/design/gui/borders/UIFrameBorder.java | 583 - .../gui/borders/UIInternalFrameBorder.java | 592 - .../gui/borders/UITableHeaderBorder.java | 66 - .../borders/UITableHeaderRolloverBorder.java | 37 - .../gui/borders/UITableScrollPaneBorder.java | 37 - .../design/gui/borders/UITextFieldBorder.java | 61 - .../gui/chart/BaseChartPropertyPane.java | 28 - .../gui/chart/MiddleChartComponent.java | 25 - .../design/gui/chart/MiddleChartDialog.java | 28 - .../design/gui/columnrow/ColumnRowPane.java | 260 - .../gui/columnrow/ColumnRowVerticalPane.java | 43 - .../controlpane/AbstractNameableCreator.java | 117 - .../design/gui/controlpane/ControlPane.java | 38 - .../design/gui/controlpane/JControlPane.java | 212 - .../gui/controlpane/NameableCreator.java | 29 - .../gui/controlpane/ObjectJControlPane.java | 76 - .../controlpane/ShortCut4JControlPane.java | 16 - .../design/gui/core/CustomWidgetOption.java | 48 - .../gui/core/UIFurtherTabComponent.java | 24 - .../design/gui/core/UISelectedComponent.java | 32 - .../fr/design/gui/core/UITabComponent.java | 35 - .../gui/core/UserDefinedWidgetOption.java | 36 - .../fr/design/gui/core/WidgetConstants.java | 78 - .../com/fr/design/gui/core/WidgetOption.java | 228 - .../design/gui/core/WidgetOptionFactory.java | 17 - .../design/gui/date/CalendarNumberField.java | 108 - .../com/fr/design/gui/date/JDateDocument.java | 329 - .../gui/date/SingleObjectComboBoxModel.java | 72 - .../fr/design/gui/date/UICalendarPanel.java | 772 - .../com/fr/design/gui/date/UIDatePicker.java | 289 - .../com/fr/design/gui/date/UIDayLabel.java | 49 - .../com/fr/design/gui/demo/ComboBoxDemo.java | 176 - .../src/com/fr/design/gui/demo/LabelDemo.java | 62 - .../src/com/fr/design/gui/demo/ListDemo.java | 42 - .../fr/design/gui/demo/LoadingPaneDemo.java | 55 - .../design/gui/demo/MultiLineTooltipDemo.java | 34 - .../design/gui/demo/SwingComponentsDemo.java | 52 - .../gui/frpane/AbstractAttrNoScrollPane.java | 162 - .../gui/frpane/AttributeChangeListener.java | 7 - .../design/gui/frpane/BaseHyperlinkGroup.java | 23 - .../design/gui/frpane/CommitTabbedPane.java | 538 - .../gui/frpane/EditingStringListPane.java | 208 - .../design/gui/frpane/HyperlinkGroupPane.java | 132 - .../design/gui/frpane/HyperlinkGroupType.java | 18 - .../fr/design/gui/frpane/ImgChoosePane.java | 122 - .../design/gui/frpane/JTreeControlPane.java | 270 - .../fr/design/gui/frpane/LimitedDocument.java | 46 - .../design/gui/frpane/ListenerUpdatePane.java | 53 - .../design/gui/frpane/LoadingBasicPane.java | 90 - .../gui/frpane/LoadingBasicPaneTest.java | 41 - .../gui/frpane/ObjectProperiesPane.java | 164 - .../frpane/ReportletParameterViewPane.java | 146 - .../gui/frpane/TemplateParameterPane.java | 89 - .../fr/design/gui/frpane/TreeSettingPane.java | 270 - .../design/gui/frpane/UIAdvancedTextPane.java | 199 - .../gui/frpane/UIBasicOptionPaneUI.java | 266 - .../design/gui/frpane/UIBubbleFloatPane.java | 318 - .../gui/frpane/UICorrelationComboBoxPane.java | 414 - .../design/gui/frpane/UICorrelationPane.java | 409 - .../design/gui/frpane/UINumberDragPane.java | 140 - .../design/gui/frpane/UINumberSlidePane.java | 137 - .../com/fr/design/gui/frpane/UIRadioPane.java | 107 - .../fr/design/gui/frpane/UITabbedPane.java | 122 - .../com/fr/design/gui/frpane/UITextPane.java | 93 - .../fr/design/gui/frpane/UITitlePanel.java | 46 - .../fr/design/gui/frpane/UnitInputPane.java | 170 - .../design/gui/ibutton/FiveButtonLayout.java | 61 - .../design/gui/ibutton/SpecialUIButton.java | 30 - .../design/gui/ibutton/UIBasicButtonUI.java | 346 - .../com/fr/design/gui/ibutton/UIButton.java | 365 - .../fr/design/gui/ibutton/UIButtonBorder.java | 84 - .../fr/design/gui/ibutton/UIButtonGroup.java | 449 - .../com/fr/design/gui/ibutton/UIButtonUI.java | 171 - .../fr/design/gui/ibutton/UIColorButton.java | 251 - .../gui/ibutton/UICombinationButton.java | 143 - .../fr/design/gui/ibutton/UIHeadGroup.java | 182 - .../fr/design/gui/ibutton/UIRadioButton.java | 46 - .../design/gui/ibutton/UIRadioButtonIcon.java | 328 - .../gui/ibutton/UIRadioButtonMenuItemUI.java | 67 - .../design/gui/ibutton/UIRadioButtonUI.java | 112 - .../fr/design/gui/ibutton/UITabButton.java | 181 - .../com/fr/design/gui/ibutton/UITabGroup.java | 75 - .../fr/design/gui/ibutton/UIToggleButton.java | 223 - .../gui/ibutton/UIToolButtonBorder.java | 104 - .../fr/design/gui/icheckbox/UICheckBox.java | 201 - .../design/gui/icheckbox/UICheckBoxIcon.java | 314 - .../fr/design/gui/icheckbox/UICheckBoxUI.java | 88 - .../gui/icombobox/AlignmentComboBox.java | 83 - .../design/gui/icombobox/ComboCheckBox.java | 195 - .../gui/icombobox/DictionaryComboBox.java | 61 - .../gui/icombobox/DictionaryConstants.java | 86 - .../gui/icombobox/ExtendedComboBox.java | 118 - .../gui/icombobox/ExtendedComboBoxTest.java | 34 - .../design/gui/icombobox/FRTreeComboBox.java | 621 - .../design/gui/icombobox/FilterComboBox.java | 128 - .../icombobox/FilterableComboBoxModel.java | 103 - .../gui/icombobox/FixedHeightComboBox.java | 103 - .../gui/icombobox/FunctionComboBox.java | 69 - .../fr/design/gui/icombobox/IntComboBox.java | 51 - .../fr/design/gui/icombobox/LazyComboBox.java | 214 - .../gui/icombobox/LazyComboBoxTest.java | 62 - .../fr/design/gui/icombobox/LineComboBox.java | 148 - .../gui/icombobox/ParameterComboBox.java | 87 - .../gui/icombobox/SortOrderComboBox.java | 73 - .../design/gui/icombobox/TreeComboBoxUI.java | 95 - .../gui/icombobox/UIBasicComboBoxEditor.java | 107 - .../gui/icombobox/UIBasicComboBoxUI.java | 347 - .../fr/design/gui/icombobox/UIComboBox.java | 214 - .../gui/icombobox/UIComboBoxButton.java | 278 - .../gui/icombobox/UIComboBoxEditor.java | 88 - .../gui/icombobox/UIComboBoxRenderer.java | 42 - .../fr/design/gui/icombobox/UIComboBoxUI.java | 273 - .../gui/icombobox/UIDictionaryComboBox.java | 44 - .../design/gui/icombobox/filter/Filter.java | 8 - .../icombobox/filter/LastStartWithFilter.java | 18 - .../icombobox/filter/StartsWithFilter.java | 11 - .../icombotree/CheckBoxTreeCellRenderer.java | 86 - .../icombotree/CheckBoxTreeLabel.java | 73 - .../icombotree/CheckBoxTreeNode.java | 88 - .../CheckBoxTreeNodeSelectionListener.java | 65 - .../icontainer/UIModeControlContainer.java | 458 - .../gui/icontainer/UIResizableContainer.java | 547 - .../design/gui/icontainer/UIScrollPane.java | 49 - .../gui/icontainer/UIScrollPaneBorder.java | 33 - .../design/gui/icontainer/UIScrollPaneUI.java | 58 - .../icontainer/UITableScrollPaneBorder.java | 38 - .../com/fr/design/gui/ilable/ActionLabel.java | 87 - .../design/gui/ilable/BoldFontTextLabel.java | 36 - .../fr/design/gui/ilable/FRExplainLabel.java | 24 - .../fr/design/gui/ilable/MultilineLabel.java | 75 - .../src/com/fr/design/gui/ilable/UILabel.java | 66 - .../fr/design/gui/ilist/ArrayListModel.java | 24 - .../com/fr/design/gui/ilist/CheckBoxList.java | 300 - .../gui/ilist/DefaultListCellEditor.java | 50 - .../com/fr/design/gui/ilist/JNameEdList.java | 395 - .../fr/design/gui/ilist/ListCellEditor.java | 8 - .../gui/ilist/ModNameActionListener.java | 11 - .../com/fr/design/gui/ilist/QuickList.java | 41 - .../fr/design/gui/ilist/TableViewList.java | 276 - .../src/com/fr/design/gui/ilist/UIList.java | 86 - .../design/gui/imenu/UIBasicMenuItemUI.java | 1095 - .../fr/design/gui/imenu/UIBasicMenuUI.java | 689 - .../design/gui/imenu/UICheckBoxMenuItem.java | 29 - .../src/com/fr/design/gui/imenu/UIMenu.java | 343 - .../com/fr/design/gui/imenu/UIMenuBar.java | 29 - .../com/fr/design/gui/imenu/UIMenuBarUI.java | 33 - .../fr/design/gui/imenu/UIMenuHighLight.java | 25 - .../com/fr/design/gui/imenu/UIMenuItem.java | 107 - .../src/com/fr/design/gui/imenu/UIMenuUI.java | 83 - .../com/fr/design/gui/imenu/UIPopupMenu.java | 48 - .../design/gui/imenu/UIPopupMenuBorder.java | 62 - .../gui/imenu/UIPopupMenuSeparatorUI.java | 29 - .../gui/imenutable/UIMenuNameableCreator.java | 69 - .../fr/design/gui/imenutable/UIMenuTable.java | 232 - .../gui/imenutable/UIMenuTableDataModel.java | 119 - .../design/gui/imenutable/UIMenuTableUI.java | 124 - .../gui/ipasswordfield/UIPassWordField.java | 72 - .../fr/design/gui/ipoppane/PopupHider.java | 5 - .../gui/iprogressbar/AutoProgressBar.java | 50 - .../gui/iprogressbar/FRProgressBar.java | 43 - .../gui/iprogressbar/MonitorCancelWork.java | 12 - .../gui/iprogressbar/UIProgressBarBorder.java | 67 - .../gui/iprogressbar/UIProgressBarUI.java | 409 - .../gui/iscrollbar/UIBasicScrollBarUI.java | 348 - .../fr/design/gui/iscrollbar/UISBChooser.java | 452 - .../fr/design/gui/iscrollbar/UIScrollBar.java | 50 - .../design/gui/iscrollbar/UIScrollBarUI.java | 1332 - .../design/gui/iscrollbar/UIScrollButton.java | 229 - .../com/fr/design/gui/islider/UISlider.java | 37 - .../design/gui/ispinner/UIBasicSpinner.java | 86 - .../com/fr/design/gui/ispinner/UISpinner.java | 361 - .../gui/ispinner/UISpinnerButtonUI.java | 146 - .../fr/design/gui/ispinner/UISpinnerUI.java | 277 - .../design/gui/ispinner/UpperCaseSpinner.java | 132 - .../isplitpanedivider/UISplitPaneDivider.java | 275 - .../gui/isplitpanedivider/UISplitPaneUI.java | 33 - .../fr/design/gui/itable/SortableJTable.java | 10 - .../com/fr/design/gui/itable/TableSorter.java | 496 - .../fr/design/gui/itable/UIBasicTableUI.java | 40 - .../design/gui/itable/UIComponentTable.java | 35 - .../fr/design/gui/itable/UISelectTable.java | 108 - .../src/com/fr/design/gui/itable/UITable.java | 388 - .../gui/itable/UITableComponentModel.java | 23 - .../design/gui/itable/UITableDataModel.java | 146 - .../design/gui/itable/UITableNoOptionUI.java | 25 - .../com/fr/design/gui/itable/UITableUI.java | 225 - .../gui/itableeditorpane/ActionStyle.java | 16 - .../itableeditorpane/ParameterTableModel.java | 263 - .../itableeditorpane/UIArrayTableModel.java | 74 - .../itableeditorpane/UITableEditAction.java | 8 - .../itableeditorpane/UITableEditorLoader.java | 12 - .../itableeditorpane/UITableEditorPane.java | 156 - .../itableeditorpane/UITableModelAdapter.java | 330 - .../gui/itabpane/TitleChangeListener.java | 6 - .../design/gui/itabpane/UITabPaneCreator.java | 44 - .../gui/itabpane/UITabsHeaderIconPane.java | 249 - .../gui/itextarea/DescriptionTextArea.java | 27 - .../gui/itextarea/FRExplainTextArea.java | 66 - .../fr/design/gui/itextarea/UITextArea.java | 137 - .../fr/design/gui/itextarea/UITextAreaUI.java | 43 - .../design/gui/itextfield/EditTextField.java | 55 - .../design/gui/itextfield/FRGraphics2D.java | 397 - .../fr/design/gui/itextfield/TextFieldUI.java | 53 - .../design/gui/itextfield/UINumberField.java | 247 - .../gui/itextfield/UISearchTextField.java | 296 - .../fr/design/gui/itextfield/UITextField.java | 228 - .../design/gui/itextfield/UITextFieldUI.java | 74 - .../design/gui/itoolbar/UILargeToolbar.java | 18 - .../design/gui/itoolbar/UIToolBarBorder.java | 106 - .../gui/itoolbar/UIToolBarSeparatorUI.java | 98 - .../fr/design/gui/itoolbar/UIToolBarUI.java | 112 - .../com/fr/design/gui/itoolbar/UIToolbar.java | 34 - .../com/fr/design/gui/itooltip/UIToolTip.java | 88 - .../design/gui/itooltip/UIToolTipBorder.java | 44 - .../fr/design/gui/itooltip/UIToolTipUI.java | 118 - .../src/com/fr/design/gui/itree/UITreeUI.java | 40 - .../gui/itree/checkboxtree/CheckBoxTree.java | 453 - .../CheckBoxTreeCellRenderer.java | 134 - .../CheckBoxTreeSelectionModel.java | 483 - .../gui/itree/checkboxtree/NullLabel.java | 86 - .../gui/itree/checkboxtree/NullPanel.java | 79 - .../checkboxtree/NullTristateCheckBox.java | 76 - .../itree/checkboxtree/TristateCheckBox.java | 307 - .../gui/itree/filetree/AbstractFileTree.java | 105 - .../gui/itree/filetree/ClassFileTree.java | 63 - .../gui/itree/filetree/EnvFileTree.java | 362 - .../gui/itree/filetree/FileComparator.java | 23 - .../gui/itree/filetree/FileDirectoryNode.java | 56 - .../itree/filetree/FileNodeComparator.java | 78 - .../gui/itree/filetree/FileTreeIcon.java | 274 - .../design/gui/itree/filetree/JFileTree.java | 324 - .../gui/itree/filetree/ReportletPane.java | 136 - .../design/gui/itree/filetree/RootFile.java | 28 - .../gui/itree/filetree/TemplateFileTree.java | 99 - .../ExpandMutableTreeNode.java | 78 - .../refreshabletree/RefreshableJTree.java | 283 - .../refreshabletree/RefreshableJTreeTest.java | 85 - .../refreshabletree/TreeDataCardPane.java | 55 - .../itree/refreshabletree/TreeNodePane.java | 46 - .../itree/refreshabletree/TreeRootPane.java | 85 - .../itree/refreshabletree/UserObjectOP.java | 33 - .../UserObjectRefreshJTree.java | 168 - .../loader/ChildrenLoaderFactory.java | 17 - .../loader/ChildrenNodesLoader.java | 29 - .../gui/style/AbstractBasicStylePane.java | 29 - .../fr/design/gui/style/AlignmentPane.java | 433 - .../gui/style/BackgroundNoImagePane.java | 45 - .../gui/style/BackgroundSpecialPane.java | 71 - .../com/fr/design/gui/style/BorderPane.java | 255 - .../DefaultIndentationUnitProcessor.java | 36 - .../com/fr/design/gui/style/FRFontPane.java | 418 - .../design/gui/style/FormatePaneNumField.java | 44 - .../fr/design/gui/style/NumberDragBar.java | 226 - .../design/gui/syntax/io/DocumentReader.java | 218 - .../design/gui/syntax/io/UnicodeReader.java | 270 - .../design/gui/syntax/io/UnicodeWriter.java | 258 - .../com/fr/design/gui/syntax/io/package.html | 5 - .../gui/syntax/print/RPrintUtilities.java | 530 - .../fr/design/gui/syntax/print/package.html | 5 - .../AbstractJFlexCTokenMaker.java | 243 - .../AbstractJFlexTokenMaker.java | 52 - .../rsyntaxtextarea/AbstractTokenMaker.java | 67 - .../AbstractTokenMakerFactory.java | 134 - .../ChangeableColorHighlightPainter.java | 67 - .../rsyntaxtextarea/CodeTemplateManager.java | 389 - .../DefaultOccurrenceMarker.java | 55 - .../rsyntaxtextarea/DefaultTokenFactory.java | 137 - .../DefaultTokenMakerFactory.java | 75 - .../rsyntaxtextarea/DefaultTokenPainter.java | 268 - .../ui/rsyntaxtextarea/DocumentRange.java | 153 - .../syntax/ui/rsyntaxtextarea/ErrorStrip.java | 843 - .../ui/rsyntaxtextarea/ErrorStrip.properties | 3 - .../rsyntaxtextarea/ErrorStrip_ar.properties | 3 - .../rsyntaxtextarea/ErrorStrip_de.properties | 3 - .../rsyntaxtextarea/ErrorStrip_es.properties | 3 - .../rsyntaxtextarea/ErrorStrip_fr.properties | 3 - .../rsyntaxtextarea/ErrorStrip_hu.properties | 3 - .../rsyntaxtextarea/ErrorStrip_in.properties | 3 - .../rsyntaxtextarea/ErrorStrip_it.properties | 3 - .../rsyntaxtextarea/ErrorStrip_ja.properties | 3 - .../rsyntaxtextarea/ErrorStrip_ko.properties | 3 - .../rsyntaxtextarea/ErrorStrip_nl.properties | 3 - .../rsyntaxtextarea/ErrorStrip_pl.properties | 3 - .../ErrorStrip_pt_BR.properties | 3 - .../rsyntaxtextarea/ErrorStrip_ru.properties | 3 - .../rsyntaxtextarea/ErrorStrip_tr.properties | 3 - .../ErrorStrip_zh_CN.properties | 3 - .../ErrorStrip_zh_TW.properties | 3 - .../ui/rsyntaxtextarea/FileFileLocation.java | 121 - .../ui/rsyntaxtextarea/FileLocation.java | 141 - .../FoldingAwareIconRowHeader.java | 248 - .../ui/rsyntaxtextarea/LinkGenerator.java | 50 - .../rsyntaxtextarea/LinkGeneratorResult.java | 53 - .../MarkOccurrencesHighlightPainter.java | 139 - .../MarkOccurrencesSupport.java | 316 - .../ui/rsyntaxtextarea/OccurrenceMarker.java | 38 - .../ui/rsyntaxtextarea/ParserManager.java | 745 - .../rsyntaxtextarea/PopupWindowDecorator.java | 68 - .../syntax/ui/rsyntaxtextarea/RSTAView.java | 62 - .../ui/rsyntaxtextarea/RSyntaxDocument.java | 639 - .../ui/rsyntaxtextarea/RSyntaxTextArea.java | 3128 -- .../RSyntaxTextArea.properties | 14 - .../RSyntaxTextAreaDefaultInputMap.java | 77 - .../RSyntaxTextAreaEditorKit.java | 1943 -- .../RSyntaxTextAreaHighlighter.java | 275 - .../ui/rsyntaxtextarea/RSyntaxTextAreaUI.java | 265 - .../RSyntaxTextArea_ar.properties | 14 - .../RSyntaxTextArea_de.properties | 14 - .../RSyntaxTextArea_es.properties | 14 - .../RSyntaxTextArea_fr.properties | 14 - .../RSyntaxTextArea_hu.properties | 14 - .../RSyntaxTextArea_in.properties | 14 - .../RSyntaxTextArea_it.properties | 14 - .../RSyntaxTextArea_ja.properties | 14 - .../RSyntaxTextArea_ko.properties | 14 - .../RSyntaxTextArea_nl.properties | 14 - .../RSyntaxTextArea_pl.properties | 15 - .../RSyntaxTextArea_pt_BR.properties | 14 - .../RSyntaxTextArea_ru.properties | 14 - .../RSyntaxTextArea_tr.properties | 14 - .../RSyntaxTextArea_zh_CN.properties | 14 - .../RSyntaxTextArea_zh_TW.properties | 14 - .../ui/rsyntaxtextarea/RSyntaxUtilities.java | 1310 - .../syntax/ui/rsyntaxtextarea/RTfToText.java | 229 - .../ui/rsyntaxtextarea/RtfGenerator.java | 479 - .../ui/rsyntaxtextarea/RtfTransferable.java | 91 - .../SelectRegionLinkGeneratorResult.java | 59 - .../SquiggleUnderlineHighlightPainter.java | 120 - .../gui/syntax/ui/rsyntaxtextarea/Style.java | 196 - .../ui/rsyntaxtextarea/SyntaxConstants.java | 264 - .../ui/rsyntaxtextarea/SyntaxScheme.java | 715 - .../syntax/ui/rsyntaxtextarea/SyntaxView.java | 1008 - .../ui/rsyntaxtextarea/TextEditorPane.java | 711 - .../gui/syntax/ui/rsyntaxtextarea/Theme.java | 847 - .../gui/syntax/ui/rsyntaxtextarea/Token.java | 566 - .../ui/rsyntaxtextarea/TokenFactory.java | 67 - .../syntax/ui/rsyntaxtextarea/TokenImpl.java | 836 - .../ui/rsyntaxtextarea/TokenIterator.java | 91 - .../syntax/ui/rsyntaxtextarea/TokenMaker.java | 170 - .../ui/rsyntaxtextarea/TokenMakerBase.java | 300 - .../ui/rsyntaxtextarea/TokenMakerFactory.java | 124 - .../syntax/ui/rsyntaxtextarea/TokenMap.java | 277 - .../ui/rsyntaxtextarea/TokenOrientedView.java | 61 - .../ui/rsyntaxtextarea/TokenPainter.java | 96 - .../syntax/ui/rsyntaxtextarea/TokenTypes.java | 85 - .../syntax/ui/rsyntaxtextarea/TokenUtils.java | 166 - .../ui/rsyntaxtextarea/URLFileLocation.java | 160 - .../VisibleWhitespaceTokenPainter.java | 191 - .../ui/rsyntaxtextarea/WrappedSyntaxView.java | 1418 - .../rsyntaxtextarea/WrappedSyntaxView2.java | 157 - .../rsyntaxtextarea/XmlOccurrenceMarker.java | 187 - .../focusabletip/FocusableTip.java | 346 - .../focusabletip/FocusableTip.properties | 1 - .../focusabletip/FocusableTip_ar.properties | 1 - .../focusabletip/FocusableTip_es.properties | 1 - .../focusabletip/FocusableTip_fr.properties | 1 - .../focusabletip/FocusableTip_hu.properties | 1 - .../focusabletip/FocusableTip_in.properties | 1 - .../focusabletip/FocusableTip_it.properties | 1 - .../focusabletip/FocusableTip_ja.properties | 1 - .../focusabletip/FocusableTip_ko.properties | 1 - .../focusabletip/FocusableTip_nl.properties | 1 - .../focusabletip/FocusableTip_pl.properties | 1 - .../FocusableTip_pt_BR.properties | 1 - .../focusabletip/FocusableTip_ru.properties | 1 - .../focusabletip/FocusableTip_tr.properties | 1 - .../FocusableTip_zh_CN.properties | 1 - .../FocusableTip_zh_TW.properties | 1 - .../focusabletip/SizeGrip.java | 255 - .../rsyntaxtextarea/focusabletip/TipUtil.java | 235 - .../focusabletip/TipWindow.java | 341 - .../rsyntaxtextarea/focusabletip/package.html | 5 - .../folding/CurlyFoldParser.java | 317 - .../ui/rsyntaxtextarea/folding/Fold.java | 567 - .../folding/FoldCollapser.java | 106 - .../rsyntaxtextarea/folding/FoldManager.java | 707 - .../rsyntaxtextarea/folding/FoldParser.java | 41 - .../folding/FoldParserManager.java | 124 - .../ui/rsyntaxtextarea/folding/FoldType.java | 59 - .../folding/JsonFoldParser.java | 161 - .../folding/LatexFoldParser.java | 108 - .../folding/LispFoldParser.java | 35 - .../folding/NsisFoldParser.java | 156 - .../ui/rsyntaxtextarea/folding/package.html | 5 - .../modes/AbstractMarkupTokenMaker.java | 56 - .../modes/ActionScriptTokenMaker.flex | 500 - .../modes/ActionScriptTokenMaker.java | 2074 -- .../modes/AssemblerX86TokenMaker.flex | 1037 - .../modes/AssemblerX86TokenMaker.java | 1870 -- .../modes/BBCodeTokenMaker.flex | 273 - .../modes/BBCodeTokenMaker.java | 729 - .../modes/CPlusPlusTokenMaker.flex | 671 - .../modes/CPlusPlusTokenMaker.java | 2322 -- .../rsyntaxtextarea/modes/CSSTokenMaker.flex | 414 - .../rsyntaxtextarea/modes/CSSTokenMaker.java | 979 - .../modes/CSharpTokenMaker.flex | 519 - .../modes/CSharpTokenMaker.java | 1603 - .../ui/rsyntaxtextarea/modes/CTokenMaker.flex | 645 - .../ui/rsyntaxtextarea/modes/CTokenMaker.java | 2075 -- .../modes/ClojureTokenMaker.flex | 566 - .../modes/ClojureTokenMaker.java | 2309 -- .../modes/DelphiTokenMaker.flex | 564 - .../modes/DelphiTokenMaker.java | 1634 - .../rsyntaxtextarea/modes/DtdTokenMaker.flex | 346 - .../rsyntaxtextarea/modes/DtdTokenMaker.java | 831 - .../modes/FortranTokenMaker.flex | 482 - .../modes/FortranTokenMaker.java | 1014 - .../modes/GroovyTokenMaker.flex | 890 - .../rsyntaxtextarea/modes/HTMLTokenMaker.flex | 1189 - .../rsyntaxtextarea/modes/HTMLTokenMaker.java | 2987 -- .../modes/HtaccessTokenMaker.flex | 500 - .../modes/HtaccessTokenMaker.java | 1505 - .../rsyntaxtextarea/modes/JSPTokenMaker.flex | 1565 - .../rsyntaxtextarea/modes/JSPTokenMaker.java | 5319 ---- .../modes/JavaScriptTokenMaker.flex | 890 - .../modes/JavaScriptTokenMaker.java | 2134 -- .../rsyntaxtextarea/modes/JavaTokenMaker.flex | 756 - .../rsyntaxtextarea/modes/JavaTokenMaker.java | 4969 --- .../rsyntaxtextarea/modes/JsonTokenMaker.flex | 261 - .../rsyntaxtextarea/modes/JsonTokenMaker.java | 704 - .../modes/LatexTokenMaker.flex | 270 - .../modes/LatexTokenMaker.java | 719 - .../rsyntaxtextarea/modes/LispTokenMaker.flex | 434 - .../rsyntaxtextarea/modes/LispTokenMaker.java | 1311 - .../rsyntaxtextarea/modes/LuaTokenMaker.flex | 374 - .../rsyntaxtextarea/modes/LuaTokenMaker.java | 970 - .../modes/MakefileTokenMaker.flex | 338 - .../modes/MakefileTokenMaker.java | 867 - .../rsyntaxtextarea/modes/MxmlTokenMaker.flex | 811 - .../rsyntaxtextarea/modes/MxmlTokenMaker.java | 2708 -- .../rsyntaxtextarea/modes/NSISTokenMaker.flex | 747 - .../rsyntaxtextarea/modes/NSISTokenMaker.java | 2982 -- .../rsyntaxtextarea/modes/PHPTokenMaker.flex | 2323 -- .../rsyntaxtextarea/modes/PHPTokenMaker.java | 25471 ---------------- .../rsyntaxtextarea/modes/PerlTokenMaker.flex | 812 - .../rsyntaxtextarea/modes/PerlTokenMaker.java | 2110 -- .../modes/PlainTextTokenMaker.flex | 227 - .../modes/PlainTextTokenMaker.java | 647 - .../modes/PropertiesFileTokenMaker.flex | 237 - .../modes/PropertiesFileTokenMaker.java | 664 - .../modes/PythonTokenMaker.flex | 443 - .../modes/PythonTokenMaker.java | 1092 - .../rsyntaxtextarea/modes/RubyTokenMaker.flex | 765 - .../rsyntaxtextarea/modes/RubyTokenMaker.java | 1670 - .../rsyntaxtextarea/modes/SASTokenMaker.flex | 677 - .../rsyntaxtextarea/modes/SASTokenMaker.java | 1492 - .../rsyntaxtextarea/modes/SQLTokenMaker.flex | 465 - .../rsyntaxtextarea/modes/SQLTokenMaker.java | 1129 - .../modes/ScalaTokenMaker.flex | 388 - .../modes/ScalaTokenMaker.java | 998 - .../rsyntaxtextarea/modes/TclTokenMaker.flex | 406 - .../rsyntaxtextarea/modes/TclTokenMaker.java | 1078 - .../modes/UnixShellTokenMaker.java | 1117 - .../modes/VisualBasicTokenMaker.flex | 464 - .../modes/VisualBasicTokenMaker.java | 1622 - .../modes/WindowsBatchTokenMaker.java | 605 - .../rsyntaxtextarea/modes/XMLTokenMaker.flex | 487 - .../rsyntaxtextarea/modes/XMLTokenMaker.java | 997 - .../ui/rsyntaxtextarea/modes/package.html | 5 - .../syntax/ui/rsyntaxtextarea/package.html | 5 - .../parser/AbstractParser.java | 95 - .../parser/DefaultParseResult.java | 145 - .../parser/DefaultParserNotice.java | 273 - .../parser/ExtendedHyperlinkListener.java | 38 - .../rsyntaxtextarea/parser/ParseResult.java | 84 - .../ui/rsyntaxtextarea/parser/Parser.java | 76 - .../rsyntaxtextarea/parser/ParserNotice.java | 130 - .../rsyntaxtextarea/parser/TaskTagParser.java | 158 - .../rsyntaxtextarea/parser/ToolTipInfo.java | 95 - .../ui/rsyntaxtextarea/parser/XmlParser.java | 224 - .../ui/rsyntaxtextarea/parser/package.html | 9 - .../templates/AbstractCodeTemplate.java | 134 - .../templates/CodeTemplate.java | 74 - .../templates/StaticCodeTemplate.java | 263 - .../ui/rsyntaxtextarea/templates/package.html | 5 - .../ui/rtextarea/AbstractGutterComponent.java | 114 - .../rtextarea/BackgroundPainterStrategy.java | 44 - ...ufferedImageBackgroundPainterStrategy.java | 124 - .../rtextarea/ChangeableHighlightPainter.java | 440 - .../ColorBackgroundPainterStrategy.java | 110 - .../ui/rtextarea/ConfigurableCaret.java | 712 - .../syntax/ui/rtextarea/FoldIndicator.java | 696 - .../gui/syntax/ui/rtextarea/Gutter.java | 969 - .../syntax/ui/rtextarea/GutterIconInfo.java | 53 - .../gui/syntax/ui/rtextarea/IconGroup.java | 247 - .../syntax/ui/rtextarea/IconRowHeader.java | 875 - .../ImageBackgroundPainterStrategy.java | 171 - .../ui/rtextarea/LineHighlightManager.java | 208 - .../syntax/ui/rtextarea/LineNumberList.java | 718 - .../design/gui/syntax/ui/rtextarea/Macro.java | 427 - .../gui/syntax/ui/rtextarea/RDocument.java | 65 - .../ui/rtextarea/RDocumentCharSequence.java | 119 - .../ui/rtextarea/RTADefaultInputMap.java | 145 - .../ui/rtextarea/RTATextTransferHandler.java | 485 - .../gui/syntax/ui/rtextarea/RTextArea.java | 1710 -- .../syntax/ui/rtextarea/RTextArea.properties | 29 - .../syntax/ui/rtextarea/RTextAreaBase.java | 1214 - .../ui/rtextarea/RTextAreaEditorKit.java | 2689 -- .../gui/syntax/ui/rtextarea/RTextAreaUI.java | 590 - .../ui/rtextarea/RTextArea_ar.properties | 29 - .../ui/rtextarea/RTextArea_de.properties | 29 - .../ui/rtextarea/RTextArea_es.properties | 29 - .../ui/rtextarea/RTextArea_fr.properties | 29 - .../ui/rtextarea/RTextArea_hu.properties | 29 - .../ui/rtextarea/RTextArea_in.properties | 29 - .../ui/rtextarea/RTextArea_it.properties | 29 - .../ui/rtextarea/RTextArea_ja.properties | 29 - .../ui/rtextarea/RTextArea_ko.properties | 29 - .../ui/rtextarea/RTextArea_nl.properties | 29 - .../ui/rtextarea/RTextArea_pl.properties | 29 - .../ui/rtextarea/RTextArea_pt_BR.properties | 29 - .../ui/rtextarea/RTextArea_ru.properties | 29 - .../ui/rtextarea/RTextArea_tr.properties | 29 - .../ui/rtextarea/RTextArea_zh_CN.properties | 29 - .../ui/rtextarea/RTextArea_zh_TW.properties | 29 - .../syntax/ui/rtextarea/RTextScrollPane.java | 286 - .../gui/syntax/ui/rtextarea/RUndoManager.java | 258 - .../ui/rtextarea/RecordableTextAction.java | 289 - .../syntax/ui/rtextarea/RegExReplaceInfo.java | 85 - .../syntax/ui/rtextarea/SearchContext.java | 391 - .../gui/syntax/ui/rtextarea/SearchEngine.java | 1017 - .../ui/rtextarea/SmartHighlightPainter.java | 159 - .../syntax/ui/rtextarea/ToolTipSupplier.java | 39 - ...olatileImageBackgroundPainterStrategy.java | 138 - .../gui/syntax/ui/rtextarea/package.html | 5 - .../gui/syntax/util/DynamicIntArray.java | 423 - .../fr/design/gui/syntax/util/package.html | 5 - .../hyperlink/ReporletHyperNorthPane.java | 184 - .../hyperlink/ReportletHyperlinkPane.java | 156 - .../design/hyperlink/WebHyperNorthPane.java | 111 - .../fr/design/hyperlink/WebHyperlinkPane.java | 128 - .../src/com/fr/design/icon/BorderIcon.java | 90 - .../src/com/fr/design/icon/LockIcon.java | 105 - .../src/com/fr/design/icon/WarningIcon.java | 109 - .../javascript/Commit2DBJavaScriptPane.java | 164 - .../com/fr/design/javascript/EmailPane.java | 154 - .../javascript/FormSubmitJavaScriptPane.java | 135 - .../javascript/JavaScriptActionPane.java | 197 - .../design/javascript/JavaScriptImplPane.java | 231 - .../javascript/ParameterJavaScriptPane.java | 82 - .../fr/design/layout/FRGUIPaneFactory.java | 519 - .../com/fr/design/layout/FRGridLayout.java | 16 - .../fr/design/layout/FRLeftFlowLayout.java | 85 - .../design/layout/LeftCenterRightLayout.java | 150 - .../src/com/fr/design/layout/TableLayout.java | 2057 -- .../design/layout/TableLayoutConstraints.java | 231 - .../com/fr/design/layout/TableLayoutTest.java | 82 - .../fr/design/layout/VerticalFlowLayout.java | 457 - .../design/mainframe/AbstractAppProvider.java | 32 - .../src/com/fr/design/mainframe/App.java | 40 - .../com/fr/design/mainframe/DecodeDialog.java | 91 - .../com/fr/design/mainframe/DesignerBean.java | 17 - .../fr/design/mainframe/DesignerContext.java | 156 - .../fr/design/mainframe/DesignerFrame.java | 1027 - .../DesignerFrameFileDealerPane.java | 572 - .../fr/design/mainframe/DesktopCardPane.java | 51 - .../mainframe/EastRegionContainerPane.java | 1105 - .../fr/design/mainframe/FormScrollBar.java | 156 - .../com/fr/design/mainframe/JTemplate.java | 1112 - .../design/mainframe/JTemplateProvider.java | 6 - .../fr/design/mainframe/JViewContainer.java | 174 - .../com/fr/design/mainframe/TemplatePane.java | 278 - .../fr/design/mainframe/UndoStateEdit.java | 74 - .../mainframe/WestRegionContainerPane.java | 57 - .../backgroundpane/ImagePreviewPane.java | 288 - .../dnd/ArrayListTransferHandler.java | 206 - .../mainframe/dnd/ArrayListTransferable.java | 49 - .../mainframe/dnd/ArrayTransferable.java | 33 - .../dnd/SerializableTransferable.java | 64 - .../form/FormECCompositeProvider.java | 17 - .../form/FormECDesignerProvider.java | 92 - .../loghandler/DesignerLogHandler.java | 344 - .../mainframe/loghandler/DesignerLogImpl.java | 46 - .../mainframe/loghandler/LogDetailPane.java | 30 - .../mainframe/loghandler/LogHandlerBar.java | 186 - .../mainframe/loghandler/LogHandlerBarUI.java | 158 - .../mainframe/loghandler/LogMessageBar.java | 69 - .../editors/AbstractPropertyEditor.java | 79 - .../widget/editors/DataBindingEditor.java | 151 - .../widget/editors/DataTableEditor.java | 84 - .../widget/editors/FormattedEditor.java | 76 - .../widget/editors/IntegerPropertyEditor.java | 19 - .../widget/editors/PropertyCellEditor.java | 91 - .../editors/ServerDataBindingEditor.java | 13 - .../widget/editors/ServerDataTableEditor.java | 13 - .../widget/editors/StringEditor.java | 66 - .../widget/editors/WidgetValueEditor.java | 123 - .../com/fr/design/menu/DottedSeparator.java | 75 - .../com/fr/design/menu/DottedSeparatorUI.java | 67 - .../src/com/fr/design/menu/KeySetUtils.java | 1088 - .../src/com/fr/design/menu/LineSeparator.java | 72 - .../src/com/fr/design/menu/MenuDef.java | 435 - .../src/com/fr/design/menu/MenuKeySet.java | 34 - .../src/com/fr/design/menu/MenuManager.java | 56 - .../src/com/fr/design/menu/NameSeparator.java | 97 - .../src/com/fr/design/menu/SeparatorDef.java | 45 - .../src/com/fr/design/menu/ShortCut.java | 74 - .../src/com/fr/design/menu/ToolBarDef.java | 80 - .../fr/design/menu/TwoDottedSeparatorUI.java | 65 - .../src/com/fr/design/menu/UISeparatorUI.java | 58 - .../com/fr/design/module/DesignModule.java | 102 - .../src/com/fr/design/object/NameObject.java | 70 - .../design/parameter/ParameterArrayPane.java | 98 - .../fr/design/parameter/ParameterGroup.java | 21 - .../design/parameter/ParameterInputPane.java | 220 - .../parameter/ParameterManagerPane.java | 61 - .../fr/design/parameter/ParameterPane.java | 92 - .../fr/design/present/DictPresentPane.java | 53 - .../fr/design/present/FormulaPresentPane.java | 47 - .../fr/design/present/NonePresentPane.java | 38 - .../design/present/dict/AbstractDicPane.java | 10 - .../dict/CustomDictCorrelationPane.java | 32 - .../design/present/dict/CustomDictPane.java | 82 - .../design/present/dict/DatabaseDictPane.java | 300 - .../design/present/dict/DictionaryPane.java | 81 - .../fr/design/roleAuthority/UIRoleTreeUI.java | 26 - .../com/fr/design/scrollruler/BaseRuler.java | 118 - .../design/scrollruler/HorizontalRuler.java | 18 - .../design/scrollruler/HorizontalRulerUI.java | 70 - .../fr/design/scrollruler/ModLineBorder.java | 166 - .../fr/design/scrollruler/RulerLayout.java | 154 - .../com/fr/design/scrollruler/RulerUI.java | 90 - .../scrollruler/ScrollRulerComponent.java | 28 - .../fr/design/scrollruler/VerticalRuler.java | 18 - .../design/scrollruler/VerticalRulerUI.java | 67 - .../com/fr/design/selection/QuickEditor.java | 61 - .../design/selection/SelectableElement.java | 20 - .../com/fr/design/selection/Selectedable.java | 25 - .../fr/design/selection/SelectionEvent.java | 16 - .../design/selection/SelectionListener.java | 14 - .../com/fr/design/style/AbstractPopBox.java | 232 - .../fr/design/style/AbstractSelectBox.java | 147 - .../com/fr/design/style/AlignmentPane.java | 386 - .../src/com/fr/design/style/AlphaPane.java | 124 - .../src/com/fr/design/style/BorderPane.java | 731 - .../com/fr/design/style/ChooseFileView.java | 185 - .../com/fr/design/style/CustomSelectBox.java | 64 - .../src/com/fr/design/style/FRFontPane.java | 404 - .../fr/design/style/FRFontPreviewArea.java | 74 - .../com/fr/design/style/FontFamilyPane.java | 79 - .../fr/design/style/FontSizeStylePane.java | 106 - .../src/com/fr/design/style/FormatBox.java | 208 - .../src/com/fr/design/style/FormatPane.java | 491 - .../BackgroundCustomJComponent.java | 66 - .../background/BackgroundJComponent.java | 44 - .../style/background/BackgroundPane.java | 158 - .../background/BackgroundPane4BoxChange.java | 26 - .../background/BackgroundPreviewLabel.java | 74 - .../background/BackgroundSelectPane.java | 79 - .../BackgroundUIComboBoxNoImagePane.java | 34 - .../background/BackgroundUIComboBoxPane.java | 167 - .../GradientBackgroundSelectPane.java | 118 - .../background/gradient/GradientBar.java | 307 - .../gradient/GradientChangeBoxPane.java | 129 - .../gradient/GradientFromToPixPane.java | 67 - .../gradient/GradientSelectBox.java | 84 - .../gradient/SelectColorPointBtn.java | 96 - .../background/image/ImageFileChooser.java | 255 - .../background/image/ImagePreviewPane.java | 257 - .../background/image/ImageSelectPane.java | 164 - .../background/pattern/PatternSelectBox.java | 51 - .../background/pattern/PatternSelectPane.java | 34 - .../pattern/PatternUIComboBoxPane.java | 63 - .../background/texture/TextureSelectBox.java | 51 - .../background/texture/TextureSelectPane.java | 32 - .../texture/TextureUIComboBoxPane.java | 43 - .../com/fr/design/style/color/ColorCell.java | 119 - .../style/color/ColorChooserPreview.java | 203 - .../style/color/ColorControlWindow.java | 81 - .../fr/design/style/color/ColorFactory.java | 75 - .../fr/design/style/color/ColorSelectBox.java | 104 - .../style/color/ColorSelectConfigManager.java | 173 - .../style/color/ColorSelectDetailPane.java | 104 - .../design/style/color/ColorSelectDialog.java | 179 - .../design/style/color/ColorSelectPane.java | 200 - .../design/style/color/ColorSelectable.java | 15 - .../style/color/ColorUIComboBoxPane.java | 59 - .../style/color/CustomChooserPanel.java | 1079 - .../style/color/DetailColorSelectPane.java | 106 - .../design/style/color/NewColorSelectBox.java | 118 - .../style/color/NewColorSelectPane.java | 205 - .../style/color/RecentUseColorPane.java | 48 - .../style/color/SwatchChooserPanel.java | 616 - .../color/TransparentColorControlWindow.java | 24 - .../design/style/color/TransparentPane.java | 85 - .../style/color/UIToolbarColorButton.java | 253 - .../fr/design/style/color/UsedColorPane.java | 112 - .../com/fr/design/utils/ColorRoutines.java | 1012 - .../src/com/fr/design/utils/DesignUtils.java | 521 - .../src/com/fr/design/utils/DrawRoutines.java | 354 - .../src/com/fr/design/utils/ThemeUtils.java | 185 - .../com/fr/design/utils/gui/GUICoreUtils.java | 847 - .../fr/design/utils/gui/GUIPaintUtils.java | 242 - .../com/fr/design/utils/gui/JListUtils.java | 68 - .../com/fr/design/utils/gui/LayoutUtils.java | 81 - .../src/com/fr/design/web/CustomIconPane.java | 481 - .../com/fr/design/widget/IconDefinePane.java | 94 - .../fr/design/widget/btn/ButtonConstants.java | 47 - .../design/widget/btn/ButtonDetailPane.java | 62 - .../btn/ButtonWithHotkeysDetailPane.java | 84 - .../write/submit/CustomSubmitJobPane.java | 19 - .../DBManipulationInWidgetEventPane.java | 37 - .../write/submit/DBManipulationPane.java | 1088 - .../fr/design/write/submit/DMLJobPane.java | 37 - .../write/submit/SubmitJobListPane.java | 63 - designer_base/src/com/fr/env/EnvListPane.java | 593 - designer_base/src/com/fr/env/RemoteEnv.java | 2244 -- .../src/com/fr/env/RemoteSignInPane.java | 47 - designer_base/src/com/fr/env/SignIn.java | 43 - designer_base/src/com/fr/file/FILE.java | 93 - .../src/com/fr/file/FILEChooserPane.java | 1403 - .../src/com/fr/file/FILEFactory.java | 56 - designer_base/src/com/fr/file/FileFILE.java | 270 - .../src/com/fr/file/FileNodeFILE.java | 414 - designer_base/src/com/fr/file/MemFILE.java | 155 - .../com/fr/file/filter/ChooseFileFilter.java | 260 - .../src/com/fr/file/filter/FILEFilter.java | 27 - .../filter/OnlyShowDirectoryFileFilter.java | 13 - .../com/fr/start/BBSGuestPaneProvider.java | 15 - .../src/com/fr/start/BaseDesigner.java | 161 - designer_base/src/com/fr/start/Demo.java | 49 - .../src/com/fr/start/SplashPane.java | 72 - .../src/com/fr/start/SplashWindow.java | 64 - .../src/com/fr/start/StartDocURL.java | 48 - .../src/com/fr/start/StartServer.java | 232 - .../fr/start/server/MultiOutputStream.java | 62 - .../fr/start/server/ServerManageFrame.java | 168 - .../src/com/fr/start/server/ServerTray.java | 207 - designer_chart/.classpath | 43 - designer_chart/.project | 1 - designer_chart/build.9.0.gradle | 96 - designer_chart/build.9.0.gradle.bak | 96 - designer_chart/build.chart.gradle | 98 - designer_chart/build.dev.gradle | 84 - designer_chart/build.dev.gradle.bak | 85 - designer_chart/build.master.gradle | 84 - designer_chart/build.master.gradle.bak | 85 - designer_chart/build.performance.gradle | 69 - designer_chart/build.performance.gradle.bak | 69 - designer_chart/build.release.gradle | 84 - .../com/fr/design/chart/ChartAxisFactory.java | 55 - .../design/chart/ChartCommonWizardPane.java | 22 - .../fr/design/chart/ChartComponentPane.java | 170 - .../com/fr/design/chart/ChartControlPane.java | 128 - .../src/com/fr/design/chart/ChartDialog.java | 103 - .../com/fr/design/chart/ChartPlotFactory.java | 132 - .../com/fr/design/chart/ChartSwingUtils.java | 76 - .../com/fr/design/chart/ChartTypePane.java | 197 - .../com/fr/design/chart/ChartWizardPane.java | 20 - .../com/fr/design/chart/FactoryObject.java | 40 - .../fr/design/chart/axis/AxisStyleObject.java | 29 - .../fr/design/chart/axis/AxisStylePane.java | 17 - .../chart/axis/BinaryChartStyleAxisPane.java | 63 - .../design/chart/axis/ChartAlertLinePane.java | 63 - .../axis/ChartAlertValueInTopBottomPane.java | 20 - .../chart/axis/ChartAlertValuePane.java | 229 - .../design/chart/axis/ChartStyleAxisPane.java | 87 - .../chart/axis/CustomChartStyleAxisPane.java | 19 - .../chart/axis/GanntChartStyleAxisPane.java | 28 - .../fr/design/chart/axis/MinMaxValuePane.java | 204 - .../chart/axis/RadarChartStyleAxisPane.java | 26 - .../chart/axis/TernaryChartStyleAxisPane.java | 42 - .../chart/axis/ValueChartStyleAxisPane.java | 25 - .../chart/axis/XYChartStyleAxisPane.java | 26 - .../fr/design/chart/comp/BorderAttriPane.java | 59 - .../com/fr/design/chart/demo/GlyphDemo.java | 123 - .../design/chart/gui/ActiveGlyphFactory.java | 97 - .../fr/design/chart/gui/ChartComponent.java | 334 - .../design/chart/gui/ChartWidgetOption.java | 79 - .../design/chart/gui/active/ActiveGlyph.java | 161 - .../gui/active/AlertValueActiveGlyph.java | 38 - .../chart/gui/active/AxisActiveGlyph.java | 43 - .../gui/active/CategoryAxisActiveGlyph.java | 19 - .../chart/gui/active/ChartActiveGlyph.java | 39 - .../gui/active/DataLabelActiveGlyph.java | 44 - .../gui/active/DataSeriesActiveGlyph.java | 53 - .../gui/active/DataSheetActiveGlyph.java | 30 - .../chart/gui/active/DateAxisActiveGlyph.java | 18 - .../chart/gui/active/LegendActiveGlyph.java | 30 - .../chart/gui/active/PlotActiveGlyph.java | 34 - .../gui/active/RadarAxisActiveGlyph.java | 18 - .../gui/active/RangeAxisActiveGlyph.java | 18 - .../chart/gui/active/TextActiveGlyph.java | 35 - .../gui/active/TrendLineActiveGlyph.java | 43 - .../gui/active/ValueAxisActiveGlyph.java | 19 - .../active/action/ChartComponentAction.java | 47 - .../action/SetAnalysisLineStyleAction.java | 27 - .../gui/active/action/SetAxisStyleAction.java | 33 - .../active/action/SetChartStyleAciton.java | 31 - .../action/SetDataLabelStyleAction.java | 26 - .../action/SetDataSeriesAttrAction.java | 26 - .../gui/active/action/SetDataSheetAction.java | 33 - .../active/action/SetLegendStyleAction.java | 32 - .../gui/active/action/SetPlotStyleAction.java | 32 - .../active/action/SetTitleStyleAction.java | 32 - .../chart/javascript/ChartEmailPane.java | 90 - .../design/chart/report/GisMapDataPane.java | 155 - .../report/GisMapTableDataContentPane.java | 356 - .../design/chart/report/MapCubeDataPane.java | 76 - .../design/chart/report/MapCubeLayerPane.java | 309 - .../chart/report/MapCubeSetDataPane.java | 130 - .../fr/design/chart/report/MapDataPane.java | 138 - .../chart/report/MapMoreCubeLayerPane.java | 106 - .../chart/report/MapMoreTableIndexPane.java | 209 - .../chart/report/MapReportCubeDataPane.java | 74 - .../chart/report/MapReportDataSinglePane.java | 226 - .../design/chart/report/MapReportEditor.java | 62 - .../chart/report/MapReportRenderer.java | 32 - .../fr/design/chart/report/MapSinglePane.java | 113 - .../chart/report/MapTableCubeDataPane.java | 110 - .../chart/report/MapTableDataSinglePane.java | 268 - .../series/PlotSeries/MapCustomPane.java | 250 - .../PlotSeries/MapDefiAreaNamePane.java | 237 - .../series/PlotSeries/MapImageEditPane.java | 763 - .../series/PlotSeries/MapSelectShape.java | 86 - .../PlotSeries/UIGroupExtensionPane.java | 590 - .../series/PlotStyle/ChartSelectDemoPane.java | 166 - .../BubblePlotChartConditionPane.java | 27 - .../SeriesCondition/ChartConditionPane.java | 25 - .../ChartConditionPaneFactory.java | 46 - .../ConditionTrendLinePane.java | 233 - .../DataLabelContentsPane.java | 53 - .../SeriesCondition/DataLabelStylePane.java | 121 - .../DataSeriesAttrCustomPane.java | 25 - .../SeriesCondition/DataSeriesAttrPane.java | 80 - .../DataSeriesConditionPane.java | 191 - .../DataSeriesCustomConditionPane.java | 21 - .../GanttPlotChartConditionPane.java | 21 - .../MapPlotChartConditionPane.java | 18 - .../PiePlotChartConditionPane.java | 20 - .../SeriesCondition/TooltipContentsPane.java | 183 - .../SeriesCondition/TrendLineControlPane.java | 64 - .../XYPlotChartConditionPane.java | 27 - .../dlp/AreaDataLabelPane.java | 16 - .../dlp/Bar2DDataLabelPane.java | 70 - .../dlp/Bar3DDataLabelPane.java | 16 - .../dlp/BubbleDataLabelPane.java | 68 - .../SeriesCondition/dlp/DataLabelPane.java | 242 - .../dlp/GanttDataLabelPane.java | 30 - .../dlp/LineDataLabelPane.java | 16 - .../SeriesCondition/dlp/MapDataLabelPane.java | 37 - .../dlp/MeterDataLabelPane.java | 17 - .../SeriesCondition/dlp/PieDataLabelPane.java | 118 - .../dlp/RadarDataLabelPane.java | 17 - .../dlp/RangeDataLabelPane.java | 65 - .../dlp/StockDataLabelPane.java | 29 - .../SeriesCondition/dlp/XYDataLabelPane.java | 25 - .../Area3DPlotDataSeriesConditionPane.java | 38 - .../impl/AreaPlotDataSeriesCondtionPane.java | 25 - .../impl/Bar2DTrendLineDSConditionPane.java | 20 - .../Bar3DPlotDataSeriesConditionPane.java | 19 - .../impl/BarPlotDataSeriesConditionPane.java | 27 - .../BubblePlotDataSeriesConditionPane.java | 31 - .../impl/ChartHyperPopAttrPane.java | 153 - .../impl/ChartHyperPoplinkPane.java | 136 - .../impl/ChartHyperRelateCellLinkPane.java | 125 - .../impl/ChartHyperRelateFloatLinkPane.java | 145 - .../impl/CustomPlot4AreaConditionPane.java | 17 - ...ustomPlot4BarNoTrendLineConditionPane.java | 17 - .../CustomPlot4BarTrendLineConditionPane.java | 17 - .../impl/CustomPlot4LineConditionPane.java | 17 - .../CustomPlotDataSeriesConditionPane.java | 22 - .../impl/DataSeriesConditionPaneFactory.java | 75 - .../Donut2DPlotDataSeriesConditionPane.java | 20 - .../impl/FormHyperlinkNorthPane.java | 135 - .../impl/FormHyperlinkPane.java | 102 - .../GanttPlotDataSeriesConditionPane.java | 41 - .../impl/LinePlotDataSeriesConditionPane.java | 30 - .../impl/MapPlotDataSeriesConditionPane.java | 31 - .../MeterPlotDataSeriesConditionPane.java | 21 - .../Pie3DPlotDataSeriesConditionPane.java | 27 - .../impl/PiePlotDataSeriesConditionPane.java | 28 - .../RadarPlotDataSeriesConditionPane.java | 33 - .../StockPlotDataSeriesConditionPane.java | 27 - .../XYScatterPlotDataSeriesConditionPane.java | 35 - .../design/gui/xcombox/ComboBoxUseEditor.java | 160 - .../fr/design/gui/xcombox/MarkerComboBox.java | 102 - .../design/mainframe/ChartPropertyPane.java | 50 - .../mainframe/MiddleChartPropertyPane.java | 163 - .../mainframe/TargetComponentContainer.java | 15 - .../chart/AbstractChartAttrPane.java | 45 - .../mainframe/chart/AttributeChange.java | 8 - .../design/mainframe/chart/ChartEditPane.java | 351 - .../mainframe/chart/ChartHyperEditPane.java | 102 - .../mainframe/chart/PaneTitleConstants.java | 25 - .../mainframe/chart/gui/ChartDataPane.java | 117 - .../mainframe/chart/gui/ChartOtherPane.java | 139 - .../mainframe/chart/gui/ChartStylePane.java | 196 - .../chart/gui/ChartTypeButtonPane.java | 548 - .../mainframe/chart/gui/ChartTypePane.java | 372 - .../chart/gui/data/CalculateComboBox.java | 68 - .../chart/gui/data/ChartDataFilterPane.java | 592 - .../chart/gui/data/DataContentsPane.java | 39 - .../chart/gui/data/DatabaseTableDataPane.java | 110 - .../chart/gui/data/NormalChartDataPane.java | 154 - .../chart/gui/data/PresentComboBox.java | 113 - .../chart/gui/data/ReportDataPane.java | 105 - .../chart/gui/data/TableDataPane.java | 174 - .../report/AbstractReportDataContentPane.java | 212 - .../BubblePlotReportDataContentPane.java | 101 - ...goryPlotMoreCateReportDataContentPane.java | 207 - .../CategoryPlotReportDataContentPane.java | 141 - .../GanttPlotReportDataContentPane.java | 112 - .../MeterPlotReportDataContentPane.java | 126 - .../report/PiePlotReportDataContentPane.java | 74 - .../StockPlotReportDataContentPane.java | 283 - .../XYScatterPlotReportDataContentPane.java | 91 - .../table/AbstractTableDataContentPane.java | 147 - .../table/BubblePlotTableDataContentPane.java | 168 - ...egoryPlotMoreCateTableDataContentPane.java | 256 - .../CategoryPlotTableDataContentPane.java | 169 - .../table/GanttPlotTableDataContentPane.java | 198 - .../table/MeterPlotTableDataContentPane.java | 136 - .../table/PiePlotTableDataContentPane.java | 55 - .../table/SeriesNameUseFieldNamePane.java | 368 - .../table/SeriesNameUseFieldValuePane.java | 303 - .../data/table/SeriesTypeUseComboxPane.java | 172 - .../table/StockPlotTableDataContentPane.java | 197 - .../XYScatterPlotTableDataContentPane.java | 153 - .../gui/other/ChartConditionAttrPane.java | 84 - .../chart/gui/other/ChartInteractivePane.java | 931 - .../chart/gui/other/ChartSwitchPane.java | 94 - .../chart/gui/style/AbstractChartTabPane.java | 21 - .../chart/gui/style/ChartAccColorPane.java | 232 - .../gui/style/ChartAxisLineStylePane.java | 91 - .../chart/gui/style/ChartAxisTitlePane.java | 146 - .../gui/style/ChartAxisValueTypePane.java | 136 - .../gui/style/ChartBackgroundNoImagePane.java | 23 - .../chart/gui/style/ChartBackgroundPane.java | 142 - .../chart/gui/style/ChartBeautyPane.java | 74 - .../chart/gui/style/ChartBorderPane.java | 73 - .../style/ChartDataPointLabel4MapPane.java | 173 - .../gui/style/ChartDatapointLabelPane.java | 449 - .../chart/gui/style/ChartFillStylePane.java | 226 - .../gui/style/ChartPreFillStylePane.java | 97 - .../style/ChartTextAttrNoFontSizePane.java | 62 - .../chart/gui/style/ChartTextAttrPane.java | 175 - .../chart/gui/style/ThirdTabPane.java | 140 - .../analysisline/ChartAnalysisLinePane.java | 286 - .../chart/gui/style/area/ChartAreaPane.java | 90 - .../gui/style/area/ChartAxisAreaPane.java | 23 - .../gui/style/area/ChartPlotAreaPane.java | 150 - .../gui/style/area/ChartWholeAreaPane.java | 83 - .../gui/style/area/DefaultAxisAreaPane.java | 119 - .../gui/style/area/Plot3DAxisAreaPane.java | 57 - .../gui/style/area/RadarAxisAreaPane.java | 69 - .../chart/gui/style/axis/ChartAxisPane.java | 131 - .../gui/style/axis/ChartAxisUsePane.java | 17 - .../gui/style/axis/ChartCategoryPane.java | 273 - .../gui/style/axis/ChartPercentValuePane.java | 16 - .../chart/gui/style/axis/ChartRadarPane.java | 84 - .../gui/style/axis/ChartSecondValuePane.java | 49 - .../chart/gui/style/axis/ChartValuePane.java | 418 - .../style/datalabel/ChartDataLabelPane.java | 125 - .../style/datasheet/ChartDatasheetPane.java | 158 - .../gui/style/legend/AutoSelectedPane.java | 6 - .../gui/style/legend/ChartLegendPane.java | 154 - .../style/series/AbstractPlotSeriesPane.java | 136 - .../gui/style/series/Area3DSeriesPane.java | 57 - .../gui/style/series/AreaSeriesPane.java | 96 - .../gui/style/series/Bar2DSeriesPane.java | 91 - .../gui/style/series/Bar3DSeriesPane.java | 84 - .../gui/style/series/BubbleSeriesPane.java | 83 - .../gui/style/series/ChartSeriesPane.java | 90 - .../style/series/ColorPickerPaneNumFiled.java | 41 - .../gui/style/series/CustomSeriesPane.java | 111 - .../gui/style/series/Donut2DSeriesPane.java | 111 - .../gui/style/series/FunnelSeriesPane.java | 25 - .../gui/style/series/LineSeriesPane.java | 137 - .../chart/gui/style/series/MapSeriesPane.java | 219 - .../gui/style/series/MeterSeriesPane.java | 146 - .../gui/style/series/Pie2DSeriesPane.java | 128 - .../gui/style/series/Pie3DSeriesPane.java | 26 - .../gui/style/series/RadarSeriesPane.java | 116 - .../gui/style/series/RangeSeriesPane.java | 45 - .../gui/style/series/StockSeriesPane.java | 105 - .../gui/style/series/UIColorPickerPane.java | 779 - .../gui/style/series/XYScatterSeriesPane.java | 65 - .../chart/gui/type/AbstractBarPane.java | 54 - .../chart/gui/type/AbstractChartTypePane.java | 624 - .../chart/gui/type/AreaPlotPane.java | 148 - .../mainframe/chart/gui/type/BarPlotPane.java | 126 - .../chart/gui/type/BubblePlotPane.java | 79 - .../chart/gui/type/ChartImagePane.java | 78 - .../chart/gui/type/ColumnPlotPane.java | 119 - .../chart/gui/type/CustomPlotPane.java | 72 - .../chart/gui/type/DonutPlotPane.java | 137 - .../chart/gui/type/FunnelPlotPane.java | 95 - .../chart/gui/type/GanttPlotPane.java | 75 - .../chart/gui/type/GisMapPlotPane.java | 190 - .../chart/gui/type/LinePlotPane.java | 93 - .../mainframe/chart/gui/type/MapPlotPane.java | 158 - .../chart/gui/type/MeterPlotPane.java | 124 - .../mainframe/chart/gui/type/PiePlotPane.java | 130 - .../chart/gui/type/RadarPlotPane.java | 76 - .../chart/gui/type/RangePlotPane.java | 79 - .../chart/gui/type/StockPlotPane.java | 76 - .../chart/gui/type/XYScatterPlotPane.java | 89 - .../fr/design/module/ChartDesignerModule.java | 92 - .../fr/design/module/ChartHyperlinkGroup.java | 42 - .../fr/design/module/ChartPreStyleAction.java | 77 - .../module/ChartPreStyleManagerPane.java | 87 - .../fr/design/module/ChartPreStylePane.java | 108 - .../fr/design/module/FormHyperlinkGroup.java | 37 - designer_form/.classpath | 43 - designer_form/.project | 1 - designer_form/build.9.0.gradle | 107 - designer_form/build.9.0.gradle.bak | 107 - designer_form/build.dev.gradle | 106 - designer_form/build.dev.gradle.bak | 89 - designer_form/build.form.gradle | 109 - designer_form/build.master.gradle | 112 - designer_form/build.master.gradle.bak | 113 - designer_form/build.performance.gradle | 70 - designer_form/build.performance.gradle.bak | 69 - designer_form/build.release.gradle | 100 - .../fr/design/designer/beans/AdapterBus.java | 78 - .../designer/beans/ComponentAdapter.java | 61 - .../designer/beans/ConnectorCreator.java | 214 - .../design/designer/beans/HoverPainter.java | 23 - .../beans/actions/ConnectionAction.java | 34 - .../designer/beans/actions/CutAction.java | 33 - .../beans/actions/FormEditAction.java | 17 - .../designer/beans/actions/PasteAction.java | 37 - .../component/CompositeComponentAdapter.java | 203 - .../layout/AbsoluteLayoutAdapter.java | 33 - .../adapters/layout/DefaultLayoutAdapter.java | 29 - .../layout/FRAbsoluteLayoutAdapter.java | 341 - .../layout/FRBorderLayoutAdapter.java | 192 - .../adapters/layout/FRCardLayoutAdapter.java | 141 - .../adapters/layout/FRFitLayoutAdapter.java | 1221 - .../adapters/layout/FRGridLayoutAdapter.java | 48 - .../layout/FRHorizontalLayoutAdapter.java | 82 - .../FRHorizontalSplitLayoutAdapter.java | 26 - .../layout/FRParameterLayoutAdapter.java | 110 - .../adapters/layout/FRScaleLayoutAdapter.java | 57 - .../adapters/layout/FRTitleLayoutAdapter.java | 52 - .../layout/FRVerticalLayoutAdapter.java | 84 - .../layout/FRVerticalSplitLayoutAdapter.java | 52 - .../beans/events/DesignerEditListener.java | 14 - .../designer/beans/events/DesignerEditor.java | 82 - .../designer/beans/events/DesignerEvent.java | 43 - .../design/designer/beans/location/Add.java | 19 - .../designer/beans/location/Bottom.java | 30 - .../designer/beans/location/Direction.java | 45 - .../design/designer/beans/location/Inner.java | 217 - .../design/designer/beans/location/Left.java | 30 - .../designer/beans/location/LeftBottom.java | 32 - .../designer/beans/location/LeftTop.java | 32 - .../designer/beans/location/Location.java | 35 - .../design/designer/beans/location/Outer.java | 27 - .../design/designer/beans/location/Right.java | 30 - .../designer/beans/location/RightBottom.java | 31 - .../designer/beans/location/RightTop.java | 31 - .../beans/location/RootResizeDirection.java | 96 - .../design/designer/beans/location/Top.java | 30 - .../beans/painters/FRBorderLayoutPainter.java | 143 - .../beans/painters/FRFitLayoutPainter.java | 250 - .../painters/FRParameterLayoutPainter.java | 17 - .../beans/painters/NullLayoutPainter.java | 29 - .../design/designer/creator/FormCardPane.java | 244 - .../design/designer/creator/NullCreator.java | 37 - .../creator/XAbstractSplitLayout.java | 49 - .../design/designer/creator/XChartEditor.java | 281 - .../design/designer/creator/XComponent.java | 32 - .../design/designer/creator/XConnector.java | 186 - .../designer/creator/XCreatorTools.java | 58 - .../design/designer/creator/XDataTable.java | 94 - .../designer/creator/XEditorHolder.java | 96 - .../design/designer/creator/XElementCase.java | 338 - .../design/designer/creator/XNameWidget.java | 146 - .../design/designer/creator/XTableTree.java | 57 - .../design/designer/creator/XWFitLayout.java | 1188 - .../creator/XWHorizontalSplitLayout.java | 40 - .../designer/creator/XWScaleLayout.java | 169 - .../designer/creator/XWTitleLayout.java | 178 - .../creator/XWVerticalSplitLayout.java | 40 - .../creator/XWrapperedFieldEditor.java | 69 - .../creator/cardlayout/XCardAddButton.java | 194 - .../creator/cardlayout/XCardSwitchButton.java | 439 - .../cardlayout/XWCardMainBorderLayout.java | 331 - .../creator/cardlayout/XWCardTagLayout.java | 436 - .../creator/cardlayout/XWCardTitleLayout.java | 195 - .../creator/cardlayout/XWTabFitLayout.java | 580 - .../designer/properties/BoundsGroupModel.java | 139 - .../properties/CardDefaultShowEditor.java | 11 - .../properties/CardDefaultShowRenderer.java | 11 - .../properties/CardDefaultShowWrapper.java | 11 - .../properties/CardLayoutConstraints.java | 86 - .../designer/properties/DelegateEditor.java | 123 - .../properties/FRCardConstraintsEditor.java | 10 - .../properties/FRFitLayoutConstraints.java | 161 - .../FRFitLayoutPropertiesGroupModel.java | 207 - .../FRTabFitLayoutPropertiesGroupModel.java | 157 - .../designer/properties/FitStateRenderer.java | 19 - .../designer/properties/FitStateWrapper.java | 21 - .../FormWidgetAuthorityEditPane.java | 210 - .../properties/HVLayoutConstraints.java | 65 - .../properties/HorizontalSplitProperties.java | 15 - .../properties/MultiSelectionBoundsModel.java | 121 - .../properties/VerticalBoxProperties.java | 102 - .../properties/VerticalSplitProperties.java | 105 - .../properties/WidgetPropertyTable.java | 137 - .../items/FRFitConstraintsItems.java | 23 - .../items/LabelHorizontalAlignmentItems.java | 19 - .../properties/items/UnderlineItems.java | 17 - .../items/WidgetDisplayPositionItems.java | 24 - .../treeview/ComponentTreeCellRenderer.java | 65 - .../designer/treeview/ComponentTreeModel.java | 158 - .../design/form/javascript/FormEmailPane.java | 34 - .../design/form/layout/FRAbsoluteLayout.java | 45 - .../fr/design/form/layout/FRFitLayout.java | 139 - .../fr/design/form/layout/FRFlowLayout.java | 104 - .../form/layout/FRHorizontalSplitLayout.java | 77 - .../fr/design/form/layout/FRScaleLayout.java | 87 - .../fr/design/form/layout/FRSplitLayout.java | 180 - .../fr/design/form/layout/FRTitleLayout.java | 160 - .../form/layout/FRVerticalSplitLayout.java | 78 - .../form/parameter/FormParaTargetMode.java | 52 - .../fr/design/gui/core/FormWidgetOption.java | 107 - .../gui/xpane/CardTagLayoutBorderPane.java | 112 - .../xpane/CardTagLayoutBorderPreviewPane.java | 14 - .../gui/xpane/FormHyperlinkGroupPane.java | 42 - .../design/gui/xpane/JTreeAutoBuildPane.java | 194 - .../fr/design/gui/xpane/LayoutBorderPane.java | 934 - .../gui/xpane/LayoutBorderPreviewPane.java | 178 - .../fr/design/gui/xpane/ToolTipEditor.java | 249 - .../design/gui/xtable/PropertyGroupModel.java | 154 - .../fr/design/mainframe/AutoScrollSource.java | 69 - .../fr/design/mainframe/ComponentTree.java | 359 - .../fr/design/mainframe/ConnectorHelper.java | 110 - .../fr/design/mainframe/CoverReportPane.java | 136 - .../mainframe/DesignerTransferHandler.java | 27 - .../src/com/fr/design/mainframe/FormArea.java | 801 - .../mainframe/FormCreatorDropTarget.java | 261 - .../com/fr/design/mainframe/FormDesigner.java | 1467 - .../mainframe/FormDesignerDropTarget.java | 96 - .../mainframe/FormDesignerModeForSpecial.java | 29 - .../fr/design/mainframe/FormDesignerUI.java | 425 - .../mainframe/FormEditorKeyListener.java | 55 - .../mainframe/FormHierarchyTreePane.java | 222 - .../fr/design/mainframe/FormModelAdapter.java | 104 - .../com/fr/design/mainframe/FormParaPane.java | 189 - .../design/mainframe/FormParaWidgetPane.java | 440 - .../fr/design/mainframe/FormSelection.java | 329 - .../fr/design/mainframe/FormTargetMode.java | 46 - .../mainframe/FormWidgetDetailPane.java | 457 - .../design/mainframe/FormWidgetPopWindow.java | 147 - .../fr/design/mainframe/TabChangeAction.java | 30 - .../fr/design/mainframe/ToolBarButton.java | 162 - .../design/mainframe/TreeTransferHandler.java | 177 - .../design/mainframe/WidgetToolBarPane.java | 257 - .../EmbeddedFormExportExportAction.java | 157 - .../mainframe/actions/NewFormAction.java | 56 - ...ssibleCardTagWLayoutBorderStyleEditor.java | 48 - .../accessibles/AccessibleColorEditor.java | 114 - .../accessibles/AccessibleDateEditor.java | 40 - .../AccessibleDimensionEditor.java | 41 - .../accessibles/AccessibleFontEditor.java | 45 - .../AccessibleGridWidgetEditor.java | 39 - .../AccessibleParameterEditor.java | 37 - .../accessibles/AccessiblePropertyEditor.java | 55 - .../accessibles/AccessibleRegexEditor.java | 51 - .../AccessibleWLayoutBorderStyleEditor.java | 48 - .../AccessibleWidgetValueEditor.java | 5 - .../widget/editors/BooleanEditor.java | 49 - .../editors/BorderLayoutDirectionEditor.java | 79 - .../widget/editors/ButtonTypeEditor.java | 29 - .../CardTagWLayoutBorderStyleEditor.java | 12 - .../mainframe/widget/editors/ColorEditor.java | 18 - .../mainframe/widget/editors/ComboEditor.java | 91 - .../widget/editors/DataTableConfigPane.java | 275 - .../widget/editors/DateFormatEditor.java | 10 - .../widget/editors/DateRangeEditor.java | 60 - .../widget/editors/DictionaryEditor.java | 15 - .../widget/editors/DimensionEditor.java | 11 - .../editors/FitLayoutDirectionEditor.java | 19 - .../mainframe/widget/editors/FontEditor.java | 11 - .../widget/editors/ImgBackgroundEditor.java | 12 - .../widget/editors/InChangeBooleanEditor.java | 9 - .../widget/editors/ItemCellEditor.java | 41 - .../editors/NameWidgetComboboxEditor.java | 62 - .../widget/editors/PaddingMarginPane.java | 127 - .../widget/editors/ParameterEditor.java | 11 - .../widget/editors/PercentageEditor.java | 10 - .../mainframe/widget/editors/RegexEditor.java | 17 - .../widget/editors/TreeModelEditor.java | 15 - .../editors/WLayoutBorderStyleEditor.java | 13 - .../widget/editors/WidgetDisplayPosition.java | 46 - .../widget/renderer/ColorCellRenderer.java | 57 - .../widget/renderer/DateCellRenderer.java | 9 - .../renderer/DimensionCellRenderer.java | 10 - .../widget/renderer/EncoderCellRenderer.java | 47 - .../widget/renderer/FontCellRenderer.java | 51 - .../widget/renderer/GridWidgetRenderer.java | 9 - .../LabelHorizontalAlignmentRenderer.java | 10 - .../widget/renderer/ParameterRenderer.java | 11 - .../widget/renderer/PointCellRenderer.java | 10 - .../widget/renderer/PropertyCellRenderer.java | 24 - .../renderer/RectangleCellRenderer.java | 10 - .../widget/renderer/RegexCellRencerer.java | 9 - .../widget/renderer/TreeModelRenderer.java | 9 - .../renderer/WidgetDisplayPositionRender.java | 16 - .../widget/wrappers/ColorWrapper.java | 134 - .../widget/wrappers/DateWrapper.java | 24 - .../widget/wrappers/DimensionWrapper.java | 48 - .../widget/wrappers/FontWrapper.java | 63 - .../widget/wrappers/GridWidgetWrapper.java | 15 - .../LabelHorizontalAlignmentWrapper.java | 11 - .../wrappers/LayoutBorderStyleWrapper.java | 48 - .../widget/wrappers/ParameterWrapper.java | 29 - .../widget/wrappers/PointWrapper.java | 50 - .../widget/wrappers/RectangleWrapper.java | 50 - .../widget/wrappers/RegexWrapper.java | 35 - .../WidgetDisplayPositionWrapper.java | 16 - .../widget/wrappers/WrapperUtils.java | 54 - .../fr/design/module/FormDesignerModule.java | 105 - .../parameter/ParameterPropertyPane.java | 170 - .../parameter/ParameterToolBarPane.java | 174 - .../ui/btn/FormSubmitButtonDetailPane.java | 40 - sonar-dev-project.properties | 15 - start.bat | 1 - 6404 files changed, 371793 insertions(+), 378792 deletions(-) delete mode 100644 .gitattributes delete mode 100644 build.10.0.gradle delete mode 100644 build.9.0.gradle delete mode 100644 build.applet.gradle delete mode 100644 build.dev.gradle delete mode 100644 build.master.gradle delete mode 100644 build.master.gradle.bak delete mode 100644 build.performance.gradle delete mode 100644 build.performance.gradle.bak delete mode 100644 build.release.gradle delete mode 100644 build.release.gradle.bak delete mode 100644 build.report-designer.gradle create mode 100644 designer-base/.gitignore create mode 100644 designer-base/build.base.gradle rename {designer_base => designer-base}/clean.gradle (100%) rename {designer_base => designer-base}/src/com/fr/aspectj/designerbase/AlphaFineReminder.aj (100%) rename {designer_base => designer-base}/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj (100%) rename {designer_base => designer-base}/src/com/fr/common/inputevent/InputEventBaseOnOS.java (100%) create mode 100644 designer-base/src/com/fr/design/DesignModelAdapter.java create mode 100644 designer-base/src/com/fr/design/DesignState.java create mode 100644 designer-base/src/com/fr/design/DesignerEnvManager.java create mode 100644 designer-base/src/com/fr/design/Exception/ValidationException.java rename {designer_base => designer-base}/src/com/fr/design/ExtraDesignClassManager.java (100%) rename {designer_base => designer-base}/src/com/fr/design/RestartHelper.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/AllowAuthorityEditAction.java (100%) create mode 100644 designer-base/src/com/fr/design/actions/CheckBoxAction.java rename {designer_base => designer-base}/src/com/fr/design/actions/ExitAuthorityEditAction.java (100%) create mode 100644 designer-base/src/com/fr/design/actions/HyperlinkPluginAction.java rename {designer_base => designer-base}/src/com/fr/design/actions/JTemplateAction.java (100%) create mode 100644 designer-base/src/com/fr/design/actions/MenuAction.java create mode 100644 designer-base/src/com/fr/design/actions/TableDataSourceAction.java rename {designer_base => designer-base}/src/com/fr/design/actions/TemplateComponentAction.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/TemplateComponentActionInterface.java (100%) create mode 100644 designer-base/src/com/fr/design/actions/ToggleButtonUpdateAction.java rename {designer_base => designer-base}/src/com/fr/design/actions/UndoableAction.java (100%) create mode 100644 designer-base/src/com/fr/design/actions/UpdateAction.java rename {designer_base => designer-base}/src/com/fr/design/actions/community/BBSAction.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/community/BugAction.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/community/NeedAction.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/community/QuestionAction.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/community/SignAction.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/community/UpAction.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/community/VideoAction.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/core/ActionFactory.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/core/WorkBookSupportable.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/edit/CopyAction.java (100%) create mode 100644 designer-base/src/com/fr/design/actions/edit/CutAction.java create mode 100644 designer-base/src/com/fr/design/actions/edit/PasteAction.java create mode 100644 designer-base/src/com/fr/design/actions/edit/RedoAction.java create mode 100644 designer-base/src/com/fr/design/actions/edit/UndoAction.java rename {designer_base => designer-base}/src/com/fr/design/actions/file/CloseCurrentTemplateAction.java (100%) create mode 100644 designer-base/src/com/fr/design/actions/file/CloseTemplateAction.java create mode 100644 designer-base/src/com/fr/design/actions/file/EditEnvAction.java create mode 100644 designer-base/src/com/fr/design/actions/file/ExitDesignerAction.java rename {designer_base => designer-base}/src/com/fr/design/actions/file/LocalePane.java (100%) create mode 100644 designer-base/src/com/fr/design/actions/file/OpenRecentReportMenuDef.java create mode 100644 designer-base/src/com/fr/design/actions/file/OpenTemplateAction.java create mode 100644 designer-base/src/com/fr/design/actions/file/PreferenceAction.java create mode 100644 designer-base/src/com/fr/design/actions/file/PreferencePane.java create mode 100644 designer-base/src/com/fr/design/actions/file/SaveAsTemplateAction.java rename {designer_base => designer-base}/src/com/fr/design/actions/file/SaveTemplateAction.java (100%) create mode 100644 designer-base/src/com/fr/design/actions/file/SwitchExistEnv.java create mode 100644 designer-base/src/com/fr/design/actions/file/WebPreviewUtils.java create mode 100644 designer-base/src/com/fr/design/actions/help/AboutAction.java create mode 100644 designer-base/src/com/fr/design/actions/help/AboutDialog.java create mode 100644 designer-base/src/com/fr/design/actions/help/AboutPane.java create mode 100644 designer-base/src/com/fr/design/actions/help/FeedBackAction.java create mode 100644 designer-base/src/com/fr/design/actions/help/FeedBackPane.java create mode 100644 designer-base/src/com/fr/design/actions/help/ForumAction.java create mode 100644 designer-base/src/com/fr/design/actions/help/SupportQQAction.java create mode 100644 designer-base/src/com/fr/design/actions/help/SystemInfoPane.java create mode 100644 designer-base/src/com/fr/design/actions/help/TutorialAction.java create mode 100644 designer-base/src/com/fr/design/actions/help/WebDemoAction.java rename {designer_base => designer-base}/src/com/fr/design/actions/help/alphafine/AlphaFineAction.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/help/alphafine/AlphaFineContext.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/help/alphafine/AlphaFineListener.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/help/alphafine/RemindDialog.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/help/alphafine/RemindPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/server/ConnectionListAction.java (100%) create mode 100644 designer-base/src/com/fr/design/actions/server/FunctionManagerAction.java create mode 100644 designer-base/src/com/fr/design/actions/server/GlobalParameterAction.java create mode 100644 designer-base/src/com/fr/design/actions/server/GlobalTableDataAction.java create mode 100644 designer-base/src/com/fr/design/actions/server/PlatformManagerAction.java rename {designer_base => designer-base}/src/com/fr/design/actions/server/PluginManagerAction.java (100%) rename {designer_base => designer-base}/src/com/fr/design/actions/server/ProcedureListAction.java (100%) create mode 100644 designer-base/src/com/fr/design/actions/tabledata/TableDataAction.java rename {designer_base => designer-base}/src/com/fr/design/bbs/BBSLoginUtils.java (100%) create mode 100644 designer-base/src/com/fr/design/beans/BasicBeanPane.java create mode 100644 designer-base/src/com/fr/design/beans/FurtherBasicBeanPane.java create mode 100644 designer-base/src/com/fr/design/beans/GroupModel.java create mode 100644 designer-base/src/com/fr/design/beans/location/Absorptionline.java create mode 100644 designer-base/src/com/fr/design/beans/location/MoveUtils.java create mode 100644 designer-base/src/com/fr/design/border/UIRoundedBorder.java create mode 100644 designer-base/src/com/fr/design/border/UITitledBorder.java rename {designer_base => designer-base}/src/com/fr/design/bridge/DesignToolbarProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/cell/FloatElementsProvider.java create mode 100644 designer-base/src/com/fr/design/condition/CellHighlightAddMenuDef.java rename {designer_base => designer-base}/src/com/fr/design/condition/ConditionAttrSingleConditionPane.java (100%) create mode 100644 designer-base/src/com/fr/design/condition/ConditionAttributesPane.java create mode 100644 designer-base/src/com/fr/design/condition/ContinuousTreeSelectionModel.java rename {designer_base => designer-base}/src/com/fr/design/condition/DSColumnLiteConditionPane.java (100%) create mode 100644 designer-base/src/com/fr/design/condition/DSColumnSimpleLiteConditionPane.java rename {designer_base => designer-base}/src/com/fr/design/condition/HighLightConditionAction.java (100%) create mode 100644 designer-base/src/com/fr/design/condition/LiteConditionPane.java rename {designer_base => designer-base}/src/com/fr/design/condition/ObjectLiteConditionPane.java (100%) create mode 100644 designer-base/src/com/fr/design/condition/SingleConditionPane.java rename {designer_base => designer-base}/src/com/fr/design/constants/KeyWords.java (100%) rename {designer_base => designer-base}/src/com/fr/design/constants/LayoutConstants.java (100%) rename {designer_base => designer-base}/src/com/fr/design/constants/UIConstants.java (100%) rename {designer_base => designer-base}/src/com/fr/design/data/BasicTableDataTreePane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/data/DataCreatorUI.java (100%) create mode 100644 designer-base/src/com/fr/design/data/DesignTableDataManager.java create mode 100644 designer-base/src/com/fr/design/data/datapane/ChoosePane.java rename {designer_base => designer-base}/src/com/fr/design/data/datapane/ChoosePaneSupportFormula.java (100%) create mode 100644 designer-base/src/com/fr/design/data/datapane/DSButtonGroup.java create mode 100644 designer-base/src/com/fr/design/data/datapane/DataBaseItems.java create mode 100644 designer-base/src/com/fr/design/data/datapane/EditOrNewLabel.java create mode 100644 designer-base/src/com/fr/design/data/datapane/FlashLookLabelMouseAdapter.java create mode 100644 designer-base/src/com/fr/design/data/datapane/GlobalTableDataComboBox.java create mode 100644 designer-base/src/com/fr/design/data/datapane/GlobalTreeTableDataDictPane.java create mode 100644 designer-base/src/com/fr/design/data/datapane/RefreshLabel.java create mode 100644 designer-base/src/com/fr/design/data/datapane/ReportTableDataPane.java create mode 100644 designer-base/src/com/fr/design/data/datapane/TableDataComboBox.java rename {designer_base => designer-base}/src/com/fr/design/data/datapane/TableDataCreatorProducer.java (100%) create mode 100644 designer-base/src/com/fr/design/data/datapane/TableDataNameObjectCreator.java rename {designer_base => designer-base}/src/com/fr/design/data/datapane/TableDataPaneController.java (100%) rename {designer_base => designer-base}/src/com/fr/design/data/datapane/TableDataPaneListPane.java (100%) create mode 100644 designer-base/src/com/fr/design/data/datapane/TableDataSourceOP.java create mode 100644 designer-base/src/com/fr/design/data/datapane/TableDataTree.java create mode 100644 designer-base/src/com/fr/design/data/datapane/TableDataTreeDragSource.java rename {designer_base => designer-base}/src/com/fr/design/data/datapane/TableDataTreePane.java (100%) create mode 100644 designer-base/src/com/fr/design/data/datapane/TreeTableDataComboBox.java create mode 100644 designer-base/src/com/fr/design/data/datapane/TreeTableDataDictPane.java create mode 100644 designer-base/src/com/fr/design/data/datapane/VerticalChoosePane.java rename {designer_base => designer-base}/src/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java (100%) rename {designer_base => designer-base}/src/com/fr/design/data/datapane/connect/ConnectionListPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/data/datapane/connect/ConnectionManagerPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/data/datapane/connect/ConnectionShowPane.java (100%) create mode 100644 designer-base/src/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java create mode 100644 designer-base/src/com/fr/design/data/datapane/connect/DataConnectionAction.java create mode 100644 designer-base/src/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java create mode 100644 designer-base/src/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java create mode 100644 designer-base/src/com/fr/design/data/datapane/connect/JDBCDefPane.java create mode 100644 designer-base/src/com/fr/design/data/datapane/connect/JNDIDefPane.java create mode 100644 designer-base/src/com/fr/design/data/datapane/preview/LoadedEventListener.java create mode 100644 designer-base/src/com/fr/design/data/datapane/preview/PreviewLabel.java create mode 100644 designer-base/src/com/fr/design/data/datapane/preview/PreviewTableModel.java create mode 100644 designer-base/src/com/fr/design/data/datapane/preview/PreviewTablePane.java rename {designer_base => designer-base}/src/com/fr/design/data/datapane/sqlpane/SQLEditPane.java (100%) create mode 100644 designer-base/src/com/fr/design/data/tabledata/Prepare4DataSourceChange.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/ResponseDataSourceChange.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/StoreProcedureWorkerListener.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/gui/CONTENT.txt create mode 100644 designer-base/src/com/fr/design/data/tabledata/gui/EXPLAN1.txt create mode 100644 designer-base/src/com/fr/design/data/tabledata/gui/EXPLAN2.txt create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/AbstractTableDataPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/AutoStoreProcedureTableModel.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/ClassNameSelectPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/CustomDictModel.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java rename {designer_base => designer-base}/src/com/fr/design/data/tabledata/tabledatapane/DecoratedTableDataPane.java (100%) create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataDefinedPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableModel.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java rename {designer_base => designer-base}/src/com/fr/design/data/tabledata/tabledatapane/FormatExplanationPane.java (100%) create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/GlobalMultiTDTableDataPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/GlobalTreeTableDataPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/OneListTableModel.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java rename {designer_base => designer-base}/src/com/fr/design/data/tabledata/tabledatapane/ProcedureListPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/data/tabledata/tabledatapane/ProcedureManagerPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureParameterPane.java (100%) create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureTableModel.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/TableDataManagerPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/tabledatapane/TreeTableDataPane.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/wrapper/TableDataFactory.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/wrapper/TableDataWrapper.java create mode 100644 designer-base/src/com/fr/design/data/tabledata/wrapper/TemplateTableDataWrapper.java rename {designer_base => designer-base}/src/com/fr/design/designer/EditingState.java (100%) rename {designer_base => designer-base}/src/com/fr/design/designer/IntervalConstants.java (100%) create mode 100644 designer-base/src/com/fr/design/designer/TargetComponent.java rename {designer_base => designer-base}/src/com/fr/design/designer/creator/CRPropertyDescriptor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/designer/properties/Decoder.java (100%) rename {designer_base => designer-base}/src/com/fr/design/designer/properties/Encoder.java (100%) rename {designer_base => designer-base}/src/com/fr/design/dialog/AttrScrollPane.java (100%) create mode 100644 designer-base/src/com/fr/design/dialog/BasicDialog.java create mode 100644 designer-base/src/com/fr/design/dialog/BasicPane.java create mode 100644 designer-base/src/com/fr/design/dialog/BasicScrollPane.java create mode 100644 designer-base/src/com/fr/design/dialog/DialogActionAdapter.java create mode 100644 designer-base/src/com/fr/design/dialog/DialogActionListener.java create mode 100644 designer-base/src/com/fr/design/dialog/InformationWarnPane.java create mode 100644 designer-base/src/com/fr/design/dialog/JWizardDialog.java create mode 100644 designer-base/src/com/fr/design/dialog/JWizardPanel.java create mode 100644 designer-base/src/com/fr/design/dialog/MultiTabPane.java create mode 100644 designer-base/src/com/fr/design/dialog/UIDialog.java rename {designer_base => designer-base}/src/com/fr/design/dialog/mobile/MobileRadioCheckPane.java (100%) create mode 100644 designer-base/src/com/fr/design/dialog/package.html rename {designer_base => designer-base}/src/com/fr/design/editor/DoubleDeckValueEditorPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/editor/ValueEditorPane.java (100%) create mode 100644 designer-base/src/com/fr/design/editor/ValueEditorPaneFactory.java create mode 100644 designer-base/src/com/fr/design/editor/editor/BooleanEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/ColumnIndexEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/ColumnNameEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/ColumnRowEditor.java rename {designer_base => designer-base}/src/com/fr/design/editor/editor/ColumnRowGroupEditor.java (100%) create mode 100644 designer-base/src/com/fr/design/editor/editor/ColumnSelectedEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/ConstantsEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/CursorEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/DateEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/DoubleEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/Editor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/EditorListener.java create mode 100644 designer-base/src/com/fr/design/editor/editor/FloatEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/FormulaEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/IntegerEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/LongEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/NoneEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/NumberEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/OldColumnIndexEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/ParameterEditor.java rename {designer_base => designer-base}/src/com/fr/design/editor/editor/SpinnerIntegerEditor.java (100%) create mode 100644 designer-base/src/com/fr/design/editor/editor/TextEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/WidgetNameEditor.java create mode 100644 designer-base/src/com/fr/design/editor/editor/XMLANameEditor.java rename {designer_base => designer-base}/src/com/fr/design/event/ChangeEvent.java (100%) rename {designer_base => designer-base}/src/com/fr/design/event/ChangeListener.java (100%) rename {designer_base => designer-base}/src/com/fr/design/event/GlobalNameListener.java (100%) rename {designer_base => designer-base}/src/com/fr/design/event/GlobalNameObserver.java (100%) create mode 100644 designer-base/src/com/fr/design/event/TargetModifiedEvent.java create mode 100644 designer-base/src/com/fr/design/event/TargetModifiedListener.java rename {designer_base => designer-base}/src/com/fr/design/event/UIObserver.java (100%) create mode 100644 designer-base/src/com/fr/design/event/UIObserverListener.java rename {designer_base => designer-base}/src/com/fr/design/extra/After.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/AppStoreBuilder.java (100%) create mode 100644 designer-base/src/com/fr/design/extra/LoginCheckContext.java create mode 100644 designer-base/src/com/fr/design/extra/LoginCheckListener.java rename {designer_base => designer-base}/src/com/fr/design/extra/LoginContextListener.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/LoginDialog.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/LoginWebBridge.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/LoginWebPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginAbstractLoadingViewPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginAbstractViewPane.java (100%) create mode 100644 designer-base/src/com/fr/design/extra/PluginConstants.java rename {designer_base => designer-base}/src/com/fr/design/extra/PluginControlPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginDescriptionLabel.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginDetailPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginFromStorePane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginInstalledPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginListPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginOperateUtils.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginSelectListener.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginStatusCheckCompletePane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginTask.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginUpdatePane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginUtils.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginWebBridge.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginWebPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/PluginsReaderFromStore.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/Process.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/QQLoginDialog.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/QQLoginWebPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/ShopDialog.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/ShopManagerPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/ShopPaneConfig.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/UserLoginContext.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/WebViewDlgHelper.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/Command.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/Executor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/GetPluginPrefixExecutor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/PluginLoginExecutor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/SearchOnlineExecutor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/callback/JSCallback.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/callback/JSExecutor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/exe/extratask/ExtraPluginTask.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/modal-dialog.css (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/plugin.properties (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/ucenter/AbstractClient.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/ucenter/Client.java (100%) rename {designer_base => designer-base}/src/com/fr/design/extra/ucenter/XMLHelper.java (100%) create mode 100644 designer-base/src/com/fr/design/file/FileOperations.java create mode 100644 designer-base/src/com/fr/design/file/FileToolbarStateChangeListener.java create mode 100644 designer-base/src/com/fr/design/file/HistoryTemplateListPane.java create mode 100644 designer-base/src/com/fr/design/file/MutilTempalteTabPane.java create mode 100644 designer-base/src/com/fr/design/file/NewTemplatePane.java rename {designer_base => designer-base}/src/com/fr/design/file/SaveSomeTemplatePane.java (100%) create mode 100644 designer-base/src/com/fr/design/file/TemplateTreePane.java rename {designer_base => designer-base}/src/com/fr/design/foldablepane/HeaderPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/foldablepane/UIExpandablePane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/formula/AbstractNameAndDescription.java (100%) create mode 100644 designer-base/src/com/fr/design/formula/CustomVariableResolver.java rename {designer_base => designer-base}/src/com/fr/design/formula/DefaultUIFormulaProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/formula/FormulaFactory.java (100%) create mode 100644 designer-base/src/com/fr/design/formula/FormulaPane.java rename {designer_base => designer-base}/src/com/fr/design/formula/FormulaPaneWhenReserveFormula.java (100%) create mode 100644 designer-base/src/com/fr/design/formula/FunctionConstants.java create mode 100644 designer-base/src/com/fr/design/formula/FunctionDefNAD.java create mode 100644 designer-base/src/com/fr/design/formula/FunctionGroup.java create mode 100644 designer-base/src/com/fr/design/formula/FunctionManagerPane.java create mode 100644 designer-base/src/com/fr/design/formula/FunctionNAD.java rename {designer_base => designer-base}/src/com/fr/design/formula/JavaEditorPane.java (100%) create mode 100644 designer-base/src/com/fr/design/formula/NameAndDescription.java create mode 100644 designer-base/src/com/fr/design/formula/NameAndFunctionList.java create mode 100644 designer-base/src/com/fr/design/formula/NameAndTypeAndFunctionList.java create mode 100644 designer-base/src/com/fr/design/formula/SortFormulaPane.java rename {designer_base => designer-base}/src/com/fr/design/formula/TinyFormulaPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/formula/UIFormula.java (100%) create mode 100644 designer-base/src/com/fr/design/formula/VariableResolver.java create mode 100644 designer-base/src/com/fr/design/formula/VariableResolverAdapter.java rename {designer_base => designer-base}/src/com/fr/design/fun/BackgroundQuickUIProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/BackgroundUIProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/fun/CellAttributeProvider.java rename {designer_base => designer-base}/src/com/fr/design/fun/CellWidgetOptionProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/ConnectionProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/DBTableDataMenuHandler.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/DesignerEnvProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/DesignerFrameUpButtonProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/DesignerStartOpenFileProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/ElementUIProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/ExportAttrTabProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/fun/ExportToolBarProvider.java rename {designer_base => designer-base}/src/com/fr/design/fun/ExtraButtonToolBarProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/Feedback.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/FormElementCaseEditorProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/FormElementCaseEditorProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/FormWidgetOptionProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/fun/GlobalListenerProvider.java rename {designer_base => designer-base}/src/com/fr/design/fun/GridUIProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/HighlightProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/fun/HyperlinkProvider.java create mode 100644 designer-base/src/com/fr/design/fun/IndentationUnitProcessor.java create mode 100644 designer-base/src/com/fr/design/fun/JavaScriptActionProvider.java rename {designer_base => designer-base}/src/com/fr/design/fun/MenuHandler.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/ParameterWidgetOptionProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/ParameterWindowEditorProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/PresentKindProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/PreviewProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/ServerTableDataDefineProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/SubmitProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/TableDataCreatorProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/TableDataDefineProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/TableDataPaneProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/TitlePlaceProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/ToolbarItemProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/UIFormulaProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/VerifyDefineProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/WidgetDesignHandler.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/WidgetPropertyUIProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractBackgroundQuickUIProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractBackgroundUIProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/fun/impl/AbstractCellAttributeProvider.java rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractCellWidgetOptionProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractConnectionProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractDBTableDataMenuHandler.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractDesignerEnvProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractDesignerStartOpenFileProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractDsinFrameUpButtonProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractElementUIProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractExportAttrTabProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractExtraButtonToolBarProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/fun/impl/AbstractGlobalListenerProvider.java rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractGridUIProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractHighlightProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/fun/impl/AbstractHyperlinkProvider.java create mode 100644 designer-base/src/com/fr/design/fun/impl/AbstractIndentationUnitProcessor.java create mode 100644 designer-base/src/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractMenuHandler.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractParameterWidgetOptionProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractParameterWindowEditorProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractPresentKindProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractPreviewProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractServerTableDataDefineProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractSubmitProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractTDPaneProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractTableDataDefineProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractTitleProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractToolbarItem.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractUIFormulaProcessor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractVerifyDefineProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractWidgetDesignHandler.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/AbstractWidgetPropertyUIProvider.java (100%) rename {designer_base => designer-base}/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/HyperlinkFilterHelper.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/UIDefaultTheme.java create mode 100644 designer-base/src/com/fr/design/gui/UILookAndFeel.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/AbstractCompletion.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/AbstractCompletionProvider.java rename {designer_base => designer-base}/src/com/fr/design/gui/autocomplete/AutoCompleteDemo.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/AutoCompleteDescWindow.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/AutoCompletePopupWindow.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/AutoCompletion.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/AutoCompletionStyleContext.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/BasicCompletion.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/Completion.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/CompletionCellRenderer.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/CompletionListModel.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/CompletionProvider.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/CompletionProviderBase.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/CompletionXMLParser.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/CompletionXml.dtd create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/DefaultCompletionProvider.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/DelegatingCellRenderer.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/DescWindowCallback.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/EmptyIcon.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/ExternalURLHandler.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/FastListUI.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/FunctionCompletion.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/LinkRedirector.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/MarkupTagCompletion.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/OutlineHighlightPainter.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/ParameterChoicesProvider.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletion.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionChoicesWindow.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionDescriptionToolTip.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionInsertionInfo.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/ShorthandCompletion.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/SizeGrip.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/SortByRelevanceComparator.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/TemplateCompletion.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/TemplatePiece.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/TipUtil.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/Util.java create mode 100644 designer-base/src/com/fr/design/gui/autocomplete/VariableCompletion.java rename {designer_base => designer-base}/src/com/fr/design/gui/autocomplete/arrow_left.png (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/autocomplete/arrow_right.png (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/autocomplete/bullet_black.png (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/autocomplete/osx_sizegrip.png (100%) create mode 100644 designer-base/src/com/fr/design/gui/borders/UIFrameBorder.java create mode 100644 designer-base/src/com/fr/design/gui/borders/UIInternalFrameBorder.java create mode 100644 designer-base/src/com/fr/design/gui/borders/UITableHeaderBorder.java create mode 100644 designer-base/src/com/fr/design/gui/borders/UITableHeaderRolloverBorder.java create mode 100644 designer-base/src/com/fr/design/gui/borders/UITableScrollPaneBorder.java create mode 100644 designer-base/src/com/fr/design/gui/borders/UITextFieldBorder.java create mode 100644 designer-base/src/com/fr/design/gui/chart/BaseChartPropertyPane.java rename {designer_base => designer-base}/src/com/fr/design/gui/chart/ChartEditPaneProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/chart/MiddleChartComponent.java create mode 100644 designer-base/src/com/fr/design/gui/chart/MiddleChartDialog.java create mode 100644 designer-base/src/com/fr/design/gui/columnrow/ColumnRowPane.java create mode 100644 designer-base/src/com/fr/design/gui/columnrow/ColumnRowVerticalPane.java create mode 100644 designer-base/src/com/fr/design/gui/controlpane/AbstractNameableCreator.java create mode 100644 designer-base/src/com/fr/design/gui/controlpane/ControlPane.java create mode 100644 designer-base/src/com/fr/design/gui/controlpane/JControlPane.java rename {designer_base => designer-base}/src/com/fr/design/gui/controlpane/JListControlPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/controlpane/NameObjectCreator.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/controlpane/NameableCreator.java rename {designer_base => designer-base}/src/com/fr/design/gui/controlpane/NameableSelfCreator.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/controlpane/ObjectJControlPane.java rename {designer_base => designer-base}/src/com/fr/design/gui/controlpane/ObjectUIControlPane.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/controlpane/ShortCut4JControlPane.java rename {designer_base => designer-base}/src/com/fr/design/gui/controlpane/UIControlPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/controlpane/UIListControlPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/controlpane/UINameableListCellRenderer.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/controlpane/UnrepeatedNameHelper.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/core/CustomWidgetOption.java create mode 100644 designer-base/src/com/fr/design/gui/core/UIFurtherTabComponent.java create mode 100644 designer-base/src/com/fr/design/gui/core/UISelectedComponent.java create mode 100644 designer-base/src/com/fr/design/gui/core/UITabComponent.java create mode 100644 designer-base/src/com/fr/design/gui/core/UserDefinedWidgetOption.java create mode 100644 designer-base/src/com/fr/design/gui/core/WidgetConstants.java create mode 100644 designer-base/src/com/fr/design/gui/core/WidgetOption.java create mode 100644 designer-base/src/com/fr/design/gui/core/WidgetOptionFactory.java create mode 100644 designer-base/src/com/fr/design/gui/date/CalendarNumberField.java create mode 100644 designer-base/src/com/fr/design/gui/date/JDateDocument.java create mode 100644 designer-base/src/com/fr/design/gui/date/SingleObjectComboBoxModel.java create mode 100644 designer-base/src/com/fr/design/gui/date/UICalendarPanel.java create mode 100644 designer-base/src/com/fr/design/gui/date/UIDatePicker.java create mode 100644 designer-base/src/com/fr/design/gui/date/UIDayLabel.java create mode 100644 designer-base/src/com/fr/design/gui/demo/ComboBoxDemo.java create mode 100644 designer-base/src/com/fr/design/gui/demo/LabelDemo.java create mode 100644 designer-base/src/com/fr/design/gui/demo/ListDemo.java create mode 100644 designer-base/src/com/fr/design/gui/demo/LoadingPaneDemo.java create mode 100644 designer-base/src/com/fr/design/gui/demo/MultiLineTooltipDemo.java create mode 100644 designer-base/src/com/fr/design/gui/demo/SwingComponentsDemo.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/AttributeChangeListener.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/BaseHyperlinkGroup.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/CommitTabbedPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/EditingStringListPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/HyperlinkGroupPane.java rename {designer_base => designer-base}/src/com/fr/design/gui/frpane/HyperlinkGroupPaneActionProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/frpane/HyperlinkGroupType.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/ImgChoosePane.java rename {designer_base => designer-base}/src/com/fr/design/gui/frpane/JTreeAutoBuildPane.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/frpane/JTreeControlPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/LimitedDocument.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/ListenerUpdatePane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/LoadingBasicPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/LoadingBasicPaneTest.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/ObjectProperiesPane.java rename {designer_base => designer-base}/src/com/fr/design/gui/frpane/RegFieldPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/frpane/RegPane.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/frpane/ReportletParameterViewPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/TemplateParameterPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/TreeSettingPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/UIAdvancedTextPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/UIBasicOptionPaneUI.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/UIBubbleFloatPane.java rename {designer_base => designer-base}/src/com/fr/design/gui/frpane/UIComboBoxPane.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/frpane/UICorrelationComboBoxPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/UICorrelationPane.java rename {designer_base => designer-base}/src/com/fr/design/gui/frpane/UIExtensionPane.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/frpane/UINumberDragPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/UINumberSlidePane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/UIRadioPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/UITabbedPane.java rename {designer_base => designer-base}/src/com/fr/design/gui/frpane/UITabbedPaneUI.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/frpane/UITextPane.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/UITitlePanel.java create mode 100644 designer-base/src/com/fr/design/gui/frpane/UnitInputPane.java rename {designer_base => designer-base}/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/frpane/tree/layer/config/LayerDependenceSettingPane.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/ibutton/FiveButtonLayout.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/SpecialUIButton.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIBasicButtonUI.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIButton.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIButtonBorder.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIButtonGroup.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIButtonUI.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIColorButton.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UICombinationButton.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIHeadGroup.java rename {designer_base => designer-base}/src/com/fr/design/gui/ibutton/UIPasswordField.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/ibutton/UIPreviewButton.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIRadioButton.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonIcon.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonMenuItemUI.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonUI.java rename {designer_base => designer-base}/src/com/fr/design/gui/ibutton/UISliderButton.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/ibutton/UISliderButtonUI.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UITabButton.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UITabGroup.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIToggleButton.java create mode 100644 designer-base/src/com/fr/design/gui/ibutton/UIToolButtonBorder.java create mode 100644 designer-base/src/com/fr/design/gui/icheckbox/UICheckBox.java create mode 100644 designer-base/src/com/fr/design/gui/icheckbox/UICheckBoxIcon.java create mode 100644 designer-base/src/com/fr/design/gui/icheckbox/UICheckBoxUI.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/AlignmentComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/ComboCheckBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/DictionaryComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/DictionaryConstants.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/ExtendedComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/ExtendedComboBoxTest.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/FRTreeComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/FilterComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/FilterableComboBoxModel.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/FixedHeightComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/FunctionComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/IntComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/LazyComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/LazyComboBoxTest.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/LineComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/ParameterComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/SortOrderComboBox.java rename {designer_base => designer-base}/src/com/fr/design/gui/icombobox/TextFontComboBox.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/icombobox/TreeComboBoxUI.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/UIBasicComboBoxEditor.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/UIBasicComboBoxUI.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/UIComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/UIComboBoxButton.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/UIComboBoxEditor.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/UIComboBoxRenderer.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/UIComboBoxUI.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/UIDictionaryComboBox.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/filter/Filter.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/filter/LastStartWithFilter.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/filter/StartsWithFilter.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeCellRenderer.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeLabel.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNode.java create mode 100644 designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNodeSelectionListener.java rename {designer_base => designer-base}/src/com/fr/design/gui/icontainer/UIEastResizableContainer.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/icontainer/UIModeControlContainer.java create mode 100644 designer-base/src/com/fr/design/gui/icontainer/UIResizableContainer.java create mode 100644 designer-base/src/com/fr/design/gui/icontainer/UIScrollPane.java create mode 100644 designer-base/src/com/fr/design/gui/icontainer/UIScrollPaneBorder.java create mode 100644 designer-base/src/com/fr/design/gui/icontainer/UIScrollPaneUI.java create mode 100644 designer-base/src/com/fr/design/gui/icontainer/UITableScrollPaneBorder.java rename {designer_base => designer-base}/src/com/fr/design/gui/icontainer/UIVerticalScrollPane.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/ilable/ActionLabel.java create mode 100644 designer-base/src/com/fr/design/gui/ilable/BoldFontTextLabel.java create mode 100644 designer-base/src/com/fr/design/gui/ilable/FRExplainLabel.java create mode 100644 designer-base/src/com/fr/design/gui/ilable/MultilineLabel.java create mode 100644 designer-base/src/com/fr/design/gui/ilable/UILabel.java create mode 100644 designer-base/src/com/fr/design/gui/ilist/ArrayListModel.java create mode 100644 designer-base/src/com/fr/design/gui/ilist/CheckBoxList.java create mode 100644 designer-base/src/com/fr/design/gui/ilist/DefaultListCellEditor.java create mode 100644 designer-base/src/com/fr/design/gui/ilist/JNameEdList.java create mode 100644 designer-base/src/com/fr/design/gui/ilist/ListCellEditor.java rename {designer_base => designer-base}/src/com/fr/design/gui/ilist/ListModelElement.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/ilist/ModNameActionListener.java create mode 100644 designer-base/src/com/fr/design/gui/ilist/QuickList.java create mode 100644 designer-base/src/com/fr/design/gui/ilist/TableViewList.java create mode 100644 designer-base/src/com/fr/design/gui/ilist/UIList.java rename {designer_base => designer-base}/src/com/fr/design/gui/ilist/UINameEdList.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/imenu/UIBasicMenuItemUI.java create mode 100644 designer-base/src/com/fr/design/gui/imenu/UIBasicMenuUI.java create mode 100644 designer-base/src/com/fr/design/gui/imenu/UICheckBoxMenuItem.java rename {designer_base => designer-base}/src/com/fr/design/gui/imenu/UIHeadMenu.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/imenu/UIListPopup.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/imenu/UIMenu.java create mode 100644 designer-base/src/com/fr/design/gui/imenu/UIMenuBar.java create mode 100644 designer-base/src/com/fr/design/gui/imenu/UIMenuBarUI.java rename {designer_base => designer-base}/src/com/fr/design/gui/imenu/UIMenuEastAttrItem.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/imenu/UIMenuHighLight.java create mode 100644 designer-base/src/com/fr/design/gui/imenu/UIMenuItem.java create mode 100644 designer-base/src/com/fr/design/gui/imenu/UIMenuUI.java rename {designer_base => designer-base}/src/com/fr/design/gui/imenu/UIPopupEastAttrMenu.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/imenu/UIPopupMenu.java create mode 100644 designer-base/src/com/fr/design/gui/imenu/UIPopupMenuBorder.java create mode 100644 designer-base/src/com/fr/design/gui/imenu/UIPopupMenuSeparatorUI.java rename {designer_base => designer-base}/src/com/fr/design/gui/imenu/UIScrollMenu.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/imenu/UIScrollMenuDemo.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/imenu/UIScrollPopUpMenu.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/imenutable/UIMenuNameableCreator.java create mode 100644 designer-base/src/com/fr/design/gui/imenutable/UIMenuTable.java create mode 100644 designer-base/src/com/fr/design/gui/imenutable/UIMenuTableDataModel.java create mode 100644 designer-base/src/com/fr/design/gui/imenutable/UIMenuTableUI.java create mode 100644 designer-base/src/com/fr/design/gui/ipasswordfield/UIPassWordField.java create mode 100644 designer-base/src/com/fr/design/gui/ipoppane/PopupHider.java create mode 100644 designer-base/src/com/fr/design/gui/iprogressbar/AutoProgressBar.java create mode 100644 designer-base/src/com/fr/design/gui/iprogressbar/FRProgressBar.java create mode 100644 designer-base/src/com/fr/design/gui/iprogressbar/MonitorCancelWork.java create mode 100644 designer-base/src/com/fr/design/gui/iprogressbar/UIProgressBarBorder.java create mode 100644 designer-base/src/com/fr/design/gui/iprogressbar/UIProgressBarUI.java create mode 100644 designer-base/src/com/fr/design/gui/iscrollbar/UIBasicScrollBarUI.java create mode 100644 designer-base/src/com/fr/design/gui/iscrollbar/UISBChooser.java create mode 100644 designer-base/src/com/fr/design/gui/iscrollbar/UIScrollBar.java create mode 100644 designer-base/src/com/fr/design/gui/iscrollbar/UIScrollBarUI.java create mode 100644 designer-base/src/com/fr/design/gui/iscrollbar/UIScrollButton.java create mode 100644 designer-base/src/com/fr/design/gui/islider/UISlider.java rename {designer_base => designer-base}/src/com/fr/design/gui/ispinner/ColumnRowSpinner.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/ispinner/UIBasicSpinner.java create mode 100644 designer-base/src/com/fr/design/gui/ispinner/UISpinner.java create mode 100644 designer-base/src/com/fr/design/gui/ispinner/UISpinnerButtonUI.java create mode 100644 designer-base/src/com/fr/design/gui/ispinner/UISpinnerUI.java create mode 100644 designer-base/src/com/fr/design/gui/ispinner/UpperCaseSpinner.java create mode 100644 designer-base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneDivider.java create mode 100644 designer-base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneUI.java rename {designer_base => designer-base}/src/com/fr/design/gui/itable/AbstractPropertyTable.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/itable/GroupRenderer.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/itable/HeaderRenderer.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/itable/PropertyGroup.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/itable/SortableJTable.java create mode 100644 designer-base/src/com/fr/design/gui/itable/TableSorter.java create mode 100644 designer-base/src/com/fr/design/gui/itable/UIBasicTableUI.java create mode 100644 designer-base/src/com/fr/design/gui/itable/UIComponentTable.java rename {designer_base => designer-base}/src/com/fr/design/gui/itable/UIDefaultTableCellEditor.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/itable/UISelectTable.java create mode 100644 designer-base/src/com/fr/design/gui/itable/UITable.java create mode 100644 designer-base/src/com/fr/design/gui/itable/UITableComponentModel.java create mode 100644 designer-base/src/com/fr/design/gui/itable/UITableDataModel.java rename {designer_base => designer-base}/src/com/fr/design/gui/itable/UITableEditor.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/itable/UITableNoOptionUI.java create mode 100644 designer-base/src/com/fr/design/gui/itable/UITableUI.java create mode 100644 designer-base/src/com/fr/design/gui/itableeditorpane/ActionStyle.java create mode 100644 designer-base/src/com/fr/design/gui/itableeditorpane/ParameterTableModel.java rename {designer_base => designer-base}/src/com/fr/design/gui/itableeditorpane/UIArrayFormulaTableModel.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/itableeditorpane/UIArrayTableModel.java create mode 100644 designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditAction.java create mode 100644 designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditorLoader.java create mode 100644 designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditorPane.java create mode 100644 designer-base/src/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java create mode 100644 designer-base/src/com/fr/design/gui/itabpane/TitleChangeListener.java create mode 100644 designer-base/src/com/fr/design/gui/itabpane/UITabPaneCreator.java create mode 100644 designer-base/src/com/fr/design/gui/itabpane/UITabsHeaderIconPane.java create mode 100644 designer-base/src/com/fr/design/gui/itextarea/DescriptionTextArea.java create mode 100644 designer-base/src/com/fr/design/gui/itextarea/FRExplainTextArea.java create mode 100644 designer-base/src/com/fr/design/gui/itextarea/UITextArea.java create mode 100644 designer-base/src/com/fr/design/gui/itextarea/UITextAreaUI.java rename {designer_base => designer-base}/src/com/fr/design/gui/itextfield/AutoCompletionDemo.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/itextfield/CompletionFilter.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/itextfield/DefaultCompletionFilter.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/itextfield/EditTextField.java create mode 100644 designer-base/src/com/fr/design/gui/itextfield/FRGraphics2D.java rename {designer_base => designer-base}/src/com/fr/design/gui/itextfield/PlaceholderTextField.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/itextfield/TextFieldUI.java rename {designer_base => designer-base}/src/com/fr/design/gui/itextfield/UIAutoCompletionField.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/itextfield/UIGridTextField.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/itextfield/UINumberField.java create mode 100644 designer-base/src/com/fr/design/gui/itextfield/UISearchTextField.java create mode 100644 designer-base/src/com/fr/design/gui/itextfield/UITextField.java create mode 100644 designer-base/src/com/fr/design/gui/itextfield/UITextFieldUI.java create mode 100644 designer-base/src/com/fr/design/gui/itoolbar/UILargeToolbar.java create mode 100644 designer-base/src/com/fr/design/gui/itoolbar/UIToolBarBorder.java create mode 100644 designer-base/src/com/fr/design/gui/itoolbar/UIToolBarSeparatorUI.java create mode 100644 designer-base/src/com/fr/design/gui/itoolbar/UIToolBarUI.java create mode 100644 designer-base/src/com/fr/design/gui/itoolbar/UIToolbar.java rename {designer_base => designer-base}/src/com/fr/design/gui/itooltip/MultiLineToolTip.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/itooltip/MultiLineToolTipUI.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/itooltip/UIToolTip.java create mode 100644 designer-base/src/com/fr/design/gui/itooltip/UIToolTipBorder.java create mode 100644 designer-base/src/com/fr/design/gui/itooltip/UIToolTipUI.java create mode 100644 designer-base/src/com/fr/design/gui/itree/UITreeUI.java create mode 100644 designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java create mode 100644 designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeCellRenderer.java create mode 100644 designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeSelectionModel.java create mode 100644 designer-base/src/com/fr/design/gui/itree/checkboxtree/NullLabel.java create mode 100644 designer-base/src/com/fr/design/gui/itree/checkboxtree/NullPanel.java create mode 100644 designer-base/src/com/fr/design/gui/itree/checkboxtree/NullTristateCheckBox.java create mode 100644 designer-base/src/com/fr/design/gui/itree/checkboxtree/TristateCheckBox.java create mode 100644 designer-base/src/com/fr/design/gui/itree/filetree/AbstractFileTree.java create mode 100644 designer-base/src/com/fr/design/gui/itree/filetree/ClassFileTree.java create mode 100644 designer-base/src/com/fr/design/gui/itree/filetree/EnvFileTree.java create mode 100644 designer-base/src/com/fr/design/gui/itree/filetree/FileComparator.java create mode 100644 designer-base/src/com/fr/design/gui/itree/filetree/FileDirectoryNode.java create mode 100644 designer-base/src/com/fr/design/gui/itree/filetree/FileNodeComparator.java create mode 100644 designer-base/src/com/fr/design/gui/itree/filetree/FileTreeIcon.java create mode 100644 designer-base/src/com/fr/design/gui/itree/filetree/JFileTree.java create mode 100644 designer-base/src/com/fr/design/gui/itree/filetree/ReportletPane.java create mode 100644 designer-base/src/com/fr/design/gui/itree/filetree/RootFile.java create mode 100644 designer-base/src/com/fr/design/gui/itree/filetree/TemplateFileTree.java create mode 100644 designer-base/src/com/fr/design/gui/itree/refreshabletree/ExpandMutableTreeNode.java create mode 100644 designer-base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java create mode 100644 designer-base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTreeTest.java create mode 100644 designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeDataCardPane.java create mode 100644 designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeNodePane.java create mode 100644 designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeRootPane.java create mode 100644 designer-base/src/com/fr/design/gui/itree/refreshabletree/UserObjectOP.java create mode 100644 designer-base/src/com/fr/design/gui/itree/refreshabletree/UserObjectRefreshJTree.java create mode 100644 designer-base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenLoaderFactory.java create mode 100644 designer-base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenNodesLoader.java create mode 100644 designer-base/src/com/fr/design/gui/style/AbstractBasicStylePane.java create mode 100644 designer-base/src/com/fr/design/gui/style/AlignmentPane.java create mode 100644 designer-base/src/com/fr/design/gui/style/BackgroundNoImagePane.java rename {designer_base => designer-base}/src/com/fr/design/gui/style/BackgroundPane.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/style/BackgroundSpecialPane.java create mode 100644 designer-base/src/com/fr/design/gui/style/BorderPane.java create mode 100644 designer-base/src/com/fr/design/gui/style/DefaultIndentationUnitProcessor.java create mode 100644 designer-base/src/com/fr/design/gui/style/FRFontPane.java rename {designer_base => designer-base}/src/com/fr/design/gui/style/FormatPane.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/style/FormatePaneNumField.java create mode 100644 designer-base/src/com/fr/design/gui/style/NumberDragBar.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/io/DocumentReader.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/io/UnicodeReader.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/io/UnicodeWriter.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/io/package.html create mode 100644 designer-base/src/com/fr/design/gui/syntax/print/RPrintUtilities.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/print/package.html create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java rename {designer_base => designer-base}/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ActiveLineRangeEvent.java (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ActiveLineRangeListener.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultOccurrenceMarker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultTokenFactory.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultTokenPainter.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DocumentRange.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ar.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_de.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_es.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_fr.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_hu.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_in.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_it.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ja.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ko.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_nl.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_pl.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_pt_BR.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ru.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_tr.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_zh_CN.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_zh_TW.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/FileFileLocation.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/FileLocation.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/LinkGenerator.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/LinkGeneratorResult.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/MarkOccurrencesSupport.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/OccurrenceMarker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ParserManager.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/PopupWindowDecorator.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSTAView.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxDocument.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ar.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_de.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_es.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_fr.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_hu.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_in.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_it.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ja.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ko.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_nl.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_pl.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_pt_BR.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ru.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_tr.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_zh_CN.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_zh_TW.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxUtilities.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RTfToText.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RtfGenerator.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RtfTransferable.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SelectRegionLinkGeneratorResult.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Style.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxConstants.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxScheme.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxView.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TextEditorPane.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Theme.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Token.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenFactory.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenImpl.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenIterator.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMakerBase.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMakerFactory.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMap.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenOrientedView.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenPainter.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenTypes.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenUtils.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/URLFileLocation.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/VisibleWhitespaceTokenPainter.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/WrappedSyntaxView.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/WrappedSyntaxView2.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/XmlOccurrenceMarker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ar.properties rename {designer_base => designer-base}/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_de.properties (100%) create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_es.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_fr.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_hu.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_in.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_it.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ja.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ko.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_nl.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_pl.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_pt_BR.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ru.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_tr.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_CN.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_TW.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/SizeGrip.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/TipUtil.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/TipWindow.java rename {designer_base => designer-base}/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png (100%) create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/package.html create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/CurlyFoldParser.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/Fold.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldCollapser.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldManager.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldParser.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldParserManager.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldType.java rename {designer_base => designer-base}/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/HtmlFoldParser.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/JsonFoldParser.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/LatexFoldParser.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/LispFoldParser.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/NsisFoldParser.java rename {designer_base => designer-base}/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/XmlFoldParser.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/package.html create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSSTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DtdTokenMaker.java rename {designer_base => designer-base}/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex (100%) rename {designer_base => designer-base}/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FortranTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HtaccessTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HtaccessTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JSPTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JsonTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JsonTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LatexTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LispTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LispTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LuaTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/NSISTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/NSISTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PHPTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PerlTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PythonTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/RubyTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SASTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SASTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SQLTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/TclTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/TclTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/XMLTokenMaker.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/package.html create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/package.html create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/AbstractParser.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/DefaultParseResult.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/DefaultParserNotice.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ParseResult.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/Parser.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ParserNotice.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/TaskTagParser.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ToolTipInfo.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/XmlParser.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/package.html create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/CodeTemplate.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/package.html create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/AbstractGutterComponent.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/BackgroundPainterStrategy.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/ChangeableHighlightPainter.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/ColorBackgroundPainterStrategy.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/ConfigurableCaret.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/FoldIndicator.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/Gutter.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/GutterIconInfo.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/IconGroup.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/IconRowHeader.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/ImageBackgroundPainterStrategy.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/LineHighlightManager.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/LineNumberList.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/Macro.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RDocument.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RDocumentCharSequence.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTADefaultInputMap.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTATextTransferHandler.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaBase.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaEditorKit.java rename {designer_base => designer-base}/src/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaHighlighter.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaUI.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ar.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_de.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_es.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_fr.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_hu.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_in.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_it.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ja.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ko.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_nl.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_pl.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_pt_BR.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ru.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_tr.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_zh_CN.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_zh_TW.properties create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextScrollPane.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RUndoManager.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RecordableTextAction.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/RegExReplaceInfo.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/SearchContext.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/SearchEngine.java rename {designer_base => designer-base}/src/com/fr/design/gui/syntax/ui/rtextarea/SearchResult.java (100%) create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/SmartHighlightPainter.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/ToolTipSupplier.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/ui/rtextarea/package.html create mode 100644 designer-base/src/com/fr/design/gui/syntax/util/DynamicIntArray.java create mode 100644 designer-base/src/com/fr/design/gui/syntax/util/package.html rename {designer_base => designer-base}/src/com/fr/design/gui/toast/Toast.java (100%) rename {designer_base => designer-base}/src/com/fr/design/hyperlink/AbstractHyperLinkPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/hyperlink/AbstractHyperNorthPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/hyperlink/HyperlinkTargetFrame.java (100%) create mode 100644 designer-base/src/com/fr/design/hyperlink/ReporletHyperNorthPane.java create mode 100644 designer-base/src/com/fr/design/hyperlink/ReportletHyperlinkPane.java create mode 100644 designer-base/src/com/fr/design/hyperlink/WebHyperNorthPane.java create mode 100644 designer-base/src/com/fr/design/hyperlink/WebHyperlinkPane.java create mode 100644 designer-base/src/com/fr/design/icon/BorderIcon.java rename {designer_base => designer-base}/src/com/fr/design/icon/IconPathConstants.java (100%) create mode 100644 designer-base/src/com/fr/design/icon/LockIcon.java create mode 100644 designer-base/src/com/fr/design/icon/WarningIcon.java rename {designer_base => designer-base}/src/com/fr/design/images/arrow/arrow_down.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/arrow/arrow_up.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/bbs.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/browser/360.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/browser/back.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/browser/chrome.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/browser/firefox.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/browser/forward.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/browser/go.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/browser/home.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/browser/ie.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/browser/reload.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/browser/stop.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/bug.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/add.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/add_over.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/add_press.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/addicon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/additicon_grey.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/anab24.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/anas.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/arrow.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/arrowdown.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/arrowup.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/bind_ds_column.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/button_0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/card_layout_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/cell.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/cell_group.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/close_icon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/column.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/config.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/cube.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/delete.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/downSelected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/ds_column.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/ds_column_index.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/ds_column_name.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/dscolumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/editn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/editp.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/hiden.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/hidep.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/history.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/layout_absolute_new.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/leftNormal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/list_cover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/list_covered.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/list_icon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/list_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/list_press.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/list_pressed.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/minus.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/more.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/more2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/more3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/more4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/mouseoverclose icon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/new_form3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/newcpts.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/open.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/pageb24.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/pages.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/parameter.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/plus.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/popdownarrow.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/popuparrow.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/pressclose icon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/prevew_down_icon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/prewidget.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/authorityedit_disabled.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/authorityedit_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/authorityedit_selected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/cellattr_disabled.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/cellattr_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/cellattr_selected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/cellelement_disabled.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/cellelement_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/cellelement_selected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/conditionattr_disabled.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/conditionattr_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/conditionattr_selected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/configuredroles_disabled.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/configuredroles_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/configuredroles_selected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/floatelement_disabled.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/floatelement_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/floatelement_selected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/hyperlink_disabled.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/hyperlink_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/hyperlink_selected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/widgetlib_disabled.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/widgetlib_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/widgetlib_selected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/widgetsettings_diabled.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/widgetsettings_disabled.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/widgetsettings_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/propertiestab/widgetsettings_selected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/redo.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/refresh.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/report_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/run24.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/runs.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/save.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/select.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/select_item.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/setting.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/switchShortCuts.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/type_bool.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/type_cursor.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/type_date.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/type_double.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/type_formula.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/type_int.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/type_none.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/type_string.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/undo.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/viewn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/viewp.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/warn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/button_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/button_group_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/check_box_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/checkbox_group_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/combo_box_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/combo_check_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/comboboxtree.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/date_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/files_up.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/label_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/number_field_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/password_field_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/text_area_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/text_field_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widget/tree_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/widgets.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/writeb24.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/writes.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/buttonicon/yes.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calculate/average.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calculate/count.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calculate/max.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calculate/min.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calculate/none.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calculate/sum.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/month_add.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/month_add_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/month_add_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/month_reduce.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/month_reduce_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/month_reduce_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/year_add.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/year_add_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/year_add_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/year_reduce.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/year_reduce_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/calender/year_reduce_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/AreaPlot/layout/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/AreaPlot/layout/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/AreaPlot/layout/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/AreaPlot/layout/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/AreaPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/AreaPlot/type/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/AreaPlot/type/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/AreaPlot/type/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/AreaPlot/type/4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/AreaPlot/type/5.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BarPlot/layout/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BarPlot/layout/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BarPlot/layout/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BarPlot/layout/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BarPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BarPlot/type/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BarPlot/type/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BarPlot/type/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BarPlot/type/4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BarPlot/type/5.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BarPlot/type/6.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BubblePlot/layout/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BubblePlot/layout/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BubblePlot/layout/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BubblePlot/layout/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/BubblePlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChangeChart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChartAxisLineStyle/cross.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChartAxisLineStyle/external.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChartAxisLineStyle/inside.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChartData.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChartLegend/layout_bottom.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChartLegend/layout_left.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChartLegend/layout_right.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChartLegend/layout_top.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChartLegend/layout_top_right.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChartStyle.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ChartType.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ColumnPlot/layout/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ColumnPlot/layout/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ColumnPlot/layout/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ColumnPlot/layout/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ColumnPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ColumnPlot/type/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ColumnPlot/type/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ColumnPlot/type/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ColumnPlot/type/4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ColumnPlot/type/5.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ColumnPlot/type/6.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/ConditionAttr.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/CustomPlot/layout/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/CustomPlot/layout/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/CustomPlot/layout/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/CustomPlot/layout/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/CustomPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/DonutPlot/layout/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/DonutPlot/layout/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/DonutPlot/layout/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/DonutPlot/layout/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/DonutPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/DonutPlot/type/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/FunnelPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/GanttPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/GisMapPlot/layout/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/GisMapPlot/layout/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/GisMapPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/InterAttr.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/LinePlot/layout/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/LinePlot/layout/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/LinePlot/layout/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/LinePlot/layout/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/LinePlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/LinePlot/type/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/LinePlot/type/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/MapPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/MapPlot/type/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/MapPlot/type/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/MapPlot/type/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/MeterPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/MeterPlot/type/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/MeterPlot/type/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/PiePlot/layout/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/PiePlot/layout/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/PiePlot/layout/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/PiePlot/layout/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/PiePlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/PiePlot/type/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/RadarPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/RangePlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/StockPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/XYScatterPlot/layout/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/XYScatterPlot/layout/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/XYScatterPlot/layout/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/XYScatterPlot/layout/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/XYScatterPlot/type/0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/default.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/link.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/moved.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/chart/pressed.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/condition/bracket.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/condition/unBracket.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/addPopup.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/arrow_down.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/bar-light.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/bar.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/barl.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/barm.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/clear.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/close.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/close_rollover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/closet.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/combobox.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/control-center2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/copy.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/dot-line.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/dot.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/dotv.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/down.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/down_arrow.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/downdis.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/downnor.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/downpre.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/east_arrow.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/edit.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/edit_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/help_close.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/help_open.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/icon_thumb_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/left.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/leftleft.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/leftnor.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/leftpre.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/lock.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/more.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/refresh.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/remove.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/right.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/rightnor.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/rightpre.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/rightright.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/sortAsc.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/tab/end.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/tab/end_not.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/tab/first.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/tab/first_not.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/tab/next.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/tab/next_not.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/tab/prev.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/tab/prev_not.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/tab/remove.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/to_bottom.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/to_top.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/unlock.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/up.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/up_arrow.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/updis.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/upnor.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/uppre.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/warn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/control/west_arrow.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/baobiaozhuti.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/baobiaozhuti_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/baobiaozhuti_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/canshujiemian.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/canshujiemian_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/canshujiemian_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/edit.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/edit_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/edit_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/form.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/form_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/form_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/left.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/page.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/page_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/page_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/preview.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/preview_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/preview_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/right.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/setting.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/setting_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/custombtn/setting_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/chart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/files.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/form.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/guide.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/0.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/1.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/10.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/10.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/11.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/11.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/12.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/12.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/13.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/13.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/14.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/14.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/15.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/15.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/16.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/17.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/17.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/18.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/18.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/19.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/19.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/2.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/20.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/21.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/22.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/23.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/24.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/25.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/26.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/27.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/28.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/29.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/3.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/30.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/31.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/32.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/33.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/34.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/35.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/36.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/37.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/38.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/39.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/4.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/40.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/41.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/42.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/43.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/44.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/45.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/46.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/47.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/48.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/49.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/5.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/5.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/50.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/52.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/54.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/55.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/56.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/57.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/6.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/6.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/7.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/7.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/8.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/8.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/9.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/9.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dashboard/img/Thumbs.db (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/arrow_branch.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/add.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/distanceconnect.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/groupAscColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/groupColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/groupDescColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/localconnect.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/modify.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/normalColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/selectColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/sortAscColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/sortColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/sortDescColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/bind/summaryColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/black_search.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/comb_widget.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/convertEmbedded.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/cube.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/custom_widget.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dataDictionary.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dataTable.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/database.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/datakubiao.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/datasource.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/default_widget.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/diy.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dock/XML.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dock/classTableData.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dock/dataTable.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dock/database.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dock/excel.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dock/relation_table_data.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dock/serverclasstabledata.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dock/serverdatabase.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dock/serverdatatable.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dock/table_proc.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/dock/table_text.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/editQuery.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/field.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/file.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/multi.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/newQuery.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/private.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/public.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/sap.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/search.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/classTableData.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/clear.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/dataDictionary.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/delete.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/hibernateTableData.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/hoverDown.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/hoverDown20.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/hoverDown@2x.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/hoverUp20.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/jdbcDataquery.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/jdbcTableData.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/moveDown.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/moveUp.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/newDatabase.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/newDatasource.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/normalDown.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/normalDown20.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/normalDown@2x.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/normalUp20.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/rename.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/scaleDown.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/scaleUp.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/schema.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/Thumbs.db (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/accept.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/bullet_key.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/bullet_pink.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/cart_add.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/cart_delete.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/chart_organisation.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/database.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/database_connect.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/database_gear.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/database_lightning.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/database_save.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/database_table.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/database_tables.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/filter.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/folder_database.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/folder_page.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/folder_table.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/page_edit.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/page_gear.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/page_save.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/page_white_database.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/table_error.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/table_gear.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/table_link.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/table_multiple.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/table_relationship.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/table_row_delete.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/table_row_insert.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/table_sort.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/textfield.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/wizard.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/selectwizard/wrench.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/sqlAscColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/sqlColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/sqlConditionColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/sqlDescColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/sqlTable.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/sqlViewTable.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/table.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/textDatasource.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/source/view.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/store_procedure.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/string.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/table.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/table2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/tables.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/text.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/today.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/tree.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/user_widget.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/views.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/data/xml.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/appfit/H0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/appfit/H1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/appfit/H2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/appfit/H3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/appfit/H4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/appfit/V0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/appfit/V1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/appfit/V2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/appfit/V3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/appfit/V4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/column.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/function.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/parameter.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/table.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dialog/variable.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dock/desktop.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dock/project.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dock/projectVer.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/dock/properties.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/docking/close.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/docking/down.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/docking/left.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/docking/left.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/docking/right.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/docking/right.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/docking/up.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/edit/deleteRow.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/edit/format.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/edit/insertRow_B.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/expand/asc.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/expand/asc_selected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/expand/cellAttr.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/expand/des.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/expand/des_selected.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/expand/landspace.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/expand/landspace_selected@1x.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/expand/none16x16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/expand/none16x16_selected@1x.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/expand/vertical.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/expand/vertical_selected@1x.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/file/disk.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/file/disk.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/file/fold.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/file/folder.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/file/gifFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/file/jpgFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/file/newfolder.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/file/nostar.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/file/pngFile.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/file/star.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/Button.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/CheckBox.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/Choice.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/List.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/RadioButton.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/TextField.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_border.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_border_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_left.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_left_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_right.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_right_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/control_close.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/control_close_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/control_max.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/control_max_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/control_min.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/control_min_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/controls.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/controls_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/left_border.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/left_border_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/right_border.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/right_border_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/title_pane.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/top_border.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/top_border_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/top_left.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/top_left_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/top_right.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/beans/adapters/container/top_right_.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/bottom_align.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/center_align.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/cursor/add.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/cursor/connectorcursor.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/cursor/move.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/drop_down.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/drop_over.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/drop_up.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/holder.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/left_align.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/middle_align.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/properties/minus.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/properties/plus.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/right_align.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/same_height.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/same_width.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/designer/top_align.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/parameter.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/Chart-Map.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Area.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Bar.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Column.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Comb_Chart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Donut.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Funnel.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Gantt.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Gis.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Line.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Meter.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Pie.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Radar.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Range_Chart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-Stock.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ChartF-XYScatter.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/Chart_BubbleChart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/FR-Chart-Chart_BubbleChart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/default.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ec_columns.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/form/toolbar/ec_frozen.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gc.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/general/close-rolver.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/general/close.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/general/mini-rolver.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/general/mini.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/general/resize-rolver.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/general/resize.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/blank.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/bmpFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/cell.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/cht.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/chtlocked.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/classFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/close.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/color/background.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/color/foreground.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/color/foreground2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/colorPicker/colorPicker16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/colorPicker/colorPicker18.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/colorPicker/colorPickerFrame.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/cptFile.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/documentFolderClose.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/folder.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/folder.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/folder/expanded.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/folder/foldered.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/folder/hovered_expanded.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/folder/hovered_foldered.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/frm.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/frmlocked.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/gifFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/htmlFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/jarFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/javaFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/jpgFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/jsFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/jspFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/locked.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/minimize.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/pngFile.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/popup.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/popupCenter.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/popupLarge.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/tab_add_click.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/tab_add_hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/tab_add_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/tab_delete.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/textFile.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/warning.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/gui/xmlFile.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/help.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon10.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon11.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon12.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon13.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon14.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon5.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon6.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon7.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon8.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/load/busy-icon9.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/log/clear.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/log/selectedall.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/log/setting.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/ComboBoxFocus.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/ComputerIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/DirectoryIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/ErrorIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/FileDetailsIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/FileIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/FileListIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/FloppyIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/HarddiskIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/HomeFolderIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/InformationIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/InternalFrameIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/NewFolderIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/ParentDirectoryIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/QuestionIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/TreeFolderClosedIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/TreeFolderOpenedIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/TreeLeafIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/TreeMinusIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/TreePlusIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/WarningIcon.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/lookandfeel/brightmask.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/bringForward.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/bringToFront.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/copy.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/cut.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/directShare.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/formatBrush.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/merge.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/modifyShare.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/paste.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/pluralundo.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/redo.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/sendBackward.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/sendToBack.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/share.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/undo.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_edit/unmerge.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/close.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/crossTable.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/csv.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/design.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/design_large.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/edit.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/excel.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/export.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/formExport.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/groupTable.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/help.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/html.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/hyperLink.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/import.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/merge.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/new.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/open.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/pageSetup.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/pdf.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/preview.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/print.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/save.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/saveAs.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/svg.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/switch.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/text.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/view_folder.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/web.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_file/word.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/allborders.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/border.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/bottom.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cell.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellAttr.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellWriteAttr.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/bold.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/bold_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/bottom_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/centerAlignment.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/default.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/defaultAlignment.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/defaultAlignment_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/generalAlignment.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_center_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_center_normal_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_center_pressed.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_left_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_left_normal_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_left_pressed.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_right_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_right_normal_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_right_pressed.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_s_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_s_normal_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/h_s_pressed.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/horizontal_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/in_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/italic.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/italic_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/leftAlignment.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/left_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/otherset.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/out_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/rightAlignment.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/right_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/shadow.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/strikethrough.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/sub.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/sup.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/top_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/underline.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/underline_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/v_center_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/v_center_normal_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/v_center_pressed.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/v_down_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/v_down_normal_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/v_down_pressed.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/v_top_normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/v_top_normal_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/v_top_pressed.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/cellstyle/vertical_white.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/doublebottom.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/editChart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/highlight.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/in.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/left.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/modified.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/noboder.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/note.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/out.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/outsideborders.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/right.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/shape.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/thickbottom.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/thickoutsideborders.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/topanddoublebotttom.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/topandthickbottom.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_format/topbottom.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/back.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/demo.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/feedback.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/forum.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/forward.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/help.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/preview_analy.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/preview_form.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/preview_page.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/preview_write.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/product_forum.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_help/support_qq.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/Pivottable.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/account.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/accountTitle.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/barcode.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/bias.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/bindCell.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/bindColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/blank.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/boolean.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/cell.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/cellPop.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/chart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/composite.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/compositePop.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/crossTable.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/date.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/default.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/expandCell.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/float.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/floatPop.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/formula.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/groupTable.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/hyperLink.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/image.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/insertColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/insertRow.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/newchart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/richtext.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/shape.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/shape_issosceles_triangle.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/shape_line.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/shape_oval.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/shape_rectangle.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/shape_rounded_rectangle.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/subReport.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/text.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_insert/textBox.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/allow_authority_edit.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/attributes.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/background.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/bindData.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/close.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/close_over.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/close_press.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/delete.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/deleteColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/deleteRow.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/exit_authority_edit.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/exportAttr.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/footer.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/header.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/linearAttr.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/mobile.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/p.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/p.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/parameter.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/process.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/qb.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/reportEngineAttr.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/reportWorkFlowAttr.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/reportWriteAttr.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/tree.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_report/webreportattribute.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/cache.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/connection.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/datasource.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/edit.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/face.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/formula.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/function.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/log.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/privilegeManager.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/reportletdemo.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/schedule.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/server.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/style.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_web/sync.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_window/cascade.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_window/formdesign.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_window/frozen.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_window/generaldesign.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_window/next.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_window/previous.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_window/title_hor.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/m_window/title_ver.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/mainframe/attribute.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/mainframe/class.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/mainframe/datasource.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/mainframe/fpt.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/mainframe/jar.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/mainframe/java.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/mainframe/server.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/mainframe/xml.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/minimize.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/need.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/parameter.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/Chart-Map/Chart-Map-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-5.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-5.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-6.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-5.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-6.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Comb_Chart/ChartF-Comb_Chart-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Comb_Chart/ChartF-Comb_Chart-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Donut/ChartF-Donut-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Donut/ChartF-Donut-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Gantt/ChartF-Gantt-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Gantt/ChartF-Gantt-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Gantt/ChartF-Gantt-2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Gantt/ChartF-Gantt-3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Gis/ChartF-Gis-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-5.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Meter/ChartF-Meter-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Meter/ChartF-Meter-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-4.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-5.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Radar/ChartF-Radar-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Radar/ChartF-Radar-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Radar/ChartF-Radar-2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Radar/ChartF-Radar-3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Range_Chart/ChartF-Range_Chart-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Stock/ChartF-Stock-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Stock/ChartF-Stock-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Stock/ChartF-Stock-2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-Stock/ChartF-Stock-3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-XYScatter/ChartF-XYScatter-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-XYScatter/ChartF-XYScatter-1.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/ChartF-XYScatter/ChartF-XYScatter-2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/Chart_BubbleChart/Chart_BubbleChart-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/Chart_BubbleChart/FR-Chart-Chart_BubbleChart-0.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/normal.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/Chart-Map.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/Chart-SVG_MAP.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Area.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Bar.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Column.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Comb_Chart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Donut.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Funnel.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Gantt.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Gis.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Line.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Meter.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Pie.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Radar.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Range_Chart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-Stock.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/ChartF-XYScatter.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/Chart_BubbleChart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/FR-Chart-Bit_Map.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/FR-Chart-Chart_BubbleChart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/FR-Chart-ThreeD_Custom_Chart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/FR-Chart_Bit_Map.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewArea.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewBar.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewColumn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewLine.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewPie.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_VerticalLine.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/poly/toolbar/Poly-Report_Block.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/questions.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/report/form.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/report/groupReport.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/report/position.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/reportcolumns/col.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/reportcolumns/col_en.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/reportcolumns/row.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/reportcolumns/row_en.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/server/change.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/server/manage.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/server/platform_16_16.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/server/plugin.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/server/printerconf.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/server/start.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/server/stop.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/server/view.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/serverM/fs.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/serverM/org.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/serverM/organization.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/serverM/role.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/serverM/roleAdd.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/serverM/roleRemove.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/serverM/rtr.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/serverM/use.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/serverM/user.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/sheet/addpolysheet.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/sheet/left_hover@1x.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/sheet/left_normal@1x.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/sheet/left_right_btn.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/sheet/polysheet.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/sheet/right_hover@1x.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/sheet/right_normal@1x.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/signature.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/chart.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/chartChangeClose.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/close.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/close_tags.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/closehover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/connector.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/down.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/parameter-hover.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/parametersetting.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/pop.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/setting.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/toolbarbtnclear.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/toolbarbtnsetting.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/up.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/toolbarbtn/xiala.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/tree/close.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/tree/open.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/update.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/video.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/wait.gif (100%) rename {designer_base => designer-base}/src/com/fr/design/images/warnings/warning 2.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/warnings/warning.png (100%) rename {designer_base => designer-base}/src/com/fr/design/images/warnings/warning3.png (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/$$$.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/$$page_number.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/$$totalPage_number.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/$fr_authority.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/$fr_username.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/$fr_userposition.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/NOFILTER.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/NULL.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/contextPath.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/curReport.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/formletName.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/fr_submitinfo.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/reportName.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/serverName.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/serverPort.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/serverSchema.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/serverURL.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/servletURL.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/cn/sessionID.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/$$$.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/$$page_number.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/$$totalPage_number.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/$fr_authority.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/$fr_username.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/$fr_userposition.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/NOFILTER.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/NULL.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/contextPath.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/curReport.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/formletName.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/fr_submitinfo.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/reportName.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/serverName.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/serverPort.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/serverSchema.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/serverURL.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/servletURL.txt (100%) rename {designer_base => designer-base}/src/com/fr/design/insert/formula/variable/en/sessionID.txt (100%) create mode 100644 designer-base/src/com/fr/design/javascript/Commit2DBJavaScriptPane.java rename {designer_base => designer-base}/src/com/fr/design/javascript/CustomActionPane.java (100%) create mode 100644 designer-base/src/com/fr/design/javascript/EmailPane.java create mode 100644 designer-base/src/com/fr/design/javascript/FormSubmitJavaScriptPane.java rename {designer_base => designer-base}/src/com/fr/design/javascript/JSContentPane.java (100%) create mode 100644 designer-base/src/com/fr/design/javascript/JavaScriptActionPane.java create mode 100644 designer-base/src/com/fr/design/javascript/JavaScriptImplPane.java create mode 100644 designer-base/src/com/fr/design/javascript/ParameterJavaScriptPane.java rename {designer_base => designer-base}/src/com/fr/design/javascript/ProcessJSImplPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/javascript/ProcessParameterTableModel.java (100%) rename {designer_base => designer-base}/src/com/fr/design/javascript/ProcessTransitionAdapter.java (100%) rename {designer_base => designer-base}/src/com/fr/design/javascript/beautify/BeautifyOption.java (100%) rename {designer_base => designer-base}/src/com/fr/design/javascript/beautify/JavaScriptFormatHelper.java (100%) rename {designer_base => designer-base}/src/com/fr/design/javascript/beautify/beautify.js (100%) create mode 100644 designer-base/src/com/fr/design/layout/FRGUIPaneFactory.java create mode 100644 designer-base/src/com/fr/design/layout/FRGridLayout.java create mode 100644 designer-base/src/com/fr/design/layout/FRLeftFlowLayout.java create mode 100644 designer-base/src/com/fr/design/layout/LeftCenterRightLayout.java create mode 100644 designer-base/src/com/fr/design/layout/TableLayout.java create mode 100644 designer-base/src/com/fr/design/layout/TableLayoutConstraints.java rename {designer_base => designer-base}/src/com/fr/design/layout/TableLayoutHelper.java (100%) create mode 100644 designer-base/src/com/fr/design/layout/TableLayoutTest.java create mode 100644 designer-base/src/com/fr/design/layout/VerticalFlowLayout.java create mode 100644 designer-base/src/com/fr/design/mainframe/AbstractAppProvider.java create mode 100644 designer-base/src/com/fr/design/mainframe/App.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/AuthorityEditPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/AuthorityPropertyPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/BaseFormDesigner.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/BaseJForm.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/BaseUndoState.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/BaseWidgetPropertyPane.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/DecodeDialog.java create mode 100644 designer-base/src/com/fr/design/mainframe/DesignerBean.java create mode 100644 designer-base/src/com/fr/design/mainframe/DesignerContext.java create mode 100644 designer-base/src/com/fr/design/mainframe/DesignerFrame.java create mode 100644 designer-base/src/com/fr/design/mainframe/DesignerFrameFileDealerPane.java create mode 100644 designer-base/src/com/fr/design/mainframe/DesktopCardPane.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/DockingView.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/DottedLine.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/EastRegionContainerPane.java create mode 100644 designer-base/src/com/fr/design/mainframe/FormScrollBar.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/HelpDialogHandler.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/HelpDialogManager.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/JFormSliderPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/JSliderPane.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/JTemplate.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/JTemplateActionListener.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/JTemplateProvider.java create mode 100644 designer-base/src/com/fr/design/mainframe/JViewContainer.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/JVirtualTemplate.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/NoSupportAuthorityEdit.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/SiteCenterToken.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/TemplatePane.java create mode 100644 designer-base/src/com/fr/design/mainframe/UndoStateEdit.java create mode 100644 designer-base/src/com/fr/design/mainframe/WestRegionContainerPane.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/backgroundpane/BackgroundQuickPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/backgroundpane/ColorBackgroundQuickPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/backgroundpane/GradientBackgroundQuickPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/backgroundpane/ImageBackgroundQuickPane.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/backgroundpane/ImagePreviewPane.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/backgroundpane/NullBackgroundQuickPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/backgroundpane/PatternBackgroundQuickPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/backgroundpane/TextureBackgroundQuickPane.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/dnd/ArrayListTransferHandler.java create mode 100644 designer-base/src/com/fr/design/mainframe/dnd/ArrayListTransferable.java create mode 100644 designer-base/src/com/fr/design/mainframe/dnd/ArrayTransferable.java create mode 100644 designer-base/src/com/fr/design/mainframe/dnd/SerializableTransferable.java create mode 100644 designer-base/src/com/fr/design/mainframe/form/FormECCompositeProvider.java create mode 100644 designer-base/src/com/fr/design/mainframe/form/FormECDesignerProvider.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/loghandler/DesignerLogAppender.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/loghandler/DesignerLogHandler.java create mode 100644 designer-base/src/com/fr/design/mainframe/loghandler/DesignerLogImpl.java create mode 100644 designer-base/src/com/fr/design/mainframe/loghandler/LogDetailPane.java create mode 100644 designer-base/src/com/fr/design/mainframe/loghandler/LogHandlerBar.java create mode 100644 designer-base/src/com/fr/design/mainframe/loghandler/LogHandlerBarUI.java create mode 100644 designer-base/src/com/fr/design/mainframe/loghandler/LogMessageBar.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/templateinfo/TemplateProcessInfo.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/toolbar/AuthorityEditToolBarComponent.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/toolbar/ToolBarMenuDockPlus.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/toolbar/UpdateActionManager.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/toolbar/UpdateActionModel.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/BasicPropertyPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/AccessibleBackgroundEditor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/AccessibleDictionaryEditor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/AccessibleEditor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/AccessibleIconEditor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/AccessibleImgBackgroundEditor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/AccessibleTemplateStyleEditor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/AccessibleTreeModelEditor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/BaseAccessibleEditor.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/RendererField.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/TemplateStylePane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/TemplateStylePreviewPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/accessibles/UneditableAccessibleEditor.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/widget/editors/AbstractPropertyEditor.java create mode 100644 designer-base/src/com/fr/design/mainframe/widget/editors/DataBindingEditor.java create mode 100644 designer-base/src/com/fr/design/mainframe/widget/editors/DataTableEditor.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/editors/ExtendedPropertyEditor.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/widget/editors/FormattedEditor.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/editors/ITextComponent.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/widget/editors/IntegerPropertyEditor.java create mode 100644 designer-base/src/com/fr/design/mainframe/widget/editors/PropertyCellEditor.java create mode 100644 designer-base/src/com/fr/design/mainframe/widget/editors/ServerDataBindingEditor.java create mode 100644 designer-base/src/com/fr/design/mainframe/widget/editors/ServerDataTableEditor.java create mode 100644 designer-base/src/com/fr/design/mainframe/widget/editors/StringEditor.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/editors/TextField.java (100%) create mode 100644 designer-base/src/com/fr/design/mainframe/widget/editors/WidgetValueEditor.java rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/renderer/GenericCellRenderer.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/renderer/IconCellRenderer.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/wrappers/BackgroundWrapper.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/wrappers/DictionaryWrapper.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/wrappers/IconWrapper.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/wrappers/TemplateStyleWrapper.java (100%) rename {designer_base => designer-base}/src/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java (100%) create mode 100644 designer-base/src/com/fr/design/menu/DottedSeparator.java create mode 100644 designer-base/src/com/fr/design/menu/DottedSeparatorUI.java create mode 100644 designer-base/src/com/fr/design/menu/KeySetUtils.java create mode 100644 designer-base/src/com/fr/design/menu/LineSeparator.java create mode 100644 designer-base/src/com/fr/design/menu/MenuDef.java create mode 100644 designer-base/src/com/fr/design/menu/MenuKeySet.java create mode 100644 designer-base/src/com/fr/design/menu/MenuManager.java create mode 100644 designer-base/src/com/fr/design/menu/NameSeparator.java create mode 100644 designer-base/src/com/fr/design/menu/SeparatorDef.java create mode 100644 designer-base/src/com/fr/design/menu/ShortCut.java create mode 100644 designer-base/src/com/fr/design/menu/ToolBarDef.java create mode 100644 designer-base/src/com/fr/design/menu/TwoDottedSeparatorUI.java create mode 100644 designer-base/src/com/fr/design/menu/UISeparatorUI.java rename {designer_base => designer-base}/src/com/fr/design/mingche.java (100%) create mode 100644 designer-base/src/com/fr/design/module/DesignModule.java rename {designer_base => designer-base}/src/com/fr/design/module/DesignModuleFactory.java (100%) create mode 100644 designer-base/src/com/fr/design/object/NameObject.java rename {designer_base => designer-base}/src/com/fr/design/parameter/AbstractParameterReader.java (100%) rename {designer_base => designer-base}/src/com/fr/design/parameter/HierarchyTreePane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/parameter/ParaDefinitePane.java (100%) create mode 100644 designer-base/src/com/fr/design/parameter/ParameterArrayPane.java rename {designer_base => designer-base}/src/com/fr/design/parameter/ParameterBridge.java (100%) rename {designer_base => designer-base}/src/com/fr/design/parameter/ParameterDesignerProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/parameter/ParameterGroup.java create mode 100644 designer-base/src/com/fr/design/parameter/ParameterInputPane.java create mode 100644 designer-base/src/com/fr/design/parameter/ParameterManagerPane.java create mode 100644 designer-base/src/com/fr/design/parameter/ParameterPane.java rename {designer_base => designer-base}/src/com/fr/design/parameter/ParameterReader.java (100%) create mode 100644 designer-base/src/com/fr/design/present/DictPresentPane.java create mode 100644 designer-base/src/com/fr/design/present/FormulaPresentPane.java create mode 100644 designer-base/src/com/fr/design/present/NonePresentPane.java create mode 100644 designer-base/src/com/fr/design/present/dict/AbstractDicPane.java create mode 100644 designer-base/src/com/fr/design/present/dict/CustomDictCorrelationPane.java create mode 100644 designer-base/src/com/fr/design/present/dict/CustomDictPane.java create mode 100644 designer-base/src/com/fr/design/present/dict/DatabaseDictPane.java create mode 100644 designer-base/src/com/fr/design/present/dict/DictionaryPane.java rename {designer_base => designer-base}/src/com/fr/design/present/dict/FormulaDictPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/present/dict/TableDataDictPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/preview/PagePreview.java (100%) rename {designer_base => designer-base}/src/com/fr/design/preview/ViewPreview.java (100%) rename {designer_base => designer-base}/src/com/fr/design/preview/WriteEnhancePreview.java (100%) rename {designer_base => designer-base}/src/com/fr/design/preview/WritePreview.java (100%) rename {designer_base => designer-base}/src/com/fr/design/report/AbstractExportPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/roleAuthority/ReportAndFSManagePane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/roleAuthority/RoleDataWrapper.java (100%) rename {designer_base => designer-base}/src/com/fr/design/roleAuthority/RoleSourceOP.java (100%) rename {designer_base => designer-base}/src/com/fr/design/roleAuthority/RoleTree.java (100%) rename {designer_base => designer-base}/src/com/fr/design/roleAuthority/RolesAlreadyEditedPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/roleAuthority/RolesEditedSourceOP.java (100%) create mode 100644 designer-base/src/com/fr/design/roleAuthority/UIRoleTreeUI.java create mode 100644 designer-base/src/com/fr/design/scrollruler/BaseRuler.java create mode 100644 designer-base/src/com/fr/design/scrollruler/HorizontalRuler.java create mode 100644 designer-base/src/com/fr/design/scrollruler/HorizontalRulerUI.java create mode 100644 designer-base/src/com/fr/design/scrollruler/ModLineBorder.java create mode 100644 designer-base/src/com/fr/design/scrollruler/RulerLayout.java create mode 100644 designer-base/src/com/fr/design/scrollruler/RulerUI.java create mode 100644 designer-base/src/com/fr/design/scrollruler/ScrollRulerComponent.java create mode 100644 designer-base/src/com/fr/design/scrollruler/VerticalRuler.java create mode 100644 designer-base/src/com/fr/design/scrollruler/VerticalRulerUI.java create mode 100644 designer-base/src/com/fr/design/selection/QuickEditor.java create mode 100644 designer-base/src/com/fr/design/selection/SelectableElement.java create mode 100644 designer-base/src/com/fr/design/selection/Selectedable.java create mode 100644 designer-base/src/com/fr/design/selection/SelectionEvent.java create mode 100644 designer-base/src/com/fr/design/selection/SelectionListener.java create mode 100644 designer-base/src/com/fr/design/style/AbstractPopBox.java create mode 100644 designer-base/src/com/fr/design/style/AbstractSelectBox.java create mode 100644 designer-base/src/com/fr/design/style/AlignmentPane.java create mode 100644 designer-base/src/com/fr/design/style/AlphaPane.java create mode 100644 designer-base/src/com/fr/design/style/BorderPane.java create mode 100644 designer-base/src/com/fr/design/style/ChooseFileView.java create mode 100644 designer-base/src/com/fr/design/style/CustomSelectBox.java create mode 100644 designer-base/src/com/fr/design/style/FRFontPane.java create mode 100644 designer-base/src/com/fr/design/style/FRFontPreviewArea.java create mode 100644 designer-base/src/com/fr/design/style/FontFamilyPane.java create mode 100644 designer-base/src/com/fr/design/style/FontSizeStylePane.java create mode 100644 designer-base/src/com/fr/design/style/FormatBox.java create mode 100644 designer-base/src/com/fr/design/style/FormatPane.java rename {designer_base => designer-base}/src/com/fr/design/style/background/BackgroundButtonPane.java (100%) create mode 100644 designer-base/src/com/fr/design/style/background/BackgroundCustomJComponent.java rename {designer_base => designer-base}/src/com/fr/design/style/background/BackgroundDetailPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/style/background/BackgroundFactory.java (100%) create mode 100644 designer-base/src/com/fr/design/style/background/BackgroundJComponent.java create mode 100644 designer-base/src/com/fr/design/style/background/BackgroundPane.java create mode 100644 designer-base/src/com/fr/design/style/background/BackgroundPane4BoxChange.java rename {designer_base => designer-base}/src/com/fr/design/style/background/BackgroundPane4Browser.java (100%) create mode 100644 designer-base/src/com/fr/design/style/background/BackgroundPreviewLabel.java create mode 100644 designer-base/src/com/fr/design/style/background/BackgroundSelectPane.java create mode 100644 designer-base/src/com/fr/design/style/background/BackgroundUIComboBoxNoImagePane.java create mode 100644 designer-base/src/com/fr/design/style/background/BackgroundUIComboBoxPane.java rename {designer_base => designer-base}/src/com/fr/design/style/background/BackgroundUIWrapper.java (100%) rename {designer_base => designer-base}/src/com/fr/design/style/background/gradient/FixedGradientBar.java (100%) rename {designer_base => designer-base}/src/com/fr/design/style/background/gradient/GradientBackgroundPane.java (100%) create mode 100644 designer-base/src/com/fr/design/style/background/gradient/GradientBackgroundSelectPane.java create mode 100644 designer-base/src/com/fr/design/style/background/gradient/GradientBar.java create mode 100644 designer-base/src/com/fr/design/style/background/gradient/GradientChangeBoxPane.java create mode 100644 designer-base/src/com/fr/design/style/background/gradient/GradientFromToPixPane.java create mode 100644 designer-base/src/com/fr/design/style/background/gradient/GradientSelectBox.java create mode 100644 designer-base/src/com/fr/design/style/background/gradient/SelectColorPointBtn.java create mode 100644 designer-base/src/com/fr/design/style/background/image/ImageFileChooser.java create mode 100644 designer-base/src/com/fr/design/style/background/image/ImagePreviewPane.java create mode 100644 designer-base/src/com/fr/design/style/background/image/ImageSelectPane.java rename {designer_base => designer-base}/src/com/fr/design/style/background/impl/BPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/style/background/impl/ColorBackgroundPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/style/background/impl/ImageBackgroundPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/style/background/impl/ImageBackgroundPane4Browser.java (100%) rename {designer_base => designer-base}/src/com/fr/design/style/background/impl/ImageButtonBackgroundPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/style/background/impl/NullBackgroundPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/style/background/impl/PatternBackgroundPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/style/background/impl/PatternBackgroundPaneNoFore.java (100%) rename {designer_base => designer-base}/src/com/fr/design/style/background/impl/TextureBackgroundPane.java (100%) create mode 100644 designer-base/src/com/fr/design/style/background/pattern/PatternSelectBox.java create mode 100644 designer-base/src/com/fr/design/style/background/pattern/PatternSelectPane.java create mode 100644 designer-base/src/com/fr/design/style/background/pattern/PatternUIComboBoxPane.java create mode 100644 designer-base/src/com/fr/design/style/background/texture/TextureSelectBox.java create mode 100644 designer-base/src/com/fr/design/style/background/texture/TextureSelectPane.java create mode 100644 designer-base/src/com/fr/design/style/background/texture/TextureUIComboBoxPane.java create mode 100644 designer-base/src/com/fr/design/style/color/ColorCell.java create mode 100644 designer-base/src/com/fr/design/style/color/ColorChooserPreview.java create mode 100644 designer-base/src/com/fr/design/style/color/ColorControlWindow.java create mode 100644 designer-base/src/com/fr/design/style/color/ColorFactory.java rename {designer_base => designer-base}/src/com/fr/design/style/color/ColorPicker.java (100%) create mode 100644 designer-base/src/com/fr/design/style/color/ColorSelectBox.java create mode 100644 designer-base/src/com/fr/design/style/color/ColorSelectConfigManager.java rename {designer_base => designer-base}/src/com/fr/design/style/color/ColorSelectConfigManagerProvider.java (100%) create mode 100644 designer-base/src/com/fr/design/style/color/ColorSelectDetailPane.java create mode 100644 designer-base/src/com/fr/design/style/color/ColorSelectDialog.java create mode 100644 designer-base/src/com/fr/design/style/color/ColorSelectPane.java create mode 100644 designer-base/src/com/fr/design/style/color/ColorSelectable.java create mode 100644 designer-base/src/com/fr/design/style/color/ColorUIComboBoxPane.java create mode 100644 designer-base/src/com/fr/design/style/color/CustomChooserPanel.java create mode 100644 designer-base/src/com/fr/design/style/color/DetailColorSelectPane.java create mode 100644 designer-base/src/com/fr/design/style/color/NewColorSelectBox.java create mode 100644 designer-base/src/com/fr/design/style/color/NewColorSelectPane.java rename {designer_base => designer-base}/src/com/fr/design/style/color/PickColorButtonFactory.java (100%) create mode 100644 designer-base/src/com/fr/design/style/color/RecentUseColorPane.java create mode 100644 designer-base/src/com/fr/design/style/color/SwatchChooserPanel.java create mode 100644 designer-base/src/com/fr/design/style/color/TransparentColorControlWindow.java create mode 100644 designer-base/src/com/fr/design/style/color/TransparentPane.java create mode 100644 designer-base/src/com/fr/design/style/color/UIToolbarColorButton.java create mode 100644 designer-base/src/com/fr/design/style/color/UsedColorPane.java create mode 100644 designer-base/src/com/fr/design/utils/ColorRoutines.java rename {designer_base => designer-base}/src/com/fr/design/utils/ComponentUtils.java (100%) create mode 100644 designer-base/src/com/fr/design/utils/DesignUtils.java create mode 100644 designer-base/src/com/fr/design/utils/DrawRoutines.java create mode 100644 designer-base/src/com/fr/design/utils/ThemeUtils.java rename {designer_base => designer-base}/src/com/fr/design/utils/concurrent/ThreadFactoryBuilder.java (100%) create mode 100644 designer-base/src/com/fr/design/utils/gui/GUICoreUtils.java create mode 100644 designer-base/src/com/fr/design/utils/gui/GUIPaintUtils.java create mode 100644 designer-base/src/com/fr/design/utils/gui/JListUtils.java create mode 100644 designer-base/src/com/fr/design/utils/gui/LayoutUtils.java create mode 100644 designer-base/src/com/fr/design/web/CustomIconPane.java rename {designer_base => designer-base}/src/com/fr/design/widget/Appearance.java (100%) rename {designer_base => designer-base}/src/com/fr/design/widget/DataModify.java (100%) rename {designer_base => designer-base}/src/com/fr/design/widget/EventCreator.java (100%) create mode 100644 designer-base/src/com/fr/design/widget/IconDefinePane.java rename {designer_base => designer-base}/src/com/fr/design/widget/Operator.java (100%) rename {designer_base => designer-base}/src/com/fr/design/widget/WidgetBoundsPaneFactory.java (100%) create mode 100644 designer-base/src/com/fr/design/widget/btn/ButtonConstants.java create mode 100644 designer-base/src/com/fr/design/widget/btn/ButtonDetailPane.java create mode 100644 designer-base/src/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java rename {designer_base => designer-base}/src/com/fr/design/widget/component/BackgroundCompPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/widget/component/ButtonBackgroundPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/widget/component/CheckBoxDictPane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/widget/component/DateValuePane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/widget/component/NumberEditorValidatePane.java (100%) rename {designer_base => designer-base}/src/com/fr/design/widget/component/UIComboBoxNoArrow.java (100%) rename {designer_base => designer-base}/src/com/fr/design/write/submit/CustomJobPane.java (100%) create mode 100644 designer-base/src/com/fr/design/write/submit/CustomSubmitJobPane.java create mode 100644 designer-base/src/com/fr/design/write/submit/DBManipulationInWidgetEventPane.java create mode 100644 designer-base/src/com/fr/design/write/submit/DBManipulationPane.java create mode 100644 designer-base/src/com/fr/design/write/submit/DMLJobPane.java create mode 100644 designer-base/src/com/fr/design/write/submit/SubmitJobListPane.java create mode 100644 designer-base/src/com/fr/env/EnvListPane.java create mode 100644 designer-base/src/com/fr/env/RemoteEnv.java create mode 100644 designer-base/src/com/fr/env/RemoteSignInPane.java create mode 100644 designer-base/src/com/fr/env/SignIn.java create mode 100644 designer-base/src/com/fr/file/FILE.java create mode 100644 designer-base/src/com/fr/file/FILEChooserPane.java create mode 100644 designer-base/src/com/fr/file/FILEFactory.java create mode 100644 designer-base/src/com/fr/file/FileFILE.java create mode 100644 designer-base/src/com/fr/file/FileNodeFILE.java create mode 100644 designer-base/src/com/fr/file/MemFILE.java create mode 100644 designer-base/src/com/fr/file/filter/ChooseFileFilter.java create mode 100644 designer-base/src/com/fr/file/filter/FILEFilter.java create mode 100644 designer-base/src/com/fr/file/filter/OnlyShowDirectoryFileFilter.java create mode 100644 designer-base/src/com/fr/start/BBSGuestPaneProvider.java create mode 100644 designer-base/src/com/fr/start/BaseDesigner.java create mode 100644 designer-base/src/com/fr/start/Demo.java create mode 100644 designer-base/src/com/fr/start/SplashPane.java create mode 100644 designer-base/src/com/fr/start/SplashWindow.java create mode 100644 designer-base/src/com/fr/start/StartDocURL.java create mode 100644 designer-base/src/com/fr/start/StartServer.java rename {designer_base => designer-base}/src/com/fr/start/TomcatFRHost.java (100%) rename {designer_base => designer-base}/src/com/fr/start/server/FRTomcat.java (100%) create mode 100644 designer-base/src/com/fr/start/server/MultiOutputStream.java create mode 100644 designer-base/src/com/fr/start/server/ServerManageFrame.java create mode 100644 designer-base/src/com/fr/start/server/ServerTray.java rename {designer_base => designer-base}/src/com/fr/start/server/TomcatHost.java (100%) rename {designer_base => designer-base}/src/com/fr/start/server/TomcatServerListener.java (100%) create mode 100644 designer-chart/.gitignore create mode 100644 designer-chart/build.chart.gradle rename {designer_chart => designer-chart}/clean.gradle (100%) rename {designer_chart => designer-chart}/src/com/fr/aspectj/designerchart/TemplateProcessTracker.aj (100%) rename {designer_chart => designer-chart}/src/com/fr/design/ChartTypeInterfaceManager.java (100%) create mode 100644 designer-chart/src/com/fr/design/chart/ChartAxisFactory.java create mode 100644 designer-chart/src/com/fr/design/chart/ChartCommonWizardPane.java create mode 100644 designer-chart/src/com/fr/design/chart/ChartComponentPane.java create mode 100644 designer-chart/src/com/fr/design/chart/ChartControlPane.java create mode 100644 designer-chart/src/com/fr/design/chart/ChartDialog.java create mode 100644 designer-chart/src/com/fr/design/chart/ChartPlotFactory.java create mode 100644 designer-chart/src/com/fr/design/chart/ChartSwingUtils.java create mode 100644 designer-chart/src/com/fr/design/chart/ChartTypePane.java create mode 100644 designer-chart/src/com/fr/design/chart/ChartWizardPane.java create mode 100644 designer-chart/src/com/fr/design/chart/FactoryObject.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/AxisStyleObject.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/AxisStylePane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/BinaryChartStyleAxisPane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/ChartAlertLinePane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/ChartAlertValueInTopBottomPane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/ChartAlertValuePane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/ChartStyleAxisPane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/CustomChartStyleAxisPane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/GanntChartStyleAxisPane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/MinMaxValuePane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/RadarChartStyleAxisPane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/TernaryChartStyleAxisPane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/ValueChartStyleAxisPane.java create mode 100644 designer-chart/src/com/fr/design/chart/axis/XYChartStyleAxisPane.java create mode 100644 designer-chart/src/com/fr/design/chart/comp/BorderAttriPane.java create mode 100644 designer-chart/src/com/fr/design/chart/demo/GlyphDemo.java rename {designer_chart => designer-chart}/src/com/fr/design/chart/fun/IndependentChartUIProvider.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chart/fun/impl/AbstractIndependentChartUI.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chart/fun/impl/AbstractIndependentChartUIWithAPILevel.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chart/fun/impl/AbstractIndependentChartsUI.java (100%) create mode 100644 designer-chart/src/com/fr/design/chart/gui/ActiveGlyphFactory.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/ChartComponent.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/ChartWidgetOption.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/ActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/AlertValueActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/AxisActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/CategoryAxisActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/ChartActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/DataLabelActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/DataSeriesActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/DataSheetActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/DateAxisActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/LegendActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/PlotActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/RadarAxisActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/RangeAxisActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/TextActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/TrendLineActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/ValueAxisActiveGlyph.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/action/ChartComponentAction.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/action/SetAnalysisLineStyleAction.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/action/SetAxisStyleAction.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/action/SetChartStyleAciton.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/action/SetDataLabelStyleAction.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/action/SetDataSeriesAttrAction.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/action/SetDataSheetAction.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/action/SetLegendStyleAction.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/action/SetPlotStyleAction.java create mode 100644 designer-chart/src/com/fr/design/chart/gui/active/action/SetTitleStyleAction.java create mode 100644 designer-chart/src/com/fr/design/chart/javascript/ChartEmailPane.java create mode 100644 designer-chart/src/com/fr/design/chart/report/GisMapDataPane.java rename {designer_chart => designer-chart}/src/com/fr/design/chart/report/GisMapReportDataContentPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/chart/report/GisMapTableDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapCubeDataPane.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapCubeLayerPane.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapCubeSetDataPane.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapDataPane.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapMoreCubeLayerPane.java rename {designer_chart => designer-chart}/src/com/fr/design/chart/report/MapMoreReportIndexPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/chart/report/MapMoreTableIndexPane.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapReportCubeDataPane.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapReportDataSinglePane.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapReportEditor.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapReportRenderer.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapSinglePane.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapTableCubeDataPane.java create mode 100644 designer-chart/src/com/fr/design/chart/report/MapTableDataSinglePane.java rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/PlotSeries/AbstrctMapAttrEditPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/chart/series/PlotSeries/MapCustomPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/PlotSeries/MapDefiAreaNamePane.java rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/PlotSeries/MapGroupExtensionPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/chart/series/PlotSeries/MapImageEditPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/PlotSeries/MapSelectShape.java create mode 100644 designer-chart/src/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/PlotStyle/ChartSelectDemoPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/BubblePlotChartConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/ChartConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/ChartConditionPaneFactory.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/ConditionTrendLinePane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/DataLabelContentsPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/DataLabelStylePane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesAttrCustomPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesAttrPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesCustomConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/GanttPlotChartConditionPane.java rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/LabelAlphaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/LabelAxisPositionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/LabelBackgroundPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/LabelBorderAttrPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/LabelBorderPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/LabelColorPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/LabelContentsPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/LabelLineStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/LineMarkerTypePane.java (100%) create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/MapPlotChartConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/PiePlotChartConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/TooltipContentsPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/TrendLineControlPane.java rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/TrendLinePane.java (100%) create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/XYPlotChartConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/AreaDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/Bar2DDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/Bar3DDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/BubbleDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/DataLabelPane.java rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/dlp/FunnelDataLabelPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/GanttDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/LineDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/MapDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/MeterDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/PieDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/RadarDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/RangeDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/StockDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/dlp/XYDataLabelPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/Area3DPlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/AreaPlotDataSeriesCondtionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/Bar2DTrendLineDSConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/Bar3DPlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/BarPlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/BubblePlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPopAttrPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperRelateCellLinkPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperRelateFloatLinkPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4AreaConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4BarNoTrendLineConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4BarTrendLineConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4LineConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/DataSeriesConditionPaneFactory.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/Donut2DPlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/FormHyperlinkNorthPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/FormHyperlinkPane.java rename {designer_chart => designer-chart}/src/com/fr/design/chart/series/SeriesCondition/impl/FunnelPlotDataSeriesConditionPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/GanttPlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/LinePlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/MapPlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/MeterPlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/Pie3DPlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/PiePlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/RadarPlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/StockPlotDataSeriesConditionPane.java create mode 100644 designer-chart/src/com/fr/design/chart/series/SeriesCondition/impl/XYScatterPlotDataSeriesConditionPane.java rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/AreaIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/BarIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/BubbleIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/ColumnIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/CustomIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/DonutIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/FunnelIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/GanttIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/GisMapIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/LineIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/MapIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/MeterIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/PieIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/RadarIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/RangeIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/StockIndependentChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/chartinterface/XYScatterIndependentChartInterface.java (100%) create mode 100644 designer-chart/src/com/fr/design/gui/xcombox/ComboBoxUseEditor.java create mode 100644 designer-chart/src/com/fr/design/gui/xcombox/MarkerComboBox.java rename {designer_chart => designer-chart}/src/com/fr/design/images/add.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/chart.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/copyjs.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/del.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/exportimg.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/area.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/bar.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/bubble.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/column.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/custom.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/drillmap.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/funnel.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/gantt.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/gauge.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/heatmap.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/line.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/map.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/multiPie.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/pie.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/radar.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/scatter.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/structure.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/treeMap.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/form/toolbar/wordcloud.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/newchart_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/newchart_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/newchart_press.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_Drill_Map.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewBubble.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewCustom.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewFunnel.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewGantt.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewGauge.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewHeatMap.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewMap.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewMultiPie.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewRadar.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewScatter.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewTreeMap.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/splash4Chart.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/1_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/1_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/1_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/2_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/2_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/2_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/3_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/3_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/area/3_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/1_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/1_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/1_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/2_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/2_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/2_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/3_gary.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/3_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/3_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/3_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/4_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/4_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/4_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/5_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/5_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/5_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/6_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/6_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bar/6_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/border.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bubble/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bubble/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/bubble/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/1_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/1_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/1_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/2_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/2_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/2_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/3_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/3_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/3_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/4_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/4_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/4_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/5_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/5_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/5_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/6_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/6_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/column/6_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/custom/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/custom/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/custom/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/donut/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/donut/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/donut/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/donut/1_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/donut/1_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/donut/1_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/funnel/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/funnel/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/funnel/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/gantt/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/gantt/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/gantt/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/gis/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/gis/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/gis/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/gis/1_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/gis/1_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/gis/1_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/line/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/line/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/line/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/map/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/map/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/map/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/meter/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/meter/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/meter/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/meter/1_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/meter/1_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/meter/1_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/meter/2_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/meter/2_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/meter/2_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/pie/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/pie/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/pie/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/pie/1_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/pie/1_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/pie/1_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/radar/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/radar/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/radar/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/range/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/range/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/range/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/stock/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/stock/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/stock/0_over.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/xyscatter/0_gray.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/xyscatter/0_normal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/design/images/toolbar/xyscatter/0_over.png (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/ChartPropertyPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/MapEditPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/MiddleChartPropertyPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/TargetComponentContainer.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/AbstractChartAttrPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/AttributeChange.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/ChartEditPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/ChartHyperEditPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/ChartsConfigPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/ChartsEditPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/PaneTitleConstants.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/ChangeConfigPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/ChartDataPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/ChartDesignerOtherPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/ChartOtherPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/ChartStylePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/ChartTypePane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/ColorSelectBoxWithOutTransparent.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/ColorSelectPaneWithOutTransparent.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/StylePane4Chart.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/UIEditLabel.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/CalculateComboBox.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/ChartDataFilterPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/DataContentsPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/DatabaseTableDataPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/PresentComboBox.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/ReportDataPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/TableDataPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/report/AbstractReportDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/report/BubblePlotReportDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotMoreCateReportDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotReportDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/report/GanttPlotReportDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/report/MeterPlotReportDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/report/PiePlotReportDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/report/StockPlotReportDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/report/XYScatterPlotReportDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/AbstractTableDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/BubblePlotTableDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/data/table/Factory4TableDataContentPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/GanttPlotTableDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/MeterPlotTableDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/PiePlotTableDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldNamePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldValuePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/SeriesTypeUseComboxPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/StockPlotTableDataContentPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/data/table/XYScatterPlotTableDataContentPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/item/FlexibleComboBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/item/ItemEventType.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/other/ChartConditionAttrPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/other/ChartDesignerConditionAttrPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/other/ChartDesignerInteractivePane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/other/ChartInteractivePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/other/ChartSwitchPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/other/TimeSwitchPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/AbstractChartTabPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartAccColorPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/ChartAxisLabelPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartAxisLineStylePane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/ChartAxisTitleNoFormulaPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartAxisTitlePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartAxisValueTypePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartBackgroundNoImagePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartBackgroundPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartBeautyPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartBorderPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/ChartDataPointLabel4GisPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartDataPointLabel4MapPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartDatapointLabelPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartFillStylePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartPreFillStylePane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/ChartTextAttrNoColorPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartTextAttrNoFontSizePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/DateAxisValuePane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/ThirdTabPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/analysisline/ChartAnalysisLinePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartAreaPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartAxisAreaPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartPlotAreaPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartWholeAreaPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/area/DefaultAxisAreaPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/area/Plot3DAxisAreaPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/area/RadarAxisAreaPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/axis/ChartAxisNoFormulaPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartAxisPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartAxisUsePane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/axis/ChartCategoryNoFormulaPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartCategoryPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/axis/ChartPercentValueNoFormulaPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartPercentValuePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartRadarPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/axis/ChartSecondValueNoFormulaPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartSecondValuePane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/axis/ChartValueNoFormulaPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartValuePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/datalabel/ChartDataLabelPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/datalabel/ChartLabelFontPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/datasheet/ChartDatasheetPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/legend/AutoSelectedPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/legend/ChartLegendPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/AbstractPlotSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/Area3DSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/AreaSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/Bar2DSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/Bar3DSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/BubbleSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/ChartSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/ColorPickerPaneNumFiled.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/ColorPickerPaneWithFormula.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/CombinedBar2DSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/CombinedBubbleSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/CombinedPie2DSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/CustomDefaultSeriesPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/CustomSeriesPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/CustomTypeConditionSeriesPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/Donut2DSeriesPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/Donut3DSeriesPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/FunnelSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/LineSeriesPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/MapColorPickerPaneWithFormula.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/MapSeriesPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/MapSeriesPane4ChartDesigner.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/MeterSeriesPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/MeterSeriesPane4ChartDesigner.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/Pie2DSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/Pie3DSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/RadarSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/RangeSeriesPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/SeriesPane4ChartDesigner.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/StockSeriesPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/UIColorPickerPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/series/UIColorPickerPane4Map.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/style/series/XYScatterSeriesPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/title/ChartTitlePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/style/title/ChartTitlePaneNoFormula.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/AbstractBarPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/BarPlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/BubblePlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/type/ChartTabPane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/CustomPlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/DonutPlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/FunnelPlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/GanttPlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/GisMapPlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/LinePlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/MapPlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/PiePlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/RadarPlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/RangePlotPane.java create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/StockPlotPane.java rename {designer_chart => designer-chart}/src/com/fr/design/mainframe/chart/gui/type/UserDefinedChartTypePane.java (100%) create mode 100644 designer-chart/src/com/fr/design/mainframe/chart/gui/type/XYScatterPlotPane.java create mode 100644 designer-chart/src/com/fr/design/module/ChartDesignerModule.java create mode 100644 designer-chart/src/com/fr/design/module/ChartHyperlinkGroup.java create mode 100644 designer-chart/src/com/fr/design/module/ChartPreStyleAction.java create mode 100644 designer-chart/src/com/fr/design/module/ChartPreStyleManagerPane.java create mode 100644 designer-chart/src/com/fr/design/module/ChartPreStylePane.java create mode 100644 designer-chart/src/com/fr/design/module/FormHyperlinkGroup.java rename {designer_chart => designer-chart}/src/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/extended/chart/AbstractExtendedChartTableDataPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/extended/chart/AbstractExtendedChartUIProvider.java (100%) rename {designer_chart => designer-chart}/src/com/fr/extended/chart/AbstractExtendedStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/extended/chart/ExtendedChartHyperLinkPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/extended/chart/ExtendedOtherPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/extended/chart/ExtendedScrollPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/extended/chart/ExtendedTypePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/file/FILEChooserPane4Chart.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/DownloadOnlineSourcesHelper.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/area/AreaIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/area/VanChartAreaConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/area/VanChartAreaPlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/area/VanChartAreaSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/area/images/area.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/area/images/custom.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/area/images/percentStack.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/area/images/stack.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/background.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bar/BarIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bar/VanChartBarPlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bar/VanChartBarStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bar/images/bar.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bar/images/custom.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bar/images/percentstack.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bar/images/stack.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/BubbleIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/VanChartBubbleConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/VanChartBubbleConditionSelectionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/VanChartBubbleInteractivePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/VanChartBubblePlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/VanChartBubbleSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/VanChartBubbleStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/component/VanChartBubblePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/data/VanChartBubblePlotTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/force/VanChartBubbleRefreshTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/force/VanChartForceBubbleAreaBackgroundPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/force/VanChartForceBubbleAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/force/VanChartForceBubbleLabelPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/force/VanChartForceBubbleTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/images/bubble.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/images/force.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/bubble/images/large.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/column/ColumnBorderAttriPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/column/ColumnIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/column/VanChartColumnConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/column/VanChartColumnLabelBorderPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/column/VanChartColumnPlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/column/VanChartColumnSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/column/VanChartCustomStackAndAxisConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/column/images/column.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/column/images/custom.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/column/images/percentstack.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/column/images/stack.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/CustomIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/CustomPlotDesignerPaneFactory.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/VanChartCustomDataPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/VanChartCustomPlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/CategoryCustomPlotTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/ChartImageCheckOutPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/CustomPlotLocationPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/MeterCustomPlotReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/MeterCustomPlotTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/VanChartCustomAreaBackgroundPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/VanChartCustomAxisConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/VanChartCustomPlotAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/VanChartCustomPlotSelectPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/VanChartCustomPlotTabPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/VanChartCustomPlotUITabGroup.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/VanChartDataPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/component/VanChartHyperLinkPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/column_area.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/column_line.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/area.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/bubble.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/column.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/cuvette.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/different_pie.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/line.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/pie.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/pointer_180.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/pointer_360.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/radar.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/ring.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/same_pie.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/scatter.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/area.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/bubble.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/column.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/cuvette.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/different_pie.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/line.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/pie.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/pointer_180.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/pointer_360.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/radar.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/ring.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/same_pie.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/scatter.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/slot.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/selected/stack_radar.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/slot.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/custom/icon/stack_radar.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/images/stack_column_line.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/other/VanChartCustomConditionAttrPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/other/VanChartCustomInteractivePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/other/VanChartCustomOtherPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/other/VanChartCustomPlotConditionAttrTabPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/other/VanChartCustomPlotHyperlinkPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/other/VanChartCustomPlotHyperlinkTabPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomAxisAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomAxisTabPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomLabelPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomPlotLabelTabPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomPlotSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomPlotSeriesTabPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomPlotTooltipTabPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/custom/style/VanChartCustomTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/AbstractVanChartScrollPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/PlotFactory.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/TableLayout4VanChartHelper.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/ChartUIMenuNameableCreator.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartAreaSeriesFillColorPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartBeautyPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartFillStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartFillStylePane4Condition.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartFloatPositionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartHtmlLabelPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartHtmlLabelPaneWithOutWidthAndHeight.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartLabelContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartLineTypePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartLineWidthPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartMarkerPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartPlotMultiTabPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartRefreshTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartTrendLinePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartUIListControlPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/VanChartUIMenuNameableCreator.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/background/VanChartBackgroundPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/background/VanChartBackgroundPaneWithOutImageAndShadow.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/background/VanChartBackgroundWithOutImagePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/background/VanChartBackgroundWithOutShadowWithRadiusPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/background/VanChartGradientPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/background/VanChartMarkerBackgroundPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/border/VanChartBorderPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/border/VanChartBorderWithAlphaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/border/VanChartBorderWithRadiusPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/CategoryNameFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/ChangedPercentFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/ChangedValueFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/FormatPaneWithNormalType.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/FormatPaneWithOutFont.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/MapAreaNameFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/PercentFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/SeriesNameFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/ValueFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/XFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/format/YFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/label/GaugeLabelContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/label/LabelContentPaneWithCate.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/label/LabelContentPaneWithCateValue.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/label/LabelContentPaneWithOutCate.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/label/LabelContentPaneWithPercent.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/marker/VanChartCommonMarkerPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/marker/VanChartImageMarkerPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/tooltip/RefreshTooltipContentPaneWithOutSeries.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/data/OneDimensionalPlotReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/data/VanChartMoreCateReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/data/VanChartMoreCateTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/AbstractConditionAttrContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/AutoRefreshPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/AutoRefreshPaneWithoutTooltip.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/VanChartConditionAttrContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/VanChartConditionAttrPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/VanChartConditionListControlPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/VanChartInteractivePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/VanChartInteractivePaneWithMapZoom.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/VanChartInteractivePaneWithOutSort.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/VanChartOtherPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/AbstractNormalMultiLineConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartAreaFillColorConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartBubbleSetConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartCurveConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartDataSheetContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartEffectConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartFloatColorConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartLabelConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartLineEffectConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartLineMapTooltipConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartLineTypeConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartLineWidthConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartMarkerConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartSeriesColorConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartSeriesImageBackgroundConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartStructureNodeConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartTooltipConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/other/condition/item/VanChartTrendLineConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/HeatMapRangeLegendPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/VanChartLegendPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/VanChartPlotLegendPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/VanChartRangeLegendPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/VanChartStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/VanChartTitlePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/VanLegendPaneWidthOutHighlight.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/AxisPaneFactory.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/VanChartAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithOutTypeSelect.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/VanChartXYAxisPaneInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/bar/VanChartBarAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/bar/VanChartXAxisScrollPaneWithOutTypeSelect.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/bar/VanChartYAxisScrollPaneWithTypeSelect.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/component/MinMaxValuePaneWithOutSecTick.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/component/MinMaxValuePaneWithOutTick.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/component/VanChartMinMaxValuePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/gauge/VanChartAxisScrollPaneWithGauge.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/gauge/VanChartGaugeDetailAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/radar/RadarTableContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/radar/RadarTableDataPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/radar/VanChartRadarXAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/radar/VanChartRadarYAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/radar/VanChartXAxisScrollPaneWithRadar.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/radar/VanChartYAxisScrollPaneWithRadar.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/axis/scatter/VanChartDoubleValueAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/AlertLineListControlPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/BackgroundListControlPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/BackgroundNameObjectCreator.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/ChartNameObjectCreator.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/VanChartAlertValuePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/VanChartAreaBackgroundPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/VanChartAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/VanChartAxisAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/VanChartCustomIntervalBackgroundPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/radar/VanChartRadarAlertValuePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/radar/VanChartRadarAxisAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/background/radar/VanChartRadarCustomIntervalBackgroundPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/datasheet/VanChartDataSheetPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/datasheet/VanchartDataSheetNoCheckPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/label/VanChartGaugePlotLabelPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/label/VanChartGaugeValueLabelDetailPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/label/VanChartLabelPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/label/VanChartPlotLabelNoCheckPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/label/VanChartPlotLabelPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/series/StackedAndAxisNameObjectCreator.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/series/VanChartEffectPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/series/VanChartSeriesConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/series/VanChartStackedAndAxisListControlPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/tooltip/VanChartPlotRefreshTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipNoCheckPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/style/tooltip/VanChartTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/DrillMapIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/data/VanChartDrillMapContentsPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/data/VanChartDrillMapDataPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/data/VanChartMapLayerAndDataTabPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/data/comp/DrillMapDataPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/data/comp/DrillMapLayerPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/data/comp/EachLayerDataDefinitionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/data/comp/MapDataTree.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/data/comp/SingleLayerDataDefinitionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/other/VanChartCatalogHyperLinkPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/other/VanChartDrillMapInteractivePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/other/VanChartDrillMapOtherPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/designer/type/VanChartDrillMapPlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/images/area-map.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/images/custom-map.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/drillmap/images/point-map.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/funnel/designer/FunnelIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/funnel/designer/other/VanChartFunnelConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/funnel/designer/style/FunnelPercentFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/funnel/designer/style/VanChartFunnelLabelContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/funnel/designer/style/VanChartFunnelRefreshTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/funnel/designer/style/VanChartFunnelSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/funnel/designer/style/VanChartFunnelTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/funnel/designer/type/VanChartFunnelTypePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/funnel/images/funnel.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/GanttIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/VanChartGanttContentsPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/VanChartGanttDataAndLinkPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/VanChartGanttDataPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/data/GanttDataPaneHelper.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/data/GanttPlotReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/data/GanttPlotTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/data/component/ComboBoxWithButtonPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/data/component/GanttReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/data/component/GanttReportDataProjectPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/data/component/GanttTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/data/component/GanttTableDataProjectPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/data/component/TinyFormulaWithButtonPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/link/GanttLinkReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/link/GanttLinkReportDataPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/link/GanttLinkTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/data/link/GanttLinkTableDataPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/other/VanChartGanttConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/other/VanChartGanttInteractivePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/style/VanChartGanttLabelContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/style/VanChartGanttStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/style/axis/GanttAxisStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/style/axis/GanttProcessAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/style/axis/GanttTimeAxisPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/style/series/VanChartGanttCommonMarkerPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/style/series/VanChartImageMarkerWithoutWidthAndHeightPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttPlotTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/designer/type/VanChartGanttPlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gantt/images/gantt.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gauge/GaugeIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gauge/VanChartGaugePlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gauge/VanChartGaugePlotRefreshTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gauge/VanChartGaugePlotTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gauge/VanChartGaugeSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gauge/VanChartGaugeStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gauge/images/cuvette.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gauge/images/pointer.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gauge/images/pointer_180.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gauge/images/ring.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/gauge/images/slot.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/heatmap/designer/HeatMapIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/heatmap/designer/other/VanChartHeatMapConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/heatmap/designer/style/VanChartHeatMapSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapSourceChoosePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/heatmap/images/heatmap.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/layout/VanChartCardLayoutPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/line/LineIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/line/VanChartLineConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/line/VanChartLineCustomStackAndAxisConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/line/VanChartLinePlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/line/VanChartLineSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/line/images/custom.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/line/images/line.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/line/images/stack.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/MapIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/VanChartMapSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/VanChartGroupPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/VanMapAreaAndPointGroupPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/VanMapAreaPointAndLineGroupPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/CustomMapChartDataContentsPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/MapDataPaneHelper.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/VanChartMapDataPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/LongitudeLatitudeAndArea.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/SeriesNameUseFieldNamePaneWithOutFilter.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/SeriesNameUseFieldValuePaneWithOutFilter.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/SeriesTypeUseComboxPaneWithOutFilter.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/report/AbstractLongLatAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/report/AreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/report/LineMapAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/report/LineMapLongLatAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/report/LongLatAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/report/PointMapAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/report/PointMapLongLatAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/table/AbstractLongLatAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/table/AreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/table/LineMapAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/table/LineMapLongLatAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/table/LongLatAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/table/PointMapAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/component/table/PointMapLongLatAreaPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/contentpane/report/VanAreaMapPlotReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/contentpane/report/VanLineMapPlotReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/contentpane/report/VanPointMapPlotReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/contentpane/table/VanAreaMapPlotTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/contentpane/table/VanLineMapPlotTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/VanChartMapConditionAttrContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/VanChartMapConditionAttrPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/VanChartMapHyperLinkPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/VanChartMapInteractivePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/VanChartMapOtherPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/VanChartLineMapConditionSelectionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/VanChartMapConditionSelectionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/item/VanChartBorderWithAlphaConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/item/VanChartBubbleMarkerConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/item/VanChartCommonMarkerConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/item/VanChartImageMarkerConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/pane/VanChartBubblePointMapConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/pane/VanChartCommonPointMapConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/pane/VanChartDefaultPointMapConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/pane/VanChartImagePointMapConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/pane/VanChartLineMapConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/other/condition/pane/VanChartMapConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/style/VanChartMapStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/style/label/VanChartMapLabelPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/style/series/VanChartMapScatterMarkerPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/style/tooltip/VanChartMapRefreshTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/style/tooltip/VanChartMapTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/style/tooltip/VanChartMapTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/designer/type/VanChartMapSourceChoosePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/images/area-map.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/images/area.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/images/custom-map.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/images/image.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/images/line-map.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/images/mapData.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/images/marker-icon.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/images/marker-iconx2.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/images/point-map.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/images/point.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/line/StartAndEndNameFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/line/VanChartCurvePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/line/VanChartLineMapEffectPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/line/VanChartLineMapPlotTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/line/VanChartLineMapTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/map/server/ChartMapEditorAction.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/MultiPieIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/data/MultiPiePlotReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/data/MultiPiePlotTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/image/multiPie.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/other/VanChartMultiPieConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/other/VanChartMultiPieConditionSelectionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/other/VanChartMultiPiePlotTooltipNoCheckPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/other/VanChartMultiPieTooltipConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/style/MultiPieLevelNameFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/style/MultiPieSeriesNameFormatPaneWithCheckBox.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/style/VanChartMultiPieLabelContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/style/VanChartMultiPiePlotTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/style/VanChartMultiPieSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/style/VanChartMultiPieTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/multilayer/style/VanChartMutiPieRefreshTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/pie/PieIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/pie/RadiusCardLayoutPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/pie/VanChartPieConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/pie/VanChartPiePlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/pie/VanChartPieSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/pie/images/different.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/pie/images/pie.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/pie/images/same.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/radar/RadarIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/radar/VanChartRadarConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/radar/VanChartRadarPlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/radar/VanChartRadarSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/radar/images/radar.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/radar/images/stack.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/range/component/GradualIntervalConfigPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/range/component/GradualLegendPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/range/component/LegendGradientBar.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/range/component/LegendLabelFormatPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/range/component/SectionIntervalConfigPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/range/component/SectionIntervalConfigPaneWithOutNum.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/range/component/SectionLegendPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/ScatterIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/VanChartScatterConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/VanChartScatterLabelContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/VanChartScatterPlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/VanChartScatterPlotTooltipPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/VanChartScatterRefreshTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/VanChartScatterSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/VanChartScatterTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/component/VanChartScatterLineTypeConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/component/VanChartScatterLineTypePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/component/VanChartScatterStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/component/label/VanChartScatterLabelConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelDetailPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelNoCheckPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/component/tooltip/VanChartScatterPlotTooltipNoCheckPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/component/tooltip/VanChartScatterTooltipConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/data/VanChartScatterPlotTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/images/large.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/images/scatter.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/large/VanChartLargeModelMarkerConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/scatter/large/VanChartLargeModelMarkerPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/desinger/StructureIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/desinger/data/StructurePlotReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/desinger/data/StructurePlotTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/desinger/other/VanChartStructureConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/desinger/style/StructureNodeStylePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/desinger/style/VanChartStructureLabelContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/desinger/style/VanChartStructureRefreshTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/desinger/style/VanChartStructureSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/desinger/style/VanChartStructureTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/desinger/type/VanChartStructureTypePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/images/horizontal.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/images/radial.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/structure/images/vertical.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/treemap/TreeMapIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/treemap/VanChartTreeMapPlotPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/treemap/images/treeMap.png (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/treemap/style/VanChartTreeMapSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/vanchart/AbstractIndependentVanChartUI.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/vanchart/AbstractMultiCategoryVanChartUI.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/wordcloud/designer/WordCloudIndependentVanChartInterface.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/wordcloud/designer/data/WordCloudPlotReportDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/wordcloud/designer/data/WordCloudPlotTableDataContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/wordcloud/designer/other/VanChartWordCloudConditionPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudRefreshTootipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudSeriesPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudTooltipContentPane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/wordcloud/designer/type/VanChartWordCloudTypePane.java (100%) rename {designer_chart => designer-chart}/src/com/fr/van/chart/wordcloud/images/wordcloud.png (100%) create mode 100644 designer-form/.gitignore create mode 100644 designer-form/build.form.gradle rename {designer_form => designer-form}/clean.gradle (100%) rename {designer_form => designer-form}/src/com/fr/aspectj/designerform/TemplateProcessTracker.aj (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/AdapterBus.java create mode 100644 designer-form/src/com/fr/design/designer/beans/ComponentAdapter.java create mode 100644 designer-form/src/com/fr/design/designer/beans/ConnectorCreator.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/ConstraintsGroupModel.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/HoverPainter.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/Incremental.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/LayoutAdapter.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/Painter.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/actions/ChangeNameAction.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/actions/ConnectionAction.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/actions/CopyAction.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/actions/CutAction.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/actions/FormDeleteAction.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/actions/FormEditAction.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/actions/FormUndoableAction.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/actions/MoveDownAction.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/actions/MoveToBottomAction.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/actions/MoveToTopAction.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/actions/MoveUpAction.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/actions/PasteAction.java create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/component/CompositeComponentAdapter.java create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/AbsoluteLayoutAdapter.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/adapters/layout/AbstractAnchorPainter.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/adapters/layout/AbstractLayoutAdapter.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/DefaultLayoutAdapter.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteBodyLayoutAdapter.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/adapters/layout/FRBodyLayoutAdapter.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRBorderLayoutAdapter.java create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRCardLayoutAdapter.java create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/adapters/layout/FRFormLayoutAdapter.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRGridLayoutAdapter.java create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRHorizontalLayoutAdapter.java create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRHorizontalSplitLayoutAdapter.java create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRParameterLayoutAdapter.java create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRScaleLayoutAdapter.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRTitleLayoutAdapter.java create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRVerticalLayoutAdapter.java create mode 100644 designer-form/src/com/fr/design/designer/beans/adapters/layout/FRVerticalSplitLayoutAdapter.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/events/CreatorEventListenerTable.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/events/DesignerEditListener.java create mode 100644 designer-form/src/com/fr/design/designer/beans/events/DesignerEditor.java create mode 100644 designer-form/src/com/fr/design/designer/beans/events/DesignerEvent.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/location/AccessDirection.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/location/Add.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/Bottom.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/Direction.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/Inner.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/Left.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/LeftBottom.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/LeftTop.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/Location.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/Outer.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/Right.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/RightBottom.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/RightTop.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/RootResizeDirection.java create mode 100644 designer-form/src/com/fr/design/designer/beans/location/Top.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/models/AddingModel.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/models/SelectionModel.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/models/StateModel.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/painters/AbstractPainter.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/painters/FRAbsoluteLayoutPainter.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/painters/FRBorderLayoutPainter.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/painters/FRBoxLayoutPainter.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/painters/FRFitLayoutPainter.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/painters/FRGridLayoutAnchorPainter.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/painters/FRGridLayoutPainter.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/beans/painters/FRHorizontalLayoutPainter.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/painters/FRParameterLayoutPainter.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/painters/FRVerticalLayoutPainter.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/beans/painters/NullLayoutPainter.java rename {designer_form => designer-form}/src/com/fr/design/designer/beans/painters/NullPainter.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/CRPropertyDescriptorPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/DedicateLayoutContainer.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/ErrorCreator.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/FormCardPane.java create mode 100644 designer-form/src/com/fr/design/designer/creator/NullCreator.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/PropertyGroupPane.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XAbstractSplitLayout.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XButton.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XChartEditor.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XCheckBox.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XCheckBoxGroup.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XComboBox.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XComboCheckBox.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XComponent.java create mode 100644 designer-form/src/com/fr/design/designer/creator/XConnector.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XCreator.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XCreatorTools.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XCreatorUtils.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XCustomWriteAbleRepeatEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XDataTable.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XDateEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XDirectWriteEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XEditorHolder.java create mode 100644 designer-form/src/com/fr/design/designer/creator/XElementCase.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XFieldEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XFileUploader.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XIframeEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XLabel.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XLayoutContainer.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XListEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XMultiFileUploader.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XNameWidget.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XNumberEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XPassword.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XRadio.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XRadioGroup.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XTableEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XTableTree.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XTextArea.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XTextEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XTreeComboBoxEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XTreeEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XWAbsoluteLayout.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XWBorderLayout.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XWFitLayout.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XWGridLayout.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XWHorizontalBoxLayout.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XWHorizontalSplitLayout.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XWParameterLayout.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XWScaleLayout.java create mode 100644 designer-form/src/com/fr/design/designer/creator/XWTitleLayout.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XWVerticalBoxLayout.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XWVerticalSplitLayout.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XWidgetCreator.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/XWrapperedFieldEditor.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/XWriteAbleRepeatEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/cardlayout/TabMoveAction.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/cardlayout/TabMoveCustomAction.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/cardlayout/TabMoveEndAction.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/cardlayout/TabMoveFirstAction.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/cardlayout/TabMoveNextAction.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/creator/cardlayout/TabMovePrevAction.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/cardlayout/XCardAddButton.java create mode 100644 designer-form/src/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java rename {designer_form => designer-form}/src/com/fr/design/designer/creator/cardlayout/XWCardLayout.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java create mode 100644 designer-form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java create mode 100644 designer-form/src/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java create mode 100644 designer-form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/AbsoluteStateRenderer.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/AbsoluteStateWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/BodyLayoutAttrRenderer.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/properties/BoundsGroupModel.java create mode 100644 designer-form/src/com/fr/design/designer/properties/CardDefaultShowEditor.java create mode 100644 designer-form/src/com/fr/design/designer/properties/CardDefaultShowRenderer.java create mode 100644 designer-form/src/com/fr/design/designer/properties/CardDefaultShowWrapper.java create mode 100644 designer-form/src/com/fr/design/designer/properties/CardLayoutConstraints.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/CardLayoutPropertiesGroupModel.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/properties/DelegateEditor.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/EnumerationEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/EventPropertyTable.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/FRAbsoluteLayoutPropertiesGroupModel.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/FRBorderConstraintsEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/FRBorderLayoutConstraints.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/FRBorderLayoutConstraintsRenderer.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/FRBorderLayoutPropertiesGroupModel.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/properties/FRCardConstraintsEditor.java create mode 100644 designer-form/src/com/fr/design/designer/properties/FRFitLayoutConstraints.java create mode 100644 designer-form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/FRFormLayoutPropertiesGroupModel.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/FRGridLayoutPropertiesGroupModel.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/properties/FRTabFitLayoutPropertiesGroupModel.java create mode 100644 designer-form/src/com/fr/design/designer/properties/FitStateRenderer.java create mode 100644 designer-form/src/com/fr/design/designer/properties/FitStateWrapper.java create mode 100644 designer-form/src/com/fr/design/designer/properties/FormWidgetAuthorityEditPane.java create mode 100644 designer-form/src/com/fr/design/designer/properties/HVLayoutConstraints.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/HorizontalAlignmentEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/HorizontalAlignmentRenderer.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/HorizontalAlignmentWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/HorizontalLayoutConstraints.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/HorizontalLayoutPropertiesGroupModel.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/properties/HorizontalSplitProperties.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/IconCellEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/ItemWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/LayoutConstraintsEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/LayoutTypeRenderer.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/LayoutTypeWrapper.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/properties/MultiSelectionBoundsModel.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/NameWithListeners.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/properties/VerticalBoxProperties.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/VerticalLayoutConstraints.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/properties/VerticalSplitProperties.java create mode 100644 designer-form/src/com/fr/design/designer/properties/WidgetPropertyTable.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/items/FRAbsoluteConstraintsItems.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/items/FRBorderConstraintsItems.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/properties/items/FRFitConstraintsItems.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/items/FRLayoutTypeItems.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/items/HorizontalAlignmentItems.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/items/Item.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/items/ItemProvider.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/properties/items/LabelHorizontalAlignmentItems.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/items/LayoutIndexItems.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/properties/items/UnderlineItems.java create mode 100644 designer-form/src/com/fr/design/designer/properties/items/WidgetDisplayPositionItems.java rename {designer_form => designer-form}/src/com/fr/design/designer/properties/mobile/BodyAppRelayoutTable.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/mobile/BodyMobilePropertyUI.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/mobile/BooleanRender.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/mobile/ElementCasePropertyTable.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/mobile/ElementCasePropertyUI.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/mobile/MobileFitAlignmentItems.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/mobile/MobileFitEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/mobile/MobileFitRender.java (100%) rename {designer_form => designer-form}/src/com/fr/design/designer/properties/mobile/MobileFitWrapper.java (100%) create mode 100644 designer-form/src/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java create mode 100644 designer-form/src/com/fr/design/designer/treeview/ComponentTreeModel.java rename {designer_form => designer-form}/src/com/fr/design/form/images/add.png (100%) rename {designer_form => designer-form}/src/com/fr/design/form/images/delete icon.png (100%) rename {designer_form => designer-form}/src/com/fr/design/form/images/delete_hover&click.png (100%) rename {designer_form => designer-form}/src/com/fr/design/form/images/delete_normal.png (100%) rename {designer_form => designer-form}/src/com/fr/design/form/images/download icon.png (100%) rename {designer_form => designer-form}/src/com/fr/design/form/images/download.png (100%) rename {designer_form => designer-form}/src/com/fr/design/form/images/install icon.png (100%) rename {designer_form => designer-form}/src/com/fr/design/form/images/marked.png (100%) rename {designer_form => designer-form}/src/com/fr/design/form/images/refresh.png (100%) rename {designer_form => designer-form}/src/com/fr/design/form/images/showmenu.png (100%) rename {designer_form => designer-form}/src/com/fr/design/form/images/unmarked.png (100%) create mode 100644 designer-form/src/com/fr/design/form/javascript/FormEmailPane.java create mode 100644 designer-form/src/com/fr/design/form/layout/FRAbsoluteLayout.java rename {designer_form => designer-form}/src/com/fr/design/form/layout/FRBorderLayout.java (100%) rename {designer_form => designer-form}/src/com/fr/design/form/layout/FRCardLayout.java (100%) create mode 100644 designer-form/src/com/fr/design/form/layout/FRFitLayout.java create mode 100644 designer-form/src/com/fr/design/form/layout/FRFlowLayout.java rename {designer_form => designer-form}/src/com/fr/design/form/layout/FRFormLayout.java (100%) rename {designer_form => designer-form}/src/com/fr/design/form/layout/FRGridLayout.java (100%) rename {designer_form => designer-form}/src/com/fr/design/form/layout/FRHorizontalLayout.java (100%) create mode 100644 designer-form/src/com/fr/design/form/layout/FRHorizontalSplitLayout.java rename {designer_form => designer-form}/src/com/fr/design/form/layout/FRLayoutManager.java (100%) rename {designer_form => designer-form}/src/com/fr/design/form/layout/FRPolyReportLayout.java (100%) create mode 100644 designer-form/src/com/fr/design/form/layout/FRScaleLayout.java create mode 100644 designer-form/src/com/fr/design/form/layout/FRSplitLayout.java create mode 100644 designer-form/src/com/fr/design/form/layout/FRTitleLayout.java rename {designer_form => designer-form}/src/com/fr/design/form/layout/FRVerticalLayout.java (100%) create mode 100644 designer-form/src/com/fr/design/form/layout/FRVerticalSplitLayout.java rename {designer_form => designer-form}/src/com/fr/design/form/mobile/FormMobileAttrPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/form/mobile/MobileToolBarPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/form/parameter/FormParaDesigner.java (100%) create mode 100644 designer-form/src/com/fr/design/form/parameter/FormParaTargetMode.java rename {designer_form => designer-form}/src/com/fr/design/form/parameter/RootDesignGroupModel.java (100%) rename {designer_form => designer-form}/src/com/fr/design/form/parameter/XFormSubmit.java (100%) rename {designer_form => designer-form}/src/com/fr/design/form/util/XCreatorConstants.java (100%) create mode 100644 designer-form/src/com/fr/design/gui/core/FormWidgetOption.java create mode 100644 designer-form/src/com/fr/design/gui/xpane/CardTagLayoutBorderPane.java create mode 100644 designer-form/src/com/fr/design/gui/xpane/CardTagLayoutBorderPreviewPane.java create mode 100644 designer-form/src/com/fr/design/gui/xpane/FormHyperlinkGroupPane.java rename {designer_form => designer-form}/src/com/fr/design/gui/xpane/FormHyperlinkGroupPaneNoPop.java (100%) create mode 100644 designer-form/src/com/fr/design/gui/xpane/JTreeAutoBuildPane.java create mode 100644 designer-form/src/com/fr/design/gui/xpane/LayoutBorderPane.java create mode 100644 designer-form/src/com/fr/design/gui/xpane/LayoutBorderPreviewPane.java create mode 100644 designer-form/src/com/fr/design/gui/xpane/ToolTipEditor.java rename {designer_form => designer-form}/src/com/fr/design/gui/xtable/AbstractPropertyGroupModel.java (100%) create mode 100644 designer-form/src/com/fr/design/gui/xtable/PropertyGroupModel.java rename {designer_form => designer-form}/src/com/fr/design/gui/xtable/ReportAppPropertyGroupModel.java (100%) rename {designer_form => designer-form}/src/com/fr/design/gui/xtable/TableUtils.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/AutoScrollSource.java create mode 100644 designer-form/src/com/fr/design/mainframe/ComponentTree.java create mode 100644 designer-form/src/com/fr/design/mainframe/ConnectorHelper.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/CoverPane.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/CoverReportPane.java create mode 100644 designer-form/src/com/fr/design/mainframe/DesignerTransferHandler.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/EditingMouseListener.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/ElementCaseHelpDialog.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/ElementCaseThumbnail.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/FormArea.java create mode 100644 designer-form/src/com/fr/design/mainframe/FormCreatorDropTarget.java create mode 100644 designer-form/src/com/fr/design/mainframe/FormDesigner.java create mode 100644 designer-form/src/com/fr/design/mainframe/FormDesignerDropTarget.java create mode 100644 designer-form/src/com/fr/design/mainframe/FormDesignerModeForSpecial.java create mode 100644 designer-form/src/com/fr/design/mainframe/FormDesignerUI.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/FormDockView.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/FormEditToolBar.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/FormEditorKeyListener.java create mode 100644 designer-form/src/com/fr/design/mainframe/FormHierarchyTreePane.java create mode 100644 designer-form/src/com/fr/design/mainframe/FormModelAdapter.java create mode 100644 designer-form/src/com/fr/design/mainframe/FormParaPane.java create mode 100644 designer-form/src/com/fr/design/mainframe/FormParaWidgetPane.java create mode 100644 designer-form/src/com/fr/design/mainframe/FormSelection.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/FormSelectionUtils.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/FormSettingToolBar.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/FormTargetMode.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/FormToolBar.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/FormToolBarButton.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/FormToolBarPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/FormUndoState.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/FormWebWidgetConstants.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/FormWidgetDetailPane.java create mode 100644 designer-form/src/com/fr/design/mainframe/FormWidgetPopWindow.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/JForm.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/MobileParaWidgetTable.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/MobileWidgetTable.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/ShareWidgetButton.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/ShareWidgetPane.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/TabChangeAction.java create mode 100644 designer-form/src/com/fr/design/mainframe/ToolBarButton.java create mode 100644 designer-form/src/com/fr/design/mainframe/TreeTransferHandler.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/WLayoutSelectionPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/WidgetPropertyPane.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/WidgetToolBarPane.java create mode 100644 designer-form/src/com/fr/design/mainframe/actions/EmbeddedFormExportExportAction.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/actions/FormMobileAttrAction.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/actions/NewFormAction.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/actions/TemplateParameterAction.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/UITreeComboBox.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/accessibles/AccessibleCardTagWLayoutBorderStyleEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/accessibles/AccessibleColorEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/accessibles/AccessibleDateEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/accessibles/AccessibleDimensionEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/accessibles/AccessibleElementCaseToolBarEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/accessibles/AccessibleFontEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/accessibles/AccessibleFormulaEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/accessibles/AccessibleGridWidgetEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/accessibles/AccessibleParameterEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/accessibles/AccessiblePropertyCellEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/accessibles/AccessiblePropertyEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/accessibles/AccessibleRegexEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/accessibles/AccessibleWLayoutBorderStyleEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/accessibles/AccessibleWidgetValueEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/accessibles/AccessilePaddingMarginEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/accessibles/ColorIcon.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/accessibles/ColorPalette.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/AbsoluteLayoutDirectionEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/AdjustModeEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/BackgroundEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/BooleanEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/BorderLayoutDirectionEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/ButtonTypeEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/CardTagWLayoutBorderStyleEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/ColorEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/ColorTextField.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/ComboEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/DataTableConfigPane.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/DateFormatEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/DateRangeEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/DecorationEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/DictionaryEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/DimensionEditingPane.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/DimensionEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/DoubleEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/ElementCaseToolBarEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/ElementCaseToolBarPane.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/FitLayoutDirectionEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/FloatEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/FontEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/FormulaEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/IconEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/ImgBackgroundEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/InChangeBooleanEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/ItemCellEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/LayoutTypeEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/LongEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/NameWidgetComboboxEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/PaddingMarginEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/PaddingMarginPane.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/ParameterEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/PercentageEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/RefinedDoubleEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/RegexEditor.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/ShortCutTextEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/SpinnerMaxNumberEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/SpinnerMinNumberEditor.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/editors/SpinnerNumberEditor.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/TreeModelEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/WLayoutBorderStyleEditor.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/editors/WidgetDisplayPosition.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/renderer/BackgroundRenderer.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/ColorCellRenderer.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/DateCellRenderer.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/renderer/DictionaryRenderer.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/DimensionCellRenderer.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/EncoderCellRenderer.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/FontCellRenderer.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/GridWidgetRenderer.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/renderer/HyperlinkGroupRenderer.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/LabelHorizontalAlignmentRenderer.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/renderer/LayoutBorderStyleRenderer.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/renderer/PaddingMarginCellRenderer.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/ParameterRenderer.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/PointCellRenderer.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/PropertyCellRenderer.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/RectangleCellRenderer.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/RegexCellRencerer.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/TreeModelRenderer.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/renderer/WidgetDisplayPositionRender.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/ui/BasicSetVisiblePropertyPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/ui/FormBasicPropertyPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/ui/FormBasicWidgetPropertyPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/ui/FormWidgetCardPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/ui/WidgetBasicPropertyPaneFactory.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/ColorWrapper.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/DSColumnWrapper.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/DateWrapper.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/DimensionWrapper.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/ElementCaseToolBarWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/EventHandlerWrapper.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/FontWrapper.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/FormulaWrapper.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/GridWidgetWrapper.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/HyperlinkGroupWrapper.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/LabelHorizontalAlignmentWrapper.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/LayoutBorderStyleWrapper.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/PaddingMarginWrapper.java (100%) create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/ParameterWrapper.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/PointWrapper.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/RectangleWrapper.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/RegexWrapper.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/WidgetDisplayPositionWrapper.java create mode 100644 designer-form/src/com/fr/design/mainframe/widget/wrappers/WrapperUtils.java rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/primitive/BooleanWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/primitive/ByteWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/primitive/CharWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/primitive/DoubleWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/primitive/FloatWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/primitive/IntegerWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/primitive/LongWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/primitive/ShortWrapper.java (100%) rename {designer_form => designer-form}/src/com/fr/design/mainframe/widget/wrappers/primitive/StringWrapper.java (100%) create mode 100644 designer-form/src/com/fr/design/module/FormDesignerModule.java rename {designer_form => designer-form}/src/com/fr/design/parameter/FormParameterReader.java (100%) create mode 100644 designer-form/src/com/fr/design/parameter/ParameterPropertyPane.java create mode 100644 designer-form/src/com/fr/design/parameter/ParameterToolBarPane.java rename {designer_form => designer-form}/src/com/fr/design/parameter/RootDesignDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/FormWidgetDefinePaneFactoryBase.java (100%) create mode 100644 designer-form/src/com/fr/design/widget/ui/btn/FormSubmitButtonDetailPane.java rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/AbstractDataModify.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/ButtonDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/ButtonGroupDictPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/CheckBoxDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/CheckBoxGroupDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/ComboBoxDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/ComboCheckBoxDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/CustomWritableRepeatEditorPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/DateEditorDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/DefaultWidgetDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/DictEditorDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/DirectWriteEditorDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/FieldEditorDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/FreeButtonDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/IframeEditorDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/LabelDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/MultiFileEditorPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/NoneWidgetDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/NumberEditorDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/ParameterTreeComboBox.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/PasswordDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/RadioDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/RadioGroupDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/TextAreaDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/TextFieldEditorDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/TreeComboBoxEditorDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/TreeEditorDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/UserEditorDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/WaterMarkDictPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/WidgetDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/WritableRepeatEditorPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/WriteUnableRepeatEditorPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/btn/ButtonGroupDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/component/FontSizeComboPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/component/FormWidgetValuePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/component/PaddingBoundPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/component/TabFitLayoutBackgroundPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/component/UIBoundSpinner.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/component/WidgetAbsoluteBoundPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/component/WidgetBoundPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/component/WidgetCardTagBoundPane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/layout/BorderStyleWidgetDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/layout/ElementEditorDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/layout/FRAbsoluteBodyLayoutDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/layout/FRAbsoluteLayoutDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/layout/WCardLayoutDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/layout/WTabFitLayoutDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/layout/WTitleLayoutDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/mobile/ElementCaseDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/design/widget/ui/designer/mobile/MobileWidgetDefinePane.java (100%) rename {designer_form => designer-form}/src/com/fr/start/Designer4Form.java (100%) create mode 100644 designer-realize/.gitignore rename {designer => designer-realize}/src/com/fr/aspectj/designer/TemplateProcessTracker.aj (100%) create mode 100644 designer-realize/src/com/fr/design/actions/ButtonGroupAction.java rename {designer => designer-realize}/src/com/fr/design/actions/CellSelectionAction.java (100%) rename {designer => designer-realize}/src/com/fr/design/actions/ElementCaseAction.java (100%) rename {designer => designer-realize}/src/com/fr/design/actions/FloatSelectionAction.java (100%) rename {designer => designer-realize}/src/com/fr/design/actions/JWorkBookAction.java (100%) create mode 100644 designer-realize/src/com/fr/design/actions/PresentCheckBoxAction.java rename {designer => designer-realize}/src/com/fr/design/actions/ReportComponentAction.java (100%) rename {designer => designer-realize}/src/com/fr/design/actions/SelectionListenerAction.java (100%) create mode 100644 designer-realize/src/com/fr/design/actions/cell/AbstractCellElementAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/BorderAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/CellAttributeAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/CellAttributeTableAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/CellExpandAttrAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/CellWidgetAttrAction.java rename {designer => designer-realize}/src/com/fr/design/actions/cell/CleanAuthorityAction.java (100%) rename {designer => designer-realize}/src/com/fr/design/actions/cell/ConditionAttributesAction.java (100%) create mode 100644 designer-realize/src/com/fr/design/actions/cell/EditCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/FloatStyleAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/GlobalStyleMenuDef.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/NewPresentAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/StyleAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/UIToolbarBorderButton.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/style/AbstractStyleAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/style/AlignmentAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/style/ReportFontBoldAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/style/ReportFontForegroundAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/style/ReportFontItalicAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/style/ReportFontNameAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/style/ReportFontSizeAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/style/ReportFontUnderlineAction.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/style/StyleActionInterface.java create mode 100644 designer-realize/src/com/fr/design/actions/cell/style/StyleBackgroundAction.java rename {designer => designer-realize}/src/com/fr/design/actions/columnrow/AbstractColumnRowIndexAction.java (100%) create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/CancelColumnAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/CancelRowAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/ColumnHideAction.java rename {designer => designer-realize}/src/com/fr/design/actions/columnrow/ColumnRowRepeatAction.java (100%) rename {designer => designer-realize}/src/com/fr/design/actions/columnrow/ColumnRowSizingAction.java (100%) create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/ColumnWidthAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/DSColumnAdvancedAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/DSColumnBasicAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/DSColumnConditionAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/DeleteColumnAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/DeleteRowAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/FootColumnAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/FootRowAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/HeadColumnAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/HeadRowAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/InsertColumnAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/InsertRowAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/ResetColumnHideAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/ResetRowHideAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/RowHeightAction.java create mode 100644 designer-realize/src/com/fr/design/actions/columnrow/RowHideAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/DeleteAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/EditFloatElementNameAction.java rename {designer => designer-realize}/src/com/fr/design/actions/edit/HyperlinkAction.java (100%) rename {designer => designer-realize}/src/com/fr/design/actions/edit/clear/ClearAction.java (100%) create mode 100644 designer-realize/src/com/fr/design/actions/edit/clear/ClearAllAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/clear/ClearContentsAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/clear/ClearFormatsAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/clear/ClearWidgetAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/merge/MergeCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/merge/UnmergeCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/order/AbstractFloatElementOrderAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/order/BringFloatElementForwardAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/order/BringFloatElementToFrontAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/order/SendFloatElementBackwardAction.java create mode 100644 designer-realize/src/com/fr/design/actions/edit/order/SendFloatElementToBackAction.java create mode 100644 designer-realize/src/com/fr/design/actions/file/export/AbstractExcelExportAction.java create mode 100644 designer-realize/src/com/fr/design/actions/file/export/AbstractExportAction.java create mode 100644 designer-realize/src/com/fr/design/actions/file/export/CSVExportAction.java create mode 100644 designer-realize/src/com/fr/design/actions/file/export/EmbeddedExportExportAction.java rename {designer => designer-realize}/src/com/fr/design/actions/file/export/ExcelExportAction.java (100%) create mode 100644 designer-realize/src/com/fr/design/actions/file/export/PDFExportAction.java create mode 100644 designer-realize/src/com/fr/design/actions/file/export/PageExcelExportAction.java create mode 100644 designer-realize/src/com/fr/design/actions/file/export/PageToSheetExcelExportAction.java create mode 100644 designer-realize/src/com/fr/design/actions/file/export/SVGExportAction.java create mode 100644 designer-realize/src/com/fr/design/actions/file/export/TextExportAction.java create mode 100644 designer-realize/src/com/fr/design/actions/file/export/WordExportAction.java rename {designer => designer-realize}/src/com/fr/design/actions/file/newReport/NewOEMWorkBookAction.java (100%) rename {designer => designer-realize}/src/com/fr/design/actions/file/newReport/NewPolyReportAction.java (100%) create mode 100644 designer-realize/src/com/fr/design/actions/file/newReport/NewWorkBookAction.java create mode 100644 designer-realize/src/com/fr/design/actions/form/AbastractFormECAction.java create mode 100644 designer-realize/src/com/fr/design/actions/form/FormECBackgroundAction.java create mode 100644 designer-realize/src/com/fr/design/actions/form/FormECColumnsAction.java create mode 100644 designer-realize/src/com/fr/design/actions/form/FormECFrozenAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/cell/AbstractCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/cell/BiasCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/cell/ChartCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/cell/DSColumnCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/cell/FormulaCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/cell/GeneralCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/cell/ImageCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/cell/RichTextCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/cell/SubReportCellAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/flot/AbstractShapeAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/flot/ChartFloatAction.java rename {designer => designer-realize}/src/com/fr/design/actions/insert/flot/FormulaFloatAction.java (100%) create mode 100644 designer-realize/src/com/fr/design/actions/insert/flot/ImageFloatAction.java create mode 100644 designer-realize/src/com/fr/design/actions/insert/flot/TextBoxFloatAction.java create mode 100644 designer-realize/src/com/fr/design/actions/report/ReportBackgroundAction.java create mode 100644 designer-realize/src/com/fr/design/actions/report/ReportColumnsAction.java create mode 100644 designer-realize/src/com/fr/design/actions/report/ReportEngineAttrAction.java create mode 100644 designer-realize/src/com/fr/design/actions/report/ReportExportAttrAction.java create mode 100644 designer-realize/src/com/fr/design/actions/report/ReportFooterAction.java create mode 100644 designer-realize/src/com/fr/design/actions/report/ReportHeaderAction.java rename {designer => designer-realize}/src/com/fr/design/actions/report/ReportMobileAttrAction.java (100%) create mode 100644 designer-realize/src/com/fr/design/actions/report/ReportPageAttrAction.java create mode 100644 designer-realize/src/com/fr/design/actions/report/ReportPageSetupAction.java create mode 100644 designer-realize/src/com/fr/design/actions/report/ReportParameterAction.java create mode 100644 designer-realize/src/com/fr/design/actions/report/ReportWebAttrAction.java create mode 100644 designer-realize/src/com/fr/design/actions/report/ReportWriteAttrAction.java create mode 100644 designer-realize/src/com/fr/design/actions/server/ServerConfigManagerAction.java create mode 100644 designer-realize/src/com/fr/design/actions/server/StyleListAction.java create mode 100644 designer-realize/src/com/fr/design/actions/server/StyleManagerPane.java create mode 100644 designer-realize/src/com/fr/design/actions/server/WidgetManagerAction.java create mode 100644 designer-realize/src/com/fr/design/actions/utils/DeprecatedActionManager.java rename {designer => designer-realize}/src/com/fr/design/actions/utils/ReportActionUtils.java (100%) rename {designer => designer-realize}/src/com/fr/design/cell/bar/BarHelper.java (100%) create mode 100644 designer-realize/src/com/fr/design/cell/bar/DynamicScrollBar.java create mode 100644 designer-realize/src/com/fr/design/cell/bar/DynamicScrollBarUI.java create mode 100644 designer-realize/src/com/fr/design/cell/bar/DynamicScrollButton.java create mode 100644 designer-realize/src/com/fr/design/cell/bar/ScrollBarUIConstant.java create mode 100644 designer-realize/src/com/fr/design/cell/clipboard/CellElementsClip.java create mode 100644 designer-realize/src/com/fr/design/cell/clipboard/ElementsTransferable.java create mode 100644 designer-realize/src/com/fr/design/cell/clipboard/FloatElementsClip.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/AbstractCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/AbstractFloatEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/BiasTextPainterCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/CellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/ChartCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/ChartFloatEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/ComboBoxCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/DSColumnCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/DateCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/FloatEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/FormulaCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/FormulaFloatEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/GeneralCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/GeneralFloatEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/ImageCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/ImageFloatEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/RichTextCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/RichTextToolBar.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/SubReportCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/TextCellEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/TextFloatEditor.java create mode 100644 designer-realize/src/com/fr/design/cell/editor/package.html create mode 100644 designer-realize/src/com/fr/design/cell/smartaction/AbstractSmartJTablePaneAction.java create mode 100644 designer-realize/src/com/fr/design/cell/smartaction/SmartJTablePane.java create mode 100644 designer-realize/src/com/fr/design/cell/smartaction/SmartJTablePaneAction.java rename {designer => designer-realize}/src/com/fr/design/condition/BackPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/condition/BorderHighlightPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/condition/ColumnWidthPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/condition/FontPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/condition/ForeGroundPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/condition/HighLightConditionAttributesPane.java rename {designer => designer-realize}/src/com/fr/design/condition/HyperlinkPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/condition/NewRealValuePane.java (100%) rename {designer => designer-realize}/src/com/fr/design/condition/PaddingPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/condition/PagePane.java (100%) rename {designer => designer-realize}/src/com/fr/design/condition/PresentHighlightPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/condition/RowHeightPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/condition/WHPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/condition/WidgetHighlightPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/dscolumn/DSColumnAdvancedPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/dscolumn/DSColumnBasicPane.java create mode 100644 designer-realize/src/com/fr/design/dscolumn/DSColumnConditionsPane.java create mode 100644 designer-realize/src/com/fr/design/dscolumn/DSColumnPane.java create mode 100644 designer-realize/src/com/fr/design/dscolumn/ResultSetGroupDockingPane.java create mode 100644 designer-realize/src/com/fr/design/dscolumn/ResultSetGroupPane.java create mode 100644 designer-realize/src/com/fr/design/dscolumn/ResultSetGroupPopUpPane.java create mode 100644 designer-realize/src/com/fr/design/dscolumn/SelectedConfirmedDataColumnPane.java rename {designer => designer-realize}/src/com/fr/design/dscolumn/SelectedDataColumnPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/dscolumn/SpecifiedGroupAttrPane.java create mode 100644 designer-realize/src/com/fr/design/expand/ConditionParentPane.java rename {designer => designer-realize}/src/com/fr/design/expand/Expand.java (100%) create mode 100644 designer-realize/src/com/fr/design/expand/ExpandDirectionPane.java rename {designer => designer-realize}/src/com/fr/design/expand/ExpandFatherPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/expand/ExpandLeftFatherPane.java create mode 100644 designer-realize/src/com/fr/design/expand/ExpandUpFatherPane.java create mode 100644 designer-realize/src/com/fr/design/expand/ParentPane.java create mode 100644 designer-realize/src/com/fr/design/expand/SortExpandAttrPane.java create mode 100644 designer-realize/src/com/fr/design/headerfooter/EditFooterPane.java create mode 100644 designer-realize/src/com/fr/design/headerfooter/EditHeaderPane.java create mode 100644 designer-realize/src/com/fr/design/headerfooter/HFAttributesEditDialog.java create mode 100644 designer-realize/src/com/fr/design/headerfooter/HFComponent.java create mode 100644 designer-realize/src/com/fr/design/headerfooter/HFContainer.java create mode 100644 designer-realize/src/com/fr/design/headerfooter/HeaderFooterEditPane.java create mode 100644 designer-realize/src/com/fr/design/headerfooter/HeaderFooterPane.java create mode 100644 designer-realize/src/com/fr/design/headerfooter/ImagePane.java create mode 100644 designer-realize/src/com/fr/design/headerfooter/MoveActionListener.java create mode 100644 designer-realize/src/com/fr/design/javascript/ListenerEditPane.java create mode 100644 designer-realize/src/com/fr/design/mainframe/AbstractAttrPane.java create mode 100644 designer-realize/src/com/fr/design/mainframe/ActiveKeyGenerator.java rename {designer => designer-realize}/src/com/fr/design/mainframe/AuthorityEditToolBarPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/AuthoritySheetEditedPane.java create mode 100644 designer-realize/src/com/fr/design/mainframe/AuthorityToolBarPane.java create mode 100644 designer-realize/src/com/fr/design/mainframe/CellElementPropertyPane.java rename {designer => designer-realize}/src/com/fr/design/mainframe/CellWidgetPropertyPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/ElementCasePane.java rename {designer => designer-realize}/src/com/fr/design/mainframe/ElementCasePaneAuthorityEditPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/ElementCasePaneDelegate.java create mode 100644 designer-realize/src/com/fr/design/mainframe/FormatBrushAction.java rename {designer => designer-realize}/src/com/fr/design/mainframe/HyperlinkGroupPaneActionImpl.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/InformationCollector.java create mode 100644 designer-realize/src/com/fr/design/mainframe/JPolyWorkBook.java create mode 100644 designer-realize/src/com/fr/design/mainframe/JWorkBook.java create mode 100644 designer-realize/src/com/fr/design/mainframe/PolySheetNameTabPane.java create mode 100644 designer-realize/src/com/fr/design/mainframe/RGridLayout.java create mode 100644 designer-realize/src/com/fr/design/mainframe/ReportComponent.java rename {designer => designer-realize}/src/com/fr/design/mainframe/ReportComponentCardPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/ReportComponentComposite.java rename {designer => designer-realize}/src/com/fr/design/mainframe/ReportFloatPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/ReportHyperlinkGroupPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/ReportHyperlinkGroupPaneNoPop.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/SheetAuthorityEditPane.java create mode 100644 designer-realize/src/com/fr/design/mainframe/SheetNameTabPane.java create mode 100644 designer-realize/src/com/fr/design/mainframe/WorkBookModelAdapter.java rename {designer => designer-realize}/src/com/fr/design/mainframe/WorkBookUndoState.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/WorkSheetDesigner.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/AlphaFineConstants.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/AlphaFineHelper.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/CellType.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/cell/model/ActionModel.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/cell/model/AlphaCellModel.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/cell/model/DocumentModel.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/cell/model/FileModel.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/cell/model/MoreModel.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/cell/model/NoResultModel.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/cell/render/TitleCellRender.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/component/AlphaFinePane.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/component/AlphaFineTextField.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine1.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine1@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine2.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine2@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine3.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine3@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine4.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine4@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine5.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine5@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine_close.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/alphafine_close@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/bigloading.gif (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/bigsearch.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/bigsearch@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/check.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/default_product.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/loading.gif (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/no_result.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/no_result@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/noresult.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/noresult@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/open.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/opening.gif (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/opening@2x.gif (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/remind.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/remind_close.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/selected1.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/selected1@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/selected2.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/selected2@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/selected3.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/selected3@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/selected4.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/selected4@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/selected5.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/selected5@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/smallsearch.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/smallsearch@2x.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/images/uncheck.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/listener/ComponentHandler.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/listener/DocumentAdapter.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/model/SearchResult.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/preview/DocumentPreviewPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/preview/FilePreviewPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/preview/NoResultPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/preview/PluginPreviewPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/bbs/BBSConstants.java rename {designer => designer-realize}/src/com/fr/design/mainframe/bbs/BBSDialog.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/bbs/BBSGuestPane.java rename {designer => designer-realize}/src/com/fr/design/mainframe/bbs/BBSLoginDialog.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/bbs/ExitLabel.java create mode 100644 designer-realize/src/com/fr/design/mainframe/bbs/UserInfoLabel.java create mode 100644 designer-realize/src/com/fr/design/mainframe/bbs/UserInfoPane.java create mode 100644 designer-realize/src/com/fr/design/mainframe/bbs/bbs.properties rename {designer => designer-realize}/src/com/fr/design/mainframe/bbs/images/switch.png (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/cell/AbstractDSCellEditorPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/cell/CellElementEditPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/cell/QuickEditorRegion.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/cell/settingpane/AbstractCellAttrPane.java rename {designer => designer-realize}/src/com/fr/design/mainframe/cell/settingpane/CellExpandAttrPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java create mode 100644 designer-realize/src/com/fr/design/mainframe/cell/settingpane/CellPresentPane.java rename {designer => designer-realize}/src/com/fr/design/mainframe/cell/settingpane/CellStylePane.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/cell/settingpane/style/CustomStylePane.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/cell/settingpane/style/PredefinedStylePane.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/cell/settingpane/style/StylePane.java rename {designer => designer-realize}/src/com/fr/design/mainframe/errorinfo/ErrorInfo.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java (100%) rename {designer => designer-realize}/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java (100%) create mode 100644 designer-realize/src/com/fr/design/mainframe/form/FormElementCaseDesigner.java create mode 100644 designer-realize/src/com/fr/design/mainframe/form/FormElementCasePaneDelegate.java create mode 100644 designer-realize/src/com/fr/design/mainframe/form/FormReportComponentComposite.java create mode 100644 designer-realize/src/com/fr/design/mainframe/form/FormTabPane.java rename {designer => designer-realize}/src/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java (100%) rename {designer => designer-realize}/src/com/fr/design/module/DesignerModule.java (100%) rename {designer => designer-realize}/src/com/fr/design/parameter/ParameterDefinitePane.java (100%) rename {designer => designer-realize}/src/com/fr/design/parameter/WorkBookParameterReader.java (100%) rename {designer => designer-realize}/src/com/fr/design/present/BarCodePane.java (100%) create mode 100644 designer-realize/src/com/fr/design/present/CellWriteAttrPane.java create mode 100644 designer-realize/src/com/fr/design/present/ColumnRowTableModel.java create mode 100644 designer-realize/src/com/fr/design/present/ConditionAttributesGroupPane.java rename {designer => designer-realize}/src/com/fr/design/present/CurrencyLinePane.java (100%) rename {designer => designer-realize}/src/com/fr/design/present/PresentPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/present/StyleArrayPane.java rename {designer => designer-realize}/src/com/fr/design/report/BuildInVerifierPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/report/CustomVerifierPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/report/CustomVerifyJobPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/report/ExcelExportPane.java create mode 100644 designer-realize/src/com/fr/design/report/LayerReportPane.java create mode 100644 designer-realize/src/com/fr/design/report/PDFExportPane.java create mode 100644 designer-realize/src/com/fr/design/report/PageSetupPane.java rename {designer => designer-realize}/src/com/fr/design/report/ReportBackgroundPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/report/ReportColumnsPane.java create mode 100644 designer-realize/src/com/fr/design/report/ReportExportAttrPane.java create mode 100644 designer-realize/src/com/fr/design/report/ReportStylePane.java create mode 100644 designer-realize/src/com/fr/design/report/RichTextEditingPane.java create mode 100644 designer-realize/src/com/fr/design/report/RichTextPane.java create mode 100644 designer-realize/src/com/fr/design/report/RowColumnPane.java create mode 100644 designer-realize/src/com/fr/design/report/SelectImagePane.java create mode 100644 designer-realize/src/com/fr/design/report/SubReportPane.java create mode 100644 designer-realize/src/com/fr/design/report/UnitFieldPane.java rename {designer => designer-realize}/src/com/fr/design/report/ValueVerifierEditPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/report/VerifierListPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/report/VerifyJobListPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/report/WordExportPane.java create mode 100644 designer-realize/src/com/fr/design/report/WriteShortCutsPane.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/ColSpinner.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/FormECRepeatAndFreezeSettingPane.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/FreezeAndRepeatPane.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/FreezePagePane.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/FreezeWriteColPane.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/FreezeWriteRowPane.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/RepeatAndFreezeSettingPane.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/RepeatColPane.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/RepeatRowPane.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/RowSpinner.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/UICapitalLetterField.java create mode 100644 designer-realize/src/com/fr/design/report/freeze/UIIntNumberField.java rename {designer => designer-realize}/src/com/fr/design/report/mobile/AppFitBrowserPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/report/mobile/AppFitPreviewPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/report/mobile/MobileRadioGroupPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/report/mobile/MobileToolBarPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/report/mobile/ReportMobileAttrPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/report/share/ConfuseTabledataAction.java create mode 100644 designer-realize/src/com/fr/design/report/share/ConfusionInfo.java create mode 100644 designer-realize/src/com/fr/design/report/share/ConfusionManagerPane.java create mode 100644 designer-realize/src/com/fr/design/report/share/ConfusionTableDataPane.java create mode 100644 designer-realize/src/com/fr/design/report/share/ShareButton.java create mode 100644 designer-realize/src/com/fr/design/report/share/shareToolTip.html create mode 100644 designer-realize/src/com/fr/design/style/BorderUtils.java create mode 100644 designer-realize/src/com/fr/design/style/StylePane.java create mode 100644 designer-realize/src/com/fr/design/webattr/AbstractEditToolBarPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/CommonPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/DragToolBarPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/EditReportServerParameterPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/EditToolBar.java rename {designer => designer-realize}/src/com/fr/design/webattr/ErrorTemplatePane.java (100%) create mode 100644 designer-realize/src/com/fr/design/webattr/EventPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/FToolBar.java create mode 100644 designer-realize/src/com/fr/design/webattr/NameOptionSelection.java create mode 100644 designer-realize/src/com/fr/design/webattr/PageToolBarPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/PageWebSettingPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/ReportSelectToolBarPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/ReportServerPrinterPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/ReportWebAttrPane.java rename {designer => designer-realize}/src/com/fr/design/webattr/ReportWebWidgetConstants.java (100%) create mode 100644 designer-realize/src/com/fr/design/webattr/ReportWriteAttrPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/ServerPrinterPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/SettingToolBar.java create mode 100644 designer-realize/src/com/fr/design/webattr/ToolBarButton.java create mode 100644 designer-realize/src/com/fr/design/webattr/ToolBarDragPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/ToolBarPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/ViewToolBarPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/ViewWebSettingPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/WebCssPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/WebJsPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/WebSettingPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/WidgetManagerPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/WidgetToolBarPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/WriteToolBarPane.java create mode 100644 designer-realize/src/com/fr/design/webattr/WriteWebSettingPane.java rename {designer => designer-realize}/src/com/fr/design/widget/CellWidgetCardPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/widget/UserDefinedWidgetConfigPane.java create mode 100644 designer-realize/src/com/fr/design/widget/ValueWidgetPane.java create mode 100644 designer-realize/src/com/fr/design/widget/WidgetConfigPane.java create mode 100644 designer-realize/src/com/fr/design/widget/WidgetDefinePaneFactory.java create mode 100644 designer-realize/src/com/fr/design/widget/WidgetEventPane.java rename {designer => designer-realize}/src/com/fr/design/widget/WidgetEventPaneNoPop.java (100%) rename {designer => designer-realize}/src/com/fr/design/widget/WidgetManageCardPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/widget/WidgetPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/widget/ui/AbstractDataModify.java (100%) rename {designer => designer-realize}/src/com/fr/design/widget/ui/BasicWidgetPropertySettingPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/widget/ui/ButtonDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/ButtonGroupDictPane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/CheckBoxDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/CheckBoxGroupDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/ComboBoxDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/ComboCheckBoxDefinePane.java rename {designer => designer-realize}/src/com/fr/design/widget/ui/CustomWritableRepeatEditorPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/widget/ui/DateEditorDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/DirectWriteEditorDefinePane.java rename {designer => designer-realize}/src/com/fr/design/widget/ui/FieldEditorDefinePane.java (100%) create mode 100644 designer-realize/src/com/fr/design/widget/ui/IframeEditorDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/ListEditorDefinePane.java rename {designer => designer-realize}/src/com/fr/design/widget/ui/MultiFileEditorPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/widget/ui/NoneWidgetDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/NumberEditorDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/ParameterTreeComboBox.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/PasswordDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/RadioDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/RadioGroupDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/TextAreaDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/TextFieldEditorDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/TreeComboBoxEditorDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/TreeEditorDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/UserEditorDefinePane.java rename {designer => designer-realize}/src/com/fr/design/widget/ui/WaterMarkDictPane.java (100%) rename {designer => designer-realize}/src/com/fr/design/widget/ui/WritableRepeatEditorPane.java (100%) create mode 100644 designer-realize/src/com/fr/design/widget/ui/WriteUnableRepeatEditorPane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/btn/AppendRowButtonDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/btn/ButtonDetailPaneFactory.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/btn/ButtonSytleDefinedPane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/btn/DefaultButtonDetailPane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/btn/DefaultButtonStylePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/btn/DefineAppendColumnRowPane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/btn/DefineDeleteColumnRowPane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/btn/DeleteRowButtonDefinePane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/btn/FreeButtonDetailPane.java create mode 100644 designer-realize/src/com/fr/design/widget/ui/btn/TreeNodeToogleButtonDefinePane.java rename {designer => designer-realize}/src/com/fr/design/write/submit/DefaultSubmit.java (100%) create mode 100644 designer-realize/src/com/fr/design/write/submit/SmartInsertDBManipulationInWidgetEventPane.java create mode 100644 designer-realize/src/com/fr/design/write/submit/SmartInsertDBManipulationPane.java create mode 100644 designer-realize/src/com/fr/design/write/submit/SmartInsertDMLJobPane.java rename {designer => designer-realize}/src/com/fr/design/write/submit/SubmitVisitorListPane.java (100%) create mode 100644 designer-realize/src/com/fr/grid/AbstractGridHeaderMouseHandler.java create mode 100644 designer-realize/src/com/fr/grid/BaseGridComponent.java create mode 100644 designer-realize/src/com/fr/grid/CellElementPainter.java rename {designer => designer-realize}/src/com/fr/grid/DefaultGridUIProcessor.java (100%) create mode 100644 designer-realize/src/com/fr/grid/DrawFlowRect.java create mode 100644 designer-realize/src/com/fr/grid/Grid.java create mode 100644 designer-realize/src/com/fr/grid/GridColumn.java create mode 100644 designer-realize/src/com/fr/grid/GridColumnMouseHandler.java create mode 100644 designer-realize/src/com/fr/grid/GridColumnUI.java create mode 100644 designer-realize/src/com/fr/grid/GridCorner.java create mode 100644 designer-realize/src/com/fr/grid/GridCornerMouseHandler.java create mode 100644 designer-realize/src/com/fr/grid/GridHeader.java create mode 100644 designer-realize/src/com/fr/grid/GridKeyAction.java create mode 100644 designer-realize/src/com/fr/grid/GridKeyListener.java create mode 100644 designer-realize/src/com/fr/grid/GridMouseAdapter.java create mode 100644 designer-realize/src/com/fr/grid/GridRow.java create mode 100644 designer-realize/src/com/fr/grid/GridRowMouseHandler.java create mode 100644 designer-realize/src/com/fr/grid/GridRowUI.java rename {designer => designer-realize}/src/com/fr/grid/GridUI.java (100%) create mode 100644 designer-realize/src/com/fr/grid/GridUtils.java rename {designer => designer-realize}/src/com/fr/grid/IntelliElements.java (100%) create mode 100644 designer-realize/src/com/fr/grid/KeyEventWork.java create mode 100644 designer-realize/src/com/fr/grid/dnd/ElementCasePaneDropTarget.java create mode 100644 designer-realize/src/com/fr/grid/event/CellEditorEvent.java create mode 100644 designer-realize/src/com/fr/grid/event/CellEditorListener.java create mode 100644 designer-realize/src/com/fr/grid/event/FloatEditorEvent.java create mode 100644 designer-realize/src/com/fr/grid/event/FloatEditorListener.java create mode 100644 designer-realize/src/com/fr/grid/event/package.html rename {designer => designer-realize}/src/com/fr/grid/selection/CellSelection.java (100%) rename {designer => designer-realize}/src/com/fr/grid/selection/FloatSelection.java (100%) rename {designer => designer-realize}/src/com/fr/grid/selection/Selection.java (100%) create mode 100644 designer-realize/src/com/fr/poly/JPolyBlockPane.java create mode 100644 designer-realize/src/com/fr/poly/PolyArea.java create mode 100644 designer-realize/src/com/fr/poly/PolyBlockProperPane.java create mode 100644 designer-realize/src/com/fr/poly/PolyBlockProperTable.java create mode 100644 designer-realize/src/com/fr/poly/PolyComponetsBar.java create mode 100644 designer-realize/src/com/fr/poly/PolyConstants.java rename {designer => designer-realize}/src/com/fr/poly/PolyDesignUI.java (100%) rename {designer => designer-realize}/src/com/fr/poly/PolyDesigner.java (100%) create mode 100644 designer-realize/src/com/fr/poly/PolyDesignerLayout.java create mode 100644 designer-realize/src/com/fr/poly/PolyEditorLayout.java rename {designer => designer-realize}/src/com/fr/poly/PolyUtils.java (100%) create mode 100644 designer-realize/src/com/fr/poly/actions/DeleteBlockAction.java create mode 100644 designer-realize/src/com/fr/poly/creator/BlockCreator.java create mode 100644 designer-realize/src/com/fr/poly/creator/BlockEditor.java create mode 100644 designer-realize/src/com/fr/poly/creator/BlockEditorLayout.java rename {designer => designer-realize}/src/com/fr/poly/creator/ChartBlockCreator.java (100%) create mode 100644 designer-realize/src/com/fr/poly/creator/ChartBlockEditor.java create mode 100644 designer-realize/src/com/fr/poly/creator/ECBlockCreator.java create mode 100644 designer-realize/src/com/fr/poly/creator/ECBlockEditor.java create mode 100644 designer-realize/src/com/fr/poly/creator/ECBlockPane.java create mode 100644 designer-realize/src/com/fr/poly/creator/PolyElementCasePane.java create mode 100644 designer-realize/src/com/fr/poly/group/PolyBoundsGroup.java create mode 100644 designer-realize/src/com/fr/poly/group/PolyNameGroup.java create mode 100644 designer-realize/src/com/fr/poly/hanlder/BlockForbiddenWindow.java create mode 100644 designer-realize/src/com/fr/poly/hanlder/BlockOperationMouseHandler.java create mode 100644 designer-realize/src/com/fr/poly/hanlder/BottomCornerMouseHanlder.java create mode 100644 designer-realize/src/com/fr/poly/hanlder/ColumnOperationMouseHandler.java create mode 100644 designer-realize/src/com/fr/poly/hanlder/DataEditingListener.java create mode 100644 designer-realize/src/com/fr/poly/hanlder/PolyDesignerDropTarget.java create mode 100644 designer-realize/src/com/fr/poly/hanlder/RowOperationMouseHandler.java create mode 100644 designer-realize/src/com/fr/poly/model/AddedData.java create mode 100644 designer-realize/src/com/fr/poly/model/AddingData.java rename {designer => designer-realize}/src/com/fr/quickeditor/CellQuickEditor.java (100%) create mode 100644 designer-realize/src/com/fr/quickeditor/FloatQuickEditor.java rename {designer => designer-realize}/src/com/fr/quickeditor/cellquick/CellBiasTextPainterEditor.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/cellquick/CellDSColumnEditor.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/cellquick/CellFormulaQuickEditor.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/cellquick/CellImageQuickEditor.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/cellquick/CellRichTextEditor.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/cellquick/CellStringQuickEditor.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/cellquick/CellSubReportEditor.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/cellquick/layout/CellElementBarLayout.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/chartquick/BasicChartQuickEditor.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/chartquick/FloatChartQuickEditor.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/chartquick/PolyChartQuickEditor.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/floatquick/FloatImageQuickEditor.java (100%) rename {designer => designer-realize}/src/com/fr/quickeditor/floatquick/FloatStringQuickEditor.java (100%) create mode 100644 designer-realize/src/com/fr/start/BISplashPane.java create mode 100644 designer-realize/src/com/fr/start/CollectUserInformationDialog.java rename {designer => designer-realize}/src/com/fr/start/Designer.java (100%) rename {designer => designer-realize}/src/com/fr/start/Designer4Debug.java (100%) rename {designer => designer-realize}/src/com/fr/start/EnvSwitcher.java (100%) create mode 100644 designer-realize/src/com/fr/start/ReportSplashPane.java rename {designer => designer-realize}/src/com/fr/start/module/DesignerEnvProvider.java (100%) rename {designer => designer-realize}/src/com/fr/start/module/DesignerModuleActivator.java (100%) rename {designer => designer-realize}/src/com/fr/start/module/DesignerStartup.java (100%) rename {designer => designer-realize}/src/com/fr/start/module/PreStartActivator.java (100%) rename {designer => designer-realize}/src/com/fr/start/module/StartFinishActivator.java (100%) rename {designer => designer-realize}/src/com/fr/start/module/StartupArgs.java (100%) delete mode 100644 designer/.classpath delete mode 100644 designer/.project delete mode 100644 designer/src/com/fr/design/actions/ButtonGroupAction.java delete mode 100644 designer/src/com/fr/design/actions/PresentCheckBoxAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/AbstractCellElementAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/BorderAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/CellAttributeAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/CellAttributeTableAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/CellExpandAttrAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/CellWidgetAttrAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/EditCellAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/FloatStyleAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/GlobalStyleMenuDef.java delete mode 100644 designer/src/com/fr/design/actions/cell/NewPresentAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/StyleAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/UIToolbarBorderButton.java delete mode 100644 designer/src/com/fr/design/actions/cell/style/AbstractStyleAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/style/AlignmentAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/style/ReportFontBoldAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/style/ReportFontForegroundAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/style/ReportFontItalicAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/style/ReportFontNameAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/style/ReportFontSizeAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/style/ReportFontUnderlineAction.java delete mode 100644 designer/src/com/fr/design/actions/cell/style/StyleActionInterface.java delete mode 100644 designer/src/com/fr/design/actions/cell/style/StyleBackgroundAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/CancelColumnAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/CancelRowAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/ColumnHideAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/ColumnWidthAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/DSColumnAdvancedAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/DSColumnBasicAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/DSColumnConditionAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/DeleteColumnAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/DeleteRowAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/FootColumnAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/FootRowAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/HeadColumnAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/HeadRowAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/InsertColumnAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/InsertRowAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/ResetColumnHideAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/ResetRowHideAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/RowHeightAction.java delete mode 100644 designer/src/com/fr/design/actions/columnrow/RowHideAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/DeleteAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/EditFloatElementNameAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/clear/ClearAllAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/clear/ClearContentsAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/clear/ClearFormatsAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/clear/ClearWidgetAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/merge/MergeCellAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/merge/UnmergeCellAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/order/AbstractFloatElementOrderAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/order/BringFloatElementForwardAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/order/BringFloatElementToFrontAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/order/SendFloatElementBackwardAction.java delete mode 100644 designer/src/com/fr/design/actions/edit/order/SendFloatElementToBackAction.java delete mode 100644 designer/src/com/fr/design/actions/file/export/AbstractExcelExportAction.java delete mode 100644 designer/src/com/fr/design/actions/file/export/AbstractExportAction.java delete mode 100644 designer/src/com/fr/design/actions/file/export/CSVExportAction.java delete mode 100644 designer/src/com/fr/design/actions/file/export/EmbeddedExportExportAction.java delete mode 100644 designer/src/com/fr/design/actions/file/export/PDFExportAction.java delete mode 100644 designer/src/com/fr/design/actions/file/export/PageExcelExportAction.java delete mode 100644 designer/src/com/fr/design/actions/file/export/PageToSheetExcelExportAction.java delete mode 100644 designer/src/com/fr/design/actions/file/export/SVGExportAction.java delete mode 100644 designer/src/com/fr/design/actions/file/export/TextExportAction.java delete mode 100644 designer/src/com/fr/design/actions/file/export/WordExportAction.java delete mode 100644 designer/src/com/fr/design/actions/file/newReport/NewWorkBookAction.java delete mode 100644 designer/src/com/fr/design/actions/form/AbastractFormECAction.java delete mode 100644 designer/src/com/fr/design/actions/form/FormECBackgroundAction.java delete mode 100644 designer/src/com/fr/design/actions/form/FormECColumnsAction.java delete mode 100644 designer/src/com/fr/design/actions/form/FormECFrozenAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/cell/AbstractCellAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/cell/BiasCellAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/cell/ChartCellAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/cell/DSColumnCellAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/cell/FormulaCellAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/cell/GeneralCellAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/cell/ImageCellAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/cell/RichTextCellAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/cell/SubReportCellAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/flot/AbstractShapeAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/flot/ChartFloatAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/flot/ImageFloatAction.java delete mode 100644 designer/src/com/fr/design/actions/insert/flot/TextBoxFloatAction.java delete mode 100644 designer/src/com/fr/design/actions/report/ReportBackgroundAction.java delete mode 100644 designer/src/com/fr/design/actions/report/ReportColumnsAction.java delete mode 100644 designer/src/com/fr/design/actions/report/ReportEngineAttrAction.java delete mode 100644 designer/src/com/fr/design/actions/report/ReportExportAttrAction.java delete mode 100644 designer/src/com/fr/design/actions/report/ReportFooterAction.java delete mode 100644 designer/src/com/fr/design/actions/report/ReportHeaderAction.java delete mode 100644 designer/src/com/fr/design/actions/report/ReportPageAttrAction.java delete mode 100644 designer/src/com/fr/design/actions/report/ReportPageSetupAction.java delete mode 100644 designer/src/com/fr/design/actions/report/ReportParameterAction.java delete mode 100644 designer/src/com/fr/design/actions/report/ReportWebAttrAction.java delete mode 100644 designer/src/com/fr/design/actions/report/ReportWriteAttrAction.java delete mode 100644 designer/src/com/fr/design/actions/server/ServerConfigManagerAction.java delete mode 100644 designer/src/com/fr/design/actions/server/StyleListAction.java delete mode 100644 designer/src/com/fr/design/actions/server/StyleManagerPane.java delete mode 100644 designer/src/com/fr/design/actions/server/WidgetManagerAction.java delete mode 100644 designer/src/com/fr/design/actions/utils/DeprecatedActionManager.java delete mode 100644 designer/src/com/fr/design/cell/bar/DynamicScrollBar.java delete mode 100644 designer/src/com/fr/design/cell/bar/DynamicScrollBarUI.java delete mode 100644 designer/src/com/fr/design/cell/bar/DynamicScrollButton.java delete mode 100644 designer/src/com/fr/design/cell/bar/ScrollBarUIConstant.java delete mode 100644 designer/src/com/fr/design/cell/clipboard/CellElementsClip.java delete mode 100644 designer/src/com/fr/design/cell/clipboard/ElementsTransferable.java delete mode 100644 designer/src/com/fr/design/cell/clipboard/FloatElementsClip.java delete mode 100644 designer/src/com/fr/design/cell/editor/AbstractCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/AbstractFloatEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/BiasTextPainterCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/CellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/ChartCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/ChartFloatEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/ComboBoxCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/DSColumnCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/DateCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/FloatEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/FormulaCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/FormulaFloatEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/GeneralCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/GeneralFloatEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/ImageCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/ImageFloatEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/RichTextCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/RichTextToolBar.java delete mode 100644 designer/src/com/fr/design/cell/editor/SubReportCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/TextCellEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/TextFloatEditor.java delete mode 100644 designer/src/com/fr/design/cell/editor/package.html delete mode 100644 designer/src/com/fr/design/cell/smartaction/AbstractSmartJTablePaneAction.java delete mode 100644 designer/src/com/fr/design/cell/smartaction/SmartJTablePane.java delete mode 100644 designer/src/com/fr/design/cell/smartaction/SmartJTablePaneAction.java delete mode 100644 designer/src/com/fr/design/condition/HighLightConditionAttributesPane.java delete mode 100644 designer/src/com/fr/design/dscolumn/DSColumnBasicPane.java delete mode 100644 designer/src/com/fr/design/dscolumn/DSColumnConditionsPane.java delete mode 100644 designer/src/com/fr/design/dscolumn/DSColumnPane.java delete mode 100644 designer/src/com/fr/design/dscolumn/ResultSetGroupDockingPane.java delete mode 100644 designer/src/com/fr/design/dscolumn/ResultSetGroupPane.java delete mode 100644 designer/src/com/fr/design/dscolumn/ResultSetGroupPopUpPane.java delete mode 100644 designer/src/com/fr/design/dscolumn/SelectedConfirmedDataColumnPane.java delete mode 100644 designer/src/com/fr/design/dscolumn/SpecifiedGroupAttrPane.java delete mode 100644 designer/src/com/fr/design/expand/ConditionParentPane.java delete mode 100644 designer/src/com/fr/design/expand/ExpandDirectionPane.java delete mode 100644 designer/src/com/fr/design/expand/ExpandLeftFatherPane.java delete mode 100644 designer/src/com/fr/design/expand/ExpandUpFatherPane.java delete mode 100644 designer/src/com/fr/design/expand/ParentPane.java delete mode 100644 designer/src/com/fr/design/expand/SortExpandAttrPane.java delete mode 100644 designer/src/com/fr/design/headerfooter/EditFooterPane.java delete mode 100644 designer/src/com/fr/design/headerfooter/EditHeaderPane.java delete mode 100644 designer/src/com/fr/design/headerfooter/HFAttributesEditDialog.java delete mode 100644 designer/src/com/fr/design/headerfooter/HFComponent.java delete mode 100644 designer/src/com/fr/design/headerfooter/HFContainer.java delete mode 100644 designer/src/com/fr/design/headerfooter/HeaderFooterEditPane.java delete mode 100644 designer/src/com/fr/design/headerfooter/HeaderFooterPane.java delete mode 100644 designer/src/com/fr/design/headerfooter/ImagePane.java delete mode 100644 designer/src/com/fr/design/headerfooter/MoveActionListener.java delete mode 100644 designer/src/com/fr/design/javascript/ListenerEditPane.java delete mode 100644 designer/src/com/fr/design/mainframe/AbstractAttrPane.java delete mode 100644 designer/src/com/fr/design/mainframe/ActiveKeyGenerator.java delete mode 100644 designer/src/com/fr/design/mainframe/AuthoritySheetEditedPane.java delete mode 100644 designer/src/com/fr/design/mainframe/AuthorityToolBarPane.java delete mode 100644 designer/src/com/fr/design/mainframe/CellElementPropertyPane.java delete mode 100644 designer/src/com/fr/design/mainframe/ElementCasePane.java delete mode 100644 designer/src/com/fr/design/mainframe/ElementCasePaneDelegate.java delete mode 100644 designer/src/com/fr/design/mainframe/FormatBrushAction.java delete mode 100644 designer/src/com/fr/design/mainframe/InformationCollector.java delete mode 100644 designer/src/com/fr/design/mainframe/JPolyWorkBook.java delete mode 100644 designer/src/com/fr/design/mainframe/JWorkBook.java delete mode 100644 designer/src/com/fr/design/mainframe/PolySheetNameTabPane.java delete mode 100644 designer/src/com/fr/design/mainframe/RGridLayout.java delete mode 100644 designer/src/com/fr/design/mainframe/ReportComponent.java delete mode 100644 designer/src/com/fr/design/mainframe/ReportComponentComposite.java delete mode 100644 designer/src/com/fr/design/mainframe/SheetAuthorityEditPane.java delete mode 100644 designer/src/com/fr/design/mainframe/SheetNameTabPane.java delete mode 100644 designer/src/com/fr/design/mainframe/WorkBookModelAdapter.java delete mode 100644 designer/src/com/fr/design/mainframe/bbs/BBSConstants.java delete mode 100644 designer/src/com/fr/design/mainframe/bbs/BBSGuestPane.java delete mode 100644 designer/src/com/fr/design/mainframe/bbs/ExitLabel.java delete mode 100644 designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java delete mode 100644 designer/src/com/fr/design/mainframe/bbs/UserInfoPane.java delete mode 100644 designer/src/com/fr/design/mainframe/bbs/bbs.properties delete mode 100644 designer/src/com/fr/design/mainframe/cell/settingpane/AbstractCellAttrPane.java delete mode 100644 designer/src/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java delete mode 100644 designer/src/com/fr/design/mainframe/cell/settingpane/CellPresentPane.java delete mode 100644 designer/src/com/fr/design/mainframe/cell/settingpane/style/StylePane.java delete mode 100644 designer/src/com/fr/design/mainframe/form/FormElementCaseDesigner.java delete mode 100644 designer/src/com/fr/design/mainframe/form/FormElementCasePaneDelegate.java delete mode 100644 designer/src/com/fr/design/mainframe/form/FormReportComponentComposite.java delete mode 100644 designer/src/com/fr/design/mainframe/form/FormTabPane.java delete mode 100644 designer/src/com/fr/design/present/CellWriteAttrPane.java delete mode 100644 designer/src/com/fr/design/present/ColumnRowTableModel.java delete mode 100644 designer/src/com/fr/design/present/ConditionAttributesGroupPane.java delete mode 100644 designer/src/com/fr/design/present/StyleArrayPane.java delete mode 100644 designer/src/com/fr/design/report/ExcelExportPane.java delete mode 100644 designer/src/com/fr/design/report/LayerReportPane.java delete mode 100644 designer/src/com/fr/design/report/PDFExportPane.java delete mode 100644 designer/src/com/fr/design/report/PageSetupPane.java delete mode 100644 designer/src/com/fr/design/report/ReportColumnsPane.java delete mode 100644 designer/src/com/fr/design/report/ReportExportAttrPane.java delete mode 100644 designer/src/com/fr/design/report/ReportStylePane.java delete mode 100644 designer/src/com/fr/design/report/RichTextEditingPane.java delete mode 100644 designer/src/com/fr/design/report/RichTextPane.java delete mode 100644 designer/src/com/fr/design/report/RowColumnPane.java delete mode 100644 designer/src/com/fr/design/report/SelectImagePane.java delete mode 100644 designer/src/com/fr/design/report/SubReportPane.java delete mode 100644 designer/src/com/fr/design/report/UnitFieldPane.java delete mode 100644 designer/src/com/fr/design/report/WordExportPane.java delete mode 100644 designer/src/com/fr/design/report/WriteShortCutsPane.java delete mode 100644 designer/src/com/fr/design/report/freeze/ColSpinner.java delete mode 100644 designer/src/com/fr/design/report/freeze/FormECRepeatAndFreezeSettingPane.java delete mode 100644 designer/src/com/fr/design/report/freeze/FreezeAndRepeatPane.java delete mode 100644 designer/src/com/fr/design/report/freeze/FreezePagePane.java delete mode 100644 designer/src/com/fr/design/report/freeze/FreezeWriteColPane.java delete mode 100644 designer/src/com/fr/design/report/freeze/FreezeWriteRowPane.java delete mode 100644 designer/src/com/fr/design/report/freeze/RepeatAndFreezeSettingPane.java delete mode 100644 designer/src/com/fr/design/report/freeze/RepeatColPane.java delete mode 100644 designer/src/com/fr/design/report/freeze/RepeatRowPane.java delete mode 100644 designer/src/com/fr/design/report/freeze/RowSpinner.java delete mode 100644 designer/src/com/fr/design/report/freeze/UICapitalLetterField.java delete mode 100644 designer/src/com/fr/design/report/freeze/UIIntNumberField.java delete mode 100644 designer/src/com/fr/design/report/share/ConfuseTabledataAction.java delete mode 100644 designer/src/com/fr/design/report/share/ConfusionInfo.java delete mode 100644 designer/src/com/fr/design/report/share/ConfusionManagerPane.java delete mode 100644 designer/src/com/fr/design/report/share/ConfusionTableDataPane.java delete mode 100644 designer/src/com/fr/design/report/share/ShareButton.java delete mode 100644 designer/src/com/fr/design/report/share/shareToolTip.html delete mode 100644 designer/src/com/fr/design/style/BorderUtils.java delete mode 100644 designer/src/com/fr/design/style/StylePane.java delete mode 100644 designer/src/com/fr/design/webattr/AbstractEditToolBarPane.java delete mode 100644 designer/src/com/fr/design/webattr/CommonPane.java delete mode 100644 designer/src/com/fr/design/webattr/DragToolBarPane.java delete mode 100644 designer/src/com/fr/design/webattr/EditReportServerParameterPane.java delete mode 100644 designer/src/com/fr/design/webattr/EditToolBar.java delete mode 100644 designer/src/com/fr/design/webattr/EventPane.java delete mode 100644 designer/src/com/fr/design/webattr/FToolBar.java delete mode 100644 designer/src/com/fr/design/webattr/NameOptionSelection.java delete mode 100644 designer/src/com/fr/design/webattr/PageToolBarPane.java delete mode 100644 designer/src/com/fr/design/webattr/PageWebSettingPane.java delete mode 100644 designer/src/com/fr/design/webattr/ReportSelectToolBarPane.java delete mode 100644 designer/src/com/fr/design/webattr/ReportServerPrinterPane.java delete mode 100644 designer/src/com/fr/design/webattr/ReportWebAttrPane.java delete mode 100644 designer/src/com/fr/design/webattr/ReportWriteAttrPane.java delete mode 100644 designer/src/com/fr/design/webattr/ServerPrinterPane.java delete mode 100644 designer/src/com/fr/design/webattr/SettingToolBar.java delete mode 100644 designer/src/com/fr/design/webattr/ToolBarButton.java delete mode 100644 designer/src/com/fr/design/webattr/ToolBarDragPane.java delete mode 100644 designer/src/com/fr/design/webattr/ToolBarPane.java delete mode 100644 designer/src/com/fr/design/webattr/ViewToolBarPane.java delete mode 100644 designer/src/com/fr/design/webattr/ViewWebSettingPane.java delete mode 100644 designer/src/com/fr/design/webattr/WebCssPane.java delete mode 100644 designer/src/com/fr/design/webattr/WebJsPane.java delete mode 100644 designer/src/com/fr/design/webattr/WebSettingPane.java delete mode 100644 designer/src/com/fr/design/webattr/WidgetManagerPane.java delete mode 100644 designer/src/com/fr/design/webattr/WidgetToolBarPane.java delete mode 100644 designer/src/com/fr/design/webattr/WriteToolBarPane.java delete mode 100644 designer/src/com/fr/design/webattr/WriteWebSettingPane.java delete mode 100644 designer/src/com/fr/design/widget/UserDefinedWidgetConfigPane.java delete mode 100644 designer/src/com/fr/design/widget/ValueWidgetPane.java delete mode 100644 designer/src/com/fr/design/widget/WidgetConfigPane.java delete mode 100644 designer/src/com/fr/design/widget/WidgetDefinePaneFactory.java delete mode 100644 designer/src/com/fr/design/widget/WidgetEventPane.java delete mode 100644 designer/src/com/fr/design/widget/ui/ButtonDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/ButtonGroupDictPane.java delete mode 100644 designer/src/com/fr/design/widget/ui/CheckBoxDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/CheckBoxGroupDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/ComboBoxDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/ComboCheckBoxDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/DateEditorDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/DirectWriteEditorDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/IframeEditorDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/ListEditorDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/NoneWidgetDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/NumberEditorDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/ParameterTreeComboBox.java delete mode 100644 designer/src/com/fr/design/widget/ui/PasswordDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/RadioDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/RadioGroupDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/TextAreaDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/TextFieldEditorDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/TreeComboBoxEditorDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/TreeEditorDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/UserEditorDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/WriteUnableRepeatEditorPane.java delete mode 100644 designer/src/com/fr/design/widget/ui/btn/AppendRowButtonDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/btn/ButtonDetailPaneFactory.java delete mode 100644 designer/src/com/fr/design/widget/ui/btn/ButtonSytleDefinedPane.java delete mode 100644 designer/src/com/fr/design/widget/ui/btn/DefaultButtonDetailPane.java delete mode 100644 designer/src/com/fr/design/widget/ui/btn/DefaultButtonStylePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/btn/DefineAppendColumnRowPane.java delete mode 100644 designer/src/com/fr/design/widget/ui/btn/DefineDeleteColumnRowPane.java delete mode 100644 designer/src/com/fr/design/widget/ui/btn/DeleteRowButtonDefinePane.java delete mode 100644 designer/src/com/fr/design/widget/ui/btn/FreeButtonDetailPane.java delete mode 100644 designer/src/com/fr/design/widget/ui/btn/TreeNodeToogleButtonDefinePane.java delete mode 100644 designer/src/com/fr/design/write/submit/SmartInsertDBManipulationInWidgetEventPane.java delete mode 100644 designer/src/com/fr/design/write/submit/SmartInsertDBManipulationPane.java delete mode 100644 designer/src/com/fr/design/write/submit/SmartInsertDMLJobPane.java delete mode 100644 designer/src/com/fr/grid/AbstractGridHeaderMouseHandler.java delete mode 100644 designer/src/com/fr/grid/BaseGridComponent.java delete mode 100644 designer/src/com/fr/grid/CellElementPainter.java delete mode 100644 designer/src/com/fr/grid/DrawFlowRect.java delete mode 100644 designer/src/com/fr/grid/Grid.java delete mode 100644 designer/src/com/fr/grid/GridColumn.java delete mode 100644 designer/src/com/fr/grid/GridColumnMouseHandler.java delete mode 100644 designer/src/com/fr/grid/GridColumnUI.java delete mode 100644 designer/src/com/fr/grid/GridCorner.java delete mode 100644 designer/src/com/fr/grid/GridCornerMouseHandler.java delete mode 100644 designer/src/com/fr/grid/GridHeader.java delete mode 100644 designer/src/com/fr/grid/GridKeyAction.java delete mode 100644 designer/src/com/fr/grid/GridKeyListener.java delete mode 100644 designer/src/com/fr/grid/GridMouseAdapter.java delete mode 100644 designer/src/com/fr/grid/GridRow.java delete mode 100644 designer/src/com/fr/grid/GridRowMouseHandler.java delete mode 100644 designer/src/com/fr/grid/GridRowUI.java delete mode 100644 designer/src/com/fr/grid/GridUtils.java delete mode 100644 designer/src/com/fr/grid/KeyEventWork.java delete mode 100644 designer/src/com/fr/grid/dnd/ElementCasePaneDropTarget.java delete mode 100644 designer/src/com/fr/grid/event/CellEditorEvent.java delete mode 100644 designer/src/com/fr/grid/event/CellEditorListener.java delete mode 100644 designer/src/com/fr/grid/event/FloatEditorEvent.java delete mode 100644 designer/src/com/fr/grid/event/FloatEditorListener.java delete mode 100644 designer/src/com/fr/grid/event/package.html delete mode 100644 designer/src/com/fr/poly/JPolyBlockPane.java delete mode 100644 designer/src/com/fr/poly/PolyArea.java delete mode 100644 designer/src/com/fr/poly/PolyBlockProperPane.java delete mode 100644 designer/src/com/fr/poly/PolyBlockProperTable.java delete mode 100644 designer/src/com/fr/poly/PolyComponetsBar.java delete mode 100644 designer/src/com/fr/poly/PolyConstants.java delete mode 100644 designer/src/com/fr/poly/PolyDesignerLayout.java delete mode 100644 designer/src/com/fr/poly/PolyEditorLayout.java delete mode 100644 designer/src/com/fr/poly/actions/DeleteBlockAction.java delete mode 100644 designer/src/com/fr/poly/creator/BlockCreator.java delete mode 100644 designer/src/com/fr/poly/creator/BlockEditor.java delete mode 100644 designer/src/com/fr/poly/creator/BlockEditorLayout.java delete mode 100644 designer/src/com/fr/poly/creator/ChartBlockEditor.java delete mode 100644 designer/src/com/fr/poly/creator/ECBlockCreator.java delete mode 100644 designer/src/com/fr/poly/creator/ECBlockEditor.java delete mode 100644 designer/src/com/fr/poly/creator/ECBlockPane.java delete mode 100644 designer/src/com/fr/poly/creator/PolyElementCasePane.java delete mode 100644 designer/src/com/fr/poly/group/PolyBoundsGroup.java delete mode 100644 designer/src/com/fr/poly/group/PolyNameGroup.java delete mode 100644 designer/src/com/fr/poly/hanlder/BlockForbiddenWindow.java delete mode 100644 designer/src/com/fr/poly/hanlder/BlockOperationMouseHandler.java delete mode 100644 designer/src/com/fr/poly/hanlder/BottomCornerMouseHanlder.java delete mode 100644 designer/src/com/fr/poly/hanlder/ColumnOperationMouseHandler.java delete mode 100644 designer/src/com/fr/poly/hanlder/DataEditingListener.java delete mode 100644 designer/src/com/fr/poly/hanlder/PolyDesignerDropTarget.java delete mode 100644 designer/src/com/fr/poly/hanlder/RowOperationMouseHandler.java delete mode 100644 designer/src/com/fr/poly/model/AddedData.java delete mode 100644 designer/src/com/fr/poly/model/AddingData.java delete mode 100644 designer/src/com/fr/quickeditor/FloatQuickEditor.java delete mode 100644 designer/src/com/fr/start/BISplashPane.java delete mode 100644 designer/src/com/fr/start/CollectUserInformationDialog.java delete mode 100644 designer/src/com/fr/start/ReportSplashPane.java delete mode 100644 designer_base/.classpath delete mode 100644 designer_base/.project delete mode 100644 designer_base/build.9.0.gradle delete mode 100644 designer_base/build.9.0.gradle.bak delete mode 100644 designer_base/build.base.gradle delete mode 100644 designer_base/build.dev.gradle delete mode 100644 designer_base/build.dev.gradle.bak delete mode 100644 designer_base/build.master.gradle delete mode 100644 designer_base/build.master.gradle.bak delete mode 100644 designer_base/build.performance.gradle delete mode 100644 designer_base/build.performance.gradle.bak delete mode 100644 designer_base/build.release.gradle delete mode 100644 designer_base/src/com/fr/design/DesignModelAdapter.java delete mode 100644 designer_base/src/com/fr/design/DesignState.java delete mode 100644 designer_base/src/com/fr/design/DesignerEnvManager.java delete mode 100644 designer_base/src/com/fr/design/Exception/ValidationException.java delete mode 100644 designer_base/src/com/fr/design/actions/CheckBoxAction.java delete mode 100644 designer_base/src/com/fr/design/actions/HyperlinkPluginAction.java delete mode 100644 designer_base/src/com/fr/design/actions/MenuAction.java delete mode 100644 designer_base/src/com/fr/design/actions/TableDataSourceAction.java delete mode 100644 designer_base/src/com/fr/design/actions/ToggleButtonUpdateAction.java delete mode 100644 designer_base/src/com/fr/design/actions/UpdateAction.java delete mode 100644 designer_base/src/com/fr/design/actions/edit/CutAction.java delete mode 100644 designer_base/src/com/fr/design/actions/edit/PasteAction.java delete mode 100644 designer_base/src/com/fr/design/actions/edit/RedoAction.java delete mode 100644 designer_base/src/com/fr/design/actions/edit/UndoAction.java delete mode 100644 designer_base/src/com/fr/design/actions/file/CloseTemplateAction.java delete mode 100644 designer_base/src/com/fr/design/actions/file/EditEnvAction.java delete mode 100644 designer_base/src/com/fr/design/actions/file/ExitDesignerAction.java delete mode 100644 designer_base/src/com/fr/design/actions/file/OpenRecentReportMenuDef.java delete mode 100644 designer_base/src/com/fr/design/actions/file/OpenTemplateAction.java delete mode 100644 designer_base/src/com/fr/design/actions/file/PreferenceAction.java delete mode 100644 designer_base/src/com/fr/design/actions/file/PreferencePane.java delete mode 100644 designer_base/src/com/fr/design/actions/file/SaveAsTemplateAction.java delete mode 100644 designer_base/src/com/fr/design/actions/file/SwitchExistEnv.java delete mode 100644 designer_base/src/com/fr/design/actions/file/WebPreviewUtils.java delete mode 100644 designer_base/src/com/fr/design/actions/help/AboutAction.java delete mode 100644 designer_base/src/com/fr/design/actions/help/AboutDialog.java delete mode 100644 designer_base/src/com/fr/design/actions/help/AboutPane.java delete mode 100644 designer_base/src/com/fr/design/actions/help/FeedBackAction.java delete mode 100644 designer_base/src/com/fr/design/actions/help/FeedBackPane.java delete mode 100644 designer_base/src/com/fr/design/actions/help/ForumAction.java delete mode 100644 designer_base/src/com/fr/design/actions/help/SupportQQAction.java delete mode 100644 designer_base/src/com/fr/design/actions/help/SystemInfoPane.java delete mode 100644 designer_base/src/com/fr/design/actions/help/TutorialAction.java delete mode 100644 designer_base/src/com/fr/design/actions/help/WebDemoAction.java delete mode 100644 designer_base/src/com/fr/design/actions/server/FunctionManagerAction.java delete mode 100644 designer_base/src/com/fr/design/actions/server/GlobalParameterAction.java delete mode 100644 designer_base/src/com/fr/design/actions/server/GlobalTableDataAction.java delete mode 100644 designer_base/src/com/fr/design/actions/server/PlatformManagerAction.java delete mode 100644 designer_base/src/com/fr/design/actions/tabledata/TableDataAction.java delete mode 100644 designer_base/src/com/fr/design/beans/BasicBeanPane.java delete mode 100644 designer_base/src/com/fr/design/beans/FurtherBasicBeanPane.java delete mode 100644 designer_base/src/com/fr/design/beans/GroupModel.java delete mode 100644 designer_base/src/com/fr/design/beans/location/Absorptionline.java delete mode 100644 designer_base/src/com/fr/design/beans/location/MoveUtils.java delete mode 100644 designer_base/src/com/fr/design/border/UIRoundedBorder.java delete mode 100644 designer_base/src/com/fr/design/border/UITitledBorder.java delete mode 100644 designer_base/src/com/fr/design/cell/FloatElementsProvider.java delete mode 100644 designer_base/src/com/fr/design/condition/CellHighlightAddMenuDef.java delete mode 100644 designer_base/src/com/fr/design/condition/ConditionAttributesPane.java delete mode 100644 designer_base/src/com/fr/design/condition/ContinuousTreeSelectionModel.java delete mode 100644 designer_base/src/com/fr/design/condition/DSColumnSimpleLiteConditionPane.java delete mode 100644 designer_base/src/com/fr/design/condition/LiteConditionPane.java delete mode 100644 designer_base/src/com/fr/design/condition/SingleConditionPane.java delete mode 100644 designer_base/src/com/fr/design/data/DesignTableDataManager.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/ChoosePane.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/DSButtonGroup.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/DataBaseItems.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/EditOrNewLabel.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/FlashLookLabelMouseAdapter.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/GlobalTableDataComboBox.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/GlobalTreeTableDataDictPane.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/RefreshLabel.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/ReportTableDataPane.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/TableDataComboBox.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/TableDataNameObjectCreator.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/TableDataSourceOP.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/TableDataTree.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/TableDataTreeDragSource.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/TreeTableDataComboBox.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/TreeTableDataDictPane.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/VerticalChoosePane.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/connect/DataConnectionAction.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/connect/JDBCDefPane.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/connect/JNDIDefPane.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/preview/LoadedEventListener.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/preview/PreviewLabel.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/preview/PreviewTableModel.java delete mode 100644 designer_base/src/com/fr/design/data/datapane/preview/PreviewTablePane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/Prepare4DataSourceChange.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/ResponseDataSourceChange.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/StoreProcedureWorkerListener.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/gui/CONTENT.txt delete mode 100644 designer_base/src/com/fr/design/data/tabledata/gui/EXPLAN1.txt delete mode 100644 designer_base/src/com/fr/design/data/tabledata/gui/EXPLAN2.txt delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/AbstractTableDataPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/AutoStoreProcedureTableModel.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/ClassNameSelectPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/CustomDictModel.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataDefinedPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableModel.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/GlobalMultiTDTableDataPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/GlobalTreeTableDataPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/OneListTableModel.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureTableModel.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/TableDataManagerPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/tabledatapane/TreeTableDataPane.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/wrapper/TableDataFactory.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/wrapper/TableDataWrapper.java delete mode 100644 designer_base/src/com/fr/design/data/tabledata/wrapper/TemplateTableDataWrapper.java delete mode 100644 designer_base/src/com/fr/design/designer/TargetComponent.java delete mode 100644 designer_base/src/com/fr/design/dialog/BasicDialog.java delete mode 100644 designer_base/src/com/fr/design/dialog/BasicPane.java delete mode 100644 designer_base/src/com/fr/design/dialog/BasicScrollPane.java delete mode 100644 designer_base/src/com/fr/design/dialog/DialogActionAdapter.java delete mode 100644 designer_base/src/com/fr/design/dialog/DialogActionListener.java delete mode 100644 designer_base/src/com/fr/design/dialog/InformationWarnPane.java delete mode 100644 designer_base/src/com/fr/design/dialog/JWizardDialog.java delete mode 100644 designer_base/src/com/fr/design/dialog/JWizardPanel.java delete mode 100644 designer_base/src/com/fr/design/dialog/MultiTabPane.java delete mode 100644 designer_base/src/com/fr/design/dialog/UIDialog.java delete mode 100644 designer_base/src/com/fr/design/dialog/package.html delete mode 100644 designer_base/src/com/fr/design/editor/ValueEditorPaneFactory.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/BooleanEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/ColumnIndexEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/ColumnNameEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/ColumnRowEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/ColumnSelectedEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/ConstantsEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/CursorEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/DateEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/DoubleEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/Editor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/EditorListener.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/FloatEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/FormulaEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/IntegerEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/LongEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/NoneEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/NumberEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/OldColumnIndexEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/ParameterEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/TextEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/WidgetNameEditor.java delete mode 100644 designer_base/src/com/fr/design/editor/editor/XMLANameEditor.java delete mode 100644 designer_base/src/com/fr/design/event/TargetModifiedEvent.java delete mode 100644 designer_base/src/com/fr/design/event/TargetModifiedListener.java delete mode 100644 designer_base/src/com/fr/design/event/UIObserverListener.java delete mode 100644 designer_base/src/com/fr/design/extra/LoginCheckContext.java delete mode 100644 designer_base/src/com/fr/design/extra/LoginCheckListener.java delete mode 100644 designer_base/src/com/fr/design/extra/PluginConstants.java delete mode 100644 designer_base/src/com/fr/design/file/FileOperations.java delete mode 100644 designer_base/src/com/fr/design/file/FileToolbarStateChangeListener.java delete mode 100644 designer_base/src/com/fr/design/file/HistoryTemplateListPane.java delete mode 100644 designer_base/src/com/fr/design/file/MutilTempalteTabPane.java delete mode 100644 designer_base/src/com/fr/design/file/NewTemplatePane.java delete mode 100644 designer_base/src/com/fr/design/file/TemplateTreePane.java delete mode 100644 designer_base/src/com/fr/design/formula/CustomVariableResolver.java delete mode 100644 designer_base/src/com/fr/design/formula/FormulaPane.java delete mode 100644 designer_base/src/com/fr/design/formula/FunctionConstants.java delete mode 100644 designer_base/src/com/fr/design/formula/FunctionDefNAD.java delete mode 100644 designer_base/src/com/fr/design/formula/FunctionGroup.java delete mode 100644 designer_base/src/com/fr/design/formula/FunctionManagerPane.java delete mode 100644 designer_base/src/com/fr/design/formula/FunctionNAD.java delete mode 100644 designer_base/src/com/fr/design/formula/NameAndDescription.java delete mode 100644 designer_base/src/com/fr/design/formula/NameAndFunctionList.java delete mode 100644 designer_base/src/com/fr/design/formula/NameAndTypeAndFunctionList.java delete mode 100644 designer_base/src/com/fr/design/formula/SortFormulaPane.java delete mode 100644 designer_base/src/com/fr/design/formula/VariableResolver.java delete mode 100644 designer_base/src/com/fr/design/formula/VariableResolverAdapter.java delete mode 100644 designer_base/src/com/fr/design/fun/CellAttributeProvider.java delete mode 100644 designer_base/src/com/fr/design/fun/ExportToolBarProvider.java delete mode 100644 designer_base/src/com/fr/design/fun/GlobalListenerProvider.java delete mode 100644 designer_base/src/com/fr/design/fun/HyperlinkProvider.java delete mode 100644 designer_base/src/com/fr/design/fun/IndentationUnitProcessor.java delete mode 100644 designer_base/src/com/fr/design/fun/JavaScriptActionProvider.java delete mode 100644 designer_base/src/com/fr/design/fun/impl/AbstractCellAttributeProvider.java delete mode 100644 designer_base/src/com/fr/design/fun/impl/AbstractGlobalListenerProvider.java delete mode 100644 designer_base/src/com/fr/design/fun/impl/AbstractHyperlinkProvider.java delete mode 100644 designer_base/src/com/fr/design/fun/impl/AbstractIndentationUnitProcessor.java delete mode 100644 designer_base/src/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java delete mode 100644 designer_base/src/com/fr/design/gui/UIDefaultTheme.java delete mode 100644 designer_base/src/com/fr/design/gui/UILookAndFeel.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/AbstractCompletion.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/AbstractCompletionProvider.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/AutoCompleteDescWindow.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/AutoCompletePopupWindow.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/AutoCompletion.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/AutoCompletionStyleContext.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/BasicCompletion.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/Completion.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/CompletionCellRenderer.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/CompletionListModel.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/CompletionProvider.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/CompletionProviderBase.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/CompletionXMLParser.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/CompletionXml.dtd delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/DefaultCompletionProvider.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/DelegatingCellRenderer.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/DescWindowCallback.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/EmptyIcon.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/ExternalURLHandler.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/FastListUI.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/FunctionCompletion.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/LinkRedirector.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/MarkupTagCompletion.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/OutlineHighlightPainter.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/ParameterChoicesProvider.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletion.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionChoicesWindow.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionDescriptionToolTip.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionInsertionInfo.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/ShorthandCompletion.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/SizeGrip.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/SortByRelevanceComparator.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/TemplateCompletion.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/TemplatePiece.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/TipUtil.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/Util.java delete mode 100644 designer_base/src/com/fr/design/gui/autocomplete/VariableCompletion.java delete mode 100644 designer_base/src/com/fr/design/gui/borders/UIFrameBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/borders/UIInternalFrameBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/borders/UITableHeaderBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/borders/UITableHeaderRolloverBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/borders/UITableScrollPaneBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/borders/UITextFieldBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/chart/BaseChartPropertyPane.java delete mode 100644 designer_base/src/com/fr/design/gui/chart/MiddleChartComponent.java delete mode 100644 designer_base/src/com/fr/design/gui/chart/MiddleChartDialog.java delete mode 100644 designer_base/src/com/fr/design/gui/columnrow/ColumnRowPane.java delete mode 100644 designer_base/src/com/fr/design/gui/columnrow/ColumnRowVerticalPane.java delete mode 100644 designer_base/src/com/fr/design/gui/controlpane/AbstractNameableCreator.java delete mode 100644 designer_base/src/com/fr/design/gui/controlpane/ControlPane.java delete mode 100644 designer_base/src/com/fr/design/gui/controlpane/JControlPane.java delete mode 100644 designer_base/src/com/fr/design/gui/controlpane/NameableCreator.java delete mode 100644 designer_base/src/com/fr/design/gui/controlpane/ObjectJControlPane.java delete mode 100644 designer_base/src/com/fr/design/gui/controlpane/ShortCut4JControlPane.java delete mode 100644 designer_base/src/com/fr/design/gui/core/CustomWidgetOption.java delete mode 100644 designer_base/src/com/fr/design/gui/core/UIFurtherTabComponent.java delete mode 100644 designer_base/src/com/fr/design/gui/core/UISelectedComponent.java delete mode 100644 designer_base/src/com/fr/design/gui/core/UITabComponent.java delete mode 100644 designer_base/src/com/fr/design/gui/core/UserDefinedWidgetOption.java delete mode 100644 designer_base/src/com/fr/design/gui/core/WidgetConstants.java delete mode 100644 designer_base/src/com/fr/design/gui/core/WidgetOption.java delete mode 100644 designer_base/src/com/fr/design/gui/core/WidgetOptionFactory.java delete mode 100644 designer_base/src/com/fr/design/gui/date/CalendarNumberField.java delete mode 100644 designer_base/src/com/fr/design/gui/date/JDateDocument.java delete mode 100644 designer_base/src/com/fr/design/gui/date/SingleObjectComboBoxModel.java delete mode 100644 designer_base/src/com/fr/design/gui/date/UICalendarPanel.java delete mode 100644 designer_base/src/com/fr/design/gui/date/UIDatePicker.java delete mode 100644 designer_base/src/com/fr/design/gui/date/UIDayLabel.java delete mode 100644 designer_base/src/com/fr/design/gui/demo/ComboBoxDemo.java delete mode 100644 designer_base/src/com/fr/design/gui/demo/LabelDemo.java delete mode 100644 designer_base/src/com/fr/design/gui/demo/ListDemo.java delete mode 100644 designer_base/src/com/fr/design/gui/demo/LoadingPaneDemo.java delete mode 100644 designer_base/src/com/fr/design/gui/demo/MultiLineTooltipDemo.java delete mode 100644 designer_base/src/com/fr/design/gui/demo/SwingComponentsDemo.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/AttributeChangeListener.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/BaseHyperlinkGroup.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/CommitTabbedPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/EditingStringListPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/HyperlinkGroupPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/HyperlinkGroupType.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/ImgChoosePane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/JTreeControlPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/LimitedDocument.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/ListenerUpdatePane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/LoadingBasicPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/LoadingBasicPaneTest.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/ObjectProperiesPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/ReportletParameterViewPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/TemplateParameterPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UIAdvancedTextPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UIBasicOptionPaneUI.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UIBubbleFloatPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UICorrelationComboBoxPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UICorrelationPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UINumberDragPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UINumberSlidePane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UIRadioPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UITabbedPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UITextPane.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UITitlePanel.java delete mode 100644 designer_base/src/com/fr/design/gui/frpane/UnitInputPane.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/FiveButtonLayout.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/SpecialUIButton.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIBasicButtonUI.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIButton.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIButtonBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIButtonGroup.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIButtonUI.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIColorButton.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UICombinationButton.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIHeadGroup.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIRadioButton.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIRadioButtonIcon.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIRadioButtonMenuItemUI.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIRadioButtonUI.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UITabButton.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UITabGroup.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIToggleButton.java delete mode 100644 designer_base/src/com/fr/design/gui/ibutton/UIToolButtonBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/icheckbox/UICheckBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icheckbox/UICheckBoxIcon.java delete mode 100644 designer_base/src/com/fr/design/gui/icheckbox/UICheckBoxUI.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/AlignmentComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/ComboCheckBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/DictionaryComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/DictionaryConstants.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/ExtendedComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/ExtendedComboBoxTest.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/FRTreeComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/FilterComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/FilterableComboBoxModel.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/FixedHeightComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/FunctionComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/IntComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/LazyComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/LazyComboBoxTest.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/LineComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/ParameterComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/SortOrderComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/TreeComboBoxUI.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/UIBasicComboBoxEditor.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/UIBasicComboBoxUI.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/UIComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/UIComboBoxButton.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/UIComboBoxEditor.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/UIComboBoxRenderer.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/UIComboBoxUI.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/UIDictionaryComboBox.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/filter/Filter.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/filter/LastStartWithFilter.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/filter/StartsWithFilter.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeCellRenderer.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeLabel.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNode.java delete mode 100644 designer_base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNodeSelectionListener.java delete mode 100644 designer_base/src/com/fr/design/gui/icontainer/UIModeControlContainer.java delete mode 100644 designer_base/src/com/fr/design/gui/icontainer/UIResizableContainer.java delete mode 100644 designer_base/src/com/fr/design/gui/icontainer/UIScrollPane.java delete mode 100644 designer_base/src/com/fr/design/gui/icontainer/UIScrollPaneBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/icontainer/UIScrollPaneUI.java delete mode 100644 designer_base/src/com/fr/design/gui/icontainer/UITableScrollPaneBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/ilable/ActionLabel.java delete mode 100644 designer_base/src/com/fr/design/gui/ilable/BoldFontTextLabel.java delete mode 100644 designer_base/src/com/fr/design/gui/ilable/FRExplainLabel.java delete mode 100644 designer_base/src/com/fr/design/gui/ilable/MultilineLabel.java delete mode 100644 designer_base/src/com/fr/design/gui/ilable/UILabel.java delete mode 100644 designer_base/src/com/fr/design/gui/ilist/ArrayListModel.java delete mode 100644 designer_base/src/com/fr/design/gui/ilist/CheckBoxList.java delete mode 100644 designer_base/src/com/fr/design/gui/ilist/DefaultListCellEditor.java delete mode 100644 designer_base/src/com/fr/design/gui/ilist/JNameEdList.java delete mode 100644 designer_base/src/com/fr/design/gui/ilist/ListCellEditor.java delete mode 100644 designer_base/src/com/fr/design/gui/ilist/ModNameActionListener.java delete mode 100644 designer_base/src/com/fr/design/gui/ilist/QuickList.java delete mode 100644 designer_base/src/com/fr/design/gui/ilist/TableViewList.java delete mode 100644 designer_base/src/com/fr/design/gui/ilist/UIList.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UIBasicMenuItemUI.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UIBasicMenuUI.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UICheckBoxMenuItem.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UIMenu.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UIMenuBar.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UIMenuBarUI.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UIMenuHighLight.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UIMenuItem.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UIMenuUI.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UIPopupMenu.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UIPopupMenuBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/imenu/UIPopupMenuSeparatorUI.java delete mode 100644 designer_base/src/com/fr/design/gui/imenutable/UIMenuNameableCreator.java delete mode 100644 designer_base/src/com/fr/design/gui/imenutable/UIMenuTable.java delete mode 100644 designer_base/src/com/fr/design/gui/imenutable/UIMenuTableDataModel.java delete mode 100644 designer_base/src/com/fr/design/gui/imenutable/UIMenuTableUI.java delete mode 100644 designer_base/src/com/fr/design/gui/ipasswordfield/UIPassWordField.java delete mode 100644 designer_base/src/com/fr/design/gui/ipoppane/PopupHider.java delete mode 100644 designer_base/src/com/fr/design/gui/iprogressbar/AutoProgressBar.java delete mode 100644 designer_base/src/com/fr/design/gui/iprogressbar/FRProgressBar.java delete mode 100644 designer_base/src/com/fr/design/gui/iprogressbar/MonitorCancelWork.java delete mode 100644 designer_base/src/com/fr/design/gui/iprogressbar/UIProgressBarBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/iprogressbar/UIProgressBarUI.java delete mode 100644 designer_base/src/com/fr/design/gui/iscrollbar/UIBasicScrollBarUI.java delete mode 100644 designer_base/src/com/fr/design/gui/iscrollbar/UISBChooser.java delete mode 100644 designer_base/src/com/fr/design/gui/iscrollbar/UIScrollBar.java delete mode 100644 designer_base/src/com/fr/design/gui/iscrollbar/UIScrollBarUI.java delete mode 100644 designer_base/src/com/fr/design/gui/iscrollbar/UIScrollButton.java delete mode 100644 designer_base/src/com/fr/design/gui/islider/UISlider.java delete mode 100644 designer_base/src/com/fr/design/gui/ispinner/UIBasicSpinner.java delete mode 100644 designer_base/src/com/fr/design/gui/ispinner/UISpinner.java delete mode 100644 designer_base/src/com/fr/design/gui/ispinner/UISpinnerButtonUI.java delete mode 100644 designer_base/src/com/fr/design/gui/ispinner/UISpinnerUI.java delete mode 100644 designer_base/src/com/fr/design/gui/ispinner/UpperCaseSpinner.java delete mode 100644 designer_base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneDivider.java delete mode 100644 designer_base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneUI.java delete mode 100644 designer_base/src/com/fr/design/gui/itable/SortableJTable.java delete mode 100644 designer_base/src/com/fr/design/gui/itable/TableSorter.java delete mode 100644 designer_base/src/com/fr/design/gui/itable/UIBasicTableUI.java delete mode 100644 designer_base/src/com/fr/design/gui/itable/UIComponentTable.java delete mode 100644 designer_base/src/com/fr/design/gui/itable/UISelectTable.java delete mode 100644 designer_base/src/com/fr/design/gui/itable/UITable.java delete mode 100644 designer_base/src/com/fr/design/gui/itable/UITableComponentModel.java delete mode 100644 designer_base/src/com/fr/design/gui/itable/UITableDataModel.java delete mode 100644 designer_base/src/com/fr/design/gui/itable/UITableNoOptionUI.java delete mode 100644 designer_base/src/com/fr/design/gui/itable/UITableUI.java delete mode 100644 designer_base/src/com/fr/design/gui/itableeditorpane/ActionStyle.java delete mode 100644 designer_base/src/com/fr/design/gui/itableeditorpane/ParameterTableModel.java delete mode 100644 designer_base/src/com/fr/design/gui/itableeditorpane/UIArrayTableModel.java delete mode 100644 designer_base/src/com/fr/design/gui/itableeditorpane/UITableEditAction.java delete mode 100644 designer_base/src/com/fr/design/gui/itableeditorpane/UITableEditorLoader.java delete mode 100644 designer_base/src/com/fr/design/gui/itableeditorpane/UITableEditorPane.java delete mode 100644 designer_base/src/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java delete mode 100644 designer_base/src/com/fr/design/gui/itabpane/TitleChangeListener.java delete mode 100644 designer_base/src/com/fr/design/gui/itabpane/UITabPaneCreator.java delete mode 100644 designer_base/src/com/fr/design/gui/itabpane/UITabsHeaderIconPane.java delete mode 100644 designer_base/src/com/fr/design/gui/itextarea/DescriptionTextArea.java delete mode 100644 designer_base/src/com/fr/design/gui/itextarea/FRExplainTextArea.java delete mode 100644 designer_base/src/com/fr/design/gui/itextarea/UITextArea.java delete mode 100644 designer_base/src/com/fr/design/gui/itextarea/UITextAreaUI.java delete mode 100644 designer_base/src/com/fr/design/gui/itextfield/EditTextField.java delete mode 100644 designer_base/src/com/fr/design/gui/itextfield/FRGraphics2D.java delete mode 100644 designer_base/src/com/fr/design/gui/itextfield/TextFieldUI.java delete mode 100644 designer_base/src/com/fr/design/gui/itextfield/UINumberField.java delete mode 100644 designer_base/src/com/fr/design/gui/itextfield/UISearchTextField.java delete mode 100644 designer_base/src/com/fr/design/gui/itextfield/UITextField.java delete mode 100644 designer_base/src/com/fr/design/gui/itextfield/UITextFieldUI.java delete mode 100644 designer_base/src/com/fr/design/gui/itoolbar/UILargeToolbar.java delete mode 100644 designer_base/src/com/fr/design/gui/itoolbar/UIToolBarBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/itoolbar/UIToolBarSeparatorUI.java delete mode 100644 designer_base/src/com/fr/design/gui/itoolbar/UIToolBarUI.java delete mode 100644 designer_base/src/com/fr/design/gui/itoolbar/UIToolbar.java delete mode 100644 designer_base/src/com/fr/design/gui/itooltip/UIToolTip.java delete mode 100644 designer_base/src/com/fr/design/gui/itooltip/UIToolTipBorder.java delete mode 100644 designer_base/src/com/fr/design/gui/itooltip/UIToolTipUI.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/UITreeUI.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeCellRenderer.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeSelectionModel.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/checkboxtree/NullLabel.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/checkboxtree/NullPanel.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/checkboxtree/NullTristateCheckBox.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/checkboxtree/TristateCheckBox.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/filetree/AbstractFileTree.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/filetree/ClassFileTree.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/filetree/EnvFileTree.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/filetree/FileComparator.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/filetree/FileDirectoryNode.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/filetree/FileNodeComparator.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/filetree/FileTreeIcon.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/filetree/JFileTree.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/filetree/ReportletPane.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/filetree/RootFile.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/filetree/TemplateFileTree.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/refreshabletree/ExpandMutableTreeNode.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTreeTest.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/refreshabletree/TreeDataCardPane.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/refreshabletree/TreeNodePane.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/refreshabletree/TreeRootPane.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/refreshabletree/UserObjectOP.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/refreshabletree/UserObjectRefreshJTree.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenLoaderFactory.java delete mode 100644 designer_base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenNodesLoader.java delete mode 100644 designer_base/src/com/fr/design/gui/style/AbstractBasicStylePane.java delete mode 100644 designer_base/src/com/fr/design/gui/style/AlignmentPane.java delete mode 100644 designer_base/src/com/fr/design/gui/style/BackgroundNoImagePane.java delete mode 100644 designer_base/src/com/fr/design/gui/style/BackgroundSpecialPane.java delete mode 100644 designer_base/src/com/fr/design/gui/style/BorderPane.java delete mode 100644 designer_base/src/com/fr/design/gui/style/DefaultIndentationUnitProcessor.java delete mode 100644 designer_base/src/com/fr/design/gui/style/FRFontPane.java delete mode 100644 designer_base/src/com/fr/design/gui/style/FormatePaneNumField.java delete mode 100644 designer_base/src/com/fr/design/gui/style/NumberDragBar.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/io/DocumentReader.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/io/UnicodeReader.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/io/UnicodeWriter.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/io/package.html delete mode 100644 designer_base/src/com/fr/design/gui/syntax/print/RPrintUtilities.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/print/package.html delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultOccurrenceMarker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultTokenFactory.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultTokenPainter.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DocumentRange.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ar.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_de.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_es.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_fr.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_hu.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_in.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_it.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ja.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ko.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_nl.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_pl.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_pt_BR.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ru.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_tr.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_zh_CN.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_zh_TW.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/FileFileLocation.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/FileLocation.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/LinkGenerator.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/LinkGeneratorResult.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/MarkOccurrencesSupport.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/OccurrenceMarker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ParserManager.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/PopupWindowDecorator.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSTAView.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxDocument.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ar.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_de.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_es.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_fr.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_hu.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_in.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_it.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ja.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ko.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_nl.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_pl.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_pt_BR.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ru.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_tr.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_zh_CN.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_zh_TW.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxUtilities.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RTfToText.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RtfGenerator.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RtfTransferable.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SelectRegionLinkGeneratorResult.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Style.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxConstants.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxScheme.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxView.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TextEditorPane.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Theme.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Token.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenFactory.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenImpl.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenIterator.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMakerBase.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMakerFactory.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMap.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenOrientedView.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenPainter.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenTypes.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenUtils.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/URLFileLocation.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/VisibleWhitespaceTokenPainter.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/WrappedSyntaxView.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/WrappedSyntaxView2.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/XmlOccurrenceMarker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ar.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_es.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_fr.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_hu.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_in.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_it.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ja.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ko.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_nl.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_pl.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_pt_BR.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ru.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_tr.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_CN.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_TW.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/SizeGrip.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/TipUtil.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/TipWindow.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/package.html delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/CurlyFoldParser.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/Fold.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldCollapser.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldManager.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldParser.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldParserManager.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldType.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/JsonFoldParser.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/LatexFoldParser.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/LispFoldParser.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/NsisFoldParser.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/package.html delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSSTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DtdTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FortranTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HtaccessTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HtaccessTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JSPTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JsonTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JsonTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LatexTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LispTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LispTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LuaTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/NSISTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/NSISTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PHPTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PerlTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PythonTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/RubyTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SASTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SASTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SQLTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/TclTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/TclTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/XMLTokenMaker.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/package.html delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/package.html delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/AbstractParser.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/DefaultParseResult.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/DefaultParserNotice.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ParseResult.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/Parser.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ParserNotice.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/TaskTagParser.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ToolTipInfo.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/XmlParser.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/package.html delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/CodeTemplate.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/package.html delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/AbstractGutterComponent.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/BackgroundPainterStrategy.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/ChangeableHighlightPainter.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/ColorBackgroundPainterStrategy.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/ConfigurableCaret.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/FoldIndicator.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/Gutter.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/GutterIconInfo.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/IconGroup.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/IconRowHeader.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/ImageBackgroundPainterStrategy.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/LineHighlightManager.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/LineNumberList.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/Macro.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RDocument.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RDocumentCharSequence.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTADefaultInputMap.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTATextTransferHandler.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaBase.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaEditorKit.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaUI.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ar.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_de.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_es.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_fr.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_hu.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_in.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_it.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ja.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ko.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_nl.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_pl.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_pt_BR.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ru.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_tr.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_zh_CN.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_zh_TW.properties delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextScrollPane.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RUndoManager.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RecordableTextAction.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RegExReplaceInfo.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/SearchContext.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/SearchEngine.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/SmartHighlightPainter.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/ToolTipSupplier.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/package.html delete mode 100644 designer_base/src/com/fr/design/gui/syntax/util/DynamicIntArray.java delete mode 100644 designer_base/src/com/fr/design/gui/syntax/util/package.html delete mode 100644 designer_base/src/com/fr/design/hyperlink/ReporletHyperNorthPane.java delete mode 100644 designer_base/src/com/fr/design/hyperlink/ReportletHyperlinkPane.java delete mode 100644 designer_base/src/com/fr/design/hyperlink/WebHyperNorthPane.java delete mode 100644 designer_base/src/com/fr/design/hyperlink/WebHyperlinkPane.java delete mode 100644 designer_base/src/com/fr/design/icon/BorderIcon.java delete mode 100644 designer_base/src/com/fr/design/icon/LockIcon.java delete mode 100644 designer_base/src/com/fr/design/icon/WarningIcon.java delete mode 100644 designer_base/src/com/fr/design/javascript/Commit2DBJavaScriptPane.java delete mode 100644 designer_base/src/com/fr/design/javascript/EmailPane.java delete mode 100644 designer_base/src/com/fr/design/javascript/FormSubmitJavaScriptPane.java delete mode 100644 designer_base/src/com/fr/design/javascript/JavaScriptActionPane.java delete mode 100644 designer_base/src/com/fr/design/javascript/JavaScriptImplPane.java delete mode 100644 designer_base/src/com/fr/design/javascript/ParameterJavaScriptPane.java delete mode 100644 designer_base/src/com/fr/design/layout/FRGUIPaneFactory.java delete mode 100644 designer_base/src/com/fr/design/layout/FRGridLayout.java delete mode 100644 designer_base/src/com/fr/design/layout/FRLeftFlowLayout.java delete mode 100644 designer_base/src/com/fr/design/layout/LeftCenterRightLayout.java delete mode 100644 designer_base/src/com/fr/design/layout/TableLayout.java delete mode 100644 designer_base/src/com/fr/design/layout/TableLayoutConstraints.java delete mode 100644 designer_base/src/com/fr/design/layout/TableLayoutTest.java delete mode 100644 designer_base/src/com/fr/design/layout/VerticalFlowLayout.java delete mode 100644 designer_base/src/com/fr/design/mainframe/AbstractAppProvider.java delete mode 100644 designer_base/src/com/fr/design/mainframe/App.java delete mode 100644 designer_base/src/com/fr/design/mainframe/DecodeDialog.java delete mode 100644 designer_base/src/com/fr/design/mainframe/DesignerBean.java delete mode 100644 designer_base/src/com/fr/design/mainframe/DesignerContext.java delete mode 100644 designer_base/src/com/fr/design/mainframe/DesignerFrame.java delete mode 100644 designer_base/src/com/fr/design/mainframe/DesignerFrameFileDealerPane.java delete mode 100644 designer_base/src/com/fr/design/mainframe/DesktopCardPane.java delete mode 100644 designer_base/src/com/fr/design/mainframe/EastRegionContainerPane.java delete mode 100644 designer_base/src/com/fr/design/mainframe/FormScrollBar.java delete mode 100644 designer_base/src/com/fr/design/mainframe/JTemplate.java delete mode 100644 designer_base/src/com/fr/design/mainframe/JTemplateProvider.java delete mode 100644 designer_base/src/com/fr/design/mainframe/JViewContainer.java delete mode 100644 designer_base/src/com/fr/design/mainframe/TemplatePane.java delete mode 100644 designer_base/src/com/fr/design/mainframe/UndoStateEdit.java delete mode 100644 designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java delete mode 100644 designer_base/src/com/fr/design/mainframe/backgroundpane/ImagePreviewPane.java delete mode 100644 designer_base/src/com/fr/design/mainframe/dnd/ArrayListTransferHandler.java delete mode 100644 designer_base/src/com/fr/design/mainframe/dnd/ArrayListTransferable.java delete mode 100644 designer_base/src/com/fr/design/mainframe/dnd/ArrayTransferable.java delete mode 100644 designer_base/src/com/fr/design/mainframe/dnd/SerializableTransferable.java delete mode 100644 designer_base/src/com/fr/design/mainframe/form/FormECCompositeProvider.java delete mode 100644 designer_base/src/com/fr/design/mainframe/form/FormECDesignerProvider.java delete mode 100644 designer_base/src/com/fr/design/mainframe/loghandler/DesignerLogHandler.java delete mode 100644 designer_base/src/com/fr/design/mainframe/loghandler/DesignerLogImpl.java delete mode 100644 designer_base/src/com/fr/design/mainframe/loghandler/LogDetailPane.java delete mode 100644 designer_base/src/com/fr/design/mainframe/loghandler/LogHandlerBar.java delete mode 100644 designer_base/src/com/fr/design/mainframe/loghandler/LogHandlerBarUI.java delete mode 100644 designer_base/src/com/fr/design/mainframe/loghandler/LogMessageBar.java delete mode 100644 designer_base/src/com/fr/design/mainframe/widget/editors/AbstractPropertyEditor.java delete mode 100644 designer_base/src/com/fr/design/mainframe/widget/editors/DataBindingEditor.java delete mode 100644 designer_base/src/com/fr/design/mainframe/widget/editors/DataTableEditor.java delete mode 100644 designer_base/src/com/fr/design/mainframe/widget/editors/FormattedEditor.java delete mode 100644 designer_base/src/com/fr/design/mainframe/widget/editors/IntegerPropertyEditor.java delete mode 100644 designer_base/src/com/fr/design/mainframe/widget/editors/PropertyCellEditor.java delete mode 100644 designer_base/src/com/fr/design/mainframe/widget/editors/ServerDataBindingEditor.java delete mode 100644 designer_base/src/com/fr/design/mainframe/widget/editors/ServerDataTableEditor.java delete mode 100644 designer_base/src/com/fr/design/mainframe/widget/editors/StringEditor.java delete mode 100644 designer_base/src/com/fr/design/mainframe/widget/editors/WidgetValueEditor.java delete mode 100644 designer_base/src/com/fr/design/menu/DottedSeparator.java delete mode 100644 designer_base/src/com/fr/design/menu/DottedSeparatorUI.java delete mode 100644 designer_base/src/com/fr/design/menu/KeySetUtils.java delete mode 100644 designer_base/src/com/fr/design/menu/LineSeparator.java delete mode 100644 designer_base/src/com/fr/design/menu/MenuDef.java delete mode 100644 designer_base/src/com/fr/design/menu/MenuKeySet.java delete mode 100644 designer_base/src/com/fr/design/menu/MenuManager.java delete mode 100644 designer_base/src/com/fr/design/menu/NameSeparator.java delete mode 100644 designer_base/src/com/fr/design/menu/SeparatorDef.java delete mode 100644 designer_base/src/com/fr/design/menu/ShortCut.java delete mode 100644 designer_base/src/com/fr/design/menu/ToolBarDef.java delete mode 100644 designer_base/src/com/fr/design/menu/TwoDottedSeparatorUI.java delete mode 100644 designer_base/src/com/fr/design/menu/UISeparatorUI.java delete mode 100644 designer_base/src/com/fr/design/module/DesignModule.java delete mode 100644 designer_base/src/com/fr/design/object/NameObject.java delete mode 100644 designer_base/src/com/fr/design/parameter/ParameterArrayPane.java delete mode 100644 designer_base/src/com/fr/design/parameter/ParameterGroup.java delete mode 100644 designer_base/src/com/fr/design/parameter/ParameterInputPane.java delete mode 100644 designer_base/src/com/fr/design/parameter/ParameterManagerPane.java delete mode 100644 designer_base/src/com/fr/design/parameter/ParameterPane.java delete mode 100644 designer_base/src/com/fr/design/present/DictPresentPane.java delete mode 100644 designer_base/src/com/fr/design/present/FormulaPresentPane.java delete mode 100644 designer_base/src/com/fr/design/present/NonePresentPane.java delete mode 100644 designer_base/src/com/fr/design/present/dict/AbstractDicPane.java delete mode 100644 designer_base/src/com/fr/design/present/dict/CustomDictCorrelationPane.java delete mode 100644 designer_base/src/com/fr/design/present/dict/CustomDictPane.java delete mode 100644 designer_base/src/com/fr/design/present/dict/DatabaseDictPane.java delete mode 100644 designer_base/src/com/fr/design/present/dict/DictionaryPane.java delete mode 100644 designer_base/src/com/fr/design/roleAuthority/UIRoleTreeUI.java delete mode 100644 designer_base/src/com/fr/design/scrollruler/BaseRuler.java delete mode 100644 designer_base/src/com/fr/design/scrollruler/HorizontalRuler.java delete mode 100644 designer_base/src/com/fr/design/scrollruler/HorizontalRulerUI.java delete mode 100644 designer_base/src/com/fr/design/scrollruler/ModLineBorder.java delete mode 100644 designer_base/src/com/fr/design/scrollruler/RulerLayout.java delete mode 100644 designer_base/src/com/fr/design/scrollruler/RulerUI.java delete mode 100644 designer_base/src/com/fr/design/scrollruler/ScrollRulerComponent.java delete mode 100644 designer_base/src/com/fr/design/scrollruler/VerticalRuler.java delete mode 100644 designer_base/src/com/fr/design/scrollruler/VerticalRulerUI.java delete mode 100644 designer_base/src/com/fr/design/selection/QuickEditor.java delete mode 100644 designer_base/src/com/fr/design/selection/SelectableElement.java delete mode 100644 designer_base/src/com/fr/design/selection/Selectedable.java delete mode 100644 designer_base/src/com/fr/design/selection/SelectionEvent.java delete mode 100644 designer_base/src/com/fr/design/selection/SelectionListener.java delete mode 100644 designer_base/src/com/fr/design/style/AbstractPopBox.java delete mode 100644 designer_base/src/com/fr/design/style/AbstractSelectBox.java delete mode 100644 designer_base/src/com/fr/design/style/AlignmentPane.java delete mode 100644 designer_base/src/com/fr/design/style/AlphaPane.java delete mode 100644 designer_base/src/com/fr/design/style/BorderPane.java delete mode 100644 designer_base/src/com/fr/design/style/ChooseFileView.java delete mode 100644 designer_base/src/com/fr/design/style/CustomSelectBox.java delete mode 100644 designer_base/src/com/fr/design/style/FRFontPane.java delete mode 100644 designer_base/src/com/fr/design/style/FRFontPreviewArea.java delete mode 100644 designer_base/src/com/fr/design/style/FontFamilyPane.java delete mode 100644 designer_base/src/com/fr/design/style/FontSizeStylePane.java delete mode 100644 designer_base/src/com/fr/design/style/FormatBox.java delete mode 100644 designer_base/src/com/fr/design/style/FormatPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/BackgroundCustomJComponent.java delete mode 100644 designer_base/src/com/fr/design/style/background/BackgroundJComponent.java delete mode 100644 designer_base/src/com/fr/design/style/background/BackgroundPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/BackgroundPane4BoxChange.java delete mode 100644 designer_base/src/com/fr/design/style/background/BackgroundPreviewLabel.java delete mode 100644 designer_base/src/com/fr/design/style/background/BackgroundSelectPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/BackgroundUIComboBoxNoImagePane.java delete mode 100644 designer_base/src/com/fr/design/style/background/BackgroundUIComboBoxPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/gradient/GradientBackgroundSelectPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/gradient/GradientBar.java delete mode 100644 designer_base/src/com/fr/design/style/background/gradient/GradientChangeBoxPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/gradient/GradientFromToPixPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/gradient/GradientSelectBox.java delete mode 100644 designer_base/src/com/fr/design/style/background/gradient/SelectColorPointBtn.java delete mode 100644 designer_base/src/com/fr/design/style/background/image/ImageFileChooser.java delete mode 100644 designer_base/src/com/fr/design/style/background/image/ImagePreviewPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/image/ImageSelectPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/pattern/PatternSelectBox.java delete mode 100644 designer_base/src/com/fr/design/style/background/pattern/PatternSelectPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/pattern/PatternUIComboBoxPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/texture/TextureSelectBox.java delete mode 100644 designer_base/src/com/fr/design/style/background/texture/TextureSelectPane.java delete mode 100644 designer_base/src/com/fr/design/style/background/texture/TextureUIComboBoxPane.java delete mode 100644 designer_base/src/com/fr/design/style/color/ColorCell.java delete mode 100644 designer_base/src/com/fr/design/style/color/ColorChooserPreview.java delete mode 100644 designer_base/src/com/fr/design/style/color/ColorControlWindow.java delete mode 100644 designer_base/src/com/fr/design/style/color/ColorFactory.java delete mode 100644 designer_base/src/com/fr/design/style/color/ColorSelectBox.java delete mode 100644 designer_base/src/com/fr/design/style/color/ColorSelectConfigManager.java delete mode 100644 designer_base/src/com/fr/design/style/color/ColorSelectDetailPane.java delete mode 100644 designer_base/src/com/fr/design/style/color/ColorSelectDialog.java delete mode 100644 designer_base/src/com/fr/design/style/color/ColorSelectPane.java delete mode 100644 designer_base/src/com/fr/design/style/color/ColorSelectable.java delete mode 100644 designer_base/src/com/fr/design/style/color/ColorUIComboBoxPane.java delete mode 100644 designer_base/src/com/fr/design/style/color/CustomChooserPanel.java delete mode 100644 designer_base/src/com/fr/design/style/color/DetailColorSelectPane.java delete mode 100644 designer_base/src/com/fr/design/style/color/NewColorSelectBox.java delete mode 100644 designer_base/src/com/fr/design/style/color/NewColorSelectPane.java delete mode 100644 designer_base/src/com/fr/design/style/color/RecentUseColorPane.java delete mode 100644 designer_base/src/com/fr/design/style/color/SwatchChooserPanel.java delete mode 100644 designer_base/src/com/fr/design/style/color/TransparentColorControlWindow.java delete mode 100644 designer_base/src/com/fr/design/style/color/TransparentPane.java delete mode 100644 designer_base/src/com/fr/design/style/color/UIToolbarColorButton.java delete mode 100644 designer_base/src/com/fr/design/style/color/UsedColorPane.java delete mode 100644 designer_base/src/com/fr/design/utils/ColorRoutines.java delete mode 100644 designer_base/src/com/fr/design/utils/DesignUtils.java delete mode 100644 designer_base/src/com/fr/design/utils/DrawRoutines.java delete mode 100644 designer_base/src/com/fr/design/utils/ThemeUtils.java delete mode 100644 designer_base/src/com/fr/design/utils/gui/GUICoreUtils.java delete mode 100644 designer_base/src/com/fr/design/utils/gui/GUIPaintUtils.java delete mode 100644 designer_base/src/com/fr/design/utils/gui/JListUtils.java delete mode 100644 designer_base/src/com/fr/design/utils/gui/LayoutUtils.java delete mode 100644 designer_base/src/com/fr/design/web/CustomIconPane.java delete mode 100644 designer_base/src/com/fr/design/widget/IconDefinePane.java delete mode 100644 designer_base/src/com/fr/design/widget/btn/ButtonConstants.java delete mode 100644 designer_base/src/com/fr/design/widget/btn/ButtonDetailPane.java delete mode 100644 designer_base/src/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java delete mode 100644 designer_base/src/com/fr/design/write/submit/CustomSubmitJobPane.java delete mode 100644 designer_base/src/com/fr/design/write/submit/DBManipulationInWidgetEventPane.java delete mode 100644 designer_base/src/com/fr/design/write/submit/DBManipulationPane.java delete mode 100644 designer_base/src/com/fr/design/write/submit/DMLJobPane.java delete mode 100644 designer_base/src/com/fr/design/write/submit/SubmitJobListPane.java delete mode 100644 designer_base/src/com/fr/env/EnvListPane.java delete mode 100644 designer_base/src/com/fr/env/RemoteEnv.java delete mode 100644 designer_base/src/com/fr/env/RemoteSignInPane.java delete mode 100644 designer_base/src/com/fr/env/SignIn.java delete mode 100644 designer_base/src/com/fr/file/FILE.java delete mode 100644 designer_base/src/com/fr/file/FILEChooserPane.java delete mode 100644 designer_base/src/com/fr/file/FILEFactory.java delete mode 100644 designer_base/src/com/fr/file/FileFILE.java delete mode 100644 designer_base/src/com/fr/file/FileNodeFILE.java delete mode 100644 designer_base/src/com/fr/file/MemFILE.java delete mode 100644 designer_base/src/com/fr/file/filter/ChooseFileFilter.java delete mode 100644 designer_base/src/com/fr/file/filter/FILEFilter.java delete mode 100644 designer_base/src/com/fr/file/filter/OnlyShowDirectoryFileFilter.java delete mode 100644 designer_base/src/com/fr/start/BBSGuestPaneProvider.java delete mode 100644 designer_base/src/com/fr/start/BaseDesigner.java delete mode 100644 designer_base/src/com/fr/start/Demo.java delete mode 100644 designer_base/src/com/fr/start/SplashPane.java delete mode 100644 designer_base/src/com/fr/start/SplashWindow.java delete mode 100644 designer_base/src/com/fr/start/StartDocURL.java delete mode 100644 designer_base/src/com/fr/start/StartServer.java delete mode 100644 designer_base/src/com/fr/start/server/MultiOutputStream.java delete mode 100644 designer_base/src/com/fr/start/server/ServerManageFrame.java delete mode 100644 designer_base/src/com/fr/start/server/ServerTray.java delete mode 100644 designer_chart/.classpath delete mode 100644 designer_chart/.project delete mode 100644 designer_chart/build.9.0.gradle delete mode 100644 designer_chart/build.9.0.gradle.bak delete mode 100644 designer_chart/build.chart.gradle delete mode 100644 designer_chart/build.dev.gradle delete mode 100644 designer_chart/build.dev.gradle.bak delete mode 100644 designer_chart/build.master.gradle delete mode 100644 designer_chart/build.master.gradle.bak delete mode 100644 designer_chart/build.performance.gradle delete mode 100644 designer_chart/build.performance.gradle.bak delete mode 100644 designer_chart/build.release.gradle delete mode 100644 designer_chart/src/com/fr/design/chart/ChartAxisFactory.java delete mode 100644 designer_chart/src/com/fr/design/chart/ChartCommonWizardPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/ChartComponentPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/ChartControlPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/ChartDialog.java delete mode 100644 designer_chart/src/com/fr/design/chart/ChartPlotFactory.java delete mode 100644 designer_chart/src/com/fr/design/chart/ChartSwingUtils.java delete mode 100644 designer_chart/src/com/fr/design/chart/ChartTypePane.java delete mode 100644 designer_chart/src/com/fr/design/chart/ChartWizardPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/FactoryObject.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/AxisStyleObject.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/AxisStylePane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/BinaryChartStyleAxisPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/ChartAlertLinePane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/ChartAlertValueInTopBottomPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/ChartAlertValuePane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/ChartStyleAxisPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/CustomChartStyleAxisPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/GanntChartStyleAxisPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/MinMaxValuePane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/RadarChartStyleAxisPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/TernaryChartStyleAxisPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/ValueChartStyleAxisPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/axis/XYChartStyleAxisPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/comp/BorderAttriPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/demo/GlyphDemo.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/ActiveGlyphFactory.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/ChartComponent.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/ChartWidgetOption.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/ActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/AlertValueActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/AxisActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/CategoryAxisActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/ChartActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/DataLabelActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/DataSeriesActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/DataSheetActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/DateAxisActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/LegendActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/PlotActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/RadarAxisActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/RangeAxisActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/TextActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/TrendLineActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/ValueAxisActiveGlyph.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/action/ChartComponentAction.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/action/SetAnalysisLineStyleAction.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/action/SetAxisStyleAction.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/action/SetChartStyleAciton.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/action/SetDataLabelStyleAction.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSeriesAttrAction.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSheetAction.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/action/SetLegendStyleAction.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/action/SetPlotStyleAction.java delete mode 100644 designer_chart/src/com/fr/design/chart/gui/active/action/SetTitleStyleAction.java delete mode 100644 designer_chart/src/com/fr/design/chart/javascript/ChartEmailPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/GisMapDataPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/GisMapTableDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapCubeDataPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapCubeLayerPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapCubeSetDataPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapDataPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapMoreCubeLayerPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapMoreTableIndexPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapReportCubeDataPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapReportDataSinglePane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapReportEditor.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapReportRenderer.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapSinglePane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapTableCubeDataPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/report/MapTableDataSinglePane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/PlotSeries/MapCustomPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/PlotSeries/MapDefiAreaNamePane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/PlotSeries/MapImageEditPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/PlotSeries/MapSelectShape.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/PlotStyle/ChartSelectDemoPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/BubblePlotChartConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/ChartConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/ChartConditionPaneFactory.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/ConditionTrendLinePane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataLabelContentsPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataLabelStylePane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesAttrCustomPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesAttrPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesCustomConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/GanttPlotChartConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/MapPlotChartConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/PiePlotChartConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/TooltipContentsPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/TrendLineControlPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/XYPlotChartConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/AreaDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/Bar2DDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/Bar3DDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/BubbleDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/DataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/GanttDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/LineDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/MapDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/MeterDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/PieDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/RadarDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/RangeDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/StockDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/XYDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/Area3DPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/AreaPlotDataSeriesCondtionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/Bar2DTrendLineDSConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/Bar3DPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/BarPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/BubblePlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPopAttrPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperRelateCellLinkPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperRelateFloatLinkPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4AreaConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4BarNoTrendLineConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4BarTrendLineConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4LineConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/DataSeriesConditionPaneFactory.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/Donut2DPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/FormHyperlinkNorthPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/FormHyperlinkPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/GanttPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/LinePlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/MapPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/MeterPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/Pie3DPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/PiePlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/RadarPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/StockPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/XYScatterPlotDataSeriesConditionPane.java delete mode 100644 designer_chart/src/com/fr/design/gui/xcombox/ComboBoxUseEditor.java delete mode 100644 designer_chart/src/com/fr/design/gui/xcombox/MarkerComboBox.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/ChartPropertyPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/MiddleChartPropertyPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/TargetComponentContainer.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/AbstractChartAttrPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/AttributeChange.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/ChartEditPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/ChartHyperEditPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/PaneTitleConstants.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/ChartDataPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/ChartOtherPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/ChartStylePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/CalculateComboBox.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/ChartDataFilterPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/DataContentsPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/DatabaseTableDataPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/PresentComboBox.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/ReportDataPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/TableDataPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/AbstractReportDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/BubblePlotReportDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotMoreCateReportDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotReportDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/GanttPlotReportDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/MeterPlotReportDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/PiePlotReportDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/StockPlotReportDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/XYScatterPlotReportDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/AbstractTableDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/BubblePlotTableDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/GanttPlotTableDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/MeterPlotTableDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/PiePlotTableDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldNamePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldValuePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/SeriesTypeUseComboxPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/StockPlotTableDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/XYScatterPlotTableDataContentPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartConditionAttrPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartInteractivePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartSwitchPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/AbstractChartTabPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartAccColorPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartAxisLineStylePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartAxisTitlePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartAxisValueTypePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartBackgroundNoImagePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartBackgroundPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartBeautyPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartBorderPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartDataPointLabel4MapPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartDatapointLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartFillStylePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartPreFillStylePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartTextAttrNoFontSizePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/ThirdTabPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/analysisline/ChartAnalysisLinePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartAreaPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartAxisAreaPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartPlotAreaPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartWholeAreaPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/DefaultAxisAreaPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/Plot3DAxisAreaPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/RadarAxisAreaPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartAxisPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartAxisUsePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartCategoryPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartPercentValuePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartRadarPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartSecondValuePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartValuePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/datalabel/ChartDataLabelPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/datasheet/ChartDatasheetPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/legend/AutoSelectedPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/legend/ChartLegendPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/AbstractPlotSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Area3DSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/AreaSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Bar2DSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Bar3DSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/BubbleSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/ChartSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/ColorPickerPaneNumFiled.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/CustomSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Donut2DSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/FunnelSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/LineSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/MapSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/MeterSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Pie2DSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Pie3DSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/RadarSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/RangeSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/StockSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/UIColorPickerPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/XYScatterSeriesPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/AbstractBarPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/BarPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/BubblePlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/CustomPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/DonutPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/FunnelPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/GanttPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/GisMapPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/LinePlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/MapPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/PiePlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/RadarPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/RangePlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/StockPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/mainframe/chart/gui/type/XYScatterPlotPane.java delete mode 100644 designer_chart/src/com/fr/design/module/ChartDesignerModule.java delete mode 100644 designer_chart/src/com/fr/design/module/ChartHyperlinkGroup.java delete mode 100644 designer_chart/src/com/fr/design/module/ChartPreStyleAction.java delete mode 100644 designer_chart/src/com/fr/design/module/ChartPreStyleManagerPane.java delete mode 100644 designer_chart/src/com/fr/design/module/ChartPreStylePane.java delete mode 100644 designer_chart/src/com/fr/design/module/FormHyperlinkGroup.java delete mode 100644 designer_form/.classpath delete mode 100644 designer_form/.project delete mode 100644 designer_form/build.9.0.gradle delete mode 100644 designer_form/build.9.0.gradle.bak delete mode 100644 designer_form/build.dev.gradle delete mode 100644 designer_form/build.dev.gradle.bak delete mode 100644 designer_form/build.form.gradle delete mode 100644 designer_form/build.master.gradle delete mode 100644 designer_form/build.master.gradle.bak delete mode 100644 designer_form/build.performance.gradle delete mode 100644 designer_form/build.performance.gradle.bak delete mode 100644 designer_form/build.release.gradle delete mode 100644 designer_form/src/com/fr/design/designer/beans/AdapterBus.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/ComponentAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/ConnectorCreator.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/HoverPainter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/actions/ConnectionAction.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/actions/CutAction.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/actions/FormEditAction.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/actions/PasteAction.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/component/CompositeComponentAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/AbsoluteLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/DefaultLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRBorderLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRCardLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRGridLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRHorizontalLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRHorizontalSplitLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRParameterLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRScaleLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRTitleLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRVerticalLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/adapters/layout/FRVerticalSplitLayoutAdapter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/events/DesignerEditListener.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/events/DesignerEditor.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/events/DesignerEvent.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/Add.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/Bottom.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/Direction.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/Inner.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/Left.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/LeftBottom.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/LeftTop.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/Location.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/Outer.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/Right.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/RightBottom.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/RightTop.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/RootResizeDirection.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/location/Top.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/painters/FRBorderLayoutPainter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/painters/FRFitLayoutPainter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/painters/FRParameterLayoutPainter.java delete mode 100644 designer_form/src/com/fr/design/designer/beans/painters/NullLayoutPainter.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/FormCardPane.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/NullCreator.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XAbstractSplitLayout.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XChartEditor.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XComponent.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XConnector.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XCreatorTools.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XDataTable.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XEditorHolder.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XElementCase.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XNameWidget.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XTableTree.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XWFitLayout.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XWHorizontalSplitLayout.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XWScaleLayout.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XWTitleLayout.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XWVerticalSplitLayout.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/XWrapperedFieldEditor.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/cardlayout/XCardAddButton.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java delete mode 100644 designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/BoundsGroupModel.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/CardDefaultShowEditor.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/CardDefaultShowRenderer.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/CardDefaultShowWrapper.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/CardLayoutConstraints.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/DelegateEditor.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/FRCardConstraintsEditor.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/FRFitLayoutConstraints.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/FRTabFitLayoutPropertiesGroupModel.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/FitStateRenderer.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/FitStateWrapper.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/FormWidgetAuthorityEditPane.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/HVLayoutConstraints.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/HorizontalSplitProperties.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/MultiSelectionBoundsModel.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/VerticalBoxProperties.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/VerticalSplitProperties.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/WidgetPropertyTable.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/items/FRFitConstraintsItems.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/items/LabelHorizontalAlignmentItems.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/items/UnderlineItems.java delete mode 100644 designer_form/src/com/fr/design/designer/properties/items/WidgetDisplayPositionItems.java delete mode 100644 designer_form/src/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java delete mode 100644 designer_form/src/com/fr/design/designer/treeview/ComponentTreeModel.java delete mode 100644 designer_form/src/com/fr/design/form/javascript/FormEmailPane.java delete mode 100644 designer_form/src/com/fr/design/form/layout/FRAbsoluteLayout.java delete mode 100644 designer_form/src/com/fr/design/form/layout/FRFitLayout.java delete mode 100644 designer_form/src/com/fr/design/form/layout/FRFlowLayout.java delete mode 100644 designer_form/src/com/fr/design/form/layout/FRHorizontalSplitLayout.java delete mode 100644 designer_form/src/com/fr/design/form/layout/FRScaleLayout.java delete mode 100644 designer_form/src/com/fr/design/form/layout/FRSplitLayout.java delete mode 100644 designer_form/src/com/fr/design/form/layout/FRTitleLayout.java delete mode 100644 designer_form/src/com/fr/design/form/layout/FRVerticalSplitLayout.java delete mode 100644 designer_form/src/com/fr/design/form/parameter/FormParaTargetMode.java delete mode 100644 designer_form/src/com/fr/design/gui/core/FormWidgetOption.java delete mode 100644 designer_form/src/com/fr/design/gui/xpane/CardTagLayoutBorderPane.java delete mode 100644 designer_form/src/com/fr/design/gui/xpane/CardTagLayoutBorderPreviewPane.java delete mode 100644 designer_form/src/com/fr/design/gui/xpane/FormHyperlinkGroupPane.java delete mode 100644 designer_form/src/com/fr/design/gui/xpane/JTreeAutoBuildPane.java delete mode 100644 designer_form/src/com/fr/design/gui/xpane/LayoutBorderPane.java delete mode 100644 designer_form/src/com/fr/design/gui/xpane/LayoutBorderPreviewPane.java delete mode 100644 designer_form/src/com/fr/design/gui/xpane/ToolTipEditor.java delete mode 100644 designer_form/src/com/fr/design/gui/xtable/PropertyGroupModel.java delete mode 100644 designer_form/src/com/fr/design/mainframe/AutoScrollSource.java delete mode 100644 designer_form/src/com/fr/design/mainframe/ComponentTree.java delete mode 100644 designer_form/src/com/fr/design/mainframe/ConnectorHelper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/CoverReportPane.java delete mode 100644 designer_form/src/com/fr/design/mainframe/DesignerTransferHandler.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormArea.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormCreatorDropTarget.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormDesigner.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormDesignerDropTarget.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormDesignerModeForSpecial.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormDesignerUI.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormEditorKeyListener.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormHierarchyTreePane.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormModelAdapter.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormParaPane.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormParaWidgetPane.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormSelection.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormTargetMode.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormWidgetDetailPane.java delete mode 100644 designer_form/src/com/fr/design/mainframe/FormWidgetPopWindow.java delete mode 100644 designer_form/src/com/fr/design/mainframe/TabChangeAction.java delete mode 100644 designer_form/src/com/fr/design/mainframe/ToolBarButton.java delete mode 100644 designer_form/src/com/fr/design/mainframe/TreeTransferHandler.java delete mode 100644 designer_form/src/com/fr/design/mainframe/WidgetToolBarPane.java delete mode 100644 designer_form/src/com/fr/design/mainframe/actions/EmbeddedFormExportExportAction.java delete mode 100644 designer_form/src/com/fr/design/mainframe/actions/NewFormAction.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleCardTagWLayoutBorderStyleEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleColorEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleDateEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleDimensionEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleFontEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleGridWidgetEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleParameterEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessiblePropertyEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleRegexEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleWLayoutBorderStyleEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleWidgetValueEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/BooleanEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/BorderLayoutDirectionEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/ButtonTypeEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/CardTagWLayoutBorderStyleEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/ColorEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/ComboEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/DataTableConfigPane.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/DateFormatEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/DateRangeEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/DictionaryEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/DimensionEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/FitLayoutDirectionEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/FontEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/ImgBackgroundEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/InChangeBooleanEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/ItemCellEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/NameWidgetComboboxEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/PaddingMarginPane.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/ParameterEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/PercentageEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/RegexEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/TreeModelEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/WLayoutBorderStyleEditor.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/editors/WidgetDisplayPosition.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/ColorCellRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/DateCellRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/DimensionCellRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/EncoderCellRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/FontCellRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/GridWidgetRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/LabelHorizontalAlignmentRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/ParameterRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/PointCellRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/PropertyCellRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/RectangleCellRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/RegexCellRencerer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/TreeModelRenderer.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/renderer/WidgetDisplayPositionRender.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/ColorWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/DateWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/DimensionWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/FontWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/GridWidgetWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/LabelHorizontalAlignmentWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/LayoutBorderStyleWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/ParameterWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/PointWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/RectangleWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/RegexWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/WidgetDisplayPositionWrapper.java delete mode 100644 designer_form/src/com/fr/design/mainframe/widget/wrappers/WrapperUtils.java delete mode 100644 designer_form/src/com/fr/design/module/FormDesignerModule.java delete mode 100644 designer_form/src/com/fr/design/parameter/ParameterPropertyPane.java delete mode 100644 designer_form/src/com/fr/design/parameter/ParameterToolBarPane.java delete mode 100644 designer_form/src/com/fr/design/widget/ui/btn/FormSubmitButtonDetailPane.java delete mode 100644 sonar-dev-project.properties delete mode 100644 start.bat diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 20c9ef128d..0000000000 --- a/.gitattributes +++ /dev/null @@ -1,3561 +0,0 @@ -* text=auto !eol -designer/.classpath -text -designer/.project -text -designer/designer.iml -text -designer/src/com/fr/design/actions/ButtonGroupAction.java -text -designer/src/com/fr/design/actions/CellSelectionAction.java -text -designer/src/com/fr/design/actions/ElementCaseAction.java -text -designer/src/com/fr/design/actions/FloatSelectionAction.java -text -designer/src/com/fr/design/actions/JWorkBookAction.java -text -designer/src/com/fr/design/actions/PresentCheckBoxAction.java -text -designer/src/com/fr/design/actions/ReportComponentAction.java -text -designer/src/com/fr/design/actions/cell/AbstractCellElementAction.java -text -designer/src/com/fr/design/actions/cell/BorderAction.java -text -designer/src/com/fr/design/actions/cell/CellAttributeAction.java -text -designer/src/com/fr/design/actions/cell/CellAttributeTableAction.java -text -designer/src/com/fr/design/actions/cell/CellExpandAttrAction.java -text -designer/src/com/fr/design/actions/cell/CellWidgetAttrAction.java -text -designer/src/com/fr/design/actions/cell/CleanAuthorityAction.java -text -designer/src/com/fr/design/actions/cell/ConditionAttributesAction.java -text -designer/src/com/fr/design/actions/cell/EditCellAction.java -text -designer/src/com/fr/design/actions/cell/FloatStyleAction.java -text -designer/src/com/fr/design/actions/cell/GlobalStyleMenuDef.java -text -designer/src/com/fr/design/actions/cell/NewPresentAction.java -text -designer/src/com/fr/design/actions/cell/StyleAction.java -text -designer/src/com/fr/design/actions/cell/UIToolbarBorderButton.java -text -designer/src/com/fr/design/actions/cell/style/AbstractStyleAction.java -text -designer/src/com/fr/design/actions/cell/style/AlignmentAction.java -text -designer/src/com/fr/design/actions/cell/style/ReportFontBoldAction.java -text -designer/src/com/fr/design/actions/cell/style/ReportFontForegroundAction.java -text -designer/src/com/fr/design/actions/cell/style/ReportFontItalicAction.java -text -designer/src/com/fr/design/actions/cell/style/ReportFontNameAction.java -text -designer/src/com/fr/design/actions/cell/style/ReportFontSizeAction.java -text -designer/src/com/fr/design/actions/cell/style/ReportFontUnderlineAction.java -text -designer/src/com/fr/design/actions/cell/style/StyleActionInterface.java -text -designer/src/com/fr/design/actions/cell/style/StyleBackgroundAction.java -text -designer/src/com/fr/design/actions/columnrow/AbstractColumnRowIndexAction.java -text -designer/src/com/fr/design/actions/columnrow/CancelColumnAction.java -text -designer/src/com/fr/design/actions/columnrow/CancelRowAction.java -text -designer/src/com/fr/design/actions/columnrow/ColumnHideAction.java -text -designer/src/com/fr/design/actions/columnrow/ColumnRowRepeatAction.java -text -designer/src/com/fr/design/actions/columnrow/ColumnRowSizingAction.java -text -designer/src/com/fr/design/actions/columnrow/ColumnWidthAction.java -text -designer/src/com/fr/design/actions/columnrow/DSColumnAdvancedAction.java -text -designer/src/com/fr/design/actions/columnrow/DSColumnBasicAction.java -text -designer/src/com/fr/design/actions/columnrow/DSColumnConditionAction.java -text -designer/src/com/fr/design/actions/columnrow/DeleteColumnAction.java -text -designer/src/com/fr/design/actions/columnrow/DeleteRowAction.java -text -designer/src/com/fr/design/actions/columnrow/FootColumnAction.java -text -designer/src/com/fr/design/actions/columnrow/FootRowAction.java -text -designer/src/com/fr/design/actions/columnrow/HeadColumnAction.java -text -designer/src/com/fr/design/actions/columnrow/HeadRowAction.java -text -designer/src/com/fr/design/actions/columnrow/InsertColumnAction.java -text -designer/src/com/fr/design/actions/columnrow/InsertRowAction.java -text -designer/src/com/fr/design/actions/columnrow/ResetColumnHideAction.java -text -designer/src/com/fr/design/actions/columnrow/ResetRowHideAction.java -text -designer/src/com/fr/design/actions/columnrow/RowHeightAction.java -text -designer/src/com/fr/design/actions/columnrow/RowHideAction.java -text -designer/src/com/fr/design/actions/edit/DeleteAction.java -text -designer/src/com/fr/design/actions/edit/EditFloatElementNameAction.java -text -designer/src/com/fr/design/actions/edit/HyperlinkAction.java -text -designer/src/com/fr/design/actions/edit/clear/ClearAction.java -text -designer/src/com/fr/design/actions/edit/clear/ClearAllAction.java -text -designer/src/com/fr/design/actions/edit/clear/ClearContentsAction.java -text -designer/src/com/fr/design/actions/edit/clear/ClearFormatsAction.java -text -designer/src/com/fr/design/actions/edit/clear/ClearWidgetAction.java -text -designer/src/com/fr/design/actions/edit/merge/MergeCellAction.java -text -designer/src/com/fr/design/actions/edit/merge/UnmergeCellAction.java -text -designer/src/com/fr/design/actions/edit/order/AbstractFloatElementOrderAction.java -text -designer/src/com/fr/design/actions/edit/order/BringFloatElementForwardAction.java -text -designer/src/com/fr/design/actions/edit/order/BringFloatElementToFrontAction.java -text -designer/src/com/fr/design/actions/edit/order/SendFloatElementBackwardAction.java -text -designer/src/com/fr/design/actions/edit/order/SendFloatElementToBackAction.java -text -designer/src/com/fr/design/actions/file/export/AbstractExcelExportAction.java -text -designer/src/com/fr/design/actions/file/export/AbstractExportAction.java -text -designer/src/com/fr/design/actions/file/export/CSVExportAction.java -text -designer/src/com/fr/design/actions/file/export/EmbeddedExportExportAction.java -text -designer/src/com/fr/design/actions/file/export/ExcelExportAction.java -text -designer/src/com/fr/design/actions/file/export/PDFExportAction.java -text -designer/src/com/fr/design/actions/file/export/PageExcelExportAction.java -text -designer/src/com/fr/design/actions/file/export/PageToSheetExcelExportAction.java -text -designer/src/com/fr/design/actions/file/export/SVGExportAction.java -text -designer/src/com/fr/design/actions/file/export/TextExportAction.java -text -designer/src/com/fr/design/actions/file/export/WordExportAction.java -text -designer/src/com/fr/design/actions/file/newReport/NewOEMWorkBookAction.java -text -designer/src/com/fr/design/actions/file/newReport/NewPolyReportAction.java -text -designer/src/com/fr/design/actions/file/newReport/NewWorkBookAction.java -text -designer/src/com/fr/design/actions/form/AbastractFormECAction.java -text -designer/src/com/fr/design/actions/form/FormECBackgroundAction.java -text -designer/src/com/fr/design/actions/form/FormECColumnsAction.java -text -designer/src/com/fr/design/actions/form/FormECFrozenAction.java -text -designer/src/com/fr/design/actions/insert/cell/AbstractCellAction.java -text -designer/src/com/fr/design/actions/insert/cell/BiasCellAction.java -text -designer/src/com/fr/design/actions/insert/cell/ChartCellAction.java -text -designer/src/com/fr/design/actions/insert/cell/DSColumnCellAction.java -text -designer/src/com/fr/design/actions/insert/cell/FormulaCellAction.java -text -designer/src/com/fr/design/actions/insert/cell/GeneralCellAction.java -text -designer/src/com/fr/design/actions/insert/cell/ImageCellAction.java -text -designer/src/com/fr/design/actions/insert/cell/RichTextCellAction.java -text -designer/src/com/fr/design/actions/insert/cell/SubReportCellAction.java -text -designer/src/com/fr/design/actions/insert/flot/AbstractShapeAction.java -text -designer/src/com/fr/design/actions/insert/flot/ChartFloatAction.java -text -designer/src/com/fr/design/actions/insert/flot/FormulaFloatAction.java -text -designer/src/com/fr/design/actions/insert/flot/ImageFloatAction.java -text -designer/src/com/fr/design/actions/insert/flot/TextBoxFloatAction.java -text -designer/src/com/fr/design/actions/report/ReportBackgroundAction.java -text -designer/src/com/fr/design/actions/report/ReportColumnsAction.java -text -designer/src/com/fr/design/actions/report/ReportEngineAttrAction.java -text -designer/src/com/fr/design/actions/report/ReportExportAttrAction.java -text -designer/src/com/fr/design/actions/report/ReportFooterAction.java -text -designer/src/com/fr/design/actions/report/ReportHeaderAction.java -text -designer/src/com/fr/design/actions/report/ReportPageAttrAction.java -text -designer/src/com/fr/design/actions/report/ReportPageSetupAction.java -text -designer/src/com/fr/design/actions/report/ReportParameterAction.java -text -designer/src/com/fr/design/actions/report/ReportWebAttrAction.java -text -designer/src/com/fr/design/actions/report/ReportWriteAttrAction.java -text -designer/src/com/fr/design/actions/server/ServerConfigManagerAction.java -text -designer/src/com/fr/design/actions/server/StyleListAction.java -text -designer/src/com/fr/design/actions/server/StyleManagerPane.java -text -designer/src/com/fr/design/actions/server/WidgetManagerAction.java -text -designer/src/com/fr/design/actions/utils/DeprecatedActionManager.java -text -designer/src/com/fr/design/actions/utils/ReportActionUtils.java -text -designer/src/com/fr/design/cell/bar/BarHelper.java -text -designer/src/com/fr/design/cell/bar/DynamicScrollBar.java -text -designer/src/com/fr/design/cell/bar/DynamicScrollBarUI.java -text -designer/src/com/fr/design/cell/bar/DynamicScrollButton.java -text -designer/src/com/fr/design/cell/bar/ScrollBarUIConstant.java -text -designer/src/com/fr/design/cell/clipboard/CellElementsClip.java -text -designer/src/com/fr/design/cell/clipboard/ElementsTransferable.java -text -designer/src/com/fr/design/cell/clipboard/FloatElementsClip.java -text -designer/src/com/fr/design/cell/editor/AbstractCellEditor.java -text -designer/src/com/fr/design/cell/editor/AbstractFloatEditor.java -text -designer/src/com/fr/design/cell/editor/BiasTextPainterCellEditor.java -text -designer/src/com/fr/design/cell/editor/CellEditor.java -text -designer/src/com/fr/design/cell/editor/ChartCellEditor.java -text -designer/src/com/fr/design/cell/editor/ChartFloatEditor.java -text -designer/src/com/fr/design/cell/editor/ComboBoxCellEditor.java -text -designer/src/com/fr/design/cell/editor/DSColumnCellEditor.java -text -designer/src/com/fr/design/cell/editor/DateCellEditor.java -text -designer/src/com/fr/design/cell/editor/FloatEditor.java -text -designer/src/com/fr/design/cell/editor/FormulaCellEditor.java -text -designer/src/com/fr/design/cell/editor/FormulaFloatEditor.java -text -designer/src/com/fr/design/cell/editor/GeneralCellEditor.java -text -designer/src/com/fr/design/cell/editor/GeneralFloatEditor.java -text -designer/src/com/fr/design/cell/editor/ImageCellEditor.java -text -designer/src/com/fr/design/cell/editor/ImageFloatEditor.java -text -designer/src/com/fr/design/cell/editor/RichTextCellEditor.java -text -designer/src/com/fr/design/cell/editor/RichTextToolBar.java -text -designer/src/com/fr/design/cell/editor/SubReportCellEditor.java -text -designer/src/com/fr/design/cell/editor/TextCellEditor.java -text -designer/src/com/fr/design/cell/editor/TextFloatEditor.java -text -designer/src/com/fr/design/cell/editor/package.html -text -designer/src/com/fr/design/cell/smartaction/AbstractSmartJTablePaneAction.java -text -designer/src/com/fr/design/cell/smartaction/SmartJTablePane.java -text -designer/src/com/fr/design/cell/smartaction/SmartJTablePaneAction.java -text -designer/src/com/fr/design/condition/BackPane.java -text -designer/src/com/fr/design/condition/BorderHighlightPane.java -text -designer/src/com/fr/design/condition/ColumnWidthPane.java -text -designer/src/com/fr/design/condition/FontPane.java -text -designer/src/com/fr/design/condition/ForeGroundPane.java -text -designer/src/com/fr/design/condition/HighLightConditionAttributesPane.java -text -designer/src/com/fr/design/condition/HyperlinkPane.java -text -designer/src/com/fr/design/condition/NewRealValuePane.java -text -designer/src/com/fr/design/condition/PaddingPane.java -text -designer/src/com/fr/design/condition/PagePane.java -text -designer/src/com/fr/design/condition/PresentHighlightPane.java -text -designer/src/com/fr/design/condition/RowHeightPane.java -text -designer/src/com/fr/design/condition/WHPane.java -text -designer/src/com/fr/design/condition/WidgetHighlightPane.java -text -designer/src/com/fr/design/dscolumn/DSColumnAdvancedPane.java -text -designer/src/com/fr/design/dscolumn/DSColumnBasicPane.java -text -designer/src/com/fr/design/dscolumn/DSColumnConditionsPane.java -text -designer/src/com/fr/design/dscolumn/DSColumnPane.java -text -designer/src/com/fr/design/dscolumn/ResultSetGroupDockingPane.java -text -designer/src/com/fr/design/dscolumn/ResultSetGroupPane.java -text -designer/src/com/fr/design/dscolumn/ResultSetGroupPopUpPane.java -text -designer/src/com/fr/design/dscolumn/SelectedConfirmedDataColumnPane.java -text -designer/src/com/fr/design/dscolumn/SelectedDataColumnPane.java -text -designer/src/com/fr/design/dscolumn/SpecifiedGroupAttrPane.java -text -designer/src/com/fr/design/expand/ConditionParentPane.java -text -designer/src/com/fr/design/expand/Expand.java -text -designer/src/com/fr/design/expand/ExpandDirectionPane.java -text -designer/src/com/fr/design/expand/ExpandFatherPane.java -text -designer/src/com/fr/design/expand/ExpandLeftFatherPane.java -text -designer/src/com/fr/design/expand/ExpandUpFatherPane.java -text -designer/src/com/fr/design/expand/ParentPane.java -text -designer/src/com/fr/design/expand/SortExpandAttrPane.java -text -designer/src/com/fr/design/headerfooter/EditFooterPane.java -text -designer/src/com/fr/design/headerfooter/EditHeaderPane.java -text -designer/src/com/fr/design/headerfooter/HFAttributesEditDialog.java -text -designer/src/com/fr/design/headerfooter/HFComponent.java -text -designer/src/com/fr/design/headerfooter/HFContainer.java -text -designer/src/com/fr/design/headerfooter/HeaderFooterEditPane.java -text -designer/src/com/fr/design/headerfooter/HeaderFooterPane.java -text -designer/src/com/fr/design/headerfooter/ImagePane.java -text -designer/src/com/fr/design/headerfooter/MoveActionListener.java -text -designer/src/com/fr/design/javascript/ListenerEditPane.java -text -designer/src/com/fr/design/mainframe/AbstractAttrPane.java -text -designer/src/com/fr/design/mainframe/ActiveKeyGenerator.java -text -designer/src/com/fr/design/mainframe/AuthorityEditToolBarPane.java -text -designer/src/com/fr/design/mainframe/AuthoritySheetEditedPane.java -text -designer/src/com/fr/design/mainframe/AuthorityToolBarPane.java -text -designer/src/com/fr/design/mainframe/CellElementPropertyPane.java -text -designer/src/com/fr/design/mainframe/ElementCasePane.java -text -designer/src/com/fr/design/mainframe/ElementCasePaneAuthorityEditPane.java -text -designer/src/com/fr/design/mainframe/ElementCasePaneDelegate.java -text -designer/src/com/fr/design/mainframe/FormatBrushAction.java -text -designer/src/com/fr/design/mainframe/InformationCollector.java -text -designer/src/com/fr/design/mainframe/JPolyWorkBook.java -text -designer/src/com/fr/design/mainframe/JWorkBook.java -text -designer/src/com/fr/design/mainframe/PolySheetNameTabPane.java -text -designer/src/com/fr/design/mainframe/RGridLayout.java -text -designer/src/com/fr/design/mainframe/ReportComponent.java -text -designer/src/com/fr/design/mainframe/ReportComponentCardPane.java -text -designer/src/com/fr/design/mainframe/ReportComponentComposite.java -text -designer/src/com/fr/design/mainframe/SheetAuthorityEditPane.java -text -designer/src/com/fr/design/mainframe/SheetNameTabPane.java -text -designer/src/com/fr/design/mainframe/WorkBookModelAdapter.java -text -designer/src/com/fr/design/mainframe/WorkBookUndoState.java -text -designer/src/com/fr/design/mainframe/WorkSheetDesigner.java -text -designer/src/com/fr/design/mainframe/bbs/BBSBrowserDialog.java -text -designer/src/com/fr/design/mainframe/bbs/BBSConstants.java -text -designer/src/com/fr/design/mainframe/bbs/BBSDialog.java -text -designer/src/com/fr/design/mainframe/bbs/BBSGuestPane.java -text -designer/src/com/fr/design/mainframe/bbs/BBSLoginDialog.java -text -designer/src/com/fr/design/mainframe/bbs/DisplayThread.java -text -designer/src/com/fr/design/mainframe/bbs/ExitLabel.java -text -designer/src/com/fr/design/mainframe/bbs/UserInfoLabel.java -text -designer/src/com/fr/design/mainframe/bbs/UserInfoPane.java -text -designer/src/com/fr/design/mainframe/bbs/bbs.properties -text -designer/src/com/fr/design/mainframe/bbs/images/switch.png -text -designer/src/com/fr/design/mainframe/cell/CellElementEditPane.java -text -designer/src/com/fr/design/mainframe/cell/QuickEditorRegion.java -text -designer/src/com/fr/design/mainframe/cell/settingpane/AbstractCellAttrPane.java -text -designer/src/com/fr/design/mainframe/cell/settingpane/CellExpandAttrPane.java -text -designer/src/com/fr/design/mainframe/cell/settingpane/CellOtherSetPane.java -text -designer/src/com/fr/design/mainframe/cell/settingpane/CellPresentPane.java -text -designer/src/com/fr/design/mainframe/cell/settingpane/CellStylePane.java -text -designer/src/com/fr/design/mainframe/cell/settingpane/style/CustomStylePane.java -text -designer/src/com/fr/design/mainframe/cell/settingpane/style/PredefinedStylePane.java -text -designer/src/com/fr/design/mainframe/cell/settingpane/style/StylePane.java -text -designer/src/com/fr/design/mainframe/form/FormElementCaseDesigner.java -text -designer/src/com/fr/design/mainframe/form/FormElementCasePaneDelegate.java -text -designer/src/com/fr/design/mainframe/form/FormReportComponentComposite.java -text -designer/src/com/fr/design/mainframe/form/FormTabPane.java -text -designer/src/com/fr/design/module/DesignerModule.java -text -designer/src/com/fr/design/parameter/ParameterDefinitePane.java -text -designer/src/com/fr/design/parameter/WorkBookParameterReader.java -text -designer/src/com/fr/design/present/BarCodePane.java -text -designer/src/com/fr/design/present/CellWriteAttrPane.java -text -designer/src/com/fr/design/present/ColumnRowTableModel.java -text -designer/src/com/fr/design/present/ConditionAttributesGroupPane.java -text -designer/src/com/fr/design/present/CurrencyLinePane.java -text -designer/src/com/fr/design/present/PresentPane.java -text -designer/src/com/fr/design/present/StyleArrayPane.java -text -designer/src/com/fr/design/report/CustomVerifyJobPane.java -text -designer/src/com/fr/design/report/ExcelExportPane.java -text -designer/src/com/fr/design/report/LayerReportPane.java -text -designer/src/com/fr/design/report/PDFExportPane.java -text -designer/src/com/fr/design/report/PageSetupPane.java -text -designer/src/com/fr/design/report/ReportBackgroundPane.java -text -designer/src/com/fr/design/report/ReportColumnsPane.java -text -designer/src/com/fr/design/report/ReportExportAttrPane.java -text -designer/src/com/fr/design/report/ReportStylePane.java -text -designer/src/com/fr/design/report/RichTextEditingPane.java -text -designer/src/com/fr/design/report/RichTextPane.java -text -designer/src/com/fr/design/report/RowColumnPane.java -text -designer/src/com/fr/design/report/SelectImagePane.java -text -designer/src/com/fr/design/report/SubReportPane.java -text -designer/src/com/fr/design/report/UnitFieldPane.java -text -designer/src/com/fr/design/report/ValueVerifierEditPane.java -text -designer/src/com/fr/design/report/VerifierListPane.java -text -designer/src/com/fr/design/report/VerifyJobListPane.java -text -designer/src/com/fr/design/report/WordExportPane.java -text -designer/src/com/fr/design/report/WriteShortCutsPane.java -text -designer/src/com/fr/design/report/freeze/ColSpinner.java -text -designer/src/com/fr/design/report/freeze/FormECRepeatAndFreezeSettingPane.java -text -designer/src/com/fr/design/report/freeze/FreezeAndRepeatPane.java -text -designer/src/com/fr/design/report/freeze/FreezePagePane.java -text -designer/src/com/fr/design/report/freeze/FreezeWriteColPane.java -text -designer/src/com/fr/design/report/freeze/FreezeWriteRowPane.java -text -designer/src/com/fr/design/report/freeze/RepeatAndFreezeSettingPane.java -text -designer/src/com/fr/design/report/freeze/RepeatColPane.java -text -designer/src/com/fr/design/report/freeze/RepeatRowPane.java -text -designer/src/com/fr/design/report/freeze/RowSpinner.java -text -designer/src/com/fr/design/report/freeze/UICapitalLetterField.java -text -designer/src/com/fr/design/report/freeze/UIIntNumberField.java -text -designer/src/com/fr/design/report/share/ConfuseTabledataAction.java -text -designer/src/com/fr/design/report/share/ConfusionInfo.java -text -designer/src/com/fr/design/report/share/ConfusionManagerPane.java -text -designer/src/com/fr/design/report/share/ConfusionTableDataPane.java -text -designer/src/com/fr/design/report/share/ShareButton.java -text -designer/src/com/fr/design/report/share/shareToolTip.html -text -designer/src/com/fr/design/style/BorderUtils.java -text -designer/src/com/fr/design/style/StylePane.java -text -designer/src/com/fr/design/webattr/AbstractEditToolBarPane.java -text -designer/src/com/fr/design/webattr/CommonPane.java -text -designer/src/com/fr/design/webattr/DragToolBarPane.java -text -designer/src/com/fr/design/webattr/EditReportServerParameterPane.java -text -designer/src/com/fr/design/webattr/EditToolBar.java -text -designer/src/com/fr/design/webattr/ErrorTemplatePane.java -text -designer/src/com/fr/design/webattr/EventPane.java -text -designer/src/com/fr/design/webattr/FToolBar.java -text -designer/src/com/fr/design/webattr/NameOptionSelection.java -text -designer/src/com/fr/design/webattr/PageToolBarPane.java -text -designer/src/com/fr/design/webattr/PageWebSettingPane.java -text -designer/src/com/fr/design/webattr/ReportSelectToolBarPane.java -text -designer/src/com/fr/design/webattr/ReportServerPrinterPane.java -text -designer/src/com/fr/design/webattr/ReportWebAttrPane.java -text -designer/src/com/fr/design/webattr/ReportWebWidgetConstants.java -text -designer/src/com/fr/design/webattr/ReportWriteAttrPane.java -text -designer/src/com/fr/design/webattr/ServerPrinterPane.java -text -designer/src/com/fr/design/webattr/SettingToolBar.java -text -designer/src/com/fr/design/webattr/ToolBarButton.java -text -designer/src/com/fr/design/webattr/ToolBarDragPane.java -text -designer/src/com/fr/design/webattr/ToolBarPane.java -text -designer/src/com/fr/design/webattr/ViewToolBarPane.java -text -designer/src/com/fr/design/webattr/ViewWebSettingPane.java -text -designer/src/com/fr/design/webattr/WebCssPane.java -text -designer/src/com/fr/design/webattr/WebJsPane.java -text -designer/src/com/fr/design/webattr/WebSettingPane.java -text -designer/src/com/fr/design/webattr/WidgetManagerPane.java -text -designer/src/com/fr/design/webattr/WidgetToolBarPane.java -text -designer/src/com/fr/design/webattr/WriteToolBarPane.java -text -designer/src/com/fr/design/webattr/WriteWebSettingPane.java -text -designer/src/com/fr/design/widget/CellWidgetCardPane.java -text -designer/src/com/fr/design/widget/DataModify.java -text -designer/src/com/fr/design/widget/EventCreator.java -text -designer/src/com/fr/design/widget/Operator.java -text -designer/src/com/fr/design/widget/UserDefinedWidgetConfigPane.java -text -designer/src/com/fr/design/widget/ValueWidgetPane.java -text -designer/src/com/fr/design/widget/WidgetConfigPane.java -text -designer/src/com/fr/design/widget/WidgetDefinePaneFactory.java -text -designer/src/com/fr/design/widget/WidgetEventPane.java -text -designer/src/com/fr/design/widget/WidgetPane.java -text -designer/src/com/fr/design/widget/ui/AbstractDataModify.java -text -designer/src/com/fr/design/widget/ui/BasicWidgetPropertySettingPane.java -text -designer/src/com/fr/design/widget/ui/ButtonDefinePane.java -text -designer/src/com/fr/design/widget/ui/ButtonGroupDictPane.java -text -designer/src/com/fr/design/widget/ui/CheckBoxDefinePane.java -text -designer/src/com/fr/design/widget/ui/CheckBoxDictPane.java -text -designer/src/com/fr/design/widget/ui/CheckBoxGroupDefinePane.java -text -designer/src/com/fr/design/widget/ui/ComboBoxDefinePane.java -text -designer/src/com/fr/design/widget/ui/ComboCheckBoxDefinePane.java -text -designer/src/com/fr/design/widget/ui/CustomWritableRepeatEditorPane.java -text -designer/src/com/fr/design/widget/ui/DateEditorDefinePane.java -text -designer/src/com/fr/design/widget/ui/DirectWriteEditorDefinePane.java -text -designer/src/com/fr/design/widget/ui/FieldEditorDefinePane.java -text -designer/src/com/fr/design/widget/ui/IframeEditorDefinePane.java -text -designer/src/com/fr/design/widget/ui/ListEditorDefinePane.java -text -designer/src/com/fr/design/widget/ui/MultiFileEditorPane.java -text -designer/src/com/fr/design/widget/ui/NoneWidgetDefinePane.java -text -designer/src/com/fr/design/widget/ui/NumberEditorDefinePane.java -text -designer/src/com/fr/design/widget/ui/ParameterTreeComboBox.java -text -designer/src/com/fr/design/widget/ui/PasswordDefinePane.java -text -designer/src/com/fr/design/widget/ui/RadioDefinePane.java -text -designer/src/com/fr/design/widget/ui/RadioGroupDefinePane.java -text -designer/src/com/fr/design/widget/ui/TextAreaDefinePane.java -text -designer/src/com/fr/design/widget/ui/TextFieldEditorDefinePane.java -text -designer/src/com/fr/design/widget/ui/TreeComboBoxEditorDefinePane.java -text -designer/src/com/fr/design/widget/ui/TreeEditorDefinePane.java -text -designer/src/com/fr/design/widget/ui/UserEditorDefinePane.java -text -designer/src/com/fr/design/widget/ui/WaterMarkDictPane.java -text -designer/src/com/fr/design/widget/ui/WritableRepeatEditorPane.java -text -designer/src/com/fr/design/widget/ui/WriteUnableRepeatEditorPane.java -text -designer/src/com/fr/design/widget/ui/btn/AppendRowButtonDefinePane.java -text -designer/src/com/fr/design/widget/ui/btn/ButtonDetailPaneFactory.java -text -designer/src/com/fr/design/widget/ui/btn/ButtonSytleDefinedPane.java -text -designer/src/com/fr/design/widget/ui/btn/DefaultButtonDetailPane.java -text -designer/src/com/fr/design/widget/ui/btn/DefaultButtonStylePane.java -text -designer/src/com/fr/design/widget/ui/btn/DefineAppendColumnRowPane.java -text -designer/src/com/fr/design/widget/ui/btn/DefineDeleteColumnRowPane.java -text -designer/src/com/fr/design/widget/ui/btn/DeleteRowButtonDefinePane.java -text -designer/src/com/fr/design/widget/ui/btn/FreeButtonDetailPane.java -text -designer/src/com/fr/design/widget/ui/btn/TreeNodeToogleButtonDefinePane.java -text -designer/src/com/fr/design/write/submit/DefaultSubmit.java -text -designer/src/com/fr/design/write/submit/SmartInsertDBManipulationInWidgetEventPane.java -text -designer/src/com/fr/design/write/submit/SmartInsertDBManipulationPane.java -text -designer/src/com/fr/design/write/submit/SmartInsertDMLJobPane.java -text -designer/src/com/fr/design/write/submit/SubmiterListPane.java -text -designer/src/com/fr/grid/AbstractGridHeaderMouseHandler.java -text -designer/src/com/fr/grid/BaseGridComponent.java -text -designer/src/com/fr/grid/CellElementPainter.java -text -designer/src/com/fr/grid/DrawFlowRect.java -text -designer/src/com/fr/grid/Grid.java -text -designer/src/com/fr/grid/GridColumn.java -text -designer/src/com/fr/grid/GridColumnMouseHandler.java -text -designer/src/com/fr/grid/GridColumnUI.java -text -designer/src/com/fr/grid/GridCorner.java -text -designer/src/com/fr/grid/GridCornerMouseHandler.java -text -designer/src/com/fr/grid/GridHeader.java -text -designer/src/com/fr/grid/GridKeyAction.java -text -designer/src/com/fr/grid/GridKeyListener.java -text -designer/src/com/fr/grid/GridMouseAdapter.java -text -designer/src/com/fr/grid/GridRow.java -text -designer/src/com/fr/grid/GridRowMouseHandler.java -text -designer/src/com/fr/grid/GridRowUI.java -text -designer/src/com/fr/grid/GridUI.java -text -designer/src/com/fr/grid/GridUtils.java -text -designer/src/com/fr/grid/IntelliElements.java -text -designer/src/com/fr/grid/KeyEventWork.java -text -designer/src/com/fr/grid/dnd/ElementCasePaneDropTarget.java -text -designer/src/com/fr/grid/event/CellEditorEvent.java -text -designer/src/com/fr/grid/event/CellEditorListener.java -text -designer/src/com/fr/grid/event/FloatEditorEvent.java -text -designer/src/com/fr/grid/event/FloatEditorListener.java -text -designer/src/com/fr/grid/event/package.html -text -designer/src/com/fr/grid/selection/CellSelection.java -text -designer/src/com/fr/grid/selection/FloatSelection.java -text -designer/src/com/fr/grid/selection/Selection.java -text -designer/src/com/fr/poly/JPolyBlockPane.java -text -designer/src/com/fr/poly/PolyArea.java -text -designer/src/com/fr/poly/PolyBlockProperPane.java -text -designer/src/com/fr/poly/PolyBlockProperTable.java -text -designer/src/com/fr/poly/PolyComponetsBar.java -text -designer/src/com/fr/poly/PolyConstants.java -text -designer/src/com/fr/poly/PolyDesignUI.java -text -designer/src/com/fr/poly/PolyDesigner.java -text -designer/src/com/fr/poly/PolyDesignerLayout.java -text -designer/src/com/fr/poly/PolyEditorLayout.java -text -designer/src/com/fr/poly/PolyUtils.java -text -designer/src/com/fr/poly/actions/DeleteBlockAction.java -text -designer/src/com/fr/poly/creator/BlockCreator.java -text -designer/src/com/fr/poly/creator/BlockEditor.java -text -designer/src/com/fr/poly/creator/BlockEditorLayout.java -text -designer/src/com/fr/poly/creator/ChartBlockCreator.java -text -designer/src/com/fr/poly/creator/ChartBlockEditor.java -text -designer/src/com/fr/poly/creator/ECBlockCreator.java -text -designer/src/com/fr/poly/creator/ECBlockEditor.java -text -designer/src/com/fr/poly/creator/ECBlockPane.java -text -designer/src/com/fr/poly/creator/PolyElementCasePane.java -text -designer/src/com/fr/poly/group/PolyBoundsGroup.java -text -designer/src/com/fr/poly/group/PolyNameGroup.java -text -designer/src/com/fr/poly/hanlder/BlockForbiddenWindow.java -text -designer/src/com/fr/poly/hanlder/BlockOperationMouseHandler.java -text -designer/src/com/fr/poly/hanlder/BottomCornerMouseHanlder.java -text -designer/src/com/fr/poly/hanlder/ColumnOperationMouseHandler.java -text -designer/src/com/fr/poly/hanlder/DataEditingListener.java -text -designer/src/com/fr/poly/hanlder/PolyDesignerDropTarget.java -text -designer/src/com/fr/poly/hanlder/RowOperationMouseHandler.java -text -designer/src/com/fr/poly/model/AddedData.java -text -designer/src/com/fr/poly/model/AddingData.java -text -designer/src/com/fr/quickeditor/CellQuickEditor.java -text -designer/src/com/fr/quickeditor/ChartQuickEditor.java -text -designer/src/com/fr/quickeditor/FloatQuickEditor.java -text -designer/src/com/fr/quickeditor/cellquick/CellBiasTextPainterEditor.java -text -designer/src/com/fr/quickeditor/cellquick/CellDScolumnEditor.java -text -designer/src/com/fr/quickeditor/cellquick/CellImageQuickEditor.java -text -designer/src/com/fr/quickeditor/cellquick/CellRichTextEditor.java -text -designer/src/com/fr/quickeditor/cellquick/CellStringQuickEditor.java -text -designer/src/com/fr/quickeditor/cellquick/CellSubReportEditor.java -text -designer/src/com/fr/quickeditor/floatquick/FloatImageQuickEditor.java -text -designer/src/com/fr/quickeditor/floatquick/FloatStringQuickEditor.java -text -designer/src/com/fr/start/BISplashPane.java -text -designer/src/com/fr/start/CollectUserInformationDialog.java -text -designer/src/com/fr/start/Designer.java -text -designer/src/com/fr/start/Designer4BI.java -text -designer/src/com/fr/start/Designer4Debug.java -text -designer/src/com/fr/start/ReportSplashPane.java -text -designer_base/.classpath -text -designer_base/.project -text -designer_base/designer_base.iml -text -designer_base/src/com/fr/design/DesignModelAdapter.java -text -designer_base/src/com/fr/design/DesignState.java -text -designer_base/src/com/fr/design/DesignerEnvManager.java -text -designer_base/src/com/fr/design/Exception/ValidationException.java -text -designer_base/src/com/fr/design/ExtraDesignClassManager.java -text -designer_base/src/com/fr/design/RestartHelper.java -text -designer_base/src/com/fr/design/actions/AllowAuthorityEditAction.java -text -designer_base/src/com/fr/design/actions/CheckBoxAction.java -text -designer_base/src/com/fr/design/actions/ExitAuthorityEditAction.java -text -designer_base/src/com/fr/design/actions/HyperlinkPluginAction.java -text -designer_base/src/com/fr/design/actions/JTemplateAction.java -text -designer_base/src/com/fr/design/actions/MenuAction.java -text -designer_base/src/com/fr/design/actions/TableDataSourceAction.java -text -designer_base/src/com/fr/design/actions/TemplateComponentAction.java -text -designer_base/src/com/fr/design/actions/TemplateComponentActionInterface.java -text -designer_base/src/com/fr/design/actions/ToggleButtonUpdateAction.java -text -designer_base/src/com/fr/design/actions/ToolbarActionManager.java -text -designer_base/src/com/fr/design/actions/UndoableAction.java -text -designer_base/src/com/fr/design/actions/UpdateAction.java -text -designer_base/src/com/fr/design/actions/core/ActionUtils.java -text -designer_base/src/com/fr/design/actions/edit/CopyAction.java -text -designer_base/src/com/fr/design/actions/edit/CutAction.java -text -designer_base/src/com/fr/design/actions/edit/PasteAction.java -text -designer_base/src/com/fr/design/actions/edit/RedoAction.java -text -designer_base/src/com/fr/design/actions/edit/UndoAction.java -text -designer_base/src/com/fr/design/actions/file/CloseCurrentTemplateAction.java -text -designer_base/src/com/fr/design/actions/file/CloseTemplateAction.java -text -designer_base/src/com/fr/design/actions/file/EditEnvAction.java -text -designer_base/src/com/fr/design/actions/file/ExitDesignerAction.java -text -designer_base/src/com/fr/design/actions/file/LocalePane.java -text -designer_base/src/com/fr/design/actions/file/OpenRecentReportMenuDef.java -text -designer_base/src/com/fr/design/actions/file/OpenTemplateAction.java -text -designer_base/src/com/fr/design/actions/file/PreferenceAction.java -text -designer_base/src/com/fr/design/actions/file/PreferencePane.java -text -designer_base/src/com/fr/design/actions/file/SaveAsTemplateAction.java -text -designer_base/src/com/fr/design/actions/file/SaveTemplateAction.java -text -designer_base/src/com/fr/design/actions/file/SwitchExistEnv.java -text -designer_base/src/com/fr/design/actions/file/WebPreviewUtils.java -text -designer_base/src/com/fr/design/actions/help/AboutAction.java -text -designer_base/src/com/fr/design/actions/help/AboutDialog.java -text -designer_base/src/com/fr/design/actions/help/AboutPane.java -text -designer_base/src/com/fr/design/actions/help/FeedBackAction.java -text -designer_base/src/com/fr/design/actions/help/FeedBackPane.java -text -designer_base/src/com/fr/design/actions/help/ForumAction.java -text -designer_base/src/com/fr/design/actions/help/SupportQQAction.java -text -designer_base/src/com/fr/design/actions/help/SystemInfoPane.java -text -designer_base/src/com/fr/design/actions/help/TutorialAction.java -text -designer_base/src/com/fr/design/actions/help/WebDemoAction.java -text -designer_base/src/com/fr/design/actions/server/ConnectionListAction.java -text -designer_base/src/com/fr/design/actions/server/FunctionManagerAction.java -text -designer_base/src/com/fr/design/actions/server/GlobalParameterAction.java -text -designer_base/src/com/fr/design/actions/server/GlobalTableDataAction.java -text -designer_base/src/com/fr/design/actions/server/PlatformManagerAction.java -text -designer_base/src/com/fr/design/actions/server/PluginManagerAction.java -text -designer_base/src/com/fr/design/actions/server/ProcedureListAction.java -text -designer_base/src/com/fr/design/actions/tabledata/TableDataAction.java -text -designer_base/src/com/fr/design/beans/BasicBeanPane.java -text -designer_base/src/com/fr/design/beans/FurtherBasicBeanPane.java -text -designer_base/src/com/fr/design/beans/GroupModel.java -text -designer_base/src/com/fr/design/beans/location/Absorptionline.java -text -designer_base/src/com/fr/design/beans/location/MoveUtils.java -text -designer_base/src/com/fr/design/border/UIRoundedBorder.java -text -designer_base/src/com/fr/design/border/UITitledBorder.java -text -designer_base/src/com/fr/design/bridge/DesignToolbarProvider.java -text -designer_base/src/com/fr/design/cell/FloatElementsProvider.java -text -designer_base/src/com/fr/design/condition/CellHighlightAddMenuDef.java -text -designer_base/src/com/fr/design/condition/ConditionAttrSingleConditionPane.java -text -designer_base/src/com/fr/design/condition/ConditionAttributesPane.java -text -designer_base/src/com/fr/design/condition/ContinuousTreeSelectionModel.java -text -designer_base/src/com/fr/design/condition/DSColumnLiteConditionPane.java -text -designer_base/src/com/fr/design/condition/DSColumnSimpleLiteConditionPane.java -text -designer_base/src/com/fr/design/condition/HighLightConditionAction.java -text -designer_base/src/com/fr/design/condition/LiteConditionPane.java -text -designer_base/src/com/fr/design/condition/ObjectLiteConditionPane.java -text -designer_base/src/com/fr/design/condition/SingleConditionPane.java -text -designer_base/src/com/fr/design/constants/KeyWords.java -text -designer_base/src/com/fr/design/constants/LayoutConstants.java -text -designer_base/src/com/fr/design/constants/UIConstants.java -text -designer_base/src/com/fr/design/data/DataCreatorUI.java -text -designer_base/src/com/fr/design/data/DesignTableDataManager.java -text -designer_base/src/com/fr/design/data/datapane/ChoosePane.java -text -designer_base/src/com/fr/design/data/datapane/ChoosePaneSupportFormula.java -text -designer_base/src/com/fr/design/data/datapane/DSButtonGroup.java -text -designer_base/src/com/fr/design/data/datapane/DataBaseItems.java -text -designer_base/src/com/fr/design/data/datapane/EditOrNewLabel.java -text -designer_base/src/com/fr/design/data/datapane/FlashLookLabelMouseAdapter.java -text -designer_base/src/com/fr/design/data/datapane/GlobalTableDataComboBox.java -text -designer_base/src/com/fr/design/data/datapane/GlobalTreeTableDataDictPane.java -text -designer_base/src/com/fr/design/data/datapane/RefreshLabel.java -text -designer_base/src/com/fr/design/data/datapane/ReportTableDataPane.java -text -designer_base/src/com/fr/design/data/datapane/TableDataComboBox.java -text -designer_base/src/com/fr/design/data/datapane/TableDataCreatorProducer.java -text -designer_base/src/com/fr/design/data/datapane/TableDataListPane.java -text -designer_base/src/com/fr/design/data/datapane/TableDataNameObjectCreator.java -text -designer_base/src/com/fr/design/data/datapane/TableDataSourceOP.java -text -designer_base/src/com/fr/design/data/datapane/TableDataTree.java -text -designer_base/src/com/fr/design/data/datapane/TableDataTreeDragSource.java -text -designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java -text -designer_base/src/com/fr/design/data/datapane/TreeTableDataComboBox.java -text -designer_base/src/com/fr/design/data/datapane/TreeTableDataDictPane.java -text -designer_base/src/com/fr/design/data/datapane/VerticalChoosePane.java -text -designer_base/src/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java -text -designer_base/src/com/fr/design/data/datapane/connect/ConnectionListPane.java -text -designer_base/src/com/fr/design/data/datapane/connect/ConnectionManagerPane.java -text -designer_base/src/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java -text -designer_base/src/com/fr/design/data/datapane/connect/DataConnectionAction.java -text -designer_base/src/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java -text -designer_base/src/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java -text -designer_base/src/com/fr/design/data/datapane/connect/JDBCDefPane.java -text -designer_base/src/com/fr/design/data/datapane/connect/JNDIDefPane.java -text -designer_base/src/com/fr/design/data/datapane/preview/LoadedEventListener.java -text -designer_base/src/com/fr/design/data/datapane/preview/PreviewLabel.java -text -designer_base/src/com/fr/design/data/datapane/preview/PreviewTableModel.java -text -designer_base/src/com/fr/design/data/datapane/preview/PreviewTablePane.java -text -designer_base/src/com/fr/design/data/datapane/sqlpane/SQLEditPane.java -text -designer_base/src/com/fr/design/data/tabledata/Prepare4DataSourceChange.java -text -designer_base/src/com/fr/design/data/tabledata/ResponseDataSourceChange.java -text -designer_base/src/com/fr/design/data/tabledata/StoreProcedureWorkerListener.java -text -designer_base/src/com/fr/design/data/tabledata/gui/CONTENT.txt -text -designer_base/src/com/fr/design/data/tabledata/gui/EXPLAN1.txt -text -designer_base/src/com/fr/design/data/tabledata/gui/EXPLAN2.txt -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/AbstractTableDataPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/AutoStoreProcedureTableModel.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/ClassNameSelectPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/CustomDictModel.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/DecoratedTableDataPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataDefinedPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableModel.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/FormatExplanationPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/GlobalMultiTDTableDataPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/GlobalTreeTableDataPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/OneListTableModel.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureListPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureManagerPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureParameterPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureTableModel.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/TableDataManagerPane.java -text -designer_base/src/com/fr/design/data/tabledata/tabledatapane/TreeTableDataPane.java -text -designer_base/src/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java -text -designer_base/src/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java -text -designer_base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java -text -designer_base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java -text -designer_base/src/com/fr/design/data/tabledata/wrapper/TableDataFactory.java -text -designer_base/src/com/fr/design/data/tabledata/wrapper/TableDataWrapper.java -text -designer_base/src/com/fr/design/data/tabledata/wrapper/TemplateTableDataWrapper.java -text -designer_base/src/com/fr/design/designer/EditingState.java -text -designer_base/src/com/fr/design/designer/TargetComponent.java -text -designer_base/src/com/fr/design/dialog/BasicDialog.java -text -designer_base/src/com/fr/design/dialog/BasicPane.java -text -designer_base/src/com/fr/design/dialog/BasicScrollPane.java -text -designer_base/src/com/fr/design/dialog/DialogActionAdapter.java -text -designer_base/src/com/fr/design/dialog/DialogActionListener.java -text -designer_base/src/com/fr/design/dialog/InformationWarnPane.java -text -designer_base/src/com/fr/design/dialog/JWizardDialog.java -text -designer_base/src/com/fr/design/dialog/JWizardPanel.java -text -designer_base/src/com/fr/design/dialog/MultiTabPane.java -text -designer_base/src/com/fr/design/dialog/UIDialog.java -text -designer_base/src/com/fr/design/dialog/package.html -text -designer_base/src/com/fr/design/editor/ValueEditorPane.java -text -designer_base/src/com/fr/design/editor/ValueEditorPaneFactory.java -text -designer_base/src/com/fr/design/editor/editor/BooleanEditor.java -text -designer_base/src/com/fr/design/editor/editor/ColumnIndexEditor.java -text -designer_base/src/com/fr/design/editor/editor/ColumnNameEditor.java -text -designer_base/src/com/fr/design/editor/editor/ColumnRowEditor.java -text -designer_base/src/com/fr/design/editor/editor/ColumnRowGroupEditor.java -text -designer_base/src/com/fr/design/editor/editor/ColumnSelectedEditor.java -text -designer_base/src/com/fr/design/editor/editor/ConstantsEditor.java -text -designer_base/src/com/fr/design/editor/editor/CursorEditor.java -text -designer_base/src/com/fr/design/editor/editor/DateEditor.java -text -designer_base/src/com/fr/design/editor/editor/DoubleEditor.java -text -designer_base/src/com/fr/design/editor/editor/Editor.java -text -designer_base/src/com/fr/design/editor/editor/EditorListener.java -text -designer_base/src/com/fr/design/editor/editor/FloatEditor.java -text -designer_base/src/com/fr/design/editor/editor/FormulaEditor.java -text -designer_base/src/com/fr/design/editor/editor/IntegerEditor.java -text -designer_base/src/com/fr/design/editor/editor/LongEditor.java -text -designer_base/src/com/fr/design/editor/editor/NoneEditor.java -text -designer_base/src/com/fr/design/editor/editor/NumberEditor.java -text -designer_base/src/com/fr/design/editor/editor/OldColumnIndexEditor.java -text -designer_base/src/com/fr/design/editor/editor/ParameterEditor.java -text -designer_base/src/com/fr/design/editor/editor/TextEditor.java -text -designer_base/src/com/fr/design/editor/editor/WidgetNameEditor.java -text -designer_base/src/com/fr/design/editor/editor/XMLANameEditor.java -text -designer_base/src/com/fr/design/event/ChangeEvent.java -text -designer_base/src/com/fr/design/event/ChangeListener.java -text -designer_base/src/com/fr/design/event/GlobalNameListener.java -text -designer_base/src/com/fr/design/event/GlobalNameObserver.java -text -designer_base/src/com/fr/design/event/TargetModifiedEvent.java -text -designer_base/src/com/fr/design/event/TargetModifiedListener.java -text -designer_base/src/com/fr/design/event/TemplateTreeDragSource.java -text -designer_base/src/com/fr/design/event/UIObserver.java -text -designer_base/src/com/fr/design/event/UIObserverListener.java -text -designer_base/src/com/fr/design/extra/After.java -text -designer_base/src/com/fr/design/extra/AppStoreBuilder.java -text -designer_base/src/com/fr/design/extra/LoginCheckContext.java -text -designer_base/src/com/fr/design/extra/LoginCheckListener.java -text -designer_base/src/com/fr/design/extra/PluginAbstractLoadingViewPane.java -text -designer_base/src/com/fr/design/extra/PluginAbstractViewPane.java -text -designer_base/src/com/fr/design/extra/PluginConstants.java -text -designer_base/src/com/fr/design/extra/PluginControlPane.java -text -designer_base/src/com/fr/design/extra/PluginDescriptionLabel.java -text -designer_base/src/com/fr/design/extra/PluginDetailPane.java -text -designer_base/src/com/fr/design/extra/PluginFromStorePane.java -text -designer_base/src/com/fr/design/extra/PluginHelper.java -text -designer_base/src/com/fr/design/extra/PluginInstalledPane.java -text -designer_base/src/com/fr/design/extra/PluginListPane.java -text -designer_base/src/com/fr/design/extra/PluginManagerPane.java -text -designer_base/src/com/fr/design/extra/PluginSelectListener.java -text -designer_base/src/com/fr/design/extra/PluginStatusCheckCompletePane.java -text -designer_base/src/com/fr/design/extra/PluginTask.java -text -designer_base/src/com/fr/design/extra/PluginUpdatePane.java -text -designer_base/src/com/fr/design/extra/PluginWebBridge.java -text -designer_base/src/com/fr/design/extra/PluginWebPane.java -text -designer_base/src/com/fr/design/extra/PluginsReaderFromStore.java -text -designer_base/src/com/fr/design/extra/Process.java -text -designer_base/src/com/fr/design/extra/exe/Command.java -text -designer_base/src/com/fr/design/extra/exe/Executor.java -text -designer_base/src/com/fr/design/extra/exe/InstallFromDiskExecutor.java -text -designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java -text -designer_base/src/com/fr/design/extra/exe/ModifyStatusExecutor.java -text -designer_base/src/com/fr/design/extra/exe/UninstallExecutor.java -text -designer_base/src/com/fr/design/extra/exe/UpdateFromDiskExecutor.java -text -designer_base/src/com/fr/design/extra/exe/UpdateOnlineExecutor.java -text -designer_base/src/com/fr/design/extra/plugin.properties -text -designer_base/src/com/fr/design/file/FileOperations.java -text -designer_base/src/com/fr/design/file/FileToolbarStateChangeListener.java -text -designer_base/src/com/fr/design/file/HistoryTemplateListPane.java -text -designer_base/src/com/fr/design/file/MutilTempalteTabPane.java -text -designer_base/src/com/fr/design/file/NewTemplatePane.java -text -designer_base/src/com/fr/design/file/SaveSomeTemplatePane.java -text -designer_base/src/com/fr/design/file/TemplateTreePane.java -text -designer_base/src/com/fr/design/formula/AbstractNameAndDescription.java -text -designer_base/src/com/fr/design/formula/CustomVariableResolver.java -text -designer_base/src/com/fr/design/formula/DefaultUIFormulaProcessor.java -text -designer_base/src/com/fr/design/formula/FormulaFactory.java -text -designer_base/src/com/fr/design/formula/FormulaPane.java -text -designer_base/src/com/fr/design/formula/FormulaPaneWhenReserveFormula.java -text -designer_base/src/com/fr/design/formula/FunctionConstants.java -text -designer_base/src/com/fr/design/formula/FunctionDefNAD.java -text -designer_base/src/com/fr/design/formula/FunctionGroup.java -text -designer_base/src/com/fr/design/formula/FunctionManagerPane.java -text -designer_base/src/com/fr/design/formula/FunctionNAD.java -text -designer_base/src/com/fr/design/formula/JavaEditorPane.java -text -designer_base/src/com/fr/design/formula/NameAndDescription.java -text -designer_base/src/com/fr/design/formula/NameAndFunctionList.java -text -designer_base/src/com/fr/design/formula/NameAndTypeAndFunctionList.java -text -designer_base/src/com/fr/design/formula/SortFormulaPane.java -text -designer_base/src/com/fr/design/formula/TinyFormulaPane.java -text -designer_base/src/com/fr/design/formula/UIFormula.java -text -designer_base/src/com/fr/design/formula/VariableResolver.java -text -designer_base/src/com/fr/design/formula/VariableResolverAdapter.java -text -designer_base/src/com/fr/design/fun/CellAttributeProvider.java -text -designer_base/src/com/fr/design/fun/CellWidgetOptionProvider.java -text -designer_base/src/com/fr/design/fun/ConnectionProvider.java -text -designer_base/src/com/fr/design/fun/ExportToolBarProvider.java -text -designer_base/src/com/fr/design/fun/Feedback.java -text -designer_base/src/com/fr/design/fun/FormElementCaseEditorProcessor.java -text -designer_base/src/com/fr/design/fun/FormWidgetOptionProvider.java -text -designer_base/src/com/fr/design/fun/GlobalListenerProvider.java -text -designer_base/src/com/fr/design/fun/HighlightProvider.java -text -designer_base/src/com/fr/design/fun/HyperlinkProvider.java -text -designer_base/src/com/fr/design/fun/IndentationUnitProcessor.java -text -designer_base/src/com/fr/design/fun/JavaScriptActionProvider.java -text -designer_base/src/com/fr/design/fun/MenuHandler.java -text -designer_base/src/com/fr/design/fun/ParameterWidgetOptionProvider.java -text -designer_base/src/com/fr/design/fun/PresentKindProvider.java -text -designer_base/src/com/fr/design/fun/PreviewProvider.java -text -designer_base/src/com/fr/design/fun/ServerTableDataDefineProvider.java -text -designer_base/src/com/fr/design/fun/SubmitProvider.java -text -designer_base/src/com/fr/design/fun/TableDataCreatorProvider.java -text -designer_base/src/com/fr/design/fun/TableDataDefineProvider.java -text -designer_base/src/com/fr/design/fun/TitlePlaceProcessor.java -text -designer_base/src/com/fr/design/fun/ToolbarItemProvider.java -text -designer_base/src/com/fr/design/fun/UIFormulaProcessor.java -text -designer_base/src/com/fr/design/fun/impl/AbstractCellAttributeProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractCellWidgetOptionProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractConnectionProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProcessor.java -text -designer_base/src/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractGlobalListenerProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractHighlightProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractHyperlinkProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractIndentationUnitProcessor.java -text -designer_base/src/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractMenuHandler.java -text -designer_base/src/com/fr/design/fun/impl/AbstractParameterWidgetOptionProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractPresentKindProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractPreviewProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractServerTableDataDefineProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractSubmitProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractTableDataDefineProvider.java -text -designer_base/src/com/fr/design/fun/impl/AbstractTitleProcessor.java -text -designer_base/src/com/fr/design/fun/impl/AbstractToolbarItem.java -text -designer_base/src/com/fr/design/fun/impl/AbstractUIFormulaProcessor.java -text -designer_base/src/com/fr/design/gui/UIDefaultTheme.java -text -designer_base/src/com/fr/design/gui/UILookAndFeel.java -text -designer_base/src/com/fr/design/gui/autocomplete/AbstractCompletion.java -text -designer_base/src/com/fr/design/gui/autocomplete/AbstractCompletionProvider.java -text -designer_base/src/com/fr/design/gui/autocomplete/AutoCompleteDemo.java -text -designer_base/src/com/fr/design/gui/autocomplete/AutoCompleteDescWindow.java -text -designer_base/src/com/fr/design/gui/autocomplete/AutoCompletePopupWindow.java -text -designer_base/src/com/fr/design/gui/autocomplete/AutoCompletion.java -text -designer_base/src/com/fr/design/gui/autocomplete/AutoCompletionStyleContext.java -text -designer_base/src/com/fr/design/gui/autocomplete/BasicCompletion.java -text -designer_base/src/com/fr/design/gui/autocomplete/Completion.java -text -designer_base/src/com/fr/design/gui/autocomplete/CompletionCellRenderer.java -text -designer_base/src/com/fr/design/gui/autocomplete/CompletionListModel.java -text -designer_base/src/com/fr/design/gui/autocomplete/CompletionProvider.java -text -designer_base/src/com/fr/design/gui/autocomplete/CompletionProviderBase.java -text -designer_base/src/com/fr/design/gui/autocomplete/CompletionXMLParser.java -text -designer_base/src/com/fr/design/gui/autocomplete/CompletionXml.dtd -text -designer_base/src/com/fr/design/gui/autocomplete/DefaultCompletionProvider.java -text -designer_base/src/com/fr/design/gui/autocomplete/DelegatingCellRenderer.java -text -designer_base/src/com/fr/design/gui/autocomplete/DescWindowCallback.java -text -designer_base/src/com/fr/design/gui/autocomplete/EmptyIcon.java -text -designer_base/src/com/fr/design/gui/autocomplete/ExternalURLHandler.java -text -designer_base/src/com/fr/design/gui/autocomplete/FastListUI.java -text -designer_base/src/com/fr/design/gui/autocomplete/FunctionCompletion.java -text -designer_base/src/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java -text -designer_base/src/com/fr/design/gui/autocomplete/LinkRedirector.java -text -designer_base/src/com/fr/design/gui/autocomplete/MarkupTagCompletion.java -text -designer_base/src/com/fr/design/gui/autocomplete/OutlineHighlightPainter.java -text -designer_base/src/com/fr/design/gui/autocomplete/ParameterChoicesProvider.java -text -designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletion.java -text -designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionChoicesWindow.java -text -designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java -text -designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionDescriptionToolTip.java -text -designer_base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionInsertionInfo.java -text -designer_base/src/com/fr/design/gui/autocomplete/ShorthandCompletion.java -text -designer_base/src/com/fr/design/gui/autocomplete/SizeGrip.java -text -designer_base/src/com/fr/design/gui/autocomplete/SortByRelevanceComparator.java -text -designer_base/src/com/fr/design/gui/autocomplete/TemplateCompletion.java -text -designer_base/src/com/fr/design/gui/autocomplete/TemplatePiece.java -text -designer_base/src/com/fr/design/gui/autocomplete/TipUtil.java -text -designer_base/src/com/fr/design/gui/autocomplete/Util.java -text -designer_base/src/com/fr/design/gui/autocomplete/VariableCompletion.java -text -designer_base/src/com/fr/design/gui/autocomplete/arrow_left.png -text -designer_base/src/com/fr/design/gui/autocomplete/arrow_right.png -text -designer_base/src/com/fr/design/gui/autocomplete/bullet_black.png -text -designer_base/src/com/fr/design/gui/autocomplete/osx_sizegrip.png -text -designer_base/src/com/fr/design/gui/borders/UIFrameBorder.java -text -designer_base/src/com/fr/design/gui/borders/UIInternalFrameBorder.java -text -designer_base/src/com/fr/design/gui/borders/UITableHeaderBorder.java -text -designer_base/src/com/fr/design/gui/borders/UITableHeaderRolloverBorder.java -text -designer_base/src/com/fr/design/gui/borders/UITableScrollPaneBorder.java -text -designer_base/src/com/fr/design/gui/borders/UITextFieldBorder.java -text -designer_base/src/com/fr/design/gui/chart/BaseChartPropertyPane.java -text -designer_base/src/com/fr/design/gui/chart/MiddleChartComponent.java -text -designer_base/src/com/fr/design/gui/chart/MiddleChartDialog.java -text -designer_base/src/com/fr/design/gui/columnrow/ColumnRowPane.java -text -designer_base/src/com/fr/design/gui/columnrow/ColumnRowVerticalPane.java -text -designer_base/src/com/fr/design/gui/controlpane/AbstractNameableCreator.java -text -designer_base/src/com/fr/design/gui/controlpane/ControlPane.java -text -designer_base/src/com/fr/design/gui/controlpane/JControlPane.java -text -designer_base/src/com/fr/design/gui/controlpane/NameObjectCreator.java -text -designer_base/src/com/fr/design/gui/controlpane/NameableCreator.java -text -designer_base/src/com/fr/design/gui/controlpane/NameableSelfCreator.java -text -designer_base/src/com/fr/design/gui/controlpane/ObjectJControlPane.java -text -designer_base/src/com/fr/design/gui/controlpane/ShortCut4JControlPane.java -text -designer_base/src/com/fr/design/gui/controlpane/UnrepeatedNameHelper.java -text -designer_base/src/com/fr/design/gui/core/CustomWidgetOption.java -text -designer_base/src/com/fr/design/gui/core/UIFurtherTabComponent.java -text -designer_base/src/com/fr/design/gui/core/UISelectedComponent.java -text -designer_base/src/com/fr/design/gui/core/UITabComponent.java -text -designer_base/src/com/fr/design/gui/core/UserDefinedWidgetOption.java -text -designer_base/src/com/fr/design/gui/core/WidgetConstants.java -text -designer_base/src/com/fr/design/gui/core/WidgetOption.java -text -designer_base/src/com/fr/design/gui/core/WidgetOptionFactory.java -text -designer_base/src/com/fr/design/gui/date/CalendarNumberField.java -text -designer_base/src/com/fr/design/gui/date/JDateDocument.java -text -designer_base/src/com/fr/design/gui/date/SingleObjectComboBoxModel.java -text -designer_base/src/com/fr/design/gui/date/UICalendarPanel.java -text -designer_base/src/com/fr/design/gui/date/UIDatePicker.java -text -designer_base/src/com/fr/design/gui/date/UIDayLabel.java -text -designer_base/src/com/fr/design/gui/demo/ComboBoxDemo.java -text -designer_base/src/com/fr/design/gui/demo/LabelDemo.java -text -designer_base/src/com/fr/design/gui/demo/ListDemo.java -text -designer_base/src/com/fr/design/gui/demo/LoadingPaneDemo.java -text -designer_base/src/com/fr/design/gui/demo/MultiLineTooltipDemo.java -text -designer_base/src/com/fr/design/gui/demo/SwingComponentsDemo.java -text -designer_base/src/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java -text -designer_base/src/com/fr/design/gui/frpane/AttributeChangeListener.java -text -designer_base/src/com/fr/design/gui/frpane/BaseHyperlinkGroup.java -text -designer_base/src/com/fr/design/gui/frpane/CommitTabbedPane.java -text -designer_base/src/com/fr/design/gui/frpane/EditingStringListPane.java -text -designer_base/src/com/fr/design/gui/frpane/HyperlinkGroupPane.java -text -designer_base/src/com/fr/design/gui/frpane/HyperlinkGroupType.java -text -designer_base/src/com/fr/design/gui/frpane/ImgChoosePane.java -text -designer_base/src/com/fr/design/gui/frpane/JTreeAutoBuildPane.java -text -designer_base/src/com/fr/design/gui/frpane/JTreeControlPane.java -text -designer_base/src/com/fr/design/gui/frpane/LimitedDocument.java -text -designer_base/src/com/fr/design/gui/frpane/ListenerUpdatePane.java -text -designer_base/src/com/fr/design/gui/frpane/LoadingBasicPane.java -text -designer_base/src/com/fr/design/gui/frpane/LoadingBasicPaneTest.java -text -designer_base/src/com/fr/design/gui/frpane/ObjectProperiesPane.java -text -designer_base/src/com/fr/design/gui/frpane/RegPane.java -text -designer_base/src/com/fr/design/gui/frpane/ReportletParameterViewPane.java -text -designer_base/src/com/fr/design/gui/frpane/TemplateParameterPane.java -text -designer_base/src/com/fr/design/gui/frpane/TreeSettingPane.java -text -designer_base/src/com/fr/design/gui/frpane/UIAdvancedTextPane.java -text -designer_base/src/com/fr/design/gui/frpane/UIBasicOptionPaneUI.java -text -designer_base/src/com/fr/design/gui/frpane/UIBubbleFloatPane.java -text -designer_base/src/com/fr/design/gui/frpane/UIComboBoxPane.java -text -designer_base/src/com/fr/design/gui/frpane/UICorrelationComboBoxPane.java -text -designer_base/src/com/fr/design/gui/frpane/UICorrelationPane.java -text -designer_base/src/com/fr/design/gui/frpane/UIExtensionPane.java -text -designer_base/src/com/fr/design/gui/frpane/UINumberDragPane.java -text -designer_base/src/com/fr/design/gui/frpane/UINumberSlidePane.java -text -designer_base/src/com/fr/design/gui/frpane/UIRadioPane.java -text -designer_base/src/com/fr/design/gui/frpane/UITabbedPane.java -text -designer_base/src/com/fr/design/gui/frpane/UITabbedPaneUI.java -text -designer_base/src/com/fr/design/gui/frpane/UITextPane.java -text -designer_base/src/com/fr/design/gui/frpane/UITitlePanel.java -text -designer_base/src/com/fr/design/gui/frpane/UnitInputPane.java -text -designer_base/src/com/fr/design/gui/ibutton/FiveButtonLayout.java -text -designer_base/src/com/fr/design/gui/ibutton/SpecialUIButton.java -text -designer_base/src/com/fr/design/gui/ibutton/UIBasicButtonUI.java -text -designer_base/src/com/fr/design/gui/ibutton/UIButton.java -text -designer_base/src/com/fr/design/gui/ibutton/UIButtonBorder.java -text -designer_base/src/com/fr/design/gui/ibutton/UIButtonGroup.java -text -designer_base/src/com/fr/design/gui/ibutton/UIButtonUI.java -text -designer_base/src/com/fr/design/gui/ibutton/UIColorButton.java -text -designer_base/src/com/fr/design/gui/ibutton/UICombinationButton.java -text -designer_base/src/com/fr/design/gui/ibutton/UIHeadGroup.java -text -designer_base/src/com/fr/design/gui/ibutton/UIPasswordField.java -text -designer_base/src/com/fr/design/gui/ibutton/UIPreviewButton.java -text -designer_base/src/com/fr/design/gui/ibutton/UIRadioButton.java -text -designer_base/src/com/fr/design/gui/ibutton/UIRadioButtonIcon.java -text -designer_base/src/com/fr/design/gui/ibutton/UIRadioButtonMenuItemUI.java -text -designer_base/src/com/fr/design/gui/ibutton/UIRadioButtonUI.java -text -designer_base/src/com/fr/design/gui/ibutton/UITabButton.java -text -designer_base/src/com/fr/design/gui/ibutton/UITabGroup.java -text -designer_base/src/com/fr/design/gui/ibutton/UIToggleButton.java -text -designer_base/src/com/fr/design/gui/ibutton/UIToolButtonBorder.java -text -designer_base/src/com/fr/design/gui/icheckbox/UICheckBox.java -text -designer_base/src/com/fr/design/gui/icheckbox/UICheckBoxIcon.java -text -designer_base/src/com/fr/design/gui/icheckbox/UICheckBoxUI.java -text -designer_base/src/com/fr/design/gui/icombobox/AlignmentComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/ComboCheckBox.java -text -designer_base/src/com/fr/design/gui/icombobox/DictionaryComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/DictionaryConstants.java -text -designer_base/src/com/fr/design/gui/icombobox/ExtendedComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/ExtendedComboBoxTest.java -text -designer_base/src/com/fr/design/gui/icombobox/FRTreeComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/FilterComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/FilterableComboBoxModel.java -text -designer_base/src/com/fr/design/gui/icombobox/FixedHeightComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/FunctionComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/IntComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/LazyComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/LazyComboBoxTest.java -text -designer_base/src/com/fr/design/gui/icombobox/LineComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/ParameterComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/SortOrderComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/TreeComboBoxUI.java -text -designer_base/src/com/fr/design/gui/icombobox/UIBasicComboBoxEditor.java -text -designer_base/src/com/fr/design/gui/icombobox/UIBasicComboBoxUI.java -text -designer_base/src/com/fr/design/gui/icombobox/UIComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/UIComboBoxButton.java -text -designer_base/src/com/fr/design/gui/icombobox/UIComboBoxEditor.java -text -designer_base/src/com/fr/design/gui/icombobox/UIComboBoxRenderer.java -text -designer_base/src/com/fr/design/gui/icombobox/UIComboBoxUI.java -text -designer_base/src/com/fr/design/gui/icombobox/UIDictionaryComboBox.java -text -designer_base/src/com/fr/design/gui/icombobox/filter/Filter.java -text -designer_base/src/com/fr/design/gui/icombobox/filter/LastStartWithFilter.java -text -designer_base/src/com/fr/design/gui/icombobox/filter/StartsWithFilter.java -text -designer_base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeCellRenderer.java -text -designer_base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeLabel.java -text -designer_base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNode.java -text -designer_base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNodeSelectionListener.java -text -designer_base/src/com/fr/design/gui/icontainer/UIModeControlContainer.java -text -designer_base/src/com/fr/design/gui/icontainer/UIResizableContainer.java -text -designer_base/src/com/fr/design/gui/icontainer/UIScrollPane.java -text -designer_base/src/com/fr/design/gui/icontainer/UIScrollPaneBorder.java -text -designer_base/src/com/fr/design/gui/icontainer/UIScrollPaneUI.java -text -designer_base/src/com/fr/design/gui/icontainer/UITableScrollPaneBorder.java -text -designer_base/src/com/fr/design/gui/icontainer/UIVerticalScrollPane.java -text -designer_base/src/com/fr/design/gui/ilable/ActionLabel.java -text -designer_base/src/com/fr/design/gui/ilable/BoldFontTextLabel.java -text -designer_base/src/com/fr/design/gui/ilable/FRExplainLabel.java -text -designer_base/src/com/fr/design/gui/ilable/MultilineLabel.java -text -designer_base/src/com/fr/design/gui/ilable/UILabel.java -text -designer_base/src/com/fr/design/gui/ilist/ArrayListModel.java -text -designer_base/src/com/fr/design/gui/ilist/CheckBoxList.java -text -designer_base/src/com/fr/design/gui/ilist/DefaultListCellEditor.java -text -designer_base/src/com/fr/design/gui/ilist/JNameEdList.java -text -designer_base/src/com/fr/design/gui/ilist/ListCellEditor.java -text -designer_base/src/com/fr/design/gui/ilist/ListModelElement.java -text -designer_base/src/com/fr/design/gui/ilist/ModNameActionListener.java -text -designer_base/src/com/fr/design/gui/ilist/QuickList.java -text -designer_base/src/com/fr/design/gui/ilist/TableViewList.java -text -designer_base/src/com/fr/design/gui/ilist/UIList.java -text -designer_base/src/com/fr/design/gui/imenu/UIBasicMenuItemUI.java -text -designer_base/src/com/fr/design/gui/imenu/UIBasicMenuUI.java -text -designer_base/src/com/fr/design/gui/imenu/UICheckBoxMenuItem.java -text -designer_base/src/com/fr/design/gui/imenu/UIListPopup.java -text -designer_base/src/com/fr/design/gui/imenu/UIMenu.java -text -designer_base/src/com/fr/design/gui/imenu/UIMenuBar.java -text -designer_base/src/com/fr/design/gui/imenu/UIMenuBarUI.java -text -designer_base/src/com/fr/design/gui/imenu/UIMenuHighLight.java -text -designer_base/src/com/fr/design/gui/imenu/UIMenuItem.java -text -designer_base/src/com/fr/design/gui/imenu/UIMenuUI.java -text -designer_base/src/com/fr/design/gui/imenu/UIPopupMenu.java -text -designer_base/src/com/fr/design/gui/imenu/UIPopupMenuBorder.java -text -designer_base/src/com/fr/design/gui/imenu/UIPopupMenuSeparatorUI.java -text -designer_base/src/com/fr/design/gui/imenu/UIScrollMenu.java -text -designer_base/src/com/fr/design/gui/imenu/UIScrollMenuDemo.java -text -designer_base/src/com/fr/design/gui/imenu/UIScrollPopUpMenu.java -text -designer_base/src/com/fr/design/gui/imenutable/UIMenuNameableCreator.java -text -designer_base/src/com/fr/design/gui/imenutable/UIMenuTable.java -text -designer_base/src/com/fr/design/gui/imenutable/UIMenuTableDataModel.java -text -designer_base/src/com/fr/design/gui/imenutable/UIMenuTableUI.java -text -designer_base/src/com/fr/design/gui/ipasswordfield/UIPassWordField.java -text -designer_base/src/com/fr/design/gui/ipoppane/PopupHider.java -text -designer_base/src/com/fr/design/gui/iprogressbar/AutoProgressBar.java -text -designer_base/src/com/fr/design/gui/iprogressbar/FRProgressBar.java -text -designer_base/src/com/fr/design/gui/iprogressbar/MonitorCancelWork.java -text -designer_base/src/com/fr/design/gui/iprogressbar/UIProgressBarBorder.java -text -designer_base/src/com/fr/design/gui/iprogressbar/UIProgressBarUI.java -text -designer_base/src/com/fr/design/gui/iscrollbar/UIBasicScrollBarUI.java -text -designer_base/src/com/fr/design/gui/iscrollbar/UISBChooser.java -text -designer_base/src/com/fr/design/gui/iscrollbar/UIScrollBar.java -text -designer_base/src/com/fr/design/gui/iscrollbar/UIScrollBarUI.java -text -designer_base/src/com/fr/design/gui/iscrollbar/UIScrollButton.java -text -designer_base/src/com/fr/design/gui/islider/UISlider.java -text -designer_base/src/com/fr/design/gui/ispinner/UIBasicSpinner.java -text -designer_base/src/com/fr/design/gui/ispinner/UISpinner.java -text -designer_base/src/com/fr/design/gui/ispinner/UISpinnerButtonUI.java -text -designer_base/src/com/fr/design/gui/ispinner/UISpinnerUI.java -text -designer_base/src/com/fr/design/gui/ispinner/UpperCaseSpinner.java -text -designer_base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneDivider.java -text -designer_base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneUI.java -text -designer_base/src/com/fr/design/gui/itable/AbstractPropertyTable.java -text -designer_base/src/com/fr/design/gui/itable/GroupRenderer.java -text -designer_base/src/com/fr/design/gui/itable/HeaderRenderer.java -text -designer_base/src/com/fr/design/gui/itable/PropertyGroup.java -text -designer_base/src/com/fr/design/gui/itable/SortableJTable.java -text -designer_base/src/com/fr/design/gui/itable/TableSorter.java -text -designer_base/src/com/fr/design/gui/itable/UIBasicTableUI.java -text -designer_base/src/com/fr/design/gui/itable/UIComponentTable.java -text -designer_base/src/com/fr/design/gui/itable/UIDefaultTableCellEditor.java -text -designer_base/src/com/fr/design/gui/itable/UISelectTable.java -text -designer_base/src/com/fr/design/gui/itable/UITable.java -text -designer_base/src/com/fr/design/gui/itable/UITableComponentModel.java -text -designer_base/src/com/fr/design/gui/itable/UITableDataModel.java -text -designer_base/src/com/fr/design/gui/itable/UITableEditor.java -text -designer_base/src/com/fr/design/gui/itable/UITableNoOptionUI.java -text -designer_base/src/com/fr/design/gui/itable/UITableUI.java -text -designer_base/src/com/fr/design/gui/itableeditorpane/ActionStyle.java -text -designer_base/src/com/fr/design/gui/itableeditorpane/ParameterTableModel.java -text -designer_base/src/com/fr/design/gui/itableeditorpane/UIArrayTableModel.java -text -designer_base/src/com/fr/design/gui/itableeditorpane/UITableEditAction.java -text -designer_base/src/com/fr/design/gui/itableeditorpane/UITableEditorLoader.java -text -designer_base/src/com/fr/design/gui/itableeditorpane/UITableEditorPane.java -text -designer_base/src/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java -text -designer_base/src/com/fr/design/gui/itabpane/TitleChangeListener.java -text -designer_base/src/com/fr/design/gui/itabpane/UITabPaneCreator.java -text -designer_base/src/com/fr/design/gui/itabpane/UITabsHeaderIconPane.java -text -designer_base/src/com/fr/design/gui/itextarea/DescriptionTextArea.java -text -designer_base/src/com/fr/design/gui/itextarea/FRExplainTextArea.java -text -designer_base/src/com/fr/design/gui/itextarea/UITextArea.java -text -designer_base/src/com/fr/design/gui/itextarea/UITextAreaUI.java -text -designer_base/src/com/fr/design/gui/itextfield/AutoCompletionDemo.java -text -designer_base/src/com/fr/design/gui/itextfield/CompletionFilter.java -text -designer_base/src/com/fr/design/gui/itextfield/DefaultCompletionFilter.java -text -designer_base/src/com/fr/design/gui/itextfield/EditTextField.java -text -designer_base/src/com/fr/design/gui/itextfield/FRGraphics2D.java -text -designer_base/src/com/fr/design/gui/itextfield/PlaceholderTextField.java -text -designer_base/src/com/fr/design/gui/itextfield/TextFieldUI.java -text -designer_base/src/com/fr/design/gui/itextfield/UIAutoCompletionField.java -text -designer_base/src/com/fr/design/gui/itextfield/UIGridTextField.java -text -designer_base/src/com/fr/design/gui/itextfield/UINumberField.java -text -designer_base/src/com/fr/design/gui/itextfield/UISearchTextField.java -text -designer_base/src/com/fr/design/gui/itextfield/UITextField.java -text -designer_base/src/com/fr/design/gui/itextfield/UITextFieldUI.java -text -designer_base/src/com/fr/design/gui/itoolbar/UILargeToolbar.java -text -designer_base/src/com/fr/design/gui/itoolbar/UIToolBarBorder.java -text -designer_base/src/com/fr/design/gui/itoolbar/UIToolBarSeparatorUI.java -text -designer_base/src/com/fr/design/gui/itoolbar/UIToolBarUI.java -text -designer_base/src/com/fr/design/gui/itoolbar/UIToolbar.java -text -designer_base/src/com/fr/design/gui/itooltip/MultiLineToolTip.java -text -designer_base/src/com/fr/design/gui/itooltip/MultiLineToolTipUI.java -text -designer_base/src/com/fr/design/gui/itooltip/UIToolTip.java -text -designer_base/src/com/fr/design/gui/itooltip/UIToolTipBorder.java -text -designer_base/src/com/fr/design/gui/itooltip/UIToolTipUI.java -text -designer_base/src/com/fr/design/gui/itree/UITreeUI.java -text -designer_base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java -text -designer_base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeCellRenderer.java -text -designer_base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeSelectionModel.java -text -designer_base/src/com/fr/design/gui/itree/checkboxtree/NullLabel.java -text -designer_base/src/com/fr/design/gui/itree/checkboxtree/NullPanel.java -text -designer_base/src/com/fr/design/gui/itree/checkboxtree/NullTristateCheckBox.java -text -designer_base/src/com/fr/design/gui/itree/checkboxtree/TristateCheckBox.java -text -designer_base/src/com/fr/design/gui/itree/filetree/AbstractFileTree.java -text -designer_base/src/com/fr/design/gui/itree/filetree/ClassFileTree.java -text -designer_base/src/com/fr/design/gui/itree/filetree/EnvFileTree.java -text -designer_base/src/com/fr/design/gui/itree/filetree/FileComparator.java -text -designer_base/src/com/fr/design/gui/itree/filetree/FileDirectoryNode.java -text -designer_base/src/com/fr/design/gui/itree/filetree/FileNodeComparator.java -text -designer_base/src/com/fr/design/gui/itree/filetree/FileTreeIcon.java -text -designer_base/src/com/fr/design/gui/itree/filetree/JFileTree.java -text -designer_base/src/com/fr/design/gui/itree/filetree/ReportletPane.java -text -designer_base/src/com/fr/design/gui/itree/filetree/RootFile.java -text -designer_base/src/com/fr/design/gui/itree/filetree/TemplateFileTree.java -text -designer_base/src/com/fr/design/gui/itree/refreshabletree/ExpandMutableTreeNode.java -text -designer_base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java -text -designer_base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTreeTest.java -text -designer_base/src/com/fr/design/gui/itree/refreshabletree/TreeDataCardPane.java -text -designer_base/src/com/fr/design/gui/itree/refreshabletree/TreeNodePane.java -text -designer_base/src/com/fr/design/gui/itree/refreshabletree/TreeRootPane.java -text -designer_base/src/com/fr/design/gui/itree/refreshabletree/UserObjectOP.java -text -designer_base/src/com/fr/design/gui/itree/refreshabletree/UserObjectRefreshJTree.java -text -designer_base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenLoaderFactory.java -text -designer_base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenNodesLoader.java -text -designer_base/src/com/fr/design/gui/style/AbstractBasicStylePane.java -text -designer_base/src/com/fr/design/gui/style/AlignmentPane.java -text -designer_base/src/com/fr/design/gui/style/BackgroundNoImagePane.java -text -designer_base/src/com/fr/design/gui/style/BackgroundPane.java -text -designer_base/src/com/fr/design/gui/style/BackgroundSpecialPane.java -text -designer_base/src/com/fr/design/gui/style/BorderPane.java -text -designer_base/src/com/fr/design/gui/style/DefaultIndentationUnitProcessor.java -text -designer_base/src/com/fr/design/gui/style/FRFontPane.java -text -designer_base/src/com/fr/design/gui/style/FormatPane.java -text -designer_base/src/com/fr/design/gui/style/FormatePaneNumField.java -text -designer_base/src/com/fr/design/gui/style/GradientPane.java -text -designer_base/src/com/fr/design/gui/style/NumberDragBar.java -text -designer_base/src/com/fr/design/gui/syntax/io/DocumentReader.java -text -designer_base/src/com/fr/design/gui/syntax/io/UnicodeReader.java -text -designer_base/src/com/fr/design/gui/syntax/io/UnicodeWriter.java -text -designer_base/src/com/fr/design/gui/syntax/io/package.html -text -designer_base/src/com/fr/design/gui/syntax/print/RPrintUtilities.java -text -designer_base/src/com/fr/design/gui/syntax/print/package.html -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractJFlexCTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractJFlexTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/AbstractTokenMakerFactory.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ActiveLineRangeEvent.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ActiveLineRangeListener.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ChangeableColorHighlightPainter.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/CodeTemplateManager.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultOccurrenceMarker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultTokenFactory.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultTokenMakerFactory.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DefaultTokenPainter.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/DocumentRange.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ar.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_de.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_es.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_fr.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_hu.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_in.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_it.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ja.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ko.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_nl.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_pl.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_pt_BR.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_ru.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_tr.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_zh_CN.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ErrorStrip_zh_TW.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/FileFileLocation.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/FileLocation.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/FoldingAwareIconRowHeader.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/LinkGenerator.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/LinkGeneratorResult.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/MarkOccurrencesHighlightPainter.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/MarkOccurrencesSupport.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/OccurrenceMarker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/ParserManager.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/PopupWindowDecorator.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSTAView.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxDocument.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaDefaultInputMap.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaEditorKit.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaHighlighter.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextAreaUI.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ar.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_de.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_es.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_fr.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_hu.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_in.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_it.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ja.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ko.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_nl.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_pl.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_pt_BR.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_ru.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_tr.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_zh_CN.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxTextArea_zh_TW.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RSyntaxUtilities.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RTfToText.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RtfGenerator.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/RtfTransferable.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SelectRegionLinkGeneratorResult.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SquiggleUnderlineHighlightPainter.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Style.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxConstants.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxScheme.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/SyntaxView.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TextEditorPane.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Theme.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/Token.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenFactory.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenImpl.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenIterator.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMakerBase.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMakerFactory.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenMap.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenOrientedView.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenPainter.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenTypes.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/TokenUtils.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/URLFileLocation.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/VisibleWhitespaceTokenPainter.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/WrappedSyntaxView.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/WrappedSyntaxView2.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/XmlOccurrenceMarker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ar.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_de.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_es.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_fr.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_hu.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_in.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_it.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ja.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ko.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_nl.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_pl.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_pt_BR.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_ru.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_tr.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_CN.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/FocusableTip_zh_TW.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/SizeGrip.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/TipUtil.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/TipWindow.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/osx_sizegrip.png -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/focusabletip/package.html -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/CurlyFoldParser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/Fold.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldCollapser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldManager.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldParser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldParserManager.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/FoldType.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/HtmlFoldParser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/JsonFoldParser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/LatexFoldParser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/LispFoldParser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/NsisFoldParser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/XmlFoldParser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/folding/package.html -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/AbstractMarkupTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ActionScriptTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/AssemblerX86TokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/BBCodeTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CPlusPlusTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSSTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSSTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSharpTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CSharpTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/CTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ClojureTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ClojureTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DelphiTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DelphiTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DtdTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/DtdTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FormulaTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FortranTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/FortranTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/GroovyTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/GroovyTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HTMLTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HTMLTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HtaccessTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/HtaccessTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JSPTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JSPTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaScriptTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JavaTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JsonTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/JsonTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LatexTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LatexTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LispTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LispTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LuaTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/LuaTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MakefileTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MakefileTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MxmlTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/MxmlTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/NSISTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/NSISTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PHPTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PHPTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PerlTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PerlTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PlainTextTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PropertiesFileTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PythonTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/PythonTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/RubyTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/RubyTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SASTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SASTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SQLTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/SQLTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ScalaTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/ScalaTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/TclTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/TclTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/UnixShellTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/VisualBasicTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/WindowsBatchTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/XMLTokenMaker.flex -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/XMLTokenMaker.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/modes/package.html -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/package.html -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/AbstractParser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/DefaultParseResult.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/DefaultParserNotice.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ExtendedHyperlinkListener.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ParseResult.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/Parser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ParserNotice.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/TaskTagParser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/ToolTipInfo.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/XmlParser.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/parser/package.html -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/AbstractCodeTemplate.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/CodeTemplate.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/StaticCodeTemplate.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rsyntaxtextarea/templates/package.html -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/AbstractGutterComponent.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/BackgroundPainterStrategy.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/BufferedImageBackgroundPainterStrategy.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/ChangeableHighlightPainter.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/ColorBackgroundPainterStrategy.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/ConfigurableCaret.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/FoldIndicator.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/Gutter.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/GutterIconInfo.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/IconGroup.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/IconRowHeader.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/ImageBackgroundPainterStrategy.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/LineHighlightManager.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/LineNumberList.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/Macro.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RDocument.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RDocumentCharSequence.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTADefaultInputMap.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTATextTransferHandler.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaBase.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaEditorKit.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaHighlighter.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextAreaUI.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ar.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_de.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_es.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_fr.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_hu.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_in.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_it.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ja.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ko.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_nl.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_pl.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_pt_BR.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_ru.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_tr.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_zh_CN.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextArea_zh_TW.properties -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RTextScrollPane.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RUndoManager.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RecordableTextAction.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/RegExReplaceInfo.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/SearchContext.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/SearchEngine.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/SearchResult.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/SmartHighlightPainter.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/ToolTipSupplier.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/VolatileImageBackgroundPainterStrategy.java -text -designer_base/src/com/fr/design/gui/syntax/ui/rtextarea/package.html -text -designer_base/src/com/fr/design/gui/syntax/util/DynamicIntArray.java -text -designer_base/src/com/fr/design/gui/syntax/util/package.html -text -designer_base/src/com/fr/design/gui/toast/Toast.java -text -designer_base/src/com/fr/design/hyperlink/AbstractHyperlinkPane.java -text -designer_base/src/com/fr/design/hyperlink/ReporletHyperNorthPane.java -text -designer_base/src/com/fr/design/hyperlink/ReportletHyperlinkPane.java -text -designer_base/src/com/fr/design/hyperlink/WebHyperNorthPane.java -text -designer_base/src/com/fr/design/hyperlink/WebHyperlinkPane.java -text -designer_base/src/com/fr/design/icon/BorderIcon.java -text -designer_base/src/com/fr/design/icon/IconPathConstants.java -text -designer_base/src/com/fr/design/icon/LockIcon.java -text -designer_base/src/com/fr/design/icon/WarningIcon.java -text -designer_base/src/com/fr/design/images/arrow/arrow_down.png -text -designer_base/src/com/fr/design/images/arrow/arrow_up.png -text -designer_base/src/com/fr/design/images/browser/360.png -text -designer_base/src/com/fr/design/images/browser/back.png -text -designer_base/src/com/fr/design/images/browser/chrome.png -text -designer_base/src/com/fr/design/images/browser/firefox.png -text -designer_base/src/com/fr/design/images/browser/forward.png -text -designer_base/src/com/fr/design/images/browser/go.png -text -designer_base/src/com/fr/design/images/browser/home.png -text -designer_base/src/com/fr/design/images/browser/ie.png -text -designer_base/src/com/fr/design/images/browser/reload.png -text -designer_base/src/com/fr/design/images/browser/stop.png -text -designer_base/src/com/fr/design/images/buttonicon/add.png -text -designer_base/src/com/fr/design/images/buttonicon/add_over.png -text -designer_base/src/com/fr/design/images/buttonicon/add_press.png -text -designer_base/src/com/fr/design/images/buttonicon/addicon.png -text -designer_base/src/com/fr/design/images/buttonicon/additicon_grey.png -text -designer_base/src/com/fr/design/images/buttonicon/anab24.png -text -designer_base/src/com/fr/design/images/buttonicon/anas.png -text -designer_base/src/com/fr/design/images/buttonicon/arrow.png -text -designer_base/src/com/fr/design/images/buttonicon/arrowdown.png -text -designer_base/src/com/fr/design/images/buttonicon/arrowup.png -text -designer_base/src/com/fr/design/images/buttonicon/bind_ds_column.png -text -designer_base/src/com/fr/design/images/buttonicon/button_0.png -text -designer_base/src/com/fr/design/images/buttonicon/cell.png -text -designer_base/src/com/fr/design/images/buttonicon/cell_group.png -text -designer_base/src/com/fr/design/images/buttonicon/close_icon.png -text -designer_base/src/com/fr/design/images/buttonicon/column.png -text -designer_base/src/com/fr/design/images/buttonicon/cube.png -text -designer_base/src/com/fr/design/images/buttonicon/ds_column.png -text -designer_base/src/com/fr/design/images/buttonicon/ds_column_index.png -text -designer_base/src/com/fr/design/images/buttonicon/ds_column_name.png -text -designer_base/src/com/fr/design/images/buttonicon/dscolumn.png -text -designer_base/src/com/fr/design/images/buttonicon/editn.png -text -designer_base/src/com/fr/design/images/buttonicon/editp.png -text -designer_base/src/com/fr/design/images/buttonicon/hiden.png -text -designer_base/src/com/fr/design/images/buttonicon/hidep.png -text -designer_base/src/com/fr/design/images/buttonicon/history.png -text -designer_base/src/com/fr/design/images/buttonicon/list_cover.png -text -designer_base/src/com/fr/design/images/buttonicon/list_covered.png -text -designer_base/src/com/fr/design/images/buttonicon/list_icon.png -text -designer_base/src/com/fr/design/images/buttonicon/list_normal.png -text -designer_base/src/com/fr/design/images/buttonicon/list_press.png -text -designer_base/src/com/fr/design/images/buttonicon/list_pressed.png -text -designer_base/src/com/fr/design/images/buttonicon/minus.png -text -designer_base/src/com/fr/design/images/buttonicon/more.png -text -designer_base/src/com/fr/design/images/buttonicon/more2.png -text -designer_base/src/com/fr/design/images/buttonicon/more3.png -text -designer_base/src/com/fr/design/images/buttonicon/more4.png -text -designer_base/src/com/fr/design/images/buttonicon/mouseoverclose[!!-~]icon.png -text -designer_base/src/com/fr/design/images/buttonicon/newcpts.png -text -designer_base/src/com/fr/design/images/buttonicon/open.png -text -designer_base/src/com/fr/design/images/buttonicon/pageb24.png -text -designer_base/src/com/fr/design/images/buttonicon/pages.png -text -designer_base/src/com/fr/design/images/buttonicon/parameter.png -text -designer_base/src/com/fr/design/images/buttonicon/plus.png -text -designer_base/src/com/fr/design/images/buttonicon/pressclose[!!-~]icon.png -text -designer_base/src/com/fr/design/images/buttonicon/prevew_down_icon.png -text -designer_base/src/com/fr/design/images/buttonicon/prewidget.png -text -designer_base/src/com/fr/design/images/buttonicon/redo.png -text -designer_base/src/com/fr/design/images/buttonicon/refresh.png -text -designer_base/src/com/fr/design/images/buttonicon/run24.png -text -designer_base/src/com/fr/design/images/buttonicon/runs.png -text -designer_base/src/com/fr/design/images/buttonicon/save.png -text -designer_base/src/com/fr/design/images/buttonicon/select.png -text -designer_base/src/com/fr/design/images/buttonicon/select_item.png -text -designer_base/src/com/fr/design/images/buttonicon/setting.png -text -designer_base/src/com/fr/design/images/buttonicon/switchShortCuts.png -text -designer_base/src/com/fr/design/images/buttonicon/type_bool.png -text -designer_base/src/com/fr/design/images/buttonicon/type_cursor.png -text -designer_base/src/com/fr/design/images/buttonicon/type_date.png -text -designer_base/src/com/fr/design/images/buttonicon/type_double.png -text -designer_base/src/com/fr/design/images/buttonicon/type_formula.png -text -designer_base/src/com/fr/design/images/buttonicon/type_int.png -text -designer_base/src/com/fr/design/images/buttonicon/type_none.png -text -designer_base/src/com/fr/design/images/buttonicon/type_string.png -text -designer_base/src/com/fr/design/images/buttonicon/undo.png -text -designer_base/src/com/fr/design/images/buttonicon/viewn.png -text -designer_base/src/com/fr/design/images/buttonicon/viewp.png -text -designer_base/src/com/fr/design/images/buttonicon/warn.png -text -designer_base/src/com/fr/design/images/buttonicon/widgets.png -text -designer_base/src/com/fr/design/images/buttonicon/writeb24.png -text -designer_base/src/com/fr/design/images/buttonicon/writes.png -text -designer_base/src/com/fr/design/images/buttonicon/yes.png -text -designer_base/src/com/fr/design/images/calculate/average.png -text -designer_base/src/com/fr/design/images/calculate/count.png -text -designer_base/src/com/fr/design/images/calculate/max.png -text -designer_base/src/com/fr/design/images/calculate/min.png -text -designer_base/src/com/fr/design/images/calculate/none.png -text -designer_base/src/com/fr/design/images/calculate/sum.png -text -designer_base/src/com/fr/design/images/calender/month_add.png -text -designer_base/src/com/fr/design/images/calender/month_add_click.png -text -designer_base/src/com/fr/design/images/calender/month_add_hover.png -text -designer_base/src/com/fr/design/images/calender/month_reduce.png -text -designer_base/src/com/fr/design/images/calender/month_reduce_click.png -text -designer_base/src/com/fr/design/images/calender/month_reduce_hover.png -text -designer_base/src/com/fr/design/images/calender/year_add.png -text -designer_base/src/com/fr/design/images/calender/year_add_click.png -text -designer_base/src/com/fr/design/images/calender/year_add_hover.png -text -designer_base/src/com/fr/design/images/calender/year_reduce.png -text -designer_base/src/com/fr/design/images/calender/year_reduce_click.png -text -designer_base/src/com/fr/design/images/calender/year_reduce_hover.png -text -designer_base/src/com/fr/design/images/chart/AreaPlot/layout/0.png -text -designer_base/src/com/fr/design/images/chart/AreaPlot/layout/1.png -text -designer_base/src/com/fr/design/images/chart/AreaPlot/layout/2.png -text -designer_base/src/com/fr/design/images/chart/AreaPlot/layout/3.png -text -designer_base/src/com/fr/design/images/chart/AreaPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/AreaPlot/type/1.png -text -designer_base/src/com/fr/design/images/chart/AreaPlot/type/2.png -text -designer_base/src/com/fr/design/images/chart/AreaPlot/type/3.png -text -designer_base/src/com/fr/design/images/chart/AreaPlot/type/4.png -text -designer_base/src/com/fr/design/images/chart/AreaPlot/type/5.png -text -designer_base/src/com/fr/design/images/chart/BarPlot/layout/0.png -text -designer_base/src/com/fr/design/images/chart/BarPlot/layout/1.png -text -designer_base/src/com/fr/design/images/chart/BarPlot/layout/2.png -text -designer_base/src/com/fr/design/images/chart/BarPlot/layout/3.png -text -designer_base/src/com/fr/design/images/chart/BarPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/BarPlot/type/1.png -text -designer_base/src/com/fr/design/images/chart/BarPlot/type/2.png -text -designer_base/src/com/fr/design/images/chart/BarPlot/type/3.png -text -designer_base/src/com/fr/design/images/chart/BarPlot/type/4.png -text -designer_base/src/com/fr/design/images/chart/BarPlot/type/5.png -text -designer_base/src/com/fr/design/images/chart/BarPlot/type/6.png -text -designer_base/src/com/fr/design/images/chart/BubblePlot/layout/0.png -text -designer_base/src/com/fr/design/images/chart/BubblePlot/layout/1.png -text -designer_base/src/com/fr/design/images/chart/BubblePlot/layout/2.png -text -designer_base/src/com/fr/design/images/chart/BubblePlot/layout/3.png -text -designer_base/src/com/fr/design/images/chart/BubblePlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/ChangeChart.png -text -designer_base/src/com/fr/design/images/chart/ChartAxisLineStyle/cross.png -text -designer_base/src/com/fr/design/images/chart/ChartAxisLineStyle/external.png -text -designer_base/src/com/fr/design/images/chart/ChartAxisLineStyle/inside.png -text -designer_base/src/com/fr/design/images/chart/ChartData.png -text -designer_base/src/com/fr/design/images/chart/ChartLegend/layout_bottom.png -text -designer_base/src/com/fr/design/images/chart/ChartLegend/layout_left.png -text -designer_base/src/com/fr/design/images/chart/ChartLegend/layout_right.png -text -designer_base/src/com/fr/design/images/chart/ChartLegend/layout_top.png -text -designer_base/src/com/fr/design/images/chart/ChartLegend/layout_top_right.png -text -designer_base/src/com/fr/design/images/chart/ChartStyle.png -text -designer_base/src/com/fr/design/images/chart/ChartType.png -text -designer_base/src/com/fr/design/images/chart/ColumnPlot/layout/0.png -text -designer_base/src/com/fr/design/images/chart/ColumnPlot/layout/1.png -text -designer_base/src/com/fr/design/images/chart/ColumnPlot/layout/2.png -text -designer_base/src/com/fr/design/images/chart/ColumnPlot/layout/3.png -text -designer_base/src/com/fr/design/images/chart/ColumnPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/ColumnPlot/type/1.png -text -designer_base/src/com/fr/design/images/chart/ColumnPlot/type/2.png -text -designer_base/src/com/fr/design/images/chart/ColumnPlot/type/3.png -text -designer_base/src/com/fr/design/images/chart/ColumnPlot/type/4.png -text -designer_base/src/com/fr/design/images/chart/ColumnPlot/type/5.png -text -designer_base/src/com/fr/design/images/chart/ColumnPlot/type/6.png -text -designer_base/src/com/fr/design/images/chart/ConditionAttr.png -text -designer_base/src/com/fr/design/images/chart/CustomPlot/layout/0.png -text -designer_base/src/com/fr/design/images/chart/CustomPlot/layout/1.png -text -designer_base/src/com/fr/design/images/chart/CustomPlot/layout/2.png -text -designer_base/src/com/fr/design/images/chart/CustomPlot/layout/3.png -text -designer_base/src/com/fr/design/images/chart/CustomPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/DonutPlot/layout/0.png -text -designer_base/src/com/fr/design/images/chart/DonutPlot/layout/1.png -text -designer_base/src/com/fr/design/images/chart/DonutPlot/layout/2.png -text -designer_base/src/com/fr/design/images/chart/DonutPlot/layout/3.png -text -designer_base/src/com/fr/design/images/chart/DonutPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/DonutPlot/type/1.png -text -designer_base/src/com/fr/design/images/chart/FunnelPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/GanttPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/GisMapPlot/layout/0.png -text -designer_base/src/com/fr/design/images/chart/GisMapPlot/layout/1.png -text -designer_base/src/com/fr/design/images/chart/GisMapPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/InterAttr.png -text -designer_base/src/com/fr/design/images/chart/LinePlot/layout/0.png -text -designer_base/src/com/fr/design/images/chart/LinePlot/layout/1.png -text -designer_base/src/com/fr/design/images/chart/LinePlot/layout/2.png -text -designer_base/src/com/fr/design/images/chart/LinePlot/layout/3.png -text -designer_base/src/com/fr/design/images/chart/LinePlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/LinePlot/type/1.png -text -designer_base/src/com/fr/design/images/chart/LinePlot/type/2.png -text -designer_base/src/com/fr/design/images/chart/MapPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/MapPlot/type/1.png -text -designer_base/src/com/fr/design/images/chart/MapPlot/type/2.png -text -designer_base/src/com/fr/design/images/chart/MapPlot/type/3.png -text -designer_base/src/com/fr/design/images/chart/MeterPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/MeterPlot/type/1.png -text -designer_base/src/com/fr/design/images/chart/MeterPlot/type/2.png -text -designer_base/src/com/fr/design/images/chart/PiePlot/layout/0.png -text -designer_base/src/com/fr/design/images/chart/PiePlot/layout/1.png -text -designer_base/src/com/fr/design/images/chart/PiePlot/layout/2.png -text -designer_base/src/com/fr/design/images/chart/PiePlot/layout/3.png -text -designer_base/src/com/fr/design/images/chart/PiePlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/PiePlot/type/1.png -text -designer_base/src/com/fr/design/images/chart/RadarPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/RangePlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/StockPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/XYScatterPlot/layout/0.png -text -designer_base/src/com/fr/design/images/chart/XYScatterPlot/layout/1.png -text -designer_base/src/com/fr/design/images/chart/XYScatterPlot/layout/2.png -text -designer_base/src/com/fr/design/images/chart/XYScatterPlot/layout/3.png -text -designer_base/src/com/fr/design/images/chart/XYScatterPlot/type/0.png -text -designer_base/src/com/fr/design/images/chart/default.png -text -designer_base/src/com/fr/design/images/chart/link.png -text -designer_base/src/com/fr/design/images/chart/moved.png -text -designer_base/src/com/fr/design/images/chart/normal.png -text -designer_base/src/com/fr/design/images/chart/pressed.png -text -designer_base/src/com/fr/design/images/condition/bracket.png -text -designer_base/src/com/fr/design/images/condition/unBracket.png -text -designer_base/src/com/fr/design/images/control/addPopup.png -text -designer_base/src/com/fr/design/images/control/arrow_down.png -text -designer_base/src/com/fr/design/images/control/bar.png -text -designer_base/src/com/fr/design/images/control/barl.png -text -designer_base/src/com/fr/design/images/control/barm.png -text -designer_base/src/com/fr/design/images/control/close.png -text -designer_base/src/com/fr/design/images/control/close_rollover.png -text -designer_base/src/com/fr/design/images/control/closet.png -text -designer_base/src/com/fr/design/images/control/control-center2.png -text -designer_base/src/com/fr/design/images/control/copy.png -text -designer_base/src/com/fr/design/images/control/dot.png -text -designer_base/src/com/fr/design/images/control/dotv.png -text -designer_base/src/com/fr/design/images/control/down.png -text -designer_base/src/com/fr/design/images/control/downdis.png -text -designer_base/src/com/fr/design/images/control/downnor.png -text -designer_base/src/com/fr/design/images/control/downpre.png -text -designer_base/src/com/fr/design/images/control/edit.png -text -designer_base/src/com/fr/design/images/control/left.png -text -designer_base/src/com/fr/design/images/control/leftleft.png -text -designer_base/src/com/fr/design/images/control/leftnor.png -text -designer_base/src/com/fr/design/images/control/leftpre.png -text -designer_base/src/com/fr/design/images/control/lock.png -text -designer_base/src/com/fr/design/images/control/more.png -text -designer_base/src/com/fr/design/images/control/refresh.png -text -designer_base/src/com/fr/design/images/control/remove.png -text -designer_base/src/com/fr/design/images/control/right.png -text -designer_base/src/com/fr/design/images/control/rightnor.png -text -designer_base/src/com/fr/design/images/control/rightpre.png -text -designer_base/src/com/fr/design/images/control/rightright.png -text -designer_base/src/com/fr/design/images/control/sortAsc.png -text -designer_base/src/com/fr/design/images/control/unlock.png -text -designer_base/src/com/fr/design/images/control/up.png -text -designer_base/src/com/fr/design/images/control/updis.png -text -designer_base/src/com/fr/design/images/control/upnor.png -text -designer_base/src/com/fr/design/images/control/uppre.png -text -designer_base/src/com/fr/design/images/control/warn.png -text -designer_base/src/com/fr/design/images/custombtn/baobiaozhuti.png -text -designer_base/src/com/fr/design/images/custombtn/baobiaozhuti_click.png -text -designer_base/src/com/fr/design/images/custombtn/baobiaozhuti_hover.png -text -designer_base/src/com/fr/design/images/custombtn/canshujiemian.png -text -designer_base/src/com/fr/design/images/custombtn/canshujiemian_click.png -text -designer_base/src/com/fr/design/images/custombtn/canshujiemian_hover.png -text -designer_base/src/com/fr/design/images/custombtn/edit.png -text -designer_base/src/com/fr/design/images/custombtn/edit_click.png -text -designer_base/src/com/fr/design/images/custombtn/edit_hover.png -text -designer_base/src/com/fr/design/images/custombtn/form.png -text -designer_base/src/com/fr/design/images/custombtn/form_click.png -text -designer_base/src/com/fr/design/images/custombtn/form_hover.png -text -designer_base/src/com/fr/design/images/custombtn/left.gif -text -designer_base/src/com/fr/design/images/custombtn/page.png -text -designer_base/src/com/fr/design/images/custombtn/page_click.png -text -designer_base/src/com/fr/design/images/custombtn/page_hover.png -text -designer_base/src/com/fr/design/images/custombtn/preview.png -text -designer_base/src/com/fr/design/images/custombtn/preview_click.png -text -designer_base/src/com/fr/design/images/custombtn/preview_hover.png -text -designer_base/src/com/fr/design/images/custombtn/right.gif -text -designer_base/src/com/fr/design/images/custombtn/setting.png -text -designer_base/src/com/fr/design/images/custombtn/setting_click.png -text -designer_base/src/com/fr/design/images/custombtn/setting_hover.png -text -designer_base/src/com/fr/design/images/dashboard/chart.png -text -designer_base/src/com/fr/design/images/dashboard/files.png -text -designer_base/src/com/fr/design/images/dashboard/form.png -text -designer_base/src/com/fr/design/images/dashboard/guide.png -text -designer_base/src/com/fr/design/images/dashboard/img/0.gif -text -designer_base/src/com/fr/design/images/dashboard/img/1.gif -text -designer_base/src/com/fr/design/images/dashboard/img/1.png -text -designer_base/src/com/fr/design/images/dashboard/img/10.gif -text -designer_base/src/com/fr/design/images/dashboard/img/10.png -text -designer_base/src/com/fr/design/images/dashboard/img/11.gif -text -designer_base/src/com/fr/design/images/dashboard/img/11.png -text -designer_base/src/com/fr/design/images/dashboard/img/12.gif -text -designer_base/src/com/fr/design/images/dashboard/img/12.png -text -designer_base/src/com/fr/design/images/dashboard/img/13.gif -text -designer_base/src/com/fr/design/images/dashboard/img/13.png -text -designer_base/src/com/fr/design/images/dashboard/img/14.gif -text -designer_base/src/com/fr/design/images/dashboard/img/14.png -text -designer_base/src/com/fr/design/images/dashboard/img/15.gif -text -designer_base/src/com/fr/design/images/dashboard/img/15.png -text -designer_base/src/com/fr/design/images/dashboard/img/16.gif -text -designer_base/src/com/fr/design/images/dashboard/img/16.png -text -designer_base/src/com/fr/design/images/dashboard/img/17.gif -text -designer_base/src/com/fr/design/images/dashboard/img/17.png -text -designer_base/src/com/fr/design/images/dashboard/img/18.gif -text -designer_base/src/com/fr/design/images/dashboard/img/18.png -text -designer_base/src/com/fr/design/images/dashboard/img/19.gif -text -designer_base/src/com/fr/design/images/dashboard/img/19.png -text -designer_base/src/com/fr/design/images/dashboard/img/2.gif -text -designer_base/src/com/fr/design/images/dashboard/img/2.png -text -designer_base/src/com/fr/design/images/dashboard/img/20.png -text -designer_base/src/com/fr/design/images/dashboard/img/21.png -text -designer_base/src/com/fr/design/images/dashboard/img/22.png -text -designer_base/src/com/fr/design/images/dashboard/img/23.png -text -designer_base/src/com/fr/design/images/dashboard/img/24.png -text -designer_base/src/com/fr/design/images/dashboard/img/25.png -text -designer_base/src/com/fr/design/images/dashboard/img/26.png -text -designer_base/src/com/fr/design/images/dashboard/img/27.png -text -designer_base/src/com/fr/design/images/dashboard/img/28.png -text -designer_base/src/com/fr/design/images/dashboard/img/29.png -text -designer_base/src/com/fr/design/images/dashboard/img/3.gif -text -designer_base/src/com/fr/design/images/dashboard/img/3.png -text -designer_base/src/com/fr/design/images/dashboard/img/30.png -text -designer_base/src/com/fr/design/images/dashboard/img/31.png -text -designer_base/src/com/fr/design/images/dashboard/img/32.png -text -designer_base/src/com/fr/design/images/dashboard/img/33.png -text -designer_base/src/com/fr/design/images/dashboard/img/34.png -text -designer_base/src/com/fr/design/images/dashboard/img/35.png -text -designer_base/src/com/fr/design/images/dashboard/img/36.png -text -designer_base/src/com/fr/design/images/dashboard/img/37.png -text -designer_base/src/com/fr/design/images/dashboard/img/38.png -text -designer_base/src/com/fr/design/images/dashboard/img/39.png -text -designer_base/src/com/fr/design/images/dashboard/img/4.gif -text -designer_base/src/com/fr/design/images/dashboard/img/4.png -text -designer_base/src/com/fr/design/images/dashboard/img/40.png -text -designer_base/src/com/fr/design/images/dashboard/img/41.png -text -designer_base/src/com/fr/design/images/dashboard/img/42.png -text -designer_base/src/com/fr/design/images/dashboard/img/43.png -text -designer_base/src/com/fr/design/images/dashboard/img/44.png -text -designer_base/src/com/fr/design/images/dashboard/img/45.png -text -designer_base/src/com/fr/design/images/dashboard/img/46.png -text -designer_base/src/com/fr/design/images/dashboard/img/47.png -text -designer_base/src/com/fr/design/images/dashboard/img/48.png -text -designer_base/src/com/fr/design/images/dashboard/img/49.png -text -designer_base/src/com/fr/design/images/dashboard/img/5.gif -text -designer_base/src/com/fr/design/images/dashboard/img/5.png -text -designer_base/src/com/fr/design/images/dashboard/img/50.png -text -designer_base/src/com/fr/design/images/dashboard/img/52.png -text -designer_base/src/com/fr/design/images/dashboard/img/54.png -text -designer_base/src/com/fr/design/images/dashboard/img/55.png -text -designer_base/src/com/fr/design/images/dashboard/img/56.png -text -designer_base/src/com/fr/design/images/dashboard/img/57.png -text -designer_base/src/com/fr/design/images/dashboard/img/6.gif -text -designer_base/src/com/fr/design/images/dashboard/img/6.png -text -designer_base/src/com/fr/design/images/dashboard/img/7.gif -text -designer_base/src/com/fr/design/images/dashboard/img/7.png -text -designer_base/src/com/fr/design/images/dashboard/img/8.gif -text -designer_base/src/com/fr/design/images/dashboard/img/8.png -text -designer_base/src/com/fr/design/images/dashboard/img/9.gif -text -designer_base/src/com/fr/design/images/dashboard/img/9.png -text -designer_base/src/com/fr/design/images/dashboard/img/Thumbs.db -text -designer_base/src/com/fr/design/images/data/arrow_branch.png -text -designer_base/src/com/fr/design/images/data/bind/add.png -text -designer_base/src/com/fr/design/images/data/bind/distanceconnect.png -text -designer_base/src/com/fr/design/images/data/bind/groupAscColumn.png -text -designer_base/src/com/fr/design/images/data/bind/groupColumn.png -text -designer_base/src/com/fr/design/images/data/bind/groupDescColumn.png -text -designer_base/src/com/fr/design/images/data/bind/localconnect.png -text -designer_base/src/com/fr/design/images/data/bind/modify.png -text -designer_base/src/com/fr/design/images/data/bind/normalColumn.png -text -designer_base/src/com/fr/design/images/data/bind/selectColumn.png -text -designer_base/src/com/fr/design/images/data/bind/sortAscColumn.png -text -designer_base/src/com/fr/design/images/data/bind/sortColumn.png -text -designer_base/src/com/fr/design/images/data/bind/sortDescColumn.png -text -designer_base/src/com/fr/design/images/data/bind/summaryColumn.png -text -designer_base/src/com/fr/design/images/data/comb_widget.png -text -designer_base/src/com/fr/design/images/data/convertEmbedded.png -text -designer_base/src/com/fr/design/images/data/cube.png -text -designer_base/src/com/fr/design/images/data/custom_widget.png -text -designer_base/src/com/fr/design/images/data/dataDictionary.png -text -designer_base/src/com/fr/design/images/data/dataTable.png -text -designer_base/src/com/fr/design/images/data/database.png -text -designer_base/src/com/fr/design/images/data/datakubiao.png -text -designer_base/src/com/fr/design/images/data/datasource.png -text -designer_base/src/com/fr/design/images/data/default_widget.png -text -designer_base/src/com/fr/design/images/data/diy.png -text -designer_base/src/com/fr/design/images/data/dock/XML.png -text -designer_base/src/com/fr/design/images/data/dock/classTableData.png -text -designer_base/src/com/fr/design/images/data/dock/dataTable.png -text -designer_base/src/com/fr/design/images/data/dock/database.png -text -designer_base/src/com/fr/design/images/data/dock/excel.png -text -designer_base/src/com/fr/design/images/data/dock/relation_table_data.png -text -designer_base/src/com/fr/design/images/data/dock/serverclasstabledata.png -text -designer_base/src/com/fr/design/images/data/dock/serverdatabase.png -text -designer_base/src/com/fr/design/images/data/dock/serverdatatable.png -text -designer_base/src/com/fr/design/images/data/dock/table_proc.png -text -designer_base/src/com/fr/design/images/data/dock/table_text.png -text -designer_base/src/com/fr/design/images/data/editQuery.png -text -designer_base/src/com/fr/design/images/data/field.png -text -designer_base/src/com/fr/design/images/data/file.png -text -designer_base/src/com/fr/design/images/data/multi.png -text -designer_base/src/com/fr/design/images/data/newQuery.png -text -designer_base/src/com/fr/design/images/data/private.png -text -designer_base/src/com/fr/design/images/data/public.png -text -designer_base/src/com/fr/design/images/data/sap.png -text -designer_base/src/com/fr/design/images/data/search.png -text -designer_base/src/com/fr/design/images/data/source/classTableData.png -text -designer_base/src/com/fr/design/images/data/source/clear.png -text -designer_base/src/com/fr/design/images/data/source/dataDictionary.png -text -designer_base/src/com/fr/design/images/data/source/delete.png -text -designer_base/src/com/fr/design/images/data/source/hibernateTableData.png -text -designer_base/src/com/fr/design/images/data/source/jdbcDataquery.png -text -designer_base/src/com/fr/design/images/data/source/jdbcTableData.png -text -designer_base/src/com/fr/design/images/data/source/moveDown.png -text -designer_base/src/com/fr/design/images/data/source/moveUp.png -text -designer_base/src/com/fr/design/images/data/source/newDatabase.png -text -designer_base/src/com/fr/design/images/data/source/newDatasource.png -text -designer_base/src/com/fr/design/images/data/source/rename.png -text -designer_base/src/com/fr/design/images/data/source/schema.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/Thumbs.db -text -designer_base/src/com/fr/design/images/data/source/selectwizard/accept.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/bullet_key.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/bullet_pink.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/cart_add.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/cart_delete.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/chart_organisation.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/database.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/database_connect.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/database_gear.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/database_lightning.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/database_save.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/database_table.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/database_tables.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/filter.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/folder_database.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/folder_page.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/folder_table.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/page_edit.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/page_gear.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/page_save.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/page_white_database.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/table_error.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/table_gear.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/table_link.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/table_multiple.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/table_relationship.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/table_row_delete.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/table_row_insert.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/table_sort.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/textfield.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/wizard.png -text -designer_base/src/com/fr/design/images/data/source/selectwizard/wrench.png -text -designer_base/src/com/fr/design/images/data/source/sqlAscColumn.png -text -designer_base/src/com/fr/design/images/data/source/sqlColumn.png -text -designer_base/src/com/fr/design/images/data/source/sqlConditionColumn.png -text -designer_base/src/com/fr/design/images/data/source/sqlDescColumn.png -text -designer_base/src/com/fr/design/images/data/source/sqlTable.png -text -designer_base/src/com/fr/design/images/data/source/sqlViewTable.png -text -designer_base/src/com/fr/design/images/data/source/table.png -text -designer_base/src/com/fr/design/images/data/source/textDatasource.png -text -designer_base/src/com/fr/design/images/data/source/view.png -text -designer_base/src/com/fr/design/images/data/store_procedure.png -text -designer_base/src/com/fr/design/images/data/string.png -text -designer_base/src/com/fr/design/images/data/table.png -text -designer_base/src/com/fr/design/images/data/table2.png -text -designer_base/src/com/fr/design/images/data/tables.png -text -designer_base/src/com/fr/design/images/data/text.png -text -designer_base/src/com/fr/design/images/data/today.gif -text -designer_base/src/com/fr/design/images/data/tree.png -text -designer_base/src/com/fr/design/images/data/user_widget.png -text -designer_base/src/com/fr/design/images/data/views.png -text -designer_base/src/com/fr/design/images/data/xml.png -text -designer_base/src/com/fr/design/images/dialog/column.png -text -designer_base/src/com/fr/design/images/dialog/function.gif -text -designer_base/src/com/fr/design/images/dialog/parameter.gif -text -designer_base/src/com/fr/design/images/dialog/table.png -text -designer_base/src/com/fr/design/images/dialog/variable.png -text -designer_base/src/com/fr/design/images/dock/desktop.png -text -designer_base/src/com/fr/design/images/dock/project.png -text -designer_base/src/com/fr/design/images/dock/projectVer.png -text -designer_base/src/com/fr/design/images/dock/properties.png -text -designer_base/src/com/fr/design/images/docking/close.gif -text -designer_base/src/com/fr/design/images/docking/down.gif -text -designer_base/src/com/fr/design/images/docking/left.gif -text -designer_base/src/com/fr/design/images/docking/left.png -text -designer_base/src/com/fr/design/images/docking/right.gif -text -designer_base/src/com/fr/design/images/docking/right.png -text -designer_base/src/com/fr/design/images/docking/up.gif -text -designer_base/src/com/fr/design/images/edit/deleteRow.png -text -designer_base/src/com/fr/design/images/edit/insertRow_B.png -text -designer_base/src/com/fr/design/images/expand/asc.png -text -designer_base/src/com/fr/design/images/expand/cellAttr.gif -text -designer_base/src/com/fr/design/images/expand/des.png -text -designer_base/src/com/fr/design/images/expand/landspace.png -text -designer_base/src/com/fr/design/images/expand/none16x16.png -text -designer_base/src/com/fr/design/images/expand/vertical.png -text -designer_base/src/com/fr/design/images/file/disk.gif -text -designer_base/src/com/fr/design/images/file/disk.png -text -designer_base/src/com/fr/design/images/file/fold.png -text -designer_base/src/com/fr/design/images/file/folder.gif -text -designer_base/src/com/fr/design/images/file/gifFile.gif -text -designer_base/src/com/fr/design/images/file/jpgFile.gif -text -designer_base/src/com/fr/design/images/file/newfolder.png -text -designer_base/src/com/fr/design/images/file/nostar.png -text -designer_base/src/com/fr/design/images/file/pngFile.png -text -designer_base/src/com/fr/design/images/file/star.png -text -designer_base/src/com/fr/design/images/form/Button.gif -text -designer_base/src/com/fr/design/images/form/CheckBox.gif -text -designer_base/src/com/fr/design/images/form/Choice.gif -text -designer_base/src/com/fr/design/images/form/List.gif -text -designer_base/src/com/fr/design/images/form/RadioButton.gif -text -designer_base/src/com/fr/design/images/form/TextField.gif -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_border.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_border_.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_left.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_left_.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_right.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/bottom_right_.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/control_close.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/control_close_.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/control_max.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/control_max_.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/control_min.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/control_min_.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/controls.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/controls_.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/left_border.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/left_border_.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/right_border.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/right_border_.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/title_pane.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/top_border.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/top_border_.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/top_left.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/top_left_.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/top_right.png -text -designer_base/src/com/fr/design/images/form/designer/beans/adapters/container/top_right_.png -text -designer_base/src/com/fr/design/images/form/designer/bottom_align.png -text -designer_base/src/com/fr/design/images/form/designer/center_align.png -text -designer_base/src/com/fr/design/images/form/designer/cursor/add.png -text -designer_base/src/com/fr/design/images/form/designer/cursor/connectorcursor.png -text -designer_base/src/com/fr/design/images/form/designer/cursor/move.png -text -designer_base/src/com/fr/design/images/form/designer/drop_down.png -text -designer_base/src/com/fr/design/images/form/designer/drop_over.png -text -designer_base/src/com/fr/design/images/form/designer/drop_up.png -text -designer_base/src/com/fr/design/images/form/designer/holder.png -text -designer_base/src/com/fr/design/images/form/designer/left_align.png -text -designer_base/src/com/fr/design/images/form/designer/middle_align.png -text -designer_base/src/com/fr/design/images/form/designer/properties/minus.png -text -designer_base/src/com/fr/design/images/form/designer/properties/plus.png -text -designer_base/src/com/fr/design/images/form/designer/right_align.png -text -designer_base/src/com/fr/design/images/form/designer/same_height.png -text -designer_base/src/com/fr/design/images/form/designer/same_width.png -text -designer_base/src/com/fr/design/images/form/designer/top_align.png -text -designer_base/src/com/fr/design/images/form/hover.png -text -designer_base/src/com/fr/design/images/form/parameter.png -text -designer_base/src/com/fr/design/images/form/toolbar/Chart-Map.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Area.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Bar.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Column.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Comb_Chart.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Donut.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Funnel.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Gantt.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Gis.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Line.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Meter.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Pie.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Radar.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Range_Chart.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-Stock.png -text -designer_base/src/com/fr/design/images/form/toolbar/ChartF-XYScatter.png -text -designer_base/src/com/fr/design/images/form/toolbar/Chart_BubbleChart.png -text -designer_base/src/com/fr/design/images/form/toolbar/FR-Chart-Chart_BubbleChart.png -text -designer_base/src/com/fr/design/images/form/toolbar/default.png -text -designer_base/src/com/fr/design/images/form/toolbar/ec_columns.png -text -designer_base/src/com/fr/design/images/form/toolbar/ec_frozen.png -text -designer_base/src/com/fr/design/images/gc.png -text -designer_base/src/com/fr/design/images/general/close-rolver.png -text -designer_base/src/com/fr/design/images/general/close.png -text -designer_base/src/com/fr/design/images/general/mini-rolver.png -text -designer_base/src/com/fr/design/images/general/mini.png -text -designer_base/src/com/fr/design/images/general/resize-rolver.png -text -designer_base/src/com/fr/design/images/general/resize.png -text -designer_base/src/com/fr/design/images/gui/blank.gif -text -designer_base/src/com/fr/design/images/gui/bmpFile.gif -text -designer_base/src/com/fr/design/images/gui/cell.gif -text -designer_base/src/com/fr/design/images/gui/cht.png -text -designer_base/src/com/fr/design/images/gui/chtlocked.png -text -designer_base/src/com/fr/design/images/gui/classFile.gif -text -designer_base/src/com/fr/design/images/gui/close.png -text -designer_base/src/com/fr/design/images/gui/color/background.png -text -designer_base/src/com/fr/design/images/gui/color/foreground.png -text -designer_base/src/com/fr/design/images/gui/cptFile.png -text -designer_base/src/com/fr/design/images/gui/documentFolderClose.gif -text -designer_base/src/com/fr/design/images/gui/folder.gif -text -designer_base/src/com/fr/design/images/gui/folder.png -text -designer_base/src/com/fr/design/images/gui/folder/expanded.png -text -designer_base/src/com/fr/design/images/gui/folder/foldered.png -text -designer_base/src/com/fr/design/images/gui/folder/hovered_expanded.png -text -designer_base/src/com/fr/design/images/gui/folder/hovered_foldered.png -text -designer_base/src/com/fr/design/images/gui/frm.png -text -designer_base/src/com/fr/design/images/gui/frmlocked.png -text -designer_base/src/com/fr/design/images/gui/gifFile.gif -text -designer_base/src/com/fr/design/images/gui/htmlFile.gif -text -designer_base/src/com/fr/design/images/gui/jarFile.gif -text -designer_base/src/com/fr/design/images/gui/javaFile.gif -text -designer_base/src/com/fr/design/images/gui/jpgFile.gif -text -designer_base/src/com/fr/design/images/gui/jsFile.gif -text -designer_base/src/com/fr/design/images/gui/jspFile.gif -text -designer_base/src/com/fr/design/images/gui/locked.gif -text -designer_base/src/com/fr/design/images/gui/minimize.gif -text -designer_base/src/com/fr/design/images/gui/pngFile.png -text -designer_base/src/com/fr/design/images/gui/popup.gif -text -designer_base/src/com/fr/design/images/gui/popupCenter.png -text -designer_base/src/com/fr/design/images/gui/popupLarge.gif -text -designer_base/src/com/fr/design/images/gui/tab_add_click.png -text -designer_base/src/com/fr/design/images/gui/tab_add_hover.png -text -designer_base/src/com/fr/design/images/gui/tab_add_normal.png -text -designer_base/src/com/fr/design/images/gui/tab_delete.png -text -designer_base/src/com/fr/design/images/gui/textFile.png -text -designer_base/src/com/fr/design/images/gui/warning.png -text -designer_base/src/com/fr/design/images/gui/xmlFile.gif -text -designer_base/src/com/fr/design/images/load/busy-icon0.png -text -designer_base/src/com/fr/design/images/load/busy-icon1.png -text -designer_base/src/com/fr/design/images/load/busy-icon10.png -text -designer_base/src/com/fr/design/images/load/busy-icon11.png -text -designer_base/src/com/fr/design/images/load/busy-icon12.png -text -designer_base/src/com/fr/design/images/load/busy-icon13.png -text -designer_base/src/com/fr/design/images/load/busy-icon14.png -text -designer_base/src/com/fr/design/images/load/busy-icon2.png -text -designer_base/src/com/fr/design/images/load/busy-icon3.png -text -designer_base/src/com/fr/design/images/load/busy-icon4.png -text -designer_base/src/com/fr/design/images/load/busy-icon5.png -text -designer_base/src/com/fr/design/images/load/busy-icon6.png -text -designer_base/src/com/fr/design/images/load/busy-icon7.png -text -designer_base/src/com/fr/design/images/load/busy-icon8.png -text -designer_base/src/com/fr/design/images/load/busy-icon9.png -text -designer_base/src/com/fr/design/images/log/clear.png -text -designer_base/src/com/fr/design/images/log/selectedall.png -text -designer_base/src/com/fr/design/images/log/setting.png -text -designer_base/src/com/fr/design/images/lookandfeel/ComboBoxFocus.png -text -designer_base/src/com/fr/design/images/lookandfeel/ComputerIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/DirectoryIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/ErrorIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/FileDetailsIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/FileIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/FileListIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/FloppyIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/HarddiskIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/HomeFolderIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/InformationIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/InternalFrameIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/NewFolderIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/ParentDirectoryIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/QuestionIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/TreeFolderClosedIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/TreeFolderOpenedIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/TreeLeafIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/TreeMinusIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/TreePlusIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/WarningIcon.png -text -designer_base/src/com/fr/design/images/lookandfeel/brightmask.png -text -designer_base/src/com/fr/design/images/m_edit/bringForward.png -text -designer_base/src/com/fr/design/images/m_edit/bringToFront.png -text -designer_base/src/com/fr/design/images/m_edit/copy.png -text -designer_base/src/com/fr/design/images/m_edit/cut.png -text -designer_base/src/com/fr/design/images/m_edit/directShare.png -text -designer_base/src/com/fr/design/images/m_edit/formatBrush.png -text -designer_base/src/com/fr/design/images/m_edit/merge.png -text -designer_base/src/com/fr/design/images/m_edit/modifyShare.png -text -designer_base/src/com/fr/design/images/m_edit/paste.png -text -designer_base/src/com/fr/design/images/m_edit/pluralundo.png -text -designer_base/src/com/fr/design/images/m_edit/redo.png -text -designer_base/src/com/fr/design/images/m_edit/sendBackward.png -text -designer_base/src/com/fr/design/images/m_edit/sendToBack.png -text -designer_base/src/com/fr/design/images/m_edit/share.png -text -designer_base/src/com/fr/design/images/m_edit/undo.png -text -designer_base/src/com/fr/design/images/m_edit/unmerge.png -text -designer_base/src/com/fr/design/images/m_file/close.png -text -designer_base/src/com/fr/design/images/m_file/crossTable.png -text -designer_base/src/com/fr/design/images/m_file/csv.png -text -designer_base/src/com/fr/design/images/m_file/design.png -text -designer_base/src/com/fr/design/images/m_file/design_large.png -text -designer_base/src/com/fr/design/images/m_file/edit.png -text -designer_base/src/com/fr/design/images/m_file/excel.png -text -designer_base/src/com/fr/design/images/m_file/export.png -text -designer_base/src/com/fr/design/images/m_file/formExport.png -text -designer_base/src/com/fr/design/images/m_file/groupTable.png -text -designer_base/src/com/fr/design/images/m_file/help.png -text -designer_base/src/com/fr/design/images/m_file/html.png -text -designer_base/src/com/fr/design/images/m_file/hyperLink.png -text -designer_base/src/com/fr/design/images/m_file/import.png -text -designer_base/src/com/fr/design/images/m_file/merge.png -text -designer_base/src/com/fr/design/images/m_file/new.png -text -designer_base/src/com/fr/design/images/m_file/open.png -text -designer_base/src/com/fr/design/images/m_file/pageSetup.png -text -designer_base/src/com/fr/design/images/m_file/pdf.png -text -designer_base/src/com/fr/design/images/m_file/preview.png -text -designer_base/src/com/fr/design/images/m_file/print.png -text -designer_base/src/com/fr/design/images/m_file/save.png -text -designer_base/src/com/fr/design/images/m_file/saveAs.png -text -designer_base/src/com/fr/design/images/m_file/svg.png -text -designer_base/src/com/fr/design/images/m_file/switch.png -text -designer_base/src/com/fr/design/images/m_file/text.png -text -designer_base/src/com/fr/design/images/m_file/view_folder.png -text -designer_base/src/com/fr/design/images/m_file/web.png -text -designer_base/src/com/fr/design/images/m_file/word.png -text -designer_base/src/com/fr/design/images/m_format/allborders.png -text -designer_base/src/com/fr/design/images/m_format/border.png -text -designer_base/src/com/fr/design/images/m_format/bottom.png -text -designer_base/src/com/fr/design/images/m_format/cell.png -text -designer_base/src/com/fr/design/images/m_format/cellAttr.png -text -designer_base/src/com/fr/design/images/m_format/cellWriteAttr.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/bold.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/centerAlignment.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/default.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/defaultAlignment.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/generalAlignment.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/h_center_normal.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/h_center_pressed.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/h_left_normal.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/h_left_pressed.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/h_right_normal.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/h_right_pressed.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/h_s_normal.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/h_s_pressed.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/italic.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/leftAlignment.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/otherset.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/rightAlignment.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/shadow.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/strikethrough.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/sub.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/sup.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/underline.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/v_center_normal.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/v_center_pressed.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/v_down_normal.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/v_down_pressed.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/v_top_normal.png -text -designer_base/src/com/fr/design/images/m_format/cellstyle/v_top_pressed.png -text -designer_base/src/com/fr/design/images/m_format/doublebottom.png -text -designer_base/src/com/fr/design/images/m_format/editChart.png -text -designer_base/src/com/fr/design/images/m_format/highlight.png -text -designer_base/src/com/fr/design/images/m_format/in.png -text -designer_base/src/com/fr/design/images/m_format/left.png -text -designer_base/src/com/fr/design/images/m_format/modified.png -text -designer_base/src/com/fr/design/images/m_format/noboder.png -text -designer_base/src/com/fr/design/images/m_format/note.png -text -designer_base/src/com/fr/design/images/m_format/out.png -text -designer_base/src/com/fr/design/images/m_format/outsideborders.png -text -designer_base/src/com/fr/design/images/m_format/right.png -text -designer_base/src/com/fr/design/images/m_format/shape.png -text -designer_base/src/com/fr/design/images/m_format/thickbottom.png -text -designer_base/src/com/fr/design/images/m_format/thickoutsideborders.png -text -designer_base/src/com/fr/design/images/m_format/topanddoublebotttom.png -text -designer_base/src/com/fr/design/images/m_format/topandthickbottom.png -text -designer_base/src/com/fr/design/images/m_format/topbottom.png -text -designer_base/src/com/fr/design/images/m_help/back.png -text -designer_base/src/com/fr/design/images/m_help/demo.png -text -designer_base/src/com/fr/design/images/m_help/feedback.png -text -designer_base/src/com/fr/design/images/m_help/forum.png -text -designer_base/src/com/fr/design/images/m_help/forward.png -text -designer_base/src/com/fr/design/images/m_help/help.png -text -designer_base/src/com/fr/design/images/m_help/preview_analy.png -text -designer_base/src/com/fr/design/images/m_help/preview_form.png -text -designer_base/src/com/fr/design/images/m_help/preview_page.png -text -designer_base/src/com/fr/design/images/m_help/preview_write.png -text -designer_base/src/com/fr/design/images/m_help/product_forum.png -text -designer_base/src/com/fr/design/images/m_help/support_qq.png -text -designer_base/src/com/fr/design/images/m_insert/Pivottable.gif -text -designer_base/src/com/fr/design/images/m_insert/account.png -text -designer_base/src/com/fr/design/images/m_insert/accountTitle.png -text -designer_base/src/com/fr/design/images/m_insert/barcode.png -text -designer_base/src/com/fr/design/images/m_insert/bias.png -text -designer_base/src/com/fr/design/images/m_insert/bindCell.png -text -designer_base/src/com/fr/design/images/m_insert/bindColumn.png -text -designer_base/src/com/fr/design/images/m_insert/blank.gif -text -designer_base/src/com/fr/design/images/m_insert/boolean.png -text -designer_base/src/com/fr/design/images/m_insert/cell.png -text -designer_base/src/com/fr/design/images/m_insert/cellPop.png -text -designer_base/src/com/fr/design/images/m_insert/chart.png -text -designer_base/src/com/fr/design/images/m_insert/composite.png -text -designer_base/src/com/fr/design/images/m_insert/compositePop.png -text -designer_base/src/com/fr/design/images/m_insert/crossTable.png -text -designer_base/src/com/fr/design/images/m_insert/date.png -text -designer_base/src/com/fr/design/images/m_insert/default.png -text -designer_base/src/com/fr/design/images/m_insert/expandCell.gif -text -designer_base/src/com/fr/design/images/m_insert/float.png -text -designer_base/src/com/fr/design/images/m_insert/floatPop.png -text -designer_base/src/com/fr/design/images/m_insert/formula.png -text -designer_base/src/com/fr/design/images/m_insert/groupTable.png -text -designer_base/src/com/fr/design/images/m_insert/hyperLink.png -text -designer_base/src/com/fr/design/images/m_insert/image.png -text -designer_base/src/com/fr/design/images/m_insert/insertColumn.png -text -designer_base/src/com/fr/design/images/m_insert/insertRow.png -text -designer_base/src/com/fr/design/images/m_insert/newchart.png -text -designer_base/src/com/fr/design/images/m_insert/richtext.png -text -designer_base/src/com/fr/design/images/m_insert/shape.png -text -designer_base/src/com/fr/design/images/m_insert/shape_issosceles_triangle.png -text -designer_base/src/com/fr/design/images/m_insert/shape_line.png -text -designer_base/src/com/fr/design/images/m_insert/shape_oval.png -text -designer_base/src/com/fr/design/images/m_insert/shape_rectangle.png -text -designer_base/src/com/fr/design/images/m_insert/shape_rounded_rectangle.png -text -designer_base/src/com/fr/design/images/m_insert/subReport.png -text -designer_base/src/com/fr/design/images/m_insert/text.png -text -designer_base/src/com/fr/design/images/m_insert/textBox.png -text -designer_base/src/com/fr/design/images/m_report/allow_authority_edit.png -text -designer_base/src/com/fr/design/images/m_report/attributes.png -text -designer_base/src/com/fr/design/images/m_report/background.png -text -designer_base/src/com/fr/design/images/m_report/bindData.png -text -designer_base/src/com/fr/design/images/m_report/close.png -text -designer_base/src/com/fr/design/images/m_report/close_over.png -text -designer_base/src/com/fr/design/images/m_report/close_press.png -text -designer_base/src/com/fr/design/images/m_report/delete.png -text -designer_base/src/com/fr/design/images/m_report/deleteColumn.png -text -designer_base/src/com/fr/design/images/m_report/deleteRow.png -text -designer_base/src/com/fr/design/images/m_report/exit_authority_edit.png -text -designer_base/src/com/fr/design/images/m_report/exportAttr.png -text -designer_base/src/com/fr/design/images/m_report/footer.png -text -designer_base/src/com/fr/design/images/m_report/header.png -text -designer_base/src/com/fr/design/images/m_report/linearAttr.png -text -designer_base/src/com/fr/design/images/m_report/p.gif -text -designer_base/src/com/fr/design/images/m_report/p.png -text -designer_base/src/com/fr/design/images/m_report/parameter.png -text -designer_base/src/com/fr/design/images/m_report/process.gif -text -designer_base/src/com/fr/design/images/m_report/qb.png -text -designer_base/src/com/fr/design/images/m_report/reportEngineAttr.png -text -designer_base/src/com/fr/design/images/m_report/reportWorkFlowAttr.png -text -designer_base/src/com/fr/design/images/m_report/reportWriteAttr.png -text -designer_base/src/com/fr/design/images/m_report/tree.png -text -designer_base/src/com/fr/design/images/m_report/webreportattribute.png -text -designer_base/src/com/fr/design/images/m_web/cache.png -text -designer_base/src/com/fr/design/images/m_web/connection.png -text -designer_base/src/com/fr/design/images/m_web/datasource.png -text -designer_base/src/com/fr/design/images/m_web/edit.png -text -designer_base/src/com/fr/design/images/m_web/face.gif -text -designer_base/src/com/fr/design/images/m_web/formula.png -text -designer_base/src/com/fr/design/images/m_web/function.png -text -designer_base/src/com/fr/design/images/m_web/log.png -text -designer_base/src/com/fr/design/images/m_web/privilegeManager.gif -text -designer_base/src/com/fr/design/images/m_web/reportletdemo.png -text -designer_base/src/com/fr/design/images/m_web/schedule.png -text -designer_base/src/com/fr/design/images/m_web/server.png -text -designer_base/src/com/fr/design/images/m_web/style.png -text -designer_base/src/com/fr/design/images/m_web/sync.png -text -designer_base/src/com/fr/design/images/m_window/cascade.png -text -designer_base/src/com/fr/design/images/m_window/formdesign.png -text -designer_base/src/com/fr/design/images/m_window/frozen.png -text -designer_base/src/com/fr/design/images/m_window/generaldesign.png -text -designer_base/src/com/fr/design/images/m_window/next.png -text -designer_base/src/com/fr/design/images/m_window/previous.png -text -designer_base/src/com/fr/design/images/m_window/title_hor.png -text -designer_base/src/com/fr/design/images/m_window/title_ver.png -text -designer_base/src/com/fr/design/images/mainframe/attribute.png -text -designer_base/src/com/fr/design/images/mainframe/class.png -text -designer_base/src/com/fr/design/images/mainframe/datasource.png -text -designer_base/src/com/fr/design/images/mainframe/fpt.png -text -designer_base/src/com/fr/design/images/mainframe/jar.png -text -designer_base/src/com/fr/design/images/mainframe/java.png -text -designer_base/src/com/fr/design/images/mainframe/server.png -text -designer_base/src/com/fr/design/images/mainframe/xml.png -text -designer_base/src/com/fr/design/images/minimize.gif -text -designer_base/src/com/fr/design/images/parameter.png -text -designer_base/src/com/fr/design/images/poly/Chart-Map/Chart-Map-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-2.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-3.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-4.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Area/ChartF-Area-5.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-2.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-3.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-4.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-5.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Bar/ChartF-Bar-6.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-2.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-3.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-4.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-5.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Column/ChartF-Column-6.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Comb_Chart/ChartF-Comb_Chart-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Comb_Chart/ChartF-Comb_Chart-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Donut/ChartF-Donut-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Donut/ChartF-Donut-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Gantt/ChartF-Gantt-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Gantt/ChartF-Gantt-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Gantt/ChartF-Gantt-2.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Gantt/ChartF-Gantt-3.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Gis/ChartF-Gis-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-2.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-3.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-4.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Line/ChartF-Line-5.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Meter/ChartF-Meter-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Meter/ChartF-Meter-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-2.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-3.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-4.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Pie/ChartF-Pie-5.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Radar/ChartF-Radar-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Radar/ChartF-Radar-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Radar/ChartF-Radar-2.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Radar/ChartF-Radar-3.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Range_Chart/ChartF-Range_Chart-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Stock/ChartF-Stock-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Stock/ChartF-Stock-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Stock/ChartF-Stock-2.png -text -designer_base/src/com/fr/design/images/poly/ChartF-Stock/ChartF-Stock-3.png -text -designer_base/src/com/fr/design/images/poly/ChartF-XYScatter/ChartF-XYScatter-0.png -text -designer_base/src/com/fr/design/images/poly/ChartF-XYScatter/ChartF-XYScatter-1.png -text -designer_base/src/com/fr/design/images/poly/ChartF-XYScatter/ChartF-XYScatter-2.png -text -designer_base/src/com/fr/design/images/poly/Chart_BubbleChart/Chart_BubbleChart-0.png -text -designer_base/src/com/fr/design/images/poly/Chart_BubbleChart/FR-Chart-Chart_BubbleChart-0.png -text -designer_base/src/com/fr/design/images/poly/normal.png -text -designer_base/src/com/fr/design/images/poly/toolbar/Chart-Map.png -text -designer_base/src/com/fr/design/images/poly/toolbar/Chart-SVG_MAP.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Area.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Bar.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Column.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Comb_Chart.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Donut.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Funnel.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Gantt.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Gis.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Line.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Meter.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Pie.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Radar.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Range_Chart.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-Stock.png -text -designer_base/src/com/fr/design/images/poly/toolbar/ChartF-XYScatter.png -text -designer_base/src/com/fr/design/images/poly/toolbar/Chart_BubbleChart.png -text -designer_base/src/com/fr/design/images/poly/toolbar/FR-Chart-Bit_Map.png -text -designer_base/src/com/fr/design/images/poly/toolbar/FR-Chart-Chart_BubbleChart.png -text -designer_base/src/com/fr/design/images/poly/toolbar/FR-Chart-ThreeD_Custom_Chart.png -text -designer_base/src/com/fr/design/images/poly/toolbar/FR-Chart_Bit_Map.png -text -designer_base/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewArea.png -text -designer_base/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewBar.png -text -designer_base/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewColumn.png -text -designer_base/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewLine.png -text -designer_base/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewPie.png -text -designer_base/src/com/fr/design/images/poly/toolbar/Plugin-ChartF_VerticalLine.png -text -designer_base/src/com/fr/design/images/poly/toolbar/Poly-Report_Block.png -text -designer_base/src/com/fr/design/images/report/form.png -text -designer_base/src/com/fr/design/images/report/groupReport.png -text -designer_base/src/com/fr/design/images/report/position.png -text -designer_base/src/com/fr/design/images/reportcolumns/col.png -text -designer_base/src/com/fr/design/images/reportcolumns/row.png -text -designer_base/src/com/fr/design/images/server/change.png -text -designer_base/src/com/fr/design/images/server/manage.png -text -designer_base/src/com/fr/design/images/server/plugin.png -text -designer_base/src/com/fr/design/images/server/printerconf.png -text -designer_base/src/com/fr/design/images/server/start.png -text -designer_base/src/com/fr/design/images/server/stop.png -text -designer_base/src/com/fr/design/images/server/view.png -text -designer_base/src/com/fr/design/images/serverM/fs.png -text -designer_base/src/com/fr/design/images/serverM/org.png -text -designer_base/src/com/fr/design/images/serverM/organization.png -text -designer_base/src/com/fr/design/images/serverM/role.png -text -designer_base/src/com/fr/design/images/serverM/roleAdd.png -text -designer_base/src/com/fr/design/images/serverM/roleRemove.png -text -designer_base/src/com/fr/design/images/serverM/rtr.png -text -designer_base/src/com/fr/design/images/serverM/use.png -text -designer_base/src/com/fr/design/images/serverM/user.png -text -designer_base/src/com/fr/design/images/sheet/addpolysheet.png -text -designer_base/src/com/fr/design/images/sheet/left_right_btn.png -text -designer_base/src/com/fr/design/images/sheet/polysheet.png -text -designer_base/src/com/fr/design/images/toolbarbtn/chart.png -text -designer_base/src/com/fr/design/images/toolbarbtn/chartChangeClose.png -text -designer_base/src/com/fr/design/images/toolbarbtn/close.png -text -designer_base/src/com/fr/design/images/toolbarbtn/close_tags.png -text -designer_base/src/com/fr/design/images/toolbarbtn/closehover.png -text -designer_base/src/com/fr/design/images/toolbarbtn/connector.png -text -designer_base/src/com/fr/design/images/toolbarbtn/down.png -text -designer_base/src/com/fr/design/images/toolbarbtn/parameter-hover.png -text -designer_base/src/com/fr/design/images/toolbarbtn/parametersetting.png -text -designer_base/src/com/fr/design/images/toolbarbtn/pop.gif -text -designer_base/src/com/fr/design/images/toolbarbtn/setting.png -text -designer_base/src/com/fr/design/images/toolbarbtn/toolbarbtnclear.png -text -designer_base/src/com/fr/design/images/toolbarbtn/toolbarbtnsetting.png -text -designer_base/src/com/fr/design/images/toolbarbtn/up.png -text -designer_base/src/com/fr/design/images/toolbarbtn/xiala.png -text -designer_base/src/com/fr/design/images/tree/close.png -text -designer_base/src/com/fr/design/images/tree/open.png -text -designer_base/src/com/fr/design/images/wait.gif -text -designer_base/src/com/fr/design/images/warnings/warning[!!-~]2.png -text -designer_base/src/com/fr/design/images/warnings/warning.png -text -designer_base/src/com/fr/design/images/warnings/warning3.png -text -designer_base/src/com/fr/design/insert/formula/variable/cn/$$$.txt -text svneol=unset#application/octet-stream -designer_base/src/com/fr/design/insert/formula/variable/cn/$$page_number.txt -text svneol=unset#application/octet-stream -designer_base/src/com/fr/design/insert/formula/variable/cn/$$totalPage_number.txt -text svneol=unset#application/octet-stream -designer_base/src/com/fr/design/insert/formula/variable/cn/$fr_authority.txt -text svneol=unset#application/octet-stream -designer_base/src/com/fr/design/insert/formula/variable/cn/$fr_username.txt -text svneol=unset#application/octet-stream -designer_base/src/com/fr/design/insert/formula/variable/cn/$fr_userposition.txt -text -designer_base/src/com/fr/design/insert/formula/variable/cn/NOFILTER.txt -text -designer_base/src/com/fr/design/insert/formula/variable/cn/NULL.txt -text svneol=unset#application/octet-stream -designer_base/src/com/fr/design/insert/formula/variable/cn/contextPath.txt -text -designer_base/src/com/fr/design/insert/formula/variable/cn/curReport.txt -text svneol=unset#application/octet-stream -designer_base/src/com/fr/design/insert/formula/variable/cn/fr_submitinfo.txt -text -designer_base/src/com/fr/design/insert/formula/variable/cn/reportName.txt -text -designer_base/src/com/fr/design/insert/formula/variable/cn/serverName.txt -text -designer_base/src/com/fr/design/insert/formula/variable/cn/serverPort.txt -text -designer_base/src/com/fr/design/insert/formula/variable/cn/serverSchema.txt -text -designer_base/src/com/fr/design/insert/formula/variable/cn/serverURL.txt -text -designer_base/src/com/fr/design/insert/formula/variable/cn/servletURL.txt -text -designer_base/src/com/fr/design/insert/formula/variable/cn/sessionID.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/$$$.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/$$page_number.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/$$totalPage_number.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/$fr_authority.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/$fr_username.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/$fr_userposition.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/NOFILTER.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/NULL.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/contextPath.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/curReport.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/fr_submitinfo.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/reportName.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/serverName.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/serverPort.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/serverSchema.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/serverURL.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/servletURL.txt -text -designer_base/src/com/fr/design/insert/formula/variable/en/sessionID.txt -text -designer_base/src/com/fr/design/javascript/Commit2DBJavaScriptPane.java -text -designer_base/src/com/fr/design/javascript/CustomActionPane.java -text -designer_base/src/com/fr/design/javascript/EmailPane.java -text -designer_base/src/com/fr/design/javascript/FormSubmitJavaScriptPane.java -text -designer_base/src/com/fr/design/javascript/JSContentPane.java -text -designer_base/src/com/fr/design/javascript/JavaScriptActionPane.java -text -designer_base/src/com/fr/design/javascript/JavaScriptImplPane.java -text -designer_base/src/com/fr/design/javascript/ParameterJavaScriptPane.java -text -designer_base/src/com/fr/design/javascript/ProcessJSImplPane.java -text -designer_base/src/com/fr/design/javascript/ProcessParameterTableModel.java -text -designer_base/src/com/fr/design/javascript/ProcessTransitionAdapter.java -text -designer_base/src/com/fr/design/layout/FRGUIPaneFactory.java -text -designer_base/src/com/fr/design/layout/FRGridLayout.java -text -designer_base/src/com/fr/design/layout/FRLeftFlowLayout.java -text -designer_base/src/com/fr/design/layout/LeftCenterRightLayout.java -text -designer_base/src/com/fr/design/layout/TableLayout.java -text -designer_base/src/com/fr/design/layout/TableLayoutConstraints.java -text -designer_base/src/com/fr/design/layout/TableLayoutHelper.java -text -designer_base/src/com/fr/design/layout/TableLayoutTest.java -text -designer_base/src/com/fr/design/layout/VerticalFlowLayout.java -text -designer_base/src/com/fr/design/mainframe/AbstractAppProvider.java -text -designer_base/src/com/fr/design/mainframe/App.java -text -designer_base/src/com/fr/design/mainframe/AuthorityEditPane.java -text -designer_base/src/com/fr/design/mainframe/AuthorityPropertyPane.java -text -designer_base/src/com/fr/design/mainframe/BaseFormDesigner.java -text -designer_base/src/com/fr/design/mainframe/BaseJForm.java -text -designer_base/src/com/fr/design/mainframe/BaseUndoState.java -text -designer_base/src/com/fr/design/mainframe/BaseWidgetPropertyPane.java -text -designer_base/src/com/fr/design/mainframe/DecodeDialog.java -text -designer_base/src/com/fr/design/mainframe/DesignerBean.java -text -designer_base/src/com/fr/design/mainframe/DesignerContext.java -text -designer_base/src/com/fr/design/mainframe/DesignerFrame.java -text -designer_base/src/com/fr/design/mainframe/DesignerFrameFileDealerPane.java -text -designer_base/src/com/fr/design/mainframe/DesktopCardPane.java -text -designer_base/src/com/fr/design/mainframe/DockingView.java -text -designer_base/src/com/fr/design/mainframe/DottedLine.java -text -designer_base/src/com/fr/design/mainframe/EastRegionContainerPane.java -text -designer_base/src/com/fr/design/mainframe/FormScrollBar.java -text -designer_base/src/com/fr/design/mainframe/JTemplate.java -text -designer_base/src/com/fr/design/mainframe/JTemplateActionListener.java -text -designer_base/src/com/fr/design/mainframe/JTemplateProvider.java -text -designer_base/src/com/fr/design/mainframe/JViewContainer.java -text -designer_base/src/com/fr/design/mainframe/NoSupportAuthorityEdit.java -text -designer_base/src/com/fr/design/mainframe/TemplatePane.java -text -designer_base/src/com/fr/design/mainframe/UndoStateEdit.java -text -designer_base/src/com/fr/design/mainframe/WestRegionContainerPane.java -text -designer_base/src/com/fr/design/mainframe/backgroundpane/BackgroundSettingPane.java -text -designer_base/src/com/fr/design/mainframe/backgroundpane/ColorBackgroundPane.java -text -designer_base/src/com/fr/design/mainframe/backgroundpane/ImageBackgroundPane.java -text -designer_base/src/com/fr/design/mainframe/backgroundpane/ImagePreviewPane.java -text -designer_base/src/com/fr/design/mainframe/backgroundpane/NullBackgroundPane.java -text -designer_base/src/com/fr/design/mainframe/backgroundpane/PatternBackgroundPane.java -text -designer_base/src/com/fr/design/mainframe/backgroundpane/TextureBackgroundPane.java -text -designer_base/src/com/fr/design/mainframe/dnd/ArrayListTransferHandler.java -text -designer_base/src/com/fr/design/mainframe/dnd/ArrayListTransferable.java -text -designer_base/src/com/fr/design/mainframe/dnd/ArrayTransferable.java -text -designer_base/src/com/fr/design/mainframe/dnd/SerializableTransferable.java -text -designer_base/src/com/fr/design/mainframe/form/FormECCompositeProvider.java -text -designer_base/src/com/fr/design/mainframe/form/FormECDesignerProvider.java -text -designer_base/src/com/fr/design/mainframe/hold/DefaultTitlePlace.java -text -designer_base/src/com/fr/design/mainframe/loghandler/DesignerLogHandler.java -text -designer_base/src/com/fr/design/mainframe/loghandler/DesignerLogImpl.java -text -designer_base/src/com/fr/design/mainframe/loghandler/LogDetailPane.java -text -designer_base/src/com/fr/design/mainframe/loghandler/LogHandlerBar.java -text -designer_base/src/com/fr/design/mainframe/loghandler/LogHandlerBarUI.java -text -designer_base/src/com/fr/design/mainframe/loghandler/LogMessageBar.java -text -designer_base/src/com/fr/design/mainframe/toolbar/AuthorityEditToolBarComponent.java -text -designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java -text -designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDockPlus.java -text -designer_base/src/com/fr/design/mainframe/widget/editors/AbstractPropertyEditor.java -text -designer_base/src/com/fr/design/mainframe/widget/editors/DataBindingEditor.java -text -designer_base/src/com/fr/design/mainframe/widget/editors/DataTableEditor.java -text -designer_base/src/com/fr/design/mainframe/widget/editors/ExtendedPropertyEditor.java -text -designer_base/src/com/fr/design/mainframe/widget/editors/FormattedEditor.java -text -designer_base/src/com/fr/design/mainframe/widget/editors/IntegerPropertyEditor.java -text -designer_base/src/com/fr/design/mainframe/widget/editors/PropertyCellEditor.java -text -designer_base/src/com/fr/design/mainframe/widget/editors/ServerDataBindingEditor.java -text -designer_base/src/com/fr/design/mainframe/widget/editors/ServerDataTableEditor.java -text -designer_base/src/com/fr/design/mainframe/widget/editors/StringEditor.java -text -designer_base/src/com/fr/design/mainframe/widget/editors/WidgetValueEditor.java -text -designer_base/src/com/fr/design/menu/DottedSeparator.java -text -designer_base/src/com/fr/design/menu/DottedSeparatorUI.java -text -designer_base/src/com/fr/design/menu/KeySetUtils.java -text -designer_base/src/com/fr/design/menu/LineSeparator.java -text -designer_base/src/com/fr/design/menu/MenuDef.java -text -designer_base/src/com/fr/design/menu/MenuKeySet.java -text -designer_base/src/com/fr/design/menu/MenuManager.java -text -designer_base/src/com/fr/design/menu/NameSeparator.java -text -designer_base/src/com/fr/design/menu/SeparatorDef.java -text -designer_base/src/com/fr/design/menu/ShortCut.java -text -designer_base/src/com/fr/design/menu/ToolBarDef.java -text -designer_base/src/com/fr/design/menu/TwoDottedSeparatorUI.java -text -designer_base/src/com/fr/design/menu/UISeparatorUI.java -text -designer_base/src/com/fr/design/module/DesignModule.java -text -designer_base/src/com/fr/design/module/DesignModuleFactory.java -text -designer_base/src/com/fr/design/object/NameObject.java -text -designer_base/src/com/fr/design/parameter/AbstractParameterReader.java -text -designer_base/src/com/fr/design/parameter/HierarchyTreePane.java -text -designer_base/src/com/fr/design/parameter/ParaDefinitePane.java -text -designer_base/src/com/fr/design/parameter/ParameterArrayPane.java -text -designer_base/src/com/fr/design/parameter/ParameterBridge.java -text -designer_base/src/com/fr/design/parameter/ParameterDesignerProvider.java -text -designer_base/src/com/fr/design/parameter/ParameterGroup.java -text -designer_base/src/com/fr/design/parameter/ParameterInputPane.java -text -designer_base/src/com/fr/design/parameter/ParameterManagerPane.java -text -designer_base/src/com/fr/design/parameter/ParameterPane.java -text -designer_base/src/com/fr/design/parameter/ParameterReader.java -text -designer_base/src/com/fr/design/present/DictPresentPane.java -text -designer_base/src/com/fr/design/present/FormulaPresentPane.java -text -designer_base/src/com/fr/design/present/NonePresentPane.java -text -designer_base/src/com/fr/design/present/dict/AbstractDicPane.java -text -designer_base/src/com/fr/design/present/dict/CustomDictCorrelationPane.java -text -designer_base/src/com/fr/design/present/dict/CustomDictPane.java -text -designer_base/src/com/fr/design/present/dict/DatabaseDictPane.java -text -designer_base/src/com/fr/design/present/dict/DictionaryPane.java -text -designer_base/src/com/fr/design/present/dict/FormulaDictPane.java -text -designer_base/src/com/fr/design/present/dict/TableDataDictPane.java -text -designer_base/src/com/fr/design/preview/PagePreview.java -text -designer_base/src/com/fr/design/preview/ViewPreview.java -text -designer_base/src/com/fr/design/preview/WritePreview.java -text -designer_base/src/com/fr/design/roleAuthority/ReportAndFSManagePane.java -text -designer_base/src/com/fr/design/roleAuthority/RoleDataWrapper.java -text -designer_base/src/com/fr/design/roleAuthority/RoleSourceOP.java -text -designer_base/src/com/fr/design/roleAuthority/RoleTree.java -text -designer_base/src/com/fr/design/roleAuthority/RolesAlreadyEditedPane.java -text -designer_base/src/com/fr/design/roleAuthority/RolesEditedSourceOP.java -text -designer_base/src/com/fr/design/roleAuthority/UIRoleTreeUI.java -text -designer_base/src/com/fr/design/scrollruler/BaseRuler.java -text -designer_base/src/com/fr/design/scrollruler/HorizontalRuler.java -text -designer_base/src/com/fr/design/scrollruler/HorizontalRulerUI.java -text -designer_base/src/com/fr/design/scrollruler/ModLineBorder.java -text -designer_base/src/com/fr/design/scrollruler/RulerLayout.java -text -designer_base/src/com/fr/design/scrollruler/RulerUI.java -text -designer_base/src/com/fr/design/scrollruler/ScrollRulerComponent.java -text -designer_base/src/com/fr/design/scrollruler/VerticalRuler.java -text -designer_base/src/com/fr/design/scrollruler/VerticalRulerUI.java -text -designer_base/src/com/fr/design/selection/QuickEditor.java -text -designer_base/src/com/fr/design/selection/SelectableElement.java -text -designer_base/src/com/fr/design/selection/Selectedable.java -text -designer_base/src/com/fr/design/selection/SelectionEvent.java -text -designer_base/src/com/fr/design/selection/SelectionListener.java -text -designer_base/src/com/fr/design/style/AbstractPopBox.java -text -designer_base/src/com/fr/design/style/AbstractSelectBox.java -text -designer_base/src/com/fr/design/style/AlignmentPane.java -text -designer_base/src/com/fr/design/style/AlphaPane.java -text -designer_base/src/com/fr/design/style/BorderPane.java -text -designer_base/src/com/fr/design/style/ChooseFileView.java -text -designer_base/src/com/fr/design/style/CustomSelectBox.java -text -designer_base/src/com/fr/design/style/FRFontPane.java -text -designer_base/src/com/fr/design/style/FRFontPreviewArea.java -text -designer_base/src/com/fr/design/style/FontFamilyPane.java -text -designer_base/src/com/fr/design/style/FontSizeStylePane.java -text -designer_base/src/com/fr/design/style/FormatBox.java -text -designer_base/src/com/fr/design/style/FormatPane.java -text -designer_base/src/com/fr/design/style/background/BackgroundCustomJComponent.java -text -designer_base/src/com/fr/design/style/background/BackgroundJComponent.java -text -designer_base/src/com/fr/design/style/background/BackgroundPane.java -text -designer_base/src/com/fr/design/style/background/BackgroundPane4BoxChange.java -text -designer_base/src/com/fr/design/style/background/BackgroundPreviewLabel.java -text -designer_base/src/com/fr/design/style/background/BackgroundSelectPane.java -text -designer_base/src/com/fr/design/style/background/BackgroundUIComboBoxNoImagePane.java -text -designer_base/src/com/fr/design/style/background/BackgroundUIComboBoxPane.java -text -designer_base/src/com/fr/design/style/background/gradient/GradientBackgroundSelectPane.java -text -designer_base/src/com/fr/design/style/background/gradient/GradientBar.java -text -designer_base/src/com/fr/design/style/background/gradient/GradientChangeBoxPane.java -text -designer_base/src/com/fr/design/style/background/gradient/GradientFromToPixPane.java -text -designer_base/src/com/fr/design/style/background/gradient/GradientPane.java -text -designer_base/src/com/fr/design/style/background/gradient/GradientSelectBox.java -text -designer_base/src/com/fr/design/style/background/gradient/SelectColorPointBtn.java -text -designer_base/src/com/fr/design/style/background/image/ImageFileChooser.java -text -designer_base/src/com/fr/design/style/background/image/ImagePreviewPane.java -text -designer_base/src/com/fr/design/style/background/image/ImageSelectPane.java -text -designer_base/src/com/fr/design/style/background/pattern/PatternSelectBox.java -text -designer_base/src/com/fr/design/style/background/pattern/PatternSelectPane.java -text -designer_base/src/com/fr/design/style/background/pattern/PatternUIComboBoxPane.java -text -designer_base/src/com/fr/design/style/background/texture/TextureSelectBox.java -text -designer_base/src/com/fr/design/style/background/texture/TextureSelectPane.java -text -designer_base/src/com/fr/design/style/background/texture/TextureUIComboBoxPane.java -text -designer_base/src/com/fr/design/style/color/ColorCell.java -text -designer_base/src/com/fr/design/style/color/ColorChooserPreview.java -text -designer_base/src/com/fr/design/style/color/ColorControlWindow.java -text -designer_base/src/com/fr/design/style/color/ColorFactory.java -text -designer_base/src/com/fr/design/style/color/ColorSelectBox.java -text -designer_base/src/com/fr/design/style/color/ColorSelectConfigManager.java -text -designer_base/src/com/fr/design/style/color/ColorSelectDetailPane.java -text -designer_base/src/com/fr/design/style/color/ColorSelectDialog.java -text -designer_base/src/com/fr/design/style/color/ColorSelectPane.java -text -designer_base/src/com/fr/design/style/color/ColorSelectable.java -text -designer_base/src/com/fr/design/style/color/ColorUIComboBoxPane.java -text -designer_base/src/com/fr/design/style/color/CustomChooserPanel.java -text -designer_base/src/com/fr/design/style/color/DetailColorSelectPane.java -text -designer_base/src/com/fr/design/style/color/NewColorSelectBox.java -text -designer_base/src/com/fr/design/style/color/NewColorSelectPane.java -text -designer_base/src/com/fr/design/style/color/RecentUseColorPane.java -text -designer_base/src/com/fr/design/style/color/SwatchChooserPanel.java -text -designer_base/src/com/fr/design/style/color/TransparentColorControlWindow.java -text -designer_base/src/com/fr/design/style/color/TransparentPane.java -text -designer_base/src/com/fr/design/style/color/UIToolbarColorButton.java -text -designer_base/src/com/fr/design/style/color/UsedColorPane.java -text -designer_base/src/com/fr/design/utils/ColorRoutines.java -text -designer_base/src/com/fr/design/utils/ComponentUtils.java -text -designer_base/src/com/fr/design/utils/DesignUtils.java -text -designer_base/src/com/fr/design/utils/DrawRoutines.java -text -designer_base/src/com/fr/design/utils/ThemeUtils.java -text -designer_base/src/com/fr/design/utils/gui/GUICoreUtils.java -text -designer_base/src/com/fr/design/utils/gui/GUIPaintUtils.java -text -designer_base/src/com/fr/design/utils/gui/JListUtils.java -text -designer_base/src/com/fr/design/utils/gui/LayoutUtils.java -text -designer_base/src/com/fr/design/web/CustomIconPane.java -text -designer_base/src/com/fr/design/widget/Appearance.java -text -designer_base/src/com/fr/design/widget/IconDefinePane.java -text -designer_base/src/com/fr/design/widget/btn/ButtonConstants.java -text -designer_base/src/com/fr/design/widget/btn/ButtonDetailPane.java -text -designer_base/src/com/fr/design/widget/btn/ButtonWithHotkeysDetailPane.java -text -designer_base/src/com/fr/design/write/submit/CustomJobPane.java -text -designer_base/src/com/fr/design/write/submit/CustomSubmitJobPane.java -text -designer_base/src/com/fr/design/write/submit/DBManipulationInWidgetEventPane.java -text -designer_base/src/com/fr/design/write/submit/DBManipulationPane.java -text -designer_base/src/com/fr/design/write/submit/DMLJobPane.java -text -designer_base/src/com/fr/design/write/submit/SubmitJobListPane.java -text -designer_base/src/com/fr/env/EnvListPane.java -text -designer_base/src/com/fr/env/RemoteEnv.java -text -designer_base/src/com/fr/env/RemoteSignInPane.java -text -designer_base/src/com/fr/env/SignIn.java -text -designer_base/src/com/fr/file/FILE.java -text -designer_base/src/com/fr/file/FILEChooserPane.java -text -designer_base/src/com/fr/file/FILEFactory.java -text -designer_base/src/com/fr/file/FileFILE.java -text -designer_base/src/com/fr/file/FileNodeFILE.java -text -designer_base/src/com/fr/file/MemFILE.java -text -designer_base/src/com/fr/file/filter/ChooseFileFilter.java -text -designer_base/src/com/fr/file/filter/FILEFilter.java -text -designer_base/src/com/fr/file/filter/OnlyShowDirectoryFileFilter.java -text -designer_base/src/com/fr/plugin/PluginManager.java -text -designer_base/src/com/fr/start/BBSGuestPaneProvider.java -text -designer_base/src/com/fr/start/BaseDesigner.java -text -designer_base/src/com/fr/start/Demo.java -text -designer_base/src/com/fr/start/JettyFRHost.java -text -designer_base/src/com/fr/start/SplashPane.java -text -designer_base/src/com/fr/start/SplashWindow.java -text -designer_base/src/com/fr/start/StartDocURL.java -text -designer_base/src/com/fr/start/StartServer.java -text -designer_base/src/com/fr/start/server/JettyHost.java -text -designer_base/src/com/fr/start/server/JettyServerListener.java -text -designer_base/src/com/fr/start/server/MultiOutputStream.java -text -designer_base/src/com/fr/start/server/ServerManageFrame.java -text -designer_base/src/com/fr/start/server/ServerTray.java -text -designer_chart/.classpath -text -designer_chart/.project -text -designer_chart/designer_chart.iml -text -designer_chart/src/com/fr/design/ChartEnvManager.java -text -designer_chart/src/com/fr/design/ChartTypeInterfaceManager.java -text -designer_chart/src/com/fr/design/chart/ChartAxisFactory.java -text -designer_chart/src/com/fr/design/chart/ChartCommonWizardPane.java -text -designer_chart/src/com/fr/design/chart/ChartComponentPane.java -text -designer_chart/src/com/fr/design/chart/ChartControlPane.java -text -designer_chart/src/com/fr/design/chart/ChartDialog.java -text -designer_chart/src/com/fr/design/chart/ChartPlotFactory.java -text -designer_chart/src/com/fr/design/chart/ChartSwingUtils.java -text -designer_chart/src/com/fr/design/chart/ChartTypePane.java -text -designer_chart/src/com/fr/design/chart/ChartWizardPane.java -text -designer_chart/src/com/fr/design/chart/FactoryObject.java -text -designer_chart/src/com/fr/design/chart/axis/AxisStyleObject.java -text -designer_chart/src/com/fr/design/chart/axis/AxisStylePane.java -text -designer_chart/src/com/fr/design/chart/axis/BinaryChartStyleAxisPane.java -text -designer_chart/src/com/fr/design/chart/axis/ChartAlertLinePane.java -text -designer_chart/src/com/fr/design/chart/axis/ChartAlertValueInTopBottomPane.java -text -designer_chart/src/com/fr/design/chart/axis/ChartAlertValuePane.java -text -designer_chart/src/com/fr/design/chart/axis/ChartStyleAxisPane.java -text -designer_chart/src/com/fr/design/chart/axis/CustomChartStyleAxisPane.java -text -designer_chart/src/com/fr/design/chart/axis/GanntChartStyleAxisPane.java -text -designer_chart/src/com/fr/design/chart/axis/MinMaxValuePane.java -text -designer_chart/src/com/fr/design/chart/axis/RadarChartStyleAxisPane.java -text -designer_chart/src/com/fr/design/chart/axis/TernaryChartStyleAxisPane.java -text -designer_chart/src/com/fr/design/chart/axis/ValueChartStyleAxisPane.java -text -designer_chart/src/com/fr/design/chart/axis/XYChartStyleAxisPane.java -text -designer_chart/src/com/fr/design/chart/comp/BorderAttriPane.java -text -designer_chart/src/com/fr/design/chart/demo/GlyphDemo.java -text -designer_chart/src/com/fr/design/chart/fun/IndependentChartUIProvider.java -text -designer_chart/src/com/fr/design/chart/fun/impl/AbstractIndependentChartUI.java -text -designer_chart/src/com/fr/design/chart/fun/impl/AbstractIndependentChartUIWithAPILevel.java -text -designer_chart/src/com/fr/design/chart/gui/ActiveGlyphFactory.java -text -designer_chart/src/com/fr/design/chart/gui/ChartComponent.java -text -designer_chart/src/com/fr/design/chart/gui/ChartWidgetOption.java -text -designer_chart/src/com/fr/design/chart/gui/active/ActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/AlertValueActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/AxisActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/CategoryAxisActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/ChartActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/DataLabelActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/DataSeriesActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/DataSheetActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/DateAxisActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/LegendActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/PlotActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/RadarAxisActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/RangeAxisActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/TextActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/TrendLineActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/ValueAxisActiveGlyph.java -text -designer_chart/src/com/fr/design/chart/gui/active/action/ChartComponentAction.java -text -designer_chart/src/com/fr/design/chart/gui/active/action/SetAnalysisLineStyleAction.java -text -designer_chart/src/com/fr/design/chart/gui/active/action/SetAxisStyleAction.java -text -designer_chart/src/com/fr/design/chart/gui/active/action/SetChartStyleAciton.java -text -designer_chart/src/com/fr/design/chart/gui/active/action/SetDataLabelStyleAction.java -text -designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSeriesAttrAction.java -text -designer_chart/src/com/fr/design/chart/gui/active/action/SetDataSheetAction.java -text -designer_chart/src/com/fr/design/chart/gui/active/action/SetLegendStyleAction.java -text -designer_chart/src/com/fr/design/chart/gui/active/action/SetPlotStyleAction.java -text -designer_chart/src/com/fr/design/chart/gui/active/action/SetTitleStyleAction.java -text -designer_chart/src/com/fr/design/chart/javascript/ChartEmailPane.java -text -designer_chart/src/com/fr/design/chart/report/GisMapDataPane.java -text -designer_chart/src/com/fr/design/chart/report/GisMapDataPane4Chart.java -text -designer_chart/src/com/fr/design/chart/report/GisMapReportDataContentPane.java -text -designer_chart/src/com/fr/design/chart/report/GisMapTableDataContentPane.java -text -designer_chart/src/com/fr/design/chart/report/GisMapTableDataContentPane4Chart.java -text -designer_chart/src/com/fr/design/chart/report/MapCubeDataPane.java -text -designer_chart/src/com/fr/design/chart/report/MapCubeDataPane4Chart.java -text -designer_chart/src/com/fr/design/chart/report/MapCubeLayerPane.java -text -designer_chart/src/com/fr/design/chart/report/MapCubeSetDataPane.java -text -designer_chart/src/com/fr/design/chart/report/MapDataPane.java -text -designer_chart/src/com/fr/design/chart/report/MapDataPane4Chart.java -text -designer_chart/src/com/fr/design/chart/report/MapMoreCubeLayerPane.java -text -designer_chart/src/com/fr/design/chart/report/MapMoreCubeLayerPane4Chart.java -text -designer_chart/src/com/fr/design/chart/report/MapMoreReportIndexPane.java -text -designer_chart/src/com/fr/design/chart/report/MapMoreTableIndexPane.java -text -designer_chart/src/com/fr/design/chart/report/MapReportCubeDataPane.java -text -designer_chart/src/com/fr/design/chart/report/MapReportDataSinglePane.java -text -designer_chart/src/com/fr/design/chart/report/MapReportEditor.java -text -designer_chart/src/com/fr/design/chart/report/MapReportRenderer.java -text -designer_chart/src/com/fr/design/chart/report/MapSinglePane.java -text -designer_chart/src/com/fr/design/chart/report/MapSinglePane4Chart.java -text -designer_chart/src/com/fr/design/chart/report/MapTableCubeDataPane.java -text -designer_chart/src/com/fr/design/chart/report/MapTableCubeDataPane4Chart.java -text -designer_chart/src/com/fr/design/chart/report/MapTableDataSinglePane.java -text -designer_chart/src/com/fr/design/chart/report/MapTableDataSinglePane4Chart.java -text -designer_chart/src/com/fr/design/chart/series/PlotSeries/AbstrctMapAttrEditPane.java -text -designer_chart/src/com/fr/design/chart/series/PlotSeries/MapCustomPane.java -text -designer_chart/src/com/fr/design/chart/series/PlotSeries/MapDefiAreaNamePane.java -text -designer_chart/src/com/fr/design/chart/series/PlotSeries/MapGroupExtensionPane.java -text -designer_chart/src/com/fr/design/chart/series/PlotSeries/MapImageEditPane.java -text -designer_chart/src/com/fr/design/chart/series/PlotSeries/MapSelectShape.java -text -designer_chart/src/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java -text -designer_chart/src/com/fr/design/chart/series/PlotStyle/ChartSelectDemoPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/BubblePlotChartConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/ChartConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/ChartConditionPaneFactory.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/ConditionTrendLinePane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataLabelContentsPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataLabelStylePane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesAttrCustomPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesAttrPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/DataSeriesCustomConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/GanttPlotChartConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/LabelAlphaPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/LabelAxisPositionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/LabelBackgroundPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/LabelBorderAttrPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/LabelBorderPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/LabelColorPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/LabelContentsPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/LabelLineStylePane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/LineMarkerTypePane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/MapPlotChartConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/PiePlotChartConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/TooltipContentsPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/TrendLineControlPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/TrendLinePane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/XYPlotChartConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/AreaDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/Bar2DDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/Bar3DDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/BubbleDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/DataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/GanttDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/LineDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/MapDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/MeterDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/PieDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/RadarDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/RangeDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/StockDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/dlp/XYDataLabelPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/Area3DPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/AreaPlotDataSeriesCondtionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/Bar2DTrendLineDSConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/Bar3DPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/BarPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/BubblePlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPopAttrPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperPoplinkPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperRelateCellLinkPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/ChartHyperRelateFloatLinkPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4AreaConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4BarNoTrendLineConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4BarTrendLineConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlot4LineConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/CustomPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/DataSeriesConditionPaneFactory.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/Donut2DPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/FormHyperlinkNorthPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/FormHyperlinkPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/GanttPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/LinePlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/MapPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/MeterPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/Pie3DPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/PiePlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/RadarPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/StockPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chart/series/SeriesCondition/impl/XYScatterPlotDataSeriesConditionPane.java -text -designer_chart/src/com/fr/design/chartinterface/AreaIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/BarIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/BubbleIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/ColumnIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/CustomIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/DonutIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/FunnelIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/GanttIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/GisMapIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/LineIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/MapIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/MeterIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/PieIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/RadarIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/RangeIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/StockIndependentChartInterface.java -text -designer_chart/src/com/fr/design/chartinterface/XYScatterIndependentChartInterface.java -text -designer_chart/src/com/fr/design/gui/xcombox/ComboBoxUseEditor.java -text -designer_chart/src/com/fr/design/gui/xcombox/MarkerComboBox.java -text -designer_chart/src/com/fr/design/images/add.png -text -designer_chart/src/com/fr/design/images/chart.png -text -designer_chart/src/com/fr/design/images/copyjs.png -text -designer_chart/src/com/fr/design/images/del.png -text -designer_chart/src/com/fr/design/images/exportimg.png -text -designer_chart/src/com/fr/design/images/newchart_normal.png -text -designer_chart/src/com/fr/design/images/newchart_over.png -text -designer_chart/src/com/fr/design/images/newchart_press.png -text -designer_chart/src/com/fr/design/images/splash4Chart.png -text -designer_chart/src/com/fr/design/images/toolbar/area/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/area/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/area/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/area/1_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/area/1_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/area/1_over.png -text -designer_chart/src/com/fr/design/images/toolbar/area/2_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/area/2_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/area/2_over.png -text -designer_chart/src/com/fr/design/images/toolbar/area/3_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/area/3_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/area/3_over.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/1_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/1_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/1_over.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/2_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/2_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/2_over.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/3_gary.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/3_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/3_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/3_over.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/4_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/4_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/4_over.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/5_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/5_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/5_over.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/6_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/6_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/bar/6_over.png -text -designer_chart/src/com/fr/design/images/toolbar/border.png -text -designer_chart/src/com/fr/design/images/toolbar/bubble/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/bubble/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/bubble/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/column/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/column/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/column/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/column/1_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/column/1_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/column/1_over.png -text -designer_chart/src/com/fr/design/images/toolbar/column/2_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/column/2_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/column/2_over.png -text -designer_chart/src/com/fr/design/images/toolbar/column/3_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/column/3_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/column/3_over.png -text -designer_chart/src/com/fr/design/images/toolbar/column/4_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/column/4_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/column/4_over.png -text -designer_chart/src/com/fr/design/images/toolbar/column/5_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/column/5_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/column/5_over.png -text -designer_chart/src/com/fr/design/images/toolbar/column/6_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/column/6_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/column/6_over.png -text -designer_chart/src/com/fr/design/images/toolbar/custom/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/custom/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/custom/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/donut/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/donut/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/donut/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/donut/1_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/donut/1_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/donut/1_over.png -text -designer_chart/src/com/fr/design/images/toolbar/funnel/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/funnel/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/funnel/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/gantt/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/gantt/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/gantt/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/gis/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/gis/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/gis/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/gis/1_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/gis/1_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/gis/1_over.png -text -designer_chart/src/com/fr/design/images/toolbar/line/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/line/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/line/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/map/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/map/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/map/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/meter/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/meter/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/meter/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/meter/1_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/meter/1_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/meter/1_over.png -text -designer_chart/src/com/fr/design/images/toolbar/meter/2_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/meter/2_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/meter/2_over.png -text -designer_chart/src/com/fr/design/images/toolbar/pie/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/pie/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/pie/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/pie/1_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/pie/1_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/pie/1_over.png -text -designer_chart/src/com/fr/design/images/toolbar/radar/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/radar/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/radar/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/range/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/range/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/range/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/stock/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/stock/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/stock/0_over.png -text -designer_chart/src/com/fr/design/images/toolbar/xyscatter/0_gray.png -text -designer_chart/src/com/fr/design/images/toolbar/xyscatter/0_normal.png -text -designer_chart/src/com/fr/design/images/toolbar/xyscatter/0_over.png -text -designer_chart/src/com/fr/design/mainframe/AbstractChartDataPane4Chart.java -text -designer_chart/src/com/fr/design/mainframe/AbstractMapPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/ChartAndWidgetPropertyPane.java -text -designer_chart/src/com/fr/design/mainframe/ChartArea.java -text -designer_chart/src/com/fr/design/mainframe/ChartDesigner.java -text -designer_chart/src/com/fr/design/mainframe/ChartDesignerPropertyPane.java -text -designer_chart/src/com/fr/design/mainframe/ChartDesignerUI.java -text -designer_chart/src/com/fr/design/mainframe/ChartPropertyPane.java -text -designer_chart/src/com/fr/design/mainframe/ChartToolBarPane.java -text -designer_chart/src/com/fr/design/mainframe/ChartUndoState.java -text -designer_chart/src/com/fr/design/mainframe/DesignerFrame4Chart.java -text -designer_chart/src/com/fr/design/mainframe/GisMapPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/JChart.java -text -designer_chart/src/com/fr/design/mainframe/MapArrayPane.java -text -designer_chart/src/com/fr/design/mainframe/MapEditPane.java -text -designer_chart/src/com/fr/design/mainframe/MapPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/MiddleChartPropertyPane.java -text -designer_chart/src/com/fr/design/mainframe/PlotToolBarFactory.java -text -designer_chart/src/com/fr/design/mainframe/TargetComponentContainer.java -text -designer_chart/src/com/fr/design/mainframe/ToolTip4Chart.java -text -designer_chart/src/com/fr/design/mainframe/actions/AbstractExportAction4JChart.java -text -designer_chart/src/com/fr/design/mainframe/actions/ChartDownLoadWorker.java -text -designer_chart/src/com/fr/design/mainframe/actions/ChartFeedBackAciton.java -text -designer_chart/src/com/fr/design/mainframe/actions/ChartUpdateAction.java -text -designer_chart/src/com/fr/design/mainframe/actions/ChartWebAction.java -text -designer_chart/src/com/fr/design/mainframe/actions/ExcelExportAction4Chart.java -text -designer_chart/src/com/fr/design/mainframe/actions/JChartAction.java -text -designer_chart/src/com/fr/design/mainframe/actions/NewChartAction.java -text -designer_chart/src/com/fr/design/mainframe/actions/OpenChartAction.java -text -designer_chart/src/com/fr/design/mainframe/actions/PDFExportAction4Chart.java -text -designer_chart/src/com/fr/design/mainframe/actions/PNGExportAction4Chart.java -text -designer_chart/src/com/fr/design/mainframe/actions/UpdateOnlineAction.java -text -designer_chart/src/com/fr/design/mainframe/actions/UpdateVersion.java -text -designer_chart/src/com/fr/design/mainframe/chart/AbstractChartAttrPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/AttributeChange.java -text -designer_chart/src/com/fr/design/mainframe/chart/ChartDesignEditPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/ChartEditPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/ChartHyperEditPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/PaneTitleConstants.java -text -designer_chart/src/com/fr/design/mainframe/chart/UpdateOnLinePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/ChartDataPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/ChartDesignerDataPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/ChartDesignerOtherPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/ChartOtherPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/ChartStylePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypeButtonPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/ChartTypePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/StylePane4Chart.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/UIEditLabel.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/CalculateComboBox.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/ChartDataFilterPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/ChartDesignDataLoadPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/DataContentsPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/DatabaseTableDataPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/EmbbeddDataPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/ExcelDataPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/ImportSetChartDataPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/JSONDataPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/NormalChartDataPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/PresentComboBox.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/ReportDataPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/TableDataPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/AbstractReportDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/BubblePlotReportDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotMoreCateReportDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotReportDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/GanttPlotReportDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/MeterPlotReportDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/PiePlotReportDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/StockPlotReportDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/report/XYScatterPlotReportDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/AbstractTableDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/BubblePlotTableDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotTableDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/Factory4TableDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/GanttPlotTableDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/MeterPlotTableDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/PiePlotTableDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldNamePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/SeriesNameUseFieldValuePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/SeriesTypeUseComboxPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/StockPlotTableDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/data/table/XYScatterPlotTableDataContentPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartConditionAttrPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartDesignerConditionAttrPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartDesignerInteractivePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartInteractivePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/other/ChartSwitchPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/other/TimeSwitchPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/AbstractChartTabPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartAccColorPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartAxisLabelPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartAxisLineStylePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartAxisTitleNoFormulaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartAxisTitlePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartAxisValueTypePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartBackgroundNoImagePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartBackgroundPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartBeautyPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartBorderPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartDataPointLabel4GisPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartDataPointLabel4MapPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartDatapointLabelPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartFillStylePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartPreFillStylePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartTextAttrNoColorPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartTextAttrNoFontSizePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ChartTextAttrPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/DateAxisValuePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/ThirdTabPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/analysisline/ChartAnalysisLinePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartAreaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartAxisAreaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartPlotAreaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/ChartWholeAreaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/DefaultAxisAreaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/Plot3DAxisAreaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/area/RadarAxisAreaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartAxisNoFormulaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartAxisPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartAxisUsePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartCategoryNoFormulaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartCategoryPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartPercentValueNoFormulaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartPercentValuePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartRadarPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartSecondValueNoFormulaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartSecondValuePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartValueNoFormulaPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/axis/ChartValuePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/datalabel/ChartDataLabelPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/datalabel/ChartLabelFontPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/datasheet/ChartDatasheetPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/legend/AutoSelectedPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/legend/ChartLegendPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/AbstractPlotSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Area3DSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/AreaSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Bar2DSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Bar3DSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/BubbleSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/ChartSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/ColorPickerPaneNumFiled.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/ColorPickerPaneWithFormula.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/CombinedBar2DSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/CombinedBubbleSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/CombinedPie2DSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/CustomDefaultSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/CustomSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/CustomTypeConditionSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Donut2DSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/FunnelSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/LineSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/MapColorPickerPaneWithFormula.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/MapSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/MapSeriesPane4ChartDesigner.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/MeterSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/MeterSeriesPane4ChartDesigner.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Pie2DSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/Pie3DSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/RadarSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/RangeSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/SeriesPane4ChartDesigner.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/StockSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/UIColorPickerPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/UIColorPickerPane4Map.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/series/XYScatterSeriesPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/title/ChartTitlePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/style/title/ChartTitlePaneNoFormula.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/AbstractBarPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/AreaPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/AreaPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/BarPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/BarPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/BubblePlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/BubblePlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartDesignerImagePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartImagePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/ChartTabPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/ColumnPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/CustomPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/CustomPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/DonutPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/DonutPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/FunnelPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/GanttPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/GanttPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/GisMapPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/LinePlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/LinePlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/MapPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/MeterPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/MeterPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/PiePlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/PiePlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/PlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/RadarPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/RadarPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/RangePlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/RangePlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/StockPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/StockPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/UserDefinedChartTypePane.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/XYSCatterPlotPane4ToolBar.java -text -designer_chart/src/com/fr/design/mainframe/chart/gui/type/XYScatterPlotPane.java -text -designer_chart/src/com/fr/design/mainframe/exporter/ExcelExporter4Chart.java -text -designer_chart/src/com/fr/design/mainframe/exporter/Exporter4Chart.java -text -designer_chart/src/com/fr/design/mainframe/exporter/ImageExporter4Chart.java -text -designer_chart/src/com/fr/design/mainframe/exporter/PdfExporter4Chart.java -text -designer_chart/src/com/fr/design/module/ChartDesignerModule.java -text -designer_chart/src/com/fr/design/module/ChartHyperlinkGroup.java -text -designer_chart/src/com/fr/design/module/ChartPreStyleAction.java -text -designer_chart/src/com/fr/design/module/ChartPreStyleManagerPane.java -text -designer_chart/src/com/fr/design/module/ChartPreStylePane.java -text -designer_chart/src/com/fr/design/module/ChartStartModule.java -text -designer_chart/src/com/fr/design/module/FormHyperlinkGroup.java -text -designer_chart/src/com/fr/file/FILEChooserPane4Chart.java -text -designer_chart/src/com/fr/start/ChartSplashPane.java -text -designer_chart/src/com/fr/start/Designer4Chart.java -text -designer_form/.classpath -text -designer_form/.project -text -designer_form/designer_form.iml -text -designer_form/src/com/fr/design/designer/beans/AdapterBus.java -text -designer_form/src/com/fr/design/designer/beans/ComponentAdapter.java -text -designer_form/src/com/fr/design/designer/beans/ConnectorCreator.java -text -designer_form/src/com/fr/design/designer/beans/ConstraintsGroupModel.java -text -designer_form/src/com/fr/design/designer/beans/HoverPainter.java -text -designer_form/src/com/fr/design/designer/beans/Incremental.java -text -designer_form/src/com/fr/design/designer/beans/LayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/Painter.java -text -designer_form/src/com/fr/design/designer/beans/actions/ChangeNameAction.java -text -designer_form/src/com/fr/design/designer/beans/actions/ConnectionAction.java -text -designer_form/src/com/fr/design/designer/beans/actions/CopyAction.java -text -designer_form/src/com/fr/design/designer/beans/actions/CutAction.java -text -designer_form/src/com/fr/design/designer/beans/actions/FormDeleteAction.java -text -designer_form/src/com/fr/design/designer/beans/actions/FormEditAction.java -text -designer_form/src/com/fr/design/designer/beans/actions/FormUndoableAction.java -text -designer_form/src/com/fr/design/designer/beans/actions/PasteAction.java -text -designer_form/src/com/fr/design/designer/beans/adapters/component/CompositeComponentAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/AbsoluteLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/AbstractAnchorPainter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/AbstractLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/DefaultLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRBorderLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRCardLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFormLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRGridLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRHorizontalLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRHorizontalSplitLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRParameterLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRScaleLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRTitleLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRVerticalLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/adapters/layout/FRVerticalSplitLayoutAdapter.java -text -designer_form/src/com/fr/design/designer/beans/events/CreatorEventListenerTable.java -text -designer_form/src/com/fr/design/designer/beans/events/DesignerEditListener.java -text -designer_form/src/com/fr/design/designer/beans/events/DesignerEditor.java -text -designer_form/src/com/fr/design/designer/beans/events/DesignerEvent.java -text -designer_form/src/com/fr/design/designer/beans/location/AccessDirection.java -text -designer_form/src/com/fr/design/designer/beans/location/Add.java -text -designer_form/src/com/fr/design/designer/beans/location/Bottom.java -text -designer_form/src/com/fr/design/designer/beans/location/Direction.java -text -designer_form/src/com/fr/design/designer/beans/location/Inner.java -text -designer_form/src/com/fr/design/designer/beans/location/Left.java -text -designer_form/src/com/fr/design/designer/beans/location/LeftBottom.java -text -designer_form/src/com/fr/design/designer/beans/location/LeftTop.java -text -designer_form/src/com/fr/design/designer/beans/location/Location.java -text -designer_form/src/com/fr/design/designer/beans/location/Outer.java -text -designer_form/src/com/fr/design/designer/beans/location/Right.java -text -designer_form/src/com/fr/design/designer/beans/location/RightBottom.java -text -designer_form/src/com/fr/design/designer/beans/location/RightTop.java -text -designer_form/src/com/fr/design/designer/beans/location/RootResizeDirection.java -text -designer_form/src/com/fr/design/designer/beans/location/Top.java -text -designer_form/src/com/fr/design/designer/beans/models/AddingModel.java -text -designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java -text -designer_form/src/com/fr/design/designer/beans/models/StateModel.java -text -designer_form/src/com/fr/design/designer/beans/painters/AbstractPainter.java -text -designer_form/src/com/fr/design/designer/beans/painters/FRBorderLayoutPainter.java -text -designer_form/src/com/fr/design/designer/beans/painters/FRBoxLayoutPainter.java -text -designer_form/src/com/fr/design/designer/beans/painters/FRFitLayoutPainter.java -text -designer_form/src/com/fr/design/designer/beans/painters/FRGridLayoutAnchorPainter.java -text -designer_form/src/com/fr/design/designer/beans/painters/FRGridLayoutPainter.java -text -designer_form/src/com/fr/design/designer/beans/painters/FRHorizontalLayoutPainter.java -text -designer_form/src/com/fr/design/designer/beans/painters/FRParameterLayoutPainter.java -text -designer_form/src/com/fr/design/designer/beans/painters/FRVerticalLayoutPainter.java -text -designer_form/src/com/fr/design/designer/beans/painters/NullLayoutPainter.java -text -designer_form/src/com/fr/design/designer/beans/painters/NullPainter.java -text -designer_form/src/com/fr/design/designer/creator/CRPropertyDescriptor.java -text -designer_form/src/com/fr/design/designer/creator/DedicateLayoutContainer.java -text -designer_form/src/com/fr/design/designer/creator/FormCardPane.java -text -designer_form/src/com/fr/design/designer/creator/NullCreator.java -text -designer_form/src/com/fr/design/designer/creator/XAbstractSplitLayout.java -text -designer_form/src/com/fr/design/designer/creator/XBorderStyleWidgetCreator.java -text -designer_form/src/com/fr/design/designer/creator/XButton.java -text -designer_form/src/com/fr/design/designer/creator/XChartEditor.java -text -designer_form/src/com/fr/design/designer/creator/XCheckBox.java -text -designer_form/src/com/fr/design/designer/creator/XCheckBoxGroup.java -text -designer_form/src/com/fr/design/designer/creator/XComboBox.java -text -designer_form/src/com/fr/design/designer/creator/XComboCheckBox.java -text -designer_form/src/com/fr/design/designer/creator/XComponent.java -text -designer_form/src/com/fr/design/designer/creator/XConnector.java -text -designer_form/src/com/fr/design/designer/creator/XCreator.java -text -designer_form/src/com/fr/design/designer/creator/XCreatorTools.java -text -designer_form/src/com/fr/design/designer/creator/XCreatorUtils.java -text -designer_form/src/com/fr/design/designer/creator/XCustomWriteAbleRepeatEditor.java -text -designer_form/src/com/fr/design/designer/creator/XDataTable.java -text -designer_form/src/com/fr/design/designer/creator/XDateEditor.java -text -designer_form/src/com/fr/design/designer/creator/XDirectWriteEditor.java -text -designer_form/src/com/fr/design/designer/creator/XEditorHolder.java -text -designer_form/src/com/fr/design/designer/creator/XElementCase.java -text -designer_form/src/com/fr/design/designer/creator/XFieldEditor.java -text -designer_form/src/com/fr/design/designer/creator/XFileUploader.java -text -designer_form/src/com/fr/design/designer/creator/XIframeEditor.java -text -designer_form/src/com/fr/design/designer/creator/XLabel.java -text -designer_form/src/com/fr/design/designer/creator/XLayoutContainer.java -text -designer_form/src/com/fr/design/designer/creator/XListEditor.java -text -designer_form/src/com/fr/design/designer/creator/XMultiFileUploader.java -text -designer_form/src/com/fr/design/designer/creator/XNameWidget.java -text -designer_form/src/com/fr/design/designer/creator/XNumberEditor.java -text -designer_form/src/com/fr/design/designer/creator/XPassword.java -text -designer_form/src/com/fr/design/designer/creator/XRadio.java -text -designer_form/src/com/fr/design/designer/creator/XRadioGroup.java -text -designer_form/src/com/fr/design/designer/creator/XTableEditor.java -text -designer_form/src/com/fr/design/designer/creator/XTableTree.java -text -designer_form/src/com/fr/design/designer/creator/XTextArea.java -text -designer_form/src/com/fr/design/designer/creator/XTextEditor.java -text -designer_form/src/com/fr/design/designer/creator/XTreeComboBoxEditor.java -text -designer_form/src/com/fr/design/designer/creator/XTreeEditor.java -text -designer_form/src/com/fr/design/designer/creator/XWAbsoluteLayout.java -text -designer_form/src/com/fr/design/designer/creator/XWBorderLayout.java -text -designer_form/src/com/fr/design/designer/creator/XWFitLayout.java -text -designer_form/src/com/fr/design/designer/creator/XWGridLayout.java -text -designer_form/src/com/fr/design/designer/creator/XWHorizontalBoxLayout.java -text -designer_form/src/com/fr/design/designer/creator/XWHorizontalSplitLayout.java -text -designer_form/src/com/fr/design/designer/creator/XWParameterLayout.java -text -designer_form/src/com/fr/design/designer/creator/XWScaleLayout.java -text -designer_form/src/com/fr/design/designer/creator/XWTitleLayout.java -text -designer_form/src/com/fr/design/designer/creator/XWVerticalBoxLayout.java -text -designer_form/src/com/fr/design/designer/creator/XWVerticalSplitLayout.java -text -designer_form/src/com/fr/design/designer/creator/XWidgetCreator.java -text -designer_form/src/com/fr/design/designer/creator/XWrapperedFieldEditor.java -text -designer_form/src/com/fr/design/designer/creator/XWriteAbleRepeatEditor.java -text -designer_form/src/com/fr/design/designer/creator/cardlayout/XCardAddButton.java -text -designer_form/src/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java -text -designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardLayout.java -text -designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java -text -designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java -text -designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java -text -designer_form/src/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java -text -designer_form/src/com/fr/design/designer/properties/BoundsGroupModel.java -text -designer_form/src/com/fr/design/designer/properties/CardDefaultShowEditor.java -text -designer_form/src/com/fr/design/designer/properties/CardDefaultShowRenderer.java -text -designer_form/src/com/fr/design/designer/properties/CardDefaultShowWrapper.java -text -designer_form/src/com/fr/design/designer/properties/CardLayoutConstraints.java -text -designer_form/src/com/fr/design/designer/properties/CardLayoutPropertiesGroupModel.java -text -designer_form/src/com/fr/design/designer/properties/Decoder.java -text -designer_form/src/com/fr/design/designer/properties/DelegateEditor.java -text -designer_form/src/com/fr/design/designer/properties/Encoder.java -text -designer_form/src/com/fr/design/designer/properties/EnumerationEditor.java -text -designer_form/src/com/fr/design/designer/properties/EventPropertyTable.java -text -designer_form/src/com/fr/design/designer/properties/FRBorderConstraintsEditor.java -text -designer_form/src/com/fr/design/designer/properties/FRBorderLayoutConstraints.java -text -designer_form/src/com/fr/design/designer/properties/FRBorderLayoutConstraintsRenderer.java -text -designer_form/src/com/fr/design/designer/properties/FRBorderLayoutPropertiesGroupModel.java -text -designer_form/src/com/fr/design/designer/properties/FRCardConstraintsEditor.java -text -designer_form/src/com/fr/design/designer/properties/FRFitLayoutConstraints.java -text -designer_form/src/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java -text -designer_form/src/com/fr/design/designer/properties/FRFormLayoutPropertiesGroupModel.java -text -designer_form/src/com/fr/design/designer/properties/FRGridLayoutPropertiesGroupModel.java -text -designer_form/src/com/fr/design/designer/properties/FRTabFitLayoutPropertiesGroupModel.java -text -designer_form/src/com/fr/design/designer/properties/FitStateRenderer.java -text -designer_form/src/com/fr/design/designer/properties/FitStateWrapper.java -text -designer_form/src/com/fr/design/designer/properties/FormWidgetAuthorityEditPane.java -text -designer_form/src/com/fr/design/designer/properties/HVLayoutConstraints.java -text -designer_form/src/com/fr/design/designer/properties/HorizontalAlignmentEditor.java -text -designer_form/src/com/fr/design/designer/properties/HorizontalAlignmentRenderer.java -text -designer_form/src/com/fr/design/designer/properties/HorizontalAlignmentWrapper.java -text -designer_form/src/com/fr/design/designer/properties/HorizontalLayoutConstraints.java -text -designer_form/src/com/fr/design/designer/properties/HorizontalLayoutPropertiesGroupModel.java -text -designer_form/src/com/fr/design/designer/properties/HorizontalSplitProperties.java -text -designer_form/src/com/fr/design/designer/properties/IconCellEditor.java -text -designer_form/src/com/fr/design/designer/properties/ItemWrapper.java -text -designer_form/src/com/fr/design/designer/properties/LayoutConstraintsEditor.java -text -designer_form/src/com/fr/design/designer/properties/MultiSelectionBoundsModel.java -text -designer_form/src/com/fr/design/designer/properties/NameWithListeners.java -text -designer_form/src/com/fr/design/designer/properties/VerticalBoxProperties.java -text -designer_form/src/com/fr/design/designer/properties/VerticalLayoutConstraints.java -text -designer_form/src/com/fr/design/designer/properties/VerticalSplitProperties.java -text -designer_form/src/com/fr/design/designer/properties/WidgetPropertyTable.java -text -designer_form/src/com/fr/design/designer/properties/items/FRBorderConstraintsItems.java -text -designer_form/src/com/fr/design/designer/properties/items/FRFitConstraintsItems.java -text -designer_form/src/com/fr/design/designer/properties/items/HorizontalAlignmentItems.java -text -designer_form/src/com/fr/design/designer/properties/items/Item.java -text -designer_form/src/com/fr/design/designer/properties/items/ItemProvider.java -text -designer_form/src/com/fr/design/designer/properties/items/LabelHorizontalAlignmentItems.java -text -designer_form/src/com/fr/design/designer/properties/items/LayoutIndexItems.java -text -designer_form/src/com/fr/design/designer/properties/items/UnderlineItems.java -text -designer_form/src/com/fr/design/designer/properties/items/WidgetDisplayPositionItems.java -text -designer_form/src/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java -text -designer_form/src/com/fr/design/designer/treeview/ComponentTreeModel.java -text -designer_form/src/com/fr/design/form/images/add.png -text -designer_form/src/com/fr/design/form/images/delete_hover&click.png -text -designer_form/src/com/fr/design/form/images/delete_normal.png -text -designer_form/src/com/fr/design/form/javascript/FormEmailPane.java -text -designer_form/src/com/fr/design/form/layout/FRAbsoluteLayout.java -text -designer_form/src/com/fr/design/form/layout/FRBorderLayout.java -text -designer_form/src/com/fr/design/form/layout/FRCardLayout.java -text -designer_form/src/com/fr/design/form/layout/FRFitLayout.java -text -designer_form/src/com/fr/design/form/layout/FRFlowLayout.java -text -designer_form/src/com/fr/design/form/layout/FRFormLayout.java -text -designer_form/src/com/fr/design/form/layout/FRGridLayout.java -text -designer_form/src/com/fr/design/form/layout/FRHorizontalLayout.java -text -designer_form/src/com/fr/design/form/layout/FRHorizontalSplitLayout.java -text -designer_form/src/com/fr/design/form/layout/FRLayoutManager.java -text -designer_form/src/com/fr/design/form/layout/FRPolyReportLayout.java -text -designer_form/src/com/fr/design/form/layout/FRScaleLayout.java -text -designer_form/src/com/fr/design/form/layout/FRSplitLayout.java -text -designer_form/src/com/fr/design/form/layout/FRTitleLayout.java -text -designer_form/src/com/fr/design/form/layout/FRVerticalLayout.java -text -designer_form/src/com/fr/design/form/layout/FRVerticalSplitLayout.java -text -designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java -text -designer_form/src/com/fr/design/form/parameter/FormParaTargetMode.java -text -designer_form/src/com/fr/design/form/parameter/RootDesignGroupModel.java -text -designer_form/src/com/fr/design/form/parameter/XFormSubmit.java -text -designer_form/src/com/fr/design/form/util/XCreatorConstants.java -text -designer_form/src/com/fr/design/gui/core/FormWidgetOption.java -text -designer_form/src/com/fr/design/gui/xpane/CardTagLayoutBorderPane.java -text -designer_form/src/com/fr/design/gui/xpane/CardTagLayoutBorderPreviewPane.java -text -designer_form/src/com/fr/design/gui/xpane/FormHyperlinkGroupPane.java -text -designer_form/src/com/fr/design/gui/xpane/JTreeAutoBuildPane.java -text -designer_form/src/com/fr/design/gui/xpane/LayoutBorderPane.java -text -designer_form/src/com/fr/design/gui/xpane/LayoutBorderPreviewPane.java -text -designer_form/src/com/fr/design/gui/xpane/ToolTipEditor.java -text -designer_form/src/com/fr/design/gui/xtable/AbstractPropertyGroupModel.java -text -designer_form/src/com/fr/design/gui/xtable/PropertyGroupModel.java -text -designer_form/src/com/fr/design/gui/xtable/TableUtils.java -text -designer_form/src/com/fr/design/mainframe/AutoScrollSource.java -text -designer_form/src/com/fr/design/mainframe/ComponentTree.java -text -designer_form/src/com/fr/design/mainframe/ConnectorHelper.java -text -designer_form/src/com/fr/design/mainframe/CoverReportPane.java -text -designer_form/src/com/fr/design/mainframe/DesignerTransferHandler.java -text -designer_form/src/com/fr/design/mainframe/EditingMouseListener.java -text -designer_form/src/com/fr/design/mainframe/FormArea.java -text -designer_form/src/com/fr/design/mainframe/FormCreatorDropTarget.java -text -designer_form/src/com/fr/design/mainframe/FormDesigner.java -text -designer_form/src/com/fr/design/mainframe/FormDesignerDropTarget.java -text -designer_form/src/com/fr/design/mainframe/FormDesignerModeForSpecial.java -text -designer_form/src/com/fr/design/mainframe/FormDesignerUI.java -text -designer_form/src/com/fr/design/mainframe/FormDockView.java -text -designer_form/src/com/fr/design/mainframe/FormEditorKeyListener.java -text -designer_form/src/com/fr/design/mainframe/FormHierarchyTreePane.java -text -designer_form/src/com/fr/design/mainframe/FormModelAdapter.java -text -designer_form/src/com/fr/design/mainframe/FormParaPane.java -text -designer_form/src/com/fr/design/mainframe/FormParaWidgetPane.java -text -designer_form/src/com/fr/design/mainframe/FormSelection.java -text -designer_form/src/com/fr/design/mainframe/FormSelectionUtils.java -text -designer_form/src/com/fr/design/mainframe/FormTargetMode.java -text -designer_form/src/com/fr/design/mainframe/FormUndoState.java -text -designer_form/src/com/fr/design/mainframe/FormWidgetDetailPane.java -text -designer_form/src/com/fr/design/mainframe/FormWidgetPopWindow.java -text -designer_form/src/com/fr/design/mainframe/JForm.java -text -designer_form/src/com/fr/design/mainframe/MobileBodyWidgetTable.java -text -designer_form/src/com/fr/design/mainframe/MobileWidgetTable.java -text -designer_form/src/com/fr/design/mainframe/TabChangeAction.java -text -designer_form/src/com/fr/design/mainframe/ToolBarButton.java -text -designer_form/src/com/fr/design/mainframe/TreeTransferHandler.java -text -designer_form/src/com/fr/design/mainframe/WLayoutSelectionPane.java -text -designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java -text -designer_form/src/com/fr/design/mainframe/WidgetToolBarPane.java -text -designer_form/src/com/fr/design/mainframe/actions/EmbeddedFormExportExportAction.java -text -designer_form/src/com/fr/design/mainframe/actions/NewFormAction.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleBackgroundEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleCardTagWLayoutBorderStyleEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleColorEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleDateEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleDictionaryEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleDimensionEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleFontEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleFormulaEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleGridWidgetEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleIconEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleImgBackgroundEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleParameterEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessiblePropertyCellEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessiblePropertyEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleRegexEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleTreeModelEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleWLayoutBorderStyleEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessibleWidgetValueEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/AccessilePaddingMarginEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/BaseAccessibleEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/ColorIcon.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/ColorPalette.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/RendererField.java -text -designer_form/src/com/fr/design/mainframe/widget/accessibles/UneditableAccessibleEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/AdjustModeEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/BackgroundEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/BooleanEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/BorderLayoutDirectionEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/ButtonTypeEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/CardTagWLayoutBorderStyleEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/ColorEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/ColorTextField.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/ComboEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/DataTableConfigPane.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/DateFormatEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/DateRangeEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/DecorationEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/DictionaryEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/DimensionEditingPane.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/DimensionEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/DoubleEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/FitLayoutDirectionEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/FloatEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/FontEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/FormulaEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/ITextComponent.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/IconEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/ImgBackgroundEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/InChangeBooleanEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/ItemCellEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/LongEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/NameWidgetComboboxEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/PaddingMarginEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/PaddingMarginPane.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/ParameterEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/PercentageEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/RegexEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/ShortCutTextEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/SpinnerMaxNumberEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/SpinnerMinNumberEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/SpinnerNumberEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/TextField.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/TreeModelEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/WLayoutBorderStyleEditor.java -text -designer_form/src/com/fr/design/mainframe/widget/editors/WidgetDisplayPosition.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/BackgroundRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/ColorCellRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/DateCellRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/DictionaryRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/DimensionCellRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/EncoderCellRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/FontCellRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/GenericCellRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/GridWidgetRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/HyperlinkGroupRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/IconCellRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/LabelHorizontalAlignmentRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/LayoutBorderStyleRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/PaddingMarginCellRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/ParameterRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/PointCellRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/PropertyCellRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/RectangleCellRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/RegexCellRencerer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/TreeModelRenderer.java -text -designer_form/src/com/fr/design/mainframe/widget/renderer/WidgetDisplayPositionRender.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/BackgroundWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/ColorWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/DSColumnWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/DateWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/DictionaryWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/DimensionWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/EventHandlerWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/FontWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/FormulaWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/GridWidgetWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/HyperlinkGroupWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/IconWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/LabelHorizontalAlignmentWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/LayoutBorderStyleWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/PaddingMarginWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/ParameterWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/PointWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/RectangleWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/RegexWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/TreeModelWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/WidgetDisplayPositionWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/WrapperUtils.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/primitive/BooleanWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/primitive/ByteWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/primitive/CharWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/primitive/DoubleWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/primitive/FloatWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/primitive/IntegerWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/primitive/LongWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/primitive/ShortWrapper.java -text -designer_form/src/com/fr/design/mainframe/widget/wrappers/primitive/StringWrapper.java -text -designer_form/src/com/fr/design/module/FormDesignerModule.java -text -designer_form/src/com/fr/design/parameter/FormParameterReader.java -text -designer_form/src/com/fr/design/parameter/ParameterPropertyPane.java -text -designer_form/src/com/fr/design/parameter/ParameterToolBarPane.java -text -designer_form/src/com/fr/design/widget/ui/btn/FormSubmitButtonDetailPane.java -text -designer_form/src/com/fr/start/Designer4Form.java -text diff --git a/.gitignore b/.gitignore index 5cc51f5ed5..f69258f5b2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,7 @@ -designer/bin -designer_base/bin -designer_chart/bin -designer_form/bin *.iml -designer_base/src/com/fr/design/locale/.idea +.idea/ +.DS_Store +.classpath +.project diff --git a/build.10.0.gradle b/build.10.0.gradle deleted file mode 100644 index f2fe428502..0000000000 --- a/build.10.0.gradle +++ /dev/null @@ -1,75 +0,0 @@ -apply plugin: "java" -tasks.withType(JavaCompile){ - options.encoding = "UTF-8" -} - -def basicDir="../" -def libDir="${basicDir}/lib" - -task appletJar<<{ - ant{ - mkdir(dir:"./tmp") - mkdir(dir:"build/classes/main") - copy(todir:"build/classes/"){ - fileset(dir:"${basicDir}/chart/build/classes/main") - fileset(dir:"${basicDir}/report/build/classes/main") - fileset(dir:"${basicDir}/platform/build/classes/main") - } - unjar(src:"${libDir}/fr-core-9.0.jar",dest:"./tmp") - unjar(src:"${libDir}/fr-third-9.0.jar",dest:"./tmp") - unjar(src:"${libDir}/servlet-api.jar",dest:"./tmp") - jar(jarfile:"build/libs/fr-applet-9.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:"./tmp"){ - 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:"./tmp") - 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-9.0.jar' ${keyalias}") - } - delete(file:"${keystore}") - delete(file:"${keycert}") - delete(dir:"build/classes") - - } - -} \ No newline at end of file diff --git a/build.9.0.gradle b/build.9.0.gradle deleted file mode 100644 index f2fe428502..0000000000 --- a/build.9.0.gradle +++ /dev/null @@ -1,75 +0,0 @@ -apply plugin: "java" -tasks.withType(JavaCompile){ - options.encoding = "UTF-8" -} - -def basicDir="../" -def libDir="${basicDir}/lib" - -task appletJar<<{ - ant{ - mkdir(dir:"./tmp") - mkdir(dir:"build/classes/main") - copy(todir:"build/classes/"){ - fileset(dir:"${basicDir}/chart/build/classes/main") - fileset(dir:"${basicDir}/report/build/classes/main") - fileset(dir:"${basicDir}/platform/build/classes/main") - } - unjar(src:"${libDir}/fr-core-9.0.jar",dest:"./tmp") - unjar(src:"${libDir}/fr-third-9.0.jar",dest:"./tmp") - unjar(src:"${libDir}/servlet-api.jar",dest:"./tmp") - jar(jarfile:"build/libs/fr-applet-9.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:"./tmp"){ - 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:"./tmp") - 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-9.0.jar' ${keyalias}") - } - delete(file:"${keystore}") - delete(file:"${keycert}") - delete(dir:"build/classes") - - } - -} \ No newline at end of file diff --git a/build.applet.gradle b/build.applet.gradle deleted file mode 100644 index 5e02f17809..0000000000 --- a/build.applet.gradle +++ /dev/null @@ -1,75 +0,0 @@ -apply plugin: "java" -tasks.withType(JavaCompile){ - options.encoding = "UTF-8" -} - -def basicDir="../" - -task appletJar<<{ - ant{ - delete(dir:"build/classes") - mkdir(dir:"./tmp") - mkdir(dir:"build/classes/main") - copy(todir:"build/classes/"){ - fileset(dir:"${basicDir}/chart/build/classes/main") - fileset(dir:"${basicDir}/report/build/classes/main") - fileset(dir:"${basicDir}/platform/build/classes/main") - } - unjar(src:"${basicDir}/lib-core/fine-core-10.0.jar",dest:"./tmp") - unjar(src:"${basicDir}/lib-core/fine-third-10.0.jar",dest:"./tmp") - unjar(src:"${basicDir}/lib-other/server/servlet-api.jar",dest:"./tmp") - jar(jarfile:"build/libs/fine-applet-10.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:"./tmp"){ - 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:"./tmp") - 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/fine-applet-10.0.jar' ${keyalias}") - } - delete(file:"${keystore}") - delete(file:"${keycert}") - delete(dir:"build/classes") - - } - -} \ No newline at end of file diff --git a/build.dev.gradle b/build.dev.gradle deleted file mode 100644 index 1efdd55cc8..0000000000 --- a/build.dev.gradle +++ /dev/null @@ -1,86 +0,0 @@ -apply plugin: "java" -tasks.withType(JavaCompile){ - options.encoding = "UTF-8" -} - -def basicDir="../../" -def libDir="${basicDir}/finereport-lib-stable" -//获取什么分支名 -FileTree files =fileTree(dir:"./",include:"build.*.gradle") -def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf ("\\")) -def branchName=buildDir.substring(buildDir.lastIndexOf ("\\")+1) - -task appletJar<<{ - - ant{ - mkdir(dir:"./tmp") - 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}/${branchName}/3rd.jar",dest:"./tmp") - unjar(src:"${libDir}/${branchName}/servlet-api.jar",dest:"./tmp") - 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:"./tmp"){ - 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:"./tmp") - 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.master.gradle b/build.master.gradle deleted file mode 100644 index 1efdd55cc8..0000000000 --- a/build.master.gradle +++ /dev/null @@ -1,86 +0,0 @@ -apply plugin: "java" -tasks.withType(JavaCompile){ - options.encoding = "UTF-8" -} - -def basicDir="../../" -def libDir="${basicDir}/finereport-lib-stable" -//获取什么分支名 -FileTree files =fileTree(dir:"./",include:"build.*.gradle") -def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf ("\\")) -def branchName=buildDir.substring(buildDir.lastIndexOf ("\\")+1) - -task appletJar<<{ - - ant{ - mkdir(dir:"./tmp") - 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}/${branchName}/3rd.jar",dest:"./tmp") - unjar(src:"${libDir}/${branchName}/servlet-api.jar",dest:"./tmp") - 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:"./tmp"){ - 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:"./tmp") - 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.master.gradle.bak b/build.master.gradle.bak deleted file mode 100644 index a10a5e4277..0000000000 --- a/build.master.gradle.bak +++ /dev/null @@ -1,86 +0,0 @@ -apply plugin: "java" -tasks.withType(JavaCompile){ - options.encoding = "UTF-8" -} - -def basicDir="../../" -def libDir="${basicDir}/finereport-lib-stable" -//获取什么分支名 -FileTree files =fileTree(dir:"./",include:"build.*.gradle") -def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf ("\\")) -def branchName=buildDir.substring(buildDir.lastIndexOf ("\\")+1) - -task appletJar<<{ - - ant{ - mkdir(dir:"${libDir}/tmp-${branchName}") - mkdir(dir:"build/classes/") - copy(todir:"build/classes/"){ - fileset(dir:"${basicDir}/finereport-core-stable/${branchName}/build/classes/main") - - fileset(dir:"${basicDir}/finereport-chart-stable/${branchName}/build/classes/main") - - fileset(dir:"${basicDir}/finereport-report-stable/${branchName}/build/classes/main") - - fileset(dir:"${basicDir}/finereport-platform-stable/${branchName}/build/classes/main") - - fileset(dir:"${basicDir}/finereport-performance-stable/${branchName}/build/classes/main") - - } - unjar(src:"${libDir}/${branchName}/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/build.performance.gradle b/build.performance.gradle deleted file mode 100644 index 132db468fb..0000000000 --- a/build.performance.gradle +++ /dev/null @@ -1,75 +0,0 @@ -apply plugin: "java" -tasks.withType(JavaCompile){ - options.encoding = "UTF-8" -} - -def basicDir="../" -def libDir="${basicDir}/lib" - -task appletJar<<{ - ant{ - mkdir(dir:"./tmp") - mkdir(dir:"build/classes/main") - copy(todir:"build/classes/"){ - fileset(dir:"${basicDir}/core/build/classes/main") - fileset(dir:"${basicDir}/chart/build/classes/main") - fileset(dir:"${basicDir}/report/build/classes/main") - fileset(dir:"${basicDir}/platform/build/classes/main") - } - unjar(src:"${libDir}/3rd.jar",dest:"./tmp") - unjar(src:"${libDir}/servlet-api.jar",dest:"./tmp") - 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:"./tmp"){ - 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:"./tmp") - 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.performance.gradle.bak b/build.performance.gradle.bak deleted file mode 100644 index 58899a9c24..0000000000 --- a/build.performance.gradle.bak +++ /dev/null @@ -1,76 +0,0 @@ -apply plugin: "java" -tasks.withType(JavaCompile){ - options.encoding = "UTF-8" -} - -def basicDir="../" -def libDir="${basicDir}/lib" - -task appletJar<<{ - ant{ - mkdir(dir:"./tmp") - mkdir(dir:"build/classes/main") - copy(todir:"build/classes/"){ - fileset(dir:"${basicDir}/core/build/classes/main") - fileset(dir:"${basicDir}/chart/build/classes/main") - fileset(dir:"${basicDir}/report/build/classes/main") - fileset(dir:"${basicDir}/platform/build/classes/main") - fileset(dir:"${basicDir}/performance/build/classes/main") - } - unjar(src:"${libDir}/3rd.jar",dest:"./tmp") - unjar(src:"${libDir}/servlet-api.jar",dest:"./tmp") - 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:"./tmp"){ - 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:"./tmp") - 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 b/build.release.gradle deleted file mode 100644 index 1efdd55cc8..0000000000 --- a/build.release.gradle +++ /dev/null @@ -1,86 +0,0 @@ -apply plugin: "java" -tasks.withType(JavaCompile){ - options.encoding = "UTF-8" -} - -def basicDir="../../" -def libDir="${basicDir}/finereport-lib-stable" -//获取什么分支名 -FileTree files =fileTree(dir:"./",include:"build.*.gradle") -def buildDir=files[0].path.substring(0,files[0].path.lastIndexOf ("\\")) -def branchName=buildDir.substring(buildDir.lastIndexOf ("\\")+1) - -task appletJar<<{ - - ant{ - mkdir(dir:"./tmp") - 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}/${branchName}/3rd.jar",dest:"./tmp") - unjar(src:"${libDir}/${branchName}/servlet-api.jar",dest:"./tmp") - 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:"./tmp"){ - 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:"./tmp") - 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 deleted file mode 100644 index d8afaf2bb8..0000000000 --- a/build.release.gradle.bak +++ /dev/null @@ -1,85 +0,0 @@ -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/build.report-designer.gradle b/build.report-designer.gradle deleted file mode 100644 index 9958b5b721..0000000000 --- a/build.report-designer.gradle +++ /dev/null @@ -1,45 +0,0 @@ - -apply plugin: 'java' -tasks.withType(JavaCompile){ - options.encoding = 'UTF-8' -} -//指定构建的jdk版本 -sourceCompatibility=1.8 - -//jar包版本 -version='10.0' -//jar包名称 -jar{ - baseName='fine-report-designer' -} - -def srcDir="." -def baseDir=".." - -//获取什么分支名 -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) - -//输出jar名称 -FileTree f=fileTree(dir:"${baseDir}/design/designer_base/build/libs",include:"**/*.jar"); -f.each{File file-> - println "----------${file.path}" -} -task unjars { - ant{ - unjar(dest:"build/classes/main"){ - fileset(dir:"${baseDir}/design/designer_base/build/libs"){ - include(name:'fr-*.jar') - } - fileset(dir:"${baseDir}/design/designer_chart/build/libs"){ - include(name:'fr-*.jar') - } - fileset(dir:"${baseDir}/design/designer_form/build/libs"){ - include(name:'fr-*.jar') - } - } - - } -} -jar.dependsOn unjars \ No newline at end of file diff --git a/designer-base/.gitignore b/designer-base/.gitignore new file mode 100644 index 0000000000..85184fbc39 --- /dev/null +++ b/designer-base/.gitignore @@ -0,0 +1,5 @@ +*.iml +.idea/ +.DS_Store +.classpath +.project \ No newline at end of file diff --git a/designer-base/build.base.gradle b/designer-base/build.base.gradle new file mode 100644 index 0000000000..c8bc1c2c09 --- /dev/null +++ b/designer-base/build.base.gradle @@ -0,0 +1,104 @@ +apply plugin: 'java' +tasks.withType(JavaCompile){ + options.encoding = 'UTF-8' +} +buildscript { + repositories { + maven { + url "https://maven.eveoh.nl/content/repositories/releases" + } + } + + dependencies { + classpath "nl.eveoh:gradle-aspectj:1.6" + } +} + +repositories { + mavenCentral() +} + +project.ext { + aspectjVersion = '1.8.4' +} + +apply plugin: 'aspectj' + +//指定构建的jdk版本 +sourceCompatibility=1.8 +//指定生成jar包版本 +version='10.0' +//生成jar包重命名 +jar{ + baseName='fr-designer-core' +} + + +def srcDir="." +def baseDir=".." +ant{ + delete(dir:"src/main") + mkdir(dir:"src/main/java") + move(todir:"src/main/java"){ + fileset(dir:"src",includes:"com/**") + } +} +//指定源码路径 +//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:"../${baseDir}/lib-other",include:'**/*.jar') + compile fileTree(dir:"../${baseDir}/lib-core",include:'**/*.jar') + compile fileTree(dir:"../${baseDir}/lib-design",include:'**/*.jar') + compile fileTree(dir:"../${baseDir}",include:"**/build/libs/*.jar",exclude:"bi/**/*.jar") + testCompile 'junit:junit:4.12' +} + +//输出依赖报 +FileTree f=fileTree(dir:"../${baseDir}/lib-design",include:"**/*.jar"); +f.each{File file-> + println "----------${file.path}" +} +//复制非.java文件到classes文件夹下参与打包 +task copyFile(type:Copy,dependsOn:compileJava){ + copy{ + from ("${srcDir}/src/main/java"){ + 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:"../${baseDir}/lib4build",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/main/java"){ + include (name:'**/*.js') + include (name:'**/*.css') + } + + } +} +jar.dependsOn compressJS + + + diff --git a/designer_base/clean.gradle b/designer-base/clean.gradle similarity index 100% rename from designer_base/clean.gradle rename to designer-base/clean.gradle diff --git a/designer_base/src/com/fr/aspectj/designerbase/AlphaFineReminder.aj b/designer-base/src/com/fr/aspectj/designerbase/AlphaFineReminder.aj similarity index 100% rename from designer_base/src/com/fr/aspectj/designerbase/AlphaFineReminder.aj rename to designer-base/src/com/fr/aspectj/designerbase/AlphaFineReminder.aj diff --git a/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj b/designer-base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj similarity index 100% rename from designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj rename to designer-base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj diff --git a/designer_base/src/com/fr/common/inputevent/InputEventBaseOnOS.java b/designer-base/src/com/fr/common/inputevent/InputEventBaseOnOS.java similarity index 100% rename from designer_base/src/com/fr/common/inputevent/InputEventBaseOnOS.java rename to designer-base/src/com/fr/common/inputevent/InputEventBaseOnOS.java diff --git a/designer-base/src/com/fr/design/DesignModelAdapter.java b/designer-base/src/com/fr/design/DesignModelAdapter.java new file mode 100644 index 0000000000..e14ad01f0c --- /dev/null +++ b/designer-base/src/com/fr/design/DesignModelAdapter.java @@ -0,0 +1,149 @@ +package com.fr.design; + +import com.fr.base.Parameter; +import com.fr.base.io.IOFile; +import com.fr.data.TableDataSource; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.JTemplateProvider; +import com.fr.form.ui.Widget; +import com.fr.general.ComparatorUtils; +import com.fr.stable.js.WidgetName; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * 当前的设计器模式 + * + * @author zhou + * @since 2012-7-26上午11:24:54 + */ +public abstract class DesignModelAdapter { + + private static DesignModelAdapter currentModelAdapter; + protected S jTemplate; + + public DesignModelAdapter(S jTemplate) { + this.jTemplate = jTemplate; + setCurrentModelAdapter(this); + } + + public S getjTemplate() { + return jTemplate; + } + + public void setjTemplate(S jTemplate) { + this.jTemplate = jTemplate; + } + + public T getBook() { + return (T) ((JTemplate) jTemplate).getTarget(); + } + + public static void setCurrentModelAdapter(DesignModelAdapter model) { + currentModelAdapter = model; + } + + public static DesignModelAdapter getCurrentModelAdapter() { + return currentModelAdapter; + } + + /** + * 响应目标改变事件. + */ + public void fireTargetModified() { + ((JTemplate) this.jTemplate).fireTargetModified(); + } + + public String[] getFloatNames() { + return new String[0]; + } + + public Parameter[] getParameters() { + return new Parameter[0]; + } + + // 报表参数 + public Parameter[] getReportParameters() { + return new Parameter[0]; + } + + /** + * 数据源参数 + * + * @return + */ + public Parameter[] getTableDataParameters() { + return new Parameter[0]; + } + + /** + * 重命名数据集 + * + * @param oldName 旧名字 + * @param newName 新名字 + * @param isNeedFireModified 是否需要触发保存 + * @return 重命名成功返回True + */ + public boolean renameTableData(String oldName, String newName, boolean isNeedFireModified) { + if (!ComparatorUtils.equals(oldName, newName)) { + TableDataSource tds = getBook(); + boolean b; + b = tds.renameTableData(oldName, newName); + if (!b) { + return b; + } + if (isNeedFireModified) { + fireTargetModified(); + } + } + return true; + } + + /** + * 重命名TableData后的一些操作 + * + * @param oldName 旧名字 + * @param newName 新名字. + * @return 返回是否名字一样. + */ + public boolean renameTableData(String oldName, String newName) { + return renameTableData(oldName, newName, true); + } + + /** + * 重命名tabledata + * + * @param map 新名字 + */ + public void renameTableData(Map map) { + if (map.isEmpty()) { + return; + } + Iterator iterator = map.keySet().iterator(); + while (iterator.hasNext()) { + String key = iterator.next(); + renameTableData(key, map.get(key)); + } + } + + public abstract Widget[] getLinkableWidgets() ; + + public abstract List getWidgetsName(); + + /** + * 环境改变. + */ + public abstract void envChanged(); + + /** + * 参数改变. + */ + public abstract void parameterChanged(); + + /** + * 控件配置改变. + */ + public abstract void widgetConfigChanged(); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/DesignState.java b/designer-base/src/com/fr/design/DesignState.java new file mode 100644 index 0000000000..832a2e63d0 --- /dev/null +++ b/designer-base/src/com/fr/design/DesignState.java @@ -0,0 +1,73 @@ +package com.fr.design; + +import com.fr.base.BaseUtils; +import com.fr.base.Env; +import com.fr.base.FRContext; +import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; +import com.fr.env.RemoteEnv; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 13-12-24 + * Time: 上午9:36 + * 记录现在设计器的设计状态 + */ +public class DesignState { + + //菜单的几种情况 + //Jwrok + + //worksheet + public static final int WORK_SHEET = 0; + //polyDesogner + public static final int POLY_SHEET = 1; + //参数面板 + public static final int PARAMETER_PANE = 2; + + + //From + public static final int JFORM = 4; + + + //是不是在远程 + public static final int REMOTE = 8; + + //设计状态 + private int designState = -1; + private boolean isRoot = true;//默认是管理员登陆 + private boolean isAuthority = false; + + public DesignState(ToolBarMenuDockPlus plus) { + designState = plus.getMenuState(); + Env env = FRContext.getCurrentEnv(); + if (env != null && env instanceof RemoteEnv) { + designState += REMOTE; + } + isRoot = env != null && env.isRoot(); + isAuthority = BaseUtils.isAuthorityEditing(); + } + + public int getDesignState() { + return designState; + } + + /** + * 是否是管理员 + * @return 是管理员返回true + */ + public boolean isRoot() { + return this.isRoot; + } + + /** + * 是否处于权限编辑状态 + * @return 是则返回true + */ + public boolean isAuthority() { + return isAuthority; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/DesignerEnvManager.java b/designer-base/src/com/fr/design/DesignerEnvManager.java new file mode 100644 index 0000000000..f372c9ef7c --- /dev/null +++ b/designer-base/src/com/fr/design/DesignerEnvManager.java @@ -0,0 +1,1793 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design; + +import com.fr.base.BaseXMLUtils; +import com.fr.base.Env; +import com.fr.base.FRContext; +import com.fr.base.Utils; +import com.fr.dav.LocalEnv; +import com.fr.design.actions.help.alphafine.AlphaFineConfigManager; +import com.fr.design.constants.UIConstants; +import com.fr.env.RemoteEnv; +import com.fr.env.SignIn; +import com.fr.file.FILEFactory; +import com.fr.general.ComparatorUtils; +import com.fr.general.FRLogFormatter; +import com.fr.general.FRLogger; +import com.fr.general.GeneralContext; +import com.fr.general.IOUtils; +import com.fr.general.Inter; +import com.fr.stable.Constants; +import com.fr.stable.EnvChangedListener; +import com.fr.stable.ListMap; +import com.fr.stable.ProductConstants; +import com.fr.stable.StableUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.core.UUID; +import com.fr.stable.project.ProjectConstants; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLReadable; +import com.fr.stable.xml.XMLTools; +import com.fr.stable.xml.XMLWriter; +import com.fr.stable.xml.XMLableReader; + +import javax.swing.SwingWorker; +import javax.swing.SwingWorker.StateValue; +import java.awt.Color; +import java.awt.Rectangle; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.OutputStream; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.logging.FileHandler; +import java.util.logging.Handler; + +/** + * The manager of Designer GUI. + */ +public class DesignerEnvManager implements XMLReadable, XMLWriter { + + private static final int MAX_SHOW_NUM = 10; + private static final String VERSION_80 = "80"; + + private static DesignerEnvManager designerEnvManager; // gui. + private String activationKey = null; + private String logLocation = null; + private Rectangle windowBounds = null; // window bounds. + private String DialogCurrentDirectory = null; + private String CurrentDirectoryPrefix = null; + private List recentOpenedFilePathList = new ArrayList(); + private boolean showPaintToolBar = true; + private int maxNumberOrPreviewRow = 200; + // name和Env的键值对 + private Map nameEnvMap = new ListMap(); + // marks: 当前报表服务器名字 + private String curEnvName = null; + private boolean showProjectPane = true; + private boolean showDataPane = true; + //p:这是当前选择的数据库连接的名字,这个在新建数据源的时候用到. + private String recentSelectedConnection = null; + // 设计器预览时的Jetty端口 + public int jettyServerPort = 8075; + // eason: + private boolean supportUndo = true; + private boolean supportDefaultParentCalculate = true; + //samuel:支持字符串编辑为公式 + private boolean supportStringToFormula = true; + private boolean defaultStringToFormula = false; + private String autoCompleteShortcuts = UIConstants.DEFAULT_AUTO_COMPLETE; + private boolean columnHeaderVisible = true; + private boolean rowHeaderVisible = true; + private boolean verticalScrollBarVisible = true; + private boolean horizontalScrollBarVisible = true; + private Color gridLineColor = Color.lightGray; // line color. + private Color paginationLineColor = Color.black; // line color of paper + private boolean supportCellEditorDef = false; + private boolean isDragPermited = false; + private int language; + //2014-8-26默认显示全部, 因为以前的版本, 虽然是false, 实际上是显示所有表, 因此这边要兼容 + private boolean useOracleSystemSpace = true; + private boolean autoBackUp = true; + private int undoLimit = 5; + private short pageLengthUnit = Constants.UNIT_MM; + private short reportLengthUnit = Constants.UNIT_MM; + private boolean templateTreePaneExpanded = false; + private String lastOpenFilePath = null; + + private int eastRegionToolPaneY = 300; + private int eastRegionContainerWidth = 260; + + private int westRegionToolPaneY = 300; + private int westRegionContainerWidth = 240; + private String encryptionKey; + private String jdkHome; + + //上一次登录弹窗的时间, 为了控制一天只弹一次窗口 + private String lastShowBBSTime; + //上一次资讯弹窗时间, 为了控制一天只弹一次 + private String lastShowBBSNewsTime; + //设计器的唯一ID, 用于远程设计和在线验证激活码 + private String uuid; + //记录当前激活码的在线激活状态. + private int activeKeyStatus = -1; + private boolean joinProductImprove = true; + + /** + * alphafine + */ + private AlphaFineConfigManager alphaFineConfigManager = new AlphaFineConfigManager(); + + + public static final String CAS_CERTIFICATE_PATH = "certificatePath"; + + public static final String CAS_CERTIFICATE_PASSWORD = "certificatePass"; + + public static final String CAS_PARAS = "CASParas"; + + //https链接所需的证书路径 + private String certificatePath = StringUtils.EMPTY; + + //https链接所需的证书密码 + private String certificatePass = StringUtils.EMPTY; + + //是否启用https连接 + private boolean isHttps = false; + + private static List mapWorkerList = new ArrayList(); + + /** + * DesignerEnvManager. + */ + public static DesignerEnvManager getEnvManager() { + return getEnvManager(true); + } + + public static DesignerEnvManager getEnvManager(boolean needCheckEnv) { + if (designerEnvManager == null) { + designerEnvManager = new DesignerEnvManager(); + try { + XMLTools.readFileXML(designerEnvManager, designerEnvManager.getDesignerEnvFile()); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + + // james:如果没有env定义,要设置一个默认的 + if (needCheckEnv) { + checkNameEnvMap(); + } + + GeneralContext.addEnvChangedListener(new EnvChangedListener() { + @Override + public void envChanged() { + + designerEnvManager.setCurrentDirectoryPrefix(FILEFactory.ENV_PREFIX); + designerEnvManager.setDialogCurrentDirectory(ProjectConstants.REPORTLETS_NAME); + } + }); + + } + + + return designerEnvManager; + } + + public static void checkNameEnvMap() { + if (designerEnvManager == null || designerEnvManager.nameEnvMap.size() > 0) { + return; + } + String installHome = StableUtils.getInstallHome(); + if (installHome != null) { + String name = Inter.getLocText("FR-Engine_DEFAULT"); + String envPath = StableUtils.pathJoin(new String[]{installHome, ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBINF_NAME}); + designerEnvManager.putEnv(name, LocalEnv.createEnv(envPath)); + designerEnvManager.setCurEnvName(name); + } + } + + /** + * 添加设计器中相关的worker + * + * @param worker 相关的worker + */ + public static void addWorkers(SwingWorker worker) { + mapWorkerList.add(worker); + } + + /** + * 删除设计器中相关的worker. + * + * @param worker 相关的worker + */ + public static void removeWorkers(SwingWorker worker) { + if (mapWorkerList.contains(worker)) { + mapWorkerList.remove(worker); + } + } + + /** + * 做完设计器中现存的地图worker + */ + public static void doEndMapSaveWorkersIndesign() { + for (int i = 0; i < mapWorkerList.size(); i++) { + SwingWorker worker = mapWorkerList.get(i); + if (worker.getState() != StateValue.DONE) { + worker.execute(); + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + FRLogger.getLogger().error("Map Save Error"); + } + } + } + } + + /** + * richer:载入log设置 + */ + public static void loadLogSetting() { + DesignerEnvManager designerEnvManager = DesignerEnvManager.getEnvManager(); + if (StringUtils.isNotEmpty(designerEnvManager.getJdkHome())) { + System.setProperty("java.home", designerEnvManager.getJdkHome()); + } + + // 写文件的LogLocation + String logLocation = DesignerEnvManager.getEnvManager().getLogLocation(); + if (logLocation != null) { + try { + Calendar calender = GregorianCalendar.getInstance(); + calender.setTimeInMillis(System.currentTimeMillis()); + String today = calender.get(Calendar.YEAR) + "-" + (calender.get(Calendar.MONTH) + 1) + "-" + calender.get(Calendar.DAY_OF_MONTH); + + String fileName = StableUtils.pathJoin(logLocation, "fr_" + today + "_%g.log"); + if (!new java.io.File(fileName).exists()) { + StableUtils.makesureFileExist(new java.io.File(fileName)); + } + Handler handler = new FileHandler(fileName, true); + + handler.setFormatter(new FRLogFormatter()); + FRContext.getLogger().addLogHandler(handler); + } catch (SecurityException e) { + FRContext.getLogger().error(e.getMessage(), e); + } catch (IOException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + } + } + + private File getDesignerEnvFile() { + File envFile = getEnvFile(); + // james:FineReportEnv.xml文件没有必要做兼容,里面保存的主要是界面布局以及设计器激活的信息 + // 对于这些内容,除了激活码以外,其他的兼容毫无意义。对于激活码,也可以不兼容,正好知道用户是否进行了升级呢 + // 对于自己升级的用户,正好知道有升级的用户呢。对于我们帮助升级的,给用户一个激活码就是啦 + if (!envFile.exists()) { + createEnvFile(envFile); + } + + return envFile; + } + + private void createEnvFile(File envFile) { + try { + FileWriter fileWriter = new FileWriter(envFile); + File oldEnvFile = new File(ProductConstants.getEnvHome() + File.separator + ProductConstants.APP_NAME + "6-1" + "Env.xml"); + File envFile80 = new File(getEnvHome(VERSION_80) + File.separator + getEnvFile().getName()); + if (oldEnvFile.exists()) { + // marks:兼容DesignerEnv6-1.xml + FileReader fileReader = new FileReader(oldEnvFile); + Utils.copyCharTo(fileReader, fileWriter); + fileReader.close(); + } else if (envFile80.exists()) { + compatibilityPrevVersion(envFile80); + } else { + // marks:生成一个新的xml文件 + StringReader stringReader = new StringReader(""); + Utils.copyCharTo(stringReader, fileWriter); + stringReader.close(); + } + fileWriter.close(); + } catch (IOException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + } + + private static String getEnvHome(String version) { + String userHome = System.getProperty("user.home"); + if (userHome == null) { + userHome = System.getProperty("userHome"); + } + + File envHome = new File(userHome + File.separator + "." + ProductConstants.APP_NAME + version); + if (!envHome.exists()) { + StableUtils.mkdirs(envHome); + } + + return envHome.getAbsolutePath(); + } + + private void compatibilityPrevVersion(File prevEnvFile) { + try { + XMLTools.readFileXML(designerEnvManager, prevEnvFile); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + // 清空前一个版本中的工作目录和最近打开 + nameEnvMap = new ListMap(); + recentOpenedFilePathList = new ArrayList(); + curEnvName = null; + designerEnvManager.saveXMLFile(); + } + + public static void setEnvFile(File envFile) { + DesignerEnvManager.envFile = envFile; + } + + private static File envFile = null; + + private File getEnvFile() { + if (envFile == null) { + envFile = new File(ProductConstants.getEnvHome() + File.separator + ProductConstants.APP_NAME + "Env.xml"); + } + return envFile; + } + + /** + * 是否启用了https + * + * @return 同上 + */ + public boolean isHttps() { + return isHttps; + } + + + public void setHttps(boolean isHttps) { + this.isHttps = isHttps; + } + + + public String getCertificatePath() { + return certificatePath; + } + + + public void setCertificatePath(String certificatePath) { + this.certificatePath = certificatePath; + } + + + public String getCertificatePass() { + return certificatePass; + } + + public void setCertificatePass(String certificatePass) { + this.certificatePass = certificatePass; + } + + /** + * 返回上次打开的模板文件 + */ + public String getLastOpenFile() { + return lastOpenFilePath; + } + + /** + * 设置记录 上次打开的模板文件 + */ + public void setLastOpenFile(String lastOpenFilePath) { + this.lastOpenFilePath = lastOpenFilePath; + } + + + /** + * 得到西面板的上下子面板的高度区分 + * + * @return + */ + public int getLastWestRegionToolPaneY() { + return this.westRegionToolPaneY; + } + + /** + * 得到上次关闭设计器时的西边面板的宽度 + * + * @return + */ + public int getLastWestRegionContainerWidth() { + return this.westRegionContainerWidth; + } + + /** + * 设置西面板的上下子面板的高度区分 + * + * @param toolPaneY + */ + public void setLastWestRegionToolPaneY(int toolPaneY) { + this.westRegionToolPaneY = toolPaneY; + } + + /** + * 设置上次关闭设计器时的西边面板的宽度 + * + * @param westRegionContainerWidth + */ + public void setLastWestRegionContainerWidth(int westRegionContainerWidth) { + this.westRegionContainerWidth = westRegionContainerWidth; + } + + + /** + * 得到上次关闭设计器前东部面板的上下子面板的高度区分 + * + * @return + */ + public int getLastEastRegionToolPaneY() { + return this.eastRegionToolPaneY; + } + + /** + * 得到上次关闭设计器前东部面板的宽度 + * + * @return + */ + public int getLastEastRegionContainerWidth() { + return this.eastRegionContainerWidth; + } + + /** + * 设置上次关闭设计器前东部面板的上下子面板的高度区分 + * + * @param toolPaneY + */ + public void setLastEastRegionToolPaneY(int toolPaneY) { + this.eastRegionToolPaneY = toolPaneY; + } + + /** + * 设置上次关闭设计器前东部面板的宽度 + * + * @param eastRegionContainerWidth + */ + public void setLastEastRegionContainerWidth(int eastRegionContainerWidth) { + this.eastRegionContainerWidth = eastRegionContainerWidth; + } + + + /** + * 判断当前环境是否为默认 + * + * @return 是默认则返回true + */ + public boolean isCurrentEnvDefault() { + Env currentEnv = this.getEnv(curEnvName); + String defaultEnvPath = StableUtils.pathJoin(new String[]{StableUtils.getInstallHome(), ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBINF_NAME}); + return ComparatorUtils.equals(new File(defaultEnvPath).getPath(), currentEnv.getPath()); + } + + /** + * 返回默认环境 + */ + public Env getDefaultEnv() { + String installHome = StableUtils.getInstallHome(); + String defaultenvPath = StableUtils.pathJoin(new String[]{installHome, ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBINF_NAME}); + defaultenvPath = new File(defaultenvPath).getPath(); + if (nameEnvMap.size() >= 0) { + Iterator> entryIt = nameEnvMap.entrySet().iterator(); + while (entryIt.hasNext()) { + Entry entry = entryIt.next(); + Env env = entry.getValue(); + if (ComparatorUtils.equals(defaultenvPath, env.getPath())) { + return env; + } + } + } + Env newDefaultEnv = LocalEnv.createEnv(defaultenvPath); + this.putEnv(Inter.getLocText(new String[]{"Default", "Utils-Report_Runtime_Env"}), newDefaultEnv); + return newDefaultEnv; + } + + /** + * 返回默认环境名称 + */ + public String getDefaultEnvName() { + String installHome = StableUtils.getInstallHome(); + String defaultenvPath = StableUtils.pathJoin(new String[]{installHome, ProjectConstants.WEBAPP_NAME, ProjectConstants.WEBINF_NAME}); + defaultenvPath = new File(defaultenvPath).getPath(); + if (nameEnvMap.size() >= 0) { + Iterator> entryIt = nameEnvMap.entrySet().iterator(); + while (entryIt.hasNext()) { + Entry entry = entryIt.next(); + Env env = entry.getValue(); + if (ComparatorUtils.equals(defaultenvPath, env.getPath())) { + return entry.getKey(); + } + } + } + return Inter.getLocText(new String[]{"Default", "Utils-Report_Runtime_Env"}); + } + + /** + * 设置当前环境为默认 + */ + public void setCurrentEnv2Default() { + if (isCurrentEnvDefault()) { + return; + } + try { + SignIn.signIn(getDefaultEnv()); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage()); + } + } + + /** + * 模板Tree是否展开 + * + * @return 展开则返回true + */ + public boolean isTemplateTreePaneExpanded() { + return templateTreePaneExpanded; + } + + /** + * 设置模板Tree是否展开 + */ + public void setTemplateTreePaneExpanded(boolean templateTreePaneExpanded) { + this.templateTreePaneExpanded = templateTreePaneExpanded; + } + + /** + * 知否自动备份 + * + * @return 是则返回true + */ + public boolean isAutoBackUp() { + return autoBackUp; + } + + /** + * 设置是否自动备份 + */ + public void setAutoBackUp(boolean autoBackUp) { + this.autoBackUp = autoBackUp; + } + + /** + * 返回页面长度单位 + */ + public short getPageLengthUnit() { + return pageLengthUnit; + } + + /** + * 设置页面长度单位 + */ + public void setPageLengthUnit(short pageLengthUnit) { + this.pageLengthUnit = pageLengthUnit; + } + + /** + * 返回报表长度单位 + */ + public short getReportLengthUnit() { + return reportLengthUnit; + } + + /** + * 设置报表长度单位 + */ + public void setReportLengthUnit(short reportLengthUnit) { + this.reportLengthUnit = reportLengthUnit; + } + + private void writeTempFile(File tempFile) { + try { + OutputStream fout = new FileOutputStream(tempFile); + XMLTools.writeOutputStreamXML(this, fout); + fout.flush(); + fout.close(); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage()); + } + } + + /** + * 保存设计器的配置文件, 该文件不在env的resource目录下 + * 而是在Consts.getEnvHome() + File.separator + Consts.APP_NAME + * + * @date 2014-9-29-上午11:04:23 + */ + public void saveXMLFile() { + File xmlFile = this.getDesignerEnvFile(); + if (xmlFile == null) { + return; + } + if (!xmlFile.getParentFile().exists()) {//建立目录. + StableUtils.mkdirs(xmlFile.getParentFile()); + } + + String tempName = xmlFile.getName() + ProjectConstants.TEMP_SUFFIX; + File tempFile = new File(xmlFile.getParentFile(), tempName); + + writeTempFile(tempFile); + IOUtils.renameTo(tempFile, xmlFile); + } + + /** + * 设置是否使用磁盘空间 + */ + public void setOracleSystemSpace(boolean displayOracleSystem) { + this.useOracleSystemSpace = displayOracleSystem; + } + + /** + * 是否加入产品改良 + * + * @return 是否加入产品改良 + */ + public boolean isJoinProductImprove() { + return joinProductImprove; + } + + /** + * 设置加入产品改良 + */ + public void setJoinProductImprove(boolean joinProductImprove) { + this.joinProductImprove = joinProductImprove; + } + + /** + * 是否磁盘空间参数 + * + * @return 是则返回true + */ + public boolean isOracleSystemSpace() { + return this.useOracleSystemSpace; + } + + /** + * 返回语言类型 + */ + public int getLanguage() { + return this.language; + } + + /** + * 设置语言参数 + */ + public void setLanguage(int i) { + this.language = i; + } + + /** + * 返回环境名称迭代器 + */ + public Iterator getEnvNameIterator() { + return this.nameEnvMap.keySet().iterator(); + } + + /** + * 根据名称返回环境 + */ + public Env getEnv(String name) { + return this.nameEnvMap.get(name); + } + + /** + * 记录名称 和对应的环境 + * + * @param name 名称 + * @param env 对应的环境 + */ + public void putEnv(String name, Env env) { + this.nameEnvMap.put(name, env); + } + + /** + * 删除名称对应的环境 + * + * @param name 环境的名字 + */ + public void removeEnv(String name) { + this.nameEnvMap.remove(name); + } + + /** + * 清除全部环境 + */ + public void clearAllEnv() { + this.nameEnvMap.clear(); + } + + /** + * 返回界面的大小范围. + */ + public Rectangle getWindowBounds() { + return this.windowBounds; + } + + /** + * 设置界面的大小范围 + */ + public void setWindowBounds(Rectangle windowBounds) { + this.windowBounds = windowBounds; + } + + + /** + * 返回当前环境的名称. + */ + public String getCurEnvName() { + return this.curEnvName; + } + + /** + * 设置当前环境的名称 + */ + public void setCurEnvName(String envName) { + this.curEnvName = envName; + } + + /** + * 返回Jetty服务器的端口号 + */ + public int getJettyServerPort() { + return this.jettyServerPort; + } + + /** + * 设置Jetty服务器的端口号 + */ + public void setJettyServerPort(int jettyServerPort) { + if (jettyServerPort <= 0) { + return; + } + this.jettyServerPort = jettyServerPort; + } + + /** + * 返回对话框当前路径 + */ + public String getDialogCurrentDirectory() { + return DialogCurrentDirectory; + } + + /** + * 设置当前对话框路径 + */ + public void setDialogCurrentDirectory(String dialogCurrentDirectory) { + this.DialogCurrentDirectory = dialogCurrentDirectory; + } + + /** + * 返回当前路径前缀 + */ + public String getCurrentDirectoryPrefix() { + return CurrentDirectoryPrefix; + } + + /** + * 设置当前路径前缀 + */ + public void setCurrentDirectoryPrefix(String prefix) { + this.CurrentDirectoryPrefix = prefix; + } + + + /** + * 返回最近打开的文件路径列表 + */ + public List getRecentOpenedFilePathList() { + return this.recentOpenedFilePathList; + } + + /** + * 添加最近打开的文件路径 + * + * @param filePath 文件路径 + */ + public void addRecentOpenedFilePath(String filePath) { + // 先删除. + if (this.recentOpenedFilePathList.contains(filePath)) { + this.recentOpenedFilePathList.remove(filePath); + } + + this.recentOpenedFilePathList.add(0, filePath); + checkRecentOpenedFileNum(); + } + + /** + * 替换近期打开的文件路径 + * + * @param oldPath 旧的路径 + * @param newPath 新的路径 + */ + public void replaceRecentOpenedFilePath(String oldPath, String newPath) { + if (this.recentOpenedFilePathList.contains(oldPath)) { + int index = recentOpenedFilePathList.indexOf(oldPath); + this.recentOpenedFilePathList.remove(oldPath); + this.recentOpenedFilePathList.add(index, newPath); + } + } + + private void checkRecentOpenedFileNum() { + if (this.recentOpenedFilePathList == null) { + return; + } + while (this.recentOpenedFilePathList.size() > MAX_SHOW_NUM) { + this.recentOpenedFilePathList.remove(this.recentOpenedFilePathList.size() - 1); + } + } + + /** + * 移除最近打开的文件路径 + * + * @param filePath 文件路径 + */ + public void removeRecentOpenedFilePath(String filePath) { + if (this.recentOpenedFilePathList.contains(filePath)) { + this.recentOpenedFilePathList.remove(filePath); + } + } + + + /** + * 是否展示toolbar + * + * @return 是则返回true + */ + public boolean isShowPaintToolBar() { + return showPaintToolBar; + } + + /** + * 设置是否展示toolbar + */ + public void setShowPaintToolBar(boolean showPaintToolBar) { + this.showPaintToolBar = showPaintToolBar; + } + + /** + * 是否支持撤销 + * + * @return 是则返回true + */ + public boolean isSupportUndo() { + return supportUndo; + } + + /** + * 设置是否支持撤销 + */ + public void setSupportUndo(boolean supportUndo) { + this.supportUndo = supportUndo; + } + + /** + * 是否支持默认父类计算 + * + * @return 是则返回true + */ + public boolean isSupportDefaultParentCalculate() { + return supportDefaultParentCalculate; + } + + /** + * 设置是否支持默认父类计算 + */ + public void setSupportDefaultParentCalculate(boolean supportDefaultParentCalculate) { + this.supportDefaultParentCalculate = supportDefaultParentCalculate; + } + + /** + * 设置是否支持字符串转为公式 + * + * @return 支持则返回true + */ + public boolean isSupportStringToFormula() { + return supportStringToFormula; + } + + /** + * 设置是否支持字符串转为公式 + */ + public void setSupportStringToFormula(boolean supportStringToFormula) { + this.supportStringToFormula = supportStringToFormula; + } + + /** + * 是否默认字符串转为公式 + * + * @return 是则返回true + */ + public boolean isDefaultStringToFormula() { + return defaultStringToFormula; + } + + /** + * 设置是否支持字符串转为公式 + */ + public void setDefaultStringToFormula(boolean defaultStringToFormula) { + this.defaultStringToFormula = defaultStringToFormula; + } + + /** + * 获取快捷键名称 + */ + public String getAutoCompleteShortcuts() { + return autoCompleteShortcuts; + } + + /** + * 设置快捷键名称 + */ + public void setAutoCompleteShortcuts(String autoCompleteShortcuts) { + this.autoCompleteShortcuts = autoCompleteShortcuts; + } + + + /** + * 列表头是否可见 + * + * @return 是则返回true + */ + public boolean isColumnHeaderVisible() { + return columnHeaderVisible; + } + + /** + * 设置列表头是否可见 + */ + public void setColumnHeaderVisible(boolean columnHeaderVisible) { + this.columnHeaderVisible = columnHeaderVisible; + } + + /** + * 行表头是否可见 + * + * @return 是则返回true + */ + public boolean isRowHeaderVisible() { + return rowHeaderVisible; + } + + /** + * 设置行表头是否可见 + */ + public void setRowHeaderVisible(boolean rowHeaderVisible) { + this.rowHeaderVisible = rowHeaderVisible; + } + + /** + * 垂直滚动条是否可见 + * + * @return 是则返回true + */ + public boolean isVerticalScrollBarVisible() { + return verticalScrollBarVisible; + } + + /** + * 设置垂直滚动条可见 + */ + public void setVerticalScrollBarVisible(boolean verticalScrollBarVisible) { + this.verticalScrollBarVisible = verticalScrollBarVisible; + } + + /** + * 水平滚动条是否可见 + * + * @return 是则返回true + */ + public boolean isHorizontalScrollBarVisible() { + return horizontalScrollBarVisible; + } + + /** + * 设置水平滚动条是否可见 + */ + public void setHorizontalScrollBarVisible(boolean horizontalScrollBarVisible) { + this.horizontalScrollBarVisible = horizontalScrollBarVisible; + } + + /** + * 返回网格线的颜色 + */ + public Color getGridLineColor() { + return gridLineColor; + } + + /** + * 设置网格线的颜色 + */ + public void setGridLineColor(Color gridLineColor) { + this.gridLineColor = gridLineColor; + } + + /** + * 返回页面的线颜色 + */ + public Color getPaginationLineColor() { + return paginationLineColor; + } + + /** + * 设置页面的线颜色 + */ + public void setPaginationLineColor(Color paginationLineColor) { + this.paginationLineColor = paginationLineColor; + + } + + /** + * 是否支持单元格编辑器 + * + * @return 是则返回true + */ + public boolean isSupportCellEditorDef() { + return supportCellEditorDef; + } + + /** + * 设置是否支持单元格编辑器 + */ + public void setSupportCellEditorDef(boolean supportCellEditorDef) { + this.supportCellEditorDef = supportCellEditorDef; + } + + /** + * 是否允许拖拽 + * + * @return 是则返回true + */ + public boolean isDragPermited() { + return isDragPermited; + } + + /** + * 设置是否允许拖拽 + */ + public void setDragPermited(boolean isDragPermited) { + this.isDragPermited = isDragPermited; + } + + /** + * 返回最大预览的行数 + */ + public int getMaxNumberOrPreviewRow() { + return maxNumberOrPreviewRow; + } + + /** + * 设置最大预览的行数 + */ + public void setMaxNumberOrPreviewRow(int maxNumberOrPreviewRow) { + this.maxNumberOrPreviewRow = maxNumberOrPreviewRow; + } + + /** + * 是否展示工程界面 + * + * @return 是则返回true + */ + public boolean isShowProjectPane() { + return showProjectPane; + } + + /** + * 设置是否显示工程界面. + */ + public void setShowProjectPane(boolean showProjectPane) { + this.showProjectPane = showProjectPane; + } + + /** + * 是否展示数据界面 + * + * @return 是则返回true + */ + public boolean isShowDataPane() { + return showDataPane; + } + + /** + * 设置是否显示数据界面 + */ + public void setShowDataPane(boolean showDataPane) { + this.showDataPane = showDataPane; + } + + /** + * 返回最近选择的链接 + */ + public String getRecentSelectedConnection() { + return recentSelectedConnection; + } + + /** + * 设置最近选择的链接 + */ + public void setRecentSelectedConnection(String recentlySelectedConnectionName) { + this.recentSelectedConnection = recentlySelectedConnectionName; + } + + /** + * 返回激活码 + */ + public String getActivationKey() { + return activationKey; + } + + /** + * 设置激活码 + */ + public void setActivationKey(String activationKey) { + this.activationKey = activationKey; + } + + /** + * 返回Log的位置 + */ + public String getLogLocation() { + return logLocation; + } + + /** + * 设置Log的位置 + */ + public void setLogLocation(String logsLocation) { + this.logLocation = logsLocation; + } + + /** + * 设置撤销的限制次数 + */ + public void setUndoLimit(int undoLimit) { + this.undoLimit = undoLimit; + } + + /** + * 返回撤销的限制次数 + */ + public int getUndoLimit() { + return undoLimit; + } + + public String getEncryptionKey() { + return encryptionKey; + } + + public void setEncryptionKey(String encryptionKey) { + this.encryptionKey = encryptionKey; + } + + public String getJdkHome() { + return this.jdkHome; + } + + public void setJdkHome(String home) { + this.jdkHome = home; + } + + + public String getLastShowBBSTime() { + return lastShowBBSTime; + } + + public void setLastShowBBSTime(String lastShowBBSTime) { + this.lastShowBBSTime = lastShowBBSTime; + } + + public String getLastShowBBSNewsTime() { + return lastShowBBSNewsTime; + } + + public void setLastShowBBSNewsTime(String lastShowBBSNewsTime) { + this.lastShowBBSNewsTime = lastShowBBSNewsTime; + } + + private void readXMLVersion(XMLableReader reader) { + String tmpVal; + if ((tmpVal = reader.getElementValue()) != null) { + reader.setXmlVersionByString(tmpVal); + } + } + + private void readActiveKey(XMLableReader reader) { + String tmpVal; + if ((tmpVal = reader.getElementValue()) != null) { + this.setActivationKey(tmpVal); + } + } + + private void readLogLocation(XMLableReader reader) { + String tmpVal; + if ((tmpVal = reader.getElementValue()) != null) { + this.setLogLocation(tmpVal); + } + } + + private void readLanguage(XMLableReader reader) { + String tmpVal; + if ((tmpVal = reader.getElementValue()) != null) { + this.setLanguage(Integer.parseInt(tmpVal)); + } + } + + private void readJettyPort(XMLableReader reader) { + String tmpVal; + if ((tmpVal = reader.getElementValue()) != null) { + this.setJettyServerPort(Integer.parseInt(tmpVal)); + } + } + + private void readPageLengthUnit(XMLableReader reader) { + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.pageLengthUnit = Short.parseShort(tmpVal); + } + } + + private void readReportLengthUnit(XMLableReader reader) { + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.reportLengthUnit = Short.parseShort(tmpVal); + } + } + + private void readLastOpenFile(XMLableReader reader) { + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.lastOpenFilePath = tmpVal; + } + } + + private void readEncrytionKey(XMLableReader reader) { + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.encryptionKey = tmpVal; + } + } + + + private void readLastBBSTime(XMLableReader reader) { + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.lastShowBBSTime = tmpVal; + } + } + + private void readLastBBSNewsTime(XMLableReader reader) { + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.lastShowBBSNewsTime = tmpVal; + } + } + + /** + * Read XML.
+ * The method will be invoked when read data from XML file.
+ * May override the method to read the data that you saved. + * + * @param reader the reader. + */ + @Override + public void readXML(XMLableReader reader) { + if (reader.isChildNode()) { + String name = reader.getTagName(); + if (name.equals("XMLVersion")) {// 兼容09.12.30前把XMLVersion写在根目录下的第一个标签中 + readXMLVersion(reader); + } else if (name.equals("Attributes")) { + this.readAttributes(reader); + } else if (name.equals("ReportPaneAttributions")) { + this.readReportPaneAttributions(reader); + } else if ("RecentOpenedFilePathList".equals(name) || "ResentOpenedFilePathList".equals(name)) { + this.readRecentOpenFileList(reader); + } else if ("Envs".equals(name) || name.equals("ReportServerMap")) { + this.readCurEnv(reader); + } else if (name.equals("ActivationKey")) { + readActiveKey(reader); + } else if ("LogLocation".equals(name)) { + readLogLocation(reader); + } else if ("Language".equals(name)) { + readLanguage(reader); + } else if ("JettyServerPort".equals(name)) { + readJettyPort(reader); + } else if ("PLengthUnit".equals(name)) { + readPageLengthUnit(reader); + } else if ("RLengthUnit".equals(name)) { + readReportLengthUnit(reader); + } else if ("LastOpenFilePath".equals(name)) { + readLastOpenFile(reader); + } else if ("EncryptionKey".equals(name)) { + readEncrytionKey(reader); + } else if ("jdkHome".equals(name)) { + this.jdkHome = reader.getElementValue(); + } else if ("lastBBSTime".equals(name)) { + readLastBBSTime(reader); + } else if ("lastBBSNewsTime".equals(name)) { + readLastBBSNewsTime(reader); + } else if ("uuid".equals(name)) { + readUUID(reader); + } else if ("status".equals(name)) { + readActiveStatus(reader); + } else if (ComparatorUtils.equals(CAS_PARAS, name)) { + readHttpsParas(reader); + } else if (name.equals("AlphaFineConfigManager")) { + readAlphaFineAttr(reader); + } else { + readLayout(reader, name); + } + } + } + + private void readAlphaFineAttr(XMLableReader reader) { + reader.readXMLObject(this.alphaFineConfigManager = new AlphaFineConfigManager()); + } + + private void readHttpsParas(XMLableReader reader) { + String tempVal; + if ((tempVal = reader.getAttrAsString(CAS_CERTIFICATE_PATH, null)) != null) { + this.setCertificatePath(tempVal); + } + if ((tempVal = reader.getAttrAsString(CAS_CERTIFICATE_PASSWORD, null)) != null) { + this.setCertificatePass(tempVal); + } + + this.setHttps(reader.getAttrAsBoolean("enable", false)); + } + + + private void readLayout(XMLableReader reader, String name) { + if ("LastEastRegionLayout".equals(name)) { + this.readLastEastRegionLayout(reader); + } else if ("LastWestRegionLayout".equals(name)) { + this.readLastWestRegionLayout(reader); + } + } + + private void readLastEastRegionLayout(XMLableReader reader) { + String tmpVal; + if ((tmpVal = reader.getAttrAsString("toolPaneY", null)) != null) { + this.setLastEastRegionToolPaneY(Integer.parseInt(tmpVal)); + } + if ((tmpVal = reader.getAttrAsString("containerWidth", null)) != null) { + // bug33217,705是好的,不知道711里因为什么把这段代码注释了,现打开 + this.setLastEastRegionContainerWidth(Integer.parseInt(tmpVal)); + } + } + + private void readLastWestRegionLayout(XMLableReader reader) { + String tmpVal; + if ((tmpVal = reader.getAttrAsString("toolPaneY", null)) != null) { + this.setLastWestRegionToolPaneY(Integer.parseInt(tmpVal)); + } + if ((tmpVal = reader.getAttrAsString("containerWidth", null)) != null) { + this.setLastWestRegionContainerWidth(Integer.parseInt(tmpVal)); + } + } + + + private void readAttributes(XMLableReader reader) { + String tmpVal; + if ((tmpVal = reader.getAttrAsString("windowBounds", null)) != null) { + this.setWindowBounds(BaseXMLUtils.readRectangle(tmpVal)); + } + if ((tmpVal = reader.getAttrAsString("DialogCurrentDirectory", null)) != null) { + this.setDialogCurrentDirectory(tmpVal); + } + if ((tmpVal = reader.getAttrAsString("CurrentDirectoryPrefix", null)) != null) { + this.setCurrentDirectoryPrefix(tmpVal); + } + this.setShowPaintToolBar(reader.getAttrAsBoolean("showPaintToolBar", true)); + this.setMaxNumberOrPreviewRow(reader.getAttrAsInt("maxNumberOrPreviewRow", 200)); + + this.setOracleSystemSpace(reader.getAttrAsBoolean("useOracleSystemSpace", true)); + this.setJoinProductImprove(reader.getAttrAsBoolean("joinProductImprove", true)); + this.setAutoBackUp(reader.getAttrAsBoolean("autoBackUp", true)); + this.setTemplateTreePaneExpanded(reader.getAttrAsBoolean("templateTreePaneExpanded", false)); + // peter:读取webinfLocation + if ((tmpVal = reader.getAttrAsString("webinfLocation", null)) != null) { + // marks:兼容6.1的 + // marks:设置默认的目录. + Env reportServer = LocalEnv.createEnv(tmpVal); + + String curReportServerName = Inter.getLocText("Server-Embedded_Server"); + this.putEnv(curReportServerName, reportServer); + this.setCurEnvName(curReportServerName); + } + + this.setShowProjectPane(reader.getAttrAsBoolean("showProjectPane", true)); + this.setShowDataPane(reader.getAttrAsBoolean("showDataPane", true)); + + if ((tmpVal = reader.getAttrAsString("recentSelectedConnection", null)) != null) { + this.setRecentSelectedConnection(tmpVal); + } + } + + private void readReportPaneAttributions(XMLableReader reader) { + String tmpVal; + this.setSupportUndo(reader.getAttrAsBoolean("supportUndo", true)); + this.setSupportDefaultParentCalculate(reader.getAttrAsBoolean("supportDefaultParentCalculate", true)); + this.setSupportStringToFormula(reader.getAttrAsBoolean("supportStringToFormula", true)); + this.setColumnHeaderVisible(reader.getAttrAsBoolean("columnHeaderVisible", true)); + this.setAutoCompleteShortcuts(reader.getAttrAsString("autoCompleteShortcuts", UIConstants.DEFAULT_AUTO_COMPLETE)); + this.setRowHeaderVisible(reader.getAttrAsBoolean("rowHeaderVisible", true)); + this.setVerticalScrollBarVisible(reader.getAttrAsBoolean("verticalScrollBarVisible", true)); + this.setHorizontalScrollBarVisible(reader.getAttrAsBoolean("horizontalScrollBarVisible", true)); + this.setSupportCellEditorDef(reader.getAttrAsBoolean("supportCellEditorDef", false)); + this.setDragPermited(reader.getAttrAsBoolean("isDragPermited", false)); + this.setUndoLimit(reader.getAttrAsInt("undoLimit", 5)); + this.setDefaultStringToFormula(reader.getAttrAsBoolean("defaultStringToFormula", false)); + if ((tmpVal = reader.getAttrAsString("gridLineColor", null)) != null) { + this.setGridLineColor(new Color(Integer.parseInt(tmpVal))); + } + if ((tmpVal = reader.getAttrAsString("paginationLineColor", null)) != null) { + this.setPaginationLineColor(new Color(Integer.parseInt(tmpVal))); + } + } + + private void readCurEnv(XMLableReader reader) { + String tmpVal; + // marks:设置默认的webInf名字 + if ((tmpVal = reader.getAttrAsString("currentEnv", null)) != null) { + this.setCurEnvName(tmpVal); + } + + reader.readXMLObject(new XMLReadable() { + + @Override + public void readXML(XMLableReader reader) { + if (reader.isAttr()) { + DesignerEnvManager.this.clearAllEnv(); + } + + if (reader.isChildNode()) { + if (reader.getTagName().equals("Env")) { // description. + // marks:获取名字 + String reportServerName = reader.getAttrAsString("name", null); + + Env env = readEnv(reader); + if (env == null) { + return; + } + + DesignerEnvManager.this.putEnv(reportServerName, env); + } + } + } + }); + } + + private void readRecentOpenFileList(XMLableReader reader) { + reader.readXMLObject(new XMLReadable() { + + @Override + public void readXML(XMLableReader reader) { + if (reader.isAttr()) { + DesignerEnvManager.this.recentOpenedFilePathList.clear(); + } + + if (reader.isChildNode()) { + String tmpVal; + String name = reader.getTagName(); + // alex:以前一直是写ResentOpenedFilePath + if ("ResentOpenedFilePath".equals(name) || "Path".equals(name)) { // description. + if ((tmpVal = reader.getElementValue()) != null) { + DesignerEnvManager.this.recentOpenedFilePathList.add(tmpVal); + } + } + } + } + }); + checkRecentOpenedFileNum(); + } + + /** + * Write XML.
+ * The method will be invoked when save data to XML file.
+ * May override the method to save your own data. + * + * @param writer the PrintWriter. + */ + @Override + public void writeXML(XMLPrintWriter writer) { + writer.startTAG("Designer"); + + writeAttrues(writer); + writeReportPaneAttributions(writer); + writeRecentOpenFileAndEnvList(writer); + writeSomeAttr(writer); + writeLastEastRegionLayout(writer); + writeLastWestRegionLayout(writer); + writeUUID(writer); + writeActiveStatus(writer); + writeHttpsParas(writer); + writeAlphaFineAttr(writer); + writer.end(); + } + + private void writeAlphaFineAttr(XMLPrintWriter writer) { + if (this.alphaFineConfigManager != null) { + this.alphaFineConfigManager.writeXML(writer); + } + } + + public String getUUID() { + return StringUtils.isEmpty(uuid) ? UUID.randomUUID().toString() : uuid; + } + + public int getActiveKeyStatus() { + return activeKeyStatus; + } + + public void setActiveKeyStatus(int activeKeyStatus) { + this.activeKeyStatus = activeKeyStatus; + } + + //写入uuid + private void writeUUID(XMLPrintWriter writer) { + writer.startTAG("uuid"); + writer.textNode(getUUID()); + writer.end(); + } + + //读取uuid + private void readUUID(XMLableReader reader) { + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.uuid = tmpVal; + } + } + + //写入激活状态 + private void writeActiveStatus(XMLPrintWriter writer) { + if (this.activeKeyStatus == 0) { + writer.startTAG("status"); + writer.textNode(this.activeKeyStatus + ""); + writer.end(); + } + } + + //读取激活状态 + private void readActiveStatus(XMLableReader reader) { + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.activeKeyStatus = Integer.parseInt(tmpVal); + } + } + + private void writeRecentOpenFileAndEnvList(XMLPrintWriter writer) { + checkRecentOpenedFileNum(); + writer.startTAG("RecentOpenedFilePathList"); + int resentOpenedFilePathCount = Math.min(12, this.recentOpenedFilePathList.size()); + for (int i = 0; i < resentOpenedFilePathCount; i++) { + writer.startTAG("Path").textNode(recentOpenedFilePathList.get(i)).end(); + } + writer.end(); + + writer.startTAG("Envs"); + if (this.curEnvName != null) { + writer.attr("currentEnv", this.curEnvName); + } + Iterator nameIt = this.getEnvNameIterator(); + while (nameIt.hasNext()) { + String envName = nameIt.next(); + Env env = this.getEnv(envName); + + writeEnv(writer, envName, env); + } + + writer.end(); + } + + private void writeAttrues(XMLPrintWriter writer) { + writer.startTAG("Attributes"); + if (this.getWindowBounds() != null) { + writer.attr("windowBounds", BaseXMLUtils.getRectangleText(this.getWindowBounds())); + } + // Open directory. + if (this.getDialogCurrentDirectory() != null) { + writer.attr("DialogCurrentDirectory", this.getDialogCurrentDirectory()); + } + if (this.getCurrentDirectoryPrefix() != null) { + writer.attr("CurrentDirectoryPrefix", this.getCurrentDirectoryPrefix()); + } + writer.attr("showPaintToolBar", this.isShowPaintToolBar()) + .attr("maxNumberOrPreviewRow", this.getMaxNumberOrPreviewRow()) + .attr("showProjectPane", this.isShowProjectPane()) + .attr("showDataPane", this.isShowDataPane()); + if (StringUtils.isNotBlank(this.getRecentSelectedConnection())) { + writer.attr("recentSelectedConnection", this.getRecentSelectedConnection()); + } + if (!this.isOracleSystemSpace()) { + writer.attr("useOracleSystemSpace", this.isOracleSystemSpace()); + } + if (!this.isJoinProductImprove()) { + writer.attr("joinProductImprove", this.isJoinProductImprove()); + } + if (!this.isAutoBackUp()) { + writer.attr("autoBackUp", this.isAutoBackUp()); + } + if (this.isTemplateTreePaneExpanded()) { + writer.attr("templateTreePaneExpanded", this.isTemplateTreePaneExpanded()); + } + writer.end(); + } + + + private void writeLastEastRegionLayout(XMLPrintWriter writer) { + writer.startTAG("LastEastRegionLayout"); + if (this.getLastEastRegionToolPaneY() >= 0) { + writer.attr("toolPaneY ", this.getLastEastRegionToolPaneY()); + } + if (this.getLastEastRegionContainerWidth() >= 0) { + writer.attr("containerWidth", this.getLastEastRegionContainerWidth()); + } + writer.end(); + } + + private void writeLastWestRegionLayout(XMLPrintWriter writer) { + writer.startTAG("LastWestRegionLayout"); + if (this.getLastWestRegionToolPaneY() >= 0) { + writer.attr("toolPaneY ", this.getLastWestRegionToolPaneY()); + } + if (this.getLastWestRegionContainerWidth() >= 0) { + writer.attr("containerWidth", this.getLastWestRegionContainerWidth()); + } + writer.end(); + } + + + private void writeSomeAttr(XMLPrintWriter writer) { + if (this.activationKey != null) { + writer.startTAG("ActivationKey"); + writer.textNode(this.getActivationKey()); + writer.end(); + } + + if (this.encryptionKey != null && (!this.encryptionKey.equals(""))) { + writer.startTAG("EncryptionKey"); + writer.textNode(this.getEncryptionKey()); + writer.end(); + } + + if (this.logLocation != null && this.logLocation.length() > 0) { + writer.startTAG("LogLocation"); + writer.textNode(this.logLocation); + writer.end(); + } + + if (StringUtils.isNotBlank(jdkHome)) { + writer.startTAG("jdkHome"); + writer.textNode(jdkHome); + writer.end(); + } + + writeBBSRelated(writer); + + writer.startTAG("PLengthUnit"); + writer.textNode("" + this.pageLengthUnit); + writer.end(); + + writer.startTAG("RLengthUnit"); + writer.textNode("" + this.reportLengthUnit); + writer.end(); + + writer.startTAG("LastOpenFilePath"); + writer.textNode("" + this.lastOpenFilePath); + writer.end(); + + writer.startTAG("Language").textNode(String.valueOf(this.language)).end() + .startTAG("JettyServerPort").textNode(String.valueOf(this.jettyServerPort)).end(); + } + + //写论坛相关的两个属性 + private void writeBBSRelated(XMLPrintWriter writer) { + if (StringUtils.isNotEmpty(this.lastShowBBSTime)) { + writer.startTAG("lastBBSTime"); + writer.textNode(lastShowBBSTime); + writer.end(); + } + + if (StringUtils.isNotEmpty(this.lastShowBBSNewsTime)) { + writer.startTAG("lastBBSNewsTime"); + writer.textNode(lastShowBBSNewsTime); + writer.end(); + } + } + + private void writeHttpsParas(XMLPrintWriter writer) { + writer.startTAG(CAS_PARAS); + if (StringUtils.isNotBlank(certificatePath)) { + writer.attr(CAS_CERTIFICATE_PATH, certificatePath); + } + if (StringUtils.isNotBlank(certificatePass)) { + writer.attr(CAS_CERTIFICATE_PASSWORD, certificatePass); + } + if (isHttps) { + writer.attr("enable", true); + } + writer.end(); + } + + private void writeReportPaneAttributions(XMLPrintWriter writer) { + // eason: ReportPaneAttributions报表支持的 一些功能和Grid的GUI属性等等 + writer.startTAG("ReportPaneAttributions") + .attr("supportUndo", this.isSupportUndo()) + .attr("supportDefaultParentCalculate", this.isSupportDefaultParentCalculate()) + .attr("supportStringToFormula", this.isSupportStringToFormula()) + .attr("defaultStringToFormula", this.isDefaultStringToFormula()) + .attr("columnHeaderVisible", this.isColumnHeaderVisible()) + .attr("autoCompleteShortcuts", this.getAutoCompleteShortcuts()) + .attr("rowHeaderVisible", this.isRowHeaderVisible()) + .attr("verticalScrollBarVisible", this.isVerticalScrollBarVisible()) + .attr("horizontalScrollBarVisible", this.isHorizontalScrollBarVisible()) + .attr("supportCellEditorDef", this.isSupportCellEditorDef()) + .attr("isDragPermited", this.isDragPermited()) + .attr("gridLineColor", this.getGridLineColor().getRGB()) + .attr("paginationLineColor", this.getPaginationLineColor().getRGB()) + .attr("undoLimit", this.getUndoLimit()) + .end(); + } + + /* + * 写Env为xml + */ + private static void writeEnv(XMLPrintWriter writer, String name, Env env) { + if (env == null) { + return; + } + + writer.startTAG("Env"); + writer.classAttr(env.getClass()); + writer.attr("name", name); + + env.writeXML(writer); + + writer.end(); + } + + /* + * 从xml读Env + */ + private static Env readEnv(XMLableReader reader) { + Env env = null; + + String tmpVal; //temp value + if ((tmpVal = reader.getAttrAsString("class", null)) != null) { + if (tmpVal.endsWith(".LocalEnv")) { + env = LocalEnv.createEnv(); + } else if (tmpVal.endsWith(".RemoteEnv")) { + env = new RemoteEnv(); + } + } + + if (env == null) { + return env; + } + + reader.readXMLObject(env); + + return env; + } + + public AlphaFineConfigManager getAlphaFineConfigManager() { + return alphaFineConfigManager; + } + + public void setAlphaFineConfigManager(AlphaFineConfigManager alphaFineConfigManager) { + this.alphaFineConfigManager = alphaFineConfigManager; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/Exception/ValidationException.java b/designer-base/src/com/fr/design/Exception/ValidationException.java new file mode 100644 index 0000000000..caf9cfb7cb --- /dev/null +++ b/designer-base/src/com/fr/design/Exception/ValidationException.java @@ -0,0 +1,11 @@ +package com.fr.design.Exception; + +public class ValidationException extends Exception { + + public ValidationException() { + } + + public ValidationException(String msg) { + super(msg); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/ExtraDesignClassManager.java b/designer-base/src/com/fr/design/ExtraDesignClassManager.java similarity index 100% rename from designer_base/src/com/fr/design/ExtraDesignClassManager.java rename to designer-base/src/com/fr/design/ExtraDesignClassManager.java diff --git a/designer_base/src/com/fr/design/RestartHelper.java b/designer-base/src/com/fr/design/RestartHelper.java similarity index 100% rename from designer_base/src/com/fr/design/RestartHelper.java rename to designer-base/src/com/fr/design/RestartHelper.java diff --git a/designer_base/src/com/fr/design/actions/AllowAuthorityEditAction.java b/designer-base/src/com/fr/design/actions/AllowAuthorityEditAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/AllowAuthorityEditAction.java rename to designer-base/src/com/fr/design/actions/AllowAuthorityEditAction.java diff --git a/designer-base/src/com/fr/design/actions/CheckBoxAction.java b/designer-base/src/com/fr/design/actions/CheckBoxAction.java new file mode 100644 index 0000000000..ef7a54ddeb --- /dev/null +++ b/designer-base/src/com/fr/design/actions/CheckBoxAction.java @@ -0,0 +1,41 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions; + +import javax.swing.JCheckBoxMenuItem; + +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.imenu.UICheckBoxMenuItem; + +/** + * check box + */ +public abstract class CheckBoxAction extends UpdateAction { + public UICheckBoxMenuItem createMenuItem() { + Object object = this.getValue(UICheckBoxMenuItem.class.getName()); + if (object == null) { + object = createCheckBoxMenuItem(this); + this.putValue(UICheckBoxMenuItem.class.getName(), object); + } + + // isSelected. + ((JCheckBoxMenuItem) object).setSelected(this.isSelected()); + + return (UICheckBoxMenuItem) object; + } + + + + public abstract boolean isSelected(); + + + public boolean isRadioSelect() { + return false; + } + + public void setSelected(boolean isSelected) { + UIButton button = (UIButton) this.createToolBarComponent(); + button.setSelected(isSelected); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/ExitAuthorityEditAction.java b/designer-base/src/com/fr/design/actions/ExitAuthorityEditAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/ExitAuthorityEditAction.java rename to designer-base/src/com/fr/design/actions/ExitAuthorityEditAction.java diff --git a/designer-base/src/com/fr/design/actions/HyperlinkPluginAction.java b/designer-base/src/com/fr/design/actions/HyperlinkPluginAction.java new file mode 100644 index 0000000000..443e091701 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/HyperlinkPluginAction.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.actions; + +import com.fr.design.gui.controlpane.NameObjectCreator; + +import java.awt.event.ActionEvent; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-26 + * Time: 上午10:47 + */ +public abstract class HyperlinkPluginAction extends UpdateAction { + public static final String XML_TAG = "hyperlinkType"; + + public HyperlinkPluginAction() { + this.setName(this.getDisplayName()); + } + + + /** + * 名字 + * + * @return + */ + public abstract String getDisplayName(); + + /** + * 得到超级链接的声明类 + * + * @return + */ + public abstract Class getHyperlinkClass(); + + /** + * 得到相应面板的类 + * + * @return + */ + public abstract Class getUpdateHyperlinkPaneClass(); + + public NameObjectCreator getHyperlinkCreator() { + return new NameObjectCreator(getDisplayName(), getHyperlinkClass(), getUpdateHyperlinkPaneClass()); + } + + /** + * 动作 + * @param e 动作 + */ + public void actionPerformed(ActionEvent e) { + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/JTemplateAction.java b/designer-base/src/com/fr/design/actions/JTemplateAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/JTemplateAction.java rename to designer-base/src/com/fr/design/actions/JTemplateAction.java diff --git a/designer-base/src/com/fr/design/actions/MenuAction.java b/designer-base/src/com/fr/design/actions/MenuAction.java new file mode 100644 index 0000000000..ff27fedf78 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/MenuAction.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.actions; + +import com.fr.base.BaseUtils; +import com.fr.stable.StringUtils; + + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-28 + * Time: 上午9:44 + */ +public abstract class MenuAction extends UpdateAction { + + public MenuAction() { + this.setName(getDisplayName()); + this.setMnemonic(getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_insert/bindColumn.png")); + } + + /** + * 名字 + * + * @return + */ + public abstract String getDisplayName(); + + public char getMnemonic() { + return '\0'; + } + + /** + * 图标 + * + * @return + */ + public String getIconPath() { + return StringUtils.EMPTY; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/TableDataSourceAction.java b/designer-base/src/com/fr/design/actions/TableDataSourceAction.java new file mode 100644 index 0000000000..6e627434d8 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/TableDataSourceAction.java @@ -0,0 +1,84 @@ +package com.fr.design.actions; + +import javax.swing.SwingUtilities; + +import com.fr.base.BaseUtils; +import com.fr.design.data.DesignTableDataManager; +import com.fr.data.TableDataSource; +import com.fr.design.data.datapane.ReportTableDataPane; +import com.fr.design.data.datapane.TableDataTreePane; +import com.fr.design.data.tabledata.ResponseDataSourceChange; +import com.fr.design.DesignModelAdapter; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.menu.KeySetUtils; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; + +import java.util.HashMap; +import java.util.Map; + +/* + * richer:包括报表和表单的数据集 && 图表的数据集 + */ +public class TableDataSourceAction extends TemplateComponentAction> implements ResponseDataSourceChange { + public TableDataSourceAction(JTemplate t) { + super(t); + this.setMenuKeySet(KeySetUtils.TEMPLATE_TABLE_DATA_SOURCE); + this.setName(getMenuKeySet().getMenuKeySetName() + "..."); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_web/datasource.png")); + } + + /** + * 执行动作 + * + * @return 是否执行成功 + */ + public boolean executeActionReturnUndoRecordNeeded() { + final TableDataSource tds = this.getEditingComponent().getTarget(); + + final ReportTableDataPane tableDataPane = new ReportTableDataPane() { + public void complete() { + populate(tds); + } + }; + BasicDialog reportTableDataDialog = tableDataPane.showLargeWindow(SwingUtilities.getWindowAncestor(this.getEditingComponent()), null); + reportTableDataDialog.addDialogActionListener(new DialogActionAdapter() { + + @Override + public void doOk() { + DesignModelAdapter.getCurrentModelAdapter().renameTableData(tableDataPane.getDsNameChangedMap()); + tableDataPane.update(tds); + TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); + TableDataSourceAction.this.getEditingComponent().fireTargetModified(); + fireDSChanged(tableDataPane.getDsNameChangedMap()); + } + }); + reportTableDataDialog.setVisible(true); + return false; + } + + // TODO ALEX_SEP 同JWorkBookAction,也不知道这个undo该如何处理 + + /** + * 撤销 + */ + public void prepare4Undo() { + } + + /** + * 响应数据集改变 + */ + public void fireDSChanged() { + fireDSChanged(new HashMap()); + } + + /** + * 响应数据集改变 + * + * @param map 地图 + */ + public void fireDSChanged(Map map) { + DesignTableDataManager.fireDSChanged(map); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/TemplateComponentAction.java b/designer-base/src/com/fr/design/actions/TemplateComponentAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/TemplateComponentAction.java rename to designer-base/src/com/fr/design/actions/TemplateComponentAction.java diff --git a/designer_base/src/com/fr/design/actions/TemplateComponentActionInterface.java b/designer-base/src/com/fr/design/actions/TemplateComponentActionInterface.java similarity index 100% rename from designer_base/src/com/fr/design/actions/TemplateComponentActionInterface.java rename to designer-base/src/com/fr/design/actions/TemplateComponentActionInterface.java diff --git a/designer-base/src/com/fr/design/actions/ToggleButtonUpdateAction.java b/designer-base/src/com/fr/design/actions/ToggleButtonUpdateAction.java new file mode 100644 index 0000000000..86102fdd0c --- /dev/null +++ b/designer-base/src/com/fr/design/actions/ToggleButtonUpdateAction.java @@ -0,0 +1,15 @@ +package com.fr.design.actions; + +import com.fr.design.gui.ibutton.UIToggleButton; + +/** + * 具有ToggleButton属性的action,继承这个类的action就会有 + * + * @author zhou + * + */ + +public interface ToggleButtonUpdateAction { + + public abstract UIToggleButton createToolBarComponent(); +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/UndoableAction.java b/designer-base/src/com/fr/design/actions/UndoableAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/UndoableAction.java rename to designer-base/src/com/fr/design/actions/UndoableAction.java diff --git a/designer-base/src/com/fr/design/actions/UpdateAction.java b/designer-base/src/com/fr/design/actions/UpdateAction.java new file mode 100644 index 0000000000..e6845745d8 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/UpdateAction.java @@ -0,0 +1,559 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions; + +import com.fr.base.NameStyle; +import com.fr.base.ScreenResolution; +import com.fr.base.Style; +import com.fr.design.actions.core.ActionFactory; +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.imenu.*; +import com.fr.design.menu.ShortCut; +import com.fr.design.selection.SelectionListener; +import com.fr.general.ComparatorUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.pinyin.PinyinFormat; +import com.fr.stable.pinyin.PinyinHelper; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; +import java.awt.*; +import java.awt.event.ComponentEvent; +import java.beans.PropertyChangeListener; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * An UpdateAction functions allows actions to have an efficient transient state, + * it's update method is called every time the action is about to be displayed + * in UI - allowing the action to poll whatever information it wishes to update its state + * before being displayed + * As a regular Swing Action object - it stores the name, icon, and enabled state for a single action. + *

+ * For example, a 'cut' action my be enabled or disabled based on the state of the selection + * in a text component. Just before the edit menu is displayed, the cut action is given the + * opportunity to update itself, and will appear in the menu with the correct state. + * august:不需要考虑UpdateAction的持久化,难道需要持久化吗? 又不像以前那样保存docking的大小布局 + * 如果是ToggleButton,就额外继承ToggleButtonUpdateAction接口 + */ +public abstract class UpdateAction extends ShortCut implements Action { + + /** + * Specifies whether action is enabled; the default is true. + */ + private boolean enabled = true; + + /** + * Contains the array of key bindings. + * august:关键词key,是Action里面的final常量,如:Action.NAME、Action.SMALL_ICON等等 + */ + private Map componentMap; + + private String searchText = StringUtils.EMPTY; + + + + /** + * Constructor + */ + public UpdateAction() { + //设置默认的small icon,必须有一个默认的图片,这样菜单整体美观. + this.putValue(Action.SMALL_ICON, UIConstants.BLACK_ICON); + } + + /** + * Returns true if the action is enabled. + * + * @return true if the action is enabled, false otherwise + * @see Action#isEnabled + */ + @Override + public boolean isEnabled() { + return enabled; + } + + /** + * Enables or disables the action. + * + * @param newValue true to enable the action, false to + * disable it + * @see Action#setEnabled + */ + @Override + public void setEnabled(boolean newValue) { + boolean oldValue = this.enabled; + + if (oldValue != newValue) { + this.enabled = newValue; + + //循环遍历所有的Enable属性. + Iterator valueIt = this.componentMap.values().iterator(); + while (valueIt.hasNext()) { + Object valueObject = valueIt.next(); + if (valueObject instanceof JComponent) { + ((JComponent) valueObject).setEnabled(this.enabled); + } + } + } + } + + + /** + * Returns the name for the action, used for a menu or button. + * + * @return the name for the action. + */ + public String getName() { + return (String) this.getValue(Action.NAME); + } + + /** + * Sets the name for the action, used for a menu or button. + * + * @param name the name for the action. + */ + public void setName(String name) { + this.putValue(Action.NAME, name); + } + + /** + * Returns the smallIcon property setting. + * + * @return The small icon for the action. + */ + public Icon getSmallIcon() { + return (Icon) this.getValue(Action.SMALL_ICON); + } + + /** + * Sets the smallIcon property. The smallIcon may be displayed as a menu item's icon or + * possibly as the icon for a button. This icon should be 16x16 pixels in size. + * + * @param smallIcon The small icon for the action. + */ + public void setSmallIcon(Icon smallIcon) { + this.putValue(Action.SMALL_ICON, smallIcon); + } + + public void setSmallIcon(Icon[] smallIcon, boolean white) { + this.putValue(Action.SMALL_ICON, smallIcon); + } + + /** + * Returns the mnemonic property setting. + * + * @return The mnemonic character for the action. + */ + public char getMnemonic() { + Integer n = (Integer) this.getValue(Action.MNEMONIC_KEY); + return n == null ? '\0' : (char) n.intValue(); + } + + /** + * Sets the mnemonic property. The mnemonic character is the 'hotkey' for the menu item + * or button displaying the action. This *must* be a character in the 'name' property, + * or it will have no effect. + * + * @param mnemonic The mnemonic character for the action + */ + public void setMnemonic(char mnemonic) { + this.putValue(Action.MNEMONIC_KEY, new Integer(mnemonic)); + } + + /** + * Returns the key used for storing a KeyStroke to be used as the + * accelerator for the action. + * + * @return the key as the accelerator for the action. + */ + public KeyStroke getAccelerator() { + return (KeyStroke) this.getValue(Action.ACCELERATOR_KEY); + } + + /** + * Sets the key used for storing a KeyStroke to be used as the + * accelerator for the action. + * + * @param accelerator the key as the accelerator for the action. + */ + public void setAccelerator(KeyStroke accelerator) { + this.putValue(Action.ACCELERATOR_KEY, accelerator); + } + + /** + * update enable + */ + public void update() { + } + + /** + * Gets the Object associated with the specified key. + * + * @param key a string containing the specified key + * @return the binding Object stored with this key; if there + * are no keys, it will return null + * @see Action#getValue + */ + @Override + public Object getValue(String key) { + if (componentMap == null) { + return null; + } + return componentMap.get(key); + } + + /** + * Sets the Value associated with the specified key. + * + * @param key the String that identifies the stored object + * @param newValue the Object to store using this key + * @see Action#putValue + */ + @Override + public void putValue(String key, Object newValue) { + if (componentMap == null) { + componentMap = new HashMap(); + } + + + if (newValue == null) { + componentMap.remove(key); + } else { + componentMap.put(key, newValue); + } + + } + + @Override + public synchronized void addPropertyChangeListener(PropertyChangeListener listener) { + + } + + @Override + public synchronized void removePropertyChangeListener(PropertyChangeListener listener) { + } + + /** + * Gets menu item. + * + * @return the created menu item. + */ + public UIMenuItem createMenuItem() { + Object object = this.getValue(UIMenuItem.class.getName()); + if (object == null && !(object instanceof UIMenuItem)) { + UIMenuItem menuItem = new UIMenuItem(this); + // 设置名字用作单元测 + menuItem.setName(getName()); + object = menuItem; + + this.putValue(UIMenuItem.class.getName(), object); + } + return (UIMenuItem) object; + } + + public UIMenuEastAttrItem createMenuItemEastAttr() { + UIMenuEastAttrItem menuItem = new UIMenuEastAttrItem(this); + // 设置名字用作单元测 + menuItem.setName(getName()); + this.putValue(UIMenuItem.class.getName(), menuItem); + return menuItem; + } + + /** + * Gets component on toolbar. + * + * @return the created components on toolbar. + */ + public JComponent createToolBarComponent() { + Object object = this.getValue(UIButton.class.getName()); + if (!(object instanceof AbstractButton)) { + UIButton button = null; + button = new UIButton(); + // 添加一个名字作为自动化测试用 + button.setName(getName()); + button.set4ToolbarButton(); + + //设置属性. + Integer mnemonicInteger = (Integer) this.getValue(Action.MNEMONIC_KEY); + if (mnemonicInteger != null) { + button.setMnemonic((char) mnemonicInteger.intValue()); + } + + button.setIcon((Icon) this.getValue(Action.SMALL_ICON)); + button.addActionListener(this); + + button.registerKeyboardAction(this, this.getAccelerator(), JComponent.WHEN_IN_FOCUSED_WINDOW); + + this.putValue(UIButton.class.getName(), button); + button.setText(StringUtils.EMPTY); + button.setEnabled(this.isEnabled()); + + //peter:产生tooltip + button.setToolTipText(ActionFactory.createButtonToolTipText(this)); + object = button; + } + + return (JComponent) object; + } + + /** + * Equals + */ + @Override + public boolean equals(Object object) { + if (object == this) { + return true; + } + if (!(object instanceof UpdateAction)) { + return false; + } + return ComparatorUtils.equals(((UpdateAction) object).getName(), this.getName()); + } + + @Override + public int hashCode() { + int hash = 5; + hash = 59 * hash + (this.enabled ? 1 : 0); + return hash; + } + + /* + * Add this ShortCut into JPopupMenu + */ + @Override + public void intoJPopupMenu(JPopupMenu menu) { + update(); + if (menu instanceof UIPopupEastAttrMenu){ + menu.add(this.createMenuItemEastAttr()); + return; + } + menu.add(this.createMenuItem()); + } + + /* + * Add this ShortCut into JToolBar + */ + @Override + public void intoJToolBar(JToolBar toolBar) { + update(); + + toolBar.add(this.createToolBarComponent()); + } + + public abstract static class ComponentRemoveEvent extends ComponentEvent { + + private static int EVENT_DELETE= 3001; + + public ComponentRemoveEvent(Component source) { + super(source, EVENT_DELETE); + } + + public abstract void release(SelectionListener listener); + } + + /** + * 全局style的菜单 + */ + public static class UseMenuItem extends UIMenuItem { + + private NameStyle nameStyle; + private SelectionListener listener; + + public UseMenuItem(Action action) { + super(action); + setPreferredSize(new Dimension(80, 20)); + } + + public UseMenuItem(String text, Icon icon) { + super(text, icon); + } + + protected void processEvent(AWTEvent e) { + if (e instanceof ComponentRemoveEvent) { + ((ComponentRemoveEvent) e).release(listener); + return; + } + super.processEvent(e); + } + + public void setSelectionListener(SelectionListener listener) { + this.listener = listener; + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + + if (nameStyle == null) { + return; + } + + Style.paintBackground((Graphics2D) g, nameStyle, getWidth() - 1, getHeight() - 1); + + Style.paintContent((Graphics2D) g, nameStyle.getName(), nameStyle, getWidth() - 1, getHeight() - 1, ScreenResolution.getScreenResolution()); + + Style.paintBorder((Graphics2D) g, nameStyle, getWidth() - 1, getHeight() - 1); + } + + public NameStyle getNameStyle() { + return this.nameStyle; + } + + public void setNameStyle(NameStyle nameStyle) { + this.nameStyle = nameStyle; + } + + @Override + public Dimension getMinimumSize() { + return getPreferredSize(); + } + } + + /** + * Gets menu item. + * + * @return the created menu item. + */ + public UseMenuItem createUseMenuItem() { + Object object = this.getValue(UseMenuItem.class.getName()); + if (object == null && !(object instanceof UseMenuItem)) { + object = new UseMenuItem(this); + this.putValue(UseMenuItem.class.getName(), object); + } + return (UseMenuItem) object; + } + + public static UICheckBoxMenuItem createCheckBoxMenuItem(UpdateAction action) { + UICheckBoxMenuItem menuItem = new UICheckBoxMenuItem(action.getName()); + + // 设置属性. + Integer mnemonicInteger = (Integer) action + .getValue(Action.MNEMONIC_KEY); + if (mnemonicInteger != null) { + menuItem.setMnemonic((char) mnemonicInteger.intValue()); + } + menuItem.setIcon((Icon) action.getValue(Action.SMALL_ICON)); +// if(menuItem.isSelected()){ +// menuItem.setIcon(FRSwingConstants.YES_ICON); +// } + menuItem.addActionListener(action); + menuItem.setToolTipText((String) action.getValue(Action.LONG_DESCRIPTION)); + menuItem.setAccelerator((KeyStroke) action.getValue(Action.ACCELERATOR_KEY)); + + return menuItem; + } + + public void setSearchText(JPanel panel) { + this.searchText = getComponentTexts(panel, "_", new StringBuffer(), new StringBuffer(), new StringBuffer()); + + } + + /** + * 获取搜索匹配字符串 + * @return + */ + public String getSearchText() { + return searchText; + } + + /** + * 遍历面板中所有控件,获取text用于alphafine的action搜索,考虑分词,拼音,首字母检索 + * @param panel + * @param separator + * @param text + * @param pinyin + * @param shortPinyin + * @return + */ + public String getComponentTexts(JPanel panel, String separator, StringBuffer text, StringBuffer pinyin, StringBuffer shortPinyin) { + Border border = panel.getBorder(); + if (border instanceof TitledBorder) { + String title = ((TitledBorder) border).getTitle(); + text.append(title).append(separator); + pinyin.append(PinyinHelper.convertToPinyinString(title, "", PinyinFormat.WITHOUT_TONE)).append(separator); + shortPinyin.append(PinyinHelper.getShortPinyin(title)).append(separator); + } + Component[] components = panel.getComponents(); + for (Component component : components) { + if (component instanceof JPanel) { + getComponentTexts((JPanel) component, separator, text, pinyin, shortPinyin); + } else if (component instanceof JScrollPane) { + Component childComponent = ((JScrollPane) component).getViewport().getView(); + if (childComponent instanceof JPanel) { + getComponentTexts((JPanel) childComponent, separator, text, pinyin, shortPinyin); + } + } else if (component instanceof JLabel) { + String title = ((JLabel) component).getText(); + handleSearchText(separator, text, pinyin, shortPinyin, title); + + } else if (component instanceof JCheckBox) { + String title = ((JCheckBox) component).getText(); + handleSearchText(separator, text, pinyin, shortPinyin, title); + + } else if (component instanceof JButton) { + String title = ((JButton) component).getText(); + handleSearchText(separator, text, pinyin, shortPinyin, title); + + } else if (component instanceof JRadioButton) { + String title = ((JRadioButton) component).getText(); + handleSearchText(separator, text, pinyin, shortPinyin, title); + + } else if (component instanceof JComboBox) { + for (int i = 0; i < ((JComboBox) component).getItemCount(); i++) { + Object componentName = ((JComboBox) component).getItemAt(i); + if (componentName instanceof String && StringUtils.isNotBlank(String.valueOf(componentName))) { + String title = String.valueOf(componentName); + text.append(title); + handleSearchText(separator, text, pinyin, shortPinyin, title); + } + } + } else if (component instanceof JTabbedPane) { + getTabPaneTexts((JTabbedPane) component, separator, text, pinyin, shortPinyin); + } + } + return String.valueOf(text.append(pinyin).append(shortPinyin)); + } + + /** + * 递归遍历tabbedPane + * @param component + * @param separator + * @param text + * @param pinyin + * @param shortPinyin + */ + private synchronized void getTabPaneTexts(JTabbedPane component, String separator, StringBuffer text, StringBuffer pinyin, StringBuffer shortPinyin) { + for (int i = 0; i < component.getTabCount(); i++) { + String title = component.getTitleAt(i); + handleSearchText(separator, text, pinyin, shortPinyin, title); + Component tabComponent = component.getComponentAt(i); + if (tabComponent instanceof JPanel) { + getComponentTexts((JPanel) tabComponent, separator, text, pinyin, shortPinyin); + } else if (tabComponent instanceof JTabbedPane) { + getTabPaneTexts((JTabbedPane) tabComponent, separator, text, pinyin, shortPinyin); + } + } + } + + /** + * 将text,pinyin,pinyin首字母拼接到一起 + * @param separator + * @param text + * @param pinyin + * @param shortPinyin + * @param title + */ + private void handleSearchText(String separator, StringBuffer text, StringBuffer pinyin, StringBuffer shortPinyin, String title) { + if (StringUtils.isBlank(title)) { + return; + } + text.append(title).append(separator); + pinyin.append(PinyinHelper.convertToPinyinString(title, "", PinyinFormat.WITHOUT_TONE)); + shortPinyin.append(PinyinHelper.getShortPinyin(title)).append(separator); + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/community/BBSAction.java b/designer-base/src/com/fr/design/actions/community/BBSAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/community/BBSAction.java rename to designer-base/src/com/fr/design/actions/community/BBSAction.java diff --git a/designer_base/src/com/fr/design/actions/community/BugAction.java b/designer-base/src/com/fr/design/actions/community/BugAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/community/BugAction.java rename to designer-base/src/com/fr/design/actions/community/BugAction.java diff --git a/designer_base/src/com/fr/design/actions/community/NeedAction.java b/designer-base/src/com/fr/design/actions/community/NeedAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/community/NeedAction.java rename to designer-base/src/com/fr/design/actions/community/NeedAction.java diff --git a/designer_base/src/com/fr/design/actions/community/QuestionAction.java b/designer-base/src/com/fr/design/actions/community/QuestionAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/community/QuestionAction.java rename to designer-base/src/com/fr/design/actions/community/QuestionAction.java diff --git a/designer_base/src/com/fr/design/actions/community/SignAction.java b/designer-base/src/com/fr/design/actions/community/SignAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/community/SignAction.java rename to designer-base/src/com/fr/design/actions/community/SignAction.java diff --git a/designer_base/src/com/fr/design/actions/community/UpAction.java b/designer-base/src/com/fr/design/actions/community/UpAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/community/UpAction.java rename to designer-base/src/com/fr/design/actions/community/UpAction.java diff --git a/designer_base/src/com/fr/design/actions/community/VideoAction.java b/designer-base/src/com/fr/design/actions/community/VideoAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/community/VideoAction.java rename to designer-base/src/com/fr/design/actions/community/VideoAction.java diff --git a/designer_base/src/com/fr/design/actions/core/ActionFactory.java b/designer-base/src/com/fr/design/actions/core/ActionFactory.java similarity index 100% rename from designer_base/src/com/fr/design/actions/core/ActionFactory.java rename to designer-base/src/com/fr/design/actions/core/ActionFactory.java diff --git a/designer_base/src/com/fr/design/actions/core/WorkBookSupportable.java b/designer-base/src/com/fr/design/actions/core/WorkBookSupportable.java similarity index 100% rename from designer_base/src/com/fr/design/actions/core/WorkBookSupportable.java rename to designer-base/src/com/fr/design/actions/core/WorkBookSupportable.java diff --git a/designer_base/src/com/fr/design/actions/edit/CopyAction.java b/designer-base/src/com/fr/design/actions/edit/CopyAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/edit/CopyAction.java rename to designer-base/src/com/fr/design/actions/edit/CopyAction.java diff --git a/designer-base/src/com/fr/design/actions/edit/CutAction.java b/designer-base/src/com/fr/design/actions/edit/CutAction.java new file mode 100644 index 0000000000..f33e7328ab --- /dev/null +++ b/designer-base/src/com/fr/design/actions/edit/CutAction.java @@ -0,0 +1,41 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.edit; + +import java.awt.event.KeyEvent; + +import javax.swing.KeyStroke; + +import com.fr.base.BaseUtils; +import com.fr.design.actions.TemplateComponentAction; +import com.fr.design.designer.TargetComponent; +import com.fr.general.Inter; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + +/** + * Cut. + */ +public class CutAction extends TemplateComponentAction { + /** + * Constructor + */ + public CutAction(TargetComponent t) { + super(t); + + this.setName(Inter.getLocText("M_Edit-Cut")); + this.setMnemonic('T'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER)); + } + + @Override + public boolean executeActionReturnUndoRecordNeeded() { + TargetComponent editPane = getEditingComponent(); + if (editPane == null) { + return false; + } + return editPane.cut(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/edit/PasteAction.java b/designer-base/src/com/fr/design/actions/edit/PasteAction.java new file mode 100644 index 0000000000..0406bacbca --- /dev/null +++ b/designer-base/src/com/fr/design/actions/edit/PasteAction.java @@ -0,0 +1,41 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.edit; + +import java.awt.event.KeyEvent; + +import javax.swing.KeyStroke; + +import com.fr.base.BaseUtils; +import com.fr.design.actions.TemplateComponentAction; +import com.fr.design.designer.TargetComponent; +import com.fr.general.Inter; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + +/** + * Paste. + */ +public class PasteAction extends TemplateComponentAction { + /** + * Constructor + */ + public PasteAction(TargetComponent t) { + super(t); + + this.setName(Inter.getLocText("M_Edit-Paste")); + this.setMnemonic('P'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/paste.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER)); + } + + @Override + public boolean executeActionReturnUndoRecordNeeded() { + TargetComponent tc = getEditingComponent(); + if (tc == null) { + return false; + } + return tc.paste(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/edit/RedoAction.java b/designer-base/src/com/fr/design/actions/edit/RedoAction.java new file mode 100644 index 0000000000..2d4c99d29e --- /dev/null +++ b/designer-base/src/com/fr/design/actions/edit/RedoAction.java @@ -0,0 +1,59 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.edit; + +import java.awt.event.ActionEvent; + +import com.fr.base.BaseUtils; +import com.fr.design.DesignerEnvManager; +import com.fr.design.actions.TemplateComponentActionInterface; +import com.fr.design.actions.UpdateAction; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.menu.KeySetUtils; + +/** + * Redo. + */ +public class RedoAction extends UpdateAction implements TemplateComponentActionInterface> { + private JTemplate t; + + public RedoAction(JTemplate t) { + this.t = t; + this.setMenuKeySet(KeySetUtils.REDO); + this.setName(getMenuKeySet().getMenuKeySetName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/redo.png")); + this.setAccelerator(getMenuKeySet().getKeyStroke()); + } + + @Override + public JTemplate getEditingComponent() { + return t; + } + + /** + * 动作 + * @param e 事件 + */ + public void actionPerformed(ActionEvent e) { + JTemplate uncComponent = getEditingComponent(); + if (uncComponent != null) { + uncComponent.redo(); + } + } + + /** + * update enable + */ + @Override + public void update() { + JTemplate undoComponent = getEditingComponent(); + if (DesignerEnvManager.getEnvManager().isSupportUndo()) { + this.setEnabled(undoComponent != null && undoComponent.canRedo()); + } else { + this.setEnabled(false); + } + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/edit/UndoAction.java b/designer-base/src/com/fr/design/actions/edit/UndoAction.java new file mode 100644 index 0000000000..d775ff9551 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/edit/UndoAction.java @@ -0,0 +1,60 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.edit; + +import java.awt.event.ActionEvent; + +import com.fr.base.BaseUtils; +import com.fr.design.DesignerEnvManager; +import com.fr.design.actions.TemplateComponentActionInterface; +import com.fr.design.actions.UpdateAction; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.menu.KeySetUtils; + +/** + * Undo. + */ +public class UndoAction extends UpdateAction implements TemplateComponentActionInterface> { + private JTemplate t; + + public UndoAction(JTemplate t) { + this.t = t; + this.setMenuKeySet(KeySetUtils.UNDO); + this.setName(getMenuKeySet().getMenuKeySetName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/undo.png")); + this.setAccelerator(getMenuKeySet().getKeyStroke()); + } + + @Override + public JTemplate getEditingComponent() { + return t; + } + + /** + * 动作 + * @param e 事件 + */ + public void actionPerformed(ActionEvent e) { + JTemplate undoComponent = getEditingComponent(); + if (undoComponent != null) { + undoComponent.undo(); + } + } + + /** + * update enable + */ + @Override + public void update() { + JTemplate undoComponent = getEditingComponent(); + if (DesignerEnvManager.getEnvManager().isSupportUndo()) { + this.setEnabled(undoComponent != null && undoComponent.canUndo()); + } else { + this.setEnabled(false); + } + + + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/file/CloseCurrentTemplateAction.java b/designer-base/src/com/fr/design/actions/file/CloseCurrentTemplateAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/file/CloseCurrentTemplateAction.java rename to designer-base/src/com/fr/design/actions/file/CloseCurrentTemplateAction.java diff --git a/designer-base/src/com/fr/design/actions/file/CloseTemplateAction.java b/designer-base/src/com/fr/design/actions/file/CloseTemplateAction.java new file mode 100644 index 0000000000..53606a1368 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/file/CloseTemplateAction.java @@ -0,0 +1,29 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.file; + +import java.awt.event.ActionEvent; + +import com.fr.design.actions.JTemplateAction; +import com.fr.design.mainframe.JTemplate; +import com.fr.general.Inter; + +/** + * Close Report. + */ +public class CloseTemplateAction extends JTemplateAction> { + /** + * Constructor + */ + public CloseTemplateAction(JTemplate jt) { + super(jt); + + this.setName(Inter.getLocText("M-Close_Template")); + this.setMnemonic('C'); + } + + public void actionPerformed(ActionEvent evt) { +// this.getEditingComponent().unlockTemplate(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/file/EditEnvAction.java b/designer-base/src/com/fr/design/actions/file/EditEnvAction.java new file mode 100644 index 0000000000..687a2b67c7 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/file/EditEnvAction.java @@ -0,0 +1,22 @@ +package com.fr.design.actions.file; + +import java.awt.event.ActionEvent; + +import com.fr.design.actions.UpdateAction; +import com.fr.design.mainframe.TemplatePane; +import com.fr.general.Inter; + + +public class EditEnvAction extends UpdateAction { + + + public EditEnvAction() { + this.setName(Inter.getLocText("M-Others") + "..."); + } + + @Override + public void actionPerformed(ActionEvent e) { + TemplatePane.getInstance().editItems(); + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/file/ExitDesignerAction.java b/designer-base/src/com/fr/design/actions/file/ExitDesignerAction.java new file mode 100644 index 0000000000..070b9df221 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/file/ExitDesignerAction.java @@ -0,0 +1,32 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.file; + +import java.awt.event.ActionEvent; + +import com.fr.design.actions.UpdateAction; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.menu.KeySetUtils; + +/** + * Exit. + */ +public class ExitDesignerAction extends UpdateAction { + /** + * Constructor + */ + public ExitDesignerAction() { + this.setMenuKeySet(KeySetUtils.EXIT_DESIGNER); + this.setName(getMenuKeySet().getMenuKeySetName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + } + + /** + * 动作 + * @param e 事件 + */ + public void actionPerformed(ActionEvent e) { + DesignerContext.getDesignerFrame().exit(); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/file/LocalePane.java b/designer-base/src/com/fr/design/actions/file/LocalePane.java similarity index 100% rename from designer_base/src/com/fr/design/actions/file/LocalePane.java rename to designer-base/src/com/fr/design/actions/file/LocalePane.java diff --git a/designer-base/src/com/fr/design/actions/file/OpenRecentReportMenuDef.java b/designer-base/src/com/fr/design/actions/file/OpenRecentReportMenuDef.java new file mode 100644 index 0000000000..2bb026159f --- /dev/null +++ b/designer-base/src/com/fr/design/actions/file/OpenRecentReportMenuDef.java @@ -0,0 +1,78 @@ +package com.fr.design.actions.file; + +import java.awt.event.ActionEvent; +import java.util.List; + +import com.fr.base.BaseUtils; +import com.fr.design.DesignerEnvManager; +import com.fr.design.actions.UpdateAction; +import com.fr.design.gui.imenu.UIMenu; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.menu.KeySetUtils; +import com.fr.design.menu.MenuDef; +import com.fr.file.FILEFactory; + +/** + * Open Resent MenuDef. + */ +public class OpenRecentReportMenuDef extends MenuDef { + public OpenRecentReportMenuDef() { + this.setMenuKeySet(KeySetUtils.RECENT_OPEN); + this.setName(getMenuKeySet().getMenuKeySetName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setIconPath("/com/fr/base/images/cell/blank.gif"); + initMenuDef(); + } + + private void initMenuDef() { + DesignerEnvManager designerEnvManager = DesignerEnvManager.getEnvManager(); + List list = designerEnvManager.getRecentOpenedFilePathList(); + for (int i = 0; i < list.size(); i++) { + this.addShortCut(new OpenRecentReportAction(list.get(i))); + } + } + + /** + * 更新菜单 + */ + public void updateMenu() { + UIMenu createdMenu = this.createJMenu(); + createdMenu.removeAll(); + this.clearShortCuts(); + initMenuDef(); + int menuCount = this.getShortCutCount(); + for (int i = 0; i < menuCount; i++) { + Object object = this.getShortCut(i); + if (!(object instanceof OpenRecentReportAction)) { + return; + } + OpenRecentReportAction openResentReportAction = (OpenRecentReportAction) object; + openResentReportAction.update(); + if (openResentReportAction.isEnabled()) { + createdMenu.add(openResentReportAction.createMenuItem()); + } + } + } + + public static class OpenRecentReportAction extends UpdateAction { + public OpenRecentReportAction() { + } + + public OpenRecentReportAction(String cptName) { + this.setName(cptName); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/oem/logo.png")); + } + + /** + * 动作 + * @param e 事件 + */ + public void actionPerformed(ActionEvent e) { + DesignerContext.getDesignerFrame().openTemplate(FILEFactory.createFILE(this.getPath())); + } + + public String getPath() { + return this.getName(); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/file/OpenTemplateAction.java b/designer-base/src/com/fr/design/actions/file/OpenTemplateAction.java new file mode 100644 index 0000000000..091fb112a5 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/file/OpenTemplateAction.java @@ -0,0 +1,45 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.file; + +import java.awt.event.ActionEvent; + +import com.fr.base.BaseUtils; +import com.fr.design.actions.UpdateAction; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.menu.KeySetUtils; +import com.fr.file.FILE; +import com.fr.file.FILEChooserPane; + + +/** + * Open Template. + */ +public class OpenTemplateAction extends UpdateAction { + + public OpenTemplateAction() { + this.setMenuKeySet(KeySetUtils.OPEN_TEMPLATE); + this.setName(getMenuKeySet().getMenuKeySetName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/open.png")); + this.setAccelerator(getMenuKeySet().getKeyStroke()); + } + + /** + * 动作 + * @param evt 事件 + */ + public void actionPerformed(ActionEvent evt) { + FILEChooserPane fileChooser = FILEChooserPane.getInstance(true, true); + + if (fileChooser.showOpenDialog(DesignerContext.getDesignerFrame()) + == FILEChooserPane.OK_OPTION) { + final FILE file = fileChooser.getSelectedFILE(); + if (file == null) {//选择的文件不能是 null + return; + } + DesignerContext.getDesignerFrame().openTemplate(file); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/file/PreferenceAction.java b/designer-base/src/com/fr/design/actions/file/PreferenceAction.java new file mode 100644 index 0000000000..0ad0a6c2f9 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/file/PreferenceAction.java @@ -0,0 +1,49 @@ +package com.fr.design.actions.file; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.actions.UpdateAction; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrame; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.menu.KeySetUtils; + +import java.awt.event.ActionEvent; + + +public class PreferenceAction extends UpdateAction { + public PreferenceAction() { + this.setMenuKeySet(KeySetUtils.PREFERENCE); + this.setName(getMenuKeySet().getMenuKeySetName() + "..."); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSearchText(new PreferencePane()); + } + + /** + * 动作 + * + * @param e 事件 + */ + public void actionPerformed(ActionEvent e) { + final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); + + final PreferencePane preferencePane = new PreferencePane(); + preferencePane.populate(DesignerEnvManager.getEnvManager()); + + BasicDialog basicDialog = preferencePane.showWindow(designerFrame); + basicDialog.addDialogActionListener(new DialogActionAdapter() { + public void doOk() { + preferencePane.update(DesignerEnvManager.getEnvManager()); + DesignerEnvManager.loadLogSetting(); + DesignerEnvManager.getEnvManager().saveXMLFile(); + JTemplate jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + jt.refreshToolArea(); + preferencePane.showRestartDialog(); + } + }); + + basicDialog.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/com/fr/design/actions/file/PreferencePane.java new file mode 100644 index 0000000000..dd6eaa9adb --- /dev/null +++ b/designer-base/src/com/fr/design/actions/file/PreferencePane.java @@ -0,0 +1,679 @@ +package com.fr.design.actions.file; + +import com.fr.base.BaseUtils; +import com.fr.base.ServerConfig; +import com.fr.design.DesignerEnvManager; +import com.fr.design.RestartHelper; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.BasicPane; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.editor.editor.IntegerEditor; +import com.fr.design.gui.frpane.UITabbedPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UIColorButton; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.ActionLabel; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.ComparatorUtils; +import com.fr.general.FRFont; +import com.fr.general.FRLevel; +import com.fr.general.Inter; + +import javax.swing.*; +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.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.File; +import java.util.ArrayList; +import java.util.Locale; +import java.util.Map; + +/** + * 选项对话框 + * + * @editor zhou + * @since 2012-3-28下午3:39:48 + */ +public class PreferencePane extends BasicPane { + private static final int MAX_UNDO_LIMIT_5 = 5; + private static final int MAX_UNDO_LIMIT_10 = 10; + private static final int MAX_UNDO_LIMIT_15 = 15; + private static final int MAX_UNDO_LIMIT_20 = 20; + private static final int MAX_UNDO_LIMIT_50 = 50; + private static final int SELECTED_INDEX_4 = 4; + private static final int SELECTED_INDEX_5 = 5; + + private static final String TYPE = "pressed"; + private static final String DISPLAY_TYPE = "+"; + private static final String BACK_SLASH = "BACK_SLASH"; + private static final String DISPLAY_BACK_SLASH = "\\"; + private static final String SLASH = "SLASH"; + private static final String DISPLAY_SLASH = "/"; + private static final String CONTROL = "CONTROL"; + private static final String DISPLAY_CONTROL = "ctrl"; + private static final String OPEN_BRACKET = "OPEN_BRACKET"; + private static final String DISPLAY_OPEN_BRACKET = "{"; + private static final String CLOSE_BRACKET = "CLOSE_BRACKET"; + private static final String DISPLAY_CLOSE_BRACKET = "}"; + private static final String COMMA = "COMMA"; + private static final String DISPLAY_COMMA = ","; + private static final String PERIOD = "PERIOD"; + private static final String DISPLAY_PERIOD = "."; + private static final String SEMICOLON = "SEMICOLON"; + private static final String DISPLAY_SEMICOLON = ";"; + private static final String QUOTE = "QUOTE"; + private static final String DISPLAY_QUOTE = "'"; + private static final String EQUALS = "EQUALS"; + private static final String DISPLAY_EQUALS = "+"; + private static final String MINUS = "MINUS"; + private static final String DISPLAY_MINUS = "-"; + + private static final FRLevel[] LOG = {FRLevel.SEVERE, FRLevel.WARNING, FRLevel.INFO, FRLevel.DEBUG}; + private static java.util.List LANGUAGE = new ArrayList<>(); + + private static int designerEnvLanguageIndex; // 打开设置对话框时,设计器使用的语言 + private boolean languageChanged; // 是否修改了设计器语言设置 + //设置是否支持undo + private UICheckBox supportUndoCheckBox; + //设置最大撤销次数 + private UIComboBox maxUndoLimit; + //是非支持自动计算父格 + private UICheckBox supportDefaultParentCalculateCheckBox; + + //是否自动转化为公式 + private UICheckBox supportStringToFormulaBox; + private UICheckBox defaultStringToFormulaBox; + + private UILabel shortCutLabel; + private KeyStroke shortCutKeyStore = null; + private UIColorButton gridLineColorTBButton; + + + private UIColorButton paginationLineColorTBButton; + + private UICheckBox supportCellEditorDefCheckBox; + private UICheckBox isDragPermitedCheckBox; + + private UITextField logExportDirectoryField; + + private UIComboBox logLevelComboBox, languageComboBox, pageLengthComboBox, reportLengthComboBox; + private IntegerEditor portEditor; + private UITextField jdkHomeTextField; + private UICheckBox oracleSpace; + private UICheckBox joinProductImprove; + + public PreferencePane() { + this.initComponents(); + this.initLanguageItems(); + } + + // 语言选项 + private void initLanguageItems() { + LANGUAGE.clear(); + Map map = Inter.getSupportLocaleMap(); + LANGUAGE.add(Inter.getLocText("FR-Designer_Language_Default")); + for(Locale locale : map.keySet()){ + LANGUAGE.add(getLocaledLanguage(map.get(locale), locale)); + } + } + + protected void initComponents() { + JPanel contentPane = this; + contentPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + + UITabbedPane jtabPane = new UITabbedPane(); + JPanel generalPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + jtabPane.addTab(Inter.getLocText("FR-Designer_General"), generalPane); + JPanel advancePane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + jtabPane.addTab(Inter.getLocText("FR-Designer_Advanced"), advancePane); + contentPane.add(jtabPane, BorderLayout.NORTH); + + + createFunctionPane(generalPane); + createEditPane(generalPane); + createGuiOfGridPane(generalPane); + createColorSettingPane(generalPane); + + // ConfPane + JPanel confLocationPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); + advancePane.add(confLocationPane); + + createLogPane(advancePane); + + createLanPane(generalPane); + + createLengthPane(advancePane); + + createServerPane(advancePane); + + createJdkHomePane(advancePane); + + String[] message = new String[]{"Display", "Oracle_All_Tables"}; + String[] sign = new String[]{"Oracle"}; + JPanel oraclePane = FRGUIPaneFactory.createTitledBorderPane("Oracle" + Inter.getLocText("FR-Designer_Oracle_All_Tables")); + oracleSpace = new UICheckBox(Inter.getLocText(message, sign)); + oraclePane.add(oracleSpace); + + JPanel improvePane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("FR-Designer_Product_improve")); + joinProductImprove = new UICheckBox(Inter.getLocText("FR-Designer_Join_Product_improve")); + improvePane.add(joinProductImprove); + + JPanel spaceUpPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + spaceUpPane.add(oraclePane, BorderLayout.NORTH); + spaceUpPane.add(improvePane, BorderLayout.SOUTH); + advancePane.add(spaceUpPane); + } + + private static String getLocaledLanguage(String key, Locale locale){ + StringBuilder sb = new StringBuilder(); + sb.append(Inter.getLocText(key)).append("("); + sb.append(Inter.getLocText(key, locale)).append(")"); + return sb.toString(); + } + + private void createFunctionPane(JPanel generalPane) { + JPanel functionPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("FR-Designer_Preference-Function")); + generalPane.add(functionPane); + + //添加supportUndo选择项 + supportUndoCheckBox = new UICheckBox(Inter.getLocText("Preference-Support_Undo")); + functionPane.add(supportUndoCheckBox); + //添加maxUndoLimit + //String[] undoTimes = {"最大撤销次数","5次","10次","15次","20次","50次"}; + String[] undoTimes = {Inter.getLocText("FR-Designer_max_undo_limit"), MAX_UNDO_LIMIT_5 + Inter.getLocText("FR-Designer_time(s)"), MAX_UNDO_LIMIT_10 + Inter.getLocText("FR-Designer_time(s)") + , MAX_UNDO_LIMIT_15 + Inter.getLocText("FR-Designer_time(s)"), MAX_UNDO_LIMIT_20 + Inter.getLocText("FR-Designer_time(s)"), MAX_UNDO_LIMIT_50 + Inter.getLocText("FR-Designer_time(s)")}; + maxUndoLimit = new UIComboBox(undoTimes); + functionPane.add(maxUndoLimit); + + //不支持撤销则不能选择撤销可缓存,也不能设置最大撤销次数 + supportUndoCheckBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + maxUndoLimit.setEnabled(supportUndoCheckBox.isSelected()); + } + }); + + + //添加supportDefaultParentCalculate选择项 + supportDefaultParentCalculateCheckBox = new UICheckBox( + Inter.getLocText("Preference-Support_Default_Parent_Calculate")); + functionPane.add(supportDefaultParentCalculateCheckBox); + } + + private void createEditPane(JPanel generalPane) { + //samuel:编辑器设置 + JPanel editPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText(new String[]{"Editor", "Set"})); + generalPane.add(editPane); + + //设置是否支持将字符串编辑为公式 + supportStringToFormulaBox = new UICheckBox(Inter.getLocText("FR-Designer_Surport_String_To_Formula")); + editPane.add(supportStringToFormulaBox); + + //是否默认转化 + defaultStringToFormulaBox = new UICheckBox(Inter.getLocText("FR-Designer_Always")); + + editPane.add(defaultStringToFormulaBox); + //不支持转化则不能默认执行 + supportStringToFormulaBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + defaultStringToFormulaBox.setEnabled(supportStringToFormulaBox.isSelected()); + } + }); + JPanel keyStrokePane = new JPanel(new BorderLayout()); + keyStrokePane.add(new UILabel(Inter.getLocText("Support-Auto_Complete_Shortcut") + ":"), BorderLayout.WEST); + shortCutLabel = new UILabel(); + keyStrokePane.add(shortCutLabel, BorderLayout.CENTER); + editPane.add(keyStrokePane); + shortCutLabel.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() > 1) { + final KeyStrokePane basicPane = new KeyStrokePane(shortCutLabel.getText()); + BasicDialog dlg = basicPane.showSmallWindow(SwingUtilities.getWindowAncestor(PreferencePane.this), new DialogActionAdapter() { + @Override + public void doOk() { + shortCutLabel.setText(basicPane.getText()); + } + }); + dlg.setVisible(true); + } + } + }); + } + + private class KeyStrokePane extends BasicPane { + private UILabel label; + + public KeyStrokePane(String text) { + setLayout(new BorderLayout()); + setFocusable(true); + requestFocusInWindow(); + label = new UILabel(text); + add(GUICoreUtils.createBorderLayoutPane( + new UILabel(Inter.getLocText("Support-Current_Auto_Complete_Shortcut") + ":"), + BorderLayout.WEST, + label, + BorderLayout.CENTER), + BorderLayout.NORTH); + addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + int modifier = e.getModifiers(); + if (modifier == 0) { + return; + } + int keyCode = e.getKeyCode(); + shortCutKeyStore = KeyStroke.getKeyStroke(keyCode, modifier); + String str = shortCutKeyStore.toString(); + label.setText(getDisplayShortCut(str)); + } + }); + } + + public String getText() { + return label.getText(); + } + + + @Override + protected String title4PopupWindow() { + return "KeyStroke"; + } + + } + + private void createGuiOfGridPane(JPanel generalPane) { + // GridPane + JPanel guiOfGridPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("Preference-Setting_Grid")); + generalPane.add(guiOfGridPane); + + supportCellEditorDefCheckBox = new UICheckBox(Inter.getLocText("Preference-Support_Cell_Editor_Definition")); + guiOfGridPane.add(supportCellEditorDefCheckBox); + + isDragPermitedCheckBox = new UICheckBox(Inter.getLocText("Preference-Is_Drag_Permited")); + guiOfGridPane.add(isDragPermitedCheckBox); + } + + private void createColorSettingPane(JPanel generalPane) { + // Color Setting Pane + JPanel colorSettingPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("Preference-Setting_Colors")); + generalPane.add(colorSettingPane); + + new UILabel(Inter.getLocText("Preference-Grid_Line_Color")); + + new UILabel(Inter.getLocText("Preference-Pagination_Line_Color")); + + gridLineColorTBButton = new UIColorButton(BaseUtils.readIcon("/com/fr/design/images/gui/color/foreground.png")); + gridLineColorTBButton.setEnabled(this.isEnabled()); + + paginationLineColorTBButton = new UIColorButton(BaseUtils.readIcon("/com/fr/design/images/gui/color/foreground.png")); + paginationLineColorTBButton.setEnabled(this.isEnabled()); + + JPanel leftPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + leftPane.add(new UILabel(Inter.getLocText("Preference-Grid_Line_Color") + ":")); + leftPane.add(gridLineColorTBButton); + JPanel rightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + rightPane.add(new UILabel(Inter.getLocText("Preference-Pagination_Line_Color") + ":")); + rightPane.add(paginationLineColorTBButton); + colorSettingPane.add(leftPane); + colorSettingPane.add(rightPane); + } + + private void createLogPane(JPanel advancePane) { + //richer:选择导出log文件的目录. + JPanel logPane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); + advancePane.add(logPane); + JPanel logExportPane = FRGUIPaneFactory.createTitledBorderPane("log" + Inter.getLocText("FR-Designer_Export_Setting")); + logPane.add(logExportPane); + UILabel logLabel = new UILabel(Inter.getLocText("FR-Designer_Select_Export_Log_Directory") + ":"); + logExportPane.add(logLabel, BorderLayout.WEST); + logExportDirectoryField = new UITextField(24); + logExportPane.add(logExportDirectoryField, BorderLayout.CENTER); + UIButton chooseDirBtn = new UIButton("..."); + logExportPane.add(chooseDirBtn, BorderLayout.EAST); + chooseDirBtn.setPreferredSize(new Dimension(25, 25)); + chooseDirBtn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + int saveValue = fileChooser.showOpenDialog(DesignerContext.getDesignerFrame()); + if (saveValue == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + logExportDirectoryField.setText(selectedFile.getAbsolutePath()); + } + } + }); + + JPanel logLevelPane = FRGUIPaneFactory.createTitledBorderPane("log" + Inter.getLocText("FR-Designer_Level_Setting")); + logPane.add(logLevelPane); + logLevelComboBox = new UIComboBox(LOG); + logLevelPane.add(logLevelComboBox); + logLevelComboBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + + ServerConfig.getInstance().setServerLogLevel(((FRLevel) logLevelComboBox.getSelectedItem()).getLevel()); + } + }); + } + + private void createLanPane(JPanel generalPane) { + // ben:选择版本语言; + JPanel languageAndDashBoard_pane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); + JPanel LanguagePane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("FR-Designer_Choose_Language")); + generalPane.add(languageAndDashBoard_pane); + languageAndDashBoard_pane.add(LanguagePane); + languageComboBox = new UIComboBox(LANGUAGE.toArray()); + languageComboBox.setFont(FRFont.getInstance("Dialog", Font.PLAIN, 12));//为了在中文系统中显示韩文 + ActionLabel languageLabel = new ActionLabel(Inter.getLocText("FR-Designer_Designer_Language")); + languageLabel.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + final LocalePane localePane = new LocalePane(); + BasicDialog dlg = localePane.showLargeWindow(SwingUtilities.getWindowAncestor(PreferencePane.this), new DialogActionAdapter() { + @Override + public void doOk() { + localePane.save(); + } + }); + dlg.setVisible(true); + } + }); + UILabel noticeLabel = new UILabel(Inter.getLocText("FR-Designer_Work_After_Restart_Designer"));//sail:提示重启后生效 + double p = TableLayout.PREFERRED; + double rowSize[] = {p}; + double columnSize[] = {p, p, p}; + Component[][] components = { + {languageLabel, languageComboBox, noticeLabel}, + }; + languageComboBox.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + //Inter.fr = ResourceBundle.getBundle("com/fr/general/locale/fr", Locale.US); + } + }); + JPanel choosePane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + LanguagePane.add(choosePane); + } + + private String getDisplayShortCut(String shotrCut) { + return shotrCut.replace(TYPE, DISPLAY_TYPE).replace(BACK_SLASH, DISPLAY_BACK_SLASH).replace(SLASH, DISPLAY_SLASH) + .replace(CONTROL, DISPLAY_CONTROL).replace(OPEN_BRACKET, DISPLAY_OPEN_BRACKET).replace(CLOSE_BRACKET, DISPLAY_CLOSE_BRACKET) + .replace(COMMA, DISPLAY_COMMA).replace(PERIOD, DISPLAY_PERIOD).replace(SEMICOLON, DISPLAY_SEMICOLON).replace(QUOTE, DISPLAY_QUOTE) + .replace(EQUALS, DISPLAY_EQUALS).replace(MINUS, DISPLAY_MINUS); + } + + + private KeyStroke convert2KeyStroke(String ks) { + return KeyStroke.getKeyStroke(ks.replace(DISPLAY_TYPE, TYPE)); + } + + + private void createLengthPane(JPanel advancePane) { + double p = TableLayout.PREFERRED; + double rowSize[] = {p}; + + // 长度单位选择 + JPanel lengthPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("FR-Designer_Setting-Ruler-Units")); + advancePane.add(lengthPane); + pageLengthComboBox = new UIComboBox(new String[]{Inter.getLocText("FR-Designer_PageSetup-mm"), Inter.getLocText("FR-Designer_Unit_CM"), Inter.getLocText("FR-Designer_Unit_INCH")}); + pageLengthComboBox.setPreferredSize(new Dimension(80, 20)); + pageLengthComboBox.setMinimumSize(new Dimension(80, 20)); + reportLengthComboBox = new UIComboBox(new String[]{Inter.getLocText("FR-Designer_PageSetup-mm"), Inter.getLocText("FR-Designer_Unit_CM"), Inter.getLocText("FR-Designer_Unit_INCH"), Inter.getLocText("FR-Designer_Unit_PT")}); + reportLengthComboBox.setPreferredSize(new Dimension(80, 20)); + reportLengthComboBox.setMinimumSize(new Dimension(80, 20)); + UILabel pagelengthLabel = new UILabel(Inter.getLocText("FR-Designer_Page-Setup-Scale-Units") + ":"); + UILabel reportLengthLabel = new UILabel(Inter.getLocText("FR-Designer_Report-Design-Ruler-Units") + ":"); + Component[][] lengthComponents = { + {pagelengthLabel, pageLengthComboBox, reportLengthLabel, reportLengthComboBox}, + }; + JPanel chooseLengthPane = TableLayoutHelper.createTableLayoutPane(lengthComponents, rowSize, new double[]{p, p, p, p}); + lengthPane.add(chooseLengthPane); + } + + private void createServerPane(JPanel advancePane) { + double p = TableLayout.PREFERRED; + double rowSize[] = {p}; + double columnSize[] = {p, p, p}; + + JPanel serverPortPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("FR-Designer_Web_Preview_Port_Setting")); + advancePane.add(serverPortPane); + portEditor = new IntegerEditor(); + portEditor.setPreferredSize(new Dimension(80, 20)); + portEditor.setMinimumSize(new Dimension(80, 20)); + UILabel notiJlabel = new UILabel(Inter.getLocText("FR-Designer_Work_After_Restart_Designer")); + UILabel serverPortLabel = new UILabel(Inter.getLocText("FR-Designer_Web_Preview_Port") + ":"); + Component[][] portComponents = { + {serverPortLabel, portEditor, notiJlabel}, + }; + JPanel choosePortPane = TableLayoutHelper.createTableLayoutPane(portComponents, rowSize, columnSize); + serverPortPane.add(choosePortPane, BorderLayout.CENTER); + } + + private void createJdkHomePane(JPanel advancePane) { + double p = TableLayout.PREFERRED; + double rowSize[] = {p}; + double columnSize[] = {p, p, p}; + + JPanel serverPortPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("Preference-JDK_Home")); + advancePane.add(serverPortPane); + jdkHomeTextField = new UITextField(); + UIButton chooseBtn = new UIButton("..."); + chooseBtn.setPreferredSize(new Dimension(20, 20)); + JPanel panel = GUICoreUtils.createBorderLayoutPane( + jdkHomeTextField, BorderLayout.CENTER, + chooseBtn, BorderLayout.EAST + ); + chooseBtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + int returnValue = fileChooser.showOpenDialog(PreferencePane.this); + if (returnValue == JFileChooser.APPROVE_OPTION) { + File file = fileChooser.getSelectedFile(); + jdkHomeTextField.setText(file.getAbsolutePath()); + } + } + }); + panel.setPreferredSize(new Dimension(300, 20)); + UILabel notiJlabel = new UILabel(Inter.getLocText("FR-Designer_Work_After_Restart_Designer")); + UILabel serverPortLabel = new UILabel(Inter.getLocText("Preference-JDK_Home") + ":"); + Component[][] portComponents = { + {serverPortLabel, panel, notiJlabel}, + }; + JPanel choosePortPane = TableLayoutHelper.createTableLayoutPane(portComponents, rowSize, columnSize); + serverPortPane.add(choosePortPane, BorderLayout.CENTER); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("M_Window-Preference"); + } + + /** + * The method of populate. + * + * @param designerEnvManager + */ + public void populate(DesignerEnvManager designerEnvManager) { + if (designerEnvManager == null) { + return; + } + + supportUndoCheckBox.setSelected(designerEnvManager.isSupportUndo()); + if (designerEnvManager.isSupportUndo()) { + maxUndoLimit.setSelectedIndex(chooseCase(designerEnvManager.getUndoLimit())); + } else { + maxUndoLimit.setEnabled(false); + } + + supportDefaultParentCalculateCheckBox.setSelected(designerEnvManager.isSupportDefaultParentCalculate()); + + supportStringToFormulaBox.setSelected(designerEnvManager.isSupportStringToFormula()); + + shortCutLabel.setText(getDisplayShortCut(designerEnvManager.getAutoCompleteShortcuts())); + shortCutKeyStore = convert2KeyStroke(designerEnvManager.getAutoCompleteShortcuts()); + + if (supportStringToFormulaBox.isSelected()) { + defaultStringToFormulaBox.setEnabled(true); + defaultStringToFormulaBox.setSelected(designerEnvManager.isDefaultStringToFormula()); + } else { + defaultStringToFormulaBox.setEnabled(false); + defaultStringToFormulaBox.setSelected(false); + } + + supportCellEditorDefCheckBox.setSelected(designerEnvManager.isSupportCellEditorDef()); + + isDragPermitedCheckBox.setSelected(designerEnvManager.isDragPermited()); + + gridLineColorTBButton.setColor(designerEnvManager.getGridLineColor()); + paginationLineColorTBButton.setColor(designerEnvManager.getPaginationLineColor()); + + this.logExportDirectoryField.setText(designerEnvManager.getLogLocation()); + + this.logLevelComboBox.setSelectedItem(FRLevel.getByLevel(ServerConfig.getInstance().getServerLogLevel())); + + this.languageComboBox.setSelectedItem(LANGUAGE.get(designerEnvManager.getLanguage())); + designerEnvLanguageIndex = designerEnvManager.getLanguage(); + this.pageLengthComboBox.setSelectedIndex(designerEnvManager.getPageLengthUnit()); + this.reportLengthComboBox.setSelectedIndex(designerEnvManager.getReportLengthUnit()); + + this.portEditor.setValue(new Integer(designerEnvManager.getJettyServerPort())); + + this.jdkHomeTextField.setText(designerEnvManager.getJdkHome()); + + this.oracleSpace.setSelected(designerEnvManager.isOracleSystemSpace()); + this.joinProductImprove.setSelected(designerEnvManager.isJoinProductImprove()); + } + + private int chooseCase(int sign) { + switch (sign) { + case 0: + return 0; + case MAX_UNDO_LIMIT_5: + return 1; + case MAX_UNDO_LIMIT_10: + return 2; + case MAX_UNDO_LIMIT_15: + return 3; + case MAX_UNDO_LIMIT_20: + return SELECTED_INDEX_4; + case MAX_UNDO_LIMIT_50: + return SELECTED_INDEX_5; + default: + return 1; + } + } + + /** + * The method of update. + */ + public void update(DesignerEnvManager designerEnvManager) { + if (designerEnvManager == null) { + return; + } + + designerEnvManager.setLogLocation(this.logExportDirectoryField.getText()); + + designerEnvManager.setSupportUndo(supportUndoCheckBox.isSelected()); + + designerEnvManager.setSupportDefaultParentCalculate(supportDefaultParentCalculateCheckBox.isSelected()); + + designerEnvManager.setSupportStringToFormula(supportStringToFormulaBox.isSelected()); + + designerEnvManager.setDefaultStringToFormula(defaultStringToFormulaBox.isSelected()); + + designerEnvManager.setSupportCellEditorDef(supportCellEditorDefCheckBox.isSelected()); + + designerEnvManager.setAutoCompleteShortcuts(shortCutKeyStore != null ? shortCutKeyStore.toString().replace(TYPE, DISPLAY_TYPE) : shortCutLabel.getText()); + + designerEnvManager.setDragPermited(isDragPermitedCheckBox.isSelected()); + + designerEnvManager.setGridLineColor(gridLineColorTBButton.getColor()); + + designerEnvManager.setPaginationLineColor(paginationLineColorTBButton.getColor()); + + designerEnvManager.setLanguage(getLanguageInt()); + + designerEnvManager.setPageLengthUnit((short) pageLengthComboBox.getSelectedIndex()); + designerEnvManager.setReportLengthUnit((short) reportLengthComboBox.getSelectedIndex()); + + designerEnvManager.setJettyServerPort(portEditor.getValue().intValue()); + + designerEnvManager.setJdkHome(jdkHomeTextField.getText()); + + designerEnvManager.setOracleSystemSpace(this.oracleSpace.isSelected()); + designerEnvManager.setJoinProductImprove(this.joinProductImprove.isSelected()); +// designerEnvManager.setAutoBackUp(this.autoBackUp.isSelected()); + + designerEnvManager.setUndoLimit(maxUndoLimit.getSelectedIndex() * SELECTED_INDEX_5); + if (maxUndoLimit.getSelectedIndex() == SELECTED_INDEX_5) { + designerEnvManager.setUndoLimit(MAX_UNDO_LIMIT_50); + } + + ServerConfig.getInstance().setServerLogLevel(((FRLevel) logLevelComboBox.getSelectedItem()).getLevel()); + + } + + /* + * 得到所选语言的int值 + */ + private int getLanguageInt() { + int l = 0; + String lang = (String) this.languageComboBox.getSelectedItem(); + for (int i = 0; i < LANGUAGE.size(); i++) { + if (ComparatorUtils.equals(lang, LANGUAGE.get(i))) { + l = i; + break; + } + } + return l; + } + + + // 如果语言设置改变了,则显示重启对话框 + public void showRestartDialog() { + if (!languageChanged) { + return; + } + int rv = JOptionPane.showOptionDialog( + null, + Inter.getLocText("FR-Designer_Language_Change_Successful"), + Inter.getLocText("FR-Designer-Plugin_Warning"), + JOptionPane.YES_NO_OPTION, + JOptionPane.INFORMATION_MESSAGE, + null, + new String[]{Inter.getLocText("FR-Designer-Basic_Restart_Designer"), Inter.getLocText("FR-Designer-Basic_Restart_Designer_Later")}, + null + ); + if (rv == JOptionPane.OK_OPTION) { + RestartHelper.restart(); + } + } + + @Override + public BasicDialog showWindow(Window window) { + return showWindow(window, new DialogActionAdapter() { + @Override + public void doOk() { + if (languageComboBox.getSelectedIndex() != designerEnvLanguageIndex) { + languageChanged = true; + } else { + languageChanged = false; + } + } + }); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/file/SaveAsTemplateAction.java b/designer-base/src/com/fr/design/actions/file/SaveAsTemplateAction.java new file mode 100644 index 0000000000..5d2ab15705 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/file/SaveAsTemplateAction.java @@ -0,0 +1,48 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.file; + +import java.awt.event.ActionEvent; + +import com.fr.base.BaseUtils; +import com.fr.design.actions.JTemplateAction; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.menu.KeySetUtils; + +/** + * Save as file + */ +public class SaveAsTemplateAction extends JTemplateAction> { + + public SaveAsTemplateAction(JTemplate dPane) { + super(dPane); + this.setMenuKeySet(KeySetUtils.SAVE_AS_TEMPLATE); + this.setName(getMenuKeySet().getMenuKeySetName() + "..."); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/saveAs.png")); + } + + /** + * 动作 + * @param e 事件 + */ + public void actionPerformed(ActionEvent e) { + JTemplate jt = this.getEditingComponent(); + // kunsnat: 保存前停止编辑状态,保存属性. + jt.stopEditing(); + jt.saveAsTemplate(); + this.setEnabled(true); + + jt.requestFocus(); + } + + @Override + public void update() { + super.update(); + +// this.setEnabled(!this.getEditingComponent().isSaved()); +// 另存为按钮应该一直可用使用 + this.setEnabled(true); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/file/SaveTemplateAction.java b/designer-base/src/com/fr/design/actions/file/SaveTemplateAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/file/SaveTemplateAction.java rename to designer-base/src/com/fr/design/actions/file/SaveTemplateAction.java diff --git a/designer-base/src/com/fr/design/actions/file/SwitchExistEnv.java b/designer-base/src/com/fr/design/actions/file/SwitchExistEnv.java new file mode 100644 index 0000000000..57574ae253 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/file/SwitchExistEnv.java @@ -0,0 +1,129 @@ +package com.fr.design.actions.file; + +import com.fr.base.BaseUtils; +import com.fr.base.Env; +import com.fr.base.FRContext; +import com.fr.dav.LocalEnv; +import com.fr.design.DesignerEnvManager; +import com.fr.design.actions.UpdateAction; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.tabledata.ResponseDataSourceChange; +import com.fr.design.dialog.InformationWarnPane; +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; +import com.fr.design.menu.SeparatorDef; +import com.fr.env.RemoteEnv; +import com.fr.env.SignIn; +import com.fr.general.ComparatorUtils; +import com.fr.general.FRLogger; +import com.fr.general.GeneralContext; +import com.fr.general.Inter; +import com.fr.stable.EnvChangedListener; +import com.fr.stable.ProductConstants; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.logging.Level; + + +public class SwitchExistEnv extends MenuDef { + + public SwitchExistEnv() { + this.setMenuKeySet(KeySetUtils.SWITCH_ENV); + this.setName(getMenuKeySet().getMenuName()); + this.setHasScrollSubMenu(true); + 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() { + //ButtonGroup group = new ButtonGroup(); + Iterator nameIt = DesignerEnvManager.getEnvManager().getEnvNameIterator(); + while (nameIt.hasNext()) { + String name = nameIt.next(); + this.setIconPath("com/fr/design/images/m_file/switch.png"); + this.addShortCut(new GetExistEnvAction(name)); + } + this.addShortCut(SeparatorDef.DEFAULT); + this.addShortCut(new EditEnvAction()); + } + + public static class GetExistEnvAction extends UpdateAction implements ResponseDataSourceChange { + public GetExistEnvAction() { + + } + + public GetExistEnvAction(String envName) { + this.setName(envName); + Env env = DesignerEnvManager.getEnvManager().getEnv(envName); + if (env instanceof LocalEnv) { + this.setSmallIcon(BaseUtils.readIcon("com/fr/design/images/data/bind/localconnect.png")); + } else if (env instanceof RemoteEnv) { + this.setSmallIcon(BaseUtils.readIcon("com/fr/design/images/data/bind/distanceconnect.png")); + } + } + + /** + * 响应数据集改变 + */ + public void fireDSChanged() { + fireDSChanged(new HashMap()); + } + + /** + * 响应数据集改变 + * + * @param map 数据集 + */ + public void fireDSChanged(Map map) { + DesignTableDataManager.fireDSChanged(map); + } + + /** + * 动作 + * + * @param e 事件 + */ + public void actionPerformed(ActionEvent e) { + DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); + Env selectedEnv = envManager.getEnv(this.getName()); + try { + if (selectedEnv instanceof RemoteEnv && !((RemoteEnv) selectedEnv).testServerConnection()) { + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText(new String[]{"M-SwitchWorkspace", "Failed"})); + return; + } + String remoteVersion = selectedEnv.getDesignerVersion(); + if (StringUtils.isBlank(remoteVersion) || ComparatorUtils.compare(remoteVersion, ProductConstants.DESIGNER_VERSION) < 0) { + String infor = Inter.getLocText("Server-version-tip"); + String moreInfo = Inter.getLocText("Server-version-tip-moreInfo"); + FRLogger.getLogger().log(Level.WARNING, infor); + new InformationWarnPane(infor, moreInfo, Inter.getLocText("Tooltips")).show(); + return; + } + SignIn.signIn(selectedEnv); + HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().refreshToolArea(); + fireDSChanged(); + } catch (Exception em) { + FRContext.getLogger().error(em.getMessage(), em); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText(new String[]{"M-SwitchWorkspace", "Failed"})); + TemplatePane.getInstance().editItems(); + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/file/WebPreviewUtils.java b/designer-base/src/com/fr/design/actions/file/WebPreviewUtils.java new file mode 100644 index 0000000000..94675929ad --- /dev/null +++ b/designer-base/src/com/fr/design/actions/file/WebPreviewUtils.java @@ -0,0 +1,95 @@ +package com.fr.design.actions.file; + +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.utils.DesignUtils; +import com.fr.file.FILE; +import com.fr.file.FileNodeFILE; +import com.fr.general.GeneralUtils; +import com.fr.general.Inter; +import com.fr.general.web.ParameterConstants; +import com.fr.stable.project.ProjectConstants; + +import javax.swing.*; +import java.util.Map; + +public final class WebPreviewUtils { + + public static void onWorkbookPreview(JTemplate jt) { + actionPerformed(jt, jt.getPreviewType().parametersForPreview(), ParameterConstants.REPORTLET); + } + + public static void onFormPreview(JTemplate jt) { + actionPerformed(jt, null, ParameterConstants.FORMLET); + } + + public static void actionPerformed(JTemplate jt, Map map, String actionType) { + if (jt == null) { + return; + } + + DesignerContext.getDesignerFrame().refreshToolbar(); + + jt.stopEditing(); + /* + * alex:如果没有保存,先保存到Env + * + * 如果保存失败,不执行下面的WebPreview + */ + if (!jt.isSaved() && !jt.saveTemplate2Env()) { + return; + } + + FILE currentTemplate = jt.getEditingFILE(); + // carl:是否是保存在运行环境下的模板,不是就不能被预览 + if (currentTemplate instanceof FileNodeFILE) { + browseUrl(currentTemplate, map, actionType, jt); + } else { + // 说明模板没有保存在报表运行环境下面,提示用户 + int selVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Web_Preview_Message"), + Inter.getLocText("Preview_ToolTips"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); + + if (JOptionPane.OK_OPTION == selVal) { + if (!jt.saveAsTemplate2Env()) { + return; + } + currentTemplate = jt.getEditingFILE(); + browseUrl(currentTemplate, map, actionType, jt); + } + } + } + + private static void browseUrl(FILE currentTemplate, Map map, String actionType, JTemplate jt) { + if (!(currentTemplate instanceof FileNodeFILE)) { + return; + } + + if (currentTemplate.exists()) { + String path = currentTemplate.getPath(); + if (path.startsWith(ProjectConstants.REPORTLETS_NAME)) { + path = path.substring(ProjectConstants.REPORTLETS_NAME.length() + 1); + + java.util.List parameterNameList = new java.util.ArrayList(); + java.util.List parameterValueList = new java.util.ArrayList(); + + parameterNameList.add(actionType); + parameterValueList.add(path); + if (map != null) { + for (String key : map.keySet()) { + parameterNameList.add(key); + parameterValueList.add(GeneralUtils.objectToString(map.get(key))); + } + } + DesignUtils.visitEnvServerByParameters(parameterNameList.toArray(new String[parameterNameList.size()]), parameterValueList.toArray(new String[parameterValueList.size()])); + } + } else { + int selVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Web_Preview_Message"), + Inter.getLocText("Preview_ToolTips"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); + if (JOptionPane.OK_OPTION == selVal) { + if (!jt.saveAsTemplate()) { + return; + } + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/help/AboutAction.java b/designer-base/src/com/fr/design/actions/help/AboutAction.java new file mode 100644 index 0000000000..4755900254 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/help/AboutAction.java @@ -0,0 +1,53 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.help; + +import com.fr.design.actions.UpdateAction; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.menu.MenuKeySet; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +/** + * help about. + */ +public class AboutAction extends UpdateAction { + public AboutAction() { + this.setMenuKeySet(ABOUT); + this.setName(getMenuKeySet().getMenuKeySetName()+"..."); + this.setMnemonic(getMenuKeySet().getMnemonic()); + } + + /** + * 动作 + * @param evt 事件 + */ + public void actionPerformed(ActionEvent evt) { + AboutPane aboutPane = new AboutPane(); + AboutDialog aboutDailog = new AboutDialog(DesignerContext.getDesignerFrame(), aboutPane); + aboutDailog.setVisible(true); + } + + public static final MenuKeySet ABOUT = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'S'; + } + + @Override + public String getMenuName() { + return Inter.getLocText("M_Help-About_Software"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; + + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/help/AboutDialog.java b/designer-base/src/com/fr/design/actions/help/AboutDialog.java new file mode 100644 index 0000000000..4ca906a201 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/help/AboutDialog.java @@ -0,0 +1,100 @@ +package com.fr.design.actions.help; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.AbstractAction; +import javax.swing.ActionMap; +import javax.swing.InputMap; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.KeyStroke; + +import com.fr.design.gui.frpane.UITabbedPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +import com.fr.stable.ProductConstants; +import com.fr.design.utils.gui.GUICoreUtils; + +/** + * Dialog displaying information about the application. + */ +public class AboutDialog extends JDialog implements ActionListener { + /** + * Construct a new AboutDialog. + */ + public AboutDialog() { + } + + public AboutDialog(Frame parent, JPanel aboutPanel) { + super(parent, true); + + this.setTitle(ProductConstants.PRODUCT_NAME); + this.setResizable(false); + JPanel defaultPane=FRGUIPaneFactory.createBorderLayout_L_Pane(); + this.setContentPane(defaultPane); + + okButton = new UIButton(Inter.getLocText("OK")); + okButton.addActionListener(this); + + tabbedPane = new UITabbedPane(); + sysPane = new SystemInfoPane(); + + tabbedPane.addTab(Inter.getLocText("About"), aboutPanel); + tabbedPane.addTab(Inter.getLocText("System"), sysPane); + + buttonPanel = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + buttonPanel.add(okButton); + + defaultPane.add(tabbedPane, BorderLayout.CENTER); + defaultPane.add(buttonPanel, BorderLayout.SOUTH); + + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + dialogExit(); + } + }); + + //esp. + InputMap inputMapAncestor = defaultPane.getInputMap( + JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + ActionMap actionMap = defaultPane.getActionMap(); + + //transfer focus to CurrentEditor + inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "dialogExit"); + actionMap.put("dialogExit", new AbstractAction() { + public void actionPerformed(ActionEvent evt) { + dialogExit(); + } + }); + + this.getRootPane().setDefaultButton(okButton); + + this.setSize(new Dimension(660, 600)); + GUICoreUtils.centerWindow(this); + } + + public void dialogExit() { + this.dispose(); + } + + /** + * Called when the ok button is clicked. + */ + public void actionPerformed(ActionEvent e) { + this.dialogExit(); + } + + private SystemInfoPane sysPane; + private JPanel buttonPanel; + private UITabbedPane tabbedPane; + private UIButton okButton; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/help/AboutPane.java b/designer-base/src/com/fr/design/actions/help/AboutPane.java new file mode 100644 index 0000000000..57f1badb95 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/help/AboutPane.java @@ -0,0 +1,262 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.help; + +import com.fr.base.FRContext; +import com.fr.design.DesignerEnvManager; +import com.fr.design.gui.ilable.ActionLabel; +import com.fr.design.gui.ilable.BoldFontTextLabel; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralUtils; +import com.fr.general.Inter; +import com.fr.general.SiteCenter; +import com.fr.stable.ProductConstants; +import com.fr.stable.StringUtils; +import com.fr.stable.bridge.StableFactory; +import com.fr.start.BBSGuestPaneProvider; + +import javax.swing.*; +import java.awt.*; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.net.URI; +import java.util.Locale; + +public class AboutPane extends JPanel { + private static final String FINEREPORT = "FineReport"; + private static final int DEFAULT_GAP = 12; + private static final String COPYRIGHT_LABEL = "\u00A9 "; + private static final String BUILD_PREFIX = " Build #"; + + public AboutPane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + //center panel + JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + this.add(centerPane, BorderLayout.CENTER); + + JPanel contentPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + centerPane.add(contentPane, BorderLayout.NORTH); + + BoxCenterAlignmentCopyablePane buildCopyPane = new BoxCenterAlignmentCopyablePane( + getBuildTitle(), + GeneralUtils.readFullBuildNO(), + new String[]{ + Inter.getLocText("FR-Designer-Basic_Copy_Build_NO"), + Inter.getLocText("FR-Designer-Basic_Copy_Build_NO_OK") + }); + contentPane.add(buildCopyPane); + + BoxCenterAligmentPane boxCenterAlignmentPane = new BoxCenterAligmentPane(getCopyRight()); + contentPane.add(boxCenterAlignmentPane); + + boxCenterAlignmentPane = new BoxCenterAligmentPane(Inter.getLocText("About-All_Rights_Reserved")); + contentPane.add(boxCenterAlignmentPane); + + contentPane.add(new BoxCenterAlignmentCopyablePane( + Inter.getLocText("FR-Designer-Basic_Activation_Key"), + DesignerEnvManager.getEnvManager().getActivationKey(), + new String[]{ + Inter.getLocText("FR-Designer-Basic_Copy_Activation_Key"), + Inter.getLocText("FR-Designer-Basic_Activation_Key_Copy_OK") + })); + + if (shouldShowPhoneAndQQ()) { + if (ComparatorUtils.equals(ProductConstants.APP_NAME, FINEREPORT)) { + boxCenterAlignmentPane = new BoxCenterAligmentPane(Inter.getLocText("FR-Designer_Service_Phone") + ProductConstants.COMPARE_TELEPHONE); + contentPane.add(boxCenterAlignmentPane); + } + boxCenterAlignmentPane = new BoxCenterAligmentPane("QQ:" + SiteCenter.getInstance().acquireUrlByKind("help.qq")); + contentPane.add(boxCenterAlignmentPane); + } + + BoxCenterAligmentPane actionLabel = getURLActionLabel(SiteCenter.getInstance().acquireUrlByKind("website." + FRContext.getLocale(), ProductConstants.WEBSITE_URL)); + BoxCenterAligmentPane emailLabel = getEmailActionLabel(SiteCenter.getInstance().acquireUrlByKind("support.email", ProductConstants.SUPPORT_EMAIL)); + + contentPane.add(actionLabel); + contentPane.add(emailLabel); + if (shouldShowThanks()) { + addThankPane(contentPane); + } + } + + // 是否显示服务电话和 qq + private boolean shouldShowPhoneAndQQ() { + return !FRContext.getLocale().equals(Locale.US); + } + + // 是否显示鸣谢面板 + private boolean shouldShowThanks() { + Locale[] hideLocales = {Locale.US, Locale.KOREA, Locale.JAPAN}; + for (Locale loc : hideLocales) { + if (FRContext.getLocale().equals(loc)) { + return false; + } + } + return true; + } + + //添加鸣谢面板 + private void addThankPane(JPanel contentPane) { + BBSGuestPaneProvider pane = StableFactory.getMarkedInstanceObjectFromClass(BBSGuestPaneProvider.XML_TAG, BBSGuestPaneProvider.class); + if (pane == null) { + return; + } + + contentPane.add(Box.createVerticalStrut(DEFAULT_GAP)); + contentPane.add((Component) pane); + } + + private String append(String... strs) { + StringBuilder sb = new StringBuilder(); + for (String str : strs) { + sb.append(str); + } + + return sb.toString(); + } + + private String getCopyRight() { + return append(Inter.getLocText("FR-Designer_About_CopyRight"), COPYRIGHT_LABEL, + ProductConstants.HISTORY, StringUtils.BLANK, SiteCenter.getInstance().acquireUrlByKind("company.name", ProductConstants.COMPANY_NAME)); + } + + private String getBuildTitle() { + return append(ProductConstants.APP_NAME, Inter.getLocText("FR-Designer_About_Version"), + StringUtils.BLANK, ProductConstants.RELEASE_VERSION, BUILD_PREFIX); + } + + private BoxCenterAligmentPane getEmailActionLabel(final String mailTo) { + ActionLabel emailLabel = new ActionLabel(mailTo); + + emailLabel.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + try { + Desktop.getDesktop().mail(new URI(mailTo)); + } catch (Exception ignore) { + + } + } + }); + + return new BoxCenterAligmentPane(emailLabel); + } + + private BoxCenterAligmentPane getURLActionLabel(final String url) { + ActionLabel actionLabel = new ActionLabel(url); + actionLabel.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + try { + Desktop.getDesktop().browse(new URI(url)); + } catch (Exception exp) { + + } + } + }); + + return new BoxCenterAligmentPane(actionLabel); + } + + class UserLabel extends BoldFontTextLabel { + public UserLabel(String text) { + super(text); + + if (text != null && text.length() > 30) { + ToolTipManager manager = ToolTipManager.sharedInstance(); + manager.registerComponent(this); + } + } + + public String getToolTipText(MouseEvent e) { + return this.getText(); + } + + public Point getToolTipLocation(MouseEvent e) { + return new Point(0, 0); + } + } + + class BoxCenterAligmentPane extends JPanel { + + private UILabel textLabel; + + public BoxCenterAligmentPane(String text) { + this(new UILabel(text)); + } + + public BoxCenterAligmentPane(UILabel label) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + JPanel centerPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + this.add(centerPane, BorderLayout.CENTER); + + this.textLabel = label; + centerPane.add(textLabel); + } + + public void setFont(Font font) { + super.setFont(font); + + if (textLabel != null) { + textLabel.setFont(font); + } + } + } + + class BoxCenterAlignmentCopyablePane extends JPanel { + + private UILabel label; + private UILabel textField; + private UILabel lastLabel; + + public BoxCenterAlignmentCopyablePane(String title, String copyText, final String[] descriptions) { + setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel centerPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + this.label = new UILabel(title); + this.textField = new UILabel(copyText); + textField.setBackground(null); + textField.setBorder(null); + + centerPane.add(label); + centerPane.add(textField); + textField.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + StringSelection selection = new StringSelection(textField.getText()); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(selection, selection); + lastLabel.setText(descriptions[1]); + lastLabel.setForeground(Color.RED); + } + } + }); + + this.lastLabel = new UILabel(descriptions[0]); + lastLabel.setForeground(Color.lightGray); + centerPane.add(lastLabel); + + add(centerPane, BorderLayout.CENTER); + } + + public void setFont(Font font) { + super.setFont(font); + + if (textField != null) { + textField.setFont(font); + } + if (label != null) { + label.setFont(font); + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/help/FeedBackAction.java b/designer-base/src/com/fr/design/actions/help/FeedBackAction.java new file mode 100644 index 0000000000..f182ad3546 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/help/FeedBackAction.java @@ -0,0 +1,57 @@ +package com.fr.design.actions.help; + +import com.fr.base.BaseUtils; +import com.fr.design.actions.UpdateAction; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrame; +import com.fr.design.menu.MenuKeySet; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-18 + * Time: 上午9:09 + */ +public class FeedBackAction extends UpdateAction { + + public FeedBackAction() { + this.setMenuKeySet(FEED_BACK); + this.setName(getMenuKeySet().getMenuName()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_help/feedback.png")); + } + + /** + * 动作 + * @param e 事件 + */ + public void actionPerformed(ActionEvent e) { + final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); + FeedBackPane feedBackPane = new FeedBackPane(); + BasicDialog basicDialog =feedBackPane.showWindow(designerFrame,false); + feedBackPane.setFeedbackDialog(basicDialog); + basicDialog.setVisible(true); + } + + public static final MenuKeySet FEED_BACK = new MenuKeySet() { + @Override + public char getMnemonic() { + return 0; + } + + @Override + public String getMenuName() { + return Inter.getLocText("product_feedback"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/help/FeedBackPane.java b/designer-base/src/com/fr/design/actions/help/FeedBackPane.java new file mode 100644 index 0000000000..e7894e77f2 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/help/FeedBackPane.java @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.actions.help; + +import com.fr.base.FRContext; +import com.fr.base.FeedBackInfo; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.BasicPane; +import com.fr.general.ComparatorUtils; +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.stable.StringUtils; +import com.fr.design.utils.DesignUtils; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; +import javax.swing.border.MatteBorder; +import javax.swing.plaf.ColorUIResource; +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.PlainDocument; +import java.awt.*; +import java.awt.event.*; +import java.util.Date; +import java.util.concurrent.CancellationException; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-18 + * Time: 上午9:50 + */ +public class FeedBackPane extends BasicPane { + + private static final Dimension DIALOG_SIZE = new Dimension(660, 600); + private static final Dimension TEXT_AREA_SIZE = new Dimension(585, 180); + private static final int TEXT_FIELD_WIDTH = 160; + private static final int TEXT_FIELD_HEIGHT = 21; + private static final int GAP = 5; + private static final ColorUIResource BORDER_COLOR = new ColorUIResource(168, 172, 180); + private static final Border TIP_BORDER = BorderFactory.createEmptyBorder(10, 4, 4, 4); + private static final Border DIALOG_BORDER = BorderFactory.createEmptyBorder(0, 6, 4, 6); + private static final Border INNER_LEFT_BORDER = BorderFactory.createEmptyBorder(15, 18, 0, 0); + private static final Border TEXT_AREA_BORDER = BorderFactory.createEmptyBorder(0, 13, 0, 15); + private static final Border SEND_BORDER = BorderFactory.createEmptyBorder(10, 0, 10, 0); + private static final int DETAIL_TEXT_MAX_LENGTH = 400; + private static final int QQ_MAX_LENGTH = 15; + private static final int EMAIL_MAX_LENGTH = 40; + private static final int TEL_MAX_LENGTH = 11; + private static final String ALLOWED_INTEGER_TYPE = "0123456789"; + private SwingWorker worker; + private JDialog dlg = new JDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Send"), true); + private UIButton ok = new UIButton(Inter.getLocText("OK")); + private UIButton cancle = new UIButton(Inter.getLocText("Cancel")); + private int ifHasBeenWriten = 0; + private UITextArea detailField; + private boolean isSendSuccessful = false; + private UITextField qq = new UITextField() { + public Dimension getPreferredSize() { + return new Dimension(TEXT_FIELD_WIDTH, TEXT_FIELD_HEIGHT); + } + }; + protected UITextField email = new UITextField() { + public Dimension getPreferredSize() { + return new Dimension(TEXT_FIELD_WIDTH, TEXT_FIELD_HEIGHT); + } + }; + protected UITextField phone = new UITextField() { + public Dimension getPreferredSize() { + return new Dimension(TEXT_FIELD_WIDTH, TEXT_FIELD_HEIGHT); + } + }; + private UIButton sendButton = null; + + private BasicDialog feedbackDialog = null; + private JOptionPane send = null; + + public FeedBackPane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + initDetailArea(); + UILabel tip = new UILabel(Inter.getLocText("feedback_info")); + tip.setBorder(TIP_BORDER); + this.add(tip, BorderLayout.NORTH); + UIScrollPane scrollPane = new UIScrollPane(initDetailPane()); + scrollPane.setBorder(new MatteBorder(1, 1, 1, 1, BORDER_COLOR)); + this.add(scrollPane, BorderLayout.CENTER); + this.add(getSendButton(), BorderLayout.SOUTH); + sendButton.setEnabled(false); + this.setBorder(DIALOG_BORDER); + initDocument(); + } + + public void setFeedbackDialog(BasicDialog dialog) { + feedbackDialog = dialog; + } + + public Dimension getPreferredSize() { + return DIALOG_SIZE; + } + + + private void initDocument() { + LimitedDocument qqLimited = new LimitedDocument(QQ_MAX_LENGTH); + qqLimited.setAllowChar(ALLOWED_INTEGER_TYPE); + qq.setDocument(qqLimited); + email.setDocument(new LimitedDocument(EMAIL_MAX_LENGTH)); + LimitedDocument phoneLimited = new LimitedDocument(TEL_MAX_LENGTH); + phoneLimited.setAllowChar(ALLOWED_INTEGER_TYPE); + phone.setDocument(phoneLimited); + } + + + private void initDetailArea() { + detailField = new UITextArea() { + public Dimension getPreferredSize() { + return TEXT_AREA_SIZE; + } + }; + this.detailField.setForeground(Color.gray); + this.detailField.setText(Inter.getLocText("feedback_tip")); + detailField.addKeyListener(new KeyAdapter() { + + @Override + public void keyPressed(KeyEvent e) { + if (ifHasBeenWriten == 0) { + detailField.setText(StringUtils.EMPTY); + detailField.setDocument(new LimitedDocument(DETAIL_TEXT_MAX_LENGTH)); + ifHasBeenWriten = 1; + } + } + + public void keyReleased(KeyEvent e) { + if (ifHasBeenWriten == 0) { + detailField.setText(StringUtils.EMPTY); + detailField.setDocument(new LimitedDocument(DETAIL_TEXT_MAX_LENGTH)); + ifHasBeenWriten = 1; + } + detailField.setForeground(Color.black); + String text = detailField.getText(); + // 判断在中文输入状态是否还包含提示符 要删掉 + String tip = Inter.getLocText("feedback_tip"); + if (text.contains(tip)) { + text = text.substring(0, text.indexOf(tip)); + detailField.setText(text); + } + sendButton.setEnabled(!(ifHasBeenWriten == 0 || ComparatorUtils.equals(detailField.getText().trim(), StringUtils.EMPTY))); + } + }); + + detailField.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + if (ifHasBeenWriten == 0) { + detailField.setText(StringUtils.EMPTY); + detailField.setDocument(new LimitedDocument(DETAIL_TEXT_MAX_LENGTH)); + ifHasBeenWriten = 1; + } + } + }); + } + + private JPanel initDetailPane() { + double p = TableLayout.PREFERRED; + UILabel info = new UILabel(Inter.getLocText("detail_description") + ":"); + info.setBorder(INNER_LEFT_BORDER); + JPanel contactPane = getContactPane(); + contactPane.setBorder(INNER_LEFT_BORDER); + UILabel contact = new UILabel(Inter.getLocText("contact_info") + ":"); + contact.setBorder(INNER_LEFT_BORDER); + JPanel jPanel = new JPanel(); + jPanel.add(detailField); + jPanel.setBorder(TEXT_AREA_BORDER); + Component[][] components = new Component[][]{ + new Component[]{info}, + new Component[]{jPanel}, + new Component[]{contact}, + new Component[]{contactPane}, + }; + double[] rowSize = {p, p, p, p}; + double[] columnSize = {p}; + int[][] rowCount = {{1}, {1}, {1}, {1}}; + return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, LayoutConstants.VGAP_MEDIUM); + } + + + protected JPanel getContactPane() { + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + Component[][] components = new Component[][]{ + new Component[]{new UILabel("QQ:", SwingConstants.RIGHT), qq}, + new Component[]{new UILabel(Inter.getLocText("email") + ":", SwingConstants.RIGHT), email}, + new Component[]{new UILabel(Inter.getLocText("mobile_number") + ":", SwingConstants.RIGHT), phone} + }; + double[] rowSize = {p, p, p}; + double[] columnSize = {p, p}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}}; + return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_MEDIUM, LayoutConstants.VGAP_MEDIUM); + } + + private JPanel getSendButton() { + JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + JPanel buttonsPane = new JPanel(new FlowLayout(FlowLayout.LEFT, GAP, 0)); + controlPane.add(buttonsPane, BorderLayout.EAST); + sendButton = new UIButton(Inter.getLocText("Send")); + buttonsPane.add(sendButton); + buttonsPane.setBorder(SEND_BORDER); + sendButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent evt) { + doWithSendPane(); + } + }); + controlPane.setBorder(new EmptyBorder(0, 0, GAP, 0)); + return controlPane; + } + + + private void doWithSendPane() { + Object[] options = new Object[]{ok, cancle}; + send = new JOptionPane(Inter.getLocText("sending"), + JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, options, options[0]); + ok.setEnabled(false); + ok.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (isSendSuccessful) { + dlg.dispose(); + feedbackDialog.dispose(); + } else { + ok.setEnabled(false); + send.setMessage(Inter.getLocText("sending")); + setWorker(send); + worker.execute(); + } + } + }); + cancle.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + worker.cancel(true); + dlg.dispose(); + } + }); + + dlg.setContentPane(send); + dlg.pack(); + dlg.setLocationRelativeTo(DesignerContext.getDesignerFrame()); + setWorker(send); + worker.execute(); + dlg.setVisible(true); + + + } + + + private void setWorker(final JOptionPane send) { + worker = new SwingWorker() { + @Override + protected Boolean doInBackground() throws Exception { + FeedBackInfo feedBackInfo = new FeedBackInfo(new Date(), qq.getText(), email.getText(), phone.getText(), detailField.getText()); + try { + return DesignUtils.sendFeedBack(feedBackInfo); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + return false; + } + } + + public void done() { + try { + boolean model = get(); + ok.setEnabled(true); + cancle.setEnabled(!model); + if (model) { + //发送成功 + isSendSuccessful = true; + send.setMessage(Inter.getLocText("HJS-Send_Successfully") + "!"); + } else { + isSendSuccessful = false; + String[] message = new String[]{"HJS-Send_Failed", "try_resending"}; + String[] operator = new String[]{",", ""}; + send.setMessage(Inter.getLocText(message, operator)); + } + } catch (Exception e) { + isSendSuccessful = false; + if (!(e instanceof CancellationException)) { + FRContext.getLogger().error(e.getMessage(), e); + } + } + } + }; + } + + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("product_feedback"); + } + + + private class LimitedDocument extends PlainDocument { + private static final long serialVersionUID = 1L; + private int maxLength = -1;// 允许的最大长度 + private String allowCharAsString = null;// 允许的字符串格式(0123456789) + + public LimitedDocument(int maxLength) { + super(); + this.maxLength = maxLength; + } + + public void insertString(int offset, String str, AttributeSet attrSet) throws BadLocationException { + if (str == null) { + return; + } + if (allowCharAsString != null && str.length() == 1) { + if (allowCharAsString.indexOf(str) == -1) { + Toolkit.getDefaultToolkit().beep();// 发出一个警告声 + return;// 不是所要求的字符格式,就直接返回,不进行下面的添加 + } + } + char[] charVal = str.toCharArray(); + String strOldValue = getText(0, getLength()); + char[] tmp = strOldValue.toCharArray(); + if (maxLength != -1 && (tmp.length + charVal.length > maxLength)) { + Toolkit.getDefaultToolkit().beep();// 发出一个警告声 + return;// 长度大于指定的长度maxLength,也直接返回,不进行下面的添加 + } + super.insertString(offset, str, attrSet); + } + + public void setAllowChar(String str) { + allowCharAsString = str; + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/help/ForumAction.java b/designer-base/src/com/fr/design/actions/help/ForumAction.java new file mode 100644 index 0000000000..5a07cca92d --- /dev/null +++ b/designer-base/src/com/fr/design/actions/help/ForumAction.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.actions.help; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.design.actions.UpdateAction; +import com.fr.design.menu.MenuKeySet; +import com.fr.general.Inter; +import com.fr.general.SiteCenter; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-18 + * Time: 上午9:21 + */ +public class ForumAction extends UpdateAction { + public ForumAction() { + this.setMenuKeySet(FORUM); + this.setName(getMenuKeySet().getMenuName()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_help/product_forum.png")); + } + + + /** + * 动作 + * @param e 事件 + */ + public void actionPerformed(ActionEvent e) { + String url = SiteCenter.getInstance().acquireUrlByKind("bbs"); + 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("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); + } + } + + public static final MenuKeySet FORUM = new MenuKeySet() { + @Override + public char getMnemonic() { + return 0; + } + + @Override + public String getMenuName() { + return Inter.getLocText("Forum"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/help/SupportQQAction.java b/designer-base/src/com/fr/design/actions/help/SupportQQAction.java new file mode 100644 index 0000000000..ae59df4a53 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/help/SupportQQAction.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.actions.help; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.design.actions.UpdateAction; +import com.fr.design.menu.MenuKeySet; +import com.fr.general.Inter; +import com.fr.stable.ProductConstants; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +/** + * Created with IntelliJ IDEA. + * User: wikky + * Date: 14-6-20 + * Time: 上午10:01 + * To change this template use File | Settings | File Templates. + */ +public class SupportQQAction extends UpdateAction { + + public SupportQQAction(){ + this.setMenuKeySet(SUPPORT_QQ); + this.setName(getMenuKeySet().getMenuName()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_help/support_qq.png")); + } + @Override + public void actionPerformed(ActionEvent e) { + try { + Desktop.getDesktop().browse(new URI(ProductConstants.SUPPORT_QQ)); + } catch (IOException exp) { + JOptionPane.showMessageDialog(null, Inter.getLocText("Set_default_browser")); + FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); + } catch (URISyntaxException exp) { + FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); + } + } + + public static final MenuKeySet SUPPORT_QQ = new MenuKeySet() { + @Override + public char getMnemonic() { + return 0; + } + + @Override + public String getMenuName() { + return Inter.getLocText("Support_QQ"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/help/SystemInfoPane.java b/designer-base/src/com/fr/design/actions/help/SystemInfoPane.java new file mode 100644 index 0000000000..f24e42877c --- /dev/null +++ b/designer-base/src/com/fr/design/actions/help/SystemInfoPane.java @@ -0,0 +1,69 @@ +package com.fr.design.actions.help; + +import java.awt.BorderLayout; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.Properties; + +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableColumnModel; + +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +import com.fr.stable.ProductConstants; + +public class SystemInfoPane extends JPanel { + public SystemInfoPane() { + super(FRGUIPaneFactory.createBorderLayout()); + + DefaultTableModel tableModel = new DefaultTableModel(); + JTable table = new JTable(tableModel) { + public boolean isCellEditable(int row, int column) { + return false; + } + }; + tableModel.addColumn(Inter.getLocText("Property")); + tableModel.addColumn(Inter.getLocText("Value")); + + Properties properties = System.getProperties(); + Object[] keys = new Object[properties.size()]; + + int index = 0; + Enumeration enumeration = properties.propertyNames(); + while (enumeration.hasMoreElements()) { + keys[index++] = enumeration.nextElement(); + } + Arrays.sort(keys); + + for (int i = 0; i < keys.length; i++) { + Object[] tableRowData = new Object[2]; + String keyValue = keys[i].toString(); + // james:屏蔽掉exe4j的内容 + if (keyValue.indexOf("exe4j") != -1) { + continue; + } + // james:这个也是exe4j的东东 + if ("install4j.exeDir".equals(keyValue)) { + continue; + } + + if(keyValue.indexOf("FineReport") != -1){ + keys[i] = keyValue.replaceAll("FineReport", ProductConstants.APP_NAME); + } + + tableRowData[0] = keys[i]; + tableRowData[1] = properties.getProperty((String) keys[i]); + tableModel.addRow(tableRowData); + } + + table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + TableColumnModel columnModel = table.getColumnModel(); + columnModel.getColumn(0).setPreferredWidth(160); + columnModel.getColumn(1).setPreferredWidth(240); + + add(new JScrollPane(table), BorderLayout.CENTER); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/help/TutorialAction.java b/designer-base/src/com/fr/design/actions/help/TutorialAction.java new file mode 100644 index 0000000000..35233430b1 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/help/TutorialAction.java @@ -0,0 +1,101 @@ +package com.fr.design.actions.help; + +import java.awt.Desktop; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.util.Locale; + +import javax.swing.KeyStroke; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.base.Utils; +import com.fr.design.actions.UpdateAction; +import com.fr.design.menu.MenuKeySet; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.general.SiteCenter; +import com.fr.general.http.HttpClient; +import com.fr.stable.OperatingSystem; +import com.fr.stable.ProductConstants; +import com.fr.stable.StableUtils; + +public class TutorialAction extends UpdateAction { + + public TutorialAction() { + this.setMenuKeySet(HELP_TUTORIAL); + this.setName(getMenuKeySet().getMenuName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/help.png")); + this.setAccelerator(getMenuKeySet().getKeyStroke()); + } + + private void nativeExcuteMacInstallHomePrograms(String appName) { + String installHome = StableUtils.getInstallHome(); + if(installHome == null) { + FRContext.getLogger().error("Can not find the install home, please check it."); + } else { + String appPath = StableUtils.pathJoin(new String[]{installHome, "bin", appName}); + if(!(new File(appPath)).exists()) { + FRContext.getLogger().error(appPath + " can not be found."); + } + + String cmd = "open " + appPath; + Runtime runtime = Runtime.getRuntime(); + + try { + runtime.exec(cmd); + } catch (IOException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + + } + } + /** + * 动作 + * @param evt 事件 + */ + public void actionPerformed(ActionEvent evt) { + String helpURL = SiteCenter.getInstance().acquireUrlByKind("help." + FRContext.getLocale()); + + if (helpURL != null) { + HttpClient client = new HttpClient(helpURL); + if(client.getResponseCode() != -1) { + try { + Desktop.getDesktop().browse(new URI(helpURL)); + return; + } catch (Exception e) { + //出了异常的话, 依然打开本地教程 + } + } + } + + if (OperatingSystem.isMacOS()) { + nativeExcuteMacInstallHomePrograms("helptutorial.app"); + } + else { + Utils.nativeExcuteInstallHomePrograms("helptutorial.exe"); + } + } + + public static final MenuKeySet HELP_TUTORIAL = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'T'; + } + + @Override + public String getMenuName() { + return Inter.getLocText("FR-Designer_COMMUNITY_HELP"); + } + + @Override + public KeyStroke getKeyStroke() { + return KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0); + } + }; + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/help/WebDemoAction.java b/designer-base/src/com/fr/design/actions/help/WebDemoAction.java new file mode 100644 index 0000000000..bf3f65229e --- /dev/null +++ b/designer-base/src/com/fr/design/actions/help/WebDemoAction.java @@ -0,0 +1,46 @@ +package com.fr.design.actions.help; + +import com.fr.base.BaseUtils; +import com.fr.design.actions.UpdateAction; +import com.fr.design.menu.MenuKeySet; +import com.fr.general.Inter; +import com.fr.start.StartServer; + +import javax.swing.*; +import java.awt.event.ActionEvent; + + +public class WebDemoAction extends UpdateAction { + public WebDemoAction() { + this.setMenuKeySet(PRODUCT_DEMO); + this.setName(getMenuKeySet().getMenuName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_help/demo.png")); + } + + /** + * 动作 + * @param evt 事件 + */ + public void actionPerformed(ActionEvent evt) { + StartServer.browserDemoURL(); + } + + public static final MenuKeySet PRODUCT_DEMO = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'D'; + } + + @Override + public String getMenuName() { + return Inter.getLocText("FR-Product_Demo"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/help/alphafine/AlphaFineAction.java b/designer-base/src/com/fr/design/actions/help/alphafine/AlphaFineAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/help/alphafine/AlphaFineAction.java rename to designer-base/src/com/fr/design/actions/help/alphafine/AlphaFineAction.java diff --git a/designer_base/src/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java b/designer-base/src/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java similarity index 100% rename from designer_base/src/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java rename to designer-base/src/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java diff --git a/designer_base/src/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java b/designer-base/src/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java similarity index 100% rename from designer_base/src/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java rename to designer-base/src/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java diff --git a/designer_base/src/com/fr/design/actions/help/alphafine/AlphaFineContext.java b/designer-base/src/com/fr/design/actions/help/alphafine/AlphaFineContext.java similarity index 100% rename from designer_base/src/com/fr/design/actions/help/alphafine/AlphaFineContext.java rename to designer-base/src/com/fr/design/actions/help/alphafine/AlphaFineContext.java diff --git a/designer_base/src/com/fr/design/actions/help/alphafine/AlphaFineListener.java b/designer-base/src/com/fr/design/actions/help/alphafine/AlphaFineListener.java similarity index 100% rename from designer_base/src/com/fr/design/actions/help/alphafine/AlphaFineListener.java rename to designer-base/src/com/fr/design/actions/help/alphafine/AlphaFineListener.java diff --git a/designer_base/src/com/fr/design/actions/help/alphafine/RemindDialog.java b/designer-base/src/com/fr/design/actions/help/alphafine/RemindDialog.java similarity index 100% rename from designer_base/src/com/fr/design/actions/help/alphafine/RemindDialog.java rename to designer-base/src/com/fr/design/actions/help/alphafine/RemindDialog.java diff --git a/designer_base/src/com/fr/design/actions/help/alphafine/RemindPane.java b/designer-base/src/com/fr/design/actions/help/alphafine/RemindPane.java similarity index 100% rename from designer_base/src/com/fr/design/actions/help/alphafine/RemindPane.java rename to designer-base/src/com/fr/design/actions/help/alphafine/RemindPane.java diff --git a/designer_base/src/com/fr/design/actions/server/ConnectionListAction.java b/designer-base/src/com/fr/design/actions/server/ConnectionListAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/server/ConnectionListAction.java rename to designer-base/src/com/fr/design/actions/server/ConnectionListAction.java diff --git a/designer-base/src/com/fr/design/actions/server/FunctionManagerAction.java b/designer-base/src/com/fr/design/actions/server/FunctionManagerAction.java new file mode 100644 index 0000000000..f06d5d2dfc --- /dev/null +++ b/designer-base/src/com/fr/design/actions/server/FunctionManagerAction.java @@ -0,0 +1,86 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.server; + + +import com.fr.config.Configuration; +import com.fr.design.actions.UpdateAction; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.formula.FunctionManagerPane; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.menu.MenuKeySet; +import com.fr.file.FunctionConfig; +import com.fr.general.IOUtils; +import com.fr.general.Inter; +import com.fr.transaction.Configurations; +import com.fr.transaction.Worker; + +import javax.swing.*; +import java.awt.event.ActionEvent; + + +/** + * FunctionManager. + */ +public class FunctionManagerAction extends UpdateAction { + public FunctionManagerAction() { + this.setMenuKeySet(FUNCTION_MANAGER); + this.setName(getMenuKeySet().getMenuKeySetName()+"..."); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/m_web/function.png")); + this.setSearchText(new FunctionManagerPane()); + } + + /** + * 动作 + * @param evt 事件 + */ + public void actionPerformed(ActionEvent evt) { + final FunctionManagerPane functionManagerPane = new FunctionManagerPane(); + BasicDialog functionManagerDialog = + functionManagerPane.showWindow( + DesignerContext.getDesignerFrame(),null); + final FunctionConfig functionManager = FunctionConfig.getInstance(); + functionManagerDialog.addDialogActionListener(new DialogActionAdapter() { + public void doOk() { + Configurations.update(new Worker() { + @Override + public void run() { + functionManagerPane.update(functionManager); + } + + @Override + public Class[] targets() { + return new Class[]{FunctionConfig.class}; + } + }); + + } + }); + functionManagerPane.populate(functionManager.mirror()); + functionManagerDialog.setVisible(true); + } + + public void update() { + this.setEnabled(true); + } + + public static final MenuKeySet FUNCTION_MANAGER = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'F'; + } + + @Override + public String getMenuName() { + return Inter.getLocText("M_Server-Function_Manager"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/server/GlobalParameterAction.java b/designer-base/src/com/fr/design/actions/server/GlobalParameterAction.java new file mode 100644 index 0000000000..d141b3b7bb --- /dev/null +++ b/designer-base/src/com/fr/design/actions/server/GlobalParameterAction.java @@ -0,0 +1,96 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.server; + +import com.fr.base.BaseUtils; +import com.fr.base.ParameterConfig; +import com.fr.config.Configuration; +import com.fr.config.ServerPreferenceConfig; +import com.fr.design.DesignModelAdapter; +import com.fr.design.actions.UpdateAction; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrame; +import com.fr.design.menu.MenuKeySet; +import com.fr.design.parameter.ParameterManagerPane; +import com.fr.general.Inter; +import com.fr.transaction.Configurations; +import com.fr.transaction.Worker; + +import javax.swing.*; +import java.awt.event.ActionEvent; + + +/** + * Parameter dialog + */ +public class GlobalParameterAction extends UpdateAction { + public GlobalParameterAction() { + this.setMenuKeySet(GLOBAL_PARAMETER); + this.setName(getMenuKeySet().getMenuKeySetName() + "..."); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_report/p.png")); + } + + /** + * 动作 + * + * @param e 事件 + */ + public void actionPerformed(ActionEvent e) { + final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); + final ParameterManagerPane parameterManagerPane = new ParameterManagerPane(); + + final BasicDialog parameterManagerDialog = parameterManagerPane.showWindow(designerFrame); + + //marks:读取服务器配置信息 + parameterManagerPane.populate(ParameterConfig.getInstance().getGlobalParameters()); + parameterManagerDialog.addDialogActionListener(new DialogActionAdapter() { + public void doOk() { + Configurations.update(new Worker() { + @Override + public void run() { + //apply new parameter list. + parameterManagerPane.update(); + DesignModelAdapter model = DesignModelAdapter.getCurrentModelAdapter(); + if (model != null) { + model.parameterChanged(); + } + parameterManagerDialog.setDoOKSucceed(!parameterManagerPane.isContainsRename()); + } + + @Override + public Class[] targets() { + return new Class[]{ServerPreferenceConfig.class}; + } + }); + + } + }); + parameterManagerDialog.setModal(true); + parameterManagerDialog.setVisible(true); + } + + public void update() { + this.setEnabled(true); + } + + public static final MenuKeySet GLOBAL_PARAMETER = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'G'; + } + + @Override + public String getMenuName() { + return Inter.getLocText("M_Server-Global_Parameters"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/server/GlobalTableDataAction.java b/designer-base/src/com/fr/design/actions/server/GlobalTableDataAction.java new file mode 100644 index 0000000000..aa13446126 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/server/GlobalTableDataAction.java @@ -0,0 +1,186 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.actions.server; + +import com.fr.base.BaseUtils; +import com.fr.base.TableData; +import com.fr.config.Configuration; +import com.fr.design.DesignModelAdapter; +import com.fr.design.actions.UpdateAction; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.datapane.TableDataTreePane; +import com.fr.design.data.tabledata.ResponseDataSourceChange; +import com.fr.design.data.tabledata.tabledatapane.TableDataManagerPane; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrame; +import com.fr.design.menu.MenuKeySet; +import com.fr.file.ProcedureConfig; +import com.fr.file.TableDataConfig; +import com.fr.general.Inter; +import com.fr.locale.InterProviderFactory; +import com.fr.transaction.Configurations; +import com.fr.transaction.Worker; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.util.HashMap; +import java.util.Map; + +/** + * Global TableData. + */ +public class GlobalTableDataAction extends UpdateAction implements ResponseDataSourceChange { + //private static TableDataManagerPane globalTableDataPane = new TableDataManagerPane(); + + public GlobalTableDataAction() { + this.setMenuKeySet(SERVER_TABLEDATA); + this.setName(getMenuKeySet().getMenuKeySetName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/data/dock/serverdatabase.png")); + } + + public static final MenuKeySet SERVER_TABLEDATA = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'S'; + } + + @Override + public String getMenuName() { + return Inter.getLocText("DS-Server_TableData"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; + + /** + * 动作 + * + * @param evt 事件 + */ + public void actionPerformed(ActionEvent evt) { + final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); + final TableDataConfig tableDataConfig = TableDataConfig.getInstance(); + final TableDataManagerPane globalTableDataPane = new TableDataManagerPane() { + public void complete() { + populate(tableDataConfig.mirror()); + } + + protected void renameConnection(final String oldName, final String newName) { + Configurations.update(new Worker() { + @Override + public void run() { + tableDataConfig.renameTableData(oldName, newName); + } + + @Override + public Class[] targets() { + return new Class[]{TableDataConfig.class, ProcedureConfig.class}; + } + }); + } + }; + final BasicDialog globalTableDataDialog = globalTableDataPane.showLargeWindow(designerFrame, null); + + globalTableDataDialog.addDialogActionListener(new DialogActionAdapter() { + + @Override + public void doOk() { + Configurations.update(new Worker() { + @Override + public void run() { + if (!globalTableDataPane.isNamePermitted()) { + globalTableDataDialog.setDoOKSucceed(false); + return; + } + + DesignTableDataManager.clearGlobalDs(); + globalTableDataPane.update(tableDataConfig); + if (!doWithDatasourceManager(tableDataConfig, globalTableDataPane, globalTableDataDialog)) { + //如果更新失败,则不关闭对话框,也不写xml文件,并且将对话框定位在请重命名的那个对象页面 + return; + } + // 刷新共有数据集 + TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); + fireDSChanged(globalTableDataPane.getDsChangedNameMap()); + } + + @Override + public Class[] targets() { + return new Class[]{TableDataConfig.class}; + } + }); + + } + }); + globalTableDataDialog.setVisible(true); + } + + /** + * 是否正常更新完datasourceManager + * + * @param datasourceManager + * @param tableDataManagerPane + * @param databaseListDialog + * @return + */ + private boolean doWithDatasourceManager(TableDataConfig datasourceManager, TableDataManagerPane tableDataManagerPane, BasicDialog databaseListDialog) { + boolean isFailed = false; +// + //存在请重命名则不能更新 + int index = isTableDataMapContainsRename(datasourceManager); + if (index != -1) { + isFailed = true; + tableDataManagerPane.setSelectedIndex(index); + } + databaseListDialog.setDoOKSucceed(!isFailed); + return !isFailed; + } + + /** + * 是否包含重命名key + * + * @return 包含则返回序列 ,若返回-1则说明不包含重命名key + */ + public int isTableDataMapContainsRename(TableDataConfig datasourceManager) { + Map tableDataMap = datasourceManager.getTableDatas(); + String rename = InterProviderFactory.getProvider().getLocText("FR-Engine_Please_Rename") + "!"; + if (tableDataMap.containsKey(rename)) { + return datasourceManager.getTableDataIndex(rename); + } + //todo 这边同上面和远程修改数据集属性有关先屏蔽 +// for (int i = tableDataRenameIndex; i >= 1; i--) { +// rename = InterProviderFactory.getProvider().getLocText("FR-Engine_Please_Rename") + i + "!"; +// if (nameTableDataMap.map.containsKey(rename)) { +// return nameTableDataMap.map.indexOf(rename); +// } +// } + return -1; + } + + public void update() { + this.setEnabled(true); + } + + /** + * 响应数据集改变 + */ + public void fireDSChanged() { + fireDSChanged(new HashMap()); + } + + /** + * 响应数据集改变 + * + * @param map 对应集 + */ + public void fireDSChanged(Map map) { + DesignTableDataManager.fireDSChanged(map); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/actions/server/PlatformManagerAction.java b/designer-base/src/com/fr/design/actions/server/PlatformManagerAction.java new file mode 100644 index 0000000000..d3b473b1fd --- /dev/null +++ b/designer-base/src/com/fr/design/actions/server/PlatformManagerAction.java @@ -0,0 +1,44 @@ +package com.fr.design.actions.server; + +import com.fr.base.BaseUtils; +import com.fr.design.actions.UpdateAction; +import com.fr.design.menu.MenuKeySet; +import com.fr.design.utils.DesignUtils; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +public class PlatformManagerAction extends UpdateAction { + public PlatformManagerAction() { + this.setMenuKeySet(PLATEFORM_MANAGER); + this.setName(getMenuKeySet().getMenuKeySetName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/server/platform_16_16.png")); + } + + /** + * 动作 + * @param evt 事件 + */ + public void actionPerformed(ActionEvent evt) { + DesignUtils.visitEnvServer(); + } + + public static final MenuKeySet PLATEFORM_MANAGER = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'P'; + } + + @Override + public String getMenuName() { + return Inter.getLocText("M_Server-Platform_Manager"); + } + + @Override + public KeyStroke getKeyStroke() { + return null; + } + }; +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/actions/server/PluginManagerAction.java b/designer-base/src/com/fr/design/actions/server/PluginManagerAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/server/PluginManagerAction.java rename to designer-base/src/com/fr/design/actions/server/PluginManagerAction.java diff --git a/designer_base/src/com/fr/design/actions/server/ProcedureListAction.java b/designer-base/src/com/fr/design/actions/server/ProcedureListAction.java similarity index 100% rename from designer_base/src/com/fr/design/actions/server/ProcedureListAction.java rename to designer-base/src/com/fr/design/actions/server/ProcedureListAction.java diff --git a/designer-base/src/com/fr/design/actions/tabledata/TableDataAction.java b/designer-base/src/com/fr/design/actions/tabledata/TableDataAction.java new file mode 100644 index 0000000000..5e0cbc82a8 --- /dev/null +++ b/designer-base/src/com/fr/design/actions/tabledata/TableDataAction.java @@ -0,0 +1,97 @@ +package com.fr.design.actions.tabledata; + +import com.fr.base.BaseUtils; +import com.fr.design.data.datapane.TableDataNameObjectCreator; +import com.fr.design.actions.UpdateAction; + +import java.awt.event.ActionEvent; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 13-12-19 + * Time: 下午5:21 + */ +public abstract class TableDataAction extends UpdateAction { + public static final String XML_TAG_TEMPLATE = "template_tabledata_Type"; + public static final String XML_TAG_SERVER = "server_tabledata_Type"; + + public TableDataAction() { + this.setName(this.getDisplayName()); + this.setSmallIcon(BaseUtils.readIcon(this.getIconPath())); + } + + + /** + * 名字 + * + * @return + */ + public abstract String getDisplayName(); + + /** + * 图标 + * + * @return + */ + public abstract String getIconPath(); + + /** + * 后缀 + * + * @return + */ + public abstract String getPrefix(); + + + /** + * 得到TableData的声明类 + * + * @return + */ + public abstract Class getTableDataClass(); + + /** + * 得到相应面板的类 + * + * @return + */ + public abstract Class getUpdateTableDataPaneClass(); + + /** + * 用于初始化的类。诺是不需要初始化,则不需要实现 + * + * @return + */ + public Class getClass4Init() { + return null; + } + + /** + * 该菜单后面是否需要插入分割符 + * + * @return 是则返回true + */ + public boolean isNeedInsertSeparator() { + return false; + } + + public TableDataNameObjectCreator getTableDataCreator() { + if (this.getClass4Init() == null) { + return new TableDataNameObjectCreator(this); + } else { + return new TableDataNameObjectCreator(this, getClass4Init()); + } + } + + + /** + * 动作 + * @param e 动作 + */ + public void actionPerformed(ActionEvent e) { + } + + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/bbs/BBSLoginUtils.java b/designer-base/src/com/fr/design/bbs/BBSLoginUtils.java similarity index 100% rename from designer_base/src/com/fr/design/bbs/BBSLoginUtils.java rename to designer-base/src/com/fr/design/bbs/BBSLoginUtils.java diff --git a/designer-base/src/com/fr/design/beans/BasicBeanPane.java b/designer-base/src/com/fr/design/beans/BasicBeanPane.java new file mode 100644 index 0000000000..2fb7737c34 --- /dev/null +++ b/designer-base/src/com/fr/design/beans/BasicBeanPane.java @@ -0,0 +1,41 @@ +package com.fr.design.beans; + +import com.fr.design.dialog.BasicPane; + +/** + * Update Pane + */ +public abstract class BasicBeanPane extends BasicPane { + + + + /** + * Populate. + */ + public abstract void populateBean(T ob); + + /** + * Update. + */ + public abstract T updateBean(); + + public void updateBean(T ob) { + + } + + /** + * 更新权限工具栏面板 + */ + public void populateAuthority() { + + } + + /** + * 仅用来处理图表设计器的地图面板 + * @param mapType 地图类型 + */ + public void dealWidthMap(String mapType){ + + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/beans/FurtherBasicBeanPane.java b/designer-base/src/com/fr/design/beans/FurtherBasicBeanPane.java new file mode 100644 index 0000000000..78305c3758 --- /dev/null +++ b/designer-base/src/com/fr/design/beans/FurtherBasicBeanPane.java @@ -0,0 +1,32 @@ +package com.fr.design.beans; + +import com.fr.stable.StringUtils; + +/** + * + * @author zhou + * @since 2012-5-30下午12:12:42 + */ +public abstract class FurtherBasicBeanPane extends BasicBeanPane { + /** + * 是否是指定类型 + * @param ob 对象 + * @return 是否是指定类型 + */ + public abstract boolean accept(Object ob); + + /** + * title应该是一个属性,不只是对话框的标题时用到,与其他组件结合时,也会用得到 + * @return 绥化狂标题 + */ + @Deprecated + public String title4PopupWindow(){ + return StringUtils.EMPTY; + } + + /** + * 重置 + */ + public abstract void reset(); + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/beans/GroupModel.java b/designer-base/src/com/fr/design/beans/GroupModel.java new file mode 100644 index 0000000000..91a1f85d4f --- /dev/null +++ b/designer-base/src/com/fr/design/beans/GroupModel.java @@ -0,0 +1,56 @@ +package com.fr.design.beans; + +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; + +/** + * richer:属性和事件分组 + * @since 6.5.3 + */ +public interface GroupModel { + /** + * 该属性所属的分类,普通属性分为基本属性和其它,事件属性根据事件名称不同进行分类 + */ + String getGroupName(); + + /** + * 总共的属性行数 + */ + int getRowCount(); + + /** + * 获取属性表中第row行的渲染器 + * @param row + */ + TableCellRenderer getRenderer(int row); + + /** + * 获取属性表中第row行的编辑器 + * @param row + */ + TableCellEditor getEditor(int row); + + /** + * 获取属性表中第row行第column列的值 + * @param row + * @param column + * @return 表格中的值 + */ + Object getValue(int row, int column); + + /** + * 设置属性表中第row行第column列的值为value + * @param value + * @param row + * @param column + * @return 设置成功则返回true,否则返回false + */ + boolean setValue(Object value, int row, int column); + + /** + * 改行是否可编辑 + * @param row + * @return 第row行可编辑返回true,否则返回false + */ + boolean isEditable(int row); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/beans/location/Absorptionline.java b/designer-base/src/com/fr/design/beans/location/Absorptionline.java new file mode 100644 index 0000000000..c790684a99 --- /dev/null +++ b/designer-base/src/com/fr/design/beans/location/Absorptionline.java @@ -0,0 +1,393 @@ +package com.fr.design.beans.location; + +import java.awt.*; + +import com.fr.base.GraphHelper; +import com.fr.design.scrollruler.ScrollRulerComponent; +import com.fr.stable.ArrayUtils; +import com.fr.third.org.hsqldb.lib.Collection; + +public class Absorptionline { + //箭头线前段为4px的等边三角形,给定了一个点的坐标,计算一下剩下两个点的坐标偏移量 + //而且箭头分为四个朝向,故有四组坐标(2根号3 约为 3) + // 1.(x,y)(x+2,y±2根号3)(x-2,y±2根号3) + // 2.(x,y)(x±2根号3,y-2)(x±2根号3,y+2) + private static int RECTANGLE_OFFSET_X = 2; + private static int RECTANGLE_OFFSET_Y = 3; + private static int WIDGET_DISTANCE_MIN = 8; + //控件周围八个拖拽框的大小 + private static int RESIZE_BOX_SIZE = 5; + + private static Absorptionline lineInX = new Absorptionline(null, null, null, true); + private static Absorptionline lineInY = new Absorptionline(null, null, null, false); + + private static Absorptionline lineEquidistant = new Absorptionline(null, null, null, true); + + private Color lineColor = new Color(228, 225, 199); + private Color midLineColor = new Color(196, 227, 237); + private Color equidistantLineColor = new Color(0xff, 0x0d, 0x7b); + + private Integer x1; + private Integer x2; + private Integer middle; + private int[] verticalLines; + private int[] horizontalLines; + + private int top; + private int left; + private int bottom; + private int right; + private Rectangle equidistantStart; + + private boolean trans; + + /** + * 创建X轴连接线 + * + * @param x x坐标 + * + * @return X轴的连接线 + * + * @date 2015-2-12-下午2:45:49 + * + */ + public static Absorptionline createXAbsorptionline(int x) { + lineInX.x1 = x; + lineInX.x2 = lineInX.middle = null; + lineInX.horizontalLines = lineInX.verticalLines = null; + return lineInX; + } + + /** + * 创建X中轴连接线 + * + * @param x x坐标 + * + * @return X中轴的连接线 + * + * @date 2015-2-12-下午2:45:49 + * + */ + public static Absorptionline createXMidAbsorptionline(int x) { + lineInX.middle = x; + lineInX.x1 = lineInX.x2 = null; + lineInX.horizontalLines = lineInX.verticalLines = null; + return lineInX; + } + + /** + * 创建Y轴连接线 + * + * @param y y坐标 + * + * @return Y轴的连接线 + * + * @date 2015-2-12-下午2:45:49 + * + */ + public static Absorptionline createYAbsorptionline(int y) { + lineInY.x1 = y; + lineInY.x2 = lineInY.middle = null; + lineInY.horizontalLines = lineInY.verticalLines = null; + return lineInY; + } + + /** + * 创建Y中轴连接线 + * + * @param y y坐标 + * + * @return Y中轴的连接线 + * + * @date 2015-2-12-下午2:45:49 + * + */ + public static Absorptionline createYMidAbsorptionline(int y) { + lineInY.middle = y; + lineInY.x1 = lineInY.x2 = null; + lineInY.horizontalLines = lineInY.verticalLines = null; + return lineInY; + } + + /** + * 创建等距线 + * @return 等距线 + */ + public static Absorptionline createEquidistantAbsorptionline(Rectangle equidistantStart, int top, int left, int bottom, int right) { + lineEquidistant.equidistantStart = equidistantStart; + lineEquidistant.top = top; + lineEquidistant.left = left; + lineEquidistant.bottom = bottom; + lineEquidistant.right = right; + return lineEquidistant; + } + + private Absorptionline(Integer x1, Integer x2, Integer middleInX, boolean trans) { + this.x1 = x1; + this.x2 = x2; + this.middle = middleInX; + this.trans = trans; + } + + public void setFirstLine(Integer x) { + this.x1 = x; + } + + public void setMidLine(Integer x) { + this.middle = x; + } + + public void setSecondLine(Integer x) { + this.x2 = x; + } + + /** + * 是否相关参数都已设置完毕 + * + * @return 相关参数都已设置完毕 + * + * @date 2015-2-12-下午2:44:46 + * + */ + public boolean isFull() { + return x1 != null && x2 != null && middle != null; + } + + public int[] getVerticalLines() { + return verticalLines; + } + + public void setVerticalLines(int[] verticalLines) { + this.verticalLines = verticalLines; + } + + public int[] getHorizontalLines() { + return horizontalLines; + } + + public void setHorizontalLines(int[] horizontalLines) { + this.horizontalLines = horizontalLines; + } + + public void paint(Graphics g, ScrollRulerComponent designer) { + g = g.create(); + if (trans) { + + for (int i = 0; i < ArrayUtils.getLength(verticalLines); i++) { + g.setColor(lineColor); + GraphHelper.drawLine(g, verticalLines[i] - designer.getHorizontalValue(), 0, verticalLines[i] - designer.getHorizontalValue(), + designer.getDesignerHeight()); + } + + if (x1 != null) { + g.setColor(lineColor); + GraphHelper.drawLine(g, x1 - designer.getHorizontalValue(), 0, x1 - designer.getHorizontalValue(), + designer.getDesignerHeight()); + } + if (x2 != null) { + g.setColor(lineColor); + GraphHelper.drawLine(g, x2 - designer.getHorizontalValue(), 0, x2 - designer.getHorizontalValue(), + designer.getDesignerWidth()); + } + if (middle != null) { + g.setColor(midLineColor); + GraphHelper.drawLine(g, middle - designer.getHorizontalValue(), 0, middle + - designer.getHorizontalValue(), designer.getDesignerHeight()); + } + } else { + for (int i = 0; i < ArrayUtils.getLength(horizontalLines); i++) { + g.setColor(lineColor); + GraphHelper.drawLine(g, 0, horizontalLines[i] - designer.getVerticalValue(), + designer.getDesignerWidth(), horizontalLines[i] - designer.getVerticalValue()); + } + + if (x1 != null) { + + g.setColor(lineColor); + GraphHelper.drawLine(g, 0, x1 - designer.getVerticalValue(), designer.getDesignerWidth(), x1 + - designer.getVerticalValue()); + } + if (x2 != null) { + g.setColor(lineColor); + GraphHelper.drawLine(g, 0, x2 - designer.getVerticalValue(), designer.getDesignerWidth(), x2 + - designer.getVerticalValue()); + } + if (middle != null) { + g.setColor(midLineColor); + GraphHelper.drawLine(g, 0, middle - designer.getVerticalValue(), designer.getDesignerWidth(), middle + - designer.getVerticalValue()); + } + + } + //画等距线 + if (equidistantStart != null) { + g.setColor(equidistantLineColor); + if (top > 0) { + paintTopEquidistantLine(g); + } + if (left > 0) { + paintLeftEquidistantLine(g); + } + if (bottom > 0) { + paintBottomEquidistantLine(g); + } + if (right > 0) { + paintRightEquidistantLine(g); + } + } + } + + //朝向上方的等距线 + private void paintTopEquidistantLine(Graphics g){ + int x[] = { + equidistantStart.x + equidistantStart.width / 2, + equidistantStart.x + equidistantStart.width / 2 - RECTANGLE_OFFSET_X, + equidistantStart.x + equidistantStart.width / 2 + RECTANGLE_OFFSET_X + }; + int[] y1, y2; + if (equidistantStart.y - top > WIDGET_DISTANCE_MIN) { + y1 = new int[] { + top, + top + RECTANGLE_OFFSET_Y, + top + RECTANGLE_OFFSET_Y + }; + y2 = new int[]{ + equidistantStart.y - RESIZE_BOX_SIZE, + equidistantStart.y - RESIZE_BOX_SIZE - RECTANGLE_OFFSET_Y, + equidistantStart.y - RESIZE_BOX_SIZE - RECTANGLE_OFFSET_Y + }; + } + else{ + y1 = new int[] { + top, + top - RECTANGLE_OFFSET_Y, + top - RECTANGLE_OFFSET_Y + }; + y2 = new int[] { + equidistantStart.y, + equidistantStart.y + RECTANGLE_OFFSET_Y, + equidistantStart.y + RECTANGLE_OFFSET_Y + }; + } + g.fillPolygon(x, y1, 3); + g.fillPolygon(x, y2, 3); + GraphHelper.drawLine(g, + equidistantStart.x + equidistantStart.width / 2, top, + equidistantStart.x + equidistantStart.width / 2, equidistantStart.y - RESIZE_BOX_SIZE); + } + //朝向左侧的等距线 + private void paintLeftEquidistantLine(Graphics g){ + int y[] = { + equidistantStart.y + equidistantStart.height / 2, + equidistantStart.y + equidistantStart.height / 2 - RECTANGLE_OFFSET_X, + equidistantStart.y + equidistantStart.height / 2 + RECTANGLE_OFFSET_X, + }; + int[] x1, x2; + if (equidistantStart.x - left > WIDGET_DISTANCE_MIN) { + x1 = new int[] { + left, + left + RECTANGLE_OFFSET_Y, + left + RECTANGLE_OFFSET_Y, + }; + + x2 = new int[] { + equidistantStart.x - RESIZE_BOX_SIZE, + equidistantStart.x - RESIZE_BOX_SIZE - RECTANGLE_OFFSET_Y, + equidistantStart.x - RESIZE_BOX_SIZE - RECTANGLE_OFFSET_Y + }; + } + else{ + x1 = new int[] { + left, + left - RECTANGLE_OFFSET_Y, + left - RECTANGLE_OFFSET_Y, + }; + x2 = new int[] { + equidistantStart.x, + equidistantStart.x + RECTANGLE_OFFSET_Y, + equidistantStart.x + RECTANGLE_OFFSET_Y + }; + } + g.fillPolygon(x1, y, 3); + g.fillPolygon(x2, y, 3); + GraphHelper.drawLine(g, + left, equidistantStart.y + equidistantStart.height / 2, + equidistantStart.x, equidistantStart.y + equidistantStart.height / 2); + } + //朝向下方的等距线 + private void paintBottomEquidistantLine(Graphics g) { + int x[] = { + equidistantStart.x + equidistantStart.width / 2, + equidistantStart.x + equidistantStart.width / 2 + RECTANGLE_OFFSET_X, + equidistantStart.x + equidistantStart.width / 2 - RECTANGLE_OFFSET_X, + }; + int[] y1, y2; + if (bottom - equidistantStart.y + equidistantStart.height > WIDGET_DISTANCE_MIN) { + y1 = new int[] { + equidistantStart.y + equidistantStart.height + RESIZE_BOX_SIZE, + equidistantStart.y + equidistantStart.height + RESIZE_BOX_SIZE + RECTANGLE_OFFSET_Y, + equidistantStart.y + equidistantStart.height + RESIZE_BOX_SIZE + RECTANGLE_OFFSET_Y, + }; + y2 = new int[] { + bottom, + bottom - RECTANGLE_OFFSET_Y, + bottom - RECTANGLE_OFFSET_Y + }; + } + else{ + y1 = new int[] { + equidistantStart.y + equidistantStart.height, + equidistantStart.y + equidistantStart.height - RECTANGLE_OFFSET_Y, + equidistantStart.y + equidistantStart.height - RECTANGLE_OFFSET_Y, + }; + y2 = new int[] { + bottom, + bottom + RECTANGLE_OFFSET_Y, + bottom + RECTANGLE_OFFSET_Y + }; + } + g.fillPolygon(x, y1, 3); + g.fillPolygon(x, y2, 3); + GraphHelper.drawLine(g, + equidistantStart.x + equidistantStart.width / 2, equidistantStart.y + equidistantStart.height, + equidistantStart.x + equidistantStart.width / 2, bottom); + } + //朝向右侧的等距线 + private void paintRightEquidistantLine(Graphics g){ + int y[] = { + equidistantStart.y + equidistantStart.height / 2, + equidistantStart.y + equidistantStart.height / 2 - RECTANGLE_OFFSET_X, + equidistantStart.y + equidistantStart.height / 2 + RECTANGLE_OFFSET_X + }; + int[] x1, x2; + if(right - equidistantStart.x > WIDGET_DISTANCE_MIN) { + x1 = new int[]{ + right, + right - RECTANGLE_OFFSET_Y, + right - RECTANGLE_OFFSET_Y + }; + x2 = new int[]{ + equidistantStart.x + equidistantStart.width + RESIZE_BOX_SIZE, + equidistantStart.x + equidistantStart.width + RESIZE_BOX_SIZE + RECTANGLE_OFFSET_Y, + equidistantStart.x + equidistantStart.width + RESIZE_BOX_SIZE + RECTANGLE_OFFSET_Y + }; + } + else{ + x1 = new int[]{ + right, + right + RECTANGLE_OFFSET_Y, + right + RECTANGLE_OFFSET_Y + }; + x2 = new int[]{ + equidistantStart.x + equidistantStart.width, + equidistantStart.x + equidistantStart.width - RECTANGLE_OFFSET_Y, + equidistantStart.x + equidistantStart.width - RECTANGLE_OFFSET_Y + }; + } + g.fillPolygon(x1, y, 3); + g.fillPolygon(x2, y, 3); + GraphHelper.drawLine(g, + equidistantStart.x + equidistantStart.width, equidistantStart.y + equidistantStart.height / 2, + right, equidistantStart.y + equidistantStart.height / 2); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/beans/location/MoveUtils.java b/designer-base/src/com/fr/design/beans/location/MoveUtils.java new file mode 100644 index 0000000000..f4f6eff946 --- /dev/null +++ b/designer-base/src/com/fr/design/beans/location/MoveUtils.java @@ -0,0 +1,557 @@ +/* + * Copyright(c) 2001-2011, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.beans.location; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; + +/** + * Created by IntelliJ IDEA. + * + * @author: Richer + * @since : 6.5.5 Date: 11-7-1 Time: 下午2:22 + */ +public class MoveUtils { + + public static final int SORPTION_UNIT = 5; + private static final int EQUIDISTANTLINE_UNIT = 4; + + private static ArrayList equidistantLines = new ArrayList<>(); + + private MoveUtils() { + + } + + public interface RectangleDesigner { + + /** + * 获取块边界的迭代器 + * + * @return 块边界的迭代器 + * + * @date 2015-2-12-下午2:43:47 + * + */ + RectangleIterator createRectangleIterator(); + + /** + * 设置X轴的线 + * + * @param line 连接线 + * + * @date 2015-2-12-下午2:44:04 + * + */ + void setXAbsorptionline(Absorptionline line); + + /** + * 设置Y轴的线 + * + * @param line 连接线 + * + * @date 2015-2-12-下午2:44:04 + * + */ + void setYAbsorptionline(Absorptionline line); + + /** + * 获取当前选中块的垂直线数组 + * + * @return 块的垂直线数组 + * + */ + int[] getVerticalLine(); + + /** + * 获取当前选中块的水平线数组 + * + * @return 块的水平线数组 + * + */ + int[] getHorizontalLine(); + + /** + * 设置designer内部组件是否重叠的标志位 + * @param isIntersects 是否重叠 + */ + void setWidgetsIntersected(boolean isIntersects); + + /** + * 获取designer内部组件是否重叠的标志位 + * @return 重叠 + */ + boolean isWidgetsIntersected(); + + /** + * 获取designer相对屏幕的位置 + * @return 位置 + */ + Point getDesignerLocationOnScreen(); + + /** + * 设置等距线 + * @param line 吸附线 + */ + void setEquidistantLine(Absorptionline line); + + /** + * 获取设计器垂直滚动条的值 + * @return 滚动条的值 + */ + int getDesignerScrollVerticalValue(); + + /** + * 获取设计器水平滚动条的值 + * @return 滚动条的值 + */ + int getDesignerScrollHorizontalValue(); + } + + public interface RectangleIterator { + + /** + * 是否存在下一个块 + * + * @return 是否存在下一个块 + * + * @date 2015-2-12-下午2:41:32 + * + */ + boolean hasNext(); + + /** + * 获取下一个块的bounds + * + * @return 下一个块的bounds + * + * @date 2015-2-12-下午2:41:55 + * + */ + Rectangle nextRectangle(); + + /** + * 获取块的垂直线数组 + * + * @return 块的垂直线数组 + * + * @date 2015-2-12-下午2:42:27 + * + */ + int[] getVerticalLine(); + + /** + * 获取块的水平线数组 + * + * @return 块的水平线数组 + * + * @date 2015-2-12-下午2:42:27 + * + */ + int[] getHorizontalLine(); + } + + private static class PlacePointing { + public PlacePointing(int x) { + this.palce = x; + } + + private boolean isFind() { + return direction != -1; + } + + private int palce; + private int direction = -1; + } + + private static void findX(PlacePointing px, Rectangle bounds, int left, int right, int width) { + if (px.isFind()) { + return; + } + if (Math.abs(bounds.x + bounds.width / 2 - (left + right) / 2) <= SORPTION_UNIT) { + px.palce = bounds.x + bounds.width / 2 - width / 2; + px.direction = SwingConstants.CENTER; + } + int x1 = bounds.x; + if (Math.abs(x1 - left) <= SORPTION_UNIT) { + px.palce = x1; + px.direction = SwingConstants.LEFT; + } + if (Math.abs(x1 - right) <= SORPTION_UNIT) { + px.palce = x1 - width; + px.direction = SwingConstants.RIGHT; + } + int x2 = bounds.x + bounds.width; + if (Math.abs(x2 - left) <= SORPTION_UNIT) { + px.palce = x2; + px.direction = SwingConstants.LEFT; + } + if (Math.abs(x2 - right) <= SORPTION_UNIT) { + px.palce = x2 - width; + px.direction = SwingConstants.RIGHT; + } + if (Math.abs(bounds.x + bounds.width / 2 - left) <= SORPTION_UNIT) { + px.palce = bounds.x + bounds.width / 2; + px.direction = SwingConstants.LEFT; + } + if (Math.abs(bounds.x + bounds.width / 2 - right) <= SORPTION_UNIT) { + px.palce = bounds.x + bounds.width / 2 - width; + px.direction = SwingConstants.RIGHT; + } + } + + private static void findY(PlacePointing py, Rectangle bounds, int top, int bottom, int height) { + if (py.isFind()) { + return; + } + + if (Math.abs(bounds.y + bounds.height / 2 - (top + bottom) / 2) <= SORPTION_UNIT) { + py.palce = bounds.y + bounds.height / 2 - height / 2; + py.direction = SwingConstants.CENTER; + } + int y1 = bounds.y; + if (Math.abs(y1 - top) <= SORPTION_UNIT) { + py.palce = y1; + py.direction = SwingConstants.TOP; + } + if (Math.abs(y1 - bottom) <= SORPTION_UNIT) { + py.palce = y1 - height; + py.direction = SwingConstants.BOTTOM; + } + int y2 = bounds.y + bounds.height; + if (Math.abs(y2 - top) <= SORPTION_UNIT) { + py.palce = y2; + py.direction = SwingConstants.TOP; + } + if (Math.abs(y2 - bottom) <= SORPTION_UNIT) { + py.palce = y2 - height; + py.direction = SwingConstants.BOTTOM; + } + if (Math.abs(bounds.y + bounds.height / 2 - top) <= SORPTION_UNIT) { + py.palce = bounds.y + bounds.height / 2; + py.direction = SwingConstants.TOP; + } + if (Math.abs(bounds.y + bounds.height / 2 - bottom) <= SORPTION_UNIT) { + py.palce = bounds.y + bounds.height / 2 - height; + py.direction = SwingConstants.BOTTOM; + } + } + + private static void findEquidistantLine(Rectangle bounds, int left, int top, int height, int width) { + //最近的距离与坐标 + EquidistantLine equidistantLineInfo = new EquidistantLine(0, 0, 0); + //等距线从各边中点画出,先要判断是不是在范围内 + int topMiddleX = left + width / 2; + int leftMiddleY = top + height / 2; + if ((topMiddleX > bounds.getX()) && (topMiddleX < (bounds.getX() + bounds.getWidth()))){ + //当前操作rec在bounds的下方 + if (top > (bounds.getY() + bounds.getHeight())){ + equidistantLineInfo.setDistance(top - (bounds.y + bounds.height)); + equidistantLineInfo.setReference(bounds.y + bounds.height); + equidistantLineInfo.setDirection(SwingConstants.TOP); + } + //当前操作rec在bounds上方 + if ((top + height) < bounds.getY()){ + equidistantLineInfo.setDistance(bounds.y - (top + height)); + equidistantLineInfo.setReference(bounds.y); + equidistantLineInfo.setDirection(SwingConstants.BOTTOM); + } + } else if ((leftMiddleY > bounds.getY()) && (leftMiddleY < (bounds.getY() + bounds.getHeight()))) { + //当前操作rec在bounds的右侧 + if (left > (bounds.getX() + bounds.getWidth())){ + equidistantLineInfo.setDistance(left - (bounds.x + bounds.width)); + equidistantLineInfo.setReference(bounds.x + bounds.width); + equidistantLineInfo.setDirection(SwingConstants.LEFT); + } + //当前操作rec在bounds的左侧 + if ((left + width) < bounds.getX()){ + equidistantLineInfo.setDistance(bounds.x - (left + width)); + equidistantLineInfo.setReference(bounds.x); + equidistantLineInfo.setDirection(SwingConstants.RIGHT); + } + } + if(equidistantLineInfo.getDistance() > 0) { + equidistantLines.add(equidistantLineInfo); + } + } + + + /** + * 吸附 + * + * @param x x坐标 + * @param y y坐标 + * @param width 宽度 + * @param height 高度 + * @param designer 块设计器 + * + * @return 吸附后坐标 + * + * @date 2015-2-12-下午2:39:16 + * + */ + public static Point sorption(int x, int y, int width, int height, RectangleDesigner designer, boolean isParameterLayout) { + + int left = x, top = y, bottom = top + height, right = left + width; + + Rectangle operatingRectangle = new Rectangle(x, y, width, height); + + equidistantLines.clear(); + + PlacePointing px = new PlacePointing(x); + PlacePointing py = new PlacePointing(y); + + PlacePointing pEquidistantX = new PlacePointing(x); + PlacePointing pEquidistantY = new PlacePointing(y); + + RectangleIterator iterator = designer.createRectangleIterator(); + + java.util.List cacheRecs = new ArrayList(); + while (iterator.hasNext()) { + Rectangle bounds = iterator.nextRectangle(); + cacheRecs.add(bounds); + findX(px, bounds, left, right, width); + findY(py, bounds, top, bottom, height); + + if (!isParameterLayout) { + findEquidistantLine(bounds, left, top, height, width); + } + } + + createXAbsorptionline(px, designer, width, cacheRecs); + createYAbsorptionline(py, designer, height, cacheRecs); + operatingRectangle.x = px.palce; + operatingRectangle.y = py.palce; + createEquidistantLine(pEquidistantX, pEquidistantY, operatingRectangle, designer); + Point sorptionPoint = new Point(px.palce,py.palce); + if (!px.isFind()){ + sorptionPoint.x = pEquidistantX.palce; + } + if (!py.isFind()){ + sorptionPoint.y = pEquidistantY.palce; + } + return sorptionPoint; + } + + + private static void createXAbsorptionline(PlacePointing px, RectangleDesigner designer, int width, java.util.List cacheRecs) { + Absorptionline line = null; + RectangleIterator iterator = designer.createRectangleIterator(); + int[] selfVertical = designer.getVerticalLine(); + if (px.direction == SwingConstants.CENTER) { + line = Absorptionline.createXMidAbsorptionline(px.palce + width / 2); + int left = px.palce; + int right = px.palce + width; + for (Rectangle bounds : cacheRecs) { + if (bounds.x == left || bounds.x + bounds.width == left) { + line.setFirstLine(left); + } + if (bounds.x == right || bounds.x + bounds.width == right) { + line.setSecondLine(right); + } + updateVerticalLine(selfVertical, iterator, line); + if (line.isFull()) { + break; + } + } + } else if (px.direction == SwingConstants.LEFT || px.direction == SwingConstants.RIGHT) { + int left = px.direction == SwingConstants.LEFT ? px.palce + width : px.palce; + line = Absorptionline.createXAbsorptionline(px.direction == SwingConstants.LEFT ? px.palce : px.palce + width); + int middle = px.palce + width / 2; + for (Rectangle bounds : cacheRecs) { + if (bounds.x == left || bounds.x + bounds.width == left) { + line.setSecondLine(left); + } + if (bounds.x + bounds.width / 2 == middle) { + line.setMidLine(middle); + } + updateVerticalLine(selfVertical, iterator, line); + if (line.isFull()) { + break; + } + } + } + designer.setXAbsorptionline(line); + } + + private static void createYAbsorptionline(PlacePointing py, RectangleDesigner designer, int height, java.util.List cacheRecs) { + Absorptionline line = null; + RectangleIterator iterator = designer.createRectangleIterator(); + int[] selfHorizontal = designer.getHorizontalLine(); + if (py.direction == SwingConstants.CENTER) { + line = Absorptionline.createYMidAbsorptionline(py.palce + height / 2); + int top = py.palce; + int bottom = py.palce + height; + for (Rectangle bounds : cacheRecs) { + if (bounds.y == top || bounds.y + bounds.height == top) { + line.setFirstLine(top); + } + if (bounds.y == bottom || bounds.y + bounds.height == bottom) { + line.setSecondLine(bottom); + } + updateHorizontalLine(selfHorizontal, iterator, line); + if (line.isFull()) { + break; + } + } + } else if (py.direction == SwingConstants.TOP || py.direction == SwingConstants.BOTTOM) { + int top = py.direction == SwingConstants.TOP ? py.palce + height : py.palce; + line = Absorptionline.createYAbsorptionline(py.direction == SwingConstants.TOP ? py.palce : py.palce + height); + int middle = py.palce + height / 2; + for (Rectangle bounds : cacheRecs) { + if (bounds.y == top || bounds.y + bounds.height == top) { + line.setSecondLine(top); + } + if (bounds.y + bounds.height / 2 == middle) { + line.setMidLine(middle); + } + updateHorizontalLine(selfHorizontal, iterator, line); + if (line.isFull()) { + break; + } + } + } + designer.setYAbsorptionline(line); + } + + private static void createEquidistantLine(PlacePointing px, PlacePointing py, Rectangle operatingRectangle, RectangleDesigner designer){ + processEquidistantLinesList(px, py, operatingRectangle); + Absorptionline line = null; + if(equidistantLines.size() > 0) { + int top = -1; + int left = -1; + int bottom = -1; + int right = -1; + for(int i = 0; i < equidistantLines.size(); i++){ + if (equidistantLines.get(i).getDirection() == SwingConstants.TOP){ + top = equidistantLines.get(i).getReference(); + } + if (equidistantLines.get(i).getDirection() == SwingConstants.LEFT){ + left = equidistantLines.get(i).getReference(); + } + if (equidistantLines.get(i).getDirection() == SwingConstants.BOTTOM){ + bottom = equidistantLines.get(i).getReference(); + } + if (equidistantLines.get(i).getDirection() == SwingConstants.RIGHT){ + right = equidistantLines.get(i).getReference(); + } + } + operatingRectangle.x -= designer.getDesignerScrollHorizontalValue(); + operatingRectangle.y -= designer.getDesignerScrollVerticalValue(); + line = Absorptionline.createEquidistantAbsorptionline(operatingRectangle, + top - designer.getDesignerScrollVerticalValue(), + left - designer.getDesignerScrollHorizontalValue(), + bottom - designer.getDesignerScrollVerticalValue(), + right - designer.getDesignerScrollHorizontalValue()); + } + designer.setEquidistantLine(line); + } + + private static void processEquidistantLinesList(PlacePointing pEquidistantX, PlacePointing pEquidistantY, Rectangle operatingRectangle){ + EquidistantLine[] equidistantLines1 = new EquidistantLine[EQUIDISTANTLINE_UNIT]; + //先按方向处理,只保留四个方向上距离最近 + for(int count = 0; count < equidistantLines.size(); count++){ + for (int direction = 0; direction < EQUIDISTANTLINE_UNIT; direction++){ + if(equidistantLines.get(count).getDirection() == (direction + 1)){//direction 1,2,3,4 分别对应top,left,bottom,right + if(equidistantLines1[direction] != null + && equidistantLines1[direction].getDistance() > equidistantLines.get(count).getDistance() + || equidistantLines1[direction] == null) { + equidistantLines1[direction] = equidistantLines.get(count); + } + } + } + } + + equidistantLines.clear(); + //找list中横纵分别等距的组合 + if (equidistantLines1[0] != null && equidistantLines1[2] != null){//top, bottom + int offset = equidistantLines1[0].getDistance() - equidistantLines1[2].getDistance(); + if (Math.abs(offset) <= SORPTION_UNIT * 2){ + pEquidistantY.direction = SwingConstants.TOP; + equidistantLines.add(equidistantLines1[0]); + equidistantLines.add(equidistantLines1[2]); + pEquidistantY.palce = operatingRectangle.y - offset / 2; + operatingRectangle.y = pEquidistantY.palce; + } + } + if (equidistantLines1[1] != null && equidistantLines1[3] != null){//left, right + int offset = equidistantLines1[1].getDistance() - equidistantLines1[3].getDistance(); + if (Math.abs(offset) <= SORPTION_UNIT * 2){ + pEquidistantX.direction = SwingConstants.LEFT; + equidistantLines.add(equidistantLines1[1]); + equidistantLines.add(equidistantLines1[3]); + pEquidistantX.palce = operatingRectangle.x - offset / 2; + operatingRectangle.x = pEquidistantX.palce; + } + } + } + + //更新纵向行列线 + private static void updateVerticalLine(int[] selfVertical, RectangleIterator iterator, Absorptionline line){ + int[] targetArray = iterator.getVerticalLine(); + if (intersectArrays(targetArray, selfVertical)){ + line.setVerticalLines(targetArray); + } + } + + //更新横向行列线 + private static void updateHorizontalLine(int[] selfHorizontal, RectangleIterator iterator, Absorptionline line){ + int[] targetArray = iterator.getHorizontalLine(); + if (intersectArrays(targetArray, selfHorizontal)){ + line.setHorizontalLines(targetArray); + } + } + + //检测两个数组是否有相交的部分 + private static boolean intersectArrays(int[] targetArray, int[] selfArray){ + for (int i : targetArray) { + for (int j : selfArray) { + if(i == j){ + return true; + } + } + } + + return false; + } + + private static class EquidistantLine{ + //与操作rectangle的距离 + private int distance; + //参考rectangle的位置 + private int reference; + //等距线的方向 + private int direction; + + EquidistantLine(int distance, int reference, int direction){ + this.distance = distance; + this.reference = reference; + this.direction = direction; + } + + public void setDistance(int distance){ + this.distance = distance; + } + + public int getDistance(){ + return this.distance; + } + + public void setReference(int reference){ + this.reference = reference; + } + + public int getReference(){ + return this.reference; + } + + public void setDirection(int direction){ + this.direction = direction; + } + + public int getDirection(){ + return this.direction; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/border/UIRoundedBorder.java b/designer-base/src/com/fr/design/border/UIRoundedBorder.java new file mode 100644 index 0000000000..664d113f67 --- /dev/null +++ b/designer-base/src/com/fr/design/border/UIRoundedBorder.java @@ -0,0 +1,50 @@ +package com.fr.design.border; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.RoundRectangle2D; + +import javax.swing.border.LineBorder; + +import com.fr.base.GraphHelper; + +public class UIRoundedBorder extends LineBorder { + + private static final long serialVersionUID = 1L; + + private int roundedCorner; + private int lineStyle; + + public UIRoundedBorder(Color color) { + super(color); + } + + public UIRoundedBorder(Color color, int thickness){ + super(color, thickness); + } + + public UIRoundedBorder(Color color, int thickness, int roundedCorners){ + super(color, thickness, true); + this.roundedCorner = roundedCorners; + } + + public UIRoundedBorder(int lineStyle, Color color, int roundedCorners){ + super(color, GraphHelper.getLineStyleSize(lineStyle), true); + this.lineStyle = lineStyle; + this.roundedCorner = roundedCorners; + } + + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height){ + Color oldColor = g.getColor(); + + Graphics2D g2d = (Graphics2D)g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setColor(lineColor); + GraphHelper.draw(g2d, new RoundRectangle2D.Double(x, y, width - 1, height-1, roundedCorner, roundedCorner),lineStyle); + g2d.setColor(oldColor); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/border/UITitledBorder.java b/designer-base/src/com/fr/design/border/UITitledBorder.java new file mode 100644 index 0000000000..8ddbdaad5f --- /dev/null +++ b/designer-base/src/com/fr/design/border/UITitledBorder.java @@ -0,0 +1,30 @@ +package com.fr.design.border; + +import com.fr.design.constants.UIConstants; + +import java.awt.Color; + +import javax.swing.BorderFactory; +import javax.swing.border.TitledBorder; + +public class UITitledBorder extends TitledBorder { + + private static final long serialVersionUID = 1L; + + public static UITitledBorder createBorderWithTitle(String title) { + return new UITitledBorder(title); + } + + private UITitledBorder(String title) { + super(null, title, 4, 2, null, new Color(1, 159, 222)); + init(title); + } + + private void init(String title){ + UIRoundedBorder roundedborder = new UIRoundedBorder(UIConstants.TITLED_BORDER_COLOR, 1, 10); + this.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0), roundedborder)); + + this.setTitle(title); + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/bridge/DesignToolbarProvider.java b/designer-base/src/com/fr/design/bridge/DesignToolbarProvider.java similarity index 100% rename from designer_base/src/com/fr/design/bridge/DesignToolbarProvider.java rename to designer-base/src/com/fr/design/bridge/DesignToolbarProvider.java diff --git a/designer-base/src/com/fr/design/cell/FloatElementsProvider.java b/designer-base/src/com/fr/design/cell/FloatElementsProvider.java new file mode 100644 index 0000000000..b8560ad040 --- /dev/null +++ b/designer-base/src/com/fr/design/cell/FloatElementsProvider.java @@ -0,0 +1,15 @@ +/** + * + */ +package com.fr.design.cell; + +/** + * 悬浮元素 + * + * @author focus + * @time 2014年11月17日下午10:44:10 + * @version + */ +public interface FloatElementsProvider { + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/condition/CellHighlightAddMenuDef.java b/designer-base/src/com/fr/design/condition/CellHighlightAddMenuDef.java new file mode 100644 index 0000000000..6d142b4ebe --- /dev/null +++ b/designer-base/src/com/fr/design/condition/CellHighlightAddMenuDef.java @@ -0,0 +1,66 @@ +package com.fr.design.condition; + +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +import com.fr.base.BaseUtils; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.imenu.UIPopupMenu; +import com.fr.design.menu.MenuDef; +import com.fr.design.utils.gui.GUICoreUtils; + +/** + * Define Menu. + */ +public class CellHighlightAddMenuDef extends MenuDef { + public CellHighlightAddMenuDef() { + } + + public CellHighlightAddMenuDef(String name) { + this.setName(name); + } + + public CellHighlightAddMenuDef(String name, char mnemonic) { + this.setName(name); + this.setMnemonic(mnemonic); + } + + // 生成UIButton,iconpath不可为null + public UIButton createUIButton() { + if (createdButton == null) { + if (this.iconPath != null && this.name != null) { + createdButton = new UIButton(BaseUtils.readIcon(this.iconPath)); + } else if (this.iconPath != null) { + createdButton = new UIButton(BaseUtils.readIcon(this.iconPath)); + } else { + createdButton = new UIButton(this.name); + } + createdButton.addMouseListener(mouseListener); + } + + return createdButton; + } + + private MouseListener mouseListener = new MouseAdapter() { + public void mouseReleased(MouseEvent evt) { + Object source = evt.getSource(); + UIButton button = (UIButton) source; + if (!button.isEnabled()) { + return; + } + + UIPopupMenu popupMenu = new UIPopupMenu(); + popupMenu.setInvoker(button); + CellHighlightAddMenuDef.this.updatePopupMenu(popupMenu); + + GUICoreUtils.showPopupMenu(popupMenu, button, 0, button.getSize().height); + } + + public void mouseExited(MouseEvent evt) { + if (createdButton != null) { + createdButton.setEnabled(true); + } + } + }; +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/condition/ConditionAttrSingleConditionPane.java b/designer-base/src/com/fr/design/condition/ConditionAttrSingleConditionPane.java similarity index 100% rename from designer_base/src/com/fr/design/condition/ConditionAttrSingleConditionPane.java rename to designer-base/src/com/fr/design/condition/ConditionAttrSingleConditionPane.java diff --git a/designer-base/src/com/fr/design/condition/ConditionAttributesPane.java b/designer-base/src/com/fr/design/condition/ConditionAttributesPane.java new file mode 100644 index 0000000000..347347408d --- /dev/null +++ b/designer-base/src/com/fr/design/condition/ConditionAttributesPane.java @@ -0,0 +1,133 @@ +package com.fr.design.condition; + + +import com.fr.base.FRContext; +import com.fr.design.actions.UpdateAction; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.menu.ToolBarDef; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.Inter; + +import javax.swing.*; +import java.util.HashMap; +import java.util.Iterator; + +public abstract class ConditionAttributesPane extends BasicBeanPane { + protected CellHighlightAddMenuDef menuDef; + + protected JPanel selectedItemPane; + + protected LiteConditionPane liteConditionPane; + + protected java.util.Map classPaneMap = new HashMap(); + + //可用的Actions. + protected java.util.List useAbleActionList = new java.util.ArrayList(); + + protected void initComponents() { + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + // 属性 界面 + JPanel propertyChangePane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); + this.add(propertyChangePane); + + propertyChangePane.setBorder(GUICoreUtils.createTitledBorder(Inter.getLocText("Property") + ":", null)); + + // 选择要改变的属性. + JPanel addItemPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + ToolBarDef toolbarDef = new ToolBarDef(); + + menuDef = new CellHighlightAddMenuDef(); + menuDef.setName(Inter.getLocText("Highlight-Click_to_Choose_Property_To_Modify")); + menuDef.setIconPath("com/fr/design/images/control/addPopup.png"); + + toolbarDef.addShortCut(menuDef); + + updateMenuDef(); + + UIToolbar toolBar = ToolBarDef.createJToolBar(); + toolbarDef.updateToolBar(toolBar); + + addItemPane.add(toolBar); + + propertyChangePane.add(addItemPane); + + selectedItemPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); +// selectedItemPane.setLayout(new BoxLayout(selectedItemPane,BoxLayout.Y_AXIS)); + + // 选中的添加Itempane + JScrollPane selectedItemScrollPane = new JScrollPane(); + selectedItemScrollPane.setViewportView(selectedItemPane); + selectedItemScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + propertyChangePane.add(selectedItemScrollPane); + } + + public void updateBean(T ob) { + updateMenuDef(); + } + + protected void updateMenuDef() { + menuDef.clearShortCuts(); + for (UpdateAction ac : useAbleActionList) { + menuDef.addShortCut(ac); + } + menuDef.updateMenu(); + menuDef.setEnabled(true); + } + + public void checkConditionPane() { + GUICoreUtils.setEnabled(this.liteConditionPane, this.selectedItemPane.getComponentCount() >= 1); + } + + public ConditionAttrSingleConditionPane createConditionAttrSingleConditionPane(Class clazz) { + try { + return clazz.newInstance(); + } catch (InstantiationException e) { + FRContext.getLogger().error(e.getMessage(), e); + } catch (IllegalAccessException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + return null; + } + + protected void addAction2UseAbleActionList() { + useAbleActionList.clear(); + Iterator iterator = classPaneMap.values().iterator(); + + while (iterator.hasNext()) { + useAbleActionList.add(iterator.next().getHighLightConditionAction()); + } + } + + public void resetUseAbleActionList() { + Iterator iterator = classPaneMap.values().iterator(); + + while (iterator.hasNext()) { + ConditionAttrSingleConditionPane pane = iterator.next(); + if (pane.getParent() != this.selectedItemPane && !this.useAbleActionList.contains(pane.getHighLightConditionAction())) { + this.useAbleActionList.add(pane.getHighLightConditionAction()); + } + } + } + + public void removeConditionAttrSingleConditionPane(JComponent component) { + selectedItemPane.remove(component); + } + + public void addConditionAttrSingleConditionPane(JComponent component) { + selectedItemPane.add(component); + } + + + public void removeUpdateActionFromUsableList(UpdateAction action) { + useAbleActionList.remove(action); + } + + public void redraw() { + validate(); + repaint(); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/condition/ContinuousTreeSelectionModel.java b/designer-base/src/com/fr/design/condition/ContinuousTreeSelectionModel.java new file mode 100644 index 0000000000..69d3a51aa8 --- /dev/null +++ b/designer-base/src/com/fr/design/condition/ContinuousTreeSelectionModel.java @@ -0,0 +1,128 @@ +package com.fr.design.condition; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeSelectionModel; +import javax.swing.tree.TreePath; + +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.gui.GUICoreUtils; + +/** + * 一个层次连续节点. + */ +public class ContinuousTreeSelectionModel extends DefaultTreeSelectionModel { + public ContinuousTreeSelectionModel() { + } + + public void addSelectionPaths(TreePath[] paths) { + if (paths == null || paths.length == 0) { + return; + } + + int firstIndex = 0; + Map indexTreePathMap = new HashMap(); + + TreePath[] oldSelectedPaths = this.getSelectionPaths(); + //peter:需要检查是否是同一个父亲的孩子 + if (oldSelectedPaths != null && oldSelectedPaths.length > 0) { + TreePath parentTreePath = oldSelectedPaths[0].getParentPath(); + DefaultMutableTreeNode parentTreeNode = (DefaultMutableTreeNode) parentTreePath.getLastPathComponent(); + + for (int i = 0; i < oldSelectedPaths.length; i++) { + if (ComparatorUtils.equals(parentTreePath, oldSelectedPaths[i].getParentPath())) { + DefaultMutableTreeNode tmpTreeNode = (DefaultMutableTreeNode) oldSelectedPaths[i].getLastPathComponent(); + int treeNodeIndex = parentTreeNode.getIndex(tmpTreeNode); + if (i == 0) { + firstIndex = treeNodeIndex; + } + indexTreePathMap.put(new Integer(treeNodeIndex), GUICoreUtils.getTreePath(tmpTreeNode)); + } + } + + for (int i = 0; i < paths.length; i++) { + if (ComparatorUtils.equals(parentTreePath, paths[i].getParentPath())) { + DefaultMutableTreeNode tmpTreeNode = (DefaultMutableTreeNode) paths[i].getLastPathComponent(); + int treeNodeIndex = parentTreeNode.getIndex(tmpTreeNode); + indexTreePathMap.put(new Integer(treeNodeIndex), GUICoreUtils.getTreePath(tmpTreeNode)); + } + } + } else { + firstIndex = findFirstIndexIfNotEmpty(indexTreePathMap, paths); + } + + List newTreePathList = resolveNewTreePathList(firstIndex, indexTreePathMap); + + if (newTreePathList.size() > 0) { + super.addSelectionPaths((TreePath[])newTreePathList.toArray(new TreePath[newTreePathList.size()])); + } + } + + public int findFirstIndexIfNotEmpty(Map indexTreePathMap, TreePath[] paths) { + int firstIndex = 0; + TreePath parentTreePath = paths[0].getParentPath(); + DefaultMutableTreeNode parentTreeNode = (DefaultMutableTreeNode) parentTreePath.getLastPathComponent(); + + for (int i = 0; i < paths.length; i++) { + if (ComparatorUtils.equals(parentTreePath, paths[i].getParentPath())) { + DefaultMutableTreeNode tmpTreeNode = (DefaultMutableTreeNode) paths[i].getLastPathComponent(); + int treeNodeIndex = parentTreeNode.getIndex(tmpTreeNode); + if (i == 0) { + firstIndex = treeNodeIndex; + } + indexTreePathMap.put(new Integer(treeNodeIndex), GUICoreUtils.getTreePath(tmpTreeNode)); + } + } + + return firstIndex; + } + + public List resolveNewTreePathList(int firstIndex, Map indexTreePathMap) { + List newTreePathList = new ArrayList(); + //peter: 先向下找. + for (int i = firstIndex - 1; i >= 0 && indexTreePathMap.size() > 0; i--) { + Object obj = indexTreePathMap.get(new Integer(i)); + if (obj == null) { + break; + } + + newTreePathList.add(obj); + indexTreePathMap.remove(new Integer(i)); + } + + //peter: 先向下找. + for (int i = firstIndex; i < Integer.MAX_VALUE && indexTreePathMap.size() > 0; i++) { + Object obj = indexTreePathMap.get(new Integer(i)); + if (obj == null) { + break; + } + + newTreePathList.add(obj); + indexTreePathMap.remove(new Integer(i)); + } + + return newTreePathList; + } + + // + public void setSelectionPaths(TreePath[] paths) { + if (paths == null || paths.length == 0) { + return; + } + + int firstIndex = 0; + Map indexTreePathMap = new HashMap(); + + firstIndex = findFirstIndexIfNotEmpty(indexTreePathMap, paths); + + List newTreePathList = resolveNewTreePathList(firstIndex, indexTreePathMap); + + if (newTreePathList.size() > 0) { + super.setSelectionPaths((TreePath[])newTreePathList.toArray(new TreePath[newTreePathList.size()])); + } + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/condition/DSColumnLiteConditionPane.java b/designer-base/src/com/fr/design/condition/DSColumnLiteConditionPane.java similarity index 100% rename from designer_base/src/com/fr/design/condition/DSColumnLiteConditionPane.java rename to designer-base/src/com/fr/design/condition/DSColumnLiteConditionPane.java diff --git a/designer-base/src/com/fr/design/condition/DSColumnSimpleLiteConditionPane.java b/designer-base/src/com/fr/design/condition/DSColumnSimpleLiteConditionPane.java new file mode 100644 index 0000000000..cb8794122d --- /dev/null +++ b/designer-base/src/com/fr/design/condition/DSColumnSimpleLiteConditionPane.java @@ -0,0 +1,21 @@ +package com.fr.design.condition; + +import com.fr.data.condition.CommonCondition; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.editor.ValueEditorPane; +import com.fr.design.editor.ValueEditorPaneFactory; + +public class DSColumnSimpleLiteConditionPane extends DSColumnLiteConditionPane { + + @Override + protected BasicBeanPane createUnFormulaConditionPane() { + return new SimpleCommonConditionPane(); + } + + protected class SimpleCommonConditionPane extends CommonConditionPane { + + protected ValueEditorPane createValueEditorPane() { + return ValueEditorPaneFactory.createNoCRNoColumnValueEditorPane(); + } + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/condition/HighLightConditionAction.java b/designer-base/src/com/fr/design/condition/HighLightConditionAction.java similarity index 100% rename from designer_base/src/com/fr/design/condition/HighLightConditionAction.java rename to designer-base/src/com/fr/design/condition/HighLightConditionAction.java diff --git a/designer-base/src/com/fr/design/condition/LiteConditionPane.java b/designer-base/src/com/fr/design/condition/LiteConditionPane.java new file mode 100644 index 0000000000..58e859ba39 --- /dev/null +++ b/designer-base/src/com/fr/design/condition/LiteConditionPane.java @@ -0,0 +1,968 @@ +package com.fr.design.condition; + +import com.fr.base.BaseFormula; +import com.fr.base.BaseUtils; +import com.fr.data.DataConstants; +import com.fr.data.condition.*; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.formula.FormulaFactory; +import com.fr.design.formula.UIFormula; +import com.fr.design.formula.VariableResolver; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UIRadioButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.scrollruler.ModLineBorder; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.ComparatorUtils; +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.general.data.Condition; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.event.TreeExpansionEvent; +import javax.swing.event.TreeExpansionListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; + +/** + * peter: LiteCondition Pane. + */ +public abstract class LiteConditionPane extends BasicBeanPane { + private static int MOVE_UP = 0; + private static int MOVE_DOWN = 1; + + private static final long serialVersionUID = 1L; + // peter:这两个变量在弹出公式编辑器的时候,需要用. + private UIRadioButton commonRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_LiteCondition_Common")); + private UIRadioButton formulaRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_LiteCondition_Formula")); + private JPanel conditionCardPane; + protected BasicBeanPane defaultConditionPane; + // card2 + private UITextArea formulaTextArea; + private UIButton modifyButton; + private UIButton addButton; + private UIRadioButton andRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_LiteCondition_ConditionB-AND") + " "); + private UIRadioButton orRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_LiteCondition_ConditionB-OR")); + protected JTree conditionsTree;// Conditions + private UIButton removeButton; + private UIButton moveUpButton; + private UIButton moveDownButton; + private UIButton bracketButton; + private UIButton unBracketButton; + private static final int DOWN_PADDING = 4; + private static final int STRUT_ONE = 35; + private static final int STRUT_TWO = 4; + private static final int ADD_CONTROL_PANE_PADDING_RIGHT = -5; + + private ActionListener actionListener1 = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent evt) { + BaseFormula formula; + + String text = formulaTextArea.getText(); + if (text == null || text.length() <= 0) { + formula = BaseFormula.createFormulaBuilder().build(); + } else { + formula = BaseFormula.createFormulaBuilder().build(text); + } + + final UIFormula formulaPane = FormulaFactory.createFormulaPane(); + formulaPane.populate(formula, variableResolver4FormulaPane()); + formulaPane.showLargeWindow(SwingUtilities.getWindowAncestor(LiteConditionPane.this), new DialogActionAdapter() { + + @Override + public void doOk() { + BaseFormula formula = formulaPane.update(); + if (formula.getContent().length() <= 1) {// 如果没有填任何字符,则是空白文本 + formulaTextArea.setText(StringUtils.EMPTY); + } else { + formulaTextArea.setText(formula.getContent().substring(1)); + } + } + }).setVisible(true); + } + }; + + + private ActionListener actionListener2 = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent evt) { + // peter:先获得当前的LiteCondition. + + Condition liteCondition = null; + if (commonRadioButton.isSelected()) { + liteCondition = defaultConditionPane.updateBean(); + } else { + liteCondition = new FormulaCondition(formulaTextArea.getText()); + } + + JoinCondition newJoinCondition = new JoinCondition(andRadioButton.isSelected() ? DataConstants.AND : DataConstants.OR, liteCondition); + ExpandMutableTreeNode parentTreeNode = getParentTreeNode(); + boolean result = isExistedInParentTreeNode(parentTreeNode, newJoinCondition); + if (result) { + JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this), + Inter.getLocText("BindColumn-This_Condition_has_been_existed")); + return; + } + + ExpandMutableTreeNode newJionConditionTreeNode = new ExpandMutableTreeNode(newJoinCondition); + parentTreeNode.add(newJionConditionTreeNode); + DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel(); + defaultTreeModel.reload(parentTreeNode); + parentTreeNode.expandCurrentTreeNode(conditionsTree); + conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(newJionConditionTreeNode)); + + // peter:必须要检查Enabled. + checkButtonEnabledForList(); + } + }; + + + private MouseAdapter mouseAdapter = new MouseAdapter() { + + @Override + public void mouseEntered(MouseEvent evt) { + TreePath selectedTreePath = conditionsTree.getSelectionPath(); + // peter:当前的节点 + if (selectedTreePath != null) { + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + JoinCondition oldJoinCondition = (JoinCondition) selectedTreeNode.getUserObject(); + oldJoinCondition.setJoin(andRadioButton.isSelected() ? DataConstants.AND : DataConstants.OR); + + Condition oldLiteCondition = oldJoinCondition.getCondition(); + // peter:如果当前选中的是ListCondition,只要改变Join为AND或者OR,直接返回. + if (oldLiteCondition instanceof ListCondition) { + GUICoreUtils.setEnabled(conditionCardPane, false); + } + } + } + + @Override + public void mouseExited(MouseEvent evt) { + GUICoreUtils.setEnabled(conditionCardPane, conditionCardPane.isEnabled()); + } + }; + + private TreeSelectionListener treeSelectionListener = new TreeSelectionListener() { + + @Override + public void valueChanged(TreeSelectionEvent evt) { + checkButtonEnabledForList(); + + TreePath selectedTreePath = conditionsTree.getSelectionPath(); + if (selectedTreePath == null) { + return; + } + + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + Object userObject = selectedTreeNode.getUserObject(); + if (userObject instanceof JoinCondition) { + JoinCondition joinCondition = (JoinCondition) userObject; + + // peter:先弄join. + int join = joinCondition.getJoin(); + if (join == DataConstants.AND) { + andRadioButton.setSelected(true); + } else { + orRadioButton.setSelected(true); + } + + // peter:当前的liteCondtion. + Condition liteCondition = joinCondition.getCondition(); + // elake:两种Condition对应于数据列和高亮. + if (liteCondition instanceof CommonCondition || liteCondition instanceof ObjectCondition) { + Condition commonCondition = liteCondition; + commonRadioButton.setSelected(true); + applyCardsPane(); + + defaultConditionPane.populateBean((T) commonCondition); + + } else if (liteCondition instanceof FormulaCondition) { + FormulaCondition formulaCondition = (FormulaCondition) liteCondition; + + formulaRadioButton.setSelected(true); + applyCardsPane(); + + formulaTextArea.setText(formulaCondition.getFormula()); + } + } + } + }; + + + private ActionListener actionListener3 = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent evt) { + TreePath selectedTreePath = conditionsTree.getSelectionPath(); + if (selectedTreePath == null) { + return; + } + + int returnVal = JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(LiteConditionPane.this), + Inter.getLocText("Utils-Are_you_sure_to_remove_the_selected_item") + "?", Inter.getLocText("FR-Designer_Remove"), + JOptionPane.OK_CANCEL_OPTION); + if (returnVal == JOptionPane.OK_OPTION) { + DefaultTreeModel treeModel = (DefaultTreeModel) conditionsTree.getModel(); + + TreePath[] selectedTreePaths = conditionsTree.getSelectionPaths(); + for (int i = selectedTreePaths.length - 1; i >= 0; i--) { + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePaths[i].getLastPathComponent(); + ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); + + // peter:将要选择节点. + ExpandMutableTreeNode nextSelectTreeNode; + if (parentTreeNode.getChildAfter(selectedTreeNode) != null) { + nextSelectTreeNode = (ExpandMutableTreeNode) parentTreeNode.getChildAfter(selectedTreeNode); + } else if (parentTreeNode.getChildBefore(selectedTreeNode) != null) { + nextSelectTreeNode = (ExpandMutableTreeNode) parentTreeNode.getChildBefore(selectedTreeNode); + } else { + nextSelectTreeNode = parentTreeNode; + } + + parentTreeNode.remove(selectedTreeNode); + + if (!ComparatorUtils.equals(nextSelectTreeNode, treeModel.getRoot())) { + conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(nextSelectTreeNode)); + } + treeModel.reload(parentTreeNode); + parentTreeNode.expandCurrentTreeNode(conditionsTree); + if (!ComparatorUtils.equals(nextSelectTreeNode, treeModel.getRoot())) { + conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(nextSelectTreeNode)); + } + } + + // peter:检查Button Enabled. + checkButtonEnabledForList(); + } + } + }; + + + private ActionListener actionListener4 = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent evt) { + TreePath selectedTreePath = conditionsTree.getSelectionPath(); + if (selectedTreePath == null) { + return; + } + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); + if (parentTreeNode.getChildBefore(selectedTreeNode) != null) { + swapNodesOfConditionTree(parentTreeNode, (ExpandMutableTreeNode) parentTreeNode.getChildBefore(selectedTreeNode), + selectedTreeNode, MOVE_UP); + } + } + }; + + + private ActionListener actionListener5 = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent evt) { + TreePath selectedTreePath = conditionsTree.getSelectionPath(); + if (selectedTreePath == null) { + return; + } + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); + if (parentTreeNode.getChildAfter(selectedTreeNode) != null) { + swapNodesOfConditionTree(parentTreeNode, selectedTreeNode, (ExpandMutableTreeNode) parentTreeNode.getChildAfter(selectedTreeNode), MOVE_DOWN); + } + } + }; + + + private ActionListener actionListener6 = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent evt) { + TreePath[] selectedTreePaths = conditionsTree.getSelectionPaths(); + // peter:当前的节点 + if (selectedTreePaths == null || selectedTreePaths.length <= 1) { + return; + } + + // peter: 找到父亲节点,并且删除所有的节点. + TreePath topTreePath = GUICoreUtils.getTopTreePath(conditionsTree, selectedTreePaths); + ExpandMutableTreeNode leadTreeNode = (ExpandMutableTreeNode) topTreePath.getLastPathComponent(); + ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) leadTreeNode.getParent(); + int topIndex = parentTreeNode.getIndex(leadTreeNode); + + JoinCondition firstJionCondition = (JoinCondition) leadTreeNode.getUserObject(); + for (int i = 0; i < selectedTreePaths.length; i++) { + ExpandMutableTreeNode tmpTreeNode = (ExpandMutableTreeNode) selectedTreePaths[i].getLastPathComponent(); + parentTreeNode.remove(tmpTreeNode); + } + + // peter:建立新的节点. + JoinCondition newJionCondition = new JoinCondition(); + newJionCondition.setJoin(firstJionCondition.getJoin()); + newJionCondition.setCondition(new ListCondition()); + ExpandMutableTreeNode newTreeNode = new ExpandMutableTreeNode(newJionCondition); + for (int i = 0; i < selectedTreePaths.length; i++) { + ExpandMutableTreeNode tmpTreeNode = (ExpandMutableTreeNode) selectedTreePaths[i].getLastPathComponent(); + newTreeNode.add(tmpTreeNode); + } + + // peter:添加新的节点 + parentTreeNode.insert(newTreeNode, topIndex); + + // peter:需要reload + DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel(); + defaultTreeModel.reload(parentTreeNode); + parentTreeNode.expandCurrentTreeNode(conditionsTree); + + // peter:选择一个节点 + conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(newTreeNode)); + } + }; + + + ActionListener actionListener7 = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent evt) { + TreePath selectedTreePath = conditionsTree.getSelectionPath(); + // peter:当前的节点 + if (selectedTreePath == null) { + return; + } + + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + JoinCondition joinCondition = (JoinCondition) selectedTreeNode.getUserObject(); + Condition liteCondition = joinCondition.getCondition(); + if (liteCondition instanceof ListCondition) { + ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); + int index = parentTreeNode.getIndex(selectedTreeNode); + + // peter:添加节点 + List treePathList = new ArrayList(); + for (int i = selectedTreeNode.getChildCount() - 1; i >= 0; i--) { + ExpandMutableTreeNode tmpTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getChildAt(i); + parentTreeNode.insert(tmpTreeNode, index); + treePathList.add(GUICoreUtils.getTreePath(tmpTreeNode)); + } + + // peter;删除这个List节点 + parentTreeNode.remove(selectedTreeNode); + + // peter:需要reload + DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel(); + defaultTreeModel.reload(parentTreeNode); + parentTreeNode.expandCurrentTreeNode(conditionsTree); + + // peter:选择所有选择的节点 + TreePath[] selectedTreePaths = new TreePath[treePathList.size()]; + treePathList.toArray(selectedTreePaths); + conditionsTree.setSelectionPaths(selectedTreePaths); + } + } + }; + + + private ActionListener actionListener8 = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent evt) { + modify(); + } + }; + + + // 图表条件高亮时没有公式选择 + protected JPanel conditonTypePane; + + public LiteConditionPane() { + this.initComponents(); + } + + protected abstract BasicBeanPane createUnFormulaConditionPane(); + + protected abstract VariableResolver variableResolver4FormulaPane(); + + protected void initComponents() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + // north + initNorth(); + + //center + JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.add(centerPane, BorderLayout.CENTER); + centerPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + + // Control + JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + centerPane.add(controlPane, BorderLayout.NORTH); + // controlPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + + // conditionCardPane + initConditionCardPane(controlPane); + + // addControlPane, contains or,and Radio, add,modify Button + initControlPane(controlPane); + + // Preview + JPanel previewPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + centerPane.add(previewPane, BorderLayout.CENTER); + previewPane.setBorder(BorderFactory.createEmptyBorder(0, 2, 2, 0)); + + + // conTreeScrollPane.setPreferredSize(new Dimension(400, 125)); + previewPane.add(iniTreeScrollPane(), BorderLayout.CENTER); + conditionsTree.addTreeSelectionListener(treeSelectionListener); + + JPanel buttonPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); + previewPane.add(GUICoreUtils.createBorderPane(buttonPane, BorderLayout.NORTH), BorderLayout.EAST); + initButtonPane(buttonPane); + + // peter:必须要检查Enabled. + checkButtonEnabledForList(); + } + + + private void initButtonPane(JPanel buttonPane) { + removeButton = new UIButton(Inter.getLocText("FR-Designer_Remove")); + buttonPane.add(removeButton); + removeButton.setIcon(BaseUtils.readIcon("com/fr/base/images/cell/control/remove.png")); + removeButton.setEnabled(false); + removeButton.addActionListener(actionListener3); + + moveUpButton = new UIButton(Inter.getLocText("Utils-Move_Up")); + buttonPane.add(moveUpButton); + moveUpButton.setIcon(BaseUtils.readIcon("com/fr/design/images/control/up.png")); + moveUpButton.addActionListener(actionListener4); + + moveDownButton = new UIButton(Inter.getLocText("Utils-Move_Down")); + buttonPane.add(moveDownButton); + moveDownButton.setIcon(BaseUtils.readIcon("com/fr/design/images/control/down.png")); + moveDownButton.addActionListener(actionListener5); + + // peter:加括号 + bracketButton = new UIButton(Inter.getLocText("ConditionB-Add_bracket")); + buttonPane.add(bracketButton); + bracketButton.setIcon(BaseUtils.readIcon("com/fr/design/images/condition/bracket.png")); + bracketButton.addActionListener(actionListener6); + + // peter:去掉括号 + unBracketButton = new UIButton(Inter.getLocText("ConditionB-Remove_bracket")); + buttonPane.add(unBracketButton); + unBracketButton.setIcon(BaseUtils.readIcon("com/fr/design/images/condition/unBracket.png")); + unBracketButton.addActionListener(actionListener7); + } + + private JScrollPane iniTreeScrollPane() { + conditionsTree = new JTree(new DefaultTreeModel(new ExpandMutableTreeNode(new JoinCondition(DataConstants.AND, new ListCondition())))); + conditionsTree.setRootVisible(false); + conditionsTree.setCellRenderer(conditionsTreeCellRenderer); + conditionsTree.setSelectionModel(new ContinuousTreeSelectionModel()); + conditionsTree.addTreeExpansionListener(treeExpansionListener); + conditionsTree.setShowsRootHandles(true); + return new JScrollPane(conditionsTree); + + } + + private void initNorth() { + conditonTypePane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.add(conditonTypePane, BorderLayout.NORTH); + conditonTypePane.setBorder(new ModLineBorder(ModLineBorder.BOTTOM)); + + UILabel conditionTypeLabel = new UILabel(Inter.getLocText("FR-Designer_Type") + ":"); + conditonTypePane.add(conditionTypeLabel, BorderLayout.WEST); + conditionTypeLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, DOWN_PADDING, 0)); + + JPanel northPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); + conditonTypePane.add(northPane, BorderLayout.CENTER); + northPane.setBorder(BorderFactory.createEmptyBorder(0, 0, DOWN_PADDING, 0)); + northPane.add(GUICoreUtils.createFlowPane(commonRadioButton, FlowLayout.CENTER)); + northPane.add(GUICoreUtils.createFlowPane(formulaRadioButton, FlowLayout.CENTER)); + commonRadioButton.addActionListener(radioActionListener); + formulaRadioButton.addActionListener(radioActionListener); + + ButtonGroup mainBg = new ButtonGroup(); + mainBg.add(commonRadioButton); + mainBg.add(formulaRadioButton); + commonRadioButton.setSelected(true); + } + + private void initConditionCardPane(JPanel controlPane) { + conditionCardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); + controlPane.add(conditionCardPane, BorderLayout.CENTER); + conditionCardPane.setLayout(new CardLayout()); + conditionCardPane.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); + + // defaultConditionPane + conditionCardPane.add(defaultConditionPane = createUnFormulaConditionPane(), "DEFAULT"); + + // formulaConditionPane + JPanel formulaConditionPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + conditionCardPane.add(formulaConditionPane, "FORMULA"); + // formulaConditionPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + + // formulaPane + JPanel formulaPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + // 95106 公式区域限定宽高, 显示两行即可, 在新窗口编辑. + formulaPane.setPreferredSize(new Dimension(450, 40)); + formulaConditionPane.add(formulaPane, BorderLayout.CENTER); + formulaPane.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 2)); + formulaPane.add(GUICoreUtils.createBorderPane(new UILabel(Inter.getLocText("FR-Designer_LiteCondition_Formula") + "="), BorderLayout.NORTH), BorderLayout.WEST); + formulaTextArea = new UITextArea(); + formulaPane.add(new JScrollPane(formulaTextArea), BorderLayout.CENTER); + UIButton editFormulaButton = new UIButton(Inter.getLocText("FR-Designer_LiteCondition_Define")); + formulaPane.add(GUICoreUtils.createBorderPane(editFormulaButton, BorderLayout.NORTH), BorderLayout.EAST); + editFormulaButton.addActionListener(actionListener1); + applyCardsPane(); + } + + + private void initControlPane(JPanel controlPane) { + JPanel addControlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + addControlPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, ADD_CONTROL_PANE_PADDING_RIGHT)); + JPanel splitPane = new JPanel(); + splitPane.setBorder(new ModLineBorder(ModLineBorder.TOP)); + + JPanel addControlPaneWrapper = new JPanel(new BorderLayout()); + addControlPaneWrapper.add(addControlPane, BorderLayout.CENTER); + addControlPaneWrapper.add(splitPane, BorderLayout.NORTH); + controlPane.add(addControlPaneWrapper, BorderLayout.SOUTH); + + ButtonGroup bg = new ButtonGroup(); + bg.add(andRadioButton); + bg.add(orRadioButton); + + andRadioButton.setSelected(true); + + JPanel radioPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); + addControlPane.add(radioPane); + radioPane.add(andRadioButton); + radioPane.add(orRadioButton); + + addControlPane.add(Box.createHorizontalStrut(STRUT_ONE)); + + addButton = new UIButton(Inter.getLocText("FR-Designer_Add"), BaseUtils.readIcon("com/fr/base/images/cell/control/add.png")); + addButton.setMnemonic('A'); + addControlPane.add(addButton); + addButton.addActionListener(actionListener2); + + addControlPane.add(Box.createHorizontalStrut(STRUT_TWO)); + + modifyButton = new UIButton(Inter.getLocText("FR-Designer_Modify"), BaseUtils.readIcon("com/fr/base/images/cell/control/rename.png")); + modifyButton.setMnemonic('M'); + addControlPane.add(modifyButton); + modifyButton.addActionListener(actionListener8); + + // peter:当鼠标进入修改按钮的时候,如果是ListConditon内容编辑区域不可编辑 + modifyButton.addMouseListener(mouseAdapter); + } + + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer-Submit_Condition"); + } + + // samuel:移出来,方便调用 + protected void modify() { + TreePath selectedTreePath = conditionsTree.getSelectionPath(); + // peter:当前的节点 + if (selectedTreePath != null) { + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + JoinCondition oldJoinCondition = (JoinCondition) selectedTreeNode.getUserObject(); + oldJoinCondition.setJoin(andRadioButton.isSelected() ? DataConstants.AND : DataConstants.OR); + + Condition oldLiteCondition = oldJoinCondition.getCondition(); + // peter:如果当前选中的是ListCondition,只要改变Join为AND或者OR,直接返回. + if (oldLiteCondition != null && !(oldLiteCondition instanceof ListCondition)) { + // peter:先获得当前的LiteCondition. + Condition liteCondition; + if (commonRadioButton.isSelected()) { + liteCondition = defaultConditionPane.updateBean(); + } else { + liteCondition = new FormulaCondition(formulaTextArea.getText()); + } + + oldJoinCondition.setCondition(liteCondition); + } + + // peter:需要reload parent + DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel(); + ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); + defaultTreeModel.reload(parentTreeNode); + parentTreeNode.expandCurrentTreeNode(conditionsTree); + conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(selectedTreeNode)); + } + } + + protected void swapNodesOfConditionTree(ExpandMutableTreeNode parentTreeNode, ExpandMutableTreeNode firstSelectTreeNode, + ExpandMutableTreeNode secondTreeNode, int type) { + int nextIndex = parentTreeNode.getIndex(firstSelectTreeNode); + parentTreeNode.remove(firstSelectTreeNode); + parentTreeNode.remove(secondTreeNode); + + parentTreeNode.insert(firstSelectTreeNode, nextIndex); + parentTreeNode.insert(secondTreeNode, nextIndex); + + DefaultTreeModel treeModel = (DefaultTreeModel) conditionsTree.getModel(); + treeModel.reload(parentTreeNode); + + parentTreeNode.expandCurrentTreeNode(conditionsTree); + if (type == MOVE_UP) { + conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(secondTreeNode)); + } else if (type == MOVE_DOWN) { + conditionsTree.setSelectionPath(GUICoreUtils.getTreePath(firstSelectTreeNode)); + } + + + // peter:检查Button Enabled. + checkButtonEnabledForList(); + } + + + ActionListener radioActionListener = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent evt) { + applyCardsPane(); + } + }; + + private void applyCardsPane() { + CardLayout cl = (CardLayout) (conditionCardPane.getLayout()); + if (this.commonRadioButton.isSelected()) { + this.setBorder(GUICoreUtils.createTitledBorder(Inter.getLocText("FR-Designer_LiteCondition_Common_Condition"), null)); + cl.show(conditionCardPane, "DEFAULT"); + } else { + this.setBorder(GUICoreUtils.createTitledBorder(Inter.getLocText("FR-Designer_LiteCondition_Formula_Condition"), null)); + cl.show(conditionCardPane, "FORMULA"); + } + } + + /** + * peter:检查Button是否可以编辑. + */ + private void checkButtonEnabledForList() { + modifyButton.setEnabled(false); + removeButton.setEnabled(false); + this.moveUpButton.setEnabled(false); + this.moveDownButton.setEnabled(false); + this.bracketButton.setEnabled(false); + this.unBracketButton.setEnabled(false); + + TreePath selectedTreePath = conditionsTree.getSelectionPath(); + if (selectedTreePath != null) { + modifyButton.setEnabled(true); + removeButton.setEnabled(true); + + // peter:根据选中的节点的是否是第一个或者最后一个. + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + DefaultMutableTreeNode parentTreeNode = (DefaultMutableTreeNode) selectedTreeNode.getParent(); + if (parentTreeNode.getChildBefore(selectedTreeNode) != null) { + moveUpButton.setEnabled(true); + } + if (parentTreeNode.getChildAfter(selectedTreeNode) != null) { + moveDownButton.setEnabled(true); + } + + // peter: 连续选中了超过两个条件,同时没有选中所有的节点. + int selectionCount = conditionsTree.getSelectionCount(); + if (selectionCount > 1 && parentTreeNode.getChildCount() > selectionCount) { + this.bracketButton.setEnabled(true); + } + + // peter:选中的节点必须是ListCondition,才可以删除括号 + JoinCondition jonCondition = (JoinCondition) selectedTreeNode.getUserObject(); + Condition liteCondtion = jonCondition.getCondition(); + if (liteCondtion instanceof ListCondition) { + this.unBracketButton.setEnabled(true); + } + } + } + + /** + * 扩展事件. + */ + TreeExpansionListener treeExpansionListener = new TreeExpansionListener() { + + @Override + public void treeExpanded(TreeExpansionEvent event) { + TreePath selectedTreePath = event.getPath(); + if (selectedTreePath == null) { + return; + } + + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + selectedTreeNode.setExpanded(true); + } + + @Override + public void treeCollapsed(TreeExpansionEvent event) { + TreePath selectedTreePath = event.getPath(); + if (selectedTreePath == null) { + return; + } + + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + selectedTreeNode.setExpanded(false); + } + }; + + private ExpandMutableTreeNode getParentTreeNode() { + DefaultTreeModel defaultTreeModel = (DefaultTreeModel) conditionsTree.getModel(); + TreePath selectedTreePath = conditionsTree.getSelectionPath(); + // peter:如果没有选择的节点,直接添加到根节点. + ExpandMutableTreeNode parentTreeNode; + if (selectedTreePath == null) { + parentTreeNode = (ExpandMutableTreeNode) defaultTreeModel.getRoot(); + } else { + parentTreeNode = (ExpandMutableTreeNode) ((ExpandMutableTreeNode) selectedTreePath.getLastPathComponent()).getParent(); + } + // peter:如果没有选中的节点,直接返回. + return parentTreeNode; + } + + private boolean isExistedInParentTreeNode(ExpandMutableTreeNode parentTreeNode, JoinCondition newJoinCondition) { + + if (parentTreeNode == null) { + return false; + } + JoinCondition parentJoinCondition = (JoinCondition) parentTreeNode.getUserObject(); + Condition parentLiteCondition = parentJoinCondition.getCondition(); + if (parentLiteCondition instanceof ListCondition) { + // peter:在添加UserObject的节点. + + for (int i = 0; i < parentTreeNode.getChildCount(); i++) { + ExpandMutableTreeNode tempTreeNode = (ExpandMutableTreeNode) parentTreeNode.getChildAt(i); + Object tempObject = tempTreeNode.getUserObject(); + if (tempObject instanceof JoinCondition) { + JoinCondition tempJoinCondition = (JoinCondition) tempObject; + if (ComparatorUtils.equals(tempJoinCondition, newJoinCondition)) { + return true; + } + } + } + } + return false; + } + + private DefaultTreeCellRenderer conditionsTreeCellRenderer = new DefaultTreeCellRenderer() { + + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, + boolean hasFocus) { + super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + + DefaultMutableTreeNode currentTreeNode = (DefaultMutableTreeNode) value; + adjustParentListCondition(currentTreeNode); + DefaultMutableTreeNode parentTreeNode = (DefaultMutableTreeNode) currentTreeNode.getParent(); + + this.setIcon(null); + JoinCondition joinCondition = (JoinCondition) currentTreeNode.getUserObject(); + StringBuilder sBuf = new StringBuilder(); + + Condition liteCondition = joinCondition.getCondition(); + if (parentTreeNode != null && parentTreeNode.getFirstChild() != currentTreeNode) { + if (joinCondition.getJoin() == DataConstants.AND) { + sBuf.append("and "); + } else { + sBuf.append("or "); + } + } + + if (liteCondition != null) { + // TODO alex:这里得到的liteCondition为什么会是null呢? + sBuf.append(liteCondition.toString()); + } + this.setText(sBuf.toString()); + + return this; + } + }; + + // peter:根据孩子几点,调整当前节点的ListCondition的值. + protected void adjustParentListCondition(DefaultMutableTreeNode currentTreeNode) { + DefaultMutableTreeNode parentTreeNode = (DefaultMutableTreeNode) currentTreeNode.getParent(); + + Object userObj = currentTreeNode.getUserObject(); + if (userObj instanceof JoinCondition) { + StringBuilder sBuf = new StringBuilder(); + + JoinCondition joinCondition = (JoinCondition) userObj; + Condition liteCondition = joinCondition.getCondition(); + if (parentTreeNode != null && parentTreeNode.getFirstChild() != currentTreeNode) { + if (joinCondition.getJoin() == DataConstants.AND) { + sBuf.append("and "); + } else { + sBuf.append("or "); + } + } + + // peter:这个地方动态产生ListCondition,因为ListCondition的节点会变化的, + // 父亲节点的ListCondition这个UserObject需要跟着变化. + if (liteCondition instanceof ListCondition) { + ListCondition listCondition = (ListCondition) liteCondition; + listCondition.clearJoinConditions(); + + // peter:动态添加孩子节点 + int childCount = currentTreeNode.getChildCount(); + for (int i = 0; i < childCount; i++) { + Object tmpUserObject = ((DefaultMutableTreeNode) currentTreeNode.getChildAt(i)).getUserObject(); + if (tmpUserObject instanceof JoinCondition) { + listCondition.addJoinCondition((JoinCondition) tmpUserObject); + } + } + } + } + } + + /** + * Sets whether or not this component is enabled. + */ + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + + // checkenabled. + checkButtonEnabledForList(); + } + + /** + * Populate. + * + * @param liteCondition lite condition. + */ + @Override + public void populateBean(Condition liteCondition) { + if (liteCondition == null){ + return; + } + // peter: 先删除所有的节点 + DefaultTreeModel defaultTreeModel = (DefaultTreeModel) this.conditionsTree.getModel(); + ExpandMutableTreeNode rootTreeNode = (ExpandMutableTreeNode) defaultTreeModel.getRoot(); + rootTreeNode.setUserObject(new JoinCondition(DataConstants.AND, new ListCondition())); + rootTreeNode.removeAllChildren(); + + // 清空编辑框 + clearDefaultConditionPane(); + formulaTextArea.setText(StringUtils.EMPTY); + + // peter:需要构建成ListCondition,加入到里面. + if (liteCondition instanceof ListCondition) { + ListCondition listCondition = (ListCondition) liteCondition; + + int joinConditionCount = listCondition.getJoinConditionCount(); + if (joinConditionCount == 0) { + commonRadioButton.setSelected(true); + applyCardsPane(); + + } + for (int i = 0; i < joinConditionCount; i++) { + addLiteConditionToListCondition(rootTreeNode, listCondition.getJoinCondition(i)); + } + } else if (isNeedDoWithCondition(liteCondition)) { + // peter:直接添加 + ExpandMutableTreeNode newTreeNode = new ExpandMutableTreeNode(new JoinCondition(DataConstants.AND, liteCondition)); + rootTreeNode.add(newTreeNode); + } + + // peter:需要reload + defaultTreeModel.reload(rootTreeNode); + rootTreeNode.expandCurrentTreeNode(conditionsTree); + // marks:默认的选择第一行 + if (conditionsTree.getRowCount() > 0) { + conditionsTree.setSelectionRow(0); + } + this.checkButtonEnabledForList(); + if (liteCondition == null) { + try { + defaultConditionPane.checkValid(); + } catch (Exception e) {//not need + } + } + } + + // 有需要再重写,不用做成抽象方法 + protected void clearDefaultConditionPane() { + } + + protected boolean isNeedDoWithCondition(Condition liteCondition) { + return true; + } + + // peter:运用递归方式,构建初始的节点 + private void addLiteConditionToListCondition(ExpandMutableTreeNode parentTreeNode, JoinCondition joinCondition) { + ExpandMutableTreeNode newTreeNode = new ExpandMutableTreeNode(joinCondition); + parentTreeNode.add(newTreeNode); + + // peter:继续添加. + Condition liteCondition = joinCondition.getCondition(); + if (liteCondition instanceof ListCondition) { + ListCondition listCondition = (ListCondition) liteCondition; + + int joinConditionCount = listCondition.getJoinConditionCount(); + for (int i = 0; i < joinConditionCount; i++) { + addLiteConditionToListCondition(newTreeNode, listCondition.getJoinCondition(i)); + } + } + } + + + /** + * Update. + * + * @return the new lite condition. + */ + @Override + public Condition updateBean() { + // Samuel:先按modifybutton + modify(); + // peter: 先删除所有的节点 + DefaultTreeModel defaultTreeModel = (DefaultTreeModel) this.conditionsTree.getModel(); + ExpandMutableTreeNode rootTreeNode = (ExpandMutableTreeNode) defaultTreeModel.getRoot(); + + int childCount = rootTreeNode.getChildCount(); + // peter: 如果只有一个孩子节点, 返回空的 ListCondition + if (childCount == 0) { + return new ListCondition(); + } else if (childCount == 1) { // peter: 如果roottreeNode只有一个孩子节点. + JoinCondition joinCondition = (JoinCondition) ((ExpandMutableTreeNode) rootTreeNode.getChildAt(0)).getUserObject(); + return joinCondition.getCondition(); + } else { // peter: 有好多的孩子节点. + // peter:深度遍历所有的孩子节点 + Enumeration depthEnumeration = rootTreeNode.depthFirstEnumeration(); + while (depthEnumeration.hasMoreElements()) { + this.adjustParentListCondition((ExpandMutableTreeNode) depthEnumeration.nextElement()); + } + + JoinCondition joinCondition = (JoinCondition) rootTreeNode.getUserObject(); + Condition newCondition = joinCondition.getCondition(); + //clone(),防止多个条件分组使用同一个condition对象 + try{ + newCondition = (Condition)joinCondition.getCondition().clone(); + }catch (CloneNotSupportedException e){ + FRLogger.getLogger().error(e.getMessage()); + } + return newCondition; + } + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/condition/ObjectLiteConditionPane.java b/designer-base/src/com/fr/design/condition/ObjectLiteConditionPane.java similarity index 100% rename from designer_base/src/com/fr/design/condition/ObjectLiteConditionPane.java rename to designer-base/src/com/fr/design/condition/ObjectLiteConditionPane.java diff --git a/designer-base/src/com/fr/design/condition/SingleConditionPane.java b/designer-base/src/com/fr/design/condition/SingleConditionPane.java new file mode 100644 index 0000000000..cf7642c3af --- /dev/null +++ b/designer-base/src/com/fr/design/condition/SingleConditionPane.java @@ -0,0 +1,54 @@ +package com.fr.design.condition; + + +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import com.fr.base.BaseUtils; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.dialog.BasicPane; +import com.fr.general.Inter; + +public abstract class SingleConditionPane extends BasicPane { + private static final long serialVersionUID = -4274960170813368817L; + + protected UIButton cancel; + + public SingleConditionPane(){ + this(true); + } + + public SingleConditionPane(boolean isRemove) { + this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); + if (isRemove) { + + if(cancel == null) { + cancel = new UIButton(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + cancel.setToolTipText(Inter.getLocText("FR-Action_Remove")); + cancel.addActionListener(cancleListener); + cancel.setMargin(new Insets(0, 0, 0, 0)); + } + + this.add(cancel); + } + } + + ActionListener cancleListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + doCancel(); + } + }; + + /** + * 取消 + */ + public abstract void doCancel(); + + public abstract void setDefault(); + + public abstract void populate(T condition); + + public abstract T update(); +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/constants/KeyWords.java b/designer-base/src/com/fr/design/constants/KeyWords.java similarity index 100% rename from designer_base/src/com/fr/design/constants/KeyWords.java rename to designer-base/src/com/fr/design/constants/KeyWords.java diff --git a/designer_base/src/com/fr/design/constants/LayoutConstants.java b/designer-base/src/com/fr/design/constants/LayoutConstants.java similarity index 100% rename from designer_base/src/com/fr/design/constants/LayoutConstants.java rename to designer-base/src/com/fr/design/constants/LayoutConstants.java diff --git a/designer_base/src/com/fr/design/constants/UIConstants.java b/designer-base/src/com/fr/design/constants/UIConstants.java similarity index 100% rename from designer_base/src/com/fr/design/constants/UIConstants.java rename to designer-base/src/com/fr/design/constants/UIConstants.java diff --git a/designer_base/src/com/fr/design/data/BasicTableDataTreePane.java b/designer-base/src/com/fr/design/data/BasicTableDataTreePane.java similarity index 100% rename from designer_base/src/com/fr/design/data/BasicTableDataTreePane.java rename to designer-base/src/com/fr/design/data/BasicTableDataTreePane.java diff --git a/designer_base/src/com/fr/design/data/DataCreatorUI.java b/designer-base/src/com/fr/design/data/DataCreatorUI.java similarity index 100% rename from designer_base/src/com/fr/design/data/DataCreatorUI.java rename to designer-base/src/com/fr/design/data/DataCreatorUI.java diff --git a/designer-base/src/com/fr/design/data/DesignTableDataManager.java b/designer-base/src/com/fr/design/data/DesignTableDataManager.java new file mode 100644 index 0000000000..91becffa88 --- /dev/null +++ b/designer-base/src/com/fr/design/data/DesignTableDataManager.java @@ -0,0 +1,538 @@ +package com.fr.design.data; + +import com.fr.base.Env; +import com.fr.base.FRContext; +import com.fr.base.StoreProcedureParameter; +import com.fr.base.TableData; +import com.fr.data.TableDataSource; +import com.fr.data.core.DataCoreXmlUtils; +import com.fr.data.impl.EmbeddedTableData; +import com.fr.data.impl.storeproc.ProcedureDataModel; +import com.fr.data.impl.storeproc.StoreProcedure; +import com.fr.data.impl.storeproc.StoreProcedureConstants; +import com.fr.design.DesignModelAdapter; +import com.fr.design.data.datapane.preview.PreviewTablePane; +import com.fr.design.data.tabledata.wrapper.ServerTableDataWrapper; +import com.fr.design.data.tabledata.wrapper.StoreProcedureDataWrapper; +import com.fr.design.data.tabledata.wrapper.StoreProcedureNameWrapper; +import com.fr.design.data.tabledata.wrapper.TableDataFactory; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; +import com.fr.design.dialog.DialogActionAdapter; +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.file.ProcedureConfig; +import com.fr.file.TableDataConfig; +import com.fr.general.ComparatorUtils; +import com.fr.general.data.DataModel; +import com.fr.general.data.TableDataException; +import com.fr.script.Calculator; +import com.fr.stable.ArrayUtils; +import com.fr.stable.ParameterProvider; +import com.fr.stable.StringUtils; +import com.fr.stable.xml.XMLPrintWriter; + +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.io.ByteArrayOutputStream; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Timer; +import java.util.TimerTask; + +/** + * 设计器管理操作数据集的类: + * 1.对于每个TableData,会生成相应的TableDataWrapper.TableDataWrapper里面有TableData的数据列缓存 + * 2.TableDataWrapper是不支持对TableData的修改查询语句 重命名等修改删除操作 + * 如果TableData变化了,那么TableDataWrapper 也会重新生成,然后存进缓存.这样保证缓存是正确的,不会取到错误的数据列。 + * 3.对于模板数据集,关键词应该保证各个模板数据集之间不同,所以默认有个加上模板名的操作。 + * 4.个人觉得完全没有必要做成那种一个SQL语句对应一个数据列的情况,那样子太复杂了。而且每次比较关键词都很慢 + *

+ * !!!Notice: 除了预览数据集的操作,其他所有涉及到数据集的界面操作,都要经过这个类(因为它有数据集的缓存,不需要重复计算) + * + * @author zhou + */ +public abstract class DesignTableDataManager { + /** + * 其实globalDsCache没有绝对的必要,只是为了操作方便。如果没有它,那么每次清空服务器数据集或者存储过程的时候,还要去遍历找一下, + * 这个操作可能比较复杂 。 从减少代码复杂度的角度看,还是很有必要的 + */ + 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 Map> dsListenersMap = new HashMap>(); + + + public static String NO_PARAMETER = "no_paramater_pane"; + + //用于记录是否要弹出参数框 + private static ThreadLocal threadLocal = new ThreadLocal(); + + + /** + * 清除全局 数据集缓存. + */ + public static void clearGlobalDs() { + globalDsCache.clear(); + } + + /** + * 响应数据集改变. + */ + private static void fireDsChanged() { + 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); + } + } + } + + public static void closeTemplate(JTemplate template) { + if (template != null) { + dsListenersMap.remove(template.getFullPathName()); + } + } + + public static void envChange() { + dsListenersMap.clear(); + dsNameChangedMap.clear(); + clearGlobalDs(); + } + + + /** + * 响应数据集改变 + * + * @param dsNameChangedMap 改变名字的数据集 + */ + public static void fireDSChanged(Map dsNameChangedMap) { + if (!dsNameChangedMap.isEmpty()) { + setDsNameChangedMap(dsNameChangedMap); + } + fireDsChanged(); + dsNameChangedMap.clear(); + } + + private static void setDsNameChangedMap(Map map) { + Iterator iterator = map.keySet().iterator(); + while (iterator.hasNext()) { + String key = (String) iterator.next(); + dsNameChangedMap.put(key, map.get(key)); + } + } + + /** + * 数据库是否改变 + * + * @param oldDsName 旧名字 + * @return 是则返回true + */ + public static boolean isDsNameChanged(String oldDsName) { + return dsNameChangedMap.containsKey(oldDsName); + } + + public static String getChangedDsNameByOldDsName(String oldDsName) { + if (isDsNameChanged(oldDsName)) { + return dsNameChangedMap.get(oldDsName); + } else { + return StringUtils.EMPTY; + } + } + + /** + * 添加模板数据集改变 监听事件. + * + * @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); + } + + /** + * 获取数据源source中dsName的所有字段 + * + * @param source 数据源 + * @param dsName 数据集名字 + * @return + */ + public static String[] getSelectedColumnNames(TableDataSource source, String dsName) { + java.util.Map resMap = getAllEditingDataSet(source); + java.util.Map dsMap = getAllDataSetIncludingProcedure(resMap); + TableDataWrapper tabledataWrapper = dsMap.get(dsName); + return tabledataWrapper == null ? new String[0] : tabledataWrapper.calculateColumnNameList().toArray(new String[0]); + } + + /** + * august:返回当前正在编辑的具有报表数据源的模板(基本报表、聚合报表) 包括 : 图表模板 + * + * @return TableDataSource + * attention:与这个方法有关系的静态组件(不随着切换模板tab而变化的),应该重新执行该方法,再刷新组件 + */ + public static TableDataSource getEditingTableDataSource() { + return DesignModelAdapter.getCurrentModelAdapter() == null ? null : DesignModelAdapter.getCurrentModelAdapter().getBook(); + } + + /** + * 返回当前模板(source)数据集、服务器数据集和存储过程中所有的数据集名字 + * + * @param source + * @return + */ + public static String[] getAllDSNames(TableDataSource source) { + Iterator> entryIt = getAllEditingDataSet(source).entrySet().iterator(); + List list = new ArrayList(); + while (entryIt.hasNext()) { + Entry entry = entryIt.next(); + list.add(entry.getKey()); + } + return list.toArray(new String[list.size()]); + } + + /** + * 不根据过滤设置,返回当前模板数据集、服务器数据集、存储过程本身,是有顺序的 + */ + public static java.util.Map getAllEditingDataSet(TableDataSource source) { + java.util.Map resMap = new java.util.LinkedHashMap(); + // 模板数据集 + addTemplateData(resMap, source); + + // 服务器数据集 + addServerData(resMap); + // 存储过程 + addStoreProcedureData(resMap); + + return resMap; + } + + public static java.util.Map getAllDataSetIncludingProcedure(java.util.Map resMap) { + java.util.LinkedHashMap dsMap = new java.util.LinkedHashMap(); + Iterator> entryIt = resMap.entrySet().iterator(); + while (entryIt.hasNext()) { + String key = entryIt.next().getKey(); + TableDataWrapper tableDataWrapper = resMap.get(key); + if (tableDataWrapper.getTableData() instanceof StoreProcedure) { + StoreProcedure storeProcedure = (StoreProcedure) tableDataWrapper.getTableData(); + boolean hasSchemaOrResult = false; + StoreProcedureParameter[] parameters = StoreProcedure.getSortPara(storeProcedure.getParameters()); + String name = tableDataWrapper.getTableDataName(); + List resultNames = storeProcedure.getResultNames(); + TableDataWrapper tdw = new StoreProcedureNameWrapper(name + "_Table", storeProcedure); + + for (StoreProcedureParameter parameter : parameters) { + if (parameter.getSchema() != StoreProcedureConstants.IN) { + String parameterName = name + "_" + parameter.getName(); + TableDataWrapper newTwd = new StoreProcedureDataWrapper(storeProcedure, name, parameterName, false); + dsMap.put(parameterName, newTwd); + hasSchemaOrResult = true; + } + } + + if (!resultNames.isEmpty()) { + hasSchemaOrResult = true; + for (int i = 0; i < resultNames.size(); i++) { + String parameterName = name + "_" + resultNames.get(i); + TableDataWrapper newTwd = new StoreProcedureDataWrapper(storeProcedure, name, parameterName, false); + dsMap.put(parameterName, newTwd); + } + } + + if (!hasSchemaOrResult) { + dsMap.put(name + "_Table", tdw); + } + } else { + dsMap.put(key, tableDataWrapper); + } + } + return dsMap; + } + + /** + * 不根据过滤设置,返回当前服务器数据集、存储过程所有的数据集,是有顺序的 + */ + public static java.util.Map getGlobalDataSet() { + java.util.Map resMap = new java.util.LinkedHashMap(); + + // 服务器数据集 + addServerData(resMap); + // 存储过程 + addStoreProcedureData(resMap); + + return resMap; + } + + /** + * 根据过滤设置,返回当前模板数据集、服务器数据集、存储过程所有的数据集,是有顺序的 + */ + public static List> getEditingDataSet(TableDataSource source) { + Map templateDataMap = new LinkedHashMap(); + Map serverDataMap = new LinkedHashMap(); + Map storeProcedureMap = new LinkedHashMap(); + + addTemplateData(templateDataMap, source); + addServerData(serverDataMap); + addStoreProcedureData(storeProcedureMap); + + List> list = new ArrayList>(); + list.add(templateDataMap); + list.add(serverDataMap); + list.add(storeProcedureMap); + return list; + } + + private static void addTemplateData(java.util.Map resMap, TableDataSource source) { + if (source != null) { + String[] namearray = TableDataFactory.getSortOfChineseNameOfTemplateData(source); + for (String tabledataname : namearray) { + TableData td = source.getTableData(tabledataname); + TableDataWrapper tdw = new TemplateTableDataWrapper(td, tabledataname); + resMap.put(tabledataname, tdw); + } + } + } + + private static void addServerData(java.util.Map resMap) { + TableDataConfig tableDataConfig = TableDataConfig.getInstance(); + String[] namearray = TableDataFactory.getSortOfChineseNameOfServerData(tableDataConfig); + for (String name : namearray) { + if (globalDsCache.containsKey(name)) { + resMap.put(name, globalDsCache.get(name)); + } else { + TableDataWrapper tdw = new ServerTableDataWrapper(tableDataConfig.getTableData(name), name); + resMap.put(name, tdw); + globalDsCache.put(name, tdw); + } + } + } + + + private static void addStoreProcedureData(java.util.Map resMap) { + ProcedureConfig procedureConfig = ProcedureConfig.getInstance(); + String[] namearray = new String[0]; + @SuppressWarnings("unchecked") + java.util.Iterator nameIt = procedureConfig.getProcedures().keySet().iterator(); + while (nameIt.hasNext()) { + namearray = (String[]) ArrayUtils.add(namearray, nameIt.next()); + } + Arrays.sort(namearray, Collator.getInstance(java.util.Locale.CHINA)); + + for (String name : namearray) { + StoreProcedure storeProcedure = procedureConfig.getProcedure(name); + if (globalDsCache.containsKey(name)) { + resMap.put(name, globalDsCache.get(name)); + } else { + TableDataWrapper tdw = new StoreProcedureNameWrapper(name, storeProcedure); + resMap.put(name, tdw); + globalDsCache.put(name, tdw); + } + } + } + + + /** + * 预览需要参数的数据集 + * + * @param tabledata 数据集 + * @param rowCount 需要预览的行数 + * @param needLoadingBar 是否需要加载进度条 + * @return 数据集 + * @throws Exception 异常 + */ + public static EmbeddedTableData previewTableDataNeedInputParameters(TableData tabledata, int rowCount, boolean needLoadingBar) throws Exception { + return previewTableData(null, tabledata, rowCount, true, needLoadingBar); + } + + /** + * 预览需要参数的数据集 + * + * @param tabledata 数据集 + * @param rowCount 需要预览的行数 + * @param needLoadingBar 是否需要加载进度条 + * @return 数据集 + * @throws Exception 异常 + */ + public static EmbeddedTableData previewTableDataNeedInputParameters(TableDataSource tableDataSource, TableData tabledata, int rowCount, boolean needLoadingBar) throws Exception { + return previewTableData(tableDataSource, tabledata, rowCount, true, needLoadingBar); + } + + /** + * 预览不需要参数的数据集 + * + * @param tabledata 数据集 + * @param rowCount 需要预览的行数 + * @param needLoadingBar 是否需要加载进度条 + * @return 数据集 + * @throws Exception 异常 + */ + public static EmbeddedTableData previewTableDataNotNeedInputParameters(TableData tabledata, int rowCount, boolean needLoadingBar) throws Exception { + return previewTableData(null, tabledata, rowCount, false, needLoadingBar); + } + + /** + * 预览不需要参数的数据集 + * + * @param tabledata 数据集 + * @param rowCount 需要预览的行数 + * @param needLoadingBar 是否需要加载进度条 + * @return 数据集 + * @throws Exception 异常 + */ + public static EmbeddedTableData previewTableDataNotNeedInputParameters(TableDataSource tableDataSource, TableData tabledata, int rowCount, boolean needLoadingBar) throws Exception { + return previewTableData(tableDataSource, tabledata, rowCount, false, needLoadingBar); + } + + /** + * 获取预览后的EmbeddedTableData,考虑到Env + * + * @param tabledata + * @param rowCount + * @param isMustInputParameters 是否必须输入参数值(不管参数有没有默认值)。一般预览时这个值为true,因为一般预览是要看不同的参数的结果的。 + * 而获取数据集的字段名字时,则没必要 + * @return + */ + private static EmbeddedTableData previewTableData(TableDataSource tableDataSource, TableData tabledata, int rowCount, boolean isMustInputParameters, boolean needLoadingBar) throws Exception { + final AutoProgressBar loadingBar = PreviewTablePane.getInstance().getProgressBar(); + Env currentEnv = FRContext.getCurrentEnv(); + ParameterProvider[] parameters = currentEnv.getTableDataParameters(tabledata); + if (ArrayUtils.isEmpty(parameters)) { + parameters = tabledata.getParameters(Calculator.createCalculator()); + } + final Map parameterMap = new HashMap<>(); + if (needInputParams(isMustInputParameters, parameters)) { + final ParameterInputPane pPane = new ParameterInputPane(parameters); + pPane.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { + @Override + public void doOk() { + parameterMap.putAll(pPane.update()); + } + }).setVisible(true); + } else { + for (ParameterProvider parameter : parameters) { + parameterMap.put(parameter.getName(), parameter.getValue()); + } + } + if (loadingBar != null && needLoadingBar) { + loadingBar.start(); + } + try { + for (ParameterProvider parameter : currentEnv.getTableDataParameters(tabledata)) { + if (parameterMap.containsKey(parameter.getName())) { + parameter.setValue(parameterMap.get(parameter.getName())); + } + } + return currentEnv.previewTableData(tableDataSource, tabledata, parameterMap, rowCount); + } catch (TableDataException e) { + throw new TableDataException(e.getMessage(), e); + } finally { + new Timer().schedule(new TimerTask() { + public void run() { + loadingBar.close(); + } + }, 100); + } + } + + private static boolean needInputParams(boolean mustInputParameters, ParameterProvider[] parameters) { + if (mustInputParameters && ArrayUtils.isNotEmpty(parameters)) { + return true; + } + for (ParameterProvider parameter : parameters) { + if (parameter.getValue() == null || StringUtils.EMPTY.equals(parameter.getValue())) { + return true; + } + } + return false; + } + + /** + * 返回TableData的数据列,注意TableData + * 是没有考虑参数的。用于简单的查询语句生成的TableData, 或者 + * EmbeddedTableData. 比如说:数据字典-数据库表生成的TableData。 + * 使用该方法是没有数据集缓存的功能的 + * + * @return List + */ + public static List getColumnNamesByTableData(TableData tableData) { + List columnNames = new ArrayList(); + if (tableData != null) { + DataModel rs = tableData.createDataModel(Calculator.createCalculator()); + int value; + try { + value = rs.getColumnCount(); + for (int i = 0; i < value; i++) { + columnNames.add(rs.getColumnName(i)); + } + rs.release(); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage()); + } + + } + + return columnNames; + } + + /** + * 该方法主要利用了StoreProcedure里面的“dataModelList有缓存作用”的机制 + * 所以用该方法,不会对一个已经计算了的存储过程重复计算.和分页预览时处理机制一样,这样对有多个返回数据集的存储过程来说很有必要 + * + * @param needLoadingBar 是否需要进度条 + * @param storeProcedure 存储过程 + * @return 数据 + */ + public static ProcedureDataModel[] createLazyDataModel(StoreProcedure storeProcedure, boolean needLoadingBar) throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + XMLPrintWriter writer = XMLPrintWriter.create(out); + // 把storeProcedure写成xml文件到out + DataCoreXmlUtils.writeXMLStoreProcedure(writer, storeProcedure, null); + Env currentEnv = FRContext.getCurrentEnv(); + if (storeProcedure.getDataModelSize() > 0 && !storeProcedure.isFirstExpand()) { + return storeProcedure.creatLazyDataModel(); + } + ParameterProvider[] inParameters = currentEnv.getStoreProcedureParameters(storeProcedure); + final Map parameterMap = new HashMap(); + if (inParameters.length > 0 && !ComparatorUtils.equals(threadLocal.get(), NO_PARAMETER)) {// 检查Parameter. + final ParameterInputPane pPane = new ParameterInputPane(inParameters); + pPane.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { + public void doOk() { + parameterMap.putAll(pPane.update()); + } + }).setVisible(true); + + } + storeProcedure.setFirstExpand(false); + if (needLoadingBar) { + StoreProcedureDataWrapper.loadingBar.start(); + } + return FRContext.getCurrentEnv().previewProcedureDataModel(storeProcedure, parameterMap, 0); + } + + public static void setThreadLocal(String value) { + threadLocal.set(value); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/ChoosePane.java b/designer-base/src/com/fr/design/data/datapane/ChoosePane.java new file mode 100644 index 0000000000..5e9c16bdea --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/ChoosePane.java @@ -0,0 +1,604 @@ +package com.fr.design.data.datapane; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.base.TableData; +import com.fr.data.core.DataCoreUtils; +import com.fr.data.core.db.DBUtils; +import com.fr.data.core.db.TableProcedure; +import com.fr.data.core.db.dialect.DialectFactory; +import com.fr.data.impl.Connection; +import com.fr.data.impl.DBTableData; +import com.fr.dav.LocalEnv; +import com.fr.design.DesignerEnvManager; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.datapane.RefreshLabel.Refreshable; +import com.fr.design.data.datapane.preview.PreviewLabel; +import com.fr.design.data.datapane.preview.PreviewLabel.Previewable; +import com.fr.design.data.datapane.preview.PreviewTablePane; +import com.fr.design.data.tabledata.Prepare4DataSourceChange; +import com.fr.design.gui.icombobox.FRTreeComboBox; +import com.fr.design.gui.icombobox.FilterableComboBoxModel; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.icombobox.UIComboBoxEditor; +import com.fr.design.gui.icombobox.UIComboBoxRenderer; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.DesignerFrame; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.file.ConnectionConfig; +import com.fr.general.ComparatorUtils; +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; +import java.awt.*; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; + +/** + * @author zhou + * @since 2012-7-11下午4:49:39 + */ +public class ChoosePane extends BasicBeanPane implements Refreshable, Previewable, Prepare4DataSourceChange { + private static final double COLUMN_SIZE = 24; + + /** + * 数据库 + */ + protected StringUIComboBox dsNameComboBox; + + /** + * 模式 + */ + protected StringUIComboBox schemaBox; + + /** + * 表名 + */ + protected FRTreeComboBox tableNameComboBox; + + private SwingWorker populateWorker; + + + private PopupMenuListener popupMenuListener = new PopupMenuListener() { + + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + new Thread() { + @Override + public void run() { + calculateTableDataNames(); + } + }.start(); + } + + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + } + + public void popupMenuCanceled(PopupMenuEvent e) { + } + }; + + + private PopupMenuListener listener = new PopupMenuListener() { + public void popupMenuCanceled(PopupMenuEvent e) { + } + + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + } + + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + executePopulateWorker(); + } + }; + + public ChoosePane() { + this(null); + } + + public ChoosePane(Previewable parent) { + this(parent, -1); + } + + public ChoosePane(Previewable parent, int labelSize) { + this.initBasicComponet(); + this.initComponentsLayout(new PreviewLabel(parent == null ? this : parent), labelSize); + } + + private void initBasicComponet() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + dsNameComboBox = new StringUIComboBox(); + initDsNameComboBox(); + + schemaBox = new StringUIComboBox(); + schemaBox.setEditor(new ComboBoxEditor()); + + tableNameComboBox = new FRTreeComboBox(new JTree(new DefaultMutableTreeNode()), tableNameTreeRenderer, false); + tableNameComboBox.setEditable(true); + tableNameComboBox.setRenderer(listCellRenderer); + registerDSChangeListener(); + initBoxListener(); + } + + private void initBoxListener() { + addDSBoxListener(); + schemaBox.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent evt) { + tableNameComboBox.setSelectedItem(""); + } + }); + schemaBox.addPopupMenuListener(listener); + addFocusListener(); + this.tableNameComboBox.addPopupMenuListener(popupMenuListener); + } + + protected void addDSBoxListener() { + dsNameComboBox.addItemListener(new ItemListener() { + + @Override + public void itemStateChanged(ItemEvent e) { + schemaBox.setSelectedIndex(-1); + tableNameComboBox.setSelectedItem(""); + JTree tree = tableNameComboBox.getTree(); + if (tree == null) { + return; + } + DefaultMutableTreeNode rootTreeNode = (DefaultMutableTreeNode) tree.getModel().getRoot(); + rootTreeNode.removeAllChildren(); + rootTreeNode.add(new ExpandMutableTreeNode("Loading...")); + ((DefaultTreeModel) tree.getModel()).reload(); + + } + }); + } + + protected void addFocusListener() { + schemaBox.addFocusListener(new FocusAdapter() { + public void focusGained(FocusEvent e) { + if (schemaBox.getSelectedIndex() == -1) { + schemaBox.updateUI(); + schemaBox.showPopup(); + } + } + }); + } + + protected void initDsNameComboBox() { + dsNameComboBox.setRefreshingModel(true); + ConnectionConfig connectionConfig = ConnectionConfig.getInstance(); + List dsList = new ArrayList<>(); + dsList.addAll(connectionConfig.getConnections().keySet()); + FilterableComboBoxModel dsNameComboBoxModel = new FilterableComboBoxModel(dsList); + dsNameComboBox.setModel(dsNameComboBoxModel); + dsNameComboBox.setRefreshingModel(false); + } + + protected void initComponentsLayout(PreviewLabel previewLabel, int labelSize) { + UILabel l1 = new UILabel(Inter.getLocText("FR-Designer_Database") + ":"); + UILabel l2 = new UILabel(Inter.getLocText("FR-Designer_Model") + ":"); + UILabel l3 = new UILabel(Inter.getLocText("FR-Designer_Table") + ":"); + + if (labelSize > 0) { + Dimension pSize = new Dimension(labelSize, 25); + l1.setPreferredSize(pSize); + l2.setPreferredSize(pSize); + l3.setPreferredSize(pSize); + } + + Component[][] coms = new Component[][]{{l1, dsNameComboBox, l2, schemaBox, + l3, this.tableNameComboBox, new RefreshLabel(this), previewLabel}}; + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + JPanel northDSPane = TableLayoutHelper.createTableLayoutPane(coms, new double[]{p}, new double[]{p, f, p, f, p, f, COLUMN_SIZE, COLUMN_SIZE}); + + this.add(northDSPane, BorderLayout.CENTER); + + } + + @Override + public void populateBean(final DataBaseItems ob) { + this.dsNameComboBox.setSelectedItem(ob.getDatabaseName()); + schemaBox.setSelectedItem(ob.getSchemaName()); + this.tableNameComboBox.setSelectedItem(ob.getTableName()); + } + + + private void executePopulateWorker() { + if (populateWorker != null) { + populateWorker.cancel(true); + } + populateWorker = new SwingWorker() { + + protected com.fr.data.impl.Connection doInBackground() throws Exception { + schemaBox.addItem(Inter.getLocText("FR-Designer_Loading") + "..."); + schemaBox.setSelectedItem(null); + return getConnection(); + } + + public void done() { + try { + com.fr.data.impl.Connection selectedDatabase = get(); + String selectedItem = schemaBox.getSelectedItem(); + schemaBox.setRefreshingModel(true); + schemaBox.removeAllItems(); + schemaBox.updateUI(); + if (selectedDatabase == null) { + return; + } + String[] schema = DataCoreUtils.getDatabaseSchema(selectedDatabase); + schema = schema == null ? new String[]{""} : schema; + for (String aa : schema) { + schemaBox.addItem(aa); + } + int index = schemaBox.getSelectedIndex(); + if (selectedItem != null) { + schemaBox.setSelectedItem(selectedItem); + } else if (index < schema.length) { + schemaBox.setSelectedIndex(index); + } + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage()); + } + schemaBox.setRefreshingModel(false); + schemaBox.removePopupMenuListener(listener); + schemaBox.setPopupVisible(true); + schemaBox.addPopupMenuListener(listener); + } + }; + populateWorker.execute(); + } + + @Override + public DataBaseItems updateBean() { + return new DataBaseItems(this.getDSName(), this.schemaBox.getSelectedItem(), getTableName()); + } + + /** + * 重置选中的box + */ + public void resetComponets() { + GUICoreUtils.setSelectedItemQuietly(dsNameComboBox, -1); + GUICoreUtils.setSelectedItemQuietly(schemaBox, -1); + GUICoreUtils.setSelectedItemQuietly(tableNameComboBox, -1); + } + + protected com.fr.data.impl.Connection getConnection() { + String selectedDSName = this.getDSName(); + if (StringUtils.isEmpty(selectedDSName)) { + return null; // peter:选中了当前的零长度的节点,直接返回. + } + ConnectionConfig connectionConfig = ConnectionConfig.getInstance(); + for (Map.Entry entry: connectionConfig.getConnections().entrySet()) { + if (ComparatorUtils.equals(selectedDSName, entry.getKey())) { + return entry.getValue(); + } + } + return null; + } + + /** + * 刷新没多大用。而且要刷新也不是这儿刷新。 + */ + public void refresh() { + DBUtils.refreshDatabase(); + String schema = StringUtils.isEmpty(schemaBox.getSelectedItem()) ? null : schemaBox.getSelectedItem(); + DataCoreUtils.refreshTables(getConnection(), TableProcedure.TABLE, schema); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Designer_Refresh_Successfully") + "!", Inter.getLocText("FR-Designer_Refresh_Database"), + JOptionPane.INFORMATION_MESSAGE); + } + + TreeCellRenderer tableNameTreeRenderer = new DefaultTreeCellRenderer() { + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { + super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); + if (value instanceof DefaultMutableTreeNode) { + DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; + Object userObj = node.getUserObject(); + if (userObj instanceof String) { + this.setIcon(BaseUtils.readIcon("com/fr/design/images/m_insert/expandCell.gif")); + } else if (userObj instanceof TableProcedure) { + this.setText(((TableProcedure) userObj).getName()); + } + } + return this; + } + }; + + public static UIComboBoxRenderer listCellRenderer = new UIComboBoxRenderer() { + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof TreePath) { + DefaultMutableTreeNode dmt = (DefaultMutableTreeNode) ((TreePath) value).getLastPathComponent(); + if (dmt.getUserObject() instanceof TableProcedure) { + this.setText(((TableProcedure) dmt.getUserObject()).getName()); + } else { + this.setText(null); + } + } + return this; + } + }; + + + /** + * 添加项目监听事件 + * @param aListener 事件监听器 + */ + public void addItemListener(ItemListener aListener) { + this.tableNameComboBox.addItemListener(aListener); + } + + /** + * 删除项目监听事件 + * @param aListener 事件监听器 + */ + public void removeItemListener(ItemListener aListener) { + this.tableNameComboBox.removeItemListener(aListener); + } + + @Override + protected String title4PopupWindow() { + return "choosepane"; + } + + protected void calculateTableDataNames() { + JTree tree = tableNameComboBox.getTree(); + if (tree == null) { + return; + } + DefaultMutableTreeNode rootTreeNode = (DefaultMutableTreeNode) tree.getModel().getRoot(); + rootTreeNode.removeAllChildren(); + + String selectedDSName = this.getDSName(); + com.fr.data.impl.Connection selectedDatabase = this.getConnection(); + if (selectedDatabase == null) { + return; + } + try { + String schema = StringUtils.isEmpty(this.schemaBox.getSelectedItem()) ? null : this.schemaBox.getSelectedItem(); + TableProcedure[] sqlTableArray = DataCoreUtils.getTables(selectedDatabase, TableProcedure.TABLE, schema, DesignerEnvManager.getEnvManager().isOracleSystemSpace()); + if (sqlTableArray.length > 0) { + ExpandMutableTreeNode tableTreeNode = new ExpandMutableTreeNode(selectedDSName + "-" + Inter.getLocText("FR-Designer_SQL-Table")); + rootTreeNode.add(tableTreeNode); + for (int i = 0; i < sqlTableArray.length; i++) { + ExpandMutableTreeNode tableChildTreeNode = new ExpandMutableTreeNode(sqlTableArray[i]); + tableTreeNode.add(tableChildTreeNode); + } + } + TableProcedure[] sqlViewArray = DataCoreUtils.getTables(selectedDatabase, TableProcedure.VIEW, schema, DesignerEnvManager.getEnvManager().isOracleSystemSpace()); + if (sqlViewArray.length > 0) { + ExpandMutableTreeNode viewTreeNode = new ExpandMutableTreeNode(selectedDSName + "-" + Inter.getLocText("FR-Designer_SQL-View")); + rootTreeNode.add(viewTreeNode); + for (int i = 0; i < sqlViewArray.length; i++) { + ExpandMutableTreeNode viewChildTreeNode = new ExpandMutableTreeNode(sqlViewArray[i]); + viewTreeNode.add(viewChildTreeNode); + } + } + ((DefaultTreeModel) tree.getModel()).reload(); + /** + * daniel 展开所有tree + */ + TreeNode root = (TreeNode) tree.getModel().getRoot(); + TreePath parent = new TreePath(root); + TreeNode node = (TreeNode) parent.getLastPathComponent(); + for (Enumeration e = node.children(); e.hasMoreElements(); ) { + TreeNode n = (TreeNode) e.nextElement(); + TreePath path = parent.pathByAddingChild(n); + tree.expandPath(path); + } + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + } + + /** + * 创建选中的数据集数据 + * @return 数据集数据 + */ + public TableData createSelectTableData() { + DataBaseItems paras = this.updateBean(); + boolean connect = false; + com.fr.data.impl.Connection database = DBUtils.checkDBConnection(paras.getDatabaseName()); + if (database == null) { + failedToFindTable(); + return TableData.EMPTY_TABLEDATA; + } + try { + connect = FRContext.getCurrentEnv().testConnection(database); + } catch (Exception e1) { + connect = false; + } + if (!connect) { + DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); + JOptionPane.showMessageDialog(designerFrame, Inter.getLocText("Datasource-Connection_failed"), + Inter.getLocText("FR-Designer_Failed"), JOptionPane.INFORMATION_MESSAGE); + failedToFindTable(); + return null; + } + // 显示Table数据. + + TableData tableData = null; + if (FRContext.getCurrentEnv() instanceof LocalEnv) { + TableData tableDataLocal = new DBTableData(database, DataCoreUtils.createSelectSQL(paras.getSchemaName(), paras.getTableName(), + DialectFactory.getDialectByName(paras.getDatabaseName()))); + tableData = tableDataLocal; + } else { + try { + TableData tableDataLocal = new DBTableData(database, DataCoreUtils.createSelectSQL(paras.getSchemaName(), paras.getTableName(), DialectFactory.getDialectByName(paras.getDatabaseName()))); + tableData = FRContext.getCurrentEnv().previewTableData(tableDataLocal, java.util.Collections.EMPTY_MAP, + DesignerEnvManager.getEnvManager().getMaxNumberOrPreviewRow()); + } catch (Exception e) { + failedToFindTable(); + FRContext.getLogger().error(e.getMessage(), e); + } + } + + return tableData; + } + + protected String getDSName() { + return this.dsNameComboBox.getSelectedItem(); + } + + protected void failedToFindTable() { + } + + protected String getTableName() { + String tableName = ""; + Object obj = this.tableNameComboBox.getSelectedItem(); + if (obj == null) { + obj = this.tableNameComboBox.getEditor().getItem(); + } + if (obj instanceof TreePath) { + Object tp = ((ExpandMutableTreeNode) ((TreePath) obj).getLastPathComponent()).getUserObject(); + if (tp instanceof TableProcedure) { + tableName = ((TableProcedure) tp).getName(); + } + } else if (obj instanceof String) { + tableName = (String) obj; + } + return tableName; + } + + /** + * 得到当前的ColumnName[] + * @return 返回当前的ColumnName[] + */ + public String[] currentColumnNames() { + String[] colNames = null; + + DataBaseItems paras = this.updateBean(); + String selectedDSName = paras.getDatabaseName(); + if (StringUtils.isBlank(selectedDSName)) { + return colNames = new String[0]; // peter:选中了当前的零长度的节点,直接返回. + } + + String selectedTableObject = paras.getTableName(); + if (StringUtils.isEmpty(selectedTableObject)) { + return colNames = new String[0]; + } + java.sql.Connection conn = null; + try { + // daniel:增加参数 + colNames = FRContext.getCurrentEnv().getColumns(selectedDSName, paras.getSchemaName(), selectedTableObject); + } catch (Exception e2) { + FRContext.getLogger().error(e2.getMessage(), e2); + } finally { + DBUtils.closeConnection(conn); + } + + if (colNames == null) { + colNames = new String[0]; + } + return colNames; + } + + /** + * 预览key value对应的数据 + * @param key 键 + * @param value 值 + */ + public void preview(int key, int value) { + PreviewTablePane.previewTableData(createSelectTableData(), key, value); + } + + /** + * 默认预览 + */ + public void preview() { + preview(-1, -1); + } + + /** + * 设置数据集名. + */ + public void setTableNameComboBoxPopSize(int width, int height) { + tableNameComboBox.setPopSize(width, height); + } + + /** + *注册listener,相应数据集改变 + */ + public void registerDSChangeListener() { + DesignTableDataManager.addDsChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + initDsNameComboBox(); + } + }); + } + + + protected class StringUIComboBox extends UIComboBox { + private boolean refreshingModel = false; + + @Override + protected void fireItemStateChanged(ItemEvent e) { + if (!isRefreshingModel()) { + super.fireItemStateChanged(e); + } + } + + @Override + public String getSelectedItem() { + Object ob = super.getSelectedItem(); + if (ob instanceof String) { + return (String) ob; + } else + return StringUtils.EMPTY; + } + + public boolean isRefreshingModel() { + return refreshingModel; + } + + public void setRefreshingModel(boolean refreshingModel) { + this.refreshingModel = refreshingModel; + } + + public void setSelectedItem(Object ob) { + this.getModel().setSelectedItem(ob); + if (ob != null && StringUtils.isEmpty(ob.toString())) { + super.setSelectedIndex(-1); + } else { + super.setSelectedItem(ob); + } + } + } + + private class ComboBoxEditor extends UIComboBoxEditor { + private Object item; + + public void setItem(Object item) { + this.item = item; + textField.setText((item == null) ? "" : item.toString()); + } + + public Object getItem() { + return this.item; + } + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/data/datapane/ChoosePaneSupportFormula.java b/designer-base/src/com/fr/design/data/datapane/ChoosePaneSupportFormula.java similarity index 100% rename from designer_base/src/com/fr/design/data/datapane/ChoosePaneSupportFormula.java rename to designer-base/src/com/fr/design/data/datapane/ChoosePaneSupportFormula.java diff --git a/designer-base/src/com/fr/design/data/datapane/DSButtonGroup.java b/designer-base/src/com/fr/design/data/datapane/DSButtonGroup.java new file mode 100644 index 0000000000..356ea0fe06 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/DSButtonGroup.java @@ -0,0 +1,48 @@ +package com.fr.design.data.datapane; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.mainframe.WestRegionContainerPane; + +import javax.swing.*; +import java.awt.*; + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-4-27 + * Time: 上午10:32 + * To change this template use File | Settings | File Templates. + */ +public class DSButtonGroup extends UIButtonGroup { + + public DSButtonGroup(Icon[] iconArray, Integer[] objects) { + super(iconArray, objects); + } + + + + + protected void paintBorder(Graphics g) { + int tabledatatreepaneWidth = WestRegionContainerPane.getInstance().getWidth()-10; + int labelX = 54 - (290 - tabledatatreepaneWidth) / 4 - 1; + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(UIConstants.LINE_COLOR); + + int width = 0; + + width += labelButtonList.get(0).getWidth() + 1; + int height = labelButtonList.get(0).getHeight(); + g.drawLine(width + labelX, 0, width + labelX, height); + + width += labelButtonList.get(labelButtonList.size() - 1).getWidth() + 1; + + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.drawRoundRect( labelX, 0, width, getHeight() - 1, UIConstants.ARC, UIConstants.ARC); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + + + g2d.drawLine(labelX / 2, getHeight() / 2, width + 3 * labelX / 2 , getHeight() / 2); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/DataBaseItems.java b/designer-base/src/com/fr/design/data/datapane/DataBaseItems.java new file mode 100644 index 0000000000..0215536381 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/DataBaseItems.java @@ -0,0 +1,49 @@ +package com.fr.design.data.datapane; + +import com.fr.stable.StringUtils; + +/** + * + * @author zhou + * @since 2012-7-11下午5:11:31 + */ +public class DataBaseItems { + private String databaseName; + private String schemaName; + private String tableName; + + public DataBaseItems() { + this(null, null, null); + } + + public DataBaseItems(String databaseName, String schemaName, String tableName) { + this.setDatabaseName(databaseName); + this.setSchemaName(schemaName); + this.setTableName(tableName); + } + + public String getDatabaseName() { + return databaseName; + } + + public void setDatabaseName(String databaseName) { + this.databaseName = databaseName == null ? StringUtils.EMPTY : databaseName; + } + + public String getSchemaName() { + return schemaName; + } + + public void setSchemaName(String schemaName) { + this.schemaName = schemaName == null ? StringUtils.EMPTY : schemaName; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName == null ? StringUtils.EMPTY : tableName; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/EditOrNewLabel.java b/designer-base/src/com/fr/design/data/datapane/EditOrNewLabel.java new file mode 100644 index 0000000000..8e0a9e5290 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/EditOrNewLabel.java @@ -0,0 +1,34 @@ +package com.fr.design.data.datapane; + +import java.awt.Cursor; + +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JPanel; + +import com.fr.base.BaseUtils; +import com.fr.design.data.datapane.FlashLookLabelMouseAdapter.ReleaseAction; +import com.fr.general.Inter; + + +public class EditOrNewLabel extends UILabel { + JPanel editTablePane; + Editable editable; + + public EditOrNewLabel(Editable editable, JPanel editPane) { + super(BaseUtils.readIcon("/com/fr/design/images/m_file/edit.png")); + this.setToolTipText(Inter.getLocText("Edit")); + this.setCursor(new Cursor(Cursor.HAND_CURSOR)); + this.editable = editable; + this.editTablePane = editPane; + this.addMouseListener(new FlashLookLabelMouseAdapter(this, new ReleaseAction() { + @Override + public void releaseAction() { + EditOrNewLabel.this.editable.edit(EditOrNewLabel.this.editTablePane); + } + })); + } + + public static interface Editable { + public void edit(JPanel jPanel); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/FlashLookLabelMouseAdapter.java b/designer-base/src/com/fr/design/data/datapane/FlashLookLabelMouseAdapter.java new file mode 100644 index 0000000000..dcca950ae9 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/FlashLookLabelMouseAdapter.java @@ -0,0 +1,57 @@ +package com.fr.design.data.datapane; + +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.BorderFactory; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.border.Border; + +public class FlashLookLabelMouseAdapter extends MouseAdapter { + boolean mouseEntered = false; + boolean buttonPressed = false; + + private UILabel label; + private ReleaseAction releaseAction; + private static final Border NORMAL_BORDER = BorderFactory.createLineBorder(UIConstants.NORMAL_BACKGROUND); + private static final Border ENTERED_BORDER = BorderFactory.createLineBorder(java.awt.Color.GRAY); + + public FlashLookLabelMouseAdapter(UILabel label, ReleaseAction releaseAction) { + this.label = label; + label.setBorder(NORMAL_BORDER); + this.releaseAction = releaseAction; + } + + public void mouseEntered(MouseEvent e) { //当鼠标进入时候调用. + mouseEntered = true; + if(!buttonPressed){ + label.setBackground(java.awt.Color.WHITE); + label.setOpaque(true); + label.setBorder(ENTERED_BORDER); + } + } + public void mouseExited(MouseEvent e) { + mouseEntered = false; + label.setOpaque(false); + label.setBorder(NORMAL_BORDER); + } + + public void mousePressed(MouseEvent e){ + buttonPressed = true; + label.setBackground(java.awt.Color.lightGray); + } + public void mouseReleased(MouseEvent e){ + buttonPressed = false; + if(mouseEntered){ + label.setBackground(java.awt.Color.WHITE); + + this.releaseAction.releaseAction(); + } + } + + public static interface ReleaseAction { + public void releaseAction(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/GlobalTableDataComboBox.java b/designer-base/src/com/fr/design/data/datapane/GlobalTableDataComboBox.java new file mode 100644 index 0000000000..3f8ee6bbff --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/GlobalTableDataComboBox.java @@ -0,0 +1,22 @@ +package com.fr.design.data.datapane; + +import com.fr.design.data.DesignTableDataManager; +import com.fr.data.TableDataSource; + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-4-20 + * Time: 上午11:16 + * To change this template use File | Settings | File Templates. + */ +public class GlobalTableDataComboBox extends TableDataComboBox { + + public GlobalTableDataComboBox(TableDataSource source, String treeName) { + super(source, treeName); + } + protected void setResMap(TableDataSource source){ + resMap = DesignTableDataManager.getGlobalDataSet(); + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/GlobalTreeTableDataDictPane.java b/designer-base/src/com/fr/design/data/datapane/GlobalTreeTableDataDictPane.java new file mode 100644 index 0000000000..3c85452f5d --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/GlobalTreeTableDataDictPane.java @@ -0,0 +1,21 @@ +package com.fr.design.data.datapane; + +import com.fr.design.data.DesignTableDataManager; + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-4-20 + * Time: 上午11:27 + * To change this template use File | Settings | File Templates. + */ +public class GlobalTreeTableDataDictPane extends TreeTableDataDictPane { + + public GlobalTreeTableDataDictPane(String treeName) { + super(treeName); + } + + protected void setTableDataNameComboBox(String string) { + tableDataNameComboBox = new GlobalTableDataComboBox(DesignTableDataManager.getEditingTableDataSource(),string); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/RefreshLabel.java b/designer-base/src/com/fr/design/data/datapane/RefreshLabel.java new file mode 100644 index 0000000000..a02b4d6a68 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/RefreshLabel.java @@ -0,0 +1,37 @@ +package com.fr.design.data.datapane; + +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import com.fr.base.BaseUtils; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.general.Inter; + + + +public class RefreshLabel extends UIButton { + private Refreshable refreshable; + + public RefreshLabel(Refreshable refreshable) { + super(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + + this.refreshable = refreshable; + + this.setToolTipText(Inter.getLocText("Refresh_Database")); + this.setCursor(new Cursor(Cursor.HAND_CURSOR)); + this.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + RefreshLabel.this.refreshable.refresh(); + } + }); + this.setPreferredSize(new Dimension(24, 20)); + } + + public static interface Refreshable { + public void refresh(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/ReportTableDataPane.java b/designer-base/src/com/fr/design/data/datapane/ReportTableDataPane.java new file mode 100644 index 0000000000..5d763ea069 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/ReportTableDataPane.java @@ -0,0 +1,62 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.data.datapane; + +import com.fr.data.TableDataSource; +import com.fr.design.gui.controlpane.NameableCreator; +import com.fr.design.gui.frpane.LoadingBasicPane; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.util.Map; + +/** + * @author richer + * @since 6.5.5 + * 创建于2011-6-14 + */ +public class ReportTableDataPane extends LoadingBasicPane { + private TableDataPaneController tdPane; + + @Override + protected void initComponents(JPanel container) { + container.setLayout(FRGUIPaneFactory.createBorderLayout()); + tdPane = new TableDataPaneListPane() { + @Override + public NameableCreator[] createNameableCreators() { + + return TableDataCreatorProducer.getInstance().createReportTableDataCreator(); + } + }; + container.add(tdPane.getPanel(), BorderLayout.CENTER); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("DS-Report_TableData"); + } + + public void populate(TableDataSource tds) { + tdPane.populate(tds); + } + + public void update(TableDataSource tds) { + tdPane.update(tds); + } + + /** + * 检查tdListPane有效性check Valid + * + * @throws Exception 异常 + */ + public void checkValid() throws Exception { + this.tdPane.checkValid(); + } + + public Map getDsNameChangedMap() { + return tdPane.getDsNameChangedMap(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/TableDataComboBox.java b/designer-base/src/com/fr/design/data/datapane/TableDataComboBox.java new file mode 100644 index 0000000000..dddb269bc8 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/TableDataComboBox.java @@ -0,0 +1,150 @@ +package com.fr.design.data.datapane; + +import java.awt.Component; +import java.awt.event.ItemEvent; +import java.util.Iterator; +import java.util.Map.Entry; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import com.fr.design.constants.UIConstants; +import com.fr.design.data.DesignTableDataManager; +import com.fr.data.TableDataSource; +import com.fr.design.data.tabledata.Prepare4DataSourceChange; +import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.icombobox.UIComboBoxRenderer; +import com.fr.general.ComparatorUtils; +import com.fr.stable.StringUtils; + +/** + * 包含所有数据集的下拉框 + * + * @author zhou + * @since 2012-4-20上午10:34:30 + */ +public class TableDataComboBox extends UIComboBox implements Prepare4DataSourceChange { + protected java.util.Map resMap; + private java.util.Map dsMap; + private static final long serialVersionUID = 1L; + private boolean refresModel = false; + private String treeName; //树数据集本身的名字 + + public TableDataComboBox(TableDataSource source){ + this(source,StringUtils.EMPTY); + } + public TableDataComboBox(TableDataSource source, String treeName) { + super(); + this.treeName = treeName; + this.setRenderer(new UIComboBoxRenderer() { + private static final long serialVersionUID = 1L; + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + JLabel renderer = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof TableDataWrapper) { + TableDataWrapper tabledatawrappe = (TableDataWrapper)value; + renderer.setIcon(tabledatawrappe.getIcon()); + renderer.setText(tabledatawrappe.getTableDataName()); + renderer.setToolTipText(tabledatawrappe.getTableDataName()); + } else { + renderer.setIcon(null); + renderer.setText(StringUtils.EMPTY); + } + return renderer; + } + }); + refresh(source); + registerDSChangeListener(); + } + + /** + * refresh ComboBox + * @param source + */ + public void refresh(TableDataSource source) { + TableDataWrapper dataWrapper = getSelectedItem(); + refresModel = true; + setResMap(source); + setDsMap(); + DefaultComboBoxModel model = new DefaultComboBoxModel(); + this.setModel(model); + model.addElement(UIConstants.PENDING); + Iterator> entryIt = dsMap.entrySet().iterator(); + while (entryIt.hasNext()) { + TableDataWrapper tableDataWrapper = entryIt.next().getValue(); + if (!ComparatorUtils.equals(tableDataWrapper.getTableDataName(), treeName)) { + model.addElement(tableDataWrapper); + } + } + if (dataWrapper != null) { + if (DesignTableDataManager.isDsNameChanged(dataWrapper.getTableDataName())) { + this.setSelectedTableDataByName(DesignTableDataManager.getChangedDsNameByOldDsName(dataWrapper.getTableDataName())); + } else { + this.getModel().setSelectedItem(dataWrapper); + } + } + refresModel = false; + } + + protected void setResMap(TableDataSource source) { + this.resMap = DesignTableDataManager.getAllEditingDataSet(source); + } + + private void setDsMap() { + dsMap = DesignTableDataManager.getAllDataSetIncludingProcedure(resMap); + } + + + + /** + * 向resMap中添加TableData信息 + * @param name 数据集名字 + * @param templateTableDataWrappe 数据集 + */ + public void putTableDataIntoMap(String name, TemplateTableDataWrapper templateTableDataWrappe) { + if (dsMap.containsKey(name)) { + return; + } + this.addItem(templateTableDataWrappe); + dsMap.put(name, templateTableDataWrappe); + } + + public void setSelectedTableDataByName(String name) { + TableDataWrapper tableDataWrappe = dsMap.get(name) == null? dsMap.get(name + "_P_CURSOR") : dsMap.get(name); + this.getModel().setSelectedItem(tableDataWrappe); + } + + @Override + public TableDataWrapper getSelectedItem() { + if (dataModel.getSelectedItem() instanceof TableDataWrapper) { + return (TableDataWrapper)dataModel.getSelectedItem(); + } + return null; + } + + //august:addElement方法竟然会fireItemStateChanged,蛋疼 + @Override + protected void fireItemStateChanged(ItemEvent e) { + if (!refresModel) { + super.fireItemStateChanged(e); + } + } + + /** + *注册listener,相应数据集改变 + */ + public void registerDSChangeListener() { + DesignTableDataManager.addDsChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + TableDataComboBox.this.refresh(DesignTableDataManager.getEditingTableDataSource()); + } + }); + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/data/datapane/TableDataCreatorProducer.java b/designer-base/src/com/fr/design/data/datapane/TableDataCreatorProducer.java similarity index 100% rename from designer_base/src/com/fr/design/data/datapane/TableDataCreatorProducer.java rename to designer-base/src/com/fr/design/data/datapane/TableDataCreatorProducer.java diff --git a/designer-base/src/com/fr/design/data/datapane/TableDataNameObjectCreator.java b/designer-base/src/com/fr/design/data/datapane/TableDataNameObjectCreator.java new file mode 100644 index 0000000000..ef8dfa3235 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/TableDataNameObjectCreator.java @@ -0,0 +1,178 @@ +package com.fr.design.data.datapane; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.data.impl.DBTableData; +import com.fr.design.actions.tabledata.TableDataAction; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.controlpane.NameObjectCreator; +import com.fr.design.icon.WarningIcon; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; +import java.text.Collator; +import java.util.*; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 13-12-20 + * Time: 上午9:55 + */ +public class TableDataNameObjectCreator extends NameObjectCreator { + private boolean b = false; + private Image menuImage; + private String iconPath; + private boolean isNeedInsertSeparator = false; + private String prefix = ""; + private java.util.List names = new ArrayList(); + + public TableDataNameObjectCreator(TableDataAction action) { + super(action.getDisplayName(), action.getIconPath(), action.getTableDataClass(), action.getUpdateTableDataPaneClass()); + this.iconPath = action.getIconPath(); + menuImage = BaseUtils.readImage(iconPath); + isNeedInsertSeparator = action.isNeedInsertSeparator(); + prefix = action.getPrefix(); + } + + public TableDataNameObjectCreator(TableDataAction action, Class clazz4Init) { + super(action.getDisplayName(), action.getIconPath(), action.getTableDataClass(), clazz4Init, action.getUpdateTableDataPaneClass()); + isNeedInsertSeparator = action.isNeedInsertSeparator(); + prefix = action.getPrefix(); + } + + public TableDataNameObjectCreator(String menuName, String iconPath, Class clazz, Class updatePane) { + super(menuName, iconPath, clazz, updatePane); + if (iconPath != null) { + this.iconPath = iconPath; + menuImage = BaseUtils.readImage(iconPath); + } + } + + public TableDataNameObjectCreator(String menuName, String prefix, String iconPath, Class clazz, Class updatePane) { + super(menuName, iconPath, clazz, updatePane); + if (iconPath != null) { + this.iconPath = iconPath; + menuImage = BaseUtils.readImage(iconPath); + } + this.prefix = prefix; + } + + public TableDataNameObjectCreator(String menuName, String iconPath, Class clazz, Class clazz4Init, Class updatePane) { + super(menuName, iconPath, clazz, clazz4Init, updatePane); + if (iconPath != null) { + this.iconPath = iconPath; + menuImage = BaseUtils.readImage(iconPath); + } + } + + public TableDataNameObjectCreator(String menuName, String prefix, String iconPath, Class clazz, Class clazz4Init, Class updatePane) { + super(menuName, iconPath, clazz, clazz4Init, updatePane); + if (iconPath != null) { + this.iconPath = iconPath; + menuImage = BaseUtils.readImage(iconPath); + } + this.prefix = prefix; + } + + + @Override + protected void doSthChanged4Icon(Object ob) { + if (ob instanceof DBTableData) { + DBTableData db = (DBTableData) ob; + b = StringUtils.isBlank(db.getQuery()); + } + } + + /** + * 取得菜单的图片 + * + * @return 图片 + */ + public Icon menuIcon() { + return createMenuIcon(); + } + + public String getIconPath() { + return iconPath; + } + + private Icon createMenuIcon() { + return b ? new WarningIcon(this.menuImage) : this.menuIcon; + } + + /** + * 创建提示 + * + * @return 提示 + */ + public String createTooltip() { + return b ? Inter.getLocText("Connect_SQL_Cannot_Null") : null; + } + + public String getPrefix() { + return StringUtils.isNotBlank(prefix) ? prefix : menuName(); + } + + /** + * 将names排序 + * + * @return + */ + public List getNames() { + String[] namearray = names.toArray(ArrayUtils.EMPTY_STRING_ARRAY); + Arrays.sort(namearray, Collator.getInstance(java.util.Locale.CHINA)); + return Arrays.asList(namearray); + } + + public Object createObject() { + try { + return clazzOfObject.newInstance(); + } catch (InstantiationException e) { + try { + return clazzOfInitCase.newInstance(); + } catch (InstantiationException | IllegalAccessException e1) { + FRContext.getLogger().error(e.getMessage(), e); + } + } catch (IllegalAccessException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + return null; + } + + /** + * 加入名字 + * + * @param names 名字 + */ + public void addNames(String names) { + this.names.add(names); + } + + /** + * 清除 + */ + public void clear() { + this.names.clear(); + } + + public boolean shouldInsertSeparator() { + return false; + } + + public boolean equals(Object obj) { + return obj instanceof TableDataNameObjectCreator + && ComparatorUtils.equals(menuName, ((TableDataNameObjectCreator) obj).menuName); + } + + @Override + public int hashCode() { + return menuName == null ? 0 : menuName.hashCode(); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/data/datapane/TableDataPaneController.java b/designer-base/src/com/fr/design/data/datapane/TableDataPaneController.java similarity index 100% rename from designer_base/src/com/fr/design/data/datapane/TableDataPaneController.java rename to designer-base/src/com/fr/design/data/datapane/TableDataPaneController.java diff --git a/designer_base/src/com/fr/design/data/datapane/TableDataPaneListPane.java b/designer-base/src/com/fr/design/data/datapane/TableDataPaneListPane.java similarity index 100% rename from designer_base/src/com/fr/design/data/datapane/TableDataPaneListPane.java rename to designer-base/src/com/fr/design/data/datapane/TableDataPaneListPane.java diff --git a/designer-base/src/com/fr/design/data/datapane/TableDataSourceOP.java b/designer-base/src/com/fr/design/data/datapane/TableDataSourceOP.java new file mode 100644 index 0000000000..49991911b0 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/TableDataSourceOP.java @@ -0,0 +1,240 @@ +package com.fr.design.data.datapane; + +import com.fr.base.StoreProcedureParameter; +import com.fr.base.TableData; +import com.fr.data.TableDataSource; +import com.fr.data.impl.storeproc.StoreProcedure; +import com.fr.data.impl.storeproc.StoreProcedureConstants; +import com.fr.design.DesignModelAdapter; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.tabledata.wrapper.StoreProcedureDataWrapper; +import com.fr.design.data.tabledata.wrapper.StoreProcedureNameWrapper; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.gui.itree.refreshabletree.UserObjectOP; +import com.fr.general.Inter; +import com.fr.general.NameObject; + +import java.util.*; +import java.util.Map.Entry; + +/** + * 数据集树的操作 + * + * @editor zhou + * @since 2012-3-28下午9:58:53 + */ +public class TableDataSourceOP implements UserObjectOP { + public static final int TEMPLATE_TABLE_DATA = 0; + public static final int SERVER_TABLE_DATA = 1; + public static final int STORE_PRECEDURE_DATA = 2; + public static int dataMode = -1; + + private DesignModelAdapter tc; + + + public TableDataSourceOP(DesignModelAdapter tc) { + this.tc = tc; + } + + public DesignModelAdapter getDesignModelAdapter() { + return tc; + } + + public void setDesignModelAdapter(DesignModelAdapter tc) { + this.tc = tc; + } + + /** + * 初始化数据集的list + * + * @return + */ + @Override + public List> init() { + if (tc != null) { + return DesignTableDataManager.getEditingDataSet(tc.getBook()); + } + List> empty = new ArrayList>(); + empty.add(Collections.emptyMap());//数据集 + empty.add(Collections.emptyMap());//服务器数据集 + empty.add(Collections.emptyMap());//存储过程 + return empty; + } + + /** + * ButtonEnabled intercept + * @return interceptbuttonEnabled + */ + @Override + public boolean interceptButtonEnabled() { + return tc == null; + } + + /** + * 移除名字是name的TableData + * @param name tabledata name + */ + public void removeAction(String name) { + if (tc != null) { + TableDataSource tds = tc.getBook(); + tds.removeTableData(name); + + tc.fireTargetModified(); + } + } + + protected ExpandMutableTreeNode[] getNodeArrayFromMap(Map map) { + List dataList = new ArrayList(); + Iterator> entryIt = map.entrySet().iterator(); + while (entryIt.hasNext()) { + Entry entry = entryIt.next(); + String name = entry.getKey(); + TableDataWrapper t = entry.getValue(); + + ExpandMutableTreeNode newChildTreeNode = new ExpandMutableTreeNode(new NameObject(name, t)); + dataList.add(newChildTreeNode); + newChildTreeNode.add(new ExpandMutableTreeNode()); + } + return dataList.toArray(new ExpandMutableTreeNode[dataList.size()]); + } + + private ExpandMutableTreeNode initTemplateDataNode(Map templateDataMap) { + ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(Inter.getLocText("DS-TableData"), TEMPLATE_TABLE_DATA), true); + templateNode.addChildTreeNodes(getNodeArrayFromMap(templateDataMap)); + return templateNode; + } + + private ExpandMutableTreeNode initServerDataNode(Map serverDataMap) { + ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(Inter.getLocText("DS-Server_TableData"), SERVER_TABLE_DATA), false); + templateNode.addChildTreeNodes(getNodeArrayFromMap(serverDataMap)); + return templateNode; + } + + private ExpandMutableTreeNode initStoreProcedureNode(Map storeProcedureMap) { + ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(Inter.getLocText("Datasource-Stored_Procedure"), STORE_PRECEDURE_DATA), false); + templateNode.addChildTreeNodes(getNodeArrayFromMap(storeProcedureMap)); + return templateNode; + } + + /** + * 根据不同模式生成子节点 + * + * @return + */ + @Override + public ExpandMutableTreeNode[] load() { + Map templateDataMap = null; + Map serverDataMap = null; + Map storeProcedureMap = null; + + if (this != null) { + templateDataMap = this.init().get(0); + serverDataMap = this.init().get(1); + storeProcedureMap = this.init().get(2); + } else { + templateDataMap = Collections.emptyMap(); + serverDataMap = Collections.emptyMap(); + storeProcedureMap = Collections.emptyMap(); + } + List list = new ArrayList(); //所有的数据集 + List templist = new ArrayList(); //模板数据集 + List serverlist = new ArrayList(); //服务器数据集 + + list.add(initTemplateDataNode(templateDataMap)); + addNodeToList(templateDataMap, templist); + if (!serverDataMap.isEmpty()) { + list.add(initServerDataNode(serverDataMap)); + addNodeToList(serverDataMap, serverlist); + } + if (!storeProcedureMap.isEmpty()) { + list.add(initStoreProcedureNode(storeProcedureMap)); + for (int i = 0; i < getNodeArrayFromMap(storeProcedureMap).length; i++) { + ExpandMutableTreeNode tmpNode = getNodeArrayFromMap(storeProcedureMap)[i]; + if (((NameObject) tmpNode.getUserObject()).getObject() instanceof StoreProcedureNameWrapper) { + TableData tableData = ((StoreProcedureNameWrapper) (((NameObject) tmpNode.getUserObject()).getObject())).getStoreProcedure(); + setStoreProcedureTree(tableData, tmpNode); + serverlist.add(tmpNode); + } + } + } + switch (dataMode) { + case TEMPLATE_TABLE_DATA: + return templist.toArray(new ExpandMutableTreeNode[templist.size()]); + case SERVER_TABLE_DATA: + return serverlist.toArray(new ExpandMutableTreeNode[serverlist.size()]); + default: + return list.toArray(new ExpandMutableTreeNode[list.size()]); + } + } + + private void addNodeToList(Map dataMap, List dataList) { + for (int i = 0; i < getNodeArrayFromMap(dataMap).length; i++) { + ExpandMutableTreeNode tmpNode = getNodeArrayFromMap(dataMap)[i]; + TableData tableData = ((TableDataWrapper) (((NameObject) tmpNode.getUserObject()).getObject())).getTableData(); + if (tableData instanceof StoreProcedure) { + setStoreProcedureTree(tableData, tmpNode); + dataList.add(tmpNode); + } else { + dataList.add(tmpNode); + } + } + } + + protected void setStoreProcedureTree(TableData tableData, ExpandMutableTreeNode tmpNode) { + ArrayList nodeName = new ArrayList(); + StoreProcedure storeProcedure = (StoreProcedure) tableData; + String name = ((NameObject) tmpNode.getUserObject()).getName(); + StoreProcedureParameter[] parameters = StoreProcedure.getSortPara(storeProcedure.getParameters()); + List resultNames = storeProcedure.getResultNames(); + boolean hasChild = false; + tmpNode.remove(0); + TableDataWrapper tdw = new StoreProcedureNameWrapper(name + "_Table1", storeProcedure); + ExpandMutableTreeNode childNode = new ExpandMutableTreeNode(new NameObject("Table", tdw)); + childNode.add(new ExpandMutableTreeNode()); + tmpNode.add(childNode); + for (StoreProcedureParameter parameter : parameters) { + if (parameter.getSchema() != StoreProcedureConstants.IN) { + if (!nodeName.contains(parameter.getName())) { + nodeName.add(parameter.getName()); + hasChild = true; + String parameterName = name + "_" + parameter.getName(); + TableDataWrapper newTwd = new StoreProcedureDataWrapper(storeProcedure, name, parameterName, false); + ExpandMutableTreeNode newChildNode = new ExpandMutableTreeNode(new NameObject(parameter.getName(), newTwd)); + newChildNode.add(new ExpandMutableTreeNode()); + tmpNode.add(newChildNode); + } + } + } + + if (!resultNames.isEmpty()) { + for (int i = 0; i < resultNames.size(); i++) { + if (!nodeName.contains(resultNames.get(i))) { + nodeName.add(resultNames.get(i)); + hasChild = true; + String parameterName = name + "_" + resultNames.get(i); + TableDataWrapper newTwd = new StoreProcedureDataWrapper(storeProcedure, name, parameterName, false); + ExpandMutableTreeNode newChildNode = new ExpandMutableTreeNode(new NameObject(resultNames.get(i), newTwd)); + newChildNode.add(new ExpandMutableTreeNode()); + tmpNode.add(newChildNode); + } + + } + + } + + if (hasChild) { + tmpNode.remove(0); + } + } + + + public void setDataMode(int i) { + this.dataMode = i; + } + + public int getDataMode() { + return dataMode; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/TableDataTree.java b/designer-base/src/com/fr/design/data/datapane/TableDataTree.java new file mode 100644 index 0000000000..8f49b6e504 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/TableDataTree.java @@ -0,0 +1,250 @@ +package com.fr.design.data.datapane; + +import com.fr.base.BaseUtils; +import com.fr.general.NameObject; +import com.fr.design.constants.UIConstants; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.gui.itree.refreshabletree.UserObjectRefreshJTree; +import com.fr.design.icon.IconPathConstants; +import com.fr.general.ComparatorUtils; + +import javax.swing.*; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; +import java.awt.*; + +/** + * TableData Tree + */ +public class TableDataTree extends UserObjectRefreshJTree { + private static final long serialVersionUID = 1L; + + /** + * Constructor. + */ + public TableDataTree() { + super(); + this.setCellRenderer(tableDataTreeCellRenderer); + this.setEditable(false); + } + // CellRenderer + private DefaultTreeCellRenderer tableDataTreeCellRenderer = new DefaultTreeCellRenderer() { + private static final long serialVersionUID = 1L; + + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + ExpandMutableTreeNode treeNode = (ExpandMutableTreeNode) value; + Object userObj = treeNode.getUserObject(); + if (userObj instanceof String) { + // p:这个是column field. + this.setIcon(BaseUtils.readIcon("com/fr/design/images/data/field.png")); + this.setText((String) userObj); + } else if (userObj instanceof NameObject) { + NameObject nameObject = (NameObject) userObj; + this.setText(nameObject.getName()); + if (nameObject.getObject() instanceof TableDataWrapper) { + TableDataWrapper tableDataWrappe = (TableDataWrapper) nameObject.getObject(); + this.setIcon(tableDataWrappe.getIcon()); + } else if (nameObject.getObject() instanceof Integer) { + int num = (Integer) nameObject.getObject(); + if (num == TableDataSourceOP.SERVER_TABLE_DATA) { + this.setIcon(BaseUtils.readIcon(IconPathConstants.STD_SHOW_ICON_PATH)); + } else if (num == TableDataSourceOP.STORE_PRECEDURE_DATA) { + this.setIcon(BaseUtils.readIcon(IconPathConstants.SP_SHOW_ICON_PATH)); + } else { + this.setIcon(BaseUtils.readIcon(IconPathConstants.DS_QUERY_ICON_PATH)); + } + } else { + this.setIcon(BaseUtils.readIcon("/com/fr/design/images/data/store_procedure.png")); + } + } else if (userObj == PENDING) { + this.setIcon(null); + this.setText(PENDING.toString()); + } + // 这里新建一个Label作为render是因为JTree在动态刷新的时候,节点上render画布的的宽度不会变,会使得一部分比较长的数据显示为"..." + UILabel label = new UILabel(); + label.setText(getText()); + label.setIcon(getIcon()); + Dimension dim = label.getPreferredSize(); + dim.height += 2; + this.setSize(dim); + this.setPreferredSize(dim); + this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); + this.setTextSelectionColor(Color.WHITE); + this.setBackgroundSelectionColor(UIConstants.FLESH_BLUE); + return this; + } + }; + + public DefaultTreeCellRenderer getTableDataTreeCellRenderer() { + return tableDataTreeCellRenderer; + } + + public void setTableDataTreeCellRenderer(DefaultTreeCellRenderer tableDataTreeCellRenderer) { + this.tableDataTreeCellRenderer = tableDataTreeCellRenderer; + } + + protected void refreshTreeNode(ExpandMutableTreeNode eTreeNode, String childName) { + if (interceptRefresh(eTreeNode)) { + return; + } + boolean refreshall = childName.isEmpty(); + ExpandMutableTreeNode[] new_nodes = loadChildTreeNodes(eTreeNode); + + java.util.List childTreeNodeList = new java.util.ArrayList(); + for (int i = 0, len = eTreeNode.getChildCount(); i < len; i++) { + if (eTreeNode.getChildAt(i) instanceof ExpandMutableTreeNode) { + childTreeNodeList.add((ExpandMutableTreeNode) eTreeNode.getChildAt(i)); + } else { + childTreeNodeList.add((DefaultMutableTreeNode) eTreeNode.getChildAt(i)); + } + } + + eTreeNode.removeAllChildren(); + + for (int ci = 0; ci < new_nodes.length; ci++) { + Object cUserObject = new_nodes[ci].getUserObject(); + ExpandMutableTreeNode cTreeNode = null; + for (int ni = 0, nlen = childTreeNodeList.size(); ni < nlen; ni++) { + cTreeNode = (ExpandMutableTreeNode) childTreeNodeList.get(ni); + if (ComparatorUtils.equals(cTreeNode.getUserObject(), cUserObject)) { + if (!refreshall && !ComparatorUtils.equals(childName, ((NameObject) cUserObject).getName())) { + new_nodes[ci] = cTreeNode; + break; + } + new_nodes[ci].setExpanded(cTreeNode.isExpanded()); + if (cTreeNode.getFirstChild() instanceof ExpandMutableTreeNode && cTreeNode.isExpanded()) { + checkChildNodes(cTreeNode, new_nodes[ci]); + } + break; + } + } + + eTreeNode.add(new_nodes[ci]); + } + } + + + protected void checkChildNodes(ExpandMutableTreeNode oldNode, ExpandMutableTreeNode newNode) { + for (int i = 0; i < oldNode.getChildCount(); i++) { + ExpandMutableTreeNode oldChild = (ExpandMutableTreeNode) oldNode.getChildAt(i); + for (int j = 0; j < newNode.getChildCount(); j++) { + ExpandMutableTreeNode newChild = (ExpandMutableTreeNode) newNode.getChildAt(j); + newChild.removeAllChildren(); + ExpandMutableTreeNode[] nodes = TableDataTree.this.loadChildTreeNodes(newChild); + for (int k = 0; k < nodes.length; k++) { + newChild.add(nodes[k]); + } + if (newChild.getChildCount() > 1 && ((ExpandMutableTreeNode) newChild.getFirstChild()).getUserObject() == PENDING) { + newChild.remove(0); + } + if (ComparatorUtils.equals(oldChild.getUserObject(), newChild.getUserObject())) { + newChild.setExpanded(oldChild.isExpanded()); + } + } + } + } + + /* + * p:获得选中的NameObject = name + tabledata. + */ + public NameObject getSelectedNameObject() { + TreePath selectedTreePath = this.getSelectionPath(); + if (selectedTreePath == null) { + return null; + } + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + Object selectedUserObject = selectedTreeNode.getUserObject(); + ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); + Object parentUserObject = parentTreeNode.getUserObject(); + if (parentUserObject instanceof NameObject && ((NameObject) parentUserObject).getObject() instanceof Integer) { + if (selectedUserObject instanceof NameObject) { + return (NameObject) selectedUserObject; + } + } else { + parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); + parentUserObject = parentTreeNode.getUserObject(); + + if (parentUserObject != null) { + if (!(parentUserObject instanceof NameObject)) { + return (NameObject) selectedUserObject; + } else { + return (NameObject) parentUserObject; + } + } + } + return null; + + } + + public TableDataWrapper[] getSelectedDatas() { + TreePath[] selectedTreePaths = this.getSelectionPaths(); + if (selectedTreePaths == null || selectedTreePaths.length == 0) { + return null; + } + TableDataWrapper[] nameobjs = new TableDataWrapper[selectedTreePaths.length]; + for (int i = 0; i < selectedTreePaths.length; i++) { + TreePath selectedTreePath = selectedTreePaths[i]; + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + Object selectedUserObject = selectedTreeNode.getUserObject(); + ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); + Object parentUserObject = parentTreeNode.getUserObject(); + if (parentUserObject instanceof NameObject && ((NameObject) parentUserObject).getObject() instanceof Integer) { + if (selectedUserObject instanceof NameObject) { + Object obj = ((NameObject) selectedUserObject).getObject(); + if (obj instanceof TableDataWrapper) { + nameobjs[i] = (TableDataWrapper) obj; + } + } + } else { + return new TableDataWrapper[0]; + } + } + + return nameobjs; + } + + public NameObject getRealSelectedNameObject() { + TreePath selectedTreePath = this.getSelectionPath(); + if (selectedTreePath == null) { + return null; + } + + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + Object selectedUserObject = selectedTreeNode.getUserObject(); + if (selectedUserObject instanceof NameObject) { + return (NameObject) selectedUserObject; + } + + selectedTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); + selectedUserObject = selectedTreeNode.getUserObject(); + if (selectedUserObject instanceof NameObject) { + return (NameObject) selectedUserObject; + } + return null; + } + + /** + * p:添加一个NameObject节点. + */ + public void addNameObject(NameObject no) { + if (no == null) { + return; + } + DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel(); + + // 新建一个放着NameObject的newChildTreeNode,加到Root下面 + ExpandMutableTreeNode root = (ExpandMutableTreeNode) treeModel.getRoot(); + + ExpandMutableTreeNode newChildTreeNode = new ExpandMutableTreeNode(no); + root.add(newChildTreeNode); + newChildTreeNode.add(new ExpandMutableTreeNode()); + + treeModel.reload(root); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/TableDataTreeDragSource.java b/designer-base/src/com/fr/design/data/datapane/TableDataTreeDragSource.java new file mode 100644 index 0000000000..7cedafc8ed --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/TableDataTreeDragSource.java @@ -0,0 +1,102 @@ +package com.fr.design.data.datapane; + +import java.awt.Component; +import java.awt.dnd.DragGestureEvent; +import java.awt.dnd.DragGestureListener; +import java.awt.dnd.DragSource; +import java.awt.dnd.DragSourceAdapter; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JTree; +import javax.swing.tree.TreePath; + +import com.fr.general.NameObject; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.mainframe.dnd.ArrayTransferable; + +/** + * 从数据源树开始drag. + */ +public class TableDataTreeDragSource extends DragSourceAdapter implements DragGestureListener { + private DragSource source; + private String[][] doubleArray; + public TableDataTreeDragSource(JTree tree, int actions) { + source = new DragSource(); + source.createDefaultDragGestureRecognizer(tree, actions, this); + } + + /* + * Drag Gesture Handler + */ + public void dragGestureRecognized(DragGestureEvent dge) { + Component comp = dge.getComponent(); + if (comp instanceof TableDataTree) { + + List stringList = new ArrayList(); + TableDataTree tree = (TableDataTree) comp; + + TreePath[] paths = tree.getSelectionPaths(); + if (paths == null) { + return; + } + doubleArray = null; + setnameArray(paths, stringList); + + source.startDrag(dge, DragSource.DefaultLinkDrop, new ArrayTransferable(doubleArray), this); + } + } + + private void setnameArray(TreePath[] paths, List stringList) { + for (int i = 0; i < paths.length; i++) { + if ((paths[i] == null) || (paths[i].getPathCount() <= 1)) { + return;// We can't move the root node or an empty selection + } + ExpandMutableTreeNode segmentMutableTreeNode = (ExpandMutableTreeNode) paths[i].getLastPathComponent(); + Object userObj = segmentMutableTreeNode.getUserObject(); + List tableAddress = new ArrayList(); + String displayName; + StringBuffer dsNameBuf = new StringBuffer(); + if (userObj instanceof NameObject) { + continue; + } else { + if (!(userObj instanceof String)) { + continue; + } + displayName = (String) userObj; + // james 读取表名 + while (segmentMutableTreeNode.getParent().getParent() != null) { + segmentMutableTreeNode = (ExpandMutableTreeNode) segmentMutableTreeNode.getParent(); + ExpandMutableTreeNode datasheetExpandMutableTreeNode = segmentMutableTreeNode; + Object parentUserObj = datasheetExpandMutableTreeNode.getUserObject(); + if (parentUserObj instanceof NameObject && !(((NameObject) parentUserObj).getObject() instanceof Integer)) { + NameObject nameObject = (NameObject) parentUserObj; + tableAddress.add(nameObject.getName()); + } + } + } + for (int j = tableAddress.size() - 1; j > -1; j--) { + dsNameBuf.append(tableAddress.get(j)); + if (j != 0) { + dsNameBuf.append('_'); + } + } + String dsName; + if (dsNameBuf.toString() != null) { + dsName = dsNameBuf.toString(); + } else { + return; + } + String[] attributes = {dsName, displayName}; + stringList.add(attributes); + Object[] bo = stringList.toArray(); + doubleArray = new String[bo.length][]; + for (int io = 0; io < bo.length; io++) { + if (bo[io] instanceof String[]) { + doubleArray[io] = (String[]) bo[io]; + } + } + } + } + +} \ 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 similarity index 100% rename from designer_base/src/com/fr/design/data/datapane/TableDataTreePane.java rename to designer-base/src/com/fr/design/data/datapane/TableDataTreePane.java diff --git a/designer-base/src/com/fr/design/data/datapane/TreeTableDataComboBox.java b/designer-base/src/com/fr/design/data/datapane/TreeTableDataComboBox.java new file mode 100644 index 0000000000..1e0d2c77e4 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/TreeTableDataComboBox.java @@ -0,0 +1,86 @@ +package com.fr.design.data.datapane; + +import com.fr.data.TableDataSource; +import com.fr.data.impl.RecursionTableData; +import com.fr.design.data.tabledata.wrapper.ServerTableDataWrapper; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.icombobox.UIComboBoxRenderer; +import com.fr.file.TableDataConfig; + +import javax.swing.*; +import java.awt.*; + +public class TreeTableDataComboBox extends UIComboBox { + private static final long serialVersionUID = 1L; + private java.util.Map res_map = new java.util.LinkedHashMap(); + private TableDataSource source; + + public TreeTableDataComboBox(TableDataSource source) { + this.source = source; + this.setRenderer(new UIComboBoxRenderer() { + private static final long serialVersionUID = 1L; + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof TableDataWrapper) { + TableDataWrapper tabledatawrappe = (TableDataWrapper) value; + this.setIcon(tabledatawrappe.getIcon()); + this.setText(tabledatawrappe.getTableDataName()); + } + return this; + } + }); + refresh(); + } + + /** + * 刷新 + */ + public void refresh() { + java.util.Iterator nameIt; + DefaultComboBoxModel model = new DefaultComboBoxModel(); + this.setModel(model); + if (source != null) { + // 报表数据集 + nameIt = source.getTableDataNameIterator(); + while (nameIt.hasNext()) { + String name = nameIt.next(); + if(source.getTableData(name) instanceof RecursionTableData) { + TemplateTableDataWrapper templateTableDataWrappe = new TemplateTableDataWrapper(source.getTableData(name), name); + model.addElement(templateTableDataWrappe); + res_map.put(name, templateTableDataWrappe); + } + } + } + + // 全局数据集 + TableDataConfig mgr = TableDataConfig.getInstance(); + nameIt = mgr.getTableDatas().keySet().iterator(); + while (nameIt.hasNext()) { + String name = nameIt.next(); + if(mgr.getTableData(name) instanceof RecursionTableData) { + ServerTableDataWrapper serverTableDataWrappe = new ServerTableDataWrapper(mgr.getTableData(name), name); + model.addElement(serverTableDataWrappe); + res_map.put(name, serverTableDataWrappe); + } + } + } + + public void setSelectedTableDataByName(String name) { + TableDataWrapper tableDataWrappe = res_map.get(name); + this.getModel().setSelectedItem(tableDataWrappe); + } + + @Override + public TableDataWrapper getSelectedItem() { + return (TableDataWrapper) dataModel.getSelectedItem(); + } + + public RecursionTableData getSelcetedTableData() { + String name = ((TableDataWrapper) dataModel.getSelectedItem()).getTableDataName(); + return (RecursionTableData)source.getTableData(name); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/TreeTableDataDictPane.java b/designer-base/src/com/fr/design/data/datapane/TreeTableDataDictPane.java new file mode 100644 index 0000000000..3bbad70393 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/TreeTableDataDictPane.java @@ -0,0 +1,309 @@ +package com.fr.design.data.datapane; + +import com.fr.data.impl.RecursionTableData; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.datapane.preview.PreviewLabel; +import com.fr.design.data.datapane.preview.PreviewLabel.Previewable; +import com.fr.design.data.datapane.preview.PreviewTablePane; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.dialog.BasicPane; +import com.fr.design.editor.ValueEditorPane; +import com.fr.design.editor.ValueEditorPaneFactory; +import com.fr.design.editor.editor.ColumnIndexEditor; +import com.fr.design.editor.editor.ColumnNameEditor; +import com.fr.design.editor.editor.Editor; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UIRadioButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +import com.fr.script.Calculator; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.List; + +public class TreeTableDataDictPane extends BasicPane implements Previewable { + + private UILabel selectTableDataLabel; + protected TableDataComboBox tableDataNameComboBox; + private UIRadioButton parentMarkRadio; + private UIRadioButton lengthMarkRadio; + private ButtonGroup markButtonGroup; + + private UILabel originFieldDependsOnParentLabel; + private UILabel parentFieldLabel; + private UILabel treeDataFieldLabel1; + private UILabel originFieldDependsOnLengthLabel; + private UILabel treeDataFieldLabel2; + + private ValueEditorPane originFieldDependsOnParentPane; + private ValueEditorPane parentFieldPane; + private ValueEditorPane originFieldDependsOnLengthPane; + + public TreeTableDataDictPane() { + this(StringUtils.EMPTY); + } + + public TreeTableDataDictPane(String treeName) { + this.setLayout(new BorderLayout(5, 30)); + this.setBorder(BorderFactory.createEmptyBorder(20, 20, 0, 0)); + selectTableDataLabel = new UILabel(Inter.getLocText(new String[]{"Please_Select", "Single", "DS-TableData"}) + " :"); + setTableDataNameComboBox(treeName); + tableDataNameComboBox.setPreferredSize(new Dimension(180, 20)); + JPanel tableFlowPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); + tableFlowPane.add(selectTableDataLabel); + tableFlowPane.add(tableDataNameComboBox); + tableDataNameComboBox.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + tdChange(); + } + }); + tableFlowPane.add(new PreviewLabel(this)); + this.add(tableFlowPane, BorderLayout.NORTH); + JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.add(centerPane, BorderLayout.CENTER); + parentMarkRadio = new UIRadioButton(Inter.getLocText("FR-Designer_Build_Tree_Accord_Parent_Marked_Filed"), true); + lengthMarkRadio = new UIRadioButton(Inter.getLocText("FR-Designer_Build_Tree_Accord_Marked_Filed_Length")); + parentMarkRadio.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (isBuildByParentFiled()) { + makeParentEnable(); + tdChange(); + } + } + }); + lengthMarkRadio.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (!isBuildByParentFiled()) { + makeLengthEnable(); + tdChange(); + } + } + }); + markButtonGroup = new ButtonGroup(); + markButtonGroup.add(parentMarkRadio); + markButtonGroup.add(lengthMarkRadio); + + originFieldDependsOnParentLabel = new UILabel(Inter.getLocText("FR-Designer_Original_Marked_Filed") + " :", SwingConstants.RIGHT); + parentFieldLabel = new UILabel(" " + Inter.getLocText("FR-Designer_Parent_Marked_Field") + " :", SwingConstants.RIGHT); + treeDataFieldLabel1 = new UILabel(" " + Inter.getLocText("FR-Designer_Tree_Data_Field") + " :", SwingConstants.RIGHT); + originFieldDependsOnLengthLabel = new UILabel(Inter.getLocText("FR-Designer_Original_Marked_Filed") + " :", SwingConstants.RIGHT); + treeDataFieldLabel2 = new UILabel(" " + Inter.getLocText("FR-Designer_Tree_Data_Field") + " :", SwingConstants.RIGHT); + +// originFieldDependsOnParentPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[] {new OldColumnIndexEditor(Inter.getLocText("Columns"))}); +// parentFieldPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[] {new OldColumnIndexEditor(Inter.getLocText("Columns"))}); +// originFieldDependsOnLengthPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[] {new OldColumnIndexEditor(Inter.getLocText("Columns"))}); + originFieldDependsOnParentPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); + parentFieldPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); + originFieldDependsOnLengthPane = ValueEditorPaneFactory.createValueEditorPane(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}); + + makeParentEnable(); + + JPanel p1 = createCenterFlowZeroGapBorderPane(originFieldDependsOnParentLabel, originFieldDependsOnParentPane); + JPanel p2 = createCenterFlowZeroGapBorderPane(parentFieldLabel, parentFieldPane); + JPanel border1 = new JPanel(); + border1.setLayout(new BorderLayout(0, 10)); + border1.add(p1, BorderLayout.NORTH); + border1.add(p2, BorderLayout.CENTER); + JPanel p4 = createCenterFlowZeroGapBorderPane(originFieldDependsOnLengthLabel, originFieldDependsOnLengthPane); + JPanel border2 = new JPanel(); + border2.setLayout(new BorderLayout(0, 20)); + border2.add(p4, BorderLayout.NORTH); + + JPanel xx = FRGUIPaneFactory.createBorderLayout_S_Pane(); + xx.add(parentMarkRadio, BorderLayout.NORTH); + xx.add(border1, BorderLayout.CENTER); + JPanel xxx = FRGUIPaneFactory.createBorderLayout_S_Pane(); + xxx.add(lengthMarkRadio, BorderLayout.NORTH); + xxx.add(border2, BorderLayout.CENTER); + JPanel buildTreePanel = new JPanel(new BorderLayout(5, 30)); + buildTreePanel.add(xx, BorderLayout.NORTH); + buildTreePanel.add(xxx, BorderLayout.CENTER); + centerPane.add(buildTreePanel, BorderLayout.NORTH); + JPanel previewPanel = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + UIButton treeDataPreviewButton = new UIButton(Inter.getLocText("FR-Designer_Preview")); + previewPanel.add(treeDataPreviewButton); + treeDataPreviewButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + TableDataWrapper tableDataWrappe = tableDataNameComboBox.getSelectedItem(); + if (tableDataWrappe == null) { + return; + } + RecursionTableData rtd = new RecursionTableData(); + rtd.setOriginalTableDataName(tableDataWrappe.getTableDataName()); + if (isBuildByParentFiled()) { + Object o = parentFieldPane.update(); + rtd.setParentmarkFields((Integer) o - 1 + ""); + rtd.setParentmarkFieldName("" + o); + Object o2 = originFieldDependsOnParentPane.update(); + rtd.setMarkFields((Integer) o2 - 1 + ""); + rtd.setMarkFieldName("" + o2); + } else { + Object o = originFieldDependsOnLengthPane.update(); + if (o == null) { + rtd.setMarkFields("-1"); + } else { + rtd.setMarkFields((Integer) o - 1 + ""); + rtd.setMarkFieldName("" + o); + } + } + rtd.setTableDataSource(DesignTableDataManager.getEditingTableDataSource()); + rtd.createDataModel(Calculator.createCalculator()); + PreviewTablePane.previewTableData(rtd); + } + }); + centerPane.add(previewPanel, BorderLayout.CENTER); + } + + protected void setTableDataNameComboBox(String treeName) { + tableDataNameComboBox = new TableDataComboBox(DesignTableDataManager.getEditingTableDataSource(), treeName); + + } + + private void tdChange() { + TableDataWrapper tableDataWrappe = this.tableDataNameComboBox.getSelectedItem(); + if (tableDataWrappe == null) { + return; + } + ValueEditorPane[] valueEditorPanes; + if (isBuildByParentFiled()) { + valueEditorPanes = new ValueEditorPane[]{originFieldDependsOnParentPane, parentFieldPane}; + } else { + valueEditorPanes = new ValueEditorPane[]{originFieldDependsOnLengthPane}; + } + try { + List namelist = tableDataWrappe.calculateColumnNameList(); + int len = namelist.size(); + String[] columnNames = new String[len]; + namelist.toArray(columnNames); + for (int i = 0; i < valueEditorPanes.length; i++) { + valueEditorPanes[i].setEditors(new Editor[]{new ColumnNameEditor(columnNames), new ColumnIndexEditor(len)}, columnNames[0]); + } + } catch (Exception e) { + for (int i = 0; i < valueEditorPanes.length; i++) { + valueEditorPanes[i].setEditors(new Editor[]{new ColumnNameEditor(), new ColumnIndexEditor()}, 1); + } + } finally { + valueEditorPanes = null; + } + } + + @Override + protected String title4PopupWindow() { + return "TreeTableDataDictionay"; + } + + public RecursionTableData update() { + RecursionTableData td = new RecursionTableData(); + if (tableDataNameComboBox.getSelectedItem() == null) { + td.setOriginalTableDataName(null); + } else { + td.setOriginalTableDataName(tableDataNameComboBox.getSelectedItem().getTableDataName()); + } + if (isBuildByParentFiled()) { + Object o = parentFieldPane.update(StringUtils.EMPTY); + if (o instanceof Object[]) { + Object[] temp = (Object[]) o; + td.setParentmarkFields((Integer) temp[0] - 1 + ""); + td.setParentmarkFieldName((String) temp[1]); + } + Object o2 = originFieldDependsOnParentPane.update(StringUtils.EMPTY); + if (o2 instanceof Object[]) { + Object[] temp = (Object[]) o2; + td.setMarkFields((Integer) temp[0] - 1 + ""); + td.setMarkFieldName((String) temp[1]); + } + } else { + Object o = originFieldDependsOnLengthPane.update(StringUtils.EMPTY); + if (o == null || !(o instanceof Object[])) { + td.setMarkFields("-1"); + } else { + Object[] temp = (Object[]) o; + td.setMarkFields((Integer) temp[0] - 1 + ""); + td.setMarkFieldName((String) temp[1]); + } + } + td.setTableDataSource(DesignTableDataManager.getEditingTableDataSource()); + return td; + } + + public void populate(RecursionTableData rtb) { + if (StringUtils.isNotEmpty(rtb.getParentmarkFields())) { + makeParentEnable(); + parentMarkRadio.setSelected(true); + lengthMarkRadio.setSelected(false); + tableDataNameComboBox.setSelectedTableDataByName(rtb.getOriginalTableDataName()); + if (StringUtils.isNotEmpty(rtb.getMarkFieldName())) { + originFieldDependsOnParentPane.populate(rtb.getMarkFieldName()); + } else { + originFieldDependsOnParentPane.populate(rtb.getMarkFieldIndex() + 1); + } + if (StringUtils.isNotEmpty(rtb.getParentmarkFieldName())) { + parentFieldPane.populate(rtb.getParentmarkFieldName()); + } else { + parentFieldPane.populate(rtb.getParentmarkFieldIndex() + 1); + } + } else { + makeLengthEnable(); + lengthMarkRadio.setSelected(true); + parentMarkRadio.setSelected(false); + tableDataNameComboBox.setSelectedTableDataByName(rtb.getOriginalTableDataName()); + if (StringUtils.isNotEmpty(rtb.getMarkFieldName())) { + originFieldDependsOnLengthPane.populate(rtb.getMarkFieldName()); + } else { + originFieldDependsOnLengthPane.populate(rtb.getMarkFieldIndex() + 1); + } + } + } + + /** + * + */ + public void preview() { + TableDataWrapper tableDataWrappe = tableDataNameComboBox.getSelectedItem(); + if (tableDataWrappe == null) { + return; + } + tableDataWrappe.previewData(); + } + + private JPanel createCenterFlowZeroGapBorderPane(Component p1, Component p2) { + JPanel p = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + p.add(p1); + p.add(p2); + return p; + } + + private boolean isBuildByParentFiled() { + return parentMarkRadio.isSelected(); + } + + private void makeParentEnable() { + originFieldDependsOnParentPane.setEnabled(true); + parentFieldPane.setEnabled(true); + originFieldDependsOnParentLabel.setEnabled(true); + parentFieldLabel.setEnabled(true); + treeDataFieldLabel1.setEnabled(true); + originFieldDependsOnLengthLabel.setEnabled(false); + treeDataFieldLabel2.setEnabled(false); + originFieldDependsOnLengthPane.setEnabled(false); + } + + private void makeLengthEnable() { + originFieldDependsOnParentPane.setEnabled(false); + parentFieldPane.setEnabled(false); + originFieldDependsOnParentLabel.setEnabled(false); + parentFieldLabel.setEnabled(false); + treeDataFieldLabel1.setEnabled(false); + originFieldDependsOnLengthLabel.setEnabled(true); + treeDataFieldLabel2.setEnabled(true); + originFieldDependsOnLengthPane.setEnabled(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/VerticalChoosePane.java b/designer-base/src/com/fr/design/data/datapane/VerticalChoosePane.java new file mode 100644 index 0000000000..5d551c9b24 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/VerticalChoosePane.java @@ -0,0 +1,69 @@ +package com.fr.design.data.datapane; + +import com.fr.design.constants.LayoutConstants; +import com.fr.design.data.datapane.preview.PreviewLabel; +import com.fr.design.data.datapane.preview.PreviewLabel.Previewable; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerBean; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; + +public class VerticalChoosePane extends ChoosePane implements DesignerBean { + private static final int RIGHTBORDER = 5; + + public VerticalChoosePane(Previewable previewable) { + this(previewable, -1); + } + + public VerticalChoosePane(Previewable previewable, int labelSize) { + super(previewable, labelSize); + DesignerContext.setDesignerBean("databasename", this); + } + + @Override + protected void initComponentsLayout(PreviewLabel previewLabel, int labelSize) { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double[] columnSize = {p, f}; + double[] rowSize = {p, p, p}; + int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}}; + + JPanel rs = new JPanel(new BorderLayout(0, 0)); + rs.add(tableNameComboBox, BorderLayout.CENTER); + rs.add(GUICoreUtils.createFlowPane(new Component[]{new RefreshLabel(this), previewLabel}, FlowLayout.LEFT, LayoutConstants.HGAP_LARGE), BorderLayout.EAST); + rs.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, -RIGHTBORDER)); + UILabel l1 = new UILabel(Inter.getLocText("FR-Designer_Database"), UILabel.LEFT); + UILabel l2 = new UILabel(Inter.getLocText("FR-Designer_Model"), UILabel.LEFT); + UILabel l3 = new UILabel(Inter.getLocText(new String[]{"FR-Designer_Database", "FR-Designer_Table"}), UILabel.LEFT); + + if (labelSize > 0) { + Dimension pSize = new Dimension(labelSize, 20); + l1.setPreferredSize(pSize); + l2.setPreferredSize(pSize); + l3.setPreferredSize(pSize); + } + + Component[][] components = new Component[][]{ + new Component[]{l1, dsNameComboBox}, + new Component[]{l2, schemaBox}, + new Component[]{l3, rs} + }; + + JPanel content = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.VGAP_HUGER, LayoutConstants.VGAP_LARGE); + this.setLayout(new BorderLayout()); + this.add(content, BorderLayout.CENTER); + } + + + @Override + public void refreshBeanElement() { + initDsNameComboBox(); + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java b/designer-base/src/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java similarity index 100% rename from designer_base/src/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java rename to designer-base/src/com/fr/design/data/datapane/connect/ConnectionComboBoxPanel.java diff --git a/designer_base/src/com/fr/design/data/datapane/connect/ConnectionListPane.java b/designer-base/src/com/fr/design/data/datapane/connect/ConnectionListPane.java similarity index 100% rename from designer_base/src/com/fr/design/data/datapane/connect/ConnectionListPane.java rename to designer-base/src/com/fr/design/data/datapane/connect/ConnectionListPane.java diff --git a/designer_base/src/com/fr/design/data/datapane/connect/ConnectionManagerPane.java b/designer-base/src/com/fr/design/data/datapane/connect/ConnectionManagerPane.java similarity index 100% rename from designer_base/src/com/fr/design/data/datapane/connect/ConnectionManagerPane.java rename to designer-base/src/com/fr/design/data/datapane/connect/ConnectionManagerPane.java diff --git a/designer_base/src/com/fr/design/data/datapane/connect/ConnectionShowPane.java b/designer-base/src/com/fr/design/data/datapane/connect/ConnectionShowPane.java similarity index 100% rename from designer_base/src/com/fr/design/data/datapane/connect/ConnectionShowPane.java rename to designer-base/src/com/fr/design/data/datapane/connect/ConnectionShowPane.java diff --git a/designer-base/src/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java b/designer-base/src/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java new file mode 100644 index 0000000000..9c86b52bb4 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/connect/ConnectionTableProcedurePane.java @@ -0,0 +1,217 @@ +package com.fr.design.data.datapane.connect; + +import com.fr.base.BaseUtils; +import com.fr.data.impl.AbstractDatabaseConnection; +import com.fr.data.impl.Connection; +import com.fr.design.constants.UIConstants; +import com.fr.data.core.db.TableProcedure; +import com.fr.design.border.UIRoundedBorder; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.gui.ilist.TableViewList; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.dialog.BasicPane; +import com.fr.general.GeneralContext; +import com.fr.general.Inter; +import com.fr.stable.ArrayUtils; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.*; +import java.awt.event.*; +import java.util.List; + +/** + * 数据集编辑面板左边的部分 + * + * @editor zhou + * @since 2012-3-28下午10:14:59 + */ +public class ConnectionTableProcedurePane extends BasicPane { + private static int WIDTH = 155; + private ConnectionComboBoxPanel connectionComboBox; + private UICheckBox tableCheckBox; + private UICheckBox viewCheckBox; + private UITextField searchField; + private TableViewList tableViewList; + private java.util.List listeners = new java.util.ArrayList(); + + public ConnectionTableProcedurePane() { + this.setLayout(new BorderLayout(4, 4)); + connectionComboBox = new ConnectionComboBoxPanel(com.fr.data.impl.Connection.class) { + + @Override + protected void filterConnection(Connection connection, String conName, List nameList) { + filter(connection, conName, nameList); + } + + protected void refreshItems() { + super.refreshItems(); + if (tableViewList != null) { + search(); + } + } + }; + tableViewList = new TableViewList(); + ToolTipManager.sharedInstance().registerComponent(tableViewList); + connectionComboBox.addComboBoxActionListener(filter); + tableViewList.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent evt) { + if (evt.getClickCount() >= 2) { + Object obj = tableViewList.getSelectedValue(); + TableProcedure tableProcedure = null; + if (obj instanceof TableProcedure) { + tableProcedure = (TableProcedure) obj; + } else { + return; + } + for (int i = 0; i < ConnectionTableProcedurePane.this.listeners.size(); i++) { + ConnectionTableProcedurePane.this.listeners.get(i).actionPerformed(tableProcedure); + } + } + } + }); + JPanel filterPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + JPanel checkBoxgroupPane = createCheckBoxgroupPane(); + if (checkBoxgroupPane != null) { + filterPane.add(createCheckBoxgroupPane(), BorderLayout.NORTH); + } + JPanel searchPane = new JPanel(new BorderLayout(10, 0)); + searchField = new UITextField(); + searchPane.add(searchField, BorderLayout.CENTER); + searchField.getDocument().addDocumentListener(searchListener); + filterPane.add(searchPane, BorderLayout.CENTER); + UIScrollPane tableViewListPane = new UIScrollPane(tableViewList); + tableViewListPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); + this.add(connectionComboBox, BorderLayout.NORTH); + this.add(tableViewListPane, BorderLayout.CENTER); + this.add(filterPane, BorderLayout.SOUTH); + this.setPreferredSize(new Dimension(WIDTH, getPreferredSize().height)); + } + + protected void filter(Connection connection, String conName, List nameList) { + connection.addConnection(nameList, conName, new Class[]{AbstractDatabaseConnection.class}); + } + + protected JPanel createCheckBoxgroupPane() { + JPanel checkBoxgroupPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); + JPanel first = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + tableCheckBox = new UICheckBox(); + tableCheckBox.setSelected(true); + tableCheckBox.addActionListener(filter); + first.add(tableCheckBox); + + JPanel second = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + viewCheckBox = new UICheckBox(); + viewCheckBox.setSelected(true); + viewCheckBox.addActionListener(filter); + second.add(viewCheckBox); + + // 根据环境是否为中文设置不同的显示 + if (GeneralContext.isChineseEnv()) { + first.add(new UILabel(Inter.getLocText("FR-Designer_SQL-Table"), + BaseUtils.readIcon("/com/fr/design/images/data/tables.png"), UILabel.LEADING)); + second.add(new UILabel(Inter.getLocText("FR-Designer_SQL-View"), + BaseUtils.readIcon("/com/fr/design/images/data/views.png"), UILabel.LEADING)); + } else { + UILabel ui1 = new UILabel(BaseUtils.readIcon("/com/fr/design/images/data/tables.png"), UILabel.LEADING); + UILabel ui2 = new UILabel(BaseUtils.readIcon("/com/fr/design/images/data/views.png"), UILabel.LEADING); + ui1.setToolTipText(Inter.getLocText("FR-Designer_SQL-Table")); + ui2.setToolTipText(Inter.getLocText("FR-Designer_SQL-View")); + first.add(ui1); + second.add(ui2); + } + checkBoxgroupPane.add(first); + checkBoxgroupPane.add(second); + + return checkBoxgroupPane; + } + + /** + * 给 itemComboBox 加上 itemListener + * + * @param itemListener + */ + public void addItemListener(ItemListener itemListener) { + connectionComboBox.itemComboBox.addItemListener(itemListener); + } + + private DocumentListener searchListener = new DocumentListener() { + + @Override + public void removeUpdate(DocumentEvent e) { + search(); + } + + @Override + public void insertUpdate(DocumentEvent e) { + search(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + search(); + } + }; + + private ActionListener filter = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + search(); + } + }; + + /** + * 选项改变,需要重新刷新下拉列表里面的项 + */ + protected void search() { + String selectedObj = connectionComboBox.getSelectedItem(); + + String[] types = ArrayUtils.EMPTY_STRING_ARRAY; + if (tableCheckBox != null) { + if (tableCheckBox.isSelected()) { + types = (String[]) ArrayUtils.add(types, TableProcedure.TABLE); + } + if (viewCheckBox.isSelected()) { + types = (String[]) ArrayUtils.add(types, TableProcedure.VIEW); + } + } else { + types = (String[]) ArrayUtils.add(types, TableProcedure.PROCEDURE); + } + tableViewList.populate(selectedObj, searchField.getText().trim(), types); + } + + @Override + protected String title4PopupWindow() { + return "Connection"; + } + + /** + * + * @param l + */ + public void addDoubleClickListener(DoubleClickSelectedNodeOnTreeListener l) { + this.listeners.add(l); + } + + public void setSelectedDatabaseConnection(com.fr.data.impl.Connection db) { + connectionComboBox.populate(db); + } + + public String getSelectedDatabaseConnnectonName() { + return connectionComboBox.getSelectedItem(); + } + + public static interface DoubleClickSelectedNodeOnTreeListener { + /** + * 处理双击事件 + * + * @param target + */ + public void actionPerformed(TableProcedure target); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/connect/DataConnectionAction.java b/designer-base/src/com/fr/design/data/datapane/connect/DataConnectionAction.java new file mode 100644 index 0000000000..ba2aab629c --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/connect/DataConnectionAction.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.data.datapane.connect; + +import com.fr.base.BaseUtils; +import com.fr.design.actions.UpdateAction; +import com.fr.design.gui.controlpane.NameObjectCreator; + +import java.awt.event.ActionEvent; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-25 + * Time: 下午5:05 + */ +public abstract class DataConnectionAction extends UpdateAction { + public static final String XML_TAG = "connectionType"; + + public DataConnectionAction() { + this.setName(this.getDisplayName()); + this.setSmallIcon(BaseUtils.readIcon(this.getIconPath())); + } + + /** + * 名字 + * + * @return + */ + public abstract String getDisplayName(); + + /** + * 图标 + * + * @return + */ + public abstract String getIconPath(); + + /** + * 得到数据连接的声明类 + * + * @return + */ + public abstract Class getConnectionClass(); + + /** + * 得到相应面板的类 + * + * @return + */ + public abstract Class getUpdateConnectionPaneClass(); + + + public NameObjectCreator getConnectionCreator() { + return new NameObjectCreator(getDisplayName(), getIconPath(), getConnectionClass(), getUpdateConnectionPaneClass()); + } + + /** + * 动作 + * @param e 动作 + */ + public void actionPerformed(ActionEvent e) { + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java b/designer-base/src/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java new file mode 100644 index 0000000000..680a69f61d --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/connect/DatabaseConnectionPane.java @@ -0,0 +1,241 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.data.datapane.connect; + +import com.fr.base.FRContext; +import com.fr.data.impl.JDBCDatabaseConnection; +import com.fr.data.impl.JNDIDatabaseConnection; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.scrollruler.ModLineBorder; +import com.fr.general.Inter; +import com.fr.stable.EncodeConstants; +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +/** + * Database Connection pane. + */ +public abstract class DatabaseConnectionPane extends BasicBeanPane { + + // 编码转换. + private UIComboBox originalCharSetComboBox; + private UIComboBox newCharSetComboBox; + private UILabel message; + private UIButton okButton; + private UIButton cancelButton; + private JDialog dialog; + + // Database pane + public DatabaseConnectionPane() { + this.initComponents(); + } + + protected void initComponents() { + originalCharSetComboBox = new UIComboBox(EncodeConstants.ALL_ENCODING_ARRAY); + newCharSetComboBox = new UIComboBox(EncodeConstants.ALL_ENCODING_ARRAY); + message = new UILabel(); + okButton = new UIButton(Inter.getLocText("OK")); + cancelButton = new UIButton(Inter.getLocText("Cancel")); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel northPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + this.add(northPane, BorderLayout.NORTH); + + // 按钮. + JPanel testPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); + northPane.add(testPane, BorderLayout.NORTH); + UIButton testButton = new UIButton(Inter.getLocText("Datasource-Test_Connection")); + testPane.add(testButton); + testButton.addActionListener(testConnectionActionListener); + testPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 3, 4)); + + // Center + northPane.add(mainPanel(), BorderLayout.CENTER); + if (!isFineBI()) { + // ChartSet + JPanel chartSetPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); + northPane.add(chartSetPane); + chartSetPane.setBorder(BorderFactory.createTitledBorder( + new ModLineBorder(ModLineBorder.TOP), + Inter.getLocText("Datasource-Convert_Charset") + )); + + chartSetPane.add(GUICoreUtils.createNamedPane(originalCharSetComboBox, Inter.getLocText("Datasource-Original_Charset") + ":")); + chartSetPane.add(GUICoreUtils.createNamedPane(newCharSetComboBox, Inter.getLocText("Datasource-New_Charset") + ":")); + } + } + + protected abstract JPanel mainPanel(); + + protected abstract boolean isFineBI(); + + @Override + public void populateBean(com.fr.data.impl.Connection ob) { + this.originalCharSetComboBox.setSelectedItem(ob.getOriginalCharsetName()); + this.newCharSetComboBox.setSelectedItem(ob.getNewCharsetName()); + + populateSubDatabaseConnectionBean((E) ob); + } + + protected abstract void populateSubDatabaseConnectionBean(E ob); + + @Override + public com.fr.data.impl.Connection updateBean() { + E ob = updateSubDatabaseConnectionBean(); + + if (this.originalCharSetComboBox.getSelectedIndex() == 0) { + ob.setOriginalCharsetName(null); + } else { + ob.setOriginalCharsetName((String) this.originalCharSetComboBox.getSelectedItem()); + } + + if (this.newCharSetComboBox.getSelectedIndex() == 0) { + ob.setNewCharsetName(null); + } else { + ob.setNewCharsetName((String) this.newCharSetComboBox.getSelectedItem()); + } + + return ob; + } + + protected abstract E updateSubDatabaseConnectionBean(); + + ActionListener testConnectionActionListener = new ActionListener() { + public void actionPerformed(ActionEvent evt) { + // Try the java connection. + final SwingWorker connectionThread = new SwingWorker() { + protected Object doInBackground() throws Exception { + try { + com.fr.data.impl.Connection database = DatabaseConnectionPane.this.updateBean(); + boolean connect = FRContext.getCurrentEnv().testConnection(database); + okButton.setEnabled(true); + message.setText(database.connectMessage(connect)); + } catch (Exception exp) { + FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); + } + return null; + } + }; + + connectionThread.execute(); + initDialogPane(); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + dialog.dispose(); + } + }); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + dialog.dispose(); + connectionThread.cancel(true); + } + }); + + dialog.addWindowListener(new WindowAdapter() { + public void windowClosed(WindowEvent e) { + connectionThread.cancel(true); + } + }); + + dialog.show(); + dialog.dispose(); + } + }; + + private void initDialogPane() { + + message.setText(Inter.getLocText("Datasource-Test_Connection") + "..."); + message.setBorder(BorderFactory.createEmptyBorder(8, 5, 0, 0)); + okButton.setEnabled(false); + + dialog = new JDialog((Dialog) SwingUtilities.getWindowAncestor(DatabaseConnectionPane.this), Inter.getLocText("Datasource-Test_Connection"), true); + dialog.setSize(new Dimension(268, 118)); + okButton.setEnabled(false); + JPanel jp = new JPanel(); + JPanel upPane = new JPanel(); + JPanel downPane = new JPanel(); + UILabel uiLabel = new UILabel(UIManager.getIcon("OptionPane.informationIcon")); + upPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10)); + upPane.add(uiLabel); + upPane.add(message); + downPane.setLayout(new FlowLayout(FlowLayout.CENTER, 6, 0)); + downPane.add(okButton); + downPane.add(cancelButton); + jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS)); + jp.add(upPane); + jp.add(downPane); + dialog.add(jp); + dialog.setResizable(false); + dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor(DatabaseConnectionPane.this)); + } + + + public static class JDBC extends DatabaseConnectionPane { + private static JDBCDefPane jdbcDefPane = new JDBCDefPane(); + + @Override + protected JPanel mainPanel() { + return jdbcDefPane; + } + + @Override + protected boolean isFineBI() { + return false; + } + + @Override + protected void populateSubDatabaseConnectionBean(JDBCDatabaseConnection ob) { + jdbcDefPane.populate(ob); + } + + @Override + protected JDBCDatabaseConnection updateSubDatabaseConnectionBean() { + return jdbcDefPane.update(); + } + + @Override + protected String title4PopupWindow() { + return "JDBC"; + } + } + + public static class JNDI extends DatabaseConnectionPane { + private static JNDIDefPane jndiDefPane = new JNDIDefPane(); + + @Override + protected JPanel mainPanel() { + return jndiDefPane; + } + + @Override + protected boolean isFineBI() { + return false; + } + + @Override + protected void populateSubDatabaseConnectionBean(JNDIDatabaseConnection ob) { + jndiDefPane.populate(ob); + } + + @Override + protected JNDIDatabaseConnection updateSubDatabaseConnectionBean() { + return jndiDefPane.update(); + } + + @Override + protected String title4PopupWindow() { + return "JNDI"; + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java b/designer-base/src/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java new file mode 100644 index 0000000000..1c61eea265 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/connect/ItemEditableComboBoxPanel.java @@ -0,0 +1,122 @@ +package com.fr.design.data.datapane.connect; + +import com.fr.base.BaseUtils; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.layout.FRGUIPaneFactory; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public abstract class ItemEditableComboBoxPanel extends JPanel { + /** + * + */ + private static final long serialVersionUID = 1L; + + protected static final Object EMPTY = new Object() { + public String toString() { + return ""; + } + }; + + protected UIComboBox itemComboBox; + protected UIButton editButton; + protected UIButton refreshButton; + + public ItemEditableComboBoxPanel() { + super(); + + initComponents(); + } + + protected void initComponents() { + this.setLayout(FRGUIPaneFactory.createM_BorderLayout()); + + itemComboBox = new UIComboBox(); + itemComboBox.setEnabled(true); + this.add(itemComboBox, BorderLayout.CENTER); + + editButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/control-center2.png")); + refreshButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + JPanel jPanel = FRGUIPaneFactory.createNColumnGridInnerContainer_Pane(2, 4 ,4); + jPanel.add(editButton); + jPanel.add(refreshButton); + this.add(jPanel, BorderLayout.EAST); + Dimension buttonSize = new Dimension(26, 20); + editButton.setPreferredSize(buttonSize); + editButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + editItems(); + } + }); + refreshButton.setPreferredSize(buttonSize); + refreshButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + refreshItems(); + } + }); + } + + /** + * 给itemComboBox添加ActionListener + */ + public void addComboBoxActionListener(ActionListener l) { + itemComboBox.addActionListener(l); + } + + /* + * 刷新itemComboBox的内容 + */ + protected void refreshItems() { + // 记录原来选中的Item,重新加载后需要再次选中 + Object lastSelectedItem = itemComboBox.getSelectedItem(); + + DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); + model.removeAllElements(); + + // 先加EMPTY,再加items + model.addElement(EMPTY); + + java.util.Iterator itemIt = items(); + while(itemIt.hasNext()) { + model.addElement(itemIt.next()); + } + + // 再次选中之前选中的Item + int idx = model.getIndexOf(lastSelectedItem); + if(idx < 0) { + idx = 0; + } + itemComboBox.setSelectedIndex(idx); + } + + /* + * 得到其中的itemComboBox所选中的Item + */ + public String getSelectedItem() { + Object selected = itemComboBox.getSelectedItem(); + + return selected instanceof String ? (String)selected : null; + } + + /* + * 选中name项 + */ + public void setSelectedItem(String name) { + DefaultComboBoxModel model = ((DefaultComboBoxModel) itemComboBox.getModel()); + model.setSelectedItem(name); + } + + /* + * 刷新ComboBox.items + */ + protected abstract java.util.Iterator items(); + + /* + * 弹出对话框编辑Items + */ + protected abstract void editItems(); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/com/fr/design/data/datapane/connect/JDBCDefPane.java new file mode 100644 index 0000000000..f5a63d47a7 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/connect/JDBCDefPane.java @@ -0,0 +1,377 @@ +package com.fr.design.data.datapane.connect; + +import com.fr.design.constants.UIConstants; +import com.fr.data.impl.JDBCDatabaseConnection; +import com.fr.data.pool.DBCPConnectionPoolAttr; +import com.fr.design.border.UITitledBorder; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ipasswordfield.UIPassWordField; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.gui.ilable.ActionLabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.dialog.BasicPane; +import com.fr.design.editor.editor.IntegerEditor; +import com.fr.file.filter.ChooseFileFilter; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +public class JDBCDefPane extends JPanel { + public static final String DRIVER_TYPE = "driver_type"; + public static final String USER_NAME = "user_name"; + public static final int TIME_MULTIPLE = 1000; + + private static Map jdbcMap = new HashMap(); + + static { + jdbcMap.put("Others", new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:"), + new DriverURLName("org.hsqldb.jdbcDriver", "jdbc:hsqldb:file:[PATH_TO_DB_FILES]"), new DriverURLName("com.inet.tds.TdsDriver", "jdbc:inetdae7:localhost:1433/"), + new DriverURLName("COM.cloudscape.JDBCDriver", "jdbc:cloudscape:/cloudscape/"), + new DriverURLName("com.internetcds.jdbc.tds.Driver", "jdbc:freetds:sqlserver://localhost/")}); + jdbcMap.put("Inceptor",new DriverURLName[]{new DriverURLName("org.apache.hive.jdbc.HiveDriver","jdbc:inceptor2://localhost:10000/default"), + new DriverURLName("org.apache.hadoop.hive.jdbc.HiveDriver","jdbc:inceptor://localhost:10000/default")}); + jdbcMap.put("Oracle", new DriverURLName[]{new DriverURLName("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:1521:databaseName")}); + jdbcMap.put("DB2", new DriverURLName[]{new DriverURLName("com.ibm.db2.jcc.DB2Driver", "jdbc:db2://localhost:50000/")}); + jdbcMap.put("SQL Server", new DriverURLName[]{new DriverURLName("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://localhost:1433;" + "databaseName=")}); + jdbcMap.put("MySQL", new DriverURLName[]{new DriverURLName("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/"), + new DriverURLName("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost/")}); + jdbcMap.put("Sybase", new DriverURLName[]{new DriverURLName("com.sybase.jdbc2.jdbc.SybDriver", "jdbc:sybase:Tds:localhost:5000/")}); + jdbcMap.put("Access", new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=")}); + jdbcMap.put("Derby", new DriverURLName[]{new DriverURLName("org.apache.derby.jdbc.ClientDriver", "jdbc:derby://localhost:1527/")}); + jdbcMap.put("Postgre", new DriverURLName[]{new DriverURLName("org.postgresql.Driver", "jdbc:postgresql://localhost:5432/")}); + jdbcMap.put("SQLite", new DriverURLName[]{new DriverURLName("org.sqlite.JDBC", "jdbc:sqlite://${ENV_HOME}/../FRDemo.db")}); + } + + private UIButton dbtypeButton; + private UIComboBox dbtypeComboBox; + private UIComboBox driverComboBox; + private UITextField urlTextField; + private UITextField userNameTextField; + private JPasswordField passwordTextField; + // 请不要改动dbtype,只应该最后添加 + private final String[] dbtype = {"", "Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre","SQLite","Inceptor", "Others"}; + + // carl:DBCP的一些属性 + private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_ACTIVE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_IDLE = new IntegerEditor(); + private IntegerEditor DBCP_MIN_IDLE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_WAIT = new IntegerEditor(); + private UITextField DBCP_VALIDATION_QUERY = new UITextField(); + + private UIComboBox DBCP_TESTONBORROW = new UIComboBox(new String[]{Inter.getLocText("No"), Inter.getLocText("Yes")}); + private UIComboBox DBCP_TESTONRETURN = new UIComboBox(new String[]{Inter.getLocText("No"), Inter.getLocText("Yes")}); + private UIComboBox DBCP_TESTWHILEIDLE = new UIComboBox(new String[]{Inter.getLocText("No"), Inter.getLocText("Yes")}); + + private IntegerEditor DBCP_TIMEBETWEENEVICTIONRUNSMILLS = new IntegerEditor(); + private IntegerEditor DBCP_NUMTESTSPEREVICTIONRUN = new IntegerEditor(); + private IntegerEditor DBCP_MINEVICTABLEIDLETIMEMILLIS = new IntegerEditor(); + + public JDBCDefPane() { + this.setBorder(UITitledBorder.createBorderWithTitle("JDBC" + ":")); + this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); + JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + innerthis.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + this.add(innerthis); + dbtypeComboBox = new UIComboBox(); + dbtypeComboBox.setName(DRIVER_TYPE); + for (int i = 0; i < dbtype.length; i++) { + dbtypeComboBox.addItem(dbtype[i]); + } + dbtypeComboBox.addActionListener(dbtypeActionListener); + dbtypeComboBox.setMaximumRowCount(10); + + driverComboBox = new UIComboBox(); + driverComboBox.setEditable(true); + driverComboBox.addActionListener(driverListener); + urlTextField = new UITextField(15); + userNameTextField = new UITextField(15); + userNameTextField.setName(USER_NAME); + passwordTextField = new UIPassWordField(15); + dbtypeButton = new UIButton("."); + dbtypeButton.setToolTipText(Inter.getLocText("Click-Get_Default_URL")); + dbtypeButton.addActionListener(dbtypeButtonActionListener); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + JPanel dbtypePane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + dbtypePane.add(new UILabel((Inter.getLocText("Database") + ":"))); + JPanel dbtypeComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + Component[][] dbtypeComComponents = {{dbtypeComboBox}}; + double[] dbtypeRowSize = {p}; + double[] dbtypeColumnSize = {p}; + dbtypeComPane = TableLayoutHelper.createTableLayoutPane(dbtypeComComponents, dbtypeRowSize, dbtypeColumnSize); + + JPanel driverPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + driverPane.add(new UILabel(Inter.getLocText("Driver") + ":")); + + JPanel urlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + urlPane.add(new UILabel("URL:")); + JPanel urlComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + Component[][] urlComComponents = {{urlTextField, dbtypeButton}}; + double[] urlRowSize = {p}; + double[] urlColumnSize = {f, 21}; + urlComPane = TableLayoutHelper.createCommonTableLayoutPane(urlComComponents, urlRowSize, urlColumnSize, 4); + + JPanel userPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + userPane.add(new UILabel(Inter.getLocText("Username") + ":")); + JPanel userComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + Component[][] userComComponents = {{userNameTextField, new UILabel(Inter.getLocText("Password") + ":"), passwordTextField}}; + double[] userRowSize = {p}; + double[] userColumnSize = {f, p, f}; + userComPane = TableLayoutHelper.createCommonTableLayoutPane(userComComponents, userRowSize, userColumnSize, 4); + + JPanel passwordPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + passwordPane.add(new UILabel(Inter.getLocText("Password") + ":")); + + Component[][] components = {{dbtypePane, dbtypeComPane}, {driverPane, driverComboBox}, {urlPane, urlComPane}, {userPane, userComPane},}; + + double[] rowSize = {p, p, p, p}; + double[] columnSize = {p, f, 22}; + JPanel centerPanel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 6); + innerthis.add(centerPanel); + JPanel southPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + innerthis.add(southPanel); + southPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 4, 20)); + ActionLabel actionLabel = new ActionLabel(Inter.getLocText("ConnectionPool_Attr")); + southPanel.add(actionLabel, BorderLayout.EAST); + actionLabel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + JDialog wDialog = createJDialog(); + wDialog.setVisible(true); + } + }); + } + + public void populate(JDBCDatabaseConnection jdbcDatabase) { + if (jdbcDatabase == null) { + jdbcDatabase = new JDBCDatabaseConnection(); + } + if (ComparatorUtils.equals(jdbcDatabase.getDriver(), "sun.jdbc.odbc.JdbcOdbcDriver") + && jdbcDatabase.getURL().startsWith("jdbc:odbc:Driver={Microsoft")) { + this.dbtypeComboBox.setSelectedItem("Access"); + } else { + Iterator> jdbc = jdbcMap.entrySet().iterator(); + boolean out = false; + while (jdbc.hasNext()) { + Entry entry = jdbc.next(); + DriverURLName[] dus = entry.getValue(); + for (int i = 0, len = dus.length; i < len; i++) { + if (ComparatorUtils.equals(dus[i].getDriver(), jdbcDatabase.getDriver())) { + this.dbtypeComboBox.setSelectedItem(entry.getKey()); + out = true; + break; + } + } + if (out) { + break; + } + } + } + this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver()); + this.urlTextField.setText(jdbcDatabase.getURL()); + this.userNameTextField.setText(jdbcDatabase.getUser()); + this.passwordTextField.setText(jdbcDatabase.getPassword()); + + DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); + if (dbcpAttr == null) { + dbcpAttr = new DBCPConnectionPoolAttr(); + jdbcDatabase.setDbcpAttr(dbcpAttr); + } + this.DBCP_INITIAL_SIZE.setValue(dbcpAttr.getInitialSize()); + this.DBCP_MAX_ACTIVE.setValue(dbcpAttr.getMaxActive()); + this.DBCP_MAX_IDLE.setValue(dbcpAttr.getMaxIdle()); + this.DBCP_MAX_WAIT.setValue(dbcpAttr.getMaxWait()); + this.DBCP_MIN_IDLE.setValue(dbcpAttr.getMinIdle()); + this.DBCP_VALIDATION_QUERY.setText(dbcpAttr.getValidationQuery()); + this.DBCP_TESTONBORROW.setSelectedIndex(dbcpAttr.isTestOnBorrow() ? 1 : 0); + this.DBCP_TESTONRETURN.setSelectedIndex(dbcpAttr.isTestOnReturn() ? 1 : 0); + this.DBCP_TESTWHILEIDLE.setSelectedIndex(dbcpAttr.isTestWhileIdle() ? 1 : 0); + this.DBCP_MINEVICTABLEIDLETIMEMILLIS.setValue(dbcpAttr.getMinEvictableIdleTimeMillis() / TIME_MULTIPLE); + this.DBCP_NUMTESTSPEREVICTIONRUN.setValue(dbcpAttr.getNumTestsPerEvictionRun()); + this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.setValue(dbcpAttr.getTimeBetweenEvictionRunsMillis()); + } + + public JDBCDatabaseConnection update() { + JDBCDatabaseConnection jdbcDatabase = new JDBCDatabaseConnection(); + Object driveItem = this.driverComboBox.getSelectedItem(); + jdbcDatabase.setDriver(driveItem == null ? null : driveItem.toString()); + jdbcDatabase.setURL(this.urlTextField.getText().trim()); + jdbcDatabase.setUser(this.userNameTextField.getText().trim()); + jdbcDatabase.setPassword(new String(this.passwordTextField.getPassword()).trim()); + + DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); + if (dbcpAttr == null) { + dbcpAttr = new DBCPConnectionPoolAttr(); + jdbcDatabase.setDbcpAttr(dbcpAttr); + } + dbcpAttr.setInitialSize(this.DBCP_INITIAL_SIZE.getValue().intValue()); + dbcpAttr.setMaxActive(this.DBCP_MAX_ACTIVE.getValue().intValue()); + dbcpAttr.setMaxIdle(this.DBCP_MAX_IDLE.getValue().intValue()); + dbcpAttr.setMaxWait(this.DBCP_MAX_WAIT.getValue().intValue()); + dbcpAttr.setMinIdle(this.DBCP_MIN_IDLE.getValue().intValue()); + dbcpAttr.setValidationQuery(this.DBCP_VALIDATION_QUERY.getText()); + dbcpAttr.setTestOnBorrow(this.DBCP_TESTONBORROW.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setTestOnReturn(this.DBCP_TESTONRETURN.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setTestWhileIdle(this.DBCP_TESTWHILEIDLE.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setMinEvictableIdleTimeMillis(((Number) this.DBCP_MINEVICTABLEIDLETIMEMILLIS.getValue()).intValue() * TIME_MULTIPLE); + dbcpAttr.setNumTestsPerEvictionRun(((Number) this.DBCP_NUMTESTSPEREVICTIONRUN.getValue()).intValue()); + dbcpAttr.setTimeBetweenEvictionRunsMillis(((Number) this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.getValue()).intValue()); + + return jdbcDatabase; + } + + ActionListener dbtypeActionListener = new ActionListener() { + public void actionPerformed(ActionEvent evt) { + + urlTextField.setText(StringUtils.EMPTY); + driverComboBox.removeAllItems(); + if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) { + driverComboBox.setSelectedItem(StringUtils.EMPTY); + return; + } + + DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem()); + for (int i = 0, len = dus.length; i < len; i++) { + driverComboBox.addItem(dus[i].getDriver()); + if (i == 0) { + driverComboBox.setSelectedItem(dus[i].getDriver()); + urlTextField.setText(dus[i].getURL()); + } + } + } + }; + + ActionListener driverListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (driverComboBox.getSelectedItem() == null ||ComparatorUtils.equals(driverComboBox.getSelectedItem(), StringUtils.EMPTY)) { + return; + } + Iterator> jdbc = jdbcMap.entrySet().iterator(); + while (jdbc.hasNext()) { + Entry entry = jdbc.next(); + DriverURLName[] dus = entry.getValue(); + for (int i = 0, len = dus.length; i < len; i++) { + if (ComparatorUtils.equals(dus[i].getDriver(), (driverComboBox.getSelectedItem()))) { + urlTextField.setText(dus[i].getURL()); + return; + } + } + } + } + + }; + + ActionListener dbtypeButtonActionListener = new ActionListener() { + public void actionPerformed(ActionEvent evt) { + if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) { + return; + } + DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem()); + for (int i = 0, len = dus.length; i < len; i++) { + if (ComparatorUtils.equals(driverComboBox.getSelectedItem(), (dus[i].getDriver()))) { + urlTextField.setText(dus[i].getURL()); + if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), ("Access"))) { + // ben:这个能不能换种处理方案- - + JFileChooser filechooser = new JFileChooser(); + filechooser.setDialogTitle(Inter.getLocText("Open")); + filechooser.setMultiSelectionEnabled(false); + filechooser.addChoosableFileFilter(new ChooseFileFilter(new String[]{"accdb", "mdb"}, "Microsoft Office Access")); + int result = filechooser.showOpenDialog(DesignerContext.getDesignerFrame()); + File selectedfile = null; + + if (result == JFileChooser.APPROVE_OPTION) { + selectedfile = filechooser.getSelectedFile(); + if (selectedfile != null) { + String selectedName = selectedfile.getPath().substring(selectedfile.getPath().lastIndexOf('.') + 1); + if (selectedName.equalsIgnoreCase("mdb") || selectedName.equalsIgnoreCase("accdb")) { + urlTextField.setText(urlTextField.getText() + selectedfile.getPath()); + } + } + } + } + break; + } + } + } + }; + + private JDialog createJDialog() { + return new DBCPAttrPane().showWindow(SwingUtilities.getWindowAncestor(JDBCDefPane.this)); + } + + class DBCPAttrPane extends BasicPane { + public DBCPAttrPane() { + JPanel defaultPane = this; + + // JPanel northFlowPane + JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + defaultPane.add(northFlowPane, BorderLayout.NORTH); + + DBCP_VALIDATION_QUERY.setColumns(15); + // ContextPane + + double f = TableLayout.FILL; + // double p = TableLayout.PREFERRED; + double[] rowSize = {f, f, f, f, f, f, f, f, f, f, f, f}; + double[] columnSize = {f, f}; + Component[][] comps = { + {new UILabel(Inter.getLocText("DBCP_INITIAL_SIZE") + ":", SwingConstants.RIGHT), DBCP_INITIAL_SIZE}, + {new UILabel(Inter.getLocText("DBCP_MAX_ACTIVE") + ":", SwingConstants.RIGHT), DBCP_MAX_ACTIVE}, + {new UILabel(Inter.getLocText("DBCP_MAX_IDLE") + ":", SwingConstants.RIGHT), DBCP_MAX_IDLE}, + {new UILabel(Inter.getLocText("DBCP_MIN_IDLE") + ":", SwingConstants.RIGHT), DBCP_MIN_IDLE}, + {new UILabel(Inter.getLocText(new String[] {"DBCP_MAX_WAIT", "Milliseconds"},new String[] {"(", "):"}) , SwingConstants.RIGHT), DBCP_MAX_WAIT}, + {new UILabel(Inter.getLocText("DBCP_VALIDATION_QUERY") + ":", SwingConstants.RIGHT), DBCP_VALIDATION_QUERY}, + {new UILabel(Inter.getLocText("DBCP_TEST_ON_BORROW") + ":", SwingConstants.RIGHT), DBCP_TESTONBORROW}, + {new UILabel(Inter.getLocText("DBCP_TEST_ON_RETURN") + ":", SwingConstants.RIGHT), DBCP_TESTONRETURN}, + {new UILabel(Inter.getLocText("DBCP_TEST_WHILE_IDLE") + ":", SwingConstants.RIGHT), DBCP_TESTWHILEIDLE}, + {new UILabel(Inter.getLocText(new String[] {"DBCP_TIME_BETWEEN_EVICTIONRUNSMILLIS", "Milliseconds"}, new String[] {"(", "):"}), SwingConstants.RIGHT), + DBCP_TIMEBETWEENEVICTIONRUNSMILLS}, + {new UILabel(Inter.getLocText("DBCP_NUM_TEST_PER_EVCTION_RUN") + ":", SwingConstants.RIGHT), DBCP_NUMTESTSPEREVICTIONRUN}, + {new UILabel(Inter.getLocText(new String[] {"DBCP_MIN_EVICTABLE_IDLE_TIMEMILLIS", "Sche-Second"}, new String[] {"(", "):"}) , SwingConstants.RIGHT), + DBCP_MINEVICTABLEIDLETIMEMILLIS}}; + + JPanel contextPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSize, columnSize, 10, 4); + contextPane.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, UIConstants.LINE_COLOR)); + northFlowPane.add(contextPane); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("ConnectionPool_Attr"); + } + } + + private static class DriverURLName { + public DriverURLName(String driver, String url) { + this.driver = driver; + this.url = url; + } + + public String getDriver() { + return this.driver; + } + + public String getURL() { + return this.url; + } + + private String driver; + private String url; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/connect/JNDIDefPane.java b/designer-base/src/com/fr/design/data/datapane/connect/JNDIDefPane.java new file mode 100644 index 0000000000..05138dac4c --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/connect/JNDIDefPane.java @@ -0,0 +1,266 @@ +package com.fr.design.data.datapane.connect; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Map; +import java.util.Properties; + +import javax.naming.Context; +import javax.swing.BorderFactory; +import javax.swing.JDialog; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; + +import com.fr.data.impl.JNDIDatabaseConnection; +import com.fr.design.border.UITitledBorder; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.gui.ilable.ActionLabel; +import com.fr.design.gui.ilable.FRExplainLabel; +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.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.stable.StringUtils; + +public class JNDIDefPane extends JPanel { + private static Map jndiMap = new HashMap(); + + static { + jndiMap.put("weblogic.jndi.WLInitialContextFactory", "t3://localhost:7001"); + jndiMap.put("com.ibm.websphere.naming.WsnInitialContextFactory", "iiop://localhost:2809"); + jndiMap.put("org.jboss.naming.HttpNamingContextFactory", "http://jboss_server_address:8080/invoker/JNDIFactory"); + jndiMap.put("org.jnp.interfaces.NamingContextFactory", "localhost:1099"); + jndiMap.put("com.caucho.burlap.BurlapContextFactory", "http://localhost:8080/hello/burlap"); + } + + private UITextField jndiNameTextField; + + private UIComboBox JNDIFactoryComboBox; + private ContextTextField PROVIDER_URL_TF = new ContextTextField(Context.PROVIDER_URL); + private ContextTextField SECURITY_PRINCIPAL_TF = new ContextTextField(Context.SECURITY_PRINCIPAL); + private ContextTextField SECURITY_CREDENTIALS_TF = new ContextTextField(Context.SECURITY_CREDENTIALS); + + private ContextTextField OBJECT_FACTORIES_TF = new ContextTextField(Context.OBJECT_FACTORIES); + private ContextTextField STATE_FACTORIES_TF = new ContextTextField(Context.STATE_FACTORIES); + private ContextTextField URL_PKG_PREFIXES_TF = new ContextTextField(Context.URL_PKG_PREFIXES); + private ContextTextField DNS_URL_TF = new ContextTextField(Context.DNS_URL); + private ContextTextField AUTHORITATIVE_TF = new ContextTextField(Context.AUTHORITATIVE); + private ContextTextField BATCHSIZE_TF = new ContextTextField(Context.BATCHSIZE); + private ContextTextField REFERRAL_TF = new ContextTextField(Context.REFERRAL); + private ContextTextField SECURITY_PROTOCOL_TF = new ContextTextField(Context.SECURITY_PROTOCOL); + private ContextTextField SECURITY_AUTHENTICATION_TF = new ContextTextField(Context.SECURITY_AUTHENTICATION); + private ContextTextField LANGUAGE_TF = new ContextTextField(Context.LANGUAGE); + private ContextTextField APPLET_TF = new ContextTextField(Context.APPLET); + + private JDialog otherAttrDialog; + + public JNDIDefPane() { + this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); + this.setBorder(UITitledBorder.createBorderWithTitle("JNDI" + ":")); + JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + this.add(innerthis); + // NorthPane + JPanel nContentPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); + innerthis.add(nContentPane); + nContentPane.add(new UILabel(Inter.getLocText("Datasource-JNDI_Name") + ":")); + jndiNameTextField = new UITextField(20); + nContentPane.add(jndiNameTextField, BorderLayout.NORTH); + + // CenterPane + JPanel outcenterPane = FRGUIPaneFactory.createTitledBorderPane(Inter.getLocText("Datasource-Context")); + innerthis.add(outcenterPane); + JPanel centerPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_M_Pane(); + outcenterPane.add(centerPane); + + JNDIFactoryComboBox = new UIComboBox(new String[] { "", "weblogic.jndi.WLInitialContextFactory", "com.ibm.websphere.naming.WsnInitialContextFactory", + "org.jboss.naming.HttpNamingContextFactory", "org.jnp.interfaces.NamingContextFactory", "com.caucho.burlap.BurlapContextFactory", }); + JNDIFactoryComboBox.setEditable(true); + + JNDIFactoryComboBox.addActionListener(jndiListener); + JNDIFactoryComboBox.setPreferredSize(new Dimension(30, JNDIFactoryComboBox.getPreferredSize().height + 2)); + + // ContextPane + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + double[] rowSize = { p, p, p, p }; + double[] columnSize = { f, f }; + Component[][] comps = { { new UILabel("INITIAL_CONTEXT_FACTORY:", SwingConstants.RIGHT), JNDIFactoryComboBox }, + { new UILabel("PROVIDER_URL:", SwingConstants.RIGHT), PROVIDER_URL_TF }, { new UILabel("SECURITY_PRINCIPAL:", SwingConstants.RIGHT), SECURITY_PRINCIPAL_TF }, + { new UILabel("SECURITY_CREDENTIALS:", SwingConstants.RIGHT), SECURITY_CREDENTIALS_TF } }; + centerPane.add(TableLayoutHelper.createCommonTableLayoutPane(comps, rowSize, columnSize, 2)); + + // ActionLabel + JPanel actionPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + centerPane.add(actionPane); + actionPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 4, 6)); + + ActionLabel actionLabel = new ActionLabel(Inter.getLocText("Datasource-Other_Attributes")); + actionPane.add(actionLabel, BorderLayout.EAST); + actionLabel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + JDialog wDialog = createJDialog(); + wDialog.setVisible(true); + } + }); + + // South Description + UILabel explainLabe11l = new FRExplainLabel(Inter.getLocText("Datasource-JNDI_DES")); + innerthis.add(new JScrollPane(explainLabe11l)); + } + + public void populate(JNDIDatabaseConnection jndiDatabase) { + if (jndiDatabase == null) { + jndiDatabase = new JNDIDatabaseConnection(); + } + + // Properties. + Hashtable contextHashtable = jndiDatabase.getContextHashtable(); + Object INITIAL_CONTEXT_FACTORY = contextHashtable.get(Context.INITIAL_CONTEXT_FACTORY); + + this.JNDIFactoryComboBox.setSelectedItem(INITIAL_CONTEXT_FACTORY == null ? "" : INITIAL_CONTEXT_FACTORY); + this.jndiNameTextField.setText(jndiDatabase.getJNDIName() == null ? "" : jndiDatabase.getJNDIName()); + populateContextAttributes(contextHashtable, this.PROVIDER_URL_TF, Context.PROVIDER_URL); + populateContextAttributes(contextHashtable, this.SECURITY_PRINCIPAL_TF, Context.SECURITY_PRINCIPAL); + populateContextAttributes(contextHashtable, this.SECURITY_CREDENTIALS_TF, Context.SECURITY_CREDENTIALS); + + populateContextAttributes(contextHashtable, this.OBJECT_FACTORIES_TF, Context.OBJECT_FACTORIES); + populateContextAttributes(contextHashtable, this.STATE_FACTORIES_TF, Context.STATE_FACTORIES); + populateContextAttributes(contextHashtable, this.URL_PKG_PREFIXES_TF, Context.URL_PKG_PREFIXES); + + populateContextAttributes(contextHashtable, this.DNS_URL_TF, Context.DNS_URL); + populateContextAttributes(contextHashtable, this.AUTHORITATIVE_TF, Context.AUTHORITATIVE); + populateContextAttributes(contextHashtable, this.BATCHSIZE_TF, Context.BATCHSIZE); + populateContextAttributes(contextHashtable, this.REFERRAL_TF, Context.REFERRAL); + populateContextAttributes(contextHashtable, this.SECURITY_PROTOCOL_TF, Context.SECURITY_PROTOCOL); + populateContextAttributes(contextHashtable, this.SECURITY_AUTHENTICATION_TF, Context.SECURITY_AUTHENTICATION); + populateContextAttributes(contextHashtable, this.LANGUAGE_TF, Context.LANGUAGE); + populateContextAttributes(contextHashtable, this.APPLET_TF, Context.APPLET); + } + + private void populateContextAttributes(Hashtable properties, UITextField textField, String contextAttr) { + String PROVIDER_URL = properties.get(contextAttr); + if (PROVIDER_URL != null) { + textField.setText(PROVIDER_URL); + } + } + + public JNDIDatabaseConnection update() { + JNDIDatabaseConnection jndiDatabase = new JNDIDatabaseConnection(); + + jndiDatabase.setJNDIName(this.jndiNameTextField.getText()); + + Hashtable contextHashtable = jndiDatabase.getContextHashtable(); + + String factoryString = (String)this.JNDIFactoryComboBox.getEditor().getItem(); + if (factoryString != null && factoryString.trim().length() > 0) { + contextHashtable.put(Context.INITIAL_CONTEXT_FACTORY, factoryString); + } + updateContextAttributes(contextHashtable, this.PROVIDER_URL_TF, Context.PROVIDER_URL); + updateContextAttributes(contextHashtable, this.SECURITY_PRINCIPAL_TF, Context.SECURITY_PRINCIPAL); + updateContextAttributes(contextHashtable, this.SECURITY_CREDENTIALS_TF, Context.SECURITY_CREDENTIALS); + + updateContextAttributes(contextHashtable, this.OBJECT_FACTORIES_TF, Context.OBJECT_FACTORIES); + updateContextAttributes(contextHashtable, this.STATE_FACTORIES_TF, Context.STATE_FACTORIES); + updateContextAttributes(contextHashtable, this.URL_PKG_PREFIXES_TF, Context.URL_PKG_PREFIXES); + + updateContextAttributes(contextHashtable, this.DNS_URL_TF, Context.DNS_URL); + updateContextAttributes(contextHashtable, this.AUTHORITATIVE_TF, Context.AUTHORITATIVE); + updateContextAttributes(contextHashtable, this.BATCHSIZE_TF, Context.BATCHSIZE); + updateContextAttributes(contextHashtable, this.REFERRAL_TF, Context.REFERRAL); + updateContextAttributes(contextHashtable, this.SECURITY_PROTOCOL_TF, Context.SECURITY_PROTOCOL); + updateContextAttributes(contextHashtable, this.SECURITY_AUTHENTICATION_TF, Context.SECURITY_AUTHENTICATION); + updateContextAttributes(contextHashtable, this.LANGUAGE_TF, Context.LANGUAGE); + updateContextAttributes(contextHashtable, this.APPLET_TF, Context.APPLET); + + return jndiDatabase; + } + + private void updateContextAttributes(Hashtable contextHashtable, UITextField textField, String contextAttr) { + String tValue = textField.getText(); + if (tValue != null && tValue.trim().length() > 0) { + contextHashtable.put(contextAttr, tValue); + } + } + + ActionListener jndiListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + Object o = JNDIFactoryComboBox.getSelectedItem(); + if (o == null || ComparatorUtils.equals(o, StringUtils.EMPTY)) { + PROVIDER_URL_TF.setText(""); + return; + } + PROVIDER_URL_TF.setText(jndiMap.get(o)); + } + + }; + + private JDialog createJDialog() { + if (this.otherAttrDialog == null) { + this.otherAttrDialog = new OtherAttrPane().showWindow(SwingUtilities.getWindowAncestor(JNDIDefPane.this)); + } + + return this.otherAttrDialog; + } + + class OtherAttrPane extends BasicPane { + public OtherAttrPane() { + // JPanel northFlowPane + JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + this.add(northFlowPane, BorderLayout.NORTH); + + // ContextPane + double f = TableLayout.FILL; + double[] rowSize = { f, f, f, f, f, f, f, f, f, f, f }; + double[] columnSize = { f, f }; + Component[][] comps = { { new UILabel("OBJECT_FACTORIES:", SwingConstants.RIGHT), OBJECT_FACTORIES_TF }, + { new UILabel("STATE_FACTORIES:", SwingConstants.RIGHT), STATE_FACTORIES_TF }, { new UILabel("URL_PKG_PREFIXES:", SwingConstants.RIGHT), URL_PKG_PREFIXES_TF }, + { new UILabel("DNS_URL:", SwingConstants.RIGHT), DNS_URL_TF }, { new UILabel("AUTHORITATIVE:", SwingConstants.RIGHT), AUTHORITATIVE_TF }, + { new UILabel("BATCHSIZE:", SwingConstants.RIGHT), BATCHSIZE_TF }, { new UILabel("REFERRAL:", SwingConstants.RIGHT), REFERRAL_TF }, + { new UILabel("SECURITY_PROTOCOL:", SwingConstants.RIGHT), SECURITY_PROTOCOL_TF }, + { new UILabel("SECURITY_AUTHENTICATION:", SwingConstants.RIGHT), SECURITY_AUTHENTICATION_TF }, { new UILabel("LANGUAGE:", SwingConstants.RIGHT), LANGUAGE_TF }, + { new UILabel("APPLET:", SwingConstants.RIGHT), APPLET_TF } }; + northFlowPane.add(TableLayoutHelper.createCommonTableLayoutPane(comps, rowSize, columnSize, 2)); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("Datasource-Other_Attributes"); + } + } + + // 主力Context属性 + class ContextTextField extends UITextField { + private String contextName; + + public ContextTextField(String contextName) { + this.setContextName(contextName); + this.setColumns(24); + } + + public String getContextName() { + return contextName; + } + + public void setContextName(String contextName) { + this.contextName = contextName; + } + + /* + * 更新Properties. + */ + public void applyProperties(Properties properties) { + properties.put(contextName, this.getText()); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/preview/LoadedEventListener.java b/designer-base/src/com/fr/design/data/datapane/preview/LoadedEventListener.java new file mode 100644 index 0000000000..3967e42b03 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/preview/LoadedEventListener.java @@ -0,0 +1,18 @@ +/* + * Copyright(c) 2001-2011, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.data.datapane.preview; + +import java.util.EventListener; + +/** + * Created by IntelliJ IDEA. + * User : Richer + * Version: 6.5.5 + * Date : 11-7-7 + * Time : 下午5:32 + */ +public interface LoadedEventListener extends EventListener { + + public void fireLoaded(); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/preview/PreviewLabel.java b/designer-base/src/com/fr/design/data/datapane/preview/PreviewLabel.java new file mode 100644 index 0000000000..dbb3f51c31 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/preview/PreviewLabel.java @@ -0,0 +1,37 @@ +package com.fr.design.data.datapane.preview; + +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import com.fr.base.BaseUtils; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.general.Inter; + + + + +public class PreviewLabel extends UIButton { + Previewable previewable; + + public PreviewLabel(Previewable previewable) { + super(BaseUtils.readIcon("/com/fr/design/images/m_file/preview.png")); + this.setToolTipText(Inter.getLocText("Preview")); + this.setCursor(new Cursor(Cursor.HAND_CURSOR)); + this.previewable = previewable; + this.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + PreviewLabel.this.previewable.preview(); + } + }); + this.setPreferredSize(new Dimension(24, 20)); + } + + public static interface Previewable { + public void preview(); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/preview/PreviewTableModel.java b/designer-base/src/com/fr/design/data/datapane/preview/PreviewTableModel.java new file mode 100644 index 0000000000..551638ffd8 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/preview/PreviewTableModel.java @@ -0,0 +1,212 @@ +package com.fr.design.data.datapane.preview; + +import javax.swing.table.AbstractTableModel; + +import com.fr.base.FRContext; +import com.fr.data.AbstractDataModel; +import com.fr.data.impl.EmbeddedTableData.EmbeddedTDDataModel; +import com.fr.data.impl.storeproc.ProcedureDataModel; +import com.fr.env.RemoteEnv; +import com.fr.general.Inter; +import com.fr.general.data.DataModel; +import com.fr.general.data.TableDataException; +import com.fr.cache.list.IntList; +import com.fr.stable.StringUtils; +import com.fr.design.utils.DesignUtils; + +/** + * 这个TableModel主要是预览数据的. 字段TableData必须转化为内置的 + */ +public class PreviewTableModel extends AbstractTableModel { + private DataModel dataModel; + private String erroMessage = null; + + public IntList dateIndexs = new IntList(4); + + public PreviewTableModel(int maxRowCount) { + // peter:默认必须显示错误的数据源. + this(new ErrorResultSet(), maxRowCount); + } + + public PreviewTableModel(DataModel sourceResultSet, int maxRowCount) { + if (sourceResultSet instanceof ProcedureDataModel) { + ProcedureDataModel rs = (ProcedureDataModel) sourceResultSet; + try { + this.dataModel = createRowDataModel(rs, maxRowCount); + } catch (TableDataException e) { + // TODO Auto-generated catch block + FRContext.getLogger().error(e.getMessage(), e); + } + } else { + this.dataModel = sourceResultSet; + } + } + + public static DataModel createRowDataModel(final ProcedureDataModel rs, int maxRowCount) throws TableDataException { + int rowCount = rs.getRowCount(); + if (maxRowCount == 0) { + maxRowCount = rowCount; + } else if (maxRowCount > rowCount) { + maxRowCount = rowCount; + } + final int finalRowCount = maxRowCount; + DataModel dm = new AbstractDataModel() { + + @Override + public void release() throws Exception { + rs.release(); + } + + @Override + public boolean hasRow(int rowIndex) throws TableDataException { + return rowIndex <= finalRowCount - 1 && rowIndex >= 0; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) + throws TableDataException { + return rs.getValueAt(rowIndex, columnIndex); + } + + @Override + public int getRowCount() throws TableDataException { + return finalRowCount; + } + + @Override + public String getColumnName(int columnIndex) throws TableDataException { + return rs.getColumnName(columnIndex); + } + + @Override + public int getColumnCount() throws TableDataException { + return rs.getColumnCount(); + } + }; + return dm; + } + + public String getErrMessage() { + return this.erroMessage; + } + + public void setErrMessage(String err) { + this.erroMessage = err; + } + + public String getColumnName(int column) { + try { + return Integer.toString(column + 1) + ". " + dataModel.getColumnName(column) + checkType(column); + } catch (TableDataException e) { + FRContext.getLogger().error(e.getMessage(), e); + DesignUtils.errorMessage(e.getMessage()); + return Inter.getLocText("FR-Designer_Error"); + } + } + + public int getRowCount() { + try { + return this.dataModel.getRowCount(); + } catch (TableDataException e) { + FRContext.getLogger().error(e.getMessage(), e); + return 0; + } + } + + public int getColumnCount() { + try { + if (dataModel == null) { + return 0; + } + return dataModel.getColumnCount(); + } catch (TableDataException e) { + FRContext.getLogger().error(e.getMessage(), e); + DesignUtils.errorMessage(e.getMessage()); + return 0; + } + } + + public Object getValueAt(int row, int column) { + try { + return dataModel.getValueAt(row, column); + } catch (TableDataException e) { + FRContext.getLogger().error(e.getMessage(), e); + DesignUtils.errorMessage(e.getMessage()); + return ""; + } + } + + /* + * peter:由于如果预览的TableData发生错误,界面有点象死机了一样,晕啊. + * 就是由于预览的JTable在不停的getRowCount来显示数据. + */ + private static class ErrorResultSet extends AbstractDataModel { + public ErrorResultSet() { + } + + public int getRowCount() { + return 0; + } + + public String getColumnName(int column) { + return Inter.getLocText("FR-Designer_Error"); + } + + public int getColumnCount() { + return 1; + } + + public Object getValueAt(int row, int column) { + return ""; + } + + public void release() throws Exception { + } + } + + private String checkType(int column) { + if (dateIndexs.contain(column)) { + String s = Inter.getLocText("FR-Designer_Date"); + return ("(" + s + ")"); + } + + String s = StringUtils.EMPTY; + Object o = null; + try { + for (int i = 0; i < dataModel.getRowCount(); i++) { + o = dataModel.getRowCount() <= 0 ? null : dataModel.getValueAt(i, column); + + if (o != null && StringUtils.isNotEmpty(o.toString())) { + break; + } + } + } catch (TableDataException e) { + return ("(?)"); + } + + if (o == null) { + s = "?"; + } else if (o instanceof String) { + s = Inter.getLocText("FR-Designer_Parameter_String"); + if (FRContext.getCurrentEnv() instanceof RemoteEnv && dataModel instanceof EmbeddedTDDataModel) { + Class clzz = ((EmbeddedTDDataModel) dataModel).getColumnClass(column); + if (Number.class.isAssignableFrom(clzz)) { + s = Inter.getLocText("FR-Designer_Number");//bigdecimal + } else if (java.sql.Date.class.isAssignableFrom(clzz)) { + s = Inter.getLocText("FR-Designer_Date"); + } + } + } else if (o instanceof Integer) { + s = Inter.getLocText("FR-Designer_Integer"); + } else if (o instanceof Double || o instanceof Float) { + s = Inter.getLocText("FR-Designer_Double"); + } else if (o instanceof java.sql.Date || o instanceof java.util.Date) { + s = Inter.getLocText("FR-Designer_Date"); + } else if (o instanceof Number) { + s = Inter.getLocText("FR-Designer_Number");//bigdecimal + } else { + s = "?"; + } + return ("(" + s + ")"); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/datapane/preview/PreviewTablePane.java b/designer-base/src/com/fr/design/data/datapane/preview/PreviewTablePane.java new file mode 100644 index 0000000000..bdc14e3088 --- /dev/null +++ b/designer-base/src/com/fr/design/data/datapane/preview/PreviewTablePane.java @@ -0,0 +1,485 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.data.datapane.preview; + +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.DBTableData; +import com.fr.data.impl.EmbeddedTableData; +import com.fr.data.impl.storeproc.ProcedureDataModel; +import com.fr.design.DesignerEnvManager; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.BasicPane; +import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.gui.frpane.UITabbedPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.iprogressbar.AutoProgressBar; +import com.fr.design.gui.itable.SortableJTable; +import com.fr.design.gui.itable.TableSorter; +import com.fr.design.gui.itextfield.UINumberField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.DesignerContext; +import com.fr.function.TIME; +import com.fr.general.FRFont; +import com.fr.general.Inter; + +import javax.swing.*; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableColumn; +import javax.swing.table.TableModel; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Date; +import java.util.concurrent.CancellationException; + +/** + * august: PreviewTablePane一共提供5个共有的静态方法,用来预览。 + */ +public class PreviewTablePane extends BasicPane { + private TableData tableData; + private ProcedureDataModel storeProcedureDataModel; + private static UINumberField maxPreviewNumberField; + private UINumberField currentRowsField; + private JTable preveiwTable; + private static AutoProgressBar progressBar; + private AutoProgressBar connectionBar; + private java.util.List listeners = new ArrayList(); + private BasicDialog dialog; + private SwingWorker worker; + + private UILabel refreshLabel; + private static PreviewTablePane THIS; + private EmbeddedTableData previewTableData; + + public static final PreviewTablePane getInstance() { + if (THIS == null) { + THIS = new PreviewTablePane(); + } + return THIS; + } + + private PreviewTablePane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + // elalke:预览行数 + JPanel previewNumberPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + this.add(previewNumberPanel, BorderLayout.NORTH); + + JPanel currentPreviewPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + previewNumberPanel.add(currentPreviewPanel); + currentPreviewPanel.add(new UILabel(Inter.getLocText("FR-Designer_Current_Preview_Rows") + ":")); + + currentRowsField = new UINumberField(); + currentPreviewPanel.add(currentRowsField); + currentRowsField.setEditable(false); + currentRowsField.setColumns(4); + currentRowsField.setInteger(true); + + JPanel maxPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + previewNumberPanel.add(maxPanel); + maxPanel.add(new UILabel(Inter.getLocText("Datasource-Maximum_Number_of_Preview_Rows") + ":")); + + maxPreviewNumberField = new UINumberField(); + maxPanel.add(maxPreviewNumberField); + maxPreviewNumberField.setColumns(4); + maxPreviewNumberField.setInteger(true); + + DesignerEnvManager designerEnvManager = DesignerEnvManager.getEnvManager(); + maxPreviewNumberField.setValue(designerEnvManager.getMaxNumberOrPreviewRow()); + + maxPreviewNumberField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + DesignerEnvManager designerEnvManager = DesignerEnvManager.getEnvManager(); + designerEnvManager.setMaxNumberOrPreviewRow((int) ((UINumberField) evt.getSource()).getValue()); + } + }); + + Icon refreshImage = BaseUtils.readIcon("/com/fr/design/images/control/refresh.png"); + refreshLabel = new UILabel(refreshImage); + previewNumberPanel.add(refreshLabel); + refreshLabel.addMouseListener(new MouseAdapter() { + boolean mouseEntered = false; + boolean buttonPressed = false; + + public void mouseEntered(MouseEvent e) { // 当鼠标进入时候调用. + mouseEntered = true; + if (!buttonPressed) { + refreshLabel.setBackground(java.awt.Color.WHITE); + refreshLabel.setOpaque(true); + refreshLabel.setBorder(BorderFactory.createLineBorder(java.awt.Color.GRAY)); + } + } + + public void mouseExited(MouseEvent e) { + mouseEntered = false; + refreshLabel.setOpaque(false); + refreshLabel.setBorder(BorderFactory.createEmptyBorder()); + } + + public void mousePressed(MouseEvent e) { + buttonPressed = true; + refreshLabel.setBackground(java.awt.Color.lightGray); + } + + public void mouseReleased(MouseEvent e) { + buttonPressed = false; + if (mouseEntered) { + refreshLabel.setBackground(java.awt.Color.WHITE); + try { + populate(tableData); + if (storeProcedureDataModel != null) { + populateStoreDataSQL(); + } + } catch (Exception e1) { + } + } + } + }); + + preveiwTable = new SortableJTable(new TableSorter()); + preveiwTable.setRowSelectionAllowed(false); + preveiwTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + + this.add(new JScrollPane(preveiwTable), BorderLayout.CENTER); + if (this.dialog == null) { + this.dialog = this.showWindow(DesignerContext.getDesignerFrame()); + } + progressBar = new AutoProgressBar(this, Inter.getLocText("FR-Designer_Loading_Data"), "", 0, 100) { + public void doMonitorCanceled() { + if (getWorker() != null) { + getWorker().cancel(true); + } + getDialog().setVisible(false); + } + }; + } + + public AutoProgressBar getProgressBar() { + return this.progressBar; + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer_Preview"); + } + + private void addLoadedListener(LoadedEventListener l) { + listeners.add(l); + } + + private void fireLoadedListener() { + for (LoadedEventListener l : listeners) { + l.fireLoaded(); + } + } + + /** + * sets current row count. + * + * @param currentRows + */ + private void setCurrentRows(int currentRows) { + this.currentRowsField.setValue(currentRows); + } + + private void resetPreviewTableColumnColor() { + this.listeners.clear(); + + } + + public BasicDialog getDialog() { + return this.dialog; + } + + public SwingWorker getWorker() { + return this.worker; + } + + // elake:为预览表的columnIndex列着c色. + private void setPreviewTableColumnColor(final int columnIndex, final Color c) { + addLoadedListener(new LoadedEventListener() { + @Override + public void fireLoaded() { + TableColumn column = preveiwTable.getColumnModel().getColumn(columnIndex); + DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer() { + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + JComponent comp = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + comp.setBackground(c); + comp.setBorder(BorderFactory.createRaisedBevelBorder()); + return comp; + } + }; + column.setCellRenderer(cellRenderer); + } + }); + + } + + /** + * 重置面板 + */ + public static void resetPreviewTable() { + getInstance().preveiwTable = new SortableJTable(new TableSorter()); + getInstance().preveiwTable.setRowSelectionAllowed(false); + getInstance().preveiwTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + getInstance().progressBar.close(); + getInstance().repaint(); + } + + private void setModel(TableModel tableModel) { + TableSorter tableSorter = (TableSorter) preveiwTable.getModel(); + + tableSorter.setTableModel(tableModel); + + preveiwTable.getParent().validate(); + preveiwTable.repaint(); + } + + + /** + * 直接预览数据集,没有实际值和显示值 + * + * @param tableData tableData + */ + public static void previewTableData(TableData tableData) { + previewTableData(tableData, -1, -1); + } + + /** + * 预览数据集,keyIndex为实际值、valueIndex为显示值 + * + * @param tableData tableData + * @param keyIndex + * @param valueIndex + */ + public static EmbeddedTableData previewTableData(TableData tableData, final int keyIndex, final int valueIndex) { + PreviewTablePane previewTablePane = new PreviewTablePane(); + previewTablePane.setBorder(BorderFactory.createTitledBorder(Inter.getLocText("FR-Designer_Data"))); + try { + previewTablePane.populate(tableData); + previewTablePane.resetPreviewTableColumnColor(); + + if (keyIndex > -1) { + previewTablePane.setPreviewTableColumnColor(keyIndex, Color.getHSBColor(0, 204, 204)); + } + if (valueIndex > -1) { + previewTablePane.setPreviewTableColumnColor(valueIndex, Color.lightGray); + } + + } catch (Exception exp) { + previewTablePane.setModel(new PreviewTableModel((int) previewTablePane.maxPreviewNumberField.getValue())); + previewTablePane.showErrorMessage(exp); + } + if (!previewTablePane.dialog.isVisible()) { + previewTablePane.dialog.setVisible(true); + } + + return previewTablePane.previewTableData; + } + + private void showErrorMessage(Exception exp) { + String errMessage = exp.getLocalizedMessage(); + String columnErrMessage = errMessage.substring(0, errMessage.indexOf(">=")); + String tatolColumnErrMessage = errMessage.substring(errMessage.indexOf(">=") + 2); + try { + int choiceColumn = Integer.parseInt(columnErrMessage.trim()); + int tatalColumn = Integer.parseInt(tatolColumnErrMessage.trim()); + columnErrMessage = Inter.getLocText(new String[]{"Ser", String.valueOf(choiceColumn + 1), "Column_Does_Not_Exsit", ", ", "Total", String.valueOf(tatalColumn), "Column" + "!"}); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + return; + } + FRContext.getLogger().errorWithServerLevel(exp.getMessage(), exp); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), columnErrMessage, Inter.getLocText("FR-Designer_Error"), JOptionPane.ERROR_MESSAGE); + } + + private void populate(TableData tableData) throws Exception { + this.tableData = tableData; + + // p:直接预览. + if (tableData != null) { + previewTableDataSQL(); + } + } + + private void previewTableDataSQL() throws Exception { + connectionBar = new AutoProgressBar(this, Inter.getLocText("Utils-Now_create_connection"), "", 0, 100) { + public void doMonitorCanceled() { + getWorker().cancel(true); + getDialog().setVisible(false); + } + }; + setWorker(); + worker.execute(); + + } + + + private void setPreviewTableColumnValue(final Graphics g) { + for (int i = 0; i < preveiwTable.getColumnModel().getColumnCount(); i++) { + TableColumn column = preveiwTable.getColumnModel().getColumn(i); + DefaultTableCellRenderer cellRenderer = new DefaultTableCellRenderer() { + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + JComponent comp = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + Font f = table.getFont(); + + //默认在系统不支持 无法显示时 如自造的字 ,字体设置为空. + Font defaultShowFont = FRFont.getInstance("", f.getStyle(), f.getSize()); + if (value instanceof String) { + String str = (String) value; + for (int j = 0; j < str.length(); j++) { + char c = str.charAt(j); + if (!f.canDisplay(c)) { + table.setFont(defaultShowFont); + } + } + } + return comp; + } + }; + column.setCellRenderer(cellRenderer); + } + } + + + private void setWorker() { + + worker = new SwingWorker() { + protected PreviewTableModel doInBackground() throws Exception { + connectionBar.start(); + if (tableData instanceof DBTableData) { + boolean status = FRContext.getCurrentEnv().testConnection(((DBTableData) tableData).getDatabase()); + if (!status) { + connectionBar.close(); + throw new Exception(Inter.getLocText("Datasource-Connection_failed")); + } + } + connectionBar.close(); + TableDataSource dataSource = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().getTarget(); + previewTableData = DesignTableDataManager.previewTableDataNeedInputParameters(dataSource, tableData, (int) maxPreviewNumberField.getValue(), true); + // parameterInputDialog + // update之后的parameters,转成一个parameterMap,用于预览TableData + PreviewTableModel previewModel = new PreviewTableModel(previewTableData.createDataModel(null), (int) maxPreviewNumberField.getValue()); + for (int i = 0; i < previewTableData.getColumnCount(); i++) { + Class cls = previewTableData.getColumnClass(i); + if (cls == Date.class || cls == TIME.class || cls == Timestamp.class) { + previewModel.dateIndexs.add(i); + } + } + return previewModel; + } + + public void done() { + try { + PreviewTableModel model = get(); + setModel(model); + setCurrentRows(model.getRowCount()); + setPreviewTableColumnValue(getParent().getGraphics()); + fireLoadedListener(); + } catch (Exception e) { + if (!(e instanceof CancellationException)) { + FRContext.getLogger().error(e.getMessage(), e); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage()); + } + dialog.setVisible(false); + } finally { + progressBar.close(); + } + } + }; + } + + /** + * 直接预览存储过程的一个返回数据集,没有实际值和显示值 + * + * @param storeProcedureDataModel storeProcedureDataModel + */ + public static void previewStoreData(ProcedureDataModel storeProcedureDataModel) { + previewStoreData(storeProcedureDataModel, -1, -1); + } + + /** + * 预览存储过程的一个返回数据集,keyIndex为实际值、valueIndex为显示值 + * + * @param storeProcedureDataModel storeProcedureDataModel + * @param keyIndex 实际值 + * @param valueIndex 显示值 + */ + public static void previewStoreData(final ProcedureDataModel storeProcedureDataModel, final int keyIndex, final int valueIndex) { + final PreviewTablePane previewTablePane = new PreviewTablePane(); + previewTablePane.storeProcedureDataModel = storeProcedureDataModel; + previewTablePane.setBorder(BorderFactory.createTitledBorder(Inter.getLocText("FR-Designer_Data"))); + + try { + previewTablePane.populateStoreDataSQL(); + previewTablePane.resetPreviewTableColumnColor(); + + if (keyIndex > -1) { + previewTablePane.setPreviewTableColumnColor(keyIndex, Color.getHSBColor(0, 204, 204)); + } + if (valueIndex > -1) { + previewTablePane.setPreviewTableColumnColor(valueIndex, Color.lightGray); + } + + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + previewTablePane.fireLoadedListener(); + previewTablePane.showWindow(DesignerContext.getDesignerFrame()).setVisible(true); + } + + /** + * 直接预览存储过程的所有返回数据集,没有实际值和显示值 + * + * @param storeProcedureDataModels storeProcedureDataModels + */ + public static void previewStoreDataWithAllDs(ProcedureDataModel[] storeProcedureDataModels) { + UITabbedPane tabPreviewpane = new UITabbedPane(); + int tableSize = storeProcedureDataModels.length; + for (int i = 0; i < tableSize; i++) { + PreviewTablePane previewTablePane = new PreviewTablePane(); + previewTablePane.storeProcedureDataModel = storeProcedureDataModels[i]; + previewTablePane.setBorder(BorderFactory.createTitledBorder(Inter.getLocText("FR-Designer_Data"))); + try { + previewTablePane.populateStoreDataSQL(); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + tabPreviewpane.addTab(storeProcedureDataModels[i].getName(), previewTablePane); + } + + BasicPane prieviewPane = new BasicPane() { + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer_Preview"); + } + + }; + prieviewPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + prieviewPane.add(tabPreviewpane, BorderLayout.CENTER); + prieviewPane.showWindow(DesignerContext.getDesignerFrame()).setVisible(true); + } + + private void populateStoreDataSQL() throws Exception { + PreviewTableModel previewModel; + try { + previewModel = new PreviewTableModel(storeProcedureDataModel, (int) maxPreviewNumberField.getValue()); + } catch (Exception e) { + previewModel = new PreviewTableModel((int) maxPreviewNumberField.getValue()); + } + setModel(previewModel); + setCurrentRows(previewModel.getRowCount()); + fireLoadedListener(); + + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/data/datapane/sqlpane/SQLEditPane.java b/designer-base/src/com/fr/design/data/datapane/sqlpane/SQLEditPane.java similarity index 100% rename from designer_base/src/com/fr/design/data/datapane/sqlpane/SQLEditPane.java rename to designer-base/src/com/fr/design/data/datapane/sqlpane/SQLEditPane.java diff --git a/designer-base/src/com/fr/design/data/tabledata/Prepare4DataSourceChange.java b/designer-base/src/com/fr/design/data/tabledata/Prepare4DataSourceChange.java new file mode 100644 index 0000000000..eb3c262beb --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/Prepare4DataSourceChange.java @@ -0,0 +1,15 @@ +package com.fr.design.data.tabledata; + +/** + * Created with IntelliJ IDEA. + * User: 小灰灰 + * Date: 13-8-5 + * Time: 上午11:23 + * To change this template use File | Settings | File Templates. + */ +public interface Prepare4DataSourceChange { + /** + *注册listener,相应数据集改变 + */ + public void registerDSChangeListener (); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/ResponseDataSourceChange.java b/designer-base/src/com/fr/design/data/tabledata/ResponseDataSourceChange.java new file mode 100644 index 0000000000..e995d9cceb --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/ResponseDataSourceChange.java @@ -0,0 +1,25 @@ +package com.fr.design.data.tabledata; + +import java.util.Map; + +/** + * Created with IntelliJ IDEA. + * User: 小灰灰 + * Date: 13-8-5 + * Time: 上午11:24 + * To change this template use File | Settings | File Templates. + */ +public interface ResponseDataSourceChange { + + /** + * 响应数据集改变 + */ + public void fireDSChanged(); + + /** + * 响应数据集改变 + */ + public void fireDSChanged(Map map); + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/StoreProcedureWorkerListener.java b/designer-base/src/com/fr/design/data/tabledata/StoreProcedureWorkerListener.java new file mode 100644 index 0000000000..111dd46adb --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/StoreProcedureWorkerListener.java @@ -0,0 +1,14 @@ +package com.fr.design.data.tabledata; + +/** + * Created by IntelliJ IDEA. + * Author : Richer + * Version: 6.5.6 + * Date: 13-12-5 + * Time: 上午10:09 + */ +public interface StoreProcedureWorkerListener { + + public void fireDoneAction(); + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/gui/CONTENT.txt b/designer-base/src/com/fr/design/data/tabledata/gui/CONTENT.txt new file mode 100644 index 0000000000..0499d8caf5 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/gui/CONTENT.txt @@ -0,0 +1,14 @@ + ʹSAPݼȡǰҪһɳɹӵSAPӡ + ӺSAPݼȡ,ֲͬȡֶΡ + 1.Զ壺 + ʹԶȡֱӵABAP FunctionԻȡݡ + бУɸfunctionһһҷݼͨݼֵ + бУĿǰֻѡһΪݼĽʹá + 2.ͨòѯ + ʹüͨòѯֱӻȡSAPijһ͸ݡ + ע⣬ֵ֧ѯ + ɼ${abc}Ϊһ÷ͬݿݼ + 3.ͨòѯ(ECC 6ϰ汾) + ʹͨòѯԽжӲѯ + ע⣬˹ֻ֧SAP 6ϰ汾Ҫҷĵе˵SAPϵͳӦFunction + ɼ${abc}Ϊһ÷ͬݿݼ diff --git a/designer-base/src/com/fr/design/data/tabledata/gui/EXPLAN1.txt b/designer-base/src/com/fr/design/data/tabledata/gui/EXPLAN1.txt new file mode 100644 index 0000000000..3504c33d9b --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/gui/EXPLAN1.txt @@ -0,0 +1,6 @@ + Where﷨ʽοOPEN SQL﷨ + : + Column1 = 'ABC' AND Column2 > 100 + AND Column3 LIKE 'DES%' + AND Column4 BETWEEN 1995 AND 2000 + AND Column5 IN (1,2,3,4,5); diff --git a/designer-base/src/com/fr/design/data/tabledata/gui/EXPLAN2.txt b/designer-base/src/com/fr/design/data/tabledata/gui/EXPLAN2.txt new file mode 100644 index 0000000000..243de20dcc --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/gui/EXPLAN2.txt @@ -0,0 +1,17 @@ + ﷨ʽοOPEN SQL﷨ + 磺 + Select : + employees~pernr, adr~vorna, adr~nachn, orgnam~orgtx + From : + pa0003 AS employees + INNER JOIN pa0000 AS status ON employees~pernr = status~pernr + INNER JOIN pa0001 AS org ON employees~pernr = org~pernr + INNER JOIN pa0002 AS adr ON employees~pernr = adr~pernr + INNER JOIN t527x AS orgnam ON org~orgeh = orgnam~orgeh + INNER JOIN t002 AS lang ON orgnam~sprsl = lang~spras + Where : + status~stat2 >= '2' AND status~endda > sy-datum AND + org~endda > sy-datum AND + adr~endda > sy-datum AND + lang~laiso = 'EN' + ע~.where֧ͬ BETWEEN LIKE INš diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/AbstractTableDataPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/AbstractTableDataPane.java new file mode 100644 index 0000000000..30ea0d0e83 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/AbstractTableDataPane.java @@ -0,0 +1,15 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import com.fr.base.TableData; +import com.fr.design.data.tabledata.StoreProcedureWorkerListener; +import com.fr.design.beans.BasicBeanPane; + +public abstract class AbstractTableDataPane extends BasicBeanPane { + + public void addStoreProcedureWorkerListener(StoreProcedureWorkerListener listener) { + } + + public void removeStoreProcedureWorkerListener() { + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/AutoStoreProcedureTableModel.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/AutoStoreProcedureTableModel.java new file mode 100644 index 0000000000..c6a7bc0cad --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/AutoStoreProcedureTableModel.java @@ -0,0 +1,158 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import com.fr.base.BaseFormula; +import com.fr.base.StoreProcedureParameter; +import com.fr.design.editor.ValueEditorPane; +import com.fr.design.editor.ValueEditorPaneFactory; +import com.fr.design.editor.editor.CursorEditor; +import com.fr.design.gui.itableeditorpane.ParameterTableModel; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; + +import javax.swing.*; +import javax.swing.event.CellEditorListener; +import javax.swing.event.ChangeEvent; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableCellEditor; +import java.awt.*; +import java.util.Date; +import java.util.TimerTask; + + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-5-24 + * Time: 下午1:07 + * To change this template use File | Settings | File Templates. + */ +public class AutoStoreProcedureTableModel extends StoreProcedureTableModel { + + public AutoStoreProcedureTableModel() { + super(); + Class[] classes = new Class[]{ParameterTableModel.ParameterEditor.class, getColumnClass(1), getColumnClass(2), StoreProcedureParameterValueEditor.class}; + this.setColumnClass(classes); + this.setDefaultEditor(StoreProcedureParameterValueEditor.class, new StoreProcedureParameterValueEditor()); + this.setDefaultEditor(ParameterTableModel.ParameterEditor.class, new ParameterTableModel().new ParameterEditor()); + this.setDefaultRenderer(StoreProcedureParameterValueEditor.class, new ProcedureParameterValueRenderer()); + } + public boolean isCellEditable(int row, int col) { + if (ComparatorUtils.equals(getValueAt(row, col -1), "OUT")) { + return false; + } + if (col ==0 || col == 3) { + return true; + } + return false; + } + + public boolean shouldResponseDoubleClickAction () { + return false; + } + + private class StoreProcedureParameterValueEditor extends AbstractCellEditor implements TableCellEditor { + private ValueEditorPane editor; + + public StoreProcedureParameterValueEditor() { + + editor = ValueEditorPaneFactory.createStoreProcedValueEditorPane(); + editor.getMenu().addPopupMenuListener(new PopupMenuListener() { + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + + } + + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + new java.util.Timer().schedule(new TimerTask() { + public void run() { + int selectedRow = table.getSelectedRow(); + if (selectedRow != -1) { + StoreProcedureParameter para = getList().get(selectedRow); + para.setType(getParameterType(getCellEditorValue())); + fireTableDataChanged(); + table.setRowSelectionInterval(selectedRow, selectedRow); + } + } + }, 100); + } + + public void popupMenuCanceled(PopupMenuEvent e) { + + } + }); + this.addCellEditorListener(new CellEditorListener() { + + @Override + public void editingCanceled(ChangeEvent e) { + + } + + @Override + public void editingStopped(ChangeEvent e) { + if (table.getSelectedRow() == -1) { + return; + } + StoreProcedureParameter para = getList().get(table.getSelectedRow()); + para.setValue(getCellEditorValue()); + para.setType(getParameterType(getCellEditorValue())); + fireTableDataChanged(); + } + }); + } + + @Override + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { + editor.populate(value == null ? "" : value); + return editor; + } + + @Override + public Object getCellEditorValue() { + return editor.update(); + } + + } + + private int getParameterType (Object value) { + String type; + if(value instanceof CursorEditor) + type= Inter.getLocText("Cursor"); + else if(value instanceof String ){ + if(((String) value).length() > 0 && ((String) value).charAt(0) == '=') + type = Inter.getLocText("Formula"); + else + type = Inter.getLocText("Parameter-String"); + }else if(value instanceof Integer) + type = Inter.getLocText("Integer"); + else if(value instanceof Double) + type = Inter.getLocText("Double"); + else if(value instanceof Date) + type = Inter.getLocText("Date"); + else if(value instanceof Boolean) + type = Inter.getLocText("Parameter-Boolean"); + else if(value instanceof BaseFormula) + type = Inter.getLocText("Formula"); + else + type = Inter.getLocText("Parameter-String"); + return StoreProcedureParameterPane.getInfo4Value(type); + + } + + private class ProcedureParameterValueRenderer extends DefaultTableCellRenderer { + private static final long serialVersionUID = 1L; + private ValueEditorPane editor; + + public ProcedureParameterValueRenderer() { + editor = ValueEditorPaneFactory.createStoreProcedValueEditorPane(); + } + + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + editor.setCurrentEditor(0); + editor.populate(value); + return editor; + } + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/ClassNameSelectPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/ClassNameSelectPane.java new file mode 100644 index 0000000000..1eed1bb428 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/ClassNameSelectPane.java @@ -0,0 +1,63 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import java.awt.BorderLayout; + +import javax.swing.BorderFactory; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.tree.TreeSelectionModel; + +import com.fr.base.FRContext; +import com.fr.design.gui.itree.filetree.ClassFileTree; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.dialog.BasicPane; +import com.fr.general.Inter; + +public class ClassNameSelectPane extends BasicPane { + private ClassFileTree classFileTree; + + public ClassNameSelectPane() { + this.setLayout(new BorderLayout(0, 4)); + + JPanel webDirectoryPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.add(webDirectoryPane, BorderLayout.NORTH); + webDirectoryPane.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); + webDirectoryPane.add(new UILabel( + Inter.getLocText("Function-Choose_Function_Class") + ":")); + + classFileTree = new ClassFileTree(); + classFileTree.refreshEnv(FRContext.getCurrentEnv()); + classFileTree.getSelectionModel().setSelectionMode( + TreeSelectionModel.SINGLE_TREE_SELECTION); + this.add(new JScrollPane(classFileTree), BorderLayout.CENTER); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("Function-Function_Class_Name"); + } + + /* + * 选中某ClassPath + */ + public void setClassPath(String classPath) { + + classFileTree.setSelectedClassPath(classPath + ".class"); + } + + /* + * 返回选中的ClassPath + */ + public String getClassPath() { + return classFileTree.getSelectedClassPath(); + } + + @Override + public void checkValid() throws Exception { + String classPath = classFileTree.getSelectedClassPath(); + if (classPath == null) { + throw new Exception(Inter.getLocText("Function-The_selected_file_cannot_be_null")); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java new file mode 100644 index 0000000000..978e5b9502 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/ClassTableDataPane.java @@ -0,0 +1,177 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import com.fr.base.Parameter; +import com.fr.data.impl.ClassTableData; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.formula.JavaEditorPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itableeditorpane.ParameterTableModel; +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableEditorPane; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.general.IOUtils; +import com.fr.general.Inter; +import com.fr.script.Calculator; +import com.fr.stable.ParameterProvider; +import com.fr.stable.project.ProjectConstants; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; + +public class ClassTableDataPane extends AbstractTableDataPane { + private UITextField classNameTextField; + private UITableEditorPane editorPane; + + public ClassTableDataPane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + + // TableLayout + double p = TableLayout.PREFERRED; + + double[] rowSize = {p, p, p, p}; + double[] columnSize = {p, p}; + //Reportlet. + JPanel reportletNamePane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); + classNameTextField = new UITextField(36); + reportletNamePane.add(classNameTextField); + + UIButton browserButton = new UIButton(Inter.getLocText("Select")); + browserButton.setPreferredSize(new Dimension( + browserButton.getPreferredSize().width, + classNameTextField.getPreferredSize().height)); + reportletNamePane.add(browserButton); + browserButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + final ClassNameSelectPane bPane = new ClassNameSelectPane(); + bPane.setClassPath(classNameTextField.getText()); + BasicDialog dlg= bPane.showWindow( + (Dialog) SwingUtilities.getWindowAncestor(ClassTableDataPane.this), + new DialogActionAdapter() { + public void doOk() { + classNameTextField.setText(bPane.getClassPath()); + } + }); + dlg.setVisible(true); + } + }); + UIButton editButton = new UIButton(Inter.getLocText("Edit")); + editButton.setPreferredSize(new Dimension( + editButton.getPreferredSize().width, + classNameTextField.getPreferredSize().height)); + reportletNamePane.add(editButton); + editButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + final JavaEditorPane javaEditorPane = new JavaEditorPane(classNameTextField.getText(), JavaEditorPane.DEFAULT_TABLEDATA_STRING); + final BasicDialog dlg = javaEditorPane.showMediumWindow(SwingUtilities.getWindowAncestor(ClassTableDataPane.this), + new DialogActionAdapter() { + public void doOk() { + classNameTextField.setText(javaEditorPane.getClassText()); + } + }); + + javaEditorPane.addSaveActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dlg.doOK(); + } + }); + dlg.setVisible(true); + } + }); + + Component[][] components = { + {new UILabel(Inter.getLocText("DS-Class_Name") + ":"), reportletNamePane}, + {null, new UILabel(Inter.getLocText("Function-The_class_must_implement_the_interface") + "\"com.fr.data.Tabledata\"")}, + {null, new UILabel(Inter.getLocText("Example") + ":\"com.fr.data.impl.ArrayTableData\"")}, + {null,new UILabel(Inter.getLocText(new String[]{"Function-The_class_must_be_located_in","Function-J2EE_server"}, + new String[]{" ","\"",File.separator,ProjectConstants.WEBINF_NAME,File.separator,"classes\""}))} + }; + JPanel northPane = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + this.add(northPane, BorderLayout.NORTH); + this.add(initSouthPanel(), BorderLayout.SOUTH); + } + private JPanel initSouthPanel() { + JPanel jpanel = new JPanel(); + jpanel.setPreferredSize(new Dimension(-1, 150)); + jpanel.setLayout(new BorderLayout()); + + editorPane = new UITableEditorPane(new ParameterTableModel() { + @Override + public UITableEditAction[] createAction() { + return new UITableEditAction[]{ + new AddParaAction(), + new RemoveParaAction() + }; + } + }, " " + Inter.getLocText("FR-Designer_TableData-Default-Para")); + + jpanel.add(editorPane, BorderLayout.CENTER); + + return jpanel; + } + + public class AddParaAction extends UITableEditAction { + public AddParaAction() { + this.setName(Inter.getLocText("FR-Designer_Add")); + this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); + } + + public void actionPerformed(ActionEvent e) { + java.util.List oldParas = editorPane.update(); + oldParas.add(new Parameter()); + editorPane.populate(oldParas.toArray(new ParameterProvider[oldParas.size()])); + } + + @Override + public void checkEnabled() { + } + } + private class RemoveParaAction extends UITableEditAction { + public RemoveParaAction() { + this.setName(Inter.getLocText("FR-Designer_Remove")); + this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/control/remove.png")); + } + + public void actionPerformed(ActionEvent e) { + ParameterProvider selectedPara = editorPane.getTableModel().getSelectedValue(); + java.util.List oldParas = editorPane.update(); + oldParas.remove(selectedPara); + editorPane.populate(oldParas.toArray(new ParameterProvider[oldParas.size()])); + } + + @Override + public void checkEnabled() { + } + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("DS-Class_TableData"); + } + + @Override + public void populateBean(ClassTableData ob) { + this.editorPane.populate(ob.getParameters(Calculator.createCalculator())); + this.classNameTextField.setText(ob.getClassName()); + } + + @Override + public ClassTableData updateBean() { + ClassTableData tableData = new ClassTableData(this.classNameTextField.getText()); + java.util.List paras = this.editorPane.update(); + tableData.setParameters(paras.toArray(new ParameterProvider[paras.size()])); + + return tableData; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/CustomDictModel.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/CustomDictModel.java new file mode 100644 index 0000000000..fdf44df23e --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/CustomDictModel.java @@ -0,0 +1,130 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.AbstractCellEditor; +import javax.swing.JTable; +import javax.swing.event.CellEditorListener; +import javax.swing.event.ChangeEvent; +import javax.swing.table.TableCellEditor; + +import com.fr.design.gui.itableeditorpane.ActionStyle; +import com.fr.design.gui.itableeditorpane.UIArrayTableModel; +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableModelAdapter; +import com.fr.design.gui.itextfield.UITextField; + +public class CustomDictModel extends UITableModelAdapter implements ActionStyle { + /** + * + */ + private static final long serialVersionUID = 1L; + private int[] array; + private ActionListener actionListener; + + public CustomDictModel(String[] s, int[] array, ActionListener actionListener) { + super(s); + this.array = array; + this.actionListener = actionListener; + this.setColumnClass(new Class[] { ParameterEditor.class, ParameterEditor.class }); + this.setDefaultEditor(ParameterEditor.class, new ParameterEditor()); + } + + public Object getValueAt(int row, int column) { + Object[] os = this.getList().get(row); + return os[column]; + } + + public void setValueAt(Object value, int row, int column) { + Object[] os = this.getList().get(row); + os[column] = value; + } + + public boolean isCellEditable(int row, int col) { + return true; + } + + @Override + public void fireTableDataChanged() { + super.fireTableDataChanged(); + if (actionListener != null) { + actionListener.actionPerformed(null); + } + } + + @Override + public UITableEditAction[] createAction() { + List list = new ArrayList(); + UITableEditAction[] tableEditAction = new UITableEditAction[array.length]; + for (int i : array) { + switch (i) { + case UIArrayTableModel.ADDSTYLE: + list.add(new AddRow()); + break; + case UIArrayTableModel.ADDJSFILE: + break; + case UIArrayTableModel.ADDCSSFILE: + break; + case UIArrayTableModel.DELETESTYLE: + list.add(new DeleteAction()); + break; + case UIArrayTableModel.MOVEUPSTYLE: + list.add(new MoveUpAction()); + break; + case UIArrayTableModel.MOVEDOWNSTYLE: + list.add(new MoveDownAction()); + break; + + } + } + return list.toArray(tableEditAction); + } + + public class AddRow extends AddTableRowAction { + @Override + public void actionPerformed(ActionEvent e) { + super.actionPerformed(e); + addRow(new Object[getColumnCount()]); + fireTableDataChanged(); + } + } + + class ParameterEditor extends AbstractCellEditor implements TableCellEditor { + + private static final long serialVersionUID = 1L; + private UITextField textField; + + public ParameterEditor() { + textField = new UITextField(); + this.addCellEditorListener(new CellEditorListener() { + + @Override + public void editingCanceled(ChangeEvent e) { + + } + + @Override + public void editingStopped(ChangeEvent e) { + if (actionListener != null) { + actionListener.actionPerformed(null); + } + } + }); + } + + @Override + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { + textField.setText((String) value); + return textField; + } + + @Override + public Object getCellEditorValue() { + return textField.getText(); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java new file mode 100644 index 0000000000..40bc993a44 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java @@ -0,0 +1,388 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.base.Parameter; +import com.fr.base.ParameterHelper; +import com.fr.data.core.db.TableProcedure; +import com.fr.data.impl.AbstractDatabaseConnection; +import com.fr.data.impl.Connection; +import com.fr.data.impl.DBTableData; +import com.fr.data.impl.JDBCDatabaseConnection; +import com.fr.data.impl.JNDIDatabaseConnection; +import com.fr.data.impl.NameDatabaseConnection; +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.actions.UpdateAction; +import com.fr.design.border.UIRoundedBorder; +import com.fr.design.constants.UIConstants; +import com.fr.design.data.datapane.connect.ConnectionTableProcedurePane; +import com.fr.design.data.datapane.connect.ConnectionTableProcedurePane.DoubleClickSelectedNodeOnTreeListener; +import com.fr.design.data.datapane.preview.PreviewTablePane; +import com.fr.design.data.datapane.sqlpane.SQLEditPane; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.BasicPane; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.fun.DBTableDataMenuHandler; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itableeditorpane.ParameterTableModel; +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableEditorPane; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants; +import com.fr.design.gui.syntax.ui.rtextarea.RTextScrollPane; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.menu.SeparatorDef; +import com.fr.design.menu.ToolBarDef; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.general.sql.SqlUtils; +import com.fr.script.Calculator; +import com.fr.stable.ArrayUtils; +import com.fr.stable.ParameterProvider; +import com.fr.stable.StringUtils; +import org.sqlite.JDBC; + +import javax.swing.*; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.util.ArrayList; +import java.util.List; + +public class DBTableDataPane extends AbstractTableDataPane { + private static final int BOTTOM = 6; + private static final String PREVIEW_BUTTON = Inter.getLocText("FR-Designer_Preview"); + private static final String REFRESH_BUTTON = Inter.getLocText("FR-Designer_Refresh"); + private ConnectionTableProcedurePane connectionTableProcedurePane; + private UITableEditorPane editorPane; + + private DBTableDataMenuHandler dbTableDataMenuHandler; + private SQLEditPane sqlTextPane; + private UICheckBox isShareCheckBox; + private MaxMemRowCountPanel maxPanel; + private String pageQuery = null; + private DBTableData dbTableData; + + private void init() { + this.setLayout(new BorderLayout(4, 4)); + + sqlTextPane = new SQLEditPane(); + sqlTextPane.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_SQL); + + ParameterTableModel model = new ParameterTableModel() { + @Override + public UITableEditAction[] createAction() { + return (UITableEditAction[]) ArrayUtils.add(super.createDBTableAction(), new RefreshAction()); + } + }; + editorPane = new UITableEditorPane(model); + + // 左边的Panel,上面是选择DatabaseConnection的ComboBox,下面DatabaseConnection对应的Table + connectionTableProcedurePane = new ConnectionTableProcedurePane() { + @Override + protected void filter(Connection connection, String conName, List nameList) { + connection.addConnection(nameList, conName, new Class[]{JDBCDatabaseConnection.class, JNDIDatabaseConnection.class}); + } + }; + connectionTableProcedurePane.addDoubleClickListener(new DoubleClickSelectedNodeOnTreeListener() { + + @Override + public void actionPerformed(TableProcedure target) { + Document document = sqlTextPane.getDocument(); + try { + document.insertString(sqlTextPane.getCaretPosition(), target.toString(), null); + } catch (BadLocationException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + // 这里开始作色,本来可以给sqlTextPane添加DocumentListener来实现的, + // 后来发现insertString的时候,锁定了JTextPane,不能调用setXXX来作色,先这样了. +// sqlTextPane.syntaxTexts(); + sqlTextPane.requestFocus(); + } + }); + sqlTextPane.addFocusListener(new FocusListener() { + public void focusGained(FocusEvent e) { + // unsupport + } + + public void focusLost(FocusEvent e) { + if (isPreviewOrRefreshButton(e)) { + checkParameter(); + } + } + }); + } + + + private void initMainSplitPane() { + Box box = new Box(BoxLayout.Y_AXIS); + + + JPanel northPane = new JPanel(new BorderLayout(4, 4)); + JToolBar editToolBar = createToolBar(); + northPane.add(editToolBar, BorderLayout.CENTER); + northPane.setBorder(BorderFactory.createEmptyBorder(0, 0, BOTTOM, 0)); + + RTextScrollPane sqlTextScrollPane = new RTextScrollPane(sqlTextPane); + sqlTextScrollPane.setLineNumbersEnabled(true); + sqlTextScrollPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); + sqlTextScrollPane.setPreferredSize(new Dimension(680, 600)); + + JPanel paraMeanPane = new JPanel(new BorderLayout()); + paraMeanPane.setPreferredSize(new Dimension(680, 90)); + UILabel paraMean = new UILabel(Inter.getLocText("FR-Designer-Datasource-Param_DES")); + paraMeanPane.add(paraMean, BorderLayout.CENTER); + + + box.add(northPane); + box.add(sqlTextScrollPane); + box.add(paraMeanPane); + box.add(editorPane); + + JPanel sqlSplitPane = new JPanel(new BorderLayout(4, 4)); + sqlSplitPane.add(box, BorderLayout.CENTER); + + + box.setMinimumSize(new Dimension(310, 400)); + // 使用SplitPane + JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, connectionTableProcedurePane, sqlSplitPane); + mainSplitPane.setBorder(BorderFactory.createLineBorder(GUICoreUtils.getTitleLineBorderColor())); + mainSplitPane.setOneTouchExpandable(true); + this.add(mainSplitPane, BorderLayout.CENTER); + } + + public DBTableDataPane() { + init(); + initMainSplitPane(); + } + + + + private boolean isPreviewOrRefreshButton (FocusEvent e) { + if (e.getOppositeComponent() != null) { + String name = e.getOppositeComponent().getName(); + return ComparatorUtils.equals(name, PREVIEW_BUTTON) || ComparatorUtils.equals(name, REFRESH_BUTTON); + } + return false; + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer-DS-Database_Query"); + } + + private void refresh() { + String[] paramTexts = new String[2]; + paramTexts[0] = SqlUtils.tryPureSqlText(sqlTextPane.getText()); + paramTexts[1] = SqlUtils.tryPureSqlText(pageQuery); + List existParameterList = editorPane.update(); + Parameter[] ps = existParameterList == null ? new Parameter[0] : existParameterList.toArray(new Parameter[existParameterList.size()]); + + editorPane.populate(ParameterHelper.analyzeAndUnionSameParameters(paramTexts, ps)); + } + + private JToolBar createToolBar() { + // p:工具栏. + ToolBarDef toolBarDef = new ToolBarDef(); + toolBarDef.addShortCut(new PreviewAction()); + toolBarDef.addShortCut(SeparatorDef.DEFAULT); + toolBarDef.addShortCut(new EditPageQueryAction()); + dbTableDataMenuHandler = ExtraDesignClassManager.getInstance().getSingle(DBTableDataMenuHandler.MARK_STRING); + if (dbTableDataMenuHandler != null) { + toolBarDef.addShortCut(SeparatorDef.DEFAULT); + toolBarDef.addShortCut(dbTableDataMenuHandler.createQueryAction()); + } + isShareCheckBox = new UICheckBox(Inter.getLocText("FR-Designer_Is_Share_DBTableData")); + isShareCheckBox.setBackground(Color.WHITE); + maxPanel = new MaxMemRowCountPanel(); + maxPanel.setBorder(null); + UIToolbar editToolBar = ToolBarDef.createJToolBar(); + toolBarDef.updateToolBar(editToolBar); + editToolBar.add(isShareCheckBox); + editToolBar.add(maxPanel); + return editToolBar; + } + + private void checkParameter() { + String[] paramTexts = new String[2]; + paramTexts[0] = sqlTextPane.getText(); + paramTexts[1] = pageQuery; + Parameter[] parameters = ParameterHelper.analyze4Parameters(paramTexts, false); + + if (parameters.length < 1 && editorPane.update().size() < 1) { + return; + } + boolean isIn = true; + List list = editorPane.update(); + List name = new ArrayList(); + for (int i = 0; i < list.size(); i++) { + name.add(list.get(i).getName()); + } + for (int i = 0; i < parameters.length; i++) { + if (!name.contains(parameters[i].getName())) { + isIn = false; + break; + } + } + if (list.size() == parameters.length && isIn) { + return; + } + // bug:34175 删了是否刷新对话框, 均直接刷新 + refresh(); + } + + @Override + public void populateBean(DBTableData dbtabledata) { + this.dbTableData = dbtabledata; + if (dbTableDataMenuHandler != null) { + dbTableDataMenuHandler.populate(dbtabledata); + } + ParameterProvider[] parameters = null; + + Calculator c = Calculator.createCalculator(); + + parameters = dbtabledata.getParameters(c); + editorPane.populate(parameters); + + com.fr.data.impl.Connection db = null; + String query = null; + boolean isShare = false; + int maxMemeryRow = -1; + + db = dbtabledata.getDatabase(); + query = dbtabledata.getQuery(); + isShare = dbtabledata.isShare(); + maxMemeryRow = dbtabledata.getMaxMemRowCount(); + this.pageQuery = dbtabledata.getPageQuerySql(); + this.connectionTableProcedurePane.setSelectedDatabaseConnection(db); + this.sqlTextPane.setText(query); + this.sqlTextPane.requestFocus(); + this.sqlTextPane.moveCaretPosition(this.sqlTextPane.getCaretPosition()); + + isShareCheckBox.setSelected(isShare); + maxPanel.setValue(maxMemeryRow); + } + + @Override + public DBTableData updateBean() { + String dbName = this.connectionTableProcedurePane.getSelectedDatabaseConnnectonName(); + if (StringUtils.isBlank(dbName) || StringUtils.isBlank(this.sqlTextPane.getText())) { + try { + throw new Exception(Inter.getLocText("FR-Designer_Connect_SQL_Cannot_Null") + "."); + } catch (Exception e) { + // JOptionPane.showMessageDialog(DBTableDataPane.this, + // Inter.getLocText("Connect_SQL_Cannot_Null") + "."); + } + } + + List parameterList = editorPane.update(); + Parameter[] parameters = parameterList.toArray(new Parameter[parameterList.size()]); + + dbTableData.setDatabase(new NameDatabaseConnection(dbName)); + + // p:必须先设置Parameters数组,因为setQuery里面会自动设置的 + + dbTableData.setParameters(parameters); + dbTableData.setQuery(this.sqlTextPane.getText()); + + dbTableData.setShare(isShareCheckBox.isSelected()); + dbTableData.setMaxMemRowCount(maxPanel.getValue()); + dbTableData.setPageQuerySql(this.pageQuery); + if (dbTableDataMenuHandler != null) { + dbTableDataMenuHandler.update(); + } + return dbTableData; + } + + protected class RefreshAction extends UITableEditAction { + public RefreshAction() { + this.setName(REFRESH_BUTTON); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + } + + public void actionPerformed(ActionEvent e) { + refresh(); + } + + @Override + public void checkEnabled() { + // unsupport + } + } + + private class PreviewAction extends UpdateAction { + public PreviewAction() { + this.setName(PREVIEW_BUTTON); + this.setMnemonic('P'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/preview.png")); + } + + public void actionPerformed(ActionEvent evt) { + checkParameter(); + PreviewTablePane.previewTableData(DBTableDataPane.this.updateBean()); + } + } + + private class EditPageQueryAction extends UpdateAction { + public EditPageQueryAction() { + this.setName(Inter.getLocText("FR-Designer-LayerPageReport_PageQuery")); + this.setMnemonic('L'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/text.png")); + } + + public void actionPerformed(ActionEvent e) { + final QueryPane pane = new QueryPane(Inter.getLocText("FR-Designer-LayerPageReport_Define_PageQuerySQL")); + pane.populate(pageQuery); + BasicDialog dialog = pane.showWindow(DesignerContext.getDesignerFrame()); + dialog.addDialogActionListener(new DialogActionAdapter() { + public void doOk() { + pageQuery = pane.update(); + checkParameter(); + } + }); + dialog.setVisible(true); + } + } + + private class QueryPane extends BasicPane { + private SQLEditPane pageQueryPane; + private String title; + + public QueryPane(String title) { + this.title = title; + this.initComponents(); + } + + public void initComponents() { + this.setLayout(new BorderLayout()); + pageQueryPane = new SQLEditPane(); + this.add(new JScrollPane(pageQueryPane)); + } + + public void populate(String text) { + if (StringUtils.isBlank(text)) { + return; + } + pageQueryPane.setText(text); + } + + public String update() { + String text = pageQueryPane.getText(); + if (StringUtils.isBlank(text)) { + return null; + } else { + return text; + } + } + + @Override + protected String title4PopupWindow() { + return title; + } + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/data/tabledata/tabledatapane/DecoratedTableDataPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/DecoratedTableDataPane.java similarity index 100% rename from designer_base/src/com/fr/design/data/tabledata/tabledatapane/DecoratedTableDataPane.java rename to designer-base/src/com/fr/design/data/tabledata/tabledatapane/DecoratedTableDataPane.java diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataDefinedPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataDefinedPane.java new file mode 100644 index 0000000000..f3436864b3 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataDefinedPane.java @@ -0,0 +1,321 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Date; + +import javax.swing.DefaultCellEditor; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableColumn; + +import com.fr.base.FRContext; +import com.fr.data.impl.EmbeddedTableData; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.dialog.BasicPane; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; + +public class EmbeddedTableDataDefinedPane extends BasicPane{ + + private EmbeddedTableData tableData; + private JTable dataJTable; + private UIButton add; + private UIButton del; + + private static String[] TYPE = { + Inter.getLocText("String"), + Inter.getLocText("Integer"), + Inter.getLocText("Double"), + Inter.getLocText("Date") + }; + + public EmbeddedTableDataDefinedPane() { + initComponents(); + } + + protected void initComponents() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + dataJTable = new JTable(new EmbeddedTableDataDefinedPane.EmbeddedTableDefinedModel(new EmbeddedTableData())); + JScrollPane scrollPane = new JScrollPane(dataJTable); + this.add(scrollPane, BorderLayout.CENTER); + dataJTable.setRowSelectionAllowed(true); + dataJTable.setColumnSelectionAllowed(true); + + // 类型选择 + UIComboBox typeBox = new UIComboBox(TYPE); + dataJTable.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(typeBox)); + + // 单击编辑 + TableCellEditor tableCellEditor = dataJTable.getDefaultEditor(String.class); + if (tableCellEditor != null) { + (( DefaultCellEditor) tableCellEditor).setClickCountToStart(1); + } + + // 行号显示 + TableColumn tableColumn = dataJTable.getColumnModel().getColumn(0); + tableColumn.setCellRenderer(new CellRenderer()); + tableColumn.setMaxWidth(30); + + // 控制按钮 + add = new UIButton(Inter.getLocText("Add")); + del = new UIButton(Inter.getLocText("Delete")); + JPanel buttonPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); +// buttonPane.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); + buttonPane.add(add); + buttonPane.add(del); + this.add(buttonPane, BorderLayout.NORTH); + + add.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + insertRow(); + checkEnabled(); + } + }); + del.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e) { + removeRow(); + checkEnabled(); + } + }); + checkEnabled(); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText(new String[]{"Column", "Set"}); + } + + public void checkValid() throws Exception { + try { + dataJTable.getCellEditor().stopCellEditing(); + } + catch (Exception e) { + } + } + + public void insertRow(){ + EmbeddedTableDataDefinedPane.EmbeddedTableDefinedModel localDefaultModel = + (EmbeddedTableDataDefinedPane.EmbeddedTableDefinedModel) dataJTable.getModel(); + + try { + dataJTable.getCellEditor().stopCellEditing(); + } + catch (Exception e) { + } + + int indexedrow = dataJTable.getSelectedRow(); + if (indexedrow == - 1) { + indexedrow = dataJTable.getRowCount() - 1; + } + + localDefaultModel.addNewRowData(indexedrow); + localDefaultModel.fireTableDataChanged(); + dataJTable.requestFocusInWindow(); + dataJTable.setRowSelectionInterval(indexedrow + 1, indexedrow + 1); + dataJTable.editCellAt(indexedrow + 1, 1); + } + + protected void removeRow() { + EmbeddedTableDataDefinedPane.EmbeddedTableDefinedModel localDefaultModel = + (EmbeddedTableDataDefinedPane.EmbeddedTableDefinedModel) dataJTable.getModel(); + + int selectedRow = dataJTable.getSelectedRow(); + if (selectedRow == -1) { + selectedRow = dataJTable.getRowCount() - 1; + } + + try { + dataJTable.getCellEditor().stopCellEditing(); + } + catch (Exception e) { + } + + for (int i = 0; i < dataJTable.getSelectedRowCount(); i++){ + localDefaultModel.removeRow(selectedRow); + } + localDefaultModel.fireTableDataChanged(); + + int rowCount = localDefaultModel.getRowCount(); + if (rowCount > 0) { + if (selectedRow < rowCount) { + dataJTable.setRowSelectionInterval(selectedRow, selectedRow); + } + else { + dataJTable.setRowSelectionInterval(rowCount - 1, rowCount - 1); + } + } + } + + private void checkEnabled() { + this.dataJTable.setEnabled(true); + this.del.setEnabled(true); + this.add.setEnabled(true); + + if (dataJTable.getRowCount() <=0 ) { + this.del.setEnabled(false); + } + } + + public void populate(Object obj) { + if(obj == null || !(obj instanceof EmbeddedTableData)) { + return; + } + try { + this.tableData = (EmbeddedTableData)obj; + + EmbeddedTableDataDefinedPane.EmbeddedTableDefinedModel localDefaultModel = + (EmbeddedTableDataDefinedPane.EmbeddedTableDefinedModel) dataJTable.getModel(); + localDefaultModel.setEditableTableData((EmbeddedTableData)tableData.clone()); + localDefaultModel.fireTableDataChanged(); + checkEnabled(); + } catch (CloneNotSupportedException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + } + + public EmbeddedTableData update() { + if(dataJTable.getCellEditor() != null){ + dataJTable.getCellEditor().stopCellEditing(); + } + EmbeddedTableDataDefinedPane.EmbeddedTableDefinedModel localDefaultModel = + (EmbeddedTableDataDefinedPane.EmbeddedTableDefinedModel) dataJTable.getModel(); + try { + tableData = (EmbeddedTableData)(localDefaultModel.getEditableTableData().clone()); + } catch (CloneNotSupportedException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + + return tableData; + } + + class CellRenderer extends DefaultTableCellRenderer { + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + if (column == 0) { + setBackground(new Color(229, 229, 229)); + setHorizontalAlignment(CENTER); + } + return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + } + } + + class EmbeddedTableDefinedModel extends AbstractTableModel { + private EmbeddedTableData embeddedTableData; + private String[] COLUMN_NAME = { + "", + Inter.getLocText("ColumnName"), + Inter.getLocText("Type") + }; + private int sum = 0; + + public EmbeddedTableDefinedModel(EmbeddedTableData editableTableData) { + this.embeddedTableData = editableTableData; + } + + public EmbeddedTableData getEditableTableData() { + return embeddedTableData; + } + + public void setEditableTableData(EmbeddedTableData editableTableData) { + this.embeddedTableData = editableTableData; + } + + public String getColumnName(int column) { + if (column < COLUMN_NAME.length) { + return COLUMN_NAME[column]; + } else { + return ""; + } + } + + public Class getColumnClass(int column) { + return String.class; + } + + public int getRowCount() { + return embeddedTableData.getColumnCount(); + } + + public int getColumnCount() { + return 3; + } + + public Object getValueAt(int row, int column) { + switch (column) { + case 0: + return Integer.toString(row + 1); + case 1: + return embeddedTableData.getColumnName(row); + case 2: + if (embeddedTableData.getColumnClass(row).equals(String.class)) { + return TYPE[0]; + } else if (embeddedTableData.getColumnClass(row).equals(Integer.class)) { + return TYPE[1]; + } else if (embeddedTableData.getColumnClass(row).equals(Double.class)) { + return TYPE[2]; + } else if (embeddedTableData.getColumnClass(row).equals(Date.class)) { + return TYPE[3]; + } + } + return null; + } + + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex !=0; + } + + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + switch (columnIndex) { + case 0: + break; + case 1: + embeddedTableData.setColumn(rowIndex, (String)aValue, embeddedTableData.getColumnClass(rowIndex)); + break; + case 2: + Class cls = null; + if (((String)aValue).equals(TYPE[0])){ + cls = String.class; + } else if (((String)aValue).equals(TYPE[1])){ + cls = Integer.class; + } else if (((String)aValue).equals(TYPE[2])){ + cls = Double.class; + } else if (((String)aValue).equals(TYPE[3])){ + cls = Date.class; + } + embeddedTableData.setColumn(rowIndex, embeddedTableData.getColumnName(rowIndex), cls); + break; + } + } + + public void addNewRowData(int index) { + int n= embeddedTableData.getColumnCount(); + sum++; + for(int i=0;i { + private JTable dataJTable ; + private JScrollPane scrollPane; + private UILabel coordinatelabel; + private UIButton insertRowButton; + private UIButton removeRowButton; + private UIButton columnSetButton; + + /** + * Constructor + * + */ + public EmbeddedTableDataPane() { + initComponents(); + } + + // additional methods + protected void initComponents() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + // prepare the data in this way as default if no arguments is passed in + dataJTable = new JTable(new EmbeddedTableModel(new EmbeddedTableData())); + scrollPane = new JScrollPane(dataJTable); + this.add(scrollPane, BorderLayout.CENTER); + + // 显示double,date类;渲染date类 + dataJTable.setDefaultRenderer(Double.class, new DoubleRenderer()); + dataJTable.setDefaultRenderer(Date.class, new DateRenderer()); + dataJTable.setDefaultEditor(Date.class, new DateEditor(new UIDatePicker(UIDatePicker.STYLE_CN_DATE1))); + tableStructureChanged(); + + // 单击即可编辑 + editbysingleclick(dataJTable, String.class); + editbysingleclick(dataJTable, Date.class); + editbysingleclick(dataJTable, Double.class); + editbysingleclick(dataJTable, Integer.class); + + // AUTO RESIZE + // dataJTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); + dataJTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + dataJTable.setRowSelectionAllowed(true); + dataJTable.setColumnSelectionAllowed(true); + + + // peter:控制Panel + JPanel northPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + this.add(northPane, BorderLayout.NORTH); + northPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 3, 0)); + + // kel:在左上角加一个JLabel用来显示坐标,方便用户查看。 + coordinatelabel = new UILabel("0/0,0/0"); + coordinatelabel.setHorizontalAlignment(UILabel.CENTER); + northPane.add(coordinatelabel); + + dataJTable.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + // kel:加上一个鼠标点击的监控,鼠标点击时,返回选中的行坐标和列坐标。 + selectedChanged(); + } + }); + dataJTable.addKeyListener(new KeyAdapter() { + public void keyTyped(KeyEvent e) { + selectedChanged(); + } + }); + initOtherNorthPaneComponents(northPane); + + } + + private void initOtherNorthPaneComponents(JPanel northPane) { + // 表结构设置 + columnSetButton = new UIButton(Inter.getLocText(new String[]{"Table", "Design"})); + columnSetButton.setMnemonic('C'); + northPane.add(columnSetButton); + columnSetButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + + final EmbeddedTableModel localDefaultModel = (EmbeddedTableModel) dataJTable.getModel(); + final EmbeddedTableDataDefinedPane columnSetPane = new EmbeddedTableDataDefinedPane(); + columnSetPane.populate(((EmbeddedTableModel) dataJTable.getModel()).getEditableTableData()); + + DialogActionAdapter l = new DialogActionAdapter() { + public void doOk() { + localDefaultModel.setEditableTableData(columnSetPane.update()); + localDefaultModel.fireTableStructureChanged(); + localDefaultModel.fireTableDataChanged(); + tableStructureChanged(); + selectedChanged(); + } + }; + + BasicDialog dlg = columnSetPane.showWindow(DesignerContext.getDesignerFrame(), l); + dlg.setAlwaysOnTop(true); + dlg.setVisible(true); + } + }); + + // DataSourceEditor-Insert_Row + insertRowButton = new UIButton(Inter.getLocText("Utils-Insert_Row")); + insertRowButton.setMnemonic('I'); + northPane.add(insertRowButton); + insertRowButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + insertRow(); + } + }); + + // DataSourceEditor-Remove_Row + removeRowButton = new UIButton(Inter.getLocText("Utils-Delete_Row")); + removeRowButton.setMnemonic('R'); + northPane.add(removeRowButton); + removeRowButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + removeRow(); + } + }); + + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("DS-Embedded_TableData"); + } + + + + @Override + public void checkValid() throws Exception { + // alex:停止当前的编辑 + try { + dataJTable.getCellEditor().stopCellEditing(); + } catch (Exception e) { + } + } + + private void selectedChanged() { + int a = dataJTable.getSelectedRow() + 1, b = dataJTable.getSelectedColumn(), c = dataJTable.getRowCount(), d = dataJTable.getColumnCount() - 1; + if (b < 0) { + b = 0; + } + String coordinate = a + "/" + c + "," + b + "/" + d; + coordinatelabel.setText(coordinate); + } + + + @Override + public void populateBean(EmbeddedTableData ob) { + EmbeddedTableModel localDefaultModel = (EmbeddedTableModel) dataJTable.getModel(); + localDefaultModel.clear(); + // 读取tabeldata + for (int i = 0; i < ob.getColumnCount(); i++) { + String columnName = ob.getColumnName(i); + Class columnClass = ob.getColumnClass(i); + localDefaultModel.addColumn(columnName, columnClass); + } + for (int j = 0; j < ob.getRowCount(); j++) { + localDefaultModel.addNewRowData(j); + } + for (int i = 0; i < ob.getColumnCount(); i++) { + for (int j = 0; j < ob.getRowCount(); j++) { + localDefaultModel.setValueAt(ob.getValueAt(j, i), j, i + 1); + } + } + localDefaultModel.fireTableStructureChanged(); + localDefaultModel.fireTableDataChanged(); + tableStructureChanged(); + this.repaint(); + } + + @Override + public EmbeddedTableData updateBean() { + if (dataJTable.getCellEditor() != null) { + dataJTable.getCellEditor().stopCellEditing(); + } + EmbeddedTableModel localDefaultModel = (EmbeddedTableModel) dataJTable.getModel(); + try { + return (EmbeddedTableData) localDefaultModel.getEditableTableData().clone(); + } catch (CloneNotSupportedException e) { + FRContext.getLogger().error(e.getMessage(), e); + return new EmbeddedTableData(); + } + } + + private void tableStructureChanged() { + // 行号显示,每次dateJTable的表结构发生变化时都要调用 + TableColumn tableColumn = dataJTable.getColumnModel().getColumn(0); + tableColumn.setCellRenderer(new CellRenderer()); + tableColumn.setMaxWidth(30); + } + + private class DoubleRenderer extends DefaultTableCellRenderer { + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + setHorizontalAlignment(RIGHT); + return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + } + } + + private class DateRenderer extends DefaultTableCellRenderer { + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + Date date2Format = DateUtils.object2Date(value, true); + return super.getTableCellRendererComponent(table, date2Format == null ? StringUtils.EMPTY : DateUtils.DATEFORMAT1.format(date2Format), isSelected, hasFocus, row, + column); + } + } + + private class DateEditor extends DefaultCellEditor { + public DateEditor(final UIDatePicker datepicker) { + super(datepicker); + } + + public Object getCellEditorValue() { + SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd"); + Date date = null; + try { + synchronized (this) { + date = simpledateformat.parse(((UIDatePicker) this.editorComponent).getSelectedItem().toString()); + } + } catch (Exception e) { + date = new Date(); + } + return date; + } + + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { + Date date = DateUtils.object2Date(value, false); + return super.getTableCellEditorComponent(table, date, isSelected, row, column); + } + } + + private class CellRenderer extends DefaultTableCellRenderer { + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + if (column == 0) { + setBackground(new Color(229, 229, 229)); + setHorizontalAlignment(CENTER); + } + return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + } + } + + private void editbysingleclick(JTable table, Class cls) { + TableCellEditor tableCellEditor = table.getDefaultEditor(cls); + if (tableCellEditor != null) { + ((DefaultCellEditor) tableCellEditor).setClickCountToStart(1); + } + } + + + private void insertRow() { + EmbeddedTableModel localDefaultModel = (EmbeddedTableModel) dataJTable.getModel(); + + // alex:停止当前的编辑 + try { + dataJTable.getCellEditor().stopCellEditing(); + } catch (Exception e) { + } + + int indexedrow = dataJTable.getSelectedRow(); + int indexedcol = dataJTable.getSelectedColumn(); + if (indexedrow == -1) { + indexedrow = dataJTable.getRowCount(); + } + if (indexedcol == -1) { + indexedcol = 0; + } + + localDefaultModel.addNewRowData(indexedrow); + localDefaultModel.fireTableDataChanged(); + // kel:添加一个focus监控,在插入行时获得焦点。(未实现) + dataJTable.requestFocusInWindow(); + dataJTable.setRowSelectionInterval(indexedrow, indexedrow); + dataJTable.setColumnSelectionInterval(indexedcol, indexedcol); + dataJTable.editCellAt(indexedrow, indexedcol); + selectedChanged(); + } + + + private void removeRow() { + EmbeddedTableModel localDefaultModel = (EmbeddedTableModel) dataJTable.getModel(); + + // peter:开始删除行 + int selectedRow = dataJTable.getSelectedRow(); + + int selectedCol = dataJTable.getSelectedColumn(); + if (selectedRow == -1) { + selectedRow = dataJTable.getRowCount() - 1; + } + if (selectedCol == -1) { + selectedCol = 0; + } + + // alex:停止当前的编辑 + try { + dataJTable.getCellEditor().stopCellEditing(); + } catch (Exception e) { + } + + for (int i = 0; i < dataJTable.getSelectedRowCount(); i++) { + localDefaultModel.removeRow(selectedRow); + } + localDefaultModel.fireTableDataChanged(); + + // peter:调整Selection + int rowCount = localDefaultModel.getRowCount(); + if (rowCount > 0) { + if (selectedRow < rowCount) { + dataJTable.setRowSelectionInterval(selectedRow, selectedRow); + dataJTable.setColumnSelectionInterval(selectedCol, selectedCol); + dataJTable.editCellAt(selectedRow, selectedCol); + } else { + dataJTable.setRowSelectionInterval(rowCount - 1, rowCount - 1); + dataJTable.setColumnSelectionInterval(selectedCol, selectedCol); + dataJTable.editCellAt(rowCount - 1, selectedCol); + } + } + selectedChanged(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableModel.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableModel.java new file mode 100644 index 0000000000..3d3155484d --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableModel.java @@ -0,0 +1,103 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import javax.swing.table.AbstractTableModel; + +import com.fr.data.impl.EmbeddedTableData; + +public class EmbeddedTableModel extends AbstractTableModel { + private EmbeddedTableData embeddedTableData; + + public EmbeddedTableModel(EmbeddedTableData editableTableData) { + this.embeddedTableData = editableTableData; + } + + public EmbeddedTableData getEditableTableData() { + return embeddedTableData; + } + + public void setEditableTableData(EmbeddedTableData editableTableData) { + this.embeddedTableData = editableTableData; + } + + public String getColumnName(int column) { + if (column == 0) { + return ""; + } else { + return embeddedTableData.getColumnName(column - 1); + } + } + + public Class getColumnClass(int column) { + if (column == 0) { + return String.class; + } else { + return embeddedTableData.getColumnClass(column - 1); + } + } + + public int getRowCount() { + return embeddedTableData.getRowCount(); + } + + public int getColumnCount() { + if (embeddedTableData.getColumnCount() == 0) { + return 1; + } else { + return embeddedTableData.getColumnCount() + 1; + } + } + + public Object getValueAt(int row, int column) { + if (column == 0) { + return Integer.toString(row + 1); + } else { + return embeddedTableData.getValueAt(row, column - 1); + } + } + + /** + * Returns false. This is the default implementation for all cells. + * + * @param rowIndex the row being queried + * @param columnIndex the column being queried + */ + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex != 0; + } + + /** + * This empty implementation is provided so users don't have to implement + * this method if their data model is not editable. + * + * @param aValue value to assign to cell + * @param rowIndex row of cell + * @param columnIndex column of cell + */ + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + if (columnIndex != 0) { + this.embeddedTableData.setValueAt(aValue, rowIndex, columnIndex - 1); + } + } + + /** + * Add column. + * + * @param columnName column name + * @param columnClass column class + */ + public void addColumn(String columnName, Class columnClass) { + embeddedTableData.addColumn(columnName, columnClass); + } + + public void addNewRowData(int index) { + embeddedTableData.addNewRow(index); + } + + public void removeRow(int rowIndex) { + embeddedTableData.removeRow(rowIndex); + } + + public void clear() { + embeddedTableData.clear(); + } +} \ 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 new file mode 100644 index 0000000000..16d9966a11 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataPane.java @@ -0,0 +1,1006 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.base.Parameter; +import com.fr.base.ParameterHelper; +import com.fr.base.Utils; +import com.fr.data.core.datasource.FileDataSource; +import com.fr.data.core.datasource.URLDataSource; +import com.fr.data.core.define.XMLColumnNameType; +import com.fr.data.impl.ExcelTableData; +import com.fr.data.impl.FileTableData; +import com.fr.data.impl.TextTableData; +import com.fr.data.impl.XMLTableData; +import com.fr.design.actions.UpdateAction; +import com.fr.design.data.datapane.preview.PreviewTablePane; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UIRadioButton; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itableeditorpane.ParameterTableModel; +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableEditorPane; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.menu.ToolBarDef; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.file.FILE; +import com.fr.file.FILEChooserPane; +import com.fr.file.filter.ChooseFileFilter; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.general.data.DataSource; +import com.fr.stable.ArrayUtils; +import com.fr.stable.EncodeConstants; +import com.fr.stable.ParameterProvider; +import com.fr.stable.StringUtils; +import com.fr.stable.xml.XMLReadable; +import com.fr.stable.xml.XMLableReader; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +public class FileTableDataPane extends AbstractTableDataPane { + private static final int TEXT = 0; + private static final int EXCEL = 1; + private static final int XML = 2; + private static final double B = 20; + private static final int EIGHT = 8; + private static final String ROOTTAG = "XML"; + private static final String STARTTAG = ""; + private static final String ENDTAG = ""; + + private UIComboBox fileTypeComboBox; + private UITextField localText; + private UITextField urlText; + private UIRadioButton localFileRadioButton; + private UIRadioButton urlFileRadioButton; + private UITableEditorPane editorPane; + private UILabel tips; + private UIComboBox xmlKyePoint;// xml关键节点 + private UIComboBox encodingComboBox;// xml编码 + private FileTableData fileTableData; + private UIButton chooseFile; + private UIButton testConnection; + private XMLNodeTree xmlNodeTree; + private Parameter[] params; + private JPanel filePath; + private XMLNodeTreePane nodeTreePane; + + private UICheckBox needColumnNameCheckBox;// 第一行是否作为标题 + private UIRadioButton tableDismemberRadioButton;// 制表符 + private UIRadioButton spaceDismenberRadioButton;// 空格符,也是默认的分隔符 + private UIRadioButton commaDismenberRadioButton;// 逗号 + private UIRadioButton otherDismenberRadioButton;// 其他 + private UITextField otherDismenberTextField;// 其他分隔符编辑 + private UICheckBox igoreOneMoreDelimiterCheckBox;// 连续分隔符是否作为单一 + private UIComboBox charsetComboBox; + private UILabel encodeLabel; + private UILabel dismenberLabel; + private UILabel keyPointLaber; + private ExpandMutableTreeNode selectedNode = null; + private ExpandMutableTreeNode finalSelectedNode = null; + + + private ArrayList xmlColumnsList = new ArrayList(); + private static final int SETPANELWIDTH = 337; + private static final int WIDTH = 317; + private static final int HEIGHT = 453; + private static final int GAP = 23; + + + public FileTableDataPane(){ + this(SETPANELWIDTH,WIDTH,HEIGHT,GAP); + } + + public FileTableDataPane(int setPanelWidth,int width,int height,int gap) { + this.setLayout(new BorderLayout(gap,0)); + JPanel northPanel = new JPanel(new BorderLayout()); + JPanel type = new JPanel(); + type.add(new UILabel(Inter.getLocText("Utils-File_type") + ":")); + String[] item = {"TXT", "Excel", "XML"}; + fileTypeComboBox = new UIComboBox(item); + fileTypeComboBox.setPreferredSize(new Dimension(100, 20)); + type.add(fileTypeComboBox); + northPanel.add(type, BorderLayout.WEST); + + // 最上面的pane,文件选择 + JPanel centerPanel = new JPanel(); + centerPanel.setPreferredSize(new Dimension(522, 200)); + centerPanel.setBorder(BorderFactory.createTitledBorder(Inter.getLocText("FR-Designer-File_address"))); + addToCenterPanel(centerPanel); + + // 下面的pane,参数面板 + ParameterTableModel model = new ParameterTableModel() { + @Override + public UITableEditAction[] createAction() { + return (UITableEditAction[]) ArrayUtils.add(null, new RefreshAction()); + } + }; + editorPane = new UITableEditorPane(model); + editorPane.setPreferredSize(new Dimension(355, 130)); + centerPanel.add(editorPane, BorderLayout.SOUTH); + + JPanel southPanel = new JPanel(new BorderLayout()); + JPanel setPanel = new JPanel(); + southPanel.add(setPanel, BorderLayout.CENTER); + setPanel.setPreferredSize(new Dimension(setPanelWidth, 460)); + setPanel.setBorder(BorderFactory.createTitledBorder(Inter.getLocText("FR-Designer_Set"))); + JPanel controlPane = textSetPanel(width,height); + setPanel.add(controlPane, BorderLayout.NORTH); + fileTypeComboBox.addActionListener(getFileTypeListener(setPanel,width,height)); + + this.add(northPanel, BorderLayout.NORTH); + this.add(centerPanel, BorderLayout.CENTER); + this.add(southPanel, BorderLayout.EAST); + } + + private void addToCenterPanel(JPanel centerPanel){ + localFileRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer-Local_file") + ":", true); + urlFileRadioButton = new UIRadioButton("URL:", false); + ButtonGroup bg = new ButtonGroup(); + bg.add(localFileRadioButton); + bg.add(urlFileRadioButton); + localFileRadioButton.addActionListener(radioActionListener); + urlFileRadioButton.addActionListener(radioActionListener); + urlFileRadioButton.setForeground(new Color(143, 142, 139)); + localFileRadioButton.setForeground(Color.black); + localText = new UITextField(); + localText.setPreferredSize(new Dimension(195, 20)); + urlText = new UITextField(); + urlText.setPreferredSize(new Dimension(195, 20)); + urlText.setEditable(false); + chooseFile = new UIButton(Inter.getLocText("FR-Designer_Selection")); + chooseFile.addActionListener(chooseFileListener); + + testConnection = new UIButton(Inter.getLocText("Datasource-Test_Connection")); + testConnection.setEnabled(false); + testConnection.addActionListener(testConnectionListener);// 测试连接按钮 + + JPanel textPanel = new JPanel(new GridLayout(2, 1, 15, 15)); + JPanel textFieldPanel = new JPanel(new GridLayout(2, 1, 15, 15)); + JPanel buttonPanel = new JPanel(new GridLayout(2, 1, 15, 15)); + textPanel.add(localFileRadioButton); + textPanel.add(urlFileRadioButton); + textFieldPanel.add(localText); + textFieldPanel.add(urlText); + buttonPanel.add(chooseFile); + buttonPanel.add(testConnection); + filePath = FRGUIPaneFactory.createBorderLayout_S_Pane(); + filePath.add(textPanel, BorderLayout.WEST); + filePath.add(textFieldPanel, BorderLayout.CENTER); + filePath.add(buttonPanel, BorderLayout.EAST); + centerPanel.add(filePath, BorderLayout.NORTH); + + // 中间的pane,提示信息 + String tipContent = Inter.getLocText("FR-Designer-Type_Parameter") + "reportlets/excel/FineReport${abc}." + "txt" + "
" + + "http://192.168.100.120:8080/XXServer/Report/excel${abc}.jsp
" + "  "; + tips = new UILabel(tipContent); + centerPanel.add(tips, BorderLayout.CENTER); + } + + private ActionListener testConnectionListener = new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + String uri = urlText.getText(); + if (!checkURL(uri)) { + JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(FileTableDataPane.this), Inter.getLocText("FR-Designer_Add_JS_warning")); + return; + } + params = getEditorPaneParameter(); + URLDataSource url = new URLDataSource(urlText.getText().trim(), params); + InputStream in = null; + try { + in = url.getSourceStream(params); + } catch (Throwable e) { + FRContext.getLogger().error(e.getMessage(), e); + } + if (in == null) { + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Datasource-Connection_failed")); + } else { + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Datasource-Connection_successfully")); + try { + in.close(); + } catch (IOException e) { + in = null; + } + } + } + }; + + private void previewPanel(JPanel jPanel){ + JPanel previewPanel = new JPanel(new BorderLayout()); + UIButton preview = new UIButton(Inter.getLocText("FR-Designer_Preview")); + preview.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + preview(); + } + }); + previewPanel.add(preview, BorderLayout.EAST); + jPanel.add(previewPanel, BorderLayout.SOUTH); + } + + private JPanel xmlSetPanel(int width,int height) { + // xml设置pane + JPanel controlPane = new JPanel(); + JPanel northPane = new JPanel(new BorderLayout(8,8)); + JPanel northTopPane = new JPanel(new BorderLayout(8,8)); + JPanel southPane = new JPanel(new BorderLayout(8,8)); + JPanel southTopPane = new JPanel(new BorderLayout(8,8)); + JPanel westPane = new JPanel(new BorderLayout()); + controlPane.setLayout(new BorderLayout(8,8)); + controlPane.setPreferredSize(new Dimension(width, height)); + JPanel comboboxPanel = new JPanel(new BorderLayout(8,8)); + encodeLabel = new UILabel(Inter.getLocText("FR-Designer-Encoding_Type") + ":"); + encodingComboBox = new UIComboBox(EncodeConstants.ALL_ENCODING_ARRAY); + encodingComboBox.setSelectedIndex(4); + encodingComboBox.setPreferredSize(new Dimension(90, 20)); + + JPanel treeContainerPane = new JPanel(); + treeContainerPane.setLayout(new BorderLayout(8,8)); + nodeTreePane = new XMLNodeTreePane(); + treeContainerPane.add(nodeTreePane,BorderLayout.CENTER); + + + comboboxPanel.add(encodeLabel, BorderLayout.WEST); + comboboxPanel.add(encodingComboBox, BorderLayout.CENTER); + + northPane.add(comboboxPanel,BorderLayout.EAST); + northTopPane.add(northPane,BorderLayout.WEST); + southTopPane.add(southPane,BorderLayout.WEST); + southTopPane.add(treeContainerPane,BorderLayout.CENTER); + controlPane.add(northTopPane, BorderLayout.NORTH); + controlPane.add(southTopPane,BorderLayout.CENTER); + previewPanel(controlPane); + return controlPane; + } + + private JPanel excelSetPanel(int width,int height) { + // excel设置pane + int checkBoxWidth = width - EIGHT; + JPanel controlPane = new JPanel(); + JPanel northPane = new JPanel(new BorderLayout(8,8)); + controlPane.setLayout(new BorderLayout()); + controlPane.setPreferredSize(new Dimension(width,height)); + needColumnNameCheckBox = new UICheckBox(Inter.getLocText("FR-Designer-FirstRow_IS_ColumnName"), false); + needColumnNameCheckBox.setPreferredSize(new Dimension(checkBoxWidth, 20)); + northPane.add(needColumnNameCheckBox, BorderLayout.EAST); + controlPane.add(northPane, BorderLayout.NORTH); + previewPanel(controlPane); + return controlPane; + } + + private String getFilePathFromUrlOrLocal() { + if (StringUtils.isNotEmpty(localText.getText()) && localFileRadioButton.isSelected()) { + return localText.getText().trim(); + } else if (StringUtils.isNotEmpty(urlText.getText()) && urlFileRadioButton.isSelected()) { + return urlText.getText().trim(); + } + return ""; + } + + /** + * 检查链接是否可用 + * + * @throws Exception + */ + public void checkValid() throws Exception { + if (urlFileRadioButton.isSelected()) { + String url = urlText.getText().trim(); + if (!checkURL(url)) { + throw new Exception(Inter.getLocText("FR-Designer_Add_JS_warning")); + } + } + + } + + private boolean checkURL(String uri){ + return (uri.matches("https*://.+|\\$\\{.+\\}.*")); + } + + private JPanel textSetPanel(int width,int height) { + // text设置pane + JPanel controlPane = new JPanel(); + controlPane.setLayout(new BorderLayout()); + controlPane.setPreferredSize(new Dimension(width,height)); + JPanel northPane = new JPanel(new BorderLayout(8,8)); + addToNorthPane(northPane); + controlPane.add(northPane,BorderLayout.WEST); + previewPanel(controlPane); + return controlPane; + } + + private void addToNorthPane(JPanel northPane){ + double f = TableLayout.FILL; + double p = TableLayout.PREFERRED; + double columnSize[] = {f, p, p}; + double rowSize[] = {B, B, B, B, B, B, B}; + needColumnNameCheckBox = new UICheckBox(Inter.getLocText("FR-Designer-FirstRow_IS_ColumnName"), true); + dismenberLabel = new UILabel(Inter.getLocText("FR-Designer_Dismenber") + ":"); + tableDismemberRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_TableDismember"), false); + tableDismemberRadioButton.setToolTipText(Inter.getLocText("FR-Designer_TableDismember")); + spaceDismenberRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_Space"), true); + spaceDismenberRadioButton.setToolTipText(Inter.getLocText("FR-Designer_Space")); + commaDismenberRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_CommaDismenber"), false); + commaDismenberRadioButton.setToolTipText(Inter.getLocText("FR-Designer_CommaDismenber")); + otherDismenberRadioButton = new UIRadioButton(Inter.getLocText("FR-Designer_Other") + ":", false); + otherDismenberRadioButton.setToolTipText(Inter.getLocText("FR-Designer_Other")); + otherDismenberTextField = new UITextField(8); + otherDismenberTextField.setEditable(false); + otherDismenberRadioButton.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent arg0) { + if (otherDismenberRadioButton.isSelected()) { + otherDismenberTextField.setEditable(true); + } else { + otherDismenberTextField.setEditable(false); + } + } + }); + ButtonGroup bg2 = new ButtonGroup(); + bg2.add(tableDismemberRadioButton); + bg2.add(spaceDismenberRadioButton); + bg2.add(commaDismenberRadioButton); + bg2.add(otherDismenberRadioButton); + igoreOneMoreDelimiterCheckBox = new UICheckBox(Inter.getLocText("FR-Designer-Series_Dismenber_As_Single"), true); + encodeLabel = new UILabel(Inter.getLocText("FR-Designer-Encoding_Type") + ":"); + charsetComboBox = new UIComboBox(EncodeConstants.ALL_ENCODING_ARRAY); + Component[][] comps = { + {encodeLabel,charsetComboBox,null}, + {needColumnNameCheckBox,null,null}, + {dismenberLabel,tableDismemberRadioButton,null}, + {null,spaceDismenberRadioButton,null}, + {null,commaDismenberRadioButton,null}, + {null,otherDismenberRadioButton,otherDismenberTextField}, + {igoreOneMoreDelimiterCheckBox,null,null} + }; + northPane.add(TableLayoutHelper.createTableLayoutPane(comps, rowSize, columnSize),BorderLayout.EAST); + } + + private ActionListener radioActionListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (localFileRadioButton.isSelected()) { + localRadioSelectAction(); + urlFileRadioButton.setForeground(new Color(143, 142, 139)); + localFileRadioButton.setForeground(Color.black); + } else if (urlFileRadioButton.isSelected()) { + urlRadioSelectAction(); + localFileRadioButton.setForeground(new Color(143, 142, 139)); + urlFileRadioButton.setForeground(Color.black); + } + } + }; + + private void localRadioSelectAction() { + localFileRadioButton.setSelected(true); + localText.setEditable(true); + chooseFile.setEnabled(true); + urlText.setEditable(false); + urlText.setText(""); + testConnection.setEnabled(false); + } + + private void urlRadioSelectAction() { + urlFileRadioButton.setSelected(true); + urlText.setEditable(true); + testConnection.setEnabled(true); + localText.setEditable(false); + localText.setText(""); + chooseFile.setEnabled(false); + } + + private ActionListener chooseFileListener = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + FILEChooserPane fileChooser = FILEChooserPane.getInstance(true, false, new ChooseFileFilter(getFileSuffix())); + if (fileChooser.showOpenDialog(DesignerContext.getDesignerFrame()) == FILEChooserPane.OK_OPTION) { + final FILE file = fileChooser.getSelectedFILE(); + if (file == null) {// 选择的文件不能是 null + return; + } + localText.setText(file.getPath()); + } + + fileChooser.removeFILEFilter(new ChooseFileFilter(getFileSuffix())); + if (fileTypeComboBox.getSelectedIndex() == XML) { + xmlNodeTree.waitRefresh(); + xmlNodeTree.refreshData(); + } + } + }; + + private String[] getFileSuffix() { + List suffixList = new ArrayList(); + String suffix = fileTypeComboBox.getSelectedItem().toString().toLowerCase(); + if (suffix.equalsIgnoreCase("excel")) { + suffixList.add("xls"); + suffixList.add("xlsx"); + } else { + suffixList.add(suffix); + } + 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) { + setPanel.removeAll(); + localText.setText(""); + urlText.setText(""); + if (fileTypeComboBox.getSelectedIndex() == XML) { + setPanel.add(xmlSetPanel(width,height), BorderLayout.NORTH); + } else if (fileTypeComboBox.getSelectedIndex() == EXCEL) { + setPanel.add(excelSetPanel(width,height), BorderLayout.NORTH); + } else { + setPanel.add(textSetPanel(width,height), BorderLayout.NORTH); + } + 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); + setPanel.revalidate(); + } + }; + + return fileTypeListener; + } + + private class RefreshAction extends UITableEditAction { + public RefreshAction() { + this.setName(Inter.getLocText("FR-Designer_Refresh")); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + } + + public void actionPerformed(ActionEvent e) { + String[] paramTexts = new String[1]; + paramTexts[0] = getFilePathFromUrlOrLocal(); + + List existParameterList = editorPane.update(); + Parameter[] ps = existParameterList == null ? new Parameter[0] : existParameterList.toArray(new Parameter[existParameterList.size()]); + + editorPane.populate(ParameterHelper.analyzeAndUnionParameters(paramTexts, ps, false)); + } + + @Override + public void checkEnabled() { + } + } + + @Override + public void populateBean(FileTableData ob) { + fileTableData = ob; + + if (ob instanceof ExcelTableData) { + fileTypeComboBox.setSelectedIndex(EXCEL); + populate2EXCEL((ExcelTableData) ob); + } else if (ob instanceof XMLTableData) { + fileTypeComboBox.setSelectedIndex(XML); + populate2XML((XMLTableData) ob); + } else if (ob instanceof TextTableData) { + fileTypeComboBox.setSelectedIndex(TEXT); + populate2TEXT((TextTableData) ob); + } + } + + private void populate2EXCEL(ExcelTableData etd) { + setTextField(etd); + editorPane.populate(etd.getParams()); + needColumnNameCheckBox.setSelected(etd.needColumnName()); + } + + //wikky:为了使树能够正常展开,合法的xml文件把path中添加的XML节点去掉,而不合法的xml需要把根节点值还原为添加的ROOTTAG值。 + private void populate2XML(XMLTableData xtd) { + setTextField(xtd); + editorPane.populate(xtd.getParams()); + encodingComboBox.setSelectedItem(xtd.getCharSet()); + if (!ComparatorUtils.equals(xtd,new XMLTableData())) { + xmlNodeTree.initData(); + String[] path = xtd.getXPath(); + String[] paths; + if (path != null && path.length > 0) { + DefaultTreeModel treeModel = (DefaultTreeModel)xmlNodeTree.getModel(); + ExpandMutableTreeNode root = (ExpandMutableTreeNode) treeModel.getRoot(); + if (treeModel != null) { + if(!ComparatorUtils.equals(treeModel.getRoot().toString(),"")){ + paths = new String[path.length - 1]; + for(int i = 1;i< path.length;i++){ + paths[i -1] = path[i]; + } + }else{ + paths = path; + root.setUserObject(ROOTTAG); + } + if (treeModel.getRoot() instanceof ExpandMutableTreeNode) { + selectNode((ExpandMutableTreeNode)treeModel.getRoot(), 0, paths); + if (selectedNode != null) { + TreePath treepath = new TreePath(treeModel.getPathToRoot(selectedNode)); + xmlNodeTree.setSelectionPath(treepath); + xmlNodeTree.expandPath(treepath); + } + } + //防止某种操作导致添加的tag作为root出现。 + if(ComparatorUtils.equals(root.toString(),ROOTTAG)){ + root.setUserObject(StringUtils.EMPTY); + } + } + } + } + } + + private void populate2TEXT(TextTableData ttd) { + setTextField(ttd); + String delimiter = ttd.getDelimiter(); + if (delimiter == null) { + return; + } + if (ComparatorUtils.equals(delimiter, "\t")) { + tableDismemberRadioButton.setSelected(true); + } else if (ComparatorUtils.equals(delimiter, ",")) { + commaDismenberRadioButton.setSelected(true); + } else if (ComparatorUtils.equals(delimiter, " ")) { + spaceDismenberRadioButton.setSelected(true); + } else { + otherDismenberRadioButton.setSelected(true); + otherDismenberTextField.setEditable(true); + otherDismenberTextField.setText(ttd.getDelimiter()); + } + editorPane.populate(ttd.getParams()); + needColumnNameCheckBox.setSelected(ttd.needColumnName()); + igoreOneMoreDelimiterCheckBox.setSelected(ttd.isIgnoreOneMoreDelimiter()); + charsetComboBox.setSelectedItem(ttd.getCharset()); + } + + private void setTextField(FileTableData ob) { + if (ob.getFilePath() != null) { + if (ob.getFilePath().indexOf("http") != -1) { + urlRadioSelectAction(); + urlText.setText(ob.getFilePath()); + } else { + localRadioSelectAction(); + localText.setText(ob.getFilePath()); + } + } + } + + @Override + public FileTableData updateBean() { + String filePath = getFilePathFromUrlOrLocal(); + if (StringUtils.isNotBlank(filePath)) { + this.params = getEditorPaneParameter().length == 0 ? null : getEditorPaneParameter(); + if (fileTypeComboBox.getSelectedIndex() == EXCEL) { + return update2EXCEL(filePath); + } else if (fileTypeComboBox.getSelectedIndex() == TEXT) { + return update2TEXT(filePath); + } else if (fileTypeComboBox.getSelectedIndex() == XML) { + return update2XML(filePath); + + } + } + return new FileTableData(); + } + + private TextTableData update2TEXT(String filePath) { + TextTableData ttd = new TextTableData(); + ttd.setFilePath(filePath); + ttd.setParams(this.params); + ttd.setDelimiter(this.showDelimiter()); + ttd.setIgnoreOneMoreDelimiter(igoreOneMoreDelimiterCheckBox.isSelected()); + ttd.setNeedColumnName(needColumnNameCheckBox.isSelected()); + ttd.setCharset((String)charsetComboBox.getSelectedItem()); + fileTableData = ttd; + return ttd; + } + + private ExcelTableData update2EXCEL(String filePath) { + ExcelTableData etd = new ExcelTableData(); + etd.setFilePath(filePath); + etd.setParams(this.params); + etd.setNeedColumnName(needColumnNameCheckBox.isSelected()); + fileTableData = etd; + return etd; + } + + private XMLTableData update2XML(String filePath) { + XMLTableData xtd = new XMLTableData(); + xtd.setFilePath(filePath); + xtd.setParams(this.params); + if (localFileRadioButton.isSelected()) { + xtd.setDataSource(new FileDataSource(filePath, this.params)); + } else { + xtd.setDataSource(new URLDataSource(filePath, this.params)); + } + xtd.setCharSet((String) encodingComboBox.getSelectedItem()); + finalSelectedNode = selectedNode; + if (selectedNode instanceof ExpandMutableTreeNode) { + xmlColumnsList.clear(); + ExpandMutableTreeNode treeNode; + boolean flag = true; + for(int i = 0;i < selectedNode.getChildCount();i++){ + treeNode = (ExpandMutableTreeNode) selectedNode.getChildAt(i); + if(treeNode.isLeaf()){ + xmlColumnsList.add(treeNode.toString()); + }else{ + if(flag){ + flag = false; + finalSelectedNode = treeNode; + leafNode(treeNode); + } + } + } + } + String[] paths = getPaths(); + xtd.setXPath(paths); + XMLColumnNameType[] nameTypes = new XMLColumnNameType[xmlColumnsList.size()]; + for (int i = 0; i < nameTypes.length; i++) { + nameTypes[i] = new XMLColumnNameType(xmlColumnsList.get(i), 0); + } + xtd.setColumns(nameTypes); + fileTableData = xtd; + return xtd; + } + + //wikky:构建树时为了美观把添加的根节点值赋为空显示,现在还得该回去使得预览时能够顺利取到数据。 + private String[] getPaths(){ + TreePath treePath = GUICoreUtils.getTreePath(finalSelectedNode); + String path = StringUtils.EMPTY; + if (treePath != null) { + Object[] paths = treePath.getPath(); + for (int i = 0; i < paths.length; i++) { + path+="/" + paths[i]; + } + } + if (path.startsWith("/")) { + path = path.substring(1); + } + String[] paths = path.split("/"); + if(ComparatorUtils.equals(paths[0],StringUtils.EMPTY)){ + paths[0] = ROOTTAG; + } + return paths; + } + + private void leafNode(ExpandMutableTreeNode treeNode){ + boolean flag = true; + ExpandMutableTreeNode firstNode; + for(int i = 0;i < treeNode.getChildCount();i++){ + firstNode = (ExpandMutableTreeNode) treeNode.getChildAt(i); + if(firstNode.isLeaf()){ + xmlColumnsList.add(firstNode.toString()); + }else{ + if(flag){ + flag = false; + finalSelectedNode = treeNode; + leafNode(firstNode); + } + } + } + } + + private void selectNode(ExpandMutableTreeNode node, int layer, String[] paths) { + if (selectedNode != null || node == null){ + return; + } + if (layer < paths.length && paths[layer] != null && ComparatorUtils.equals(paths[layer],node.getUserObject())) { + if (layer == paths.length -1) { + selectedNode = node; + return; + } + for (int i = 0; i < node.getChildCount(); i++) { + selectNode((ExpandMutableTreeNode)node.getChildAt(i), layer + 1, paths); + } + } + } + + private Parameter[] getEditorPaneParameter() { + String[] paramTexts = new String[1]; + paramTexts[0] = getFilePathFromUrlOrLocal(); + + List existParameterList = editorPane.update(); + Parameter[] ps = existParameterList == null ? new Parameter[0] : existParameterList.toArray(new Parameter[existParameterList.size()]); + + return ParameterHelper.analyzeAndUnionParameters(paramTexts, ps, false); + } + + private String showDelimiter() { + if (tableDismemberRadioButton.isSelected()) { + return "\t"; + } else if (commaDismenberRadioButton.isSelected()) { + return ","; + } else if (spaceDismenberRadioButton.isSelected()) { + return " "; + } else { + String other = otherDismenberTextField.getText(); + if (StringUtils.isEmpty(other)) { + other = " "; + } + return other; + } + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText(new String[]{"File", "DS-TableData"}); + } + + private void preview() { + if (this.fileTableData == null) { + return; + } + PreviewTablePane.previewTableData(this.updateBean()); + } + + private class XMLNodeTreePane extends BasicPane { + private RefreshParameterAction refreshAction; + + public XMLNodeTreePane() { + this.initComponents(); + } + + protected void initComponents() { + JPanel toolbarPanel = new JPanel(new BorderLayout()); + this.setLayout(new BorderLayout()); + xmlNodeTree = new XMLNodeTree(); + this.add(new JScrollPane(xmlNodeTree)); + + keyPointLaber = new UILabel(Inter.getLocText("FR-Designer_KeyPoint") + ":"); + refreshAction = new RefreshParameterAction(); + ToolBarDef toolbarDef = new ToolBarDef(); + toolbarDef.addShortCut(refreshAction); + UIToolbar toolBar = ToolBarDef.createJToolBar(); + toolbarDef.updateToolBar(toolBar); + toolbarPanel.add(keyPointLaber,BorderLayout.WEST); + toolbarPanel.add(toolBar,BorderLayout.EAST); + this.add(toolbarPanel, BorderLayout.NORTH); + } + + @Override + protected String title4PopupWindow() { + return null; + } + + private class RefreshParameterAction extends UpdateAction { + public RefreshParameterAction() { + this.setName(Inter.getLocText("FR-Designer_Refresh")); + this.setMnemonic('r'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + } + + public void actionPerformed(ActionEvent e) { + xmlNodeTree.waitRefresh(); + xmlNodeTree.refreshData(); + } + } + } + + private class XMLNodeTree extends JTree { + private DefaultTreeModel treeModel; + + private DefaultTreeModel waitTreeModel = null; + + public XMLNodeTree() { + this.initComponents(); + this.setModel(null); + } + + protected void initComponents() { + this.putClientProperty("JTree.lineStyle", "Angled"); + this.setShowsRootHandles(true); + this.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + this.addMouseListener(treeMouseListener); + + + this.setEditable(false); + } + + private MouseListener treeMouseListener = new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if (XMLNodeTree.this.getModel() != treeModel){ + return; + } + int selRow = XMLNodeTree.this.getRowForLocation(e.getX(), e.getY()); + if (selRow == -1) {//没有选中某个树节点,就直接返回啦 + return; + } + TreePath selPath = XMLNodeTree.this.getPathForLocation(e.getX(), e.getY()); + if (selPath == null || selPath.getLastPathComponent() == null) { + return;//没有选中某个树节点,就直接返回啦 + } + Object selObject = selPath.getLastPathComponent(); + if (selObject instanceof ExpandMutableTreeNode ) { + ExpandMutableTreeNode expandMutableTreeNode = (ExpandMutableTreeNode) selObject; + if (!expandMutableTreeNode.isLeaf()) { + selectedNode = expandMutableTreeNode; + } else { + selectedNode = (ExpandMutableTreeNode)expandMutableTreeNode.getParent(); + } + } + } + }; + + public void waitRefresh() { + // 换个root,等待用户点击root节点后,展开刷新 + if (waitTreeModel == null) { + ExpandMutableTreeNode rootTreeNode = new ExpandMutableTreeNode(); + rootTreeNode.setExpanded(false); + rootTreeNode.setAllowsChildren(false); + + waitTreeModel = new DefaultTreeModel(rootTreeNode); + } + + this.setModel(waitTreeModel); + } + + public DefaultTreeModel getTreeModel() { + return treeModel; + } + + //防止界面卡死。 + public void refreshData() { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + XMLNodeTree.this.initData(); + } + }); + thread.start(); + } + + //wikky:为满足706设计时对不合法的xml文件(有多个根节点)的处理,把拿到的InputStream强制在最外层添加作为唯一根节点而将文件转换为合法的xml。 + private void initData() { + params = getEditorPaneParameter(); // 生成tree结构放哪儿呢?放这里感觉不对撒 + treeModel = null; + selectedNode = null; + xmlColumnsList.clear(); + DataSource dataSource = null; + if (localFileRadioButton.isSelected()) { + String localTextString = StringUtils.trimToNull(localText.getText()); + if(StringUtils.isEmpty(localTextString)){ + FRContext.getLogger().info("The file path is empty."); + loadedTreeModel(); + return; + } + dataSource = new FileDataSource(localTextString, params); + } else { + String urlTextString = StringUtils.trimToNull(urlText.getText()); + if (StringUtils.isEmpty(urlTextString)){ + FRContext.getLogger().info("The url path is empty."); + loadedTreeModel(); + return; + } + dataSource = new URLDataSource(urlTextString, params); + } + try { + InputStream in,input; + if ((in = dataSource.getSourceStream(params)) != null) { + String xmlString = Utils.inputStream2String(in, (String) encodingComboBox.getSelectedItem()); + String stringXml = addTag(xmlString); + input = new ByteArrayInputStream(stringXml.getBytes((String) encodingComboBox.getSelectedItem())); + InputStreamReader reader = new InputStreamReader(input, (String) encodingComboBox.getSelectedItem()); + XMLableReader xmlReader = XMLableReader.createXMLableReader(reader); + if (xmlReader != null) { + xmlReader.readXMLObject(new XMLLayerReader(0)); + } else { + FRContext.getLogger().info("The file is wrong or bad, can not create the XMLReader."); + loadedTreeModel(); + } + reader.close(); + } + } catch (Throwable e) { + FRContext.getLogger().error(e.getMessage(), e); + loadedTreeModel(); + } + if(treeModel.getChildCount(treeModel.getRoot()) == 1){ + treeModel = new DefaultTreeModel((ExpandMutableTreeNode) treeModel.getChild(treeModel.getRoot(),0)); + }else{ + ExpandMutableTreeNode root = (ExpandMutableTreeNode) treeModel.getRoot(); + root.setUserObject(StringUtils.EMPTY); + } + this.setModel(treeModel); + } + + private void loadedTreeModel(){ + ExpandMutableTreeNode rootTreeNode = new ExpandMutableTreeNode(Inter.getLocText("FR-Designer_loadedTreeModel")); + rootTreeNode.setExpanded(false); + rootTreeNode.setAllowsChildren(false); + DefaultTreeModel loadedTreeModel = new DefaultTreeModel(rootTreeNode); + XMLNodeTree.this.setModel(loadedTreeModel); + } + + private String addTag(String string){ + String stringWithTag; + int beginIndex = 0; + int firstIndex = string.indexOf(">"); + int endIndex = string.length(); + String firstPart = string.substring(beginIndex,firstIndex + 1); + String secondPart = STARTTAG; + String thirdPart = string.substring(firstIndex + 1,endIndex); + String lastPart = ENDTAG; + stringWithTag = firstPart + secondPart + thirdPart + lastPart; + return stringWithTag; + } + + private class XMLLayerReader implements XMLReadable { + private int layer = -1; + private ExpandMutableTreeNode parentNode; + private ExpandMutableTreeNode currentNode; + + public XMLLayerReader(int layer) { + this.parentNode = null; + this.layer = layer; + } + + public XMLLayerReader(ExpandMutableTreeNode parentNode, int layer) { + this.parentNode = parentNode; + this.layer = layer; + } + + public void readXML(XMLableReader reader) { + String nodeName; + if (this.layer < 0) { + return; + } + if (reader.isAttr()) { + nodeName = reader.getTagName(); + if (nodeName == null) { + return; + } + currentNode = new ExpandMutableTreeNode(nodeName); + if (layer == 0) { + treeModel = new DefaultTreeModel(currentNode); + } else { + boolean conflict = false; + for (int i = 0; i < parentNode.getChildCount(); i++) { + ExpandMutableTreeNode node = (ExpandMutableTreeNode) parentNode.getChildAt(i); + if (node != null && nodeName.equals(node.getUserObject())) { + conflict = true; + currentNode = node; + } + } + if (!conflict) { + parentNode.add(currentNode); + } + } + } + + if (reader.isChildNode()) { + if (currentNode == null) { + return; + } + reader.readXMLObject(new XMLLayerReader(currentNode, layer + 1)); + } + } + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java new file mode 100644 index 0000000000..4ce5da98d6 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallHeightPane.java @@ -0,0 +1,19 @@ +package com.fr.design.data.tabledata.tabledatapane; + +/** + * Created with IntelliJ IDEA. + * User: wikky + * Date: 14-2-12 + * Time: 下午2:23 + * To change this template use File | Settings | File Templates. + */ +public class FileTableDataSmallHeightPane extends FileTableDataPane{ + //wikky:文件数据集在模板数据集下面的界面参数。 + private static final int SETPANELWIDTH = 265; + private static final int WIDTH = 245; + private static final int HEIGHT = 475; + private static final int GAP = 13; + public FileTableDataSmallHeightPane(){ + super(SETPANELWIDTH,WIDTH,HEIGHT,GAP); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java new file mode 100644 index 0000000000..b81d2b904e --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/FileTableDataSmallPane.java @@ -0,0 +1,19 @@ +package com.fr.design.data.tabledata.tabledatapane; + +/** + * Created with IntelliJ IDEA. + * User: wikky + * Date: 14-1-21 + * Time: 下午12:30 + * To change this template use File | Settings | File Templates. + */ +public class FileTableDataSmallPane extends FileTableDataPane{ + //wikky:文件数据集在服务器数据集下面的界面参数。 + private static final int SETPANELWIDTH = 265; + private static final int WIDTH = 245; + private static final int HEIGHT = 436; + private static final int GAP = 13; + public FileTableDataSmallPane(){ + super(SETPANELWIDTH,WIDTH,HEIGHT,GAP); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/data/tabledata/tabledatapane/FormatExplanationPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/FormatExplanationPane.java similarity index 100% rename from designer_base/src/com/fr/design/data/tabledata/tabledatapane/FormatExplanationPane.java rename to designer-base/src/com/fr/design/data/tabledata/tabledatapane/FormatExplanationPane.java diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/GlobalMultiTDTableDataPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/GlobalMultiTDTableDataPane.java new file mode 100644 index 0000000000..3932352ec8 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/GlobalMultiTDTableDataPane.java @@ -0,0 +1,22 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import com.fr.design.data.DesignTableDataManager; + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-4-20 + * Time: 上午10:10 + * To change this template use File | Settings | File Templates. + */ +public class GlobalMultiTDTableDataPane extends MultiTDTableDataPane { + + public GlobalMultiTDTableDataPane(String string){ + + super(string); + } + protected void setResMap() { + resMap = DesignTableDataManager.getGlobalDataSet(); + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/GlobalTreeTableDataPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/GlobalTreeTableDataPane.java new file mode 100644 index 0000000000..9f29247dfc --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/GlobalTreeTableDataPane.java @@ -0,0 +1,19 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import com.fr.design.data.datapane.GlobalTreeTableDataDictPane; + + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-4-20 + * Time: 上午11:30 + * To change this template use File | Settings | File Templates. + */ +public class GlobalTreeTableDataPane extends TreeTableDataPane { + public GlobalTreeTableDataPane(String treeName){ + this.treeTableDataDictPane = new GlobalTreeTableDataDictPane(treeName); + initComponent(); + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java new file mode 100644 index 0000000000..7e140b464a --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java @@ -0,0 +1,97 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ilable.UILabel; + +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ispinner.UISpinner; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.general.Inter; + +public class MaxMemRowCountPanel extends UIToolbar { + private static final int ALL_IN_MEMORY = 0; + private static final int MAX_IN_MEMORY = 1; + + private UISpinner numberSpinner; + private UIComboBox switchCache; + + private boolean showAll; // alex:不知道怎么通过界面判断当前的状态,只好加一个boolean量了 + + private ActionListener switchStateL = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int index = switchCache.getSelectedIndex(); + switch (index) { + case 0: + showAllPanel(); + break; + + case 1: + showMaxPanel(); + break; + + default: + showAllPanel(); + break; + } + } + }; + + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.width = 340; + return dim; + }; + + public MaxMemRowCountPanel() { + this.setFloatable(false); + this.setRollover(true); + this.setBackground(UIConstants.NORMAL_BACKGROUND); + String[] cacheList = { Inter.getLocText("Save_All_Records_In_Memory"), Inter.getLocText("Max-Mem-Row-Count") }; + switchCache = new UIComboBox(cacheList); + switchCache.addActionListener(switchStateL); + numberSpinner = new UISpinner(0, Integer.MAX_VALUE, 1); + } + + private void showAllPanel() { + showAll = true; + this.removeAll(); + this.add(switchCache); + switchCache.setSelectedIndex(ALL_IN_MEMORY); + this.validate(); + this.repaint(); + } + + private void showMaxPanel() { + showAll = false; + this.removeAll(); + this.add(switchCache); + switchCache.setSelectedIndex(MAX_IN_MEMORY); + this.add(new UILabel(" ")); + this.add(numberSpinner); + this.add(new UILabel(" " + Inter.getLocText("Row"))); + this.validate(); + this.repaint(); + } + + public void setValue(int value) { + if (value >= 0) { + showMaxPanel(); + numberSpinner.setValue(Integer.valueOf(value)); + } else { + showAllPanel(); + } + } + + public int getValue() { + if (showAll) { + return -1; + } else { + return ((Number) numberSpinner.getValue()).intValue(); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java new file mode 100644 index 0000000000..0742b542e9 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/MultiTDTableDataPane.java @@ -0,0 +1,405 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import com.fr.base.*; +import com.fr.data.impl.ConditionTableData; +import com.fr.data.impl.MultiTDTableData; +import com.fr.data.impl.UnionTableData; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.data.tabledata.wrapper.TemplateTableDataWrapper; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.formula.FormulaFactory; +import com.fr.design.formula.UIFormula; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itableeditorpane.ParameterTableModel; +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableEditorPane; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.script.Calculator; +import com.fr.stable.ParameterProvider; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.Icon; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; + +public class MultiTDTableDataPane extends AbstractTableDataPane { + + private static final int MAX_LENTH_OF_DATASET = 143; //关联数据集面板最大显示的数据集长度,超出这个长度显示数据集名称+“...” + private static final int MIN_BAR_NUMBER = 10; + private static final int SUB_LENGTH = 4; + private JPanel centerPanel; + private UITableEditorPane editorPane; + // key = name ; value = formula + private HashMap choosenTableData = new HashMap(); + protected java.util.Map resMap; + + public MultiTDTableDataPane() { + this(StringUtils.EMPTY); + + } + + public MultiTDTableDataPane(String multiName) { + this.setLayout(new BorderLayout()); + this.add(initNorthPane(multiName), BorderLayout.CENTER); + this.add(initSouthPanel(), BorderLayout.SOUTH); + + } + + private JPanel initNorthPane(String multiName) { + JPanel jpanel = new JPanel(); + jpanel.setLayout(new BorderLayout()); + + JPanel northPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + UILabel chooseTableData = new UILabel(Inter.getLocText(new String[]{"Select_Data_Set", "Merge"})); + UIButton previewButton = new UIButton(); + previewButton.setIcon(BaseUtils.readIcon("/com/fr/web/images/preview.png")); + previewButton.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + previewButton.addActionListener(getPreviewActionListener()); + northPanel.add(chooseTableData); + northPanel.add(previewButton); + + centerPanel = new JPanel(); + JScrollPane js = new JScrollPane(centerPanel); + js.getVerticalScrollBar().setUnitIncrement(20);// 鼠标滚动大小 + js.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + js.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + initAllBarPane(multiName); + + jpanel.add(northPanel, BorderLayout.NORTH); + jpanel.add(js, BorderLayout.CENTER); + + return jpanel; + } + + private void initAllBarPane(String multiName) { + UILabel headLabel = new UILabel(Inter.getLocText("Multi_nam_formula")); + setResMap(); + int len = resMap.size(); + // 10个正好不会出现滚动条 + centerPanel.setLayout(new GridLayout(len < MIN_BAR_NUMBER ? MIN_BAR_NUMBER : len + 1, 1)); + centerPanel.add(headLabel); + + Iterator> entryIt = resMap.entrySet().iterator(); + while (entryIt.hasNext()) { + TableDataWrapper tableDataWrappe = entryIt.next().getValue(); + String tmp = tableDataWrappe.getTableDataName(); + if (!ComparatorUtils.equals(tableDataWrappe.getTableDataName(), multiName)) { + centerPanel.add(new BarPanel(tmp, tableDataWrappe.getIcon())); + } + } + + } + + protected void setResMap() { + resMap = DesignTableDataManager.getAllEditingDataSet(DesignTableDataManager.getEditingTableDataSource()); + } + + private ActionListener getPreviewActionListener() { + return new ActionListener() { + + public void actionPerformed(ActionEvent e) { + MultiTDTableData td = MultiTDTableDataPane.this.updateBean(); + td.setTableDataSource(DesignTableDataManager.getEditingTableDataSource()); + new TemplateTableDataWrapper(td).previewData(); + } + }; + } + + private JPanel initSouthPanel() { + JPanel jpanel = new JPanel(); + jpanel.setPreferredSize(new Dimension(-1, 150)); + jpanel.setLayout(new BorderLayout()); + + editorPane = new UITableEditorPane(new ParameterTableModel() { + @Override + public UITableEditAction[] createAction() { + return new UITableEditAction[]{new RefreshAction()}; + } + }, " " + Inter.getLocText(new String[]{"DS-TableData", "DEFAULT", "Parameter"})); + + jpanel.add(editorPane, BorderLayout.CENTER); + + return jpanel; + } + + private class RefreshAction extends UITableEditAction { + public RefreshAction() { + this.setName(Inter.getLocText("Refresh")); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + } + + public void actionPerformed(ActionEvent e) { + refresh(); + } + + @Override + public void checkEnabled() { + } + } + + private void refresh() { + int size = choosenTableData.size(); + String[] paramTexts = new String[size]; + Object[] object = choosenTableData.values().toArray(); + for (int i = 0; i < size; i++) { + paramTexts[i] = (String) object[i]; + } + List existParameterList = new ArrayList(); + Iterator> dataItera = choosenTableData.entrySet().iterator(); + List parameterName = new ArrayList(); + while (dataItera.hasNext()) { + Entry entry = dataItera.next(); + TableData td = resMap.get(entry.getKey()).getTableData(); + ParameterProvider[] currentparameters = td.getParameters(Calculator.createCalculator()); + for (int i=0; i> it = choosenTableData.entrySet().iterator(); + while (it.hasNext()) { + Entry entry = it.next(); + td.addTableData(entry.getKey(), entry.getValue()); + } + + List paramList = editorPane.update(); + if (paramList != null) { + td.setDefineParameters(paramList.toArray(new Parameter[paramList.size()])); + } + + return td; + } + + class BarPanel extends JPanel { + + private static final int BAR_HEIGHT = 33; + + private String name; + private Icon icon; + private UICheckBox chekbox; + private UITextField formulaContentTextField; + private UIButton formulaButton; + private DocumentListener documentListener = new DocumentListener() { + + public void changedUpdate(DocumentEvent e) { + updateFormula(formulaContentTextField.getText()); + } + + public void insertUpdate(DocumentEvent e) { + updateFormula(formulaContentTextField.getText()); + } + + public void removeUpdate(DocumentEvent e) { + updateFormula(formulaContentTextField.getText()); + } + }; + + public BarPanel(String name, Icon icon) { + this.name = name; + this.icon = icon; + initUI(); + } + + private void initUI() { + String tmp = name; + this.setLayout(new FlowLayout(FlowLayout.LEFT)); + + JPanel leftPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + leftPanel.setPreferredSize(new Dimension(190, BAR_HEIGHT)); + chekbox = new UICheckBox(); + UILabel tabledataName = new UILabel(tmp); + while (tabledataName.getPreferredSize().width > MAX_LENTH_OF_DATASET) { + tmp = tmp.substring(0, tmp.length() - SUB_LENGTH); + tmp = tmp + "..."; + tabledataName = new UILabel(tmp); + } + UILabel iconLabel = new UILabel(icon); + chekbox.addActionListener(tableDataCheckboxListener); + iconLabel.addMouseListener(chooseTableDataListener); + tabledataName.addMouseListener(chooseTableDataListener); + leftPanel.add(chekbox); + leftPanel.add(iconLabel); + leftPanel.add(tabledataName); + + JPanel rightPanel = new JPanel(); + formulaContentTextField = new UITextField(BAR_HEIGHT); + formulaContentTextField.setEnabled(false); + formulaContentTextField.getDocument().addDocumentListener(documentListener); + formulaButton = new UIButton("..."); + formulaButton.setEnabled(false); + formulaButton.setPreferredSize(new Dimension(25, 23)); + formulaButton.addActionListener(getFormulaActionListener()); + rightPanel.add(new UILabel(Inter.getLocText("Conditions_formula") + " =")); + rightPanel.add(formulaContentTextField); + rightPanel.add(formulaButton); + + this.setPreferredSize(new Dimension(-1, BAR_HEIGHT)); + this.add(leftPanel, BorderLayout.WEST); + this.add(rightPanel, BorderLayout.CENTER); + } + + public void populate() { + Iterator> it = choosenTableData.entrySet().iterator(); + chekbox.setSelected(false); + formulaContentTextField.setEnabled(false); + formulaButton.setEnabled(false); + formulaContentTextField.getDocument().removeDocumentListener(documentListener); + formulaContentTextField.setText(""); + while (it.hasNext()) { + Entry entry = it.next(); + if (ComparatorUtils.equals(name, entry.getKey())) { + chekbox.setSelected(true); + formulaContentTextField.setEnabled(true); + formulaButton.setEnabled(true); + formulaContentTextField.setText(entry.getValue()); + } + } + formulaContentTextField.getDocument().addDocumentListener(documentListener); + } + + private MouseAdapter chooseTableDataListener = new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + String formula = formulaContentTextField.getText(); + if (chekbox.isSelected()) { + chekbox.setSelected(false); + formulaContentTextField.setEnabled(false); + formulaButton.setEnabled(false); + if (choosenTableData.containsKey(name)) { + choosenTableData.remove(name); + } + } else { + formulaButton.setEnabled(true); + formulaContentTextField.setEnabled(true); + chekbox.setSelected(true); + choosenTableData.put(name, formula); + } + } + }; + + private ActionListener tableDataCheckboxListener = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + String formula = formulaContentTextField.getText(); + if (chekbox.isSelected()) { + formulaButton.setEnabled(true); + formulaContentTextField.setEnabled(true); + choosenTableData.put(name, formula); + } else { + formulaButton.setEnabled(false); + formulaContentTextField.setEnabled(false); + if (choosenTableData.containsKey(name)) { + choosenTableData.remove(name); + } + } + + } + }; + + private void updateFormula(String newFormula) { + if (!chekbox.isSelected() && StringUtils.isNotEmpty(newFormula)) { + chekbox.setSelected(true); + } + choosenTableData.put(name, newFormula); + } + + private ActionListener getFormulaActionListener() { + return new ActionListener() { + public void actionPerformed(ActionEvent e) { + final UIFormula formulaPane = FormulaFactory.createFormulaPane(); + formulaPane.populate(BaseFormula.createFormulaBuilder().build(formulaContentTextField.getText())); + formulaPane.showLargeWindow(SwingUtilities.getWindowAncestor(MultiTDTableDataPane.this), new DialogActionAdapter() { + public void doOk() { + BaseFormula formula = formulaPane.update(); + if (formula == null) { + formulaContentTextField.setText(""); + } else { + formulaContentTextField.setText(formula.getContent().substring(1)); + } + MultiTDTableDataPane.this.refresh(); + } + }).setVisible(true); + } + }; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/OneListTableModel.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/OneListTableModel.java new file mode 100644 index 0000000000..683658cce2 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/OneListTableModel.java @@ -0,0 +1,111 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import java.awt.Component; +import java.awt.event.ActionEvent; + +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableModelAdapter; +import com.fr.design.mainframe.DesignerContext; +import com.fr.file.FILE; +import com.fr.file.FILEChooserPane; +import com.fr.file.filter.ChooseFileFilter; +import com.fr.general.Inter; +import com.fr.stable.CoreConstants; + +//august:按理说,这个只有一列 就不该用jtable。不过这样总比之前用ArrayTableModel好 +public abstract class OneListTableModel extends UITableModelAdapter { + + protected Component component = null; ////指定确认对话框的父窗口,bug40340 + public OneListTableModel(String columnName) { + this(new String[] { columnName }); + } + + public OneListTableModel(String columnName, Component component) { + this(new String[] { columnName }); + this.component = component; + } + + // 外面的就不要用这个方法了 + protected OneListTableModel(String[] columnNames) { + super(columnNames); + } + @Override + public int getColumnCount() { + return 1; + } + @Override + public UITableEditAction[] createAction() { + return new UITableEditAction[] { getAddAction(),new DeleteAction(), new MoveUpAction(), new MoveDownAction() }; + } + + public abstract UITableEditAction getAddAction(); + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + T os = this.getList().get(rowIndex); + return os; + } + @SuppressWarnings("unchecked") + public void setValueAt(Object value, int row, int column) { + this.getList().set(row, (T) value); + fireTableCellUpdated(row, column); + } + @Override + public boolean isCellEditable(int row, int col) { + return true; + } + + public class AddJsAction extends AddTableRowAction{ + public AddJsAction() { + super(); + } + + @SuppressWarnings("unchecked") + @Override + public void actionPerformed(ActionEvent e) { + super.actionPerformed(e); + FILEChooserPane fileChooser = FILEChooserPane.getInstance(false, false, true, new ChooseFileFilter("js", "javascript" + Inter.getLocText("File"))); + if(fileChooser.showOpenDialog(DesignerContext.getDesignerFrame()) == FILEChooserPane.OK_OPTION) { + final FILE file = fileChooser.getSelectedFILE(); + if(file == null) { + return ; + } + String fileName = file.getName(); + String fileType = fileName.substring(fileName.lastIndexOf(CoreConstants.DOT) + 1); + if(!"js".equalsIgnoreCase(fileType)) { + return ; + } + String temp = file.getPath().substring(1); + addRow((T) temp); + fireTableDataChanged(); + } + } + } + public class AddCssAction extends AddTableRowAction{ + public AddCssAction() { + super(); + } + + @SuppressWarnings("unchecked") + @Override + public void actionPerformed(ActionEvent e) { + super.actionPerformed(e); + FILEChooserPane fileChooser = FILEChooserPane.getInstance(false, false, true, new ChooseFileFilter("css", "css" + Inter.getLocText("File"))); + if(fileChooser.showOpenDialog(DesignerContext.getDesignerFrame()) == FILEChooserPane.OK_OPTION) { + final FILE file = fileChooser.getSelectedFILE(); + if(file == null) { + return ; + } + String fileName = file.getName(); + String fileType = fileName.substring(fileName.lastIndexOf(CoreConstants.DOT) + 1); + if(!"css".equalsIgnoreCase(fileType)) { + return ; + } + String temp = file.getPath().substring(1); + addRow((T) temp); + fireTableDataChanged(); + } + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java new file mode 100644 index 0000000000..509af3cf5a --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureDataPane.java @@ -0,0 +1,380 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.swing.*; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.base.StoreProcedureParameter; +import com.fr.data.core.db.TableProcedure; +import com.fr.data.impl.Connection; +import com.fr.data.impl.NameDatabaseConnection; +import com.fr.data.impl.storeproc.StoreProcedure; +import com.fr.design.actions.UpdateAction; +import com.fr.design.border.UIRoundedBorder; +import com.fr.design.constants.UIConstants; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.datapane.connect.ConnectionTableProcedurePane; +import com.fr.design.data.datapane.connect.ConnectionTableProcedurePane.DoubleClickSelectedNodeOnTreeListener; +import com.fr.design.data.datapane.sqlpane.SQLEditPane; +import com.fr.design.data.tabledata.ResponseDataSourceChange; +import com.fr.design.data.tabledata.StoreProcedureWorkerListener; +import com.fr.design.data.tabledata.wrapper.StoreProcedureDataWrapper; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableEditorPane; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.menu.SeparatorDef; +import com.fr.design.menu.ToolBarDef; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.file.ConnectionConfig; +import com.fr.general.Inter; +import com.fr.script.Calculator; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; + +public class ProcedureDataPane extends AbstractTableDataPane implements ResponseDataSourceChange { + private static final String[] DRIVERS = { + "oracle.jdbc.driver.OracleDriver", + "com.microsoft.sqlserver.jdbc.SQLServerDriver", + "com.ibm.db2.jcc.DB2Driver", + "com.mysql.jdbc.Driver", + "org.gjt.mm.mysql.Driver" + }; // 需要隐藏面板的数据库的驱动 + private static final String PREVIEW_BUTTON = Inter.getLocText("FR-Designer_Preview"); + private ConnectionTableProcedurePane connectionTableProcedurePane; + private JPanel cardpane; + private CardLayout cardLayout; + private String editorPaneType; + private int paneIndex; + private UITableEditorPane editorPane; + private UITableEditorPane inAutoeditorPane; + private UITableEditorPane autoEditorPane; + private StoreProcedure storeprocedure; + // 存储过程的内容 + private SQLEditPane storeProcedureContext; + // 存储过程的警告提示 + private UILabel warningLabel; + // 存储过程显示的名字 + private UILabel queryText; + private UICheckBox isShareCheckBox; + private MaxMemRowCountPanel maxPanel; + private SwingWorker populateWorker; + private StoreProcedureWorkerListener storeProcedureWorkerListener; + private SwingWorker updateWorker; + + public ProcedureDataPane() { + super(); + queryText = new UILabel(StringUtils.EMPTY); + Box box = new Box(BoxLayout.Y_AXIS); + JPanel northpane = new JPanel(new BorderLayout(4, 4)); + northpane.add(creatToolBar(), BorderLayout.CENTER); + northpane.setBorder(BorderFactory.createEmptyBorder(0, 0, 6, 0)); + + storeProcedureContext = new SQLEditPane(SQLEditPane.UNREQUEST_DROPTARGET); + storeProcedureContext.setEditable(false); + UIScrollPane storeProcedureContextPane = new UIScrollPane(storeProcedureContext); + storeProcedureContextPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); + storeProcedureContextPane.setPreferredSize(new Dimension(680, 600)); + + JPanel namePane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + namePane.add(new UILabel(Inter.getLocText("FR-Designer_Datasource-Stored_Procedure") + ":")); + namePane.add(queryText); + inAutoeditorPane = new UITableEditorPane(new StoreProcedureTableModel()); + autoEditorPane = new UITableEditorPane(new AutoStoreProcedureTableModel()); + autoEditorPane.getbuttonPane().setVisible(false); + + cardLayout = new CardLayout(); + cardpane = FRGUIPaneFactory.createCardLayout_S_Pane(); + cardpane.setLayout(this.cardLayout); + cardpane.add(inAutoeditorPane, "inAutoeditorPane"); + cardpane.add(autoEditorPane, "autoEditorPane"); + + box.add(northpane); + box.add(storeProcedureContextPane); + box.add(namePane); + box.add(cardpane); + warningLabel = new UILabel(""); + JPanel sqlSplitPane = new JPanel(new BorderLayout(4, 4)); + sqlSplitPane.add(box, BorderLayout.CENTER); + + // 左边的Panel,上面是选择DatabaseConnection的ComboBox,下面DatabaseConnection对应的Table + initconnectionTableProcedurePane(); + this.setLayout(new BorderLayout(4, 4)); + connectionTableProcedurePane.setMinimumSize(new Dimension(155, 500)); + box.setMinimumSize(new Dimension(310, 400)); + // 使用SplitPane + JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, connectionTableProcedurePane, sqlSplitPane); + mainSplitPane.setBorder(BorderFactory.createLineBorder(GUICoreUtils.getTitleLineBorderColor())); + mainSplitPane.setOneTouchExpandable(true); + this.add(mainSplitPane, BorderLayout.CENTER); + } + + private void initconnectionTableProcedurePane() { + connectionTableProcedurePane = new ConnectionTableProcedurePane() { + @Override + protected JPanel createCheckBoxgroupPane() { + return null; + } + }; + connectionTableProcedurePane.addDoubleClickListener(new DoubleClickSelectedNodeOnTreeListener() { + + @Override + public void actionPerformed(TableProcedure target) { + editorPane.stopEditing(); + queryText.setText(target.toString()); + refresh(); + } + + }); + connectionTableProcedurePane.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + editorPaneType = isAutoParameterDatabase() ? "autoEditorPane" : "inAutoeditorPane"; + paneIndex = isAutoParameterDatabase() ? 1 : 0; + editorPane = (UITableEditorPane) cardpane.getComponent(paneIndex); + cardLayout.show(cardpane, editorPaneType); + } + }); + + } + + private JToolBar creatToolBar() { + ToolBarDef toolBarDef = new ToolBarDef(); + toolBarDef.addShortCut(new PreviewAction()); + toolBarDef.addShortCut(new RefreshAction()); + toolBarDef.addShortCut(SeparatorDef.DEFAULT); + isShareCheckBox = new UICheckBox(Inter.getLocText("FR-Designer_Is_Share_DBTableData")); + maxPanel = new MaxMemRowCountPanel(); + maxPanel.setBorder(null); + UIToolbar toolbar = ToolBarDef.createJToolBar(); + toolBarDef.updateToolBar(toolbar); + toolbar.add(isShareCheckBox); + toolbar.add(maxPanel); + return toolbar; + } + + private boolean isAutoParameterDatabase() { + Connection connection = ConnectionConfig.getInstance().getConnection(connectionTableProcedurePane.getSelectedDatabaseConnnectonName()); + return connection == null ? false : ArrayUtils.contains(DRIVERS, connection.getDriver()); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer_Datasource-Stored_Procedure"); + } + + @Override + public void populateBean(StoreProcedure e) { + storeprocedure = e; + this.queryText.setText(e.getQuery()); + this.connectionTableProcedurePane.setSelectedDatabaseConnection(e.getDatabaseConnection()); + isShareCheckBox.setSelected(e.isShare()); + maxPanel.setValue(e.getMaxMemRowCount()); + + // refresh storeProcedureContext + if (populateWorker != null) { + populateWorker.cancel(true); + } + populateWorker = new SwingWorker() { + + protected Void doInBackground() throws Exception { + try { + storeProcedureContext.setText(StringUtils.EMPTY); + String connectionname = connectionTableProcedurePane.getSelectedDatabaseConnnectonName(); + String procedureText = FRContext.getCurrentEnv().getProcedureText(connectionname, storeprocedure.getQuery()); + storeProcedureContext.setText(procedureText); + warningLabel.setText(StringUtils.EMPTY); + } catch (Exception ex) { + if (ex instanceof SQLException) { + warningLabel.setText(Inter.getLocText(new String[]{"Database", "Datasource-Connection_failed"})); + } else { + warningLabel.setText(ex.getMessage()); + } + } + return null; + } + + public void done() { + editorPane.populate(storeprocedure.getParameters()); + } + }; + + populateWorker.execute(); + + } + + /** + * 增加存储过程监听器 + * + * @param listener 监听器 + */ + public void addStoreProcedureWorkerListener(StoreProcedureWorkerListener listener) { + + this.storeProcedureWorkerListener = listener; + + } + + /** + * 去除存储过程监听器 + */ + public void removeStoreProcedureWorkerListener() { + this.storeProcedureWorkerListener = null; + + } + + private StoreProcedure updateBeanWithOutExecute() { + String dbName = connectionTableProcedurePane.getSelectedDatabaseConnnectonName(); + + if (StringUtils.isBlank(dbName)) { + try { + throw new Exception(Inter.getLocText("FR-Designer_Connect_SQL_Cannot_Null") + "."); + } catch (Exception e) { + JOptionPane.showMessageDialog(ProcedureDataPane.this, Inter.getLocText("FR-Designer_Connect_SQL_Cannot_Null") + "."); + } + } + + StoreProcedure sp = new StoreProcedure(); + sp.setDatabaseConnection(new NameDatabaseConnection(dbName)); + List parametersList = editorPane.update(); + sp.setParameters(parametersList.toArray(new StoreProcedureParameter[parametersList.size()])); + + sp.setQuery(this.queryText.getText()); + sp.setShare(isShareCheckBox.isSelected()); + sp.setMaxMemRowCount(maxPanel.getValue()); + + return sp; + } + + @Override + public StoreProcedure updateBean() { + + final StoreProcedure sp = updateBeanWithOutExecute(); + if (updateWorker != null) { + updateWorker.cancel(true); + } + updateWorker = new SwingWorker() { + + protected Void doInBackground() throws Exception { + DesignTableDataManager.setThreadLocal(DesignTableDataManager.NO_PARAMETER); + sp.setCalculating(true); + sp.creatDataModel(Calculator.createCalculator()); + return null; + } + + public void done() { + DesignTableDataManager.setThreadLocal(DesignTableDataManager.NO_PARAMETER); + sp.setCalculating(false); + doAfterProcudureDone(); + fireDSChanged(); + } + }; + + updateWorker.execute(); + return sp; + } + + private void doAfterProcudureDone() { + if (storeProcedureWorkerListener != null) { + storeProcedureWorkerListener.fireDoneAction(); + } + } + + // 刷新参数,从数据库取值 + private void refresh() { + String text = this.queryText.getText(); + if (text == null) { + text = StringUtils.EMPTY; + } + text = text.trim(); + String connectionname = this.connectionTableProcedurePane.getSelectedDatabaseConnnectonName(); + try { + String procedureText = FRContext.getCurrentEnv().getProcedureText(this.connectionTableProcedurePane.getSelectedDatabaseConnnectonName(), text); + + // 获取参数默认值,例如:NAME in varchar2 default 'SCOTT',默认值为SCOTT + String parameterDefaultValue = ""; + if (StringUtils.isNotEmpty(procedureText)) { + int index_begin = procedureText.indexOf("BEGIN"); + + //from sam: 默认值只会在begin之前声明, 不然会把所有的存储过程里带'xx'的都作为默认值 + String defaulValueStr = index_begin == -1 ? procedureText : procedureText.substring(0, index_begin); + String[] strs = defaulValueStr.split("\'"); + parameterDefaultValue = strs.length > 1 ? strs[1] : parameterDefaultValue; + } + + StoreProcedureParameter[] newparameters; + newparameters = FRContext.getCurrentEnv().getStoreProcedureDeclarationParameters(connectionname, text, parameterDefaultValue); + + + editorPane.populate(newparameters); + storeProcedureContext.setText(procedureText); + warningLabel.setText(""); + } catch (SQLException sql) { + warningLabel.setText(Inter.getLocText(new String[]{"Database", "Datasource-Connection_failed"})); + storeProcedureContext.setText(""); + editorPane.populate(new StoreProcedureParameter[0]); + } catch (Exception e) { + warningLabel.setText(e.getMessage()); + storeProcedureContext.setText(""); + editorPane.populate(new StoreProcedureParameter[0]); + } + return; + } + + /** + * 响应数据集改变 + */ + public void fireDSChanged() { + fireDSChanged(new HashMap()); + } + + /** + * 响应数据集改变 + * + * @param map 改变的map + */ + public void fireDSChanged(Map map) { + DesignTableDataManager.fireDSChanged(map); + } + + private class PreviewAction extends UpdateAction { + public PreviewAction() { + this.setName(PREVIEW_BUTTON); + this.setMnemonic('P'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/preview.png")); + } + + public void actionPerformed(ActionEvent evt) { + StoreProcedure sp = updateBeanWithOutExecute(); + StoreProcedureDataWrapper storeProcedureDataWrappe = new StoreProcedureDataWrapper(sp, StringUtils.EMPTY, queryText.getText()); + storeProcedureDataWrappe.previewData(StoreProcedureDataWrapper.PREVIEW_ALL); + } + } + + protected class RefreshAction extends UITableEditAction { + public RefreshAction() { + this.setName(Inter.getLocText("FR-Designer_Refresh")); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/refresh.png")); + } + + public void actionPerformed(ActionEvent e) { + refresh(); + } + + @Override + public void checkEnabled() { + } + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureListPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureListPane.java similarity index 100% rename from designer_base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureListPane.java rename to designer-base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureListPane.java diff --git a/designer_base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureManagerPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureManagerPane.java similarity index 100% rename from designer_base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureManagerPane.java rename to designer-base/src/com/fr/design/data/tabledata/tabledatapane/ProcedureManagerPane.java diff --git a/designer_base/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureParameterPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureParameterPane.java similarity index 100% rename from designer_base/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureParameterPane.java rename to designer-base/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureParameterPane.java diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureTableModel.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureTableModel.java new file mode 100644 index 0000000000..54c996f6e1 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/StoreProcedureTableModel.java @@ -0,0 +1,139 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import java.awt.event.ActionEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.List; + +import javax.swing.BorderFactory; + +import com.fr.base.StoreProcedureParameter; +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableModelAdapter; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.general.Inter; + +public class StoreProcedureTableModel extends UITableModelAdapter { + + public StoreProcedureTableModel() { + super(new String[] { Inter.getLocText("Parameter"), Inter.getLocText("Type"), Inter.getLocText("Model"), Inter.getLocText("Value") }); + if (shouldResponseDoubleClickAction()) { + table.addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() < 2) { + return; + } + final int selectedRow = table.getSelectedRow(); + final List sppList = getList(); + if (selectedRow < 0 || selectedRow >= sppList.size()) { + return; + } + StoreProcedureParameter spp = sppList.get(selectedRow); + + final StoreProcedureParameterPane pane = new StoreProcedureParameterPane(); + pane.populate(spp); + pane.setBorder(BorderFactory.createTitledBorder(Inter.getLocText("Parameter"))); + BasicDialog stpEditDialog = pane.showWindow(DesignerContext.getDesignerFrame()); + stpEditDialog.addDialogActionListener(new DialogActionAdapter() { + + @Override + public void doOk() { + StoreProcedureParameter spp = pane.update(); + setSelectedValue(spp); + fireTableDataChanged(); + } + }); + stpEditDialog.setVisible(true); + } + }); + } + + } + + public Object getValueAt(int row, int col) { + StoreProcedureParameter stp = getList().get(row); + + if (col == 0) { + return stp.getName(); + } else if (col == 1) { + return StoreProcedureParameterPane.getInfo4Name(stp.getType()); + } else if (col == 2) { + return StoreProcedureParameterPane.getInfo4Name(stp.getSchema()); + } else if (col == 3) { + return stp.getValue(); + } + + return null; + } + + public boolean isCellEditable(int row, int col) { + return false; + } + + public boolean shouldResponseDoubleClickAction () { + return true; + } + @Override + public UITableEditAction[] createAction() { + return new UITableEditAction[] { new AddStoreProcedureAction(), new EditStoreProcedureAction(), new DeleteAction(), new MoveUpAction(), + new MoveDownAction() }; + } + + private class AddStoreProcedureAction extends AddTableRowAction { + @Override + public void actionPerformed(ActionEvent e) { + super.actionPerformed(e); + StoreProcedureParameter para = new StoreProcedureParameter(); + final StoreProcedureParameterPane pane = new StoreProcedureParameterPane(); + pane.populate(para); + pane.setBorder(BorderFactory.createTitledBorder(Inter.getLocText("Parameter"))); + BasicDialog stpEditDialog = pane.showWindow(DesignerContext.getDesignerFrame()); + stpEditDialog.addDialogActionListener(new DialogActionAdapter() { + + @Override + public void doOk() { + StoreProcedureParameter spp = pane.update(); + addRow(spp); + fireTableDataChanged(); + } + }); + stpEditDialog.setVisible(true); + } + } + + private class EditStoreProcedureAction extends EditAction { + @Override + public void actionPerformed(ActionEvent e) { + super.actionPerformed(e); + StoreProcedureParameter para = getSelectedValue(); + final StoreProcedureParameterPane pane = new StoreProcedureParameterPane(); + pane.populate(para); + pane.setBorder(BorderFactory.createTitledBorder(Inter.getLocText("Parameter"))); + BasicDialog stpEditDialog = pane.showWindow(DesignerContext.getDesignerFrame()); + stpEditDialog.addDialogActionListener(new DialogActionAdapter() { + + @Override + public void doOk() { + StoreProcedureParameter spp = pane.update(); + setSelectedValue(spp); + fireTableDataChanged(); + } + }); + stpEditDialog.setVisible(true); + } + + @Override + public void checkEnabled() { + if (table.getSelectedRow() < 0) { + this.setEnabled(false); + } else { + this.setEnabled(true); + } + } + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/TableDataManagerPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/TableDataManagerPane.java new file mode 100644 index 0000000000..76eeeb0048 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/TableDataManagerPane.java @@ -0,0 +1,100 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import com.fr.design.DesignModelAdapter; +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.data.datapane.TableDataPaneController; +import com.fr.design.data.datapane.TableDataPaneListPane; +import com.fr.design.fun.TableDataPaneProcessor; +import com.fr.design.gui.frpane.LoadingBasicPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.file.TableDataConfig; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.util.Map; + +public class TableDataManagerPane extends LoadingBasicPane { + + private UITextField tableDataTextField; + private TableDataPaneController tableDataPane; + + @Override + protected void initComponents(JPanel container) { + this.initTableDataManagerPane(container); + } + + private void initTableDataManagerPane(JPanel container) { + container.setLayout(FRGUIPaneFactory.createBorderLayout()); + + JPanel tableDataPathPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + container.add(tableDataPathPane, BorderLayout.NORTH); + + + tableDataPathPane.add(new UILabel(Inter.getLocText("FR-Designer_Save_Path") + ":"), BorderLayout.WEST); + this.tableDataTextField = new UITextField(); + tableDataPathPane.add(tableDataTextField, BorderLayout.CENTER); + this.tableDataTextField.setEditable(false); + TableDataPaneProcessor paneProcessor = ExtraDesignClassManager.getInstance().getSingle(TableDataPaneProcessor.XML_TAG); + TableDataPaneController pane = null; + if (paneProcessor != null) { + pane = paneProcessor.createServerTableDataPane(DesignModelAdapter.getCurrentModelAdapter() + ); + } + tableDataPane = pane == null ? new TableDataPaneListPane() { + public void rename(String oldName, String newName) { + super.rename(oldName, newName); + renameConnection(oldName, newName); + } + } : pane; + container.add(tableDataPane.getPanel(), BorderLayout.CENTER); + } + + + /** + * 名字是否允许 + * @return 是则返回true + */ + public boolean isNamePermitted(){ + return tableDataPane.isNamePermitted(); + } + + /** + * 检查 + * @throws Exception 异常 + */ + public void checkValid() throws Exception { + tableDataPane.checkValid(); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("DS-Server_TableData"); + } + + public void populate(TableDataConfig tableDataConfig) { + //todo 原来界面上显示的xml路径 +// this.tableDataTextField.setText(FRContext.getCurrentEnv().getPath() + File.separator + ProjectConstants.RESOURCES_NAME +// + File.separator + datasourceManager.fileName()); + this.tableDataPane.populate(tableDataConfig); + } + + public void update(TableDataConfig tableDataConfig) { + this.tableDataPane.update(tableDataConfig); + } + + public Map getDsChangedNameMap () { + return this.tableDataPane.getDsNameChangedMap(); + } + + /** + * 设置选中项 + * + * @param index 选中项的序列号 + */ + public void setSelectedIndex(int index) { + this.tableDataPane.setSelectedIndex(index); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/tabledatapane/TreeTableDataPane.java b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/TreeTableDataPane.java new file mode 100644 index 0000000000..41471aa0e3 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/tabledatapane/TreeTableDataPane.java @@ -0,0 +1,45 @@ +package com.fr.design.data.tabledata.tabledatapane; + +import com.fr.design.data.datapane.TreeTableDataDictPane; +import com.fr.data.impl.RecursionTableData; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; + +import java.awt.*; + +public class TreeTableDataPane extends AbstractTableDataPane{ + + protected TreeTableDataDictPane treeTableDataDictPane; + + public TreeTableDataPane() { + this.treeTableDataDictPane = new TreeTableDataDictPane(); + initComponent(); + } + + public TreeTableDataPane(String treeName) { + this.treeTableDataDictPane = new TreeTableDataDictPane(treeName); + initComponent(); + } + + protected void initComponent() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(treeTableDataDictPane, BorderLayout.CENTER); + } + + @Override + public void populateBean(RecursionTableData ob) { + treeTableDataDictPane.populate(ob); + } + + @Override + public RecursionTableData updateBean() { + // TODO Auto-generated method stub + return treeTableDataDictPane.update(); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText(new String[]{"Tree", "DS-TableData"}); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java b/designer-base/src/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java new file mode 100644 index 0000000000..fc94a0618e --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/wrapper/AbstractTableDataWrapper.java @@ -0,0 +1,138 @@ +package com.fr.design.data.tabledata.wrapper; + +import com.fr.base.TableData; +import com.fr.data.TableDataSource; +import com.fr.data.impl.EmbeddedTableData; +import com.fr.design.DesignModelAdapter; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.datapane.preview.PreviewTablePane; +import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.utils.DesignUtils; +import com.fr.general.ComparatorUtils; +import com.fr.stable.ArrayUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public abstract class AbstractTableDataWrapper implements TableDataWrapper { + protected TableData tabledata; + private String name; + private List columnNameList; + public AbstractTableDataWrapper(TableData tabledata) { + this(tabledata,null); + } + + public AbstractTableDataWrapper(TableData tabledata,String name) { + this.tabledata = tabledata; + this.name = name; + } + + public TableData getTableData() { + return tabledata; + } + + /** + * 获取数据集的所有列名list + * + * @return 数据集的所有列名list + * + * + * @date 2014-11-24-下午3:51:41 + * + */ + public List calculateColumnNameList() { + if(columnNameList != null){ + return columnNameList; + } + + DesignModelAdapter adapter = DesignModelAdapter.getCurrentModelAdapter(); + TableDataSource tds = adapter == null ? null : adapter.getBook(); + String[] colNames = tabledata.getColumnNames(tds); + if(ArrayUtils.isNotEmpty(colNames)){ + columnNameList = new ArrayList(); + columnNameList.addAll(Arrays.asList(colNames)); + return columnNameList; + } + + EmbeddedTableData embeddedTableData = null; + try { + embeddedTableData = DesignTableDataManager.previewTableDataNotNeedInputParameters(tds, tabledata, TableData.RESULT_NOT_NEED, false); + } catch (Exception e) { + if (e.getMessage()!=null) { + DesignUtils.errorMessage(e.getMessage()); + } + } + columnNameList = DesignTableDataManager.getColumnNamesByTableData(embeddedTableData); + return columnNameList; + } + + /** + * 生成子节点 + * + * @return 生成子节点 + * + * + * @date 2014-11-24-下午3:51:17 + * + */ + public ExpandMutableTreeNode[] load() { + List namelist = calculateColumnNameList(); + ExpandMutableTreeNode[] res = new ExpandMutableTreeNode[namelist.size()]; + for (int i = 0; i < res.length; i++) { + res[i] = new ExpandMutableTreeNode(namelist.get(i)); + } + + return res; + } + + /** + * 预览数据集 + * + * + * @date 2014-11-24-下午3:50:20 + * + */ + public void previewData() { + PreviewTablePane.previewTableData(tabledata); + } + + /** + * 预览数据集,带有显示值和实际值的标记结果 + * + * @param keyIndex 实际值 + * @param valueIndex 显示值 + * + * + * @date 2014-11-24-下午3:50:20 + * + */ + public void previewData(final int keyIndex,final int valueIndex){ + PreviewTablePane.previewTableData(tabledata, keyIndex, valueIndex); + } + @Override + public String getTableDataName(){ + return name; + } + + /** + * 获取数据集的面板 + * + * @return 数据集面板 + * + * + * @date 2014-11-24-下午3:50:00 + * + */ + public AbstractTableDataPane creatTableDataPane() { + return TableDataFactory.creatTableDataPane(tabledata, name); + } + + public boolean equals (Object obj) { + return obj instanceof AbstractTableDataWrapper + && ComparatorUtils.equals(this.name, ((AbstractTableDataWrapper) obj).getTableDataName()) + && ComparatorUtils.equals(this.tabledata, ((AbstractTableDataWrapper) obj).getTableData()); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java b/designer-base/src/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java new file mode 100644 index 0000000000..c309e1fde4 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/wrapper/ServerTableDataWrapper.java @@ -0,0 +1,57 @@ +package com.fr.design.data.tabledata.wrapper; + +import com.fr.base.BaseUtils; +import com.fr.base.TableData; +import com.fr.data.impl.ClassTableData; +import com.fr.data.impl.DBTableData; +import com.fr.data.impl.EmbeddedTableData; +import com.fr.data.impl.RecursionTableData; +import com.fr.data.impl.storeproc.StoreProcedure; +import com.fr.design.icon.WarningIcon; +import com.fr.stable.StringUtils; + +import javax.swing.*; + +public final class ServerTableDataWrapper extends AbstractTableDataWrapper { + public ServerTableDataWrapper(TableData tabledata) { + super(tabledata); + } + + public ServerTableDataWrapper(TableData tabledata, String name) { + super(tabledata, name); + } + + @Override + public Icon getIcon() { + if (tabledata instanceof DBTableData) { + if (StringUtils.isBlank(((DBTableData) tabledata).getQuery())) + return new WarningIcon(BaseUtils.readImage("/com/fr/design/images/data/dock/serverdatabase.png")); + else + return BaseUtils.readIcon("/com/fr/design/images/data/dock/serverdatabase.png"); + } else if (tabledata instanceof ClassTableData) { + return BaseUtils.readIcon("/com/fr/design/images/data/dock/serverclasstabledata.png"); + } else if (tabledata instanceof EmbeddedTableData) { + return BaseUtils.readIcon("/com/fr/design/images/data/dock/serverdatatable.png"); + }else if(tabledata instanceof RecursionTableData){ + return BaseUtils.readIcon("/com/fr/design/images/data/tree.png"); + } else if (tabledata instanceof StoreProcedure) { + return BaseUtils.readIcon("/com/fr/design/images/data/store_procedure.png"); + } + return BaseUtils.readIcon("/com/fr/design/images/data/dock/serverdatabase.png"); + } + + /** + * 是否异常 + * @return + */ + @Override + public boolean isUnusual() { + //目前只判断DBTableData的异常 + if (tabledata instanceof DBTableData && StringUtils.isBlank(((DBTableData) tabledata).getQuery())) { + return true; + } + return false; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java b/designer-base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java new file mode 100644 index 0000000000..d1ddeb502f --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java @@ -0,0 +1,311 @@ +package com.fr.design.data.tabledata.wrapper; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CancellationException; + +import javax.swing.Icon; +import javax.swing.JOptionPane; +import javax.swing.SwingWorker; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.base.TableData; +import com.fr.data.impl.storeproc.ProcedureDataModel; +import com.fr.data.impl.storeproc.StoreProcedure; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.data.datapane.preview.PreviewTablePane; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.gui.iprogressbar.AutoProgressBar; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.mainframe.DesignerContext; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; + +/** + * StoreProcedureDataWrappe :存储过程的一个返回数据集,不是它本身。
+ * Oracle数据库肯定有它。SQL SERVER就不一定有了,大部分情况下都没有. + *

+ * StoreProcedureNameWrappe :存储过程本身的返回数据集,是它本身。
+ * Oracle数据库有它,但其实没必要,它就是Oracle所有返回数据集的第一个。SQL SERVER肯定有这个东西。 + * StoreProcedureNameWrappe + * 实际就是:以前我们在新建数据集时,从左边的列表中拖动一个存储过程到右边的SQL面板, + * 得到的SQL语句执行后返回的数据集。又因为结果可能得到多个数据集,所以默认用第一个 + * + * @author zhou + * @since 2012-4-12上午10:29:15 + */ +public final class StoreProcedureDataWrapper implements TableDataWrapper { + public static final int PREVIEW_ALL = 0; + public static final int PREVIEW_ONE = 1; + public static AutoProgressBar loadingBar; + + private ProcedureDataModel procedureDataModel; + private String dsName; + private String storeprocedureName; + private StoreProcedure storeProcedure; + private List columnNameList; + private AutoProgressBar connectionBar; + private ProcedureDataModel[] dataModels; + private SwingWorker worker; + private BasicDialog dialog; + private int previewModel; + + public StoreProcedureDataWrapper(StoreProcedure storeProcedure, String storeprocedureName, String dsName) { + this(storeProcedure, storeprocedureName, dsName, true); + } + + + /** + * @param dsName 存储过程一个返回数据集的名字 + * @param storeProcedure 存储过程 + * @param storeprocedureName 存储过程的名字(某些情况下可以为空) + */ + public StoreProcedureDataWrapper(StoreProcedure storeProcedure, String storeprocedureName, String dsName, boolean needLoad) { + this.dsName = dsName; + this.storeProcedure = storeProcedure; + this.storeProcedure.setCalculating(false); + this.storeprocedureName = storeprocedureName; + if (needLoad) { + setWorker(); + } + dialog = PreviewTablePane.getInstance().getDialog(); + dialog.addDialogActionListener(new DialogActionAdapter() { + public void doOk() { + getWorker().cancel(true); + } + + public void doCancel() { + getWorker().cancel(true); + } + }); + loadingBar = new AutoProgressBar(dialog, Inter.getLocText("FR-Designer_Loading_Data"), "", 0, 100) { + public void doMonitorCanceled() { + getDialog().setVisible(false); + getWorker().cancel(true); + } + }; + } + + /** + * 数据集执行结果返回的所有字段 + * + * @return 数据集执行结果返回的所有字段 + * + * + * @date 2014-12-3-下午7:43:17 + * + */ + public List calculateColumnNameList() { + if (columnNameList != null) { + return columnNameList; + } + if (!createStore(false)) { + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Engine_No-tableData")); + return new ArrayList(); + } + columnNameList = Arrays.asList(procedureDataModel.getColumnName()); + return columnNameList; + } + + /** + * 生成子节点 + * + * @return 节点数组 + * + * + * @date 2014-12-3-下午7:06:47 + * + */ + public ExpandMutableTreeNode[] load() { + List namelist; + if (storeProcedure.isCalculating()) { + namelist = Arrays.asList(new String[0]); + } else { + namelist = calculateColumnNameList(); + } + ExpandMutableTreeNode[] res = new ExpandMutableTreeNode[namelist.size()]; + for (int i = 0; i < res.length; i++) { + res[i] = new ExpandMutableTreeNode(namelist.get(i)); + } + + return res; + } + + private boolean createStore(boolean needLoadingBar) { + try { + dataModels = DesignTableDataManager.createLazyDataModel(storeProcedure, needLoadingBar); + if (dataModels == null || dataModels.length == 0) { + return false; + } + for (int i = 0; i < dataModels.length; i++) { + if (ComparatorUtils.equals(this.dsName, storeprocedureName + "_" + dataModels[i].getName())) { + procedureDataModel = dataModels[i]; + break; + } + } + return true; + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage()); + } + return false; + } + + @Override + public Icon getIcon() { + return BaseUtils.readIcon("/com/fr/design/images/data/store_procedure.png"); + } + + /** + * 预览数据 + * + * @param previewModel 预览模式, 全部还是一个 + * + * + * @date 2014-12-3-下午7:05:50 + * + */ + public void previewData(final int previewModel) { + this.previewModel = previewModel; + new SwingWorker() { + + protected Object doInBackground() throws Exception { + loadingBar.close(); + PreviewTablePane.resetPreviewTable(); + dialog.setVisible(true); + return null; + } + }.execute(); + connectionBar = new AutoProgressBar(dialog, Inter.getLocText("Utils-Now_create_connection"), "", 0, 100) { + public void doMonitorCanceled() { + connectionBar.close(); + worker.cancel(true); + } + }; + worker.execute(); + } + + private void setWorker() { + worker = new SwingWorker() { + protected Void doInBackground() throws Exception { + connectionBar.start(); + boolean status = FRContext.getCurrentEnv().testConnection(((StoreProcedure) getTableData()).getDatabaseConnection()); + if (!status) { + connectionBar.close(); + // bug 61345 预览失败时,关闭窗口 + dialog.setVisible(false); + throw new Exception(Inter.getLocText("Datasource-Connection_failed")); + } + connectionBar.close(); + storeProcedure.resetDataModelList(); + createStore(true); + return null; + } + + public void done() { + try { + get(); + loadingBar.close(); + dialog.setVisible(false); + switch (previewModel) { + case StoreProcedureDataWrapper.PREVIEW_ALL: + PreviewTablePane.previewStoreDataWithAllDs(dataModels); + break; + case StoreProcedureDataWrapper.PREVIEW_ONE: + previewData(); + break; + } + } catch (Exception e) { + if (!(e instanceof CancellationException)) { + FRContext.getLogger().error(e.getMessage(), e); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage()); + } + loadingBar.close(); + } + } + }; + } + + private BasicDialog getDialog() { + return this.dialog; + } + + private SwingWorker getWorker() { + return this.worker; + } + + // august:这个只是预览返回的一个数据集 + + /** + * 预览返回的一个数据集 + * + * + * @date 2014-12-3-下午7:42:53 + * + */ + public void previewData() { + previewData(-1, -1); + } + + // august:这个只是预览返回的一个数据集 + + /** + * 预览返回的一个数据集,带有显示值和实际值的标记结果 + * + * @param keyIndex 实际值 + * @param valueIndex 显示值 + * + * + * @date 2014-12-3-下午7:42:27 + * + */ + public void previewData(final int keyIndex, final int valueIndex) { + PreviewTablePane.previewStoreData(procedureDataModel, keyIndex, valueIndex); + } + + + /** + * 预览返回的所有数据集,只有在编辑存储过程时才用到 + */ + public void previewAllTable() { + if (procedureDataModel == null) { + if (!createStore(true)) { + return; + } + } + PreviewTablePane.previewStoreDataWithAllDs(dataModels); + } + + @Override + public String getTableDataName() { + return dsName; + } + + public TableData getTableData() { + return storeProcedure; + } + + public String getStoreprocedureName() { + return storeprocedureName; + } + + /** + * 是否异常 + * + * @return 是否异常 + */ + public boolean isUnusual() { + return false; + } + + public boolean equals(Object obj) { + return obj instanceof StoreProcedureDataWrapper + && ComparatorUtils.equals(this.dsName, ((StoreProcedureDataWrapper) obj).getTableDataName()) + && ComparatorUtils.equals(this.storeProcedure, ((StoreProcedureDataWrapper) obj).getTableData()) + && ComparatorUtils.equals(this.storeprocedureName, ((StoreProcedureDataWrapper) obj).getStoreprocedureName()); + + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java b/designer-base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java new file mode 100644 index 0000000000..d3bcde9e01 --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java @@ -0,0 +1,153 @@ +package com.fr.design.data.tabledata.wrapper; + +import com.fr.base.BaseUtils; +import com.fr.base.Env; +import com.fr.base.FRContext; +import com.fr.base.TableData; +import com.fr.design.data.DesignTableDataManager; +import com.fr.data.impl.storeproc.ProcedureDataModel; +import com.fr.data.impl.storeproc.StoreProcedure; +import com.fr.design.data.datapane.preview.PreviewTablePane; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.env.RemoteEnv; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * StoreProcedureDataWrappe :存储过程的一个返回数据集,不是它本身。
+ * Oracle数据库肯定有它。SQL SERVER就不一定有了,大部分情况下都没有. + *

+ * StoreProcedureNameWrappe :存储过程本身的返回数据集,是它本身。
+ * Oracle数据库有它,但其实没必要,它就是Oracle所有返回数据集的第一个。SQL SERVER肯定有这个东西。 + * StoreProcedureNameWrappe + * 实际就是:以前我们在新建数据集时,从左边的列表中拖动一个存储过程到右边的SQL面板, + * 得到的SQL语句执行后返回的数据集。又因为结果可能得到多个数据集,所以默认用第一个 + * + * @author zhou + * @since 2012-4-12上午10:29:15 + */ +public final class StoreProcedureNameWrapper implements TableDataWrapper { + private ProcedureDataModel procedureDataModel; + private String name; + private StoreProcedure storeProcedure; + private List columnNameList; + + /** + * @param name 存储过程本身名字 + * @param storeProcedure 存储过程 + */ + public StoreProcedureNameWrapper(String name, StoreProcedure storeProcedure) { + this.name = name; + this.storeProcedure = storeProcedure; + } + + /** + * 生成子节点 + * + * @return 子节点 + */ + public ExpandMutableTreeNode[] load() { + List namelist = calculateColumnNameList(); + ExpandMutableTreeNode[] res = new ExpandMutableTreeNode[namelist.size()]; + for (int i = 0; i < res.length; i++) { + res[i] = new ExpandMutableTreeNode(namelist.get(i)); + } + + return res; + } + + @Override + public String getTableDataName() { + return name; + } + + public TableData getTableData() { + return storeProcedure; + } + + @Override + public Icon getIcon() { + return BaseUtils.readIcon("/com/fr/design/images/data/store_procedure.png"); + } + + private void createStore(boolean needLoadingBar) { + try { + procedureDataModel = DesignTableDataManager.createLazyDataModel(storeProcedure, needLoadingBar)[0]; + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage()); + } + } + + /** + * 数据集执行结果返回的所有字段 + *

+ * TODO:要不要加上Exception呢?个人感觉很有必要 + * + * @return 字段 + */ + public List calculateColumnNameList() { + if (columnNameList != null) { + return columnNameList; + } + columnNameList = new ArrayList(); + Env env = FRContext.getCurrentEnv(); + if (env instanceof RemoteEnv) { + try { + createStore(false); + columnNameList = Arrays.asList(procedureDataModel.getColumnName()); + } catch (Exception e) { + FRContext.getLogger().errorWithServerLevel(e.getMessage(), e); + } + + } else { + if (procedureDataModel == null) { + createStore(false); + } + if (procedureDataModel != null) { + columnNameList = Arrays.asList(procedureDataModel.getColumnName()); + } + } + return columnNameList; + } + + /** + * 预览数据集 + */ + public void previewData() { + if (procedureDataModel == null) { + createStore(true); + } + PreviewTablePane.previewStoreData(procedureDataModel); + + } + + /** + * 预览数据集,带有显示值和实际值的标记结果 + * + * @param keyIndex 显示值Index + * @param valueIndex 实际值index + */ + public void previewData(int keyIndex, int valueIndex) { + if (procedureDataModel == null) { + createStore(true); + } + PreviewTablePane.previewStoreData(procedureDataModel, keyIndex, valueIndex); + } + + /** + * 是否异常 + * + * @return 异常返回true + */ + public boolean isUnusual() { + return false; + } + + public StoreProcedure getStoreProcedure() { + return storeProcedure; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/wrapper/TableDataFactory.java b/designer-base/src/com/fr/design/data/tabledata/wrapper/TableDataFactory.java new file mode 100644 index 0000000000..622f88204c --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/wrapper/TableDataFactory.java @@ -0,0 +1,196 @@ +package com.fr.design.data.tabledata.wrapper; + +import com.fr.base.FRContext; +import com.fr.base.TableData; +import com.fr.data.TableDataSource; +import com.fr.data.impl.*; +import com.fr.data.impl.storeproc.StoreProcedure; +import com.fr.design.data.datapane.TableDataNameObjectCreator; +import com.fr.design.data.tabledata.tabledatapane.*; +import com.fr.file.TableDataConfig; +import com.fr.general.ComparatorUtils; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; + +import java.lang.reflect.Constructor; +import java.util.*; +import java.util.Map.Entry; + +/** + * 根据TableData取对应的一些属性 + * + * @author zhou + * @since 2012-3-28下午10:03:52 + */ +public abstract class TableDataFactory { + /** + * 有顺序的,用来排序用 + */ + private static Map map = new java.util.LinkedHashMap<>(); + + private static Map defaultMap = new LinkedHashMap<>(); + + /** + * 同一类型的只能加一次,就加最上层的类,因为要排序。如果将所有的 FileTableData都加进来,那么FileTableData的排序就不正确了 + */ + static { + defaultMap.put(DBTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/images/data/database.png", DBTableData.class, DBTableDataPane.class)); + defaultMap.put(ClassTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/images/data/source/classTableData.png", ClassTableData.class, ClassTableDataPane.class)); + defaultMap.put(EmbeddedTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/images/data/dataTable.png", EmbeddedTableData.class, EmbeddedTableDataPane.class)); + defaultMap.put(DecoratedTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/images/data/multi.png", DecoratedTableData.class, DecoratedTableDataPane.class)); + defaultMap.put(StoreProcedure.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/images/data/store_procedure.png", StoreProcedure.class, ProcedureDataPane.class)); + defaultMap.put(MultiTDTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/images/data/multi.png", MultiTDTableData.class, MultiTDTableDataPane.class)); + defaultMap.put(FileTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/images/data/file.png", FileTableData.class, FileTableDataPane.class)); + defaultMap.put(RecursionTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/images/data/tree.png", RecursionTableData.class, TreeTableDataPane.class)); + defaultMap.put(MultiFieldTableData.class.getName(), new TableDataNameObjectCreator(null, "/com/fr/design/images/data/database.png", MultiFieldTableData.class, null)); + map.putAll(defaultMap); + } + + /** + * 注册组件 + * + * @param clazz 数据集类 + * @param creator 组件 + */ + public static void registerExtra(Class clazz, TableDataNameObjectCreator creator) { + + map.put(clazz.getName(), creator); + } + + public static void removeExtra(Class clazz) { + + String name = clazz.getName(); + if (defaultMap.containsKey(name)) { + map.put(name, defaultMap.get(name)); + } else { + map.remove(name); + } + } + + private static TableDataNameObjectCreator getTableDataNameObjectCreator(TableData tabledata) { + + TableDataNameObjectCreator tableDataNameObjectCreator = map.get(tabledata.getClass().getName()); + if (tableDataNameObjectCreator == null) { + tableDataNameObjectCreator = map.get(tabledata.getClass().getSuperclass().getName()); + if (tableDataNameObjectCreator == null) { + tableDataNameObjectCreator = map.get(tabledata.getClass().getSuperclass().getSuperclass().getName());// 最多三层吧,不够再加 + // 不用循环了 + } + } + return tableDataNameObjectCreator; + } + + + /** + * 获取数据集所对应的编辑面板 + * + * @param tabledata 数据集 + * @param name 名字 + * @return 返回数据集对应的pane + */ + public static AbstractTableDataPane creatTableDataPane(TableData tabledata, String name) { + AbstractTableDataPane datapane = null; + TableDataNameObjectCreator tableDataNameObjectCreator = getTableDataNameObjectCreator(tabledata); + Class> creatorClass = (Class>) tableDataNameObjectCreator.getUpdatePane(); + if (tableDataNameObjectCreator != null && creatorClass != null) { + try { + if (ComparatorUtils.equals(creatorClass, MultiTDTableDataPane.class) || ComparatorUtils.equals(creatorClass, TreeTableDataPane.class)) { + Constructor constructor = creatorClass.getDeclaredConstructor(new Class[]{String.class}); + constructor.setAccessible(true); + datapane = (AbstractTableDataPane) constructor.newInstance(name); + } else { + datapane = creatorClass.newInstance(); + } + datapane.populateBean(tabledata); // August:不管tabledata是刚刚新建的还是原来的,一律populate进去,如果出错就是代码写的不好 + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + } + return datapane; + } + + /** + * 创建数据集面板 + * + * @param tabledata 数据集 + * @return 返回数据集对应的pane + */ + public static AbstractTableDataPane creatTableDataPane(TableData tabledata) { + return creatTableDataPane(tabledata, StringUtils.EMPTY); + } + + /** + * 获取数据集所对应的图标路径 + * + * @param tabledata + * @return + */ + public static String getIconPath(TableData tabledata) { + TableDataNameObjectCreator tableDataNameObjectCreator = getTableDataNameObjectCreator(tabledata); + if (tableDataNameObjectCreator != null && tableDataNameObjectCreator.getIconPath() != null) { + return tableDataNameObjectCreator.getIconPath(); + } + return "/com/fr/design/images/data/database.png"; + } + + /** + * 获取已经排好顺序的数组 + * 先数据库查询,再程序,再内置数据集,再关联数据集,再文件数据集;这些内部按内部按先数字(0-9)、再字母(a-z)、然后汉字(拼音)进行排序。 + * + * @param source + * @return + */ + @SuppressWarnings("unchecked") + public static String[] getSortOfChineseNameOfTemplateData(TableDataSource source) { + clearAll(); + java.util.Iterator nameIt = source.getTableDataNameIterator(); + while (nameIt.hasNext()) { + String name = nameIt.next(); + TableData td = source.getTableData(name); + addName(name, td); + } + return getSortedNameArray(); + } + + @SuppressWarnings("unchecked") + public static String[] getSortOfChineseNameOfServerData(TableDataConfig tableDataConfig) { + clearAll(); + java.util.Iterator nameIt = tableDataConfig.getTableDatas().keySet().iterator(); + while (nameIt.hasNext()) { + String name = nameIt.next(); + TableData td = TableDataConfig.getInstance().getTableData(name); + addName(name, td); + } + return getSortedNameArray(); + } + + private static String[] getSortedNameArray() { + Iterator> entryIt = map.entrySet().iterator(); + List namelist = new ArrayList(); + while (entryIt.hasNext()) { + Entry entry = entryIt.next(); + TableDataNameObjectCreator tableDataNameObjectCreator = entry.getValue(); + namelist.addAll(tableDataNameObjectCreator.getNames()); + } + return namelist.toArray(ArrayUtils.EMPTY_STRING_ARRAY); + } + + private static void addName(String name, TableData tabledata) { + if (tabledata == null) { + return; + } + + TableDataNameObjectCreator tableDataNameObjectCreator = getTableDataNameObjectCreator(tabledata); + if (tableDataNameObjectCreator == null) { + return; + } + tableDataNameObjectCreator.addNames(name); + } + + private static void clearAll() { + Iterator> entryIt = map.entrySet().iterator(); + while (entryIt.hasNext()) { + entryIt.next().getValue().clear(); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/wrapper/TableDataWrapper.java b/designer-base/src/com/fr/design/data/tabledata/wrapper/TableDataWrapper.java new file mode 100644 index 0000000000..62911facad --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/wrapper/TableDataWrapper.java @@ -0,0 +1,68 @@ +package com.fr.design.data.tabledata.wrapper; + +import com.fr.base.TableData; +import com.fr.design.gui.itree.refreshabletree.loader.ChildrenNodesLoader; + +import javax.swing.*; +import java.util.List; + +/** + * 将TableData包装下 用以区分模板数据集、服务器数据集、存储过程数据集 + * 定义了操作TableData的一些要用的方法:tabledata的名字、图标、产生的列名集合、预览数据集等 + * 注意现在存储过程StoreProcedure本质上不是TableData + * !!Notice:不支持对数据集的修改、重命名等改变TableData的操作。一个既定的数据集 + * (确定的SQL查询语句),对应相应的TableDataWrappe。 如果数据集变化了,那么TableDataWrappe也会重新生成。 + * 用以保证>>>>>>>>calculateColumnNameList()只计算一次,而且是正确的<<<<<< + * + * @author zhou + * @since 2012-3-28下午9:51:49 + */ +public interface TableDataWrapper extends ChildrenNodesLoader { + + /** + * 数据集名字 + * + * @return + */ + public String getTableDataName(); + + /** + * TableData + * + * @return + */ + public TableData getTableData(); + + /** + * 数据集图标 + * + * @return + */ + public Icon getIcon(); + + /** + * 数据集执行结果返回的所有字段 + * + * TODO:要不要加上Exception呢?个人感觉很有必要 + * @return + */ + public List calculateColumnNameList(); + + /** + * 预览数据集 + */ + public void previewData(); + + /** + * 预览数据集,带有显示值和实际值的标记结果 + */ + public void previewData(final int keyIndex, final int valueIndex); + + /** + * 是否异常 TODO:这个应该和calculateColumnNameList方法结合在一起 + * + * @return + */ + public boolean isUnusual(); + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/data/tabledata/wrapper/TemplateTableDataWrapper.java b/designer-base/src/com/fr/design/data/tabledata/wrapper/TemplateTableDataWrapper.java new file mode 100644 index 0000000000..49e6f625ae --- /dev/null +++ b/designer-base/src/com/fr/design/data/tabledata/wrapper/TemplateTableDataWrapper.java @@ -0,0 +1,37 @@ +package com.fr.design.data.tabledata.wrapper; + +import javax.swing.Icon; + +import com.fr.base.BaseUtils; +import com.fr.base.TableData; +import com.fr.data.impl.DBTableData; +import com.fr.design.icon.WarningIcon; +import com.fr.stable.StringUtils; + +public final class TemplateTableDataWrapper extends AbstractTableDataWrapper { + public TemplateTableDataWrapper(TableData tabledata) { + super(tabledata); + } + + public TemplateTableDataWrapper(TableData tabledata, String name) { + super(tabledata, name); + } + + @Override + public Icon getIcon() { + if (tabledata instanceof DBTableData && StringUtils.isBlank(((DBTableData) tabledata).getQuery())) { + return new WarningIcon(BaseUtils.readImage("/com/fr/design/images/data/database.png")); + } + return BaseUtils.readIcon(TableDataFactory.getIconPath(tabledata)); + } + + @Override + public boolean isUnusual() { + // 目前只判断DBTableData的异常 + if (tabledata instanceof DBTableData && StringUtils.isBlank(((DBTableData) tabledata).getQuery())) { + return true; + } + return false; + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/designer/EditingState.java b/designer-base/src/com/fr/design/designer/EditingState.java similarity index 100% rename from designer_base/src/com/fr/design/designer/EditingState.java rename to designer-base/src/com/fr/design/designer/EditingState.java diff --git a/designer_base/src/com/fr/design/designer/IntervalConstants.java b/designer-base/src/com/fr/design/designer/IntervalConstants.java similarity index 100% rename from designer_base/src/com/fr/design/designer/IntervalConstants.java rename to designer-base/src/com/fr/design/designer/IntervalConstants.java diff --git a/designer-base/src/com/fr/design/designer/TargetComponent.java b/designer-base/src/com/fr/design/designer/TargetComponent.java new file mode 100644 index 0000000000..ec0878c5c7 --- /dev/null +++ b/designer-base/src/com/fr/design/designer/TargetComponent.java @@ -0,0 +1,179 @@ +package com.fr.design.designer; + +import com.fr.design.DesignState; +import com.fr.design.event.TargetModifiedEvent; +import com.fr.design.event.TargetModifiedListener; +import com.fr.design.mainframe.AuthorityEditPane; +import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; +import com.fr.design.menu.MenuDef; +import com.fr.design.menu.ShortCut; +import com.fr.design.menu.ToolBarDef; +import com.fr.stable.StringUtils; + +import javax.swing.*; + +/** + * 模板设计界面 + */ +public abstract class TargetComponent extends JComponent { + private T target; + + public TargetComponent(T t) { + this.target = t; + } + + public TargetComponent() {} + + // TODO ALEX_SEP JWorkBook不想有copy, paste, cut的操作,怎么办? + public abstract void copy(); + + public abstract boolean paste(); + + public abstract boolean cut(); + + public abstract void stopEditing(); + + public T getTarget() { + return target; + } + + + public abstract AuthorityEditPane createAuthorityEditPane(); + + public abstract ToolBarMenuDockPlus getToolBarMenuDockPlus(); + + public abstract int getMenuState(); + + public abstract JPanel getEastUpPane(); + + public abstract JPanel getEastDownPane(); + + public abstract void cancelFormat(); + + public void setTarget(T t) { + if (t != null) { + this.target = t; + } + } + + ///////////////////////////////////////Event Listener////////////// + + /** + * Adds a TargetModifiedListener to the listener list. + */ + public void addTargetModifiedListener(TargetModifiedListener targetModifiedListener) { + this.listenerList.add(TargetModifiedListener.class, targetModifiedListener); + } + + /** + * Removes a TargetModifiedListener from the listener list. + */ + public void removeTargetModifiedListener(TargetModifiedListener targetModifiedListener) { + this.listenerList.remove(TargetModifiedListener.class, targetModifiedListener); + } + + /** + * Fire template modified listeners. + */ + public void fireTargetModified() { + // Guaranteed to return a non-null array + Object[] listeners = listenerList.getListenerList(); + + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == TargetModifiedListener.class) { + ((TargetModifiedListener) listeners[i + 1]).targetModified(new TargetModifiedEvent(this)); + } + } + + this.repaint(30); + } + + ///////////////////////////////////////ToolBarMenuDock////////////// + public abstract ToolBarDef[] toolbars4Target(); + + public abstract MenuDef[] menus4Target(); + + public abstract ShortCut[] shortcut4TemplateMenu(); + + public abstract ShortCut[] shortCuts4Authority(); + + public abstract JComponent[] toolBarButton4Form(); + + ///////////////////////////////////////EditingState////////////// + + public EditingState createEditingState() { + return EditingState.NULL; + } + + public static final TargetComponent NULLAVOID = new TargetComponent(StringUtils.EMPTY) { + + @Override + public void copy() { + } + + @Override + public boolean paste() { + return false; + } + + public int getMenuState(){ + return DesignState.WORK_SHEET; + } + + public void cancelFormat() { + return; + } + + @Override + public boolean cut() { + return false; + } + + @Override + public void stopEditing() { + } + + public AuthorityEditPane createAuthorityEditPane() { + return null; + } + + public ToolBarMenuDockPlus getToolBarMenuDockPlus() { + return null; + } + + @Override + public ToolBarDef[] toolbars4Target() { + return new ToolBarDef[0]; + } + + @Override + public MenuDef[] menus4Target() { + return new MenuDef[0]; + } + + @Override + public ShortCut[] shortcut4TemplateMenu() { + return new ShortCut[0]; + } + + public ShortCut[] shortCuts4Authority() { + return new ShortCut[0]; + + } + + public JComponent[] toolBarButton4Form() { + return new JComponent[0]; + } + + public JPanel getEastUpPane() { + return new JPanel(); + } + + public JPanel getEastDownPane() { + return new JPanel(); + } + + }; +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/designer/creator/CRPropertyDescriptor.java b/designer-base/src/com/fr/design/designer/creator/CRPropertyDescriptor.java similarity index 100% rename from designer_base/src/com/fr/design/designer/creator/CRPropertyDescriptor.java rename to designer-base/src/com/fr/design/designer/creator/CRPropertyDescriptor.java diff --git a/designer_base/src/com/fr/design/designer/properties/Decoder.java b/designer-base/src/com/fr/design/designer/properties/Decoder.java similarity index 100% rename from designer_base/src/com/fr/design/designer/properties/Decoder.java rename to designer-base/src/com/fr/design/designer/properties/Decoder.java diff --git a/designer_base/src/com/fr/design/designer/properties/Encoder.java b/designer-base/src/com/fr/design/designer/properties/Encoder.java similarity index 100% rename from designer_base/src/com/fr/design/designer/properties/Encoder.java rename to designer-base/src/com/fr/design/designer/properties/Encoder.java diff --git a/designer_base/src/com/fr/design/dialog/AttrScrollPane.java b/designer-base/src/com/fr/design/dialog/AttrScrollPane.java similarity index 100% rename from designer_base/src/com/fr/design/dialog/AttrScrollPane.java rename to designer-base/src/com/fr/design/dialog/AttrScrollPane.java diff --git a/designer-base/src/com/fr/design/dialog/BasicDialog.java b/designer-base/src/com/fr/design/dialog/BasicDialog.java new file mode 100644 index 0000000000..462a2d311a --- /dev/null +++ b/designer-base/src/com/fr/design/dialog/BasicDialog.java @@ -0,0 +1,62 @@ +package com.fr.design.dialog; + +import java.awt.*; + +/* + * @author _denny + */ +public abstract class BasicDialog extends UIDialog { + public static final Dimension SMALL = new Dimension(340, 180); + public static final Dimension MEDIUM = new Dimension(600, 400); + public static final Dimension DEFAULT = new Dimension(660, 600); + public static final Dimension LARGE = new Dimension(900, 600); + public static final Dimension CHART = new Dimension(760, 560); + public static final Dimension MAP_SIZE = new Dimension(760, 450); + public static final Dimension UPDATE_ONLINE_SIZE = new Dimension(600,300); + public static final Dimension TOOLBAR_SIZE = new Dimension(660, 327); + + public BasicDialog(Frame parent) { + super(parent); + } + + public BasicDialog(Dialog parent) { + super(parent); + } + + public BasicDialog(Frame parent, BasicPane pane) { + this(parent, pane, true); + } + + public BasicDialog(Dialog parent, BasicPane pane) { + this(parent, pane, true); + } + + + public BasicDialog(Frame parent, BasicPane pane, boolean isNeedButtonPane) { + super(parent, pane, isNeedButtonPane); + } + + public BasicDialog(Dialog parent, BasicPane pane, boolean isNeedButtonPane) { + super(parent, pane, isNeedButtonPane); + } + + protected void setBasicDialogSize(Dimension d) { + super.setSize(d.width, d.height); + } + + protected void setBasicDialogSize(int w, int h) { + super.setSize(w, h); + } + + @Override + public void setSize(Dimension d) { + throw new UnsupportedOperationException(); + } + + @Override + public void setSize(int width, int height) { + throw new UnsupportedOperationException(); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/dialog/BasicPane.java b/designer-base/src/com/fr/design/dialog/BasicPane.java new file mode 100644 index 0000000000..c705b0e1de --- /dev/null +++ b/designer-base/src/com/fr/design/dialog/BasicPane.java @@ -0,0 +1,442 @@ +package com.fr.design.dialog; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.general.Inter; +import com.fr.stable.core.PropertyChangeAdapter; +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import java.awt.*; + +/* + * _denny: 这里的BasicPane通常会有populate & update方法 + * 记得populate 一定要在对应的dialog setVisible之前populate + */ +public abstract class BasicPane extends JPanel { + + /** + * 显示窗口 + * + * @param window 窗口 + * @return 对话框 + */ + public BasicDialog showWindow(Window window) { + return this.showWindow(window, null); + } + + + /** + * 显示窗口 + * + * @param window 窗口 + * @param l 对话框监听器 + * @return 对话框 + */ + public BasicDialog showWindow(Window window, DialogActionListener l) { + BasicDialog dg; + if (window instanceof Frame) { + dg = new DIALOG((Frame) window); + } else { + dg = new DIALOG((Dialog) window); + } + + if (l != null) { + dg.addDialogActionListener(l); + } + + dg.setBasicDialogSize(BasicDialog.DEFAULT); + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + /** + * 显示窗口 + * + * @param dg 已添加监听器的对话框实例 + * @return 对话框 + */ + public BasicDialog showWindow(BasicDialog dg) { + dg.setBasicDialogSize(BasicDialog.DEFAULT); + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + /** + * 显示窗口 + * + * @param window 窗口 + * @param isNeedButtonsPane 是否需要确定删除按钮 + * @return 对话框 + */ + public BasicDialog showWindow(Window window, boolean isNeedButtonsPane) { + BasicDialog dg; + if (window instanceof Frame) { + dg = new DIALOG((Frame) window, isNeedButtonsPane); + } else { + dg = new DIALOG((Dialog) window, isNeedButtonsPane); + } + dg.setBasicDialogSize(BasicDialog.DEFAULT); + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + + /** + * 图表类型选择时 弹出的按钮大小, 不适合用最大最小, 因为图表大小 默认是规定好的, 那么界面大小也是必须配合. + * 并且包括 条件显示中 多个条件的大小 + * + * @param window 窗口 + * @param l 监听器 + * @return 对话框 + */ + public BasicDialog showWindow4ChartType(Window window, DialogActionListener l) { + BasicDialog dg; + if (window instanceof Frame) { + dg = new DIALOG((Frame) window); + } else { + dg = new DIALOG((Dialog) window); + } + + if (l != null) { + dg.addDialogActionListener(l); + } + + dg.setBasicDialogSize(BasicDialog.CHART); + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + /** + * 显示窗口 + * + * @param window 窗口 + * @param l 对话框监听器 + * @return 对话框 + */ + public BasicDialog showSmallWindow(Window window, DialogActionListener l) { + BasicDialog dg; + if (window instanceof Frame) { + dg = new DIALOG((Frame) window); + } else { + dg = new DIALOG((Dialog) window); + } + + if (l != null) { + dg.addDialogActionListener(l); + } + dg.setBasicDialogSize(BasicDialog.SMALL); + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + /** + * 显示窗口 + * + * @param window 窗口 + * @param l 对话框监听器 + * @return 对话框 + */ + public BasicDialog showMediumWindow(Window window, DialogActionListener l) { + BasicDialog dg; + if (window instanceof Frame) { + dg = new DIALOG((Frame) window); + } else { + dg = new DIALOG((Dialog) window); + } + + if (l != null) { + dg.addDialogActionListener(l); + } + dg.setBasicDialogSize(BasicDialog.MEDIUM); + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + /** + * 显示窗口 + * + * @param window 窗口 + * @param l 对话框监听器 + * @return 对话框 + */ + public BasicDialog showLargeWindow(Window window, DialogActionListener l) { + BasicDialog dg; + if (window instanceof Frame) { + dg = new DIALOG((Frame) window); + } else { + dg = new DIALOG((Dialog) window); + } + + if (l != null) { + dg.addDialogActionListener(l); + } + dg.setBasicDialogSize(BasicDialog.LARGE); + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + /** + * 显示窗口 + * + * @param window 窗口 + * @param l 对话框监听器 + * @return 对话框 + */ + public UIDialog showUnsizedWindow(Window window, DialogActionListener l) { + UIDialog dg; + if (window instanceof Frame) { + dg = new UnsizedDialog((Frame) window); + } else { + dg = new UnsizedDialog((Dialog) window); + } + + if (l != null) { + dg.addDialogActionListener(l); + } + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + /** + * 显示窗口 + * + * @param window 窗口 + * @param l 对话框监听器 + * @return 对话框 + */ + public BasicDialog showWindow4ChartMapArray(Window window, DialogActionListener l) { + BasicDialog dg; + if (window instanceof Frame) { + dg = new DIALOG((Frame) window); + } else { + dg = new DIALOG((Dialog) window); + } + + if (l != null) { + dg.addDialogActionListener(l); + } + dg.setBasicDialogSize(BasicDialog.MAP_SIZE); + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + + /** + * 显示窗口 + * + * @param window 窗口 + * @return 对话框 + */ + public BasicDialog showWindow4UpdateOnline(Window window) { + BasicDialog dg; + if (window instanceof Frame) { + dg = new DIALOG((Frame) window, false); + } else { + dg = new DIALOG((Dialog) window, false); + } + dg.setBasicDialogSize(BasicDialog.UPDATE_ONLINE_SIZE); + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + /** + * 显示窗口 + * + * @param window 窗口 + * @param l 对话框监听器 + * @return 对话框 + */ + public BasicDialog showToolBarWindow(Window window, DialogActionListener l) { + BasicDialog dg; + if (window instanceof Frame) { + dg = new DIALOG((Frame) window); + } else { + dg = new DIALOG((Dialog) window); + } + + if (l != null) { + dg.addDialogActionListener(l); + } + dg.setBasicDialogSize(BasicDialog.TOOLBAR_SIZE); + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + protected abstract String title4PopupWindow(); + + public String getTitle() { + return title4PopupWindow(); + } + + /** + * 作为名字面板 + * + * @return 面板 + */ + public NamePane asNamePane() { + return new NamePane(this); + } + + /** + * 检查是否符合规范 + * + * @throws Exception 异常 + */ + public void checkValid() throws Exception { + } + + public static final class NamePane extends BasicPane { + private UITextField nameTextField; + private BasicPane centerPane; + private UILabel showfield; + private PropertyChangeAdapter changeListener; + + private NamePane(BasicPane bPane) { + this.setLayout(new BorderLayout(4, 4)); + + nameTextField = new UITextField(30); + JPanel northPane = new JPanel(new BorderLayout(4, 4)); + northPane.add(new UILabel(Inter.getLocText("FR-Designer-Hyperlink_Name") + ":"), BorderLayout.WEST); + northPane.add(nameTextField, BorderLayout.CENTER); + northPane.add(showfield = new UILabel(" "), BorderLayout.EAST); + showfield.setForeground(new Color(204, 0, 1)); + showfield.setPreferredSize(new Dimension(220, showfield.getPreferredSize().height)); + this.add(northPane, BorderLayout.NORTH); + this.centerPane = bPane; + this.add(bPane, BorderLayout.CENTER); + this.nameTextField.getDocument().addDocumentListener(new javax.swing.event.DocumentListener() { + + @Override + public void insertUpdate(DocumentEvent e) { + doTextChanged(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + doTextChanged(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + doTextChanged(); + } + + }); + } + + private void doTextChanged() { + if (changeListener != null) { + changeListener.propertyChange(); + } + } + + public String getObjectName() { + return this.nameTextField.getText().trim(); + } + + public void setObjectName(String name) { + this.nameTextField.setText(name); + } + + public void setShowText(String name) { + this.showfield.setText(name); + } + + @Override + protected String title4PopupWindow() { + return centerPane.title4PopupWindow(); + } + + /** + * 检查是否符合规范 + * + * @throws Exception 异常 + */ + public void checkValid() throws Exception { + super.checkValid(); + + this.centerPane.checkValid(); + } + + /** + * 添加属性改变的监听器 + * + * @param listener 监听器 + */ + public void addPropertyChangeListener(PropertyChangeAdapter listener) { + this.changeListener = listener; + } + } + + private class DIALOG extends BasicDialog { + public DIALOG(Frame parent) { + super(parent, BasicPane.this); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + public DIALOG(Dialog parent) { + super(parent, BasicPane.this); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + + public DIALOG(Frame parent, boolean isNeedButtonPane) { + super(parent, BasicPane.this, isNeedButtonPane); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + + public DIALOG(Dialog parent, boolean isNeedButtonPane) { + super(parent, BasicPane.this, isNeedButtonPane); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + + /** + * init Components + */ + + + /** + * Check valid. + */ + public void checkValid() throws Exception { + BasicPane.this.checkValid(); + } + + } + + private class UnsizedDialog extends UIDialog { + + public UnsizedDialog(Frame parent) { + super(parent, BasicPane.this); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + public UnsizedDialog(Dialog parent) { + super(parent, BasicPane.this); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + + public void checkValid() throws Exception { + BasicPane.this.checkValid(); + } + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/dialog/BasicScrollPane.java b/designer-base/src/com/fr/design/dialog/BasicScrollPane.java new file mode 100644 index 0000000000..d67b05d268 --- /dev/null +++ b/designer-base/src/com/fr/design/dialog/BasicScrollPane.java @@ -0,0 +1,211 @@ +package com.fr.design.dialog; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.iscrollbar.UIScrollBar; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.AdjustmentEvent; +import java.awt.event.AdjustmentListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; + +public abstract class BasicScrollPane extends BasicBeanPane{ + private static final long serialVersionUID = -4293765343535336275L; + private static final int MAXVALUE = 100; + private static final int DET_WIDTH_OVER_HEIGHT = 4; + private static final int DET_HEIGHT = 5; + private static final int DET_WIDTH = 12; + private static final int MOUSE_WHELL_SPEED = 5; + private int maxheight = 280; + private int beginY = 0; + protected Color original; + + private UIScrollBar scrollBar; + protected JPanel leftcontentPane; + + + protected abstract JPanel createContentPane(); + + protected BasicScrollPane() { + enableEvents(AWTEvent.MOUSE_WHEEL_EVENT_MASK); + original = this.getBackground(); + this.setLayout(new BarLayout()); + scrollBar = new UIScrollBar(JScrollBar.VERTICAL) { + private static final long serialVersionUID = 155777947121777223L; + + @Override + public int getVisibleAmount() { + int preferheight = leftcontentPane.getPreferredSize().height; + if(preferheight <= 0) { + return 0; + } + int e = MAXVALUE * (getHeight() - 1) / preferheight; + setVisibleAmount(e); + return e; + } + + @Override + public int getMaximum() { + return MAXVALUE; + } + + }; + this.add(scrollBar); + scrollBar.addAdjustmentListener(new AdjustmentListener() { + + @Override + public void adjustmentValueChanged(AdjustmentEvent e) { + ajustValues(); + } + }); + // august:鼠标滚轮滑动事件 + this.addMouseWheelListener(new MouseWheelListener() { + + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + int value = scrollBar.getValue(); + value += MOUSE_WHELL_SPEED * e.getWheelRotation(); + scrollBar.setValue(value); + ajustValues(); + } + }); + + layoutContentPane(); + } + + //上层pane已经有了scroll,需要把事件屏蔽掉 + protected BasicScrollPane(boolean noScroll) { + original = this.getBackground(); + this.setLayout(new BarLayout()); + scrollBar = new UIScrollBar(JScrollBar.VERTICAL) { + private static final long serialVersionUID = 155777947121777223L; + + @Override + public int getVisibleAmount() { + int preferheight = leftcontentPane.getPreferredSize().height; + if(preferheight <= 0) { + return 0; + } + int e = MAXVALUE * (getHeight() - 1) / preferheight; + setVisibleAmount(e); + return e; + } + + @Override + public int getMaximum() { + return MAXVALUE; + } + + }; + this.add(scrollBar); + layoutContentPane(); + } + + protected void layoutContentPane() { + leftcontentPane = createContentPane(); + leftcontentPane.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 5, original)); + this.add(leftcontentPane); + } + + /** + * august:不容易啊 还要用笔画图立个方程才计算出来 + * + * @param + */ + protected void ajustValues() { + doLayout(); + } + + protected class BarLayout implements LayoutManager { + + @Override + public void addLayoutComponent(String name, Component comp) { + + } + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return leftcontentPane.getPreferredSize(); + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return leftcontentPane.getMinimumSize(); + } + + @Override + public void layoutContainer(Container parent) { + if(getHeight() >= leftcontentPane.getPreferredSize().height) { + scrollBar.setEnabled(false); + scrollBar.setVisible(false); + } else { + boolean show = isShowScrollBar(); + scrollBar.setEnabled(show); + scrollBar.setVisible(show); + } + maxheight = getHeight() - DET_HEIGHT; + if ((MAXVALUE - scrollBar.getVisibleAmount()) == 0) { + beginY = 0; + } else { + int preferheight = leftcontentPane.getPreferredSize().height; + int value = scrollBar.getValue(); + + int baseValue = MAXVALUE - scrollBar.getVisibleAmount(); + beginY = baseValue == 0 ? 0 : value * (preferheight - maxheight) / baseValue; + if(MAXVALUE - scrollBar.getVisibleAmount() != 0) { + beginY = value * (preferheight - maxheight) / (MAXVALUE - scrollBar.getVisibleAmount()); + } + } + setLeftContentPaneBounds(parent, scrollBar, beginY, maxheight); + leftcontentPane.validate(); + } + + } + + protected void setLeftContentPaneBounds(Container parent, UIScrollBar scrollBar, int beginY, int maxheight) { + int width = parent.getWidth(); + int height = parent.getHeight(); + if (leftcontentPane.getPreferredSize().height > maxheight && scrollBar.isVisible()) { + leftcontentPane.setBounds(0, -beginY, width - scrollBar.getWidth() + getOverWidth() - DET_WIDTH_OVER_HEIGHT, height + beginY); + scrollBar.setBounds(width - scrollBar.getWidth() - 1, 0, scrollBar.getWidth(), height); + } else { + int hideBarWidth = hideBarWidth() ? scrollBar.getWidth() : 0; + leftcontentPane.setBounds(0, 0, width - DET_WIDTH + hideBarWidth, height); + } + } + + protected int getOverWidth(){ + return 0; + } + + protected boolean hideBarWidth(){ + return false; + } + + protected boolean isShowScrollBar() { + return true; + } + + @Override + public T updateBean() { + return null; + } + + /** + * 用于在调用removeAll以后恢复原来pane的结构,放在这边是因为BarLayout是内部类 + * @param pane + */ + public void reloaPane(JPanel pane){ + this.setLayout(new BarLayout()); + this.add(scrollBar); + leftcontentPane = pane; + leftcontentPane.setBorder(BorderFactory.createMatteBorder(0, 10, 0, 5, original)); + this.add(leftcontentPane); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/dialog/DialogActionAdapter.java b/designer-base/src/com/fr/design/dialog/DialogActionAdapter.java new file mode 100644 index 0000000000..5f188f0bda --- /dev/null +++ b/designer-base/src/com/fr/design/dialog/DialogActionAdapter.java @@ -0,0 +1,9 @@ +package com.fr.design.dialog; + +public abstract class DialogActionAdapter implements DialogActionListener { + @Override + public void doOk() {} + + @Override + public void doCancel() {} +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/dialog/DialogActionListener.java b/designer-base/src/com/fr/design/dialog/DialogActionListener.java new file mode 100644 index 0000000000..5628918deb --- /dev/null +++ b/designer-base/src/com/fr/design/dialog/DialogActionListener.java @@ -0,0 +1,8 @@ +package com.fr.design.dialog; + +public interface DialogActionListener { + + public void doOk(); + + public void doCancel(); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/dialog/InformationWarnPane.java b/designer-base/src/com/fr/design/dialog/InformationWarnPane.java new file mode 100644 index 0000000000..fc8643d974 --- /dev/null +++ b/designer-base/src/com/fr/design/dialog/InformationWarnPane.java @@ -0,0 +1,171 @@ +package com.fr.design.dialog; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.BorderFactory; +import javax.swing.ImageIcon; +import javax.swing.JDialog; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import com.fr.base.BaseUtils; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UIToggleButton; +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +import com.fr.design.utils.gui.GUICoreUtils; + +public class InformationWarnPane extends JPanel{ + private UITextArea moreText; + private JPanel controlPane; + private AlertDialog dg; + private String title; + private UIToggleButton arrow; + + private boolean isShow = false; + public void show() { + showWindow(SwingUtilities.getWindowAncestor(this)).setVisible(true); + } + + public InformationWarnPane(String infor, String moreInfo, String title) { + this.title = title; + this.setLayout(null); + this.setBounds(5,5,410,130); + UILabel image = new UILabel(new ImageIcon(getClass().getResource("/com/fr/design/images/buttonicon/warn.png"))); + image.setBounds(10, 25, 80, 80); + UITextArea warnLabel = new UITextArea(infor); + warnLabel.setLineWrap(true); + warnLabel.setWrapStyleWord(true); + warnLabel.setHighlighter(null); + warnLabel. setEditable(false); + warnLabel.setBackground(this.getBackground()); + warnLabel.setBounds(100, 20, 300, 80); + arrow = new UIToggleButton(BaseUtils.readIcon("com/fr/design/images/buttonicon/more.png")); + arrow.setRolloverIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/more3.png")); + arrow.setBorderPainted(false); + arrow.setExtraPainted(false); + + arrow.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + arrow.setSelected(arrow.isSelected()); + boolean isSelected = arrow.isSelected(); + moreText.setVisible(isSelected); + if(isSelected) { + arrow.setIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/more2.png")); + arrow.setRolloverIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/more4.png")); + InformationWarnPane.this.setBounds(5,5,410,265); + controlPane.setBounds(175, 270, 80, 25); + dg.setBounds(dg.getX(), dg.getY(), 430, 330); + } else { + arrow.setIcon(BaseUtils.readIcon("com/fr/design/images/buttonicon/more.png")); + arrow.setRolloverIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/more3.png")); + InformationWarnPane.this.setBounds(5,5,410,130); + controlPane.setBounds(175, 135, 80, 25); + dg.setBounds(dg.getX(), dg.getY(), 430, 195); + } + } + }); + + arrow.setBounds(90,100,30,30); + UILabel more = new UILabel(""+Inter.getLocText("More-information")+""); + more.setBounds(125,102,55,25); + + moreText = new UITextArea(moreInfo); + moreText.setForeground(Color.blue); + moreText.setBounds(100,130,300,130); + moreText.setLineWrap(true); + moreText.setWrapStyleWord(true); + moreText.setHighlighter(null); + moreText. setEditable(false); + moreText.setBackground(this.getBackground()); + + moreText.setVisible(arrow.isSelected()); + this.add(image); + this.add(warnLabel); + this.add(arrow); + this.add(more); + this.add(moreText); + } + + public AlertDialog showWindow(Window window) { + isShow = true; + if (window instanceof Frame) { + dg = new AlertDialog((Frame) window); + } else { + dg = new AlertDialog((Dialog) window); + } + dg.setBounds(0, 0, 430, 195); + dg.setIconImage(BaseUtils.readImage("/com/fr/base/images/oem/logo.png")); + GUICoreUtils.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + public boolean isShow() { + return isShow; + } + + private class AlertDialog extends JDialog { + protected UIButton okButton; + + public AlertDialog(Frame parent) { + super(parent); + this.setTitle(InformationWarnPane.this.title); + this.initComponents(); + } + + public AlertDialog(Dialog parent) { + super(parent); + this.setTitle(InformationWarnPane.this.title); + this.initComponents(); + } + + /** + * init Components + */ + protected void initComponents() { + JPanel contentPane = (JPanel) this.getContentPane(); + contentPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + contentPane.setLayout(null); + contentPane.add(InformationWarnPane.this); + contentPane.add(this.createControlButtonPane()); + this.setModal(true); + GUICoreUtils.centerWindow(this); + } + + private JPanel createControlButtonPane() { + controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + + okButton = new UIButton("" + Inter.getLocText("OK") + "") { + @Override + public Dimension getPreferredSize() { + // TODO Auto-generated method stub + return new Dimension(30, 20); + } + }; + controlPane.add(okButton, BorderLayout.CENTER); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + isShow = false; + AlertDialog.this.setVisible(false); + } + }); + controlPane.setBounds(175, 135, 80, 25); + return controlPane; + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/dialog/JWizardDialog.java b/designer-base/src/com/fr/design/dialog/JWizardDialog.java new file mode 100644 index 0000000000..fd8c77b877 --- /dev/null +++ b/designer-base/src/com/fr/design/dialog/JWizardDialog.java @@ -0,0 +1,368 @@ +package com.fr.design.dialog; + +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Dialog; +import java.awt.Frame; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.BorderFactory; +import javax.swing.Icon; +import javax.swing.JDialog; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; + +/** + * Wizard dialog. + */ +public class JWizardDialog extends BasicDialog { + //The label which holds the image to display on the left side of the wizard. + private JPanel logoPanel; + private UILabel logoLabel; + + //The panel to which JWizardPanel's are added. + private JPanel workArea; + + //The layout for the work area. + private CardLayout cardLayout; + + //The current JWizardPanel + private JWizardPanel currentWizard = null; + + private int currentStep = -1; + private int lastStep = -1; + private int panelCount = 0; + + //The buttons + private UIButton buttonBack; + private UIButton buttonNext; + private UIButton buttonFinish; + private UIButton buttonCancel; + + // True if the finish button should be enabled all the time + private boolean enableEarlyFinish = false; + + // True if the cancel button is enabled on the final step + private boolean enableCancelAtEnd = true; + + /** + * Shows dialog + */ + public static JWizardDialog showWindow(Window window) { + if (window instanceof Frame) { + return new JWizardDialog((Frame) window); + } else { + return new JWizardDialog((Dialog) window); + } + } + + protected JWizardDialog(Frame owner) { + super(owner); + initComponents(); + } + + protected JWizardDialog(Dialog owner) { + super(owner); + initComponents(); + } + + /** + * Initialize the JWizardDialog. + */ + protected void initComponents() { + JPanel contentPane = (JPanel)this.getContentPane(); + contentPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + contentPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + this.applyClosingAction(); + this.applyEscapeAction(); + // If the user tries to close the wizard, the result should be the + // same as pressing Cancel + setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); + + // Window close is the same as cancel. If the cancel button is + // disabled, then a window close does nothing + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + if (buttonCancel.isEnabled()) { + cancel(); + } + } + }); + + // Work area for WizardPanel's + workArea = FRGUIPaneFactory.createCardLayout_S_Pane(); + cardLayout = new CardLayout(); + workArea.setLayout(cardLayout); + + // Buttons + buttonBack = new UIButton(Inter.getLocText("Previous")); + buttonBack.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + back(); + } + }); + buttonNext = new UIButton(Inter.getLocText("Next")); + buttonNext.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + next(); + } + }); + buttonFinish = new UIButton(Inter.getLocText("Finish")); + buttonFinish.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + finish(); + } + }); + buttonCancel = new UIButton(Inter.getLocText("Cancel")); + buttonCancel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + cancel(); + } + }); + JPanel buttons = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + + //p:几个按钮必须要等距,所以才需要用GridLayout. + JPanel bbPane = FRGUIPaneFactory.createMediumHGapFlowInnerContainer_M_Pane(); + buttons.add(bbPane); + bbPane.add(buttonBack); + bbPane.add(buttonNext); + bbPane.add(buttonFinish); + bbPane.add(buttonCancel); + + JPanel buttonPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + buttonPanel.add(new JSeparator(), BorderLayout.NORTH); + buttonPanel.add(buttons); + + contentPane.add(buttonPanel, BorderLayout.SOUTH); + contentPane.add(workArea); + + this.setModal(true); + } + + /** + * Add an image which displays on the left side of the wizard. By + * default, no image is displayed. This must be set before the dialog + * is made visible. + * + * @param icon The icon representing the image to display. If null, no + * image is displayed. + */ + public void setWizardIcon(Icon icon) { + // If null, remove any existing logo panel + if (icon == null) { + if (logoPanel != null) { + remove(logoPanel); + logoPanel = null; + logoLabel = null; + } + } + //If not null, add it or replace an existing label + else { + if (logoPanel != null) { + remove(logoPanel); + } + logoPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + logoLabel = new UILabel(icon); + logoPanel.add(logoLabel, BorderLayout.NORTH); + getContentPane().add(logoPanel, BorderLayout.WEST); + } + } + + /** + * Add a panel representing a step in the wizard. Since removing a + * panel would force a renumbering of the remaining panels and since + * you have flexible sequencing control, there is no matching + * removeWizardPanel() method. + * + * @param panel The JWizardPanel to add + */ + + public void addWizardPanel(JWizardPanel panel) { + if (currentWizard == null) { + currentWizard = panel; + currentStep = 0; + } + workArea.add(panel, Integer.toString(panelCount++)); + panel.setWizardParent(this); + } + + /** + * If this method is called, the Finish button is enabled immediately. + * By default, it is enabled only on the last step (any step where the + * next JWizardPanel step is -1). + */ + + public void setEarlyFinish() { + enableEarlyFinish = true; + } + + /** + * If this method is called, the Cancel button is disabled when on the + * last step. If setEarlyFinish() is called, it is still disabled only + * on the last step. + */ + + public void disableCancelAtEnd() { + enableCancelAtEnd = false; + } + + /** + * Returns the current step being displayed by the wizard. Steps start + * at 0. If no step is yet displayed, a -1 is returned. + * + * @return The current step being displayed by the wizard. + */ + + public int getCurrentStep() { + return currentStep; + } + + /** + * Returns the last step displayed by the wizard. Steps start at 0. If + * there is no previous step yet, -1 is returned. + * + * @return The last step being displayed by the wizard. + */ + + public int getLastStep() { + return lastStep; + } + + /** + * Set the sensitivity of each button based on the back and next step + * values. This should be called when changing steps or when the back + * or next button values are changed. + */ + public void applyButtonStates() { + int backStep = currentWizard.getBackStep(); + int nextStep = currentWizard.getNextStep(); + + boolean atBegin = backStep < 0 || backStep >= panelCount; + + boolean atEnd = nextStep < 0 || nextStep >= panelCount; + + buttonBack.setEnabled(!atBegin); + buttonNext.setEnabled(!atEnd); + buttonFinish.setEnabled(enableEarlyFinish || atEnd); + buttonCancel.setEnabled(!atEnd || enableCancelAtEnd); + + // Set the default button + if (buttonNext.isEnabled()) { + getRootPane().setDefaultButton(buttonNext); + } else if (buttonFinish.isEnabled()) { + getRootPane().setDefaultButton(buttonFinish); + } else if (buttonBack.isEnabled()) { + getRootPane().setDefaultButton(buttonBack); + } else { + getRootPane().setDefaultButton(null); + } + } + + /** + * Display the JWizardPanel with the given step number. This method is + * package public so that JWizardPanel can call it. The + * switchToStep() method may override the step choice. + * + * + * @param step The step number of the JWizardPanel to display. + * @see #switchToStep(int,int) + */ + protected void goTo(int step) { + // Give the user a last chance to change things + step = switchToStep(currentStep, step); + + // We can't do anything if we're outside the valid range + if (step < 0 || step >= panelCount) { + return; + } + + // Save the current step as the previous step + lastStep = currentStep; + + currentWizard = (JWizardPanel) workArea.getComponent(step); + currentStep = step; + cardLayout.show(workArea, Integer.toString(step)); + + // Set the button states + applyButtonStates(); + } + + //********************************************************************** + // Protected + //********************************************************************** + + /** + * Called when the Back button is pressed. This calls the back() + * method in the current JWizardPanel. + * + * @see JWizardPanel#back() + */ + protected void back() { + if (currentWizard != null) { + currentWizard.doBack(); + } + } + + /** + * Called when the Next button is pressed. This calls the next() + * method in the current JWizardPanel. + * + * @see JWizardPanel#next() + */ + protected void next() { + if (currentWizard != null) { + currentWizard.doNext(); + } + } + + /** + * Called when the Finish button is pressed. This calls dispose(). You + * will probably want to override this. + */ + protected void finish() { + doOK(); + } + + /** + * Called when the Cancel button is pressed. This calls dispose(). + */ + protected void cancel() { + doCancel(); + } + + /** + * This method is called just prior to switching from one step to + * another (after any next() or back() method is called). It receives + * the current and new indices. By default, it returns the new index. + * You can override the method if you need to control sequencing from + * this JWizardDialog class (normally, each step decides what the back + * and next steps should be). + * + * @param currentIndex The index of the current JWizardPanel. + * @param newIndex The index of the JWizardPanel we are about to display. + * @return The index of the JWizardPanel to display. + */ + protected int switchToStep(int currentIndex, int newIndex) { + return newIndex; + } + + /** + * Get the currentWizard Pane + */ + protected JWizardPanel getCurrentWizard() { + return this.currentWizard; + } + + @Override + public void checkValid() throws Exception { + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/dialog/JWizardPanel.java b/designer-base/src/com/fr/design/dialog/JWizardPanel.java new file mode 100644 index 0000000000..956df9efba --- /dev/null +++ b/designer-base/src/com/fr/design/dialog/JWizardPanel.java @@ -0,0 +1,229 @@ +package com.fr.design.dialog; + +import java.awt.BorderLayout; +import java.awt.Font; + +import javax.swing.BorderFactory; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JPanel; +import javax.swing.JSeparator; + +import com.fr.design.layout.FRGUIPaneFactory; + +/** + * WizardPane. Add with getContentPane(). + */ +public class JWizardPanel extends BasicPane { + JWizardDialog dialogParent; + + // The step title + JPanel titlePanel; + String stepTitle; + UILabel stepTitleLabel; + + // The content pane + JPanel contentPane; + + // The back and next steps + int backStep = -1; + int nextStep = -1; + + // Flags the first time the component is added to a window + boolean firstNotify = true; + + /** + * Creates a new JWizardPanel with a double buffer and a flow layout. The + * flow layout is assigned to the panel accessed through getContentPane(). + */ + public JWizardPanel() { + super(); + initComponents(); + } + + /** + * Initialize the JWizardPanel. + */ + private void initComponents() { + setLayout(FRGUIPaneFactory.createBorderLayout()); + + // Set the layout for the content area + contentPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + + contentPane.setBorder(BorderFactory.createEmptyBorder(2, 2, 4, 4)); + + // Step title + titlePanel =FRGUIPaneFactory.createBorderLayout_S_Pane(); + titlePanel.add(new JSeparator(), BorderLayout.SOUTH); + stepTitleLabel = new UILabel(" "); + titlePanel.add(stepTitleLabel); + + add(titlePanel, BorderLayout.NORTH); + add(contentPane, BorderLayout.CENTER); + } + + @Override + protected String title4PopupWindow() { + return "wizard"; + } + + /** + * Set the title to use for this step. Normally this title would be unique + * for each wizards step. + * + * @param stepTitle The title to use for this step. + */ + public void setStepTitle(String stepTitle) { + this.stepTitle = stepTitle; + stepTitleLabel.setText(stepTitle); + + stepTitleLabel.invalidate(); + validate(); + } + + /** + * Get the step title to use for this step. + * + * @return The step title to use for this step. + */ + public String getStepTitle() { + return stepTitle; + } + + /** + * Get a JPanel to use for adding your own components to this WizardPanel. + * Do not add components directly to the JWizardPanel. The JPanel uses the + * layout given in the JWizardPanel constructor. + * + * @return The JPanel to use for adding components for this wizard step. + */ + public JPanel getContentPane() { + return contentPane; + } + + /** + * Get the wizard step to go to when the Back button is pressed. + * + * @return The wizard step to go to when the Back button is pressed. + */ + + public int getBackStep() { + return backStep; + } + + /** + * Set the wizard step to go to when the Back button is pressed. This should + * be set in the constructor of the JWizardPanel subclass since it + * determines whether the Back button is enabled or not. + * + * @param backStep + * The wizard step to go to when the Back button is pressed. + */ + + public void setBackStep(int backStep) { + this.backStep = backStep; + JWizardDialog dialog = getWizardParent(); + if (dialog != null) { + dialog.applyButtonStates(); + } + } + + /** + * Get the wizard step to go to when the Next button is pressed. + * + * @return The wizard step to go to when the Next button is pressed. + */ + public int getNextStep() { + return nextStep; + } + + /** + * Set the wizard step to go to when the Next button is pressed. This should + * be set in the constructor of the JWizardPanel subclass since it + * determines whether the Next and Finish buttons are enabled or not. + * + * @param nextStep The wizard step to go to when the Next button is pressed. + */ + public void setNextStep(int nextStep) { + this.nextStep = nextStep; + JWizardDialog dialog = getWizardParent(); + if (dialog != null) { + dialog.applyButtonStates(); + } + } + + /** + * Returns the JWizardDialog in which this JWizardPanel resides. This is + * valid only after the panel has been added to the dialog. + * + * @return The JWizardDialog in which this JWizardPanel resides. + */ + + public JWizardDialog getWizardParent() { + return dialogParent; + } + + /** + * Do not call directly. + */ + public void addNotify() { + if (firstNotify) { + Font font = stepTitleLabel.getFont(); + font = font.deriveFont(Font.BOLD, font.getSize() * 14 / 10); + stepTitleLabel.setFont(font); + firstNotify = false; + } + super.addNotify(); + } + + /** + * Set the JWizardDialog parent for this JWizardPanel. + * + * @param dialogParent + * The JWizardPanel parent for this JWizardPanel. + */ + void setWizardParent(JWizardDialog dialogParent) { + this.dialogParent = dialogParent; + } + + /** + * Calls back(). This allows the JWizardDialog to call the protected method + * back(). + * + * @see #back() + */ + + void doBack() { + back(); + } + + /** + * Calls next(). This allows the JWizardDialog to call the protected method + * next(). + * + * @see #next() + */ + void doNext() { + next(); + } + + /** + * Called when the Back button is pressed. By default this displays the + * wizard step set by setBackStep(). + * + * @see #setBackStep(int) + */ + protected void back() { + dialogParent.goTo(getBackStep()); + } + + /** + * Called when the Next button is pressed. By default this displays the + * wizard step set by setNextStep(). + * + * @see #setNextStep(int) + */ + protected void next() { + dialogParent.goTo(getNextStep()); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/dialog/MultiTabPane.java b/designer-base/src/com/fr/design/dialog/MultiTabPane.java new file mode 100644 index 0000000000..15fa17dd22 --- /dev/null +++ b/designer-base/src/com/fr/design/dialog/MultiTabPane.java @@ -0,0 +1,88 @@ +package com.fr.design.dialog; + + +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Dimension; +import java.util.List; + +import javax.swing.JPanel; + +import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.gui.ibutton.UITabGroup; + +/** + * + * 标准的多层Tab切换类型. +* @author kunsnat E-mail:kunsnat@gmail.com +* @version 创建时间:2013-4-22 上午10:31:03 + */ +public abstract class MultiTabPane extends FurtherBasicBeanPane{ + private static final long serialVersionUID = 2298609199400393886L; + protected UITabGroup tabPane; + protected String[] NameArray; + protected JPanel centerPane; + protected CardLayout cardLayout; + protected List paneList; + + protected abstract List initPaneList(); + public abstract void populateBean(T ob); + public abstract void updateBean(T ob); + + public int getSelectedIndex() { + return tabPane.getSelectedIndex(); + } + + public MultiTabPane() { + cardLayout = new CardLayout(); + paneList = initPaneList(); + relayoutWhenListChange(); + } + + /** + * 当List中的界面变化时, 重新布局 + */ + public void relayoutWhenListChange() { + centerPane = new JPanel(cardLayout) { + @Override + public Dimension getPreferredSize() { + if (tabPane.getSelectedIndex() == -1) { + return super.getPreferredSize(); + } else { + return paneList.get(tabPane.getSelectedIndex()).getPreferredSize(); + } + } + }; + NameArray = new String[paneList.size()]; + for (int i = 0; i < paneList.size(); i++) { + BasicPane pane = paneList.get(i); + NameArray[i] = pane.title4PopupWindow(); + centerPane.add(pane, NameArray[i]); + } + + tabPane = new UITabGroup(NameArray) { + @Override + public void tabChanged(int index) { + dealWithTabChanged(index); + } + }; + tabPane.setSelectedIndex(0); + tabPane.tabChanged(0); + initLayout(); + } + + protected void dealWithTabChanged(int index) { + cardLayout.show(centerPane, NameArray[index]); + tabChanged(); + } + + protected void tabChanged() { + + } + + protected void initLayout() { + this.setLayout(new BorderLayout(0, 4)); + this.add(tabPane, BorderLayout.NORTH); + this.add(centerPane, BorderLayout.CENTER); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/dialog/UIDialog.java b/designer-base/src/com/fr/design/dialog/UIDialog.java new file mode 100644 index 0000000000..84a529a47d --- /dev/null +++ b/designer-base/src/com/fr/design/dialog/UIDialog.java @@ -0,0 +1,234 @@ +package com.fr.design.dialog; + +import com.fr.base.FRContext; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.ArrayList; + +/** + * Created with IntelliJ IDEA. + * User: 小灰灰 + * Date: 13-7-16 + * Time: 下午2:17 + * To change this template use File | Settings | File Templates. + */ +public abstract class UIDialog extends JDialog { + public static final String OK_BUTTON = "basic_ok"; + public static final String CANCEL_BUTTON = "basic_cancel"; + private UIButton okButton, cancelButton; + private BasicPane pane; + private java.util.List listeners = new ArrayList(); + private boolean isDoOKSucceed; + + + public UIDialog(Frame parent) { + super(parent); + } + + public UIDialog(Dialog parent) { + super(parent); + } + + + public UIDialog(Frame parent, BasicPane pane) { + this(parent, pane, true); + } + + public UIDialog(Dialog parent, BasicPane pane) { + this(parent, pane, true); + } + + + public UIDialog(Frame parent, BasicPane pane, boolean isNeedButtonPane) { + super(parent); + this.pane = pane; + initComponents(isNeedButtonPane); + } + + public UIDialog(Dialog parent, BasicPane pane, boolean isNeedButtonPane) { + super(parent); + this.pane = pane; + initComponents(isNeedButtonPane); + } + + public void setDoOKSucceed(boolean isOk) { + isDoOKSucceed = isOk; + } + + private void initComponents(boolean isNeedButtonPane) { + JPanel contentPane = (JPanel) this.getContentPane(); + contentPane.setBorder(BorderFactory.createEmptyBorder(2, 4, 4, 4)); + contentPane.setLayout(new BorderLayout(0, 4)); + this.applyClosingAction(); + this.applyEscapeAction(); + contentPane.add(pane, BorderLayout.CENTER); + if (isNeedButtonPane) { + contentPane.add(this.createControlButtonPane(), BorderLayout.SOUTH); + } + this.setName(pane.title4PopupWindow()); + this.setModal(true); + this.pack(); + GUICoreUtils.centerWindow(this); + } + + private JPanel createControlButtonPane() { + JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + + JPanel buttonsPane = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 0)); + controlPane.add(buttonsPane, BorderLayout.EAST); + + //增加一个自定义按钮, 可以用于eg: 设为全局配置 + addCustomButton(buttonsPane); + //确定 + addOkButton(buttonsPane); + //取消 + addCancelButton(buttonsPane); + + this.getRootPane().setDefaultButton(okButton); + + return controlPane; + } + + protected void addCustomButton(JPanel buttonsPane){ + + } + + private void addCancelButton(JPanel buttonsPane) { + cancelButton = new UIButton(Inter.getLocText("Cancel")); + cancelButton.setName(CANCEL_BUTTON); + cancelButton.setMnemonic('C'); + buttonsPane.add(cancelButton); + cancelButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent evt) { + doCancel(); + } + }); + } + + private void addOkButton(JPanel buttonsPane) { + okButton = new UIButton(Inter.getLocText("OK")); + okButton.setName(OK_BUTTON); + okButton.setMnemonic('O'); + buttonsPane.add(okButton); + okButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent evt) { + doOK(); + } + }); + } + + + /** + * 添加监听器 + * + * @param l 监听器 + * + */ + public void addDialogActionListener(DialogActionListener l) { + listeners.add(l); + } + + /** + * 清除所有监听器 + * + */ + public void clearDialogActionListeners() { + listeners.clear(); + } + + /** + * 确定操作 + * + */ + public void doOK() { + try { + checkValid(); + } catch (Exception exp) { + JOptionPane.showMessageDialog(this, exp.getMessage()); + return; + } + + synchronized (this) { + // dialogExit();august:怎么能这儿exit呢,dispose了就是释放了对话框的线程锁了, + // 那么下面的doOk和原来的派遣线程就会竞争执行,万一派遣线程依赖doOk的结果、而doOK又是后执行的,那么就会出错了 + // 这Bug实在是太隐蔽了! + isDoOKSucceed = true; + for (DialogActionListener l : listeners) { + try { + l.doOk(); + } catch (RuntimeException e) { + isDoOKSucceed = false; + FRContext.getLogger().error(e.getMessage()); + } + } + if (isDoOKSucceed) { + dialogExit(); + } + } + } + + /** + * 取消操作 + * + */ + public void doCancel() { + + for (DialogActionListener l : listeners) { + l.doCancel(); + } + dialogExit(); + } + + /** + * Dialog exit. + */ + protected void dialogExit() { + this.setVisible(false); + this.dispose(); + } + + protected void applyClosingAction() { + addWindowListener(new WindowAdapter() { + + public void windowClosing(WindowEvent e) { + doCancel(); + } + }); + } + + protected void applyEscapeAction() { + // default pane. + JPanel defaultPane = (JPanel) this.getContentPane(); + + // esp. + InputMap inputMapAncestor = defaultPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + ActionMap actionMap = defaultPane.getActionMap(); + + // transfer focus to CurrentEditor + inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "dialogExit"); + actionMap.put("dialogExit", new AbstractAction() { + + public void actionPerformed(ActionEvent evt) { + doCancel(); + } + }); + } + + /** + * 检测结果是否合法 + * + */ + public abstract void checkValid() throws Exception; + + public void setButtonEnabled(boolean b) { + this.okButton.setEnabled(b); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/dialog/mobile/MobileRadioCheckPane.java b/designer-base/src/com/fr/design/dialog/mobile/MobileRadioCheckPane.java similarity index 100% rename from designer_base/src/com/fr/design/dialog/mobile/MobileRadioCheckPane.java rename to designer-base/src/com/fr/design/dialog/mobile/MobileRadioCheckPane.java diff --git a/designer-base/src/com/fr/design/dialog/package.html b/designer-base/src/com/fr/design/dialog/package.html new file mode 100644 index 0000000000..b0cb6e5b2c --- /dev/null +++ b/designer-base/src/com/fr/design/dialog/package.html @@ -0,0 +1,8 @@ + + +Defined some dialogs that can be used in your applications of applets, For example: +PageSetupDialog({@link com.fr.dialog.PageSetupDialog PageSetupDialog}), +StyleDialog({@link com.fr.dialog.core.ColorSelectBox ColorSelectBox}), +CellBorderDialog({@link com.fr.dialog.CellBorderDialog CellBorderDialog}).]!> + + \ No newline at end of file diff --git a/designer_base/src/com/fr/design/editor/DoubleDeckValueEditorPane.java b/designer-base/src/com/fr/design/editor/DoubleDeckValueEditorPane.java similarity index 100% rename from designer_base/src/com/fr/design/editor/DoubleDeckValueEditorPane.java rename to designer-base/src/com/fr/design/editor/DoubleDeckValueEditorPane.java diff --git a/designer_base/src/com/fr/design/editor/ValueEditorPane.java b/designer-base/src/com/fr/design/editor/ValueEditorPane.java similarity index 100% rename from designer_base/src/com/fr/design/editor/ValueEditorPane.java rename to designer-base/src/com/fr/design/editor/ValueEditorPane.java diff --git a/designer-base/src/com/fr/design/editor/ValueEditorPaneFactory.java b/designer-base/src/com/fr/design/editor/ValueEditorPaneFactory.java new file mode 100644 index 0000000000..083131f0a7 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/ValueEditorPaneFactory.java @@ -0,0 +1,507 @@ +package com.fr.design.editor; + +import com.fr.base.BaseFormula; +import com.fr.design.editor.editor.BooleanEditor; +import com.fr.design.editor.editor.ColumnRowEditor; +import com.fr.design.editor.editor.ColumnRowGroupEditor; +import com.fr.design.editor.editor.ColumnSelectedEditor; +import com.fr.design.editor.editor.ConstantsEditor; +import com.fr.design.editor.editor.CursorEditor; +import com.fr.design.editor.editor.DateEditor; +import com.fr.design.editor.editor.DoubleEditor; +import com.fr.design.editor.editor.Editor; +import com.fr.design.editor.editor.FormulaEditor; +import com.fr.design.editor.editor.IntegerEditor; +import com.fr.design.editor.editor.NoneEditor; +import com.fr.design.editor.editor.ParameterEditor; +import com.fr.design.editor.editor.SpinnerIntegerEditor; +import com.fr.design.editor.editor.TextEditor; +import com.fr.design.editor.editor.WidgetNameEditor; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itableeditorpane.ParameterTableModel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class ValueEditorPaneFactory { + + /** + * 创建带编辑器的ValueEditorPane + * + * @param editors 自定义的编辑器 + * @return 返回pane + */ + public static ValueEditorPane createValueEditorPane(Editor[] editors) { + return createValueEditorPane(editors, StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 创建编辑器 名称 弹出的ValueEditorPane + * + * @param editors 编辑器 + * @param popupName 弹出的名字 + * @param textEditorValue 值 + * @return 返回pane + */ + public static ValueEditorPane createValueEditorPane(Editor[] editors, String popupName, String textEditorValue) { + return new ValueEditorPane(editors, popupName, textEditorValue); + } + + /** + * 创建编辑器 名称 弹出的ValueEditorPane + * + * @param editors 编辑器 + * @param popupName 弹出的名字 + * @param textEditorValue 值 + * @param editor_center_width 编辑器主体的宽度 + * @return 返回pane + */ + public static ValueEditorPane createValueEditorPane(Editor[] editors, String popupName, String textEditorValue, int editor_center_width) { + return new ValueEditorPane(editors, popupName, textEditorValue, editor_center_width); + } + + /** + * 创建基本的值编辑器面板 + * + * @return 返回值编辑器面板 + */ + public static ValueEditorPane createBasicValueEditorPane() { + return createValueEditorPane(basicEditors(), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 创建公式编辑器面板 + * + * @return 返回公式编辑器面板 + */ + public static ValueEditorPane createFormulaValueEditorPane() { + return createValueEditorPane(new Editor[]{new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula"))}, + StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 创建基本的值编辑器面板 + * + * @param editor_center_width 指定值编辑器的主体宽度 + * @return 返回值编辑器面板 + */ + public static ValueEditorPane createBasicValueEditorPane(int editor_center_width) { + return createValueEditorPane(basicEditors(), StringUtils.EMPTY, StringUtils.EMPTY, editor_center_width); + } + + /** + * Process用的editorPane + * + * @return 值编辑器面板 + */ + public static ValueEditorPane createFormEditorPane() { + return createValueEditorPane(formEditors(), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * StoreProced用的EditorPane + * + * @return 值编辑器面板 + */ + public static ValueEditorPane createStoreProcedValueEditorPane() { + return createValueEditorPane(StoreProcedureEditors(), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 扩展的ValueEditorPane + * + * @return 值编辑器面板 + */ + public static ValueEditorPane createExtendedValueEditorPane() { + return createValueEditorPane(extendedEditors(), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * URL使用的ValueEditorPane + * + * @param popupName 弹出的名字 + * @param textEditorValue 编辑器值 + * @return 值编辑器返回 + */ + public static ValueEditorPane createURLValueEditorPane(String popupName, String textEditorValue) { + return createValueEditorPane(URLEditors(popupName, textEditorValue), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 创建日期的ValueEditorPane + * + * @param popupName 名字 + * @param textEditorValue 值 + * @return 值编辑器面板 + */ + public static ValueEditorPane createDateValueEditorPane(String popupName, String textEditorValue) { + return createValueEditorPane(dateEditors(popupName, textEditorValue), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 带有所有编辑器的ValueEditorPane + * + * @return 值编辑器面板 + */ + public static ValueEditorPane createAllValueEditorPane() { + return createValueEditorPane(allEditors(), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 创建不带公式面板的pane + * + * @return 编辑器面板 + */ + public static ValueEditorPane createBasicEditorWithoutFormulaPane() { + return createValueEditorPane(basicEditorsWithoutFormula(), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 创建NoCRNoColumn + * + * @return 值编辑器 + */ + public static ValueEditorPane createNoCRNoColumnValueEditorPane() { + return createValueEditorPane(noCRnoColumnEditors(), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 创建数值编辑器 + * + * @return 值编辑器 + */ + public static ValueEditorPane createNumberValueEditorPane() { + return createValueEditorPane(numberEditors(), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 创建日期编辑器 + * + * @return 值编辑器 + */ + public static ValueEditorPane createDateValueEditorPane() { + return createValueEditorPane(dateEditors(), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 根据参数paraUseType 创建编辑器类型. + * + * @param paraUseType 参数类型 + * @return 值编辑器 + */ + public static ValueEditorPane createVallueEditorPaneWithUseType(int paraUseType) { + return createVallueEditorPaneWithUseType(paraUseType, null); + } + + public static ValueEditorPane createVallueEditorPaneWithUseType(int paraUseType, HashMap hyperLinkEditorMap) { + if (paraUseType == ParameterTableModel.NO_CHART_USE) { + return createBasicValueEditorPane(); + } else if (paraUseType == ParameterTableModel.FORM_NORMAL_USE) { + return createFormEditorPane(); + } else { + return createChartHotValueEditorPane(hyperLinkEditorMap); + } + } + + /** + * 图表用的参数编辑器的ValueEditorPane + * + * @param hyperLinkEditorMap 超链下拉参数类型 + * @return 值编辑器 + */ + public static ValueEditorPane createChartHotValueEditorPane(HashMap hyperLinkEditorMap) { + return createValueEditorPane(chartHotEditors(hyperLinkEditorMap), StringUtils.EMPTY, StringUtils.EMPTY); + } + + /** + * 基础的一些ValueEditorPane所用到的Editors + * + * @return 值编辑器 + */ + public static Editor[] basicEditors() { + FormulaEditor formulaEditor = new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula")); + return new Editor[]{ + new TextEditor(), + new SpinnerIntegerEditor(), + new DoubleEditor(), + new DateEditor(true, Inter.getLocText("FR-Designer_Date")), + new BooleanEditor(), + formulaEditor + }; + } + + /** + * 表单的一些编辑器. + * + * @return 值编辑器 + */ + public static Editor[] formEditors() { + FormulaEditor formulaEditor = new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula")); + return new Editor[]{ + new TextEditor(), + new IntegerEditor(), + new DoubleEditor(), + new DateEditor(true, Inter.getLocText("FR-Designer_Date")), + new BooleanEditor(), + formulaEditor, + new WidgetNameEditor(Inter.getLocText("FR-Designer_Widget")) + }; + } + + /** + * 扩展单元格的一些编辑器 + * + * @return 值编辑器 + */ + public static Editor[] extendedEditors() { + FormulaEditor formulaEditor = new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula")); + return new Editor[]{ + new TextEditor(), + new IntegerEditor(), + new DoubleEditor(), + new DateEditor(true, Inter.getLocText("FR-Designer_Date")), + new BooleanEditor(), + formulaEditor, + new ParameterEditor(), + new ColumnRowEditor(Inter.getLocText("FR-Designer_Cell")) + }; + } + + /** + * 带单元格组的编辑器 + * + * @return 值编辑器 + */ + public static Editor[] extendedCellGroupEditors() { + FormulaEditor formulaEditor = new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula")); + return new Editor[]{ + new TextEditor(), + new IntegerEditor(), + new DoubleEditor(), + new DateEditor(true, Inter.getLocText("FR-Designer_Date")), + new BooleanEditor(), + formulaEditor, + new ParameterEditor(), + new ColumnRowEditor(Inter.getLocText("FR-Designer_Cell")), + new ColumnRowGroupEditor(Inter.getLocText("FR-Designer-Cell_Group")) + }; + } + + /** + * 只有单元格和单元格组的编辑器 + * + * @return 编辑器b + */ + public static Editor[] cellGroupEditor() { + return new Editor[]{ + new ColumnRowEditor(Inter.getLocText("FR-Designer_Cell")), + new ColumnRowGroupEditor(Inter.getLocText("FR-Designer-Cell_Group")) + }; + } + + /** + * URL的一些编辑器. + * + * @param popupName 名字 + * @param textEditorValue 值 + * @return 值编辑器 + */ + public static Editor[] URLEditors(String popupName, String textEditorValue) { + return new Editor[]{ + new NoneEditor(textEditorValue, StringUtils.isEmpty(popupName) ? Inter.getLocText("FR-Designer_None") : popupName), + new TextEditor() + }; + } + + /** + * 日期类型的一些编辑器 + * + * @param popupName 名字 + * @param textEditorValue 值 + * @return 值编辑器 + */ + public static Editor[] dateEditors(String popupName, String textEditorValue) { + return new Editor[]{ + new NoneEditor(textEditorValue, StringUtils.isEmpty(popupName) ? Inter.getLocText("FR-Designer_None") : popupName), + new DateEditor(true, Inter.getLocText("FR-Designer_Date")), + new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula")) + }; + } + + /** + * 所有类型的编辑器 + * + * @return 值编辑器 + */ + public static Editor[] allEditors() { + FormulaEditor formulaEditor = new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula")); +// formulaEditor.setEnabled(true); + return new Editor[]{ + new TextEditor(), + new IntegerEditor(), + new DoubleEditor(), + new DateEditor(true, Inter.getLocText("FR-Designer_Date")), + new BooleanEditor(), + formulaEditor, + new ParameterEditor(), + new ColumnRowEditor(Inter.getLocText("FR-Designer_Cell")), + new ColumnSelectedEditor(), + //23328 allEditors中删除控件选项 +// new WidgetNameEditor(Inter.getLocText("Widget")) + }; + } + + /** + * 不带公式编辑器 + * + * @return 编辑器不带公式 + */ + public static Editor[] basicEditorsWithoutFormula() { + return new Editor[]{ + new TextEditor(), + new IntegerEditor(), + new DoubleEditor(), + new DateEditor(true, Inter.getLocText("FR-Designer_Date")), + new BooleanEditor(), + }; + } + + /** + * noCRnoColumn编辑器 + * + * @return 编辑器 + */ + public static Editor[] noCRnoColumnEditors() { + FormulaEditor formulaEditor = new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula")); + return new Editor[]{ + new TextEditor(), + new IntegerEditor(), + new DoubleEditor(), + new DateEditor(true, Inter.getLocText("FR-Designer_Date")), + new BooleanEditor(), + formulaEditor, + new ParameterEditor(), + }; + } + + /** + * 数值编辑器 + * + * @return 编辑器 + */ + public static Editor[] numberEditors() { + FormulaEditor formulaEditor = new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula")); + return new Editor[]{ + new IntegerEditor(), + new DoubleEditor(), + formulaEditor, + new ParameterEditor(), + }; + } + + /** + * 日期编辑器 + * + * @return 编辑器 + */ + public static Editor[] dateEditors() { + FormulaEditor formulaEditor = new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula")); + return new Editor[]{ + new DateEditor(true, Inter.getLocText("FR-Designer_Date")), + formulaEditor, + new ParameterEditor(), + }; + } + + /** + * 存储的一些编辑器 + * + * @return 存储过程的编辑器 + */ + public static Editor[] StoreProcedureEditors() { + FormulaEditor formulaEditor = new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula")); + formulaEditor.setEnabled(true); + return new Editor[]{ + new CursorEditor(), + new TextEditor(), + new IntegerEditor(), + new DoubleEditor(), + new DateEditor(true, Inter.getLocText("FR-Designer_Date")), + new BooleanEditor(), + formulaEditor + }; + } + + /** + * 图表热点的一些编辑器 + * + * @return 值编辑器 + */ + public static Editor[] chartHotEditors(HashMap hyperLinkEditorMap) { + List list = createEditors4Chart(hyperLinkEditorMap); + + list.add(new TextEditor()); + list.add(new IntegerEditor()); + list.add(new DoubleEditor()); + list.add(new DateEditor(true, Inter.getLocText("FR-Designer_Date"))); + list.add(new BooleanEditor()); + + FormulaEditor formulaEditor = new FormulaEditor(Inter.getLocText("FR-Designer_Parameter-Formula")); + formulaEditor.setEnabled(true); + list.add(formulaEditor); + + return list.toArray(new Editor[list.size()]); + } + + /** + * 为图表创建编辑器. + * + * @return 值编辑器 + */ + private static List createEditors4Chart(HashMap hyperLinkEditorMap) { + List lists = new ArrayList(); + if (hyperLinkEditorMap == null) { + return lists; + } + Iterator> entries = hyperLinkEditorMap.entrySet().iterator(); + while (entries.hasNext()) { + Map.Entry entry = entries.next(); + ConstantsEditor editor = new ConstantsEditor(entry.getKey(), entry.getValue()); + editor.setEnabled(false); + lists.add(editor); + } + return lists; + } + + /** + * 产生一个实际值和显示值的面板 + * + * @param keyColumnPane 实际值 + * @param valueDictPane 显示值 + * @return 产生一个实际值和显示值的面板 + */ + public static JPanel createKeyAndValuePane(ValueEditorPane keyColumnPane, ValueEditorPane valueDictPane) { + JPanel pane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + + JPanel paneLeft = FRGUIPaneFactory.createBorderLayout_S_Pane(); + pane.add(paneLeft); + paneLeft.add(new UILabel(" " + Inter.getLocText("FR-Designer_Actual_Value") + ":"), BorderLayout.NORTH); + paneLeft.add(keyColumnPane, BorderLayout.CENTER); + + JPanel paneRight = FRGUIPaneFactory.createBorderLayout_S_Pane(); + pane.add(paneRight); + paneRight.add(new UILabel(" " + Inter.getLocText("FR-Designer_Display_Value") + ":"), BorderLayout.NORTH); + + paneRight.add(valueDictPane, BorderLayout.CENTER); + + return pane; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/BooleanEditor.java b/designer-base/src/com/fr/design/editor/editor/BooleanEditor.java new file mode 100644 index 0000000000..7f8dce7f2f --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/BooleanEditor.java @@ -0,0 +1,113 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.editor.editor; + +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +/** + * CellEditor used to edit Boolean object. + * + * @editor zhou + * @since 2012-3-29下午6:01:09 + */ +public class BooleanEditor extends Editor { + + private UICheckBox booleanCheckBox; // boolean checkbox + + /** + * Constructor. + */ + public BooleanEditor() { + this(new Boolean(true)); + } + + public BooleanEditor(boolean b) { + this(new Boolean(b)); + } + + /** + * Constructor. + */ + + public BooleanEditor(Boolean value) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + booleanCheckBox = new UICheckBox("true"); + this.add(booleanCheckBox, BorderLayout.CENTER); + this.setValue(value); + this.setName(Inter.getLocText("Parameter-Boolean")); + booleanCheckBox.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + fireStateChanged(); + } + }); + } + + public JComponent getEditComp() { + return booleanCheckBox; + } + + /** + * Return the value of the CellEditor. + */ + @Override + public Boolean getValue() { + return new Boolean(this.booleanCheckBox.isSelected()); + } + + /** + * Set the value to the CellEditor. + */ + @Override + public void setValue(Boolean value) { + // populate data to UI + if (value == null) { + value = true; + } + this.booleanCheckBox.setSelected(value.booleanValue()); + } + + /** + * Sets whether or not this component is enabled. + */ + @Override + public void setEnabled(boolean enabled) { + this.booleanCheckBox.setEnabled(enabled); + } + + /** + * Request focus + */ + @Override + public void requestFocus() { + this.booleanCheckBox.requestFocus(); + } + + /** + * Fire editing stopped listeners. + */ + @Override + protected void fireEditingStopped() { + // populate UI to data. + this.setValue(new Boolean(this.booleanCheckBox.isSelected())); + + super.fireEditingStopped(); + } + + public String getIconName() { + return "type_bool"; + } + + @Override + public boolean accept(Object object) { + return object instanceof Boolean; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/ColumnIndexEditor.java b/designer-base/src/com/fr/design/editor/editor/ColumnIndexEditor.java new file mode 100644 index 0000000000..ae0e7aff89 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/ColumnIndexEditor.java @@ -0,0 +1,110 @@ +package com.fr.design.editor.editor; + +import com.fr.design.gui.icombobox.IntComboBox; +import com.fr.general.Inter; + +import java.awt.*; +import java.awt.event.ActionListener; +import java.awt.event.ItemListener; + +/** + * 列序号编辑器:里面是一排连续的整数(0-value) + * + * @author zhou + * @since 2012-6-1下午2:24:04 + */ +public class ColumnIndexEditor extends Editor { + protected IntComboBox valueColumnIndexComboBox; + + public ColumnIndexEditor() { + this(0); + } + + /** + * 默认名字是“列序号”,也可以通过第二个构造函数改变 + * + * @param value + */ + public ColumnIndexEditor(int value) { + this(value, Inter.getLocText("Datasource-Column_Index")); + } + + public ColumnIndexEditor(int value, String name) { + this.setLayout(new BorderLayout(0, 0)); + valueColumnIndexComboBox = new IntComboBox(); + for (int i = 1; i <= value; i++) { + valueColumnIndexComboBox.addItem(new Integer(i)); + } + + if (value > 0) { + valueColumnIndexComboBox.setSelectedInt(1); + } + this.add(valueColumnIndexComboBox, BorderLayout.CENTER); + this.setName(name); + valueColumnIndexComboBox.setBorder(null); + + } + + @Override + public Integer getValue() { + return valueColumnIndexComboBox.getSelectedInt(); + } + + @Override + public void setValue(Object value) { + valueColumnIndexComboBox.setSelectedInt(value == null ? 0 : Integer.parseInt(value.toString())); + } + + public String getIconName() { + return "ds_column_index"; + } + + /** + * object参数是否是Integer + * + * @param object 传进来用于判断的参数 + * @return 返回是否是Index + */ + public boolean accept(Object object) { + return object instanceof Integer; + } + + /** + * 增加一个ItemListener + * + * @param l 用于增加的Listener + */ + public void addItemListener(ItemListener l) { + valueColumnIndexComboBox.addItemListener(l); + } + + /** + * 增加一个ActionListener + * + * @param l 用于增加的Listener + */ + public void addActionListener(ActionListener l){ + valueColumnIndexComboBox.addActionListener(l); + } + + /** + * 重置 + */ + public void reset() { + valueColumnIndexComboBox.setSelectedIndex(-1); + } + + /** + * 清除所有项 + */ + public void clearData() { + valueColumnIndexComboBox.removeAllItems(); + } + + + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + valueColumnIndexComboBox.setEnabled(enabled); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/ColumnNameEditor.java b/designer-base/src/com/fr/design/editor/editor/ColumnNameEditor.java new file mode 100644 index 0000000000..957088fe7d --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/ColumnNameEditor.java @@ -0,0 +1,79 @@ +package com.fr.design.editor.editor; + +import com.fr.design.gui.icombobox.UIComboBoxRenderer; +import com.fr.general.Inter; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; + +/** + * 列编辑器,里面是列名 + * + * @author zhou + * @since 2012-6-1下午2:25:16 + */ +public class ColumnNameEditor extends ColumnIndexEditor { + + private String[] columnNames; + + public ColumnNameEditor() { + this(ArrayUtils.EMPTY_STRING_ARRAY); + } + + public ColumnNameEditor(String[] columnNames) { + this(columnNames, Inter.getLocText("ColumnName")); + } + + public ColumnNameEditor(final String[] columnNames, String name) { + super(columnNames.length, name); + this.columnNames = columnNames; + valueColumnIndexComboBox.setRenderer(new UIComboBoxRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value == null) { + this.setText(""); + } else { + this.setText(columnNames[((Integer) value).intValue() - 1]); + } + + return this; + } + }); + } + + @Override + public void setValue(Object value) { + for (int i = 0; i < columnNames.length; i++) { + if (columnNames[i].equalsIgnoreCase(String.valueOf(value))) { + super.setValue(i + 1); + return; + } + } + + super.reset(); + } + + @Override + public boolean accept(Object object) { + return object instanceof String; + } + + + public String getColumnName() { + int index = ((Integer) this.getValue()).intValue() - 1; + return getColumnNameAtIndex(index); + } + + public String getColumnNameAtIndex(int index) { + return index >= 0 && columnNames.length > index ? columnNames[index] : StringUtils.EMPTY; + } + + public String getIconName() { + return "ds_column_name"; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/ColumnRowEditor.java b/designer-base/src/com/fr/design/editor/editor/ColumnRowEditor.java new file mode 100644 index 0000000000..d596b8c6e9 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/ColumnRowEditor.java @@ -0,0 +1,74 @@ +package com.fr.design.editor.editor; + +import com.fr.design.gui.columnrow.ColumnRowPane; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.stable.ColumnRow; + +import java.awt.*; + +/** + * the editor to edit ColumnRow + * + * @editor zhou + * @since 2012-3-29下午6:01:37 + */ +public class ColumnRowEditor extends Editor { + + private ColumnRowPane crPane; + + public ColumnRowEditor() { + this(""); + } + + public ColumnRowEditor(String name) { + this(null, name); + } + + + public ColumnRowEditor(ColumnRow value) { + this(value, ""); + } + + public ColumnRowEditor(ColumnRow value, String name) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + crPane = new ColumnRowPane(); + this.add(crPane, BorderLayout.CENTER); + this.setValue(value); + this.setName(name); + } + + @Override + public ColumnRow getValue() { + return this.crPane.update(); + } + + @Override + public void setValue(ColumnRow value) { + if (value == null) { + value = ColumnRow.valueOf(0, 0); + } + + this.crPane.populate(value); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + + this.crPane.setEnabled(enabled); + } + + @Override + public void requestFocus() { + this.crPane.requestFocus(); + } + + public String getIconName() { + return "cell"; + } + + @Override + public boolean accept(Object object) { + return object instanceof ColumnRow; + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/editor/editor/ColumnRowGroupEditor.java b/designer-base/src/com/fr/design/editor/editor/ColumnRowGroupEditor.java similarity index 100% rename from designer_base/src/com/fr/design/editor/editor/ColumnRowGroupEditor.java rename to designer-base/src/com/fr/design/editor/editor/ColumnRowGroupEditor.java diff --git a/designer-base/src/com/fr/design/editor/editor/ColumnSelectedEditor.java b/designer-base/src/com/fr/design/editor/editor/ColumnSelectedEditor.java new file mode 100644 index 0000000000..037129e595 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/ColumnSelectedEditor.java @@ -0,0 +1,110 @@ +package com.fr.design.editor.editor; + +import com.fr.design.data.DesignTableDataManager; +import com.fr.data.SimpleDSColumn; +import com.fr.design.data.datapane.TableDataComboBox; +import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +import com.fr.general.data.TableDataColumn; +import com.fr.stable.StringUtils; + +import java.awt.*; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.List; +import java.util.regex.Pattern; + +/** + * 选择数据列编辑器 + * + * @author zhou + * @since 2012-3-29下午6:05:08 + */ +public class ColumnSelectedEditor extends Editor { + TableDataComboBox tableDataComboBox; + private UIComboBox columnNameComboBox; + protected String[] columnNames; + + public ColumnSelectedEditor() { + this.setName(Inter.getLocText(new String[]{"Data", "Columns"})); + this.setLayout(FRGUIPaneFactory.createLeftZeroLayout()); + tableDataComboBox = new TableDataComboBox(DesignTableDataManager.getEditingTableDataSource()); + columnNames = new String[0]; + tableDataComboBox.addItemListener(new ItemListener() { + + @Override + public void itemStateChanged(ItemEvent e) { + //这边需要重新初始化columnNames, 否则nameList长度和columnNames长度不同导致出錯。 + if (tableDataComboBox.getSelectedItem() == null) { + return; + } + List nameList = tableDataComboBox.getSelectedItem().calculateColumnNameList(); + columnNames = new String[nameList.size()]; + columnNames = tableDataComboBox.getSelectedItem().calculateColumnNameList().toArray(columnNames); + columnNameComboBox.removeAllItems(); + for (int i = 0; i < columnNames.length; i++) { + columnNameComboBox.addItem(columnNames[i]); + } + columnNameComboBox.validate(); + } + }); + columnNameComboBox = new UIComboBox(); + tableDataComboBox.setPreferredSize(new Dimension(82, 20)); + this.add(tableDataComboBox); + columnNameComboBox.setPreferredSize(new Dimension(82, 20)); + this.add(columnNameComboBox); + } + + @Override + public SimpleDSColumn getValue() { + if (this.tableDataComboBox.getSelectedItem() == null || this.columnNameComboBox.getSelectedItem() == null) { + return null; + } + SimpleDSColumn dsColumn = new SimpleDSColumn(); + TableDataWrapper tableDataWrappe = this.tableDataComboBox.getSelectedItem(); + dsColumn.setDsName(tableDataWrappe.getTableDataName()); + TableDataColumn column; + String columnExp = (String) this.columnNameComboBox.getSelectedItem(); + if (StringUtils.isNotBlank(columnExp) && (columnExp.length() > 0 && columnExp.charAt(0) == '#') && !columnExp.endsWith("#")) { + String number = columnExp.substring(1); + Pattern pattern = Pattern.compile("[^\\d]"); + if (pattern.matcher(number).find()) { + column = TableDataColumn.createColumn(columnExp); + } else { + int serialNumber = Integer.parseInt(columnExp.substring(1)); + column = TableDataColumn.createColumn(serialNumber); + } + } else { + column = TableDataColumn.createColumn(columnExp); + } + dsColumn.setColumn(column); + return dsColumn; + } + + public String getIconName() { + return "ds_column"; + } + + @Override + public boolean accept(Object object) { + return object instanceof SimpleDSColumn; + } + + @Override + public void setValue(SimpleDSColumn value) { + if (value == null) { + return; + } else { + tableDataComboBox.setSelectedTableDataByName(value.getDsName()); + columnNameComboBox.setSelectedItem(TableDataColumn.getColumnName(value.getColumn())); + } + } + + @Override + public void clearData() { + tableDataComboBox.setSelectedItem(null); + columnNameComboBox.setSelectedItem(null); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/ConstantsEditor.java b/designer-base/src/com/fr/design/editor/editor/ConstantsEditor.java new file mode 100644 index 0000000000..b4eed1e063 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/ConstantsEditor.java @@ -0,0 +1,23 @@ +package com.fr.design.editor.editor; + +import com.fr.base.BaseFormula; + + +public class ConstantsEditor extends FormulaEditor { + + public ConstantsEditor(String name, BaseFormula formula) { + super(name, formula); + } + + protected void showFormulaPane() { + // do nothing 防止修改... + } + + public void setValue(BaseFormula value) { + // do nothing 防止修改... + } + + public boolean accept(Object object) { + return object instanceof BaseFormula && object.equals(this.getValue()); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/CursorEditor.java b/designer-base/src/com/fr/design/editor/editor/CursorEditor.java new file mode 100644 index 0000000000..19357338cf --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/CursorEditor.java @@ -0,0 +1,42 @@ +package com.fr.design.editor.editor; + +import java.awt.Dimension; + +import com.fr.design.gui.ilable.UILabel; + +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +//TODO:august what's this? +public class CursorEditor extends Editor { + private UILabel label; + + public CursorEditor(){ + this.setLayout(FRGUIPaneFactory.createCenterFlowLayout()); + label = new UILabel(Inter.getLocText("Cursor")); + this.add(label); + this.setPreferredSize(new Dimension(10,20)); + this.setName(Inter.getLocText("Cursor")); + this.setEnabled(false); + } + + @Override + public CursorEditor getValue() { + return this; + } + + @Override + public String getIconName() { + return "type_cursor"; + } + + @Override + public boolean accept(Object object) { + return object instanceof CursorEditor ; + } + + @Override + public void setValue(CursorEditor value) { + label.setText(Inter.getLocText("Cursor")); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/DateEditor.java b/designer-base/src/com/fr/design/editor/editor/DateEditor.java new file mode 100644 index 0000000000..d112f7fe01 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/DateEditor.java @@ -0,0 +1,183 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.editor.editor; + +import com.fr.base.FRContext; +import com.fr.design.gui.date.UIDatePicker; +import com.fr.design.layout.FRGUIPaneFactory; + +import javax.swing.*; + +import java.awt.*; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * CellEditor used to edit Date object. + * + * @editor zhou + * @since 2012-3-29下午6:03:03 + */ +public class DateEditor extends Editor { + + private UIDatePicker uiDatePicker; + + /** + * Constructor. + */ + public DateEditor() { + this(null); + } + + public DateEditor(boolean es) { + this(null, es); + } + + public DateEditor(boolean es, String name) { + this(null, es, name); + } + + /** + * Constructor. + */ + public DateEditor(Date value) { + this(value, false); + } + + /** + * Constructor. + */ + public DateEditor(Date value, boolean format) { + this(value, format, ""); + } + + public DateEditor(Date value, boolean format, String name) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + uiDatePicker = new UIDatePicker(); + if (format) { + int dateStyle = (FRContext.getLocale() == Locale.ENGLISH + || FRContext.getLocale() == Locale.US + || FRContext.getLocale() == Locale.UK) ? uiDatePicker.STYLE_EN_DATE : uiDatePicker.STYLE_CN_DATE; + uiDatePicker.setStyle(dateStyle); + uiDatePicker.setEditable(false); + } + uiDatePicker.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + fireStateChanged(); + } + }); + this.uiDatePicker.setFocusTraversalKeysEnabled(false); + this.add(uiDatePicker, BorderLayout.CENTER); + + this.setValue(value); + this.setName(name); + } + + //uidatepicker的setstyle方法不起作用,先粗暴地加个构造方法 + public DateEditor(Date value, boolean format, String name, int dateFormat) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + uiDatePicker = new UIDatePicker(dateFormat); + if (format) { + uiDatePicker.setEditable(false); + } + uiDatePicker.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + fireStateChanged(); + } + }); + this.uiDatePicker.setFocusTraversalKeysEnabled(false); + this.add(uiDatePicker, BorderLayout.CENTER); + + this.setValue(value); + this.setName(name); + } + + + + public JComponent getEditComp() { + return uiDatePicker; + } + + /** + * Return the value of the CellEditor. + */ + @Override + public Date getValue() { + try { + return this.uiDatePicker.getSelectedDate(); + } catch (ParseException parseException) { + FRContext.getLogger().error(parseException.getMessage(), parseException); + return new Date(); + } + } + + /** + * Set the value to the CellEditor. + */ + @Override + public void setValue(Date value) { + // populate data to UI + if (value == null) { +// value = new Date(); + return; + } + + try { + this.uiDatePicker.setSelectedDate(value); + } catch (ParseException parseException) { + FRContext.getLogger().error(parseException.getMessage(), parseException); + } + } + + /** + * Sets whether or not this component is enabled. + */ + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + + this.uiDatePicker.setEnabled(enabled); + } + + /** + * ValueEditorPane(无 日期 公式)切换成公式时执行此方法 + */ + public void selected() { + this.uiDatePicker.setSelectedItem(new Date()); + } + + /** + * Request focus + */ + @Override + public void requestFocus() { + this.uiDatePicker.requestFocus(); + } + + public String getIconName() { + return "type_date"; + } + + public void setUIDatePickerStyle(int style){ + this.uiDatePicker.setStyle(style); + } + + public SimpleDateFormat getUIDatePickerFormat(){ + return this.uiDatePicker.getDateFormat(); + } + + @Override + /** + * accept + */ + public boolean accept(Object object) { + return object instanceof Date; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/DoubleEditor.java b/designer-base/src/com/fr/design/editor/editor/DoubleEditor.java new file mode 100644 index 0000000000..e20a1aa3dd --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/DoubleEditor.java @@ -0,0 +1,46 @@ +package com.fr.design.editor.editor; + +import com.fr.base.Utils; +import com.fr.general.Inter; + +/** + * 双精度编辑器 + * + * @editor zhou + * @since 2012-3-29下午4:51:03 + */ +public class DoubleEditor extends NumberEditor { + + public DoubleEditor() { + this(new Double(0)); + } + + public DoubleEditor(Double value) { + super(value, Inter.getLocText("Parameter-Double")); + } + + @Override + public Double getValue() { + return new Double(this.numberField.getValue()); + } + + @Override + public void setValue(Double value) { + if (value == null) { + value = new Double(0); + } + this.numberField.setInteger(false); + this.numberField.setValue(value.doubleValue()); + oldValue = Utils.objectToString(value); + } + + public String getIconName() { + return "type_double"; + } + + @Override + public boolean accept(Object object) { + return object != null && object instanceof Double; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/Editor.java b/designer-base/src/com/fr/design/editor/editor/Editor.java new file mode 100644 index 0000000000..b4e885d1b7 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/Editor.java @@ -0,0 +1,203 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.editor.editor; + +import com.fr.base.BaseUtils; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +/** + * The baics abstract CellEditor. 子类必须确定类型T + * + * @editor zhou + * @since 2012-3-29下午5:08:21 + */ +public abstract class Editor extends JComponent { + private static final long serialVersionUID = 1L; + private String editorName; + + /** + * Return the value of CellEditor. + */ + public abstract T getValue(); + + /** + * Set the value to the CellEditor. + */ + public abstract void setValue(T value); + + public abstract boolean accept(Object object); + + // 约定图片的文件名为this.getName(),处理起来方便些 + // b:这里国际化没有考虑 + public Icon getIcon() { + String iconName = "com/fr/design/images/buttonicon/" + this.getIconName() + ".png"; + try { + return BaseUtils.readIcon(iconName); + } catch (NullPointerException e) { + return null; + } + } + + public String getName() { + return this.editorName; + } + + public String getIconName(){ + return this.editorName; + } + + public void reset() { + + } + + public void clearData() { + + } + + @Override + public void setName(String name) { + this.editorName = name; + } + + /** + * Calls fireEditingStopped. + */ + public void startEditing() { + fireEditingStarted(); + } + + + /** + * Calls fireEditingStopped and returns true. + * + * @return true + */ + public boolean stopEditing() { + fireEditingStopped(); + return true; + } + + /** + * Calls fireEditingCanceled. + */ + public void cancelEditing() { + fireEditingCanceled(); + } + + public void selected() { + + } + + /** + * Adds a CellEditorListener to the listener list. + */ + public void addCellEditorListener(EditorListener cellEditorListener) { + listenerList.add(EditorListener.class, cellEditorListener); + } + + /** + * Removes a CellEditorListener from the listener list. + */ + public void removeCellEditorListener(EditorListener cellEditorListener) { + listenerList.remove(EditorListener.class, cellEditorListener); + } + + /** + * Return all of the CellEditorListeners added or an empty + * array if no listeners have been added + */ + public EditorListener[] getCellEditorListeners() { + return listenerList.getListeners(EditorListener.class); + } + + /** + * Fire editing started listeners. + */ + protected void fireEditingStarted() { + // Guaranteed to return a non-null array + Object[] listeners = listenerList.getListenerList(); + + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == EditorListener.class) { + // Lazily create the event: + if (changeEvent == null) { + changeEvent = new ChangeEvent(this); + } + + ((EditorListener) listeners[i + 1]).editingStarted(changeEvent); + } + } + } + + /** + * Fire editing stopped listeners. + */ + protected void fireEditingStopped() { + // Guaranteed to return a non-null array + Object[] listeners = listenerList.getListenerList(); + + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == EditorListener.class) { + // Lazily create the event: + if (changeEvent == null) { + changeEvent = new ChangeEvent(this); + } + + ((EditorListener) listeners[i + 1]).editingStopped(changeEvent); + } + } + } + + /** + * Fire editing canceled listeners. + */ + protected void fireEditingCanceled() { + // Guaranteed to return a non-null array + Object[] listeners = listenerList.getListenerList(); + + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == EditorListener.class) { + // Lazily create the event: + if (changeEvent == null) { + changeEvent = new ChangeEvent(this); + } + + ((EditorListener) listeners[i + 1]).editingCanceled(changeEvent); + } + } + } + + protected void fireStateChanged() { + Object[] listeners = listenerList.getListenerList(); + + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + // Lazily create the event: + if (changeEvent == null) { + changeEvent = new ChangeEvent(this); + } + + ((ChangeListener) listeners[i + 1]).stateChanged(changeEvent); + } + } + } + + transient private ChangeEvent changeEvent = null; + + public void addChangeListener(ChangeListener changeListener) { + listenerList.add(ChangeListener.class, changeListener); + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/EditorListener.java b/designer-base/src/com/fr/design/editor/editor/EditorListener.java new file mode 100644 index 0000000000..16e26bf7ed --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/EditorListener.java @@ -0,0 +1,29 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.editor.editor; + +import java.util.EventListener; + +import javax.swing.event.ChangeEvent; + +/** + * CellEditorListener used for CellEditor start, stop and cancel.. + */ +public interface EditorListener extends EventListener { + + /** + * This tells the listeners the editor has started editing. + */ + public void editingStarted(ChangeEvent evt); + + /** + * This tells the listeners the editor has stopped editing + */ + public void editingStopped(ChangeEvent evt); + + /** + * This tells the listeners the editor has canceled editing + */ + public void editingCanceled(ChangeEvent evt); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/FloatEditor.java b/designer-base/src/com/fr/design/editor/editor/FloatEditor.java new file mode 100644 index 0000000000..68fee105b8 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/FloatEditor.java @@ -0,0 +1,46 @@ +package com.fr.design.editor.editor; + +import com.fr.base.Utils; +import com.fr.general.Inter; + +/** + * 单精度型编辑器 + * + * @author zhou + * @since 2012-3-29下午4:50:01 + */ +public class FloatEditor extends NumberEditor { + + public FloatEditor() { + this(new Float(0)); + } + + public FloatEditor(Float value) { + super(value, Inter.getLocText("Parameter-Float")); + } + + @Override + public Float getValue() { + return new Float(this.numberField.getValue()); + } + + @Override + public void setValue(Float value) { + if (value == null) { + value = new Float(0); + } + this.numberField.setInteger(false); + this.numberField.setValue(value.doubleValue()); + oldValue = Utils.objectToString(value); + } + + public String getIconName() { + return "type_double"; + } + + @Override + public boolean accept(Object object) { + return object != null && object instanceof Float; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/FormulaEditor.java b/designer-base/src/com/fr/design/editor/editor/FormulaEditor.java new file mode 100644 index 0000000000..77ac976bcf --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/FormulaEditor.java @@ -0,0 +1,181 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.editor.editor; + +import com.fr.base.BaseFormula; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.formula.FormulaFactory; +import com.fr.design.formula.UIFormula; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; + +import javax.swing.*; +import javax.swing.event.DocumentListener; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * CellEditor used to edit Formula object. + * + * @editor zhou + * @since 2012-3-29下午6:27:27 + */ +public class FormulaEditor extends Editor { + private BaseFormula formula = BaseFormula.createFormulaBuilder().build(); + private UITextField currentTextField; + private ShowPaneListener listener = new ShowPaneListener(); + + /** + * Constructor. + */ + public FormulaEditor() { + this(""); + } + + public FormulaEditor(String name) { + this(name, null); + } + + public FormulaEditor(String name, BaseFormula formula) { + if (formula != null) { + this.formula = formula; + } + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + JPanel editPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + currentTextField = new UITextField(28); + currentTextField.setText(this.formula.getContent()); + + editPane.add(currentTextField, BorderLayout.CENTER); + currentTextField.setEditable(false); + currentTextField.addMouseListener(listener); + this.add(editPane, BorderLayout.CENTER); + this.setName(name); + } + + private class ShowPaneListener extends MouseAdapter { + public void mousePressed(MouseEvent e) { + if (currentTextField.isEnabled()) { + showFormulaPane(); + } + } + } + + public void setColumns(int i) { + this.currentTextField.setColumns(i); + } + + + /** + * 选中时弹出公式编辑框 + */ + public void selected() { + showFormulaPane(); + } + + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + currentTextField.setEnabled(enabled); + } + + + protected void showFormulaPane() { + final UIFormula formulaPane = FormulaFactory.createFormulaPaneWhenReserveFormula(); + formulaPane.populate(formula); + formulaPane.showLargeWindow(SwingUtilities.getWindowAncestor(FormulaEditor.this), new DialogActionAdapter() { + + @Override + public void doOk() { + formula = formulaPane.update(); + setValue(formula); + fireStateChanged(); + } + }).setVisible(true); + } + + public BaseFormula getFormula(){ + return formula; + } + + /** + * Return the value of the CellEditor. + */ + @Override + public BaseFormula getValue() { + if (formula != null && "=".equals(formula.getContent())) { + return null; + } + return formula; + } + + /** + * Set the value to the CellEditor. + */ + @Override + public void setValue(BaseFormula value) { + if (value == null) { + value = BaseFormula.createFormulaBuilder().build(); + } + this.formula = value; + currentTextField.setText(value.toString()); + } + + /** + * 增加文本监听 + * + * @param l 监听器 + */ + public void addDocumentListener(DocumentListener l) { + currentTextField.getDocument().addDocumentListener(l); + } + + public String getIconName() { + return "type_formula"; + } + + /** + * object是否是公司类型对象 + * + * @param object 需判断的对象 + * @return 是公式类型则返回true + */ + public boolean accept(Object object) { + return object instanceof BaseFormula; + } + + /** + * 重置 + */ + public void reset() { + currentTextField.setText("="); + formula = BaseFormula.createFormulaBuilder().build(); + } + + /** + * 清楚数据 + */ + public void clearData() { + reset(); + } + + /** + * 是否可用 + * + * @param flag 为true代表可用 + */ + public void enableEditor(boolean flag) { + this.setEnabled(flag); + this.currentTextField.setEnabled(flag); + if (flag == false) { + this.currentTextField.removeMouseListener(listener); + } else { + int listenerSize = this.currentTextField.getMouseListeners().length; + for (int i = 0; i < listenerSize; i++) { + this.currentTextField.removeMouseListener(listener); + } + this.currentTextField.addMouseListener(listener); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/IntegerEditor.java b/designer-base/src/com/fr/design/editor/editor/IntegerEditor.java new file mode 100644 index 0000000000..4c5e9932ed --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/IntegerEditor.java @@ -0,0 +1,49 @@ +package com.fr.design.editor.editor; + +import com.fr.base.Utils; +import com.fr.general.Inter; + +/** + * 整数编辑器 + * + * @author zhou + * @since 2012-3-29下午4:02:06 + */ +public class IntegerEditor extends NumberEditor { + + private static final long serialVersionUID = 1L; + + public IntegerEditor() { + this(new Integer(0)); + } + + public IntegerEditor(Integer value) { + super(value, Inter.getLocText("FR-Designer_Parameter_Integer")); + } + + @Override + public Integer getValue() { + return new Integer((int) this.numberField.getValue()); + } + + @Override + public boolean accept(Object object) { + return object != null && object instanceof Integer; + } + + public String getIconName() { + return "type_int"; + } + + @Override + public void setValue(Integer value) { + if (value == null) { + value = new Integer(0); + } + this.numberField.setInteger(true); + this.numberField.setValue(value.intValue()); + oldValue = Utils.objectToString(value); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/LongEditor.java b/designer-base/src/com/fr/design/editor/editor/LongEditor.java new file mode 100644 index 0000000000..cc9e5ff3f6 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/LongEditor.java @@ -0,0 +1,41 @@ +package com.fr.design.editor.editor; + +import com.fr.base.Utils; + +/** + * 长整形编辑器 + * + * @author zhou + * @since 2012-3-29下午4:50:31 + */ +public class LongEditor extends NumberEditor { + + public LongEditor() { + super(); + } + + public LongEditor(Long value, String name) { + super(value, name); + } + + @Override + public Long getValue() { + return new Long((int)this.numberField.getValue()); + } + + @Override + public void setValue(Long value) { + if (value == null) { + value = new Long(0); + } + this.numberField.setInteger(true); + this.numberField.setValue(value.intValue()); + oldValue = Utils.objectToString(value); + } + + @Override + public boolean accept(Object object) { + return object != null && object instanceof Long; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/NoneEditor.java b/designer-base/src/com/fr/design/editor/editor/NoneEditor.java new file mode 100644 index 0000000000..7b1d5c33c6 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/NoneEditor.java @@ -0,0 +1,54 @@ +package com.fr.design.editor.editor; + +import java.awt.BorderLayout; + +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; + +public class NoneEditor extends Editor { + + private UITextField textField; + private String displayValue; + + public NoneEditor() { + this(null); + } + + public NoneEditor(String displayValue, String name) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.displayValue = displayValue; + textField = new UITextField(); + this.add(textField, BorderLayout.CENTER); + if (displayValue != null) { + textField.setText(displayValue); + } + textField.setEditable(false); + this.setName(name); + } + + public NoneEditor(String displayValue) { + this(displayValue, ""); + } + + @Override + public Object getValue() { + return null; + } + + @Override + public void setValue(Object value) { + if (displayValue != null) { + textField.setText(displayValue); + textField.setEditable(false); + } + } + + public String getIconName(){ + return "type_none"; + } + + @Override + public boolean accept(Object object) { + return false; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/NumberEditor.java b/designer-base/src/com/fr/design/editor/editor/NumberEditor.java new file mode 100644 index 0000000000..d811ad89b7 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/NumberEditor.java @@ -0,0 +1,128 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.editor.editor; + +import com.fr.design.gui.itextfield.UINumberField; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.stable.StringUtils; + +import java.awt.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + + +/** + * CellEditor used to edit Number object. + * + * @editor zhou + * @since 2012-3-29下午1:35:12 + */ +public abstract class NumberEditor extends Editor { + private static final long serialVersionUID = 1L; + protected UINumberField numberField; // text field. + // the old value of text field. + protected String oldValue = StringUtils.EMPTY; + + /** + * Constructor. + */ + public NumberEditor() { + this(null, StringUtils.EMPTY); + } + + /** + * Constructor. + */ + public NumberEditor(T value, String name) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + numberField = new UINumberField(); + this.add(numberField, BorderLayout.CENTER); + this.numberField.addKeyListener(textKeyListener); + this.numberField.setHorizontalAlignment(UITextField.RIGHT); + this.setValue(value); + this.setName(name); + } + + /** + * 给numberField加键盘事件 + * + * @param keylistener + */ + public void addKeyListner2EditingComp(KeyListener keylistener) { + numberField.addKeyListener(keylistener); + } + + public void setColumns(int columns) { + this.numberField.setColumns(columns); + } + + /** + * Returns the horizontal alignment of the CellEditor. Valid keys are: + *
    + *
  • UITextField.LEFT + *
  • UITextField.CENTER + *
  • UITextField.RIGHT + *
  • UITextField.LEADING + *
  • UITextField.TRAILING + *
+ */ + public int getHorizontalAlignment() { + return this.numberField.getHorizontalAlignment(); + } + + /** + * Sets the horizontal alignment of the CellEditor. Valid keys are: + *
    + *
  • UITextField.LEFT + *
  • UITextField.CENTER + *
  • UITextField.RIGHT + *
  • UITextField.LEADING + *
  • UITextField.TRAILING + *
+ */ + public void setHorizontalAlignment(int horizontalAlignment) { + this.numberField.setHorizontalAlignment(horizontalAlignment); + } + + /** + * Sets whether or not this component is enabled. + */ + public void setEnabled(boolean enabled) { + this.numberField.setEnabled(enabled); + } + + public void selected() { + this.requestFocus(); + } + + public String getIconName() { + return "type_double"; + } + + /** + * Request focus + */ + public void requestFocus() { + this.numberField.requestFocus(); + } + + KeyListener textKeyListener = new KeyAdapter() { + + public void keyReleased(KeyEvent evt) { + int code = evt.getKeyCode(); + + if (code == KeyEvent.VK_ESCAPE) { + numberField.setText(oldValue); + } + if (code == KeyEvent.VK_ENTER) { + fireEditingStopped(); + } else { + fireStateChanged(); + } + } + }; + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/OldColumnIndexEditor.java b/designer-base/src/com/fr/design/editor/editor/OldColumnIndexEditor.java new file mode 100644 index 0000000000..bf867f49ff --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/OldColumnIndexEditor.java @@ -0,0 +1,163 @@ +package com.fr.design.editor.editor; + +import com.fr.design.gui.ibutton.UIRadioButton; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.icombobox.UIComboBoxRenderer; +import com.fr.design.gui.icombobox.IntComboBox; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemListener; + +public class OldColumnIndexEditor extends Editor { + private UIComboBox valueColumnIndexComboBox; + + protected UIRadioButton indexCheckBox; + protected UIRadioButton nameCheckBox; + protected String[] columnNames; + + public OldColumnIndexEditor(String name) { + this(0, name); + } + + public OldColumnIndexEditor(Object value, String name) { + this.setLayout(new BorderLayout(0, 0)); + valueColumnIndexComboBox = new IntComboBox(); + for (int i = 1; i <= ((Integer)value).intValue(); i++) { + valueColumnIndexComboBox.addItem(new Integer(i)); + } + + valueColumnIndexComboBox.setRenderer(columnNameListCellRenderer); + + if (((Integer)value).intValue() > 0) { + ((IntComboBox) valueColumnIndexComboBox).setSelectedInt(1); + } + this.add(valueColumnIndexComboBox, BorderLayout.CENTER); + this.setName(name); + valueColumnIndexComboBox.setBorder(null); + } + + + public OldColumnIndexEditor(String[] columnNames, String name) { + this(columnNames.length, name); + this.columnNames = columnNames; + + this.initComponents(); + } + + protected void initComponents() { + indexCheckBox = new UIRadioButton(Inter.getLocText("Datasource-Column_Index")); + nameCheckBox = new UIRadioButton(Inter.getLocText("ColumnName")); + indexCheckBox.addActionListener(actionListener); + nameCheckBox.addActionListener(actionListener); + javax.swing.ButtonGroup buttonGroup = new javax.swing.ButtonGroup(); + buttonGroup.add(indexCheckBox); + buttonGroup.add(nameCheckBox); + + JPanel checkPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); + checkPane.add(indexCheckBox); + checkPane.add(nameCheckBox); + indexCheckBox.setSelected(true); + // 用名字啊 序号谁知道是对应的什么. +// nameCheckBox.setSelected(true); + + this.add(checkPane, BorderLayout.EAST); + } + + public boolean isColumnIndexSelect(){ + return this.indexCheckBox.isSelected(); + } + + public String[] getColumnNames() { + return columnNames; + } + + @Override + public Object getValue() { +// return this.isColumnIndexSelect() ? valueColumnIndexComboBox.getSelectedItem() +// : getColumnName(); + return valueColumnIndexComboBox.getSelectedItem(); + } + + public String getColumnName(){ + int index = ((Integer) valueColumnIndexComboBox.getSelectedItem()).intValue() - 1; + return index >= 0 && columnNames.length > index ? columnNames[index] : StringUtils.EMPTY; + } + + @Override + public void setValue(Object value) { + if(value instanceof Integer){ + valueColumnIndexComboBox.setSelectedItem(value); + }else{ +// value + } + } + + public String getIconName() { + return "ds_column"; + } + + @Override + public boolean accept(Object object) { + return object instanceof Integer || object instanceof String; + } + + protected ListCellRenderer columnNameListCellRenderer = new UIComboBoxRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if ((indexCheckBox != null && indexCheckBox.isSelected()) || columnNames == null) { + if (value == null) { + this.setText(""); + } else { + this.setText("" + value); + } + } else { + if (value == null) { + this.setText(""); + } else + this.setText(columnNames[((Integer) value).intValue() - 1]); + } + + return this; + } + }; + + private ActionListener actionListener = new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + if (indexCheckBox != null) { + indexCheckBox.isSelected(); + } + OldColumnIndexEditor.this.invalidate(); + OldColumnIndexEditor.this.repaint(); + } + }; + + public void setEnabled(boolean enabled) { + if (valueColumnIndexComboBox != null) { + valueColumnIndexComboBox.setEnabled(enabled); + } + if (indexCheckBox != null) { + indexCheckBox.setEnabled(enabled); + } + if (nameCheckBox != null) { + nameCheckBox.setEnabled(enabled); + } + } + + public void addItemListener(ItemListener l) { + valueColumnIndexComboBox.addItemListener(l); + } + + public void removeItemListener(ItemListener l) { + valueColumnIndexComboBox.removeItemListener(l); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/ParameterEditor.java b/designer-base/src/com/fr/design/editor/editor/ParameterEditor.java new file mode 100644 index 0000000000..445ef4a715 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/ParameterEditor.java @@ -0,0 +1,64 @@ +package com.fr.design.editor.editor; + +import com.fr.base.Parameter; +import com.fr.design.gui.icombobox.ParameterComboBox; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; + +import java.awt.*; + +/** + * 参数Editor + * + * @editor zhou + * @since 2012-3-29下午5:24:41 + */ +public class ParameterEditor extends Editor { + + private ParameterComboBox parameterCombobox; + + public ParameterEditor() { + this(null); + } + + public ParameterEditor(Parameter parameter) { + parameterCombobox = new ParameterComboBox(); + parameterCombobox.setEditable(true); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(parameterCombobox, BorderLayout.CENTER); + + this.setValue(parameter); + this.setName(Inter.getLocText("Parameter")); + } + + @Override + public Parameter getValue() { + return parameterCombobox.getSelectedItem(); + } + + @Override + public void setValue(Parameter value) { + parameterCombobox.setSelectedParameter(value); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + + parameterCombobox.setEnabled(enabled); + } + + @Override + public void requestFocus() { + parameterCombobox.requestFocus(); + } + + public String getIconName() { + return "parameter"; + } + + @Override + public boolean accept(Object object) { + return object instanceof Parameter; + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/editor/editor/SpinnerIntegerEditor.java b/designer-base/src/com/fr/design/editor/editor/SpinnerIntegerEditor.java similarity index 100% rename from designer_base/src/com/fr/design/editor/editor/SpinnerIntegerEditor.java rename to designer-base/src/com/fr/design/editor/editor/SpinnerIntegerEditor.java diff --git a/designer-base/src/com/fr/design/editor/editor/TextEditor.java b/designer-base/src/com/fr/design/editor/editor/TextEditor.java new file mode 100644 index 0000000000..8700db0789 --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/TextEditor.java @@ -0,0 +1,153 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.editor.editor; + +import java.awt.BorderLayout; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +import com.fr.stable.StringUtils; + +/** + * CellEditor used to edit String object. + * + * @editor zhou + * @since 2012-3-29下午6:00:43 + */ +public class TextEditor extends Editor { + + private UITextField textField; // text field. + // the old value of text field. + private String oldValue = StringUtils.EMPTY; + + /** + * Constructor. + */ + public TextEditor() { + this(null); + } + + public TextEditor(String value) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + textField = new UITextField(); + textField.setBorder(null); + this.add(textField, BorderLayout.CENTER); + this.textField.addKeyListener(textKeyListener); + + this.setValue(value); + this.setName(Inter.getLocText("Parameter-String")); + } + + public UITextField getTextField() { + return this.textField; + } + + /** + * Returns the horizontal alignment of the CellEditor. Valid keys are: + *
    + *
  • UITextField.LEFT + *
  • UITextField.CENTER + *
  • UITextField.RIGHT + *
  • UITextField.LEADING + *
  • UITextField.TRAILING + *
+ */ + public int getHorizontalAlignment() { + return this.textField.getHorizontalAlignment(); + } + + /** + * Sets the horizontal alignment of the CellEditor. Valid keys are: + *
    + *
  • UITextField.LEFT + *
  • UITextField.CENTER + *
  • UITextField.RIGHT + *
  • UITextField.LEADING + *
  • UITextField.TRAILING + *
+ */ + public void setHorizontalAlignment(int horizontalAlignment) { + this.textField.setHorizontalAlignment(horizontalAlignment); + } + + /** + * Return the value of the CellEditor. + */ + @Override + public String getValue() { + return this.textField.getText(); + } + + /** + * Set the value to the CellEditor. + */ + @Override + public void setValue(String value) { + // populate data to UI + if (value == null) { + value = StringUtils.EMPTY; + } + + oldValue = value.toString(); + this.textField.setText(oldValue); + } + + /** + * Sets whether or not this component is enabled. + */ + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + this.textField.setEnabled(enabled); + } + + + /** + * 请求焦点 + */ + public void requestFocus() { + this.textField.requestFocus(); + } + + KeyListener textKeyListener = new KeyAdapter() { + + @Override + public void keyReleased(KeyEvent evt) { + int code = evt.getKeyCode(); + if (code == KeyEvent.VK_ESCAPE) { + textField.setText(oldValue); + } + if (code == KeyEvent.VK_ENTER) { + fireEditingStopped(); + } else { + fireStateChanged(); + } + } + }; + + /** + * 被选中时文本输入框请求焦点 + */ + public void selected() { + this.textField.requestFocus(); + } + + public String getIconName() { + return "type_string"; + } + + /** + * 判断object是否是字符类型 + * + * @param object 需要判断的object + * @return 是字符类型则返回true + */ + public boolean accept(Object object) { + return object instanceof String; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/WidgetNameEditor.java b/designer-base/src/com/fr/design/editor/editor/WidgetNameEditor.java new file mode 100644 index 0000000000..9258ce589c --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/WidgetNameEditor.java @@ -0,0 +1,110 @@ +package com.fr.design.editor.editor; + +import java.awt.BorderLayout; +import java.awt.Component; + +import javax.swing.JList; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; + +import com.fr.design.DesignModelAdapter; +import com.fr.design.gui.icombobox.UIComboBoxRenderer; +import com.fr.design.gui.icombobox.FilterComboBox; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.stable.js.WidgetName; + +/** + * the editor to edit WidgetName + * + * @editor zhou + * @since 2012-3-29下午6:04:37 + */ +public class WidgetNameEditor extends Editor { + private FilterComboBox comb; + + + public WidgetNameEditor(String name) { + this(null, name); + } + + public WidgetNameEditor(WidgetName value) { + this(value, ""); + } + + private void generateWidgets() { + DesignModelAdapter model = DesignModelAdapter.getCurrentModelAdapter(); + this.comb.setItemList(model == null ? null : model.getWidgetsName()); + comb.setSelectedItem(comb.getEditor().getItem()); + } + + public WidgetNameEditor(WidgetName value, String name) { + comb = new FilterComboBox(); + comb.addPopupMenuListener(new PopupMenuListener() { + + @Override + public void popupMenuCanceled(PopupMenuEvent e) { + + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + + } + + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + WidgetNameEditor.this.generateWidgets(); + } + + }); + this.generateWidgets(); + comb.setRenderer(new UIComboBoxRenderer() { + public Component getListCellRendererComponent(JList list, + Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value instanceof WidgetName) { + this.setText(((WidgetName) value).getName()); + } + + return this; + } + }); + comb.setEditable(true); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(comb, BorderLayout.CENTER); + + this.setValue(value); + this.setName(name); + } + + @Override + public WidgetName getValue() { + return (WidgetName) comb.getSelectedItem(); + } + + @Override + public void setValue(WidgetName value) { + comb.setSelectedItem(value); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + comb.setEnabled(enabled); + } + + @Override + public void requestFocus() { + comb.requestFocus(); + } + + public String getIconName() { + return "widgets"; + } + + @Override + public boolean accept(Object object) { + return object instanceof WidgetName; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/editor/editor/XMLANameEditor.java b/designer-base/src/com/fr/design/editor/editor/XMLANameEditor.java new file mode 100644 index 0000000000..18cf7b7c4a --- /dev/null +++ b/designer-base/src/com/fr/design/editor/editor/XMLANameEditor.java @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.editor.editor; + +import com.fr.design.gui.icombobox.UIComboBoxRenderer; +import com.fr.general.Inter; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; + +/** + * Created with IntelliJ IDEA. + * User: wikky + * Date: 14-3-21 + * Time: 上午9:12 + * To change this template use File | Settings | File Templates. + */ +public class XMLANameEditor extends ColumnIndexEditor{ + private String[] XMLANames; + + /** + * 多维数据集过滤界面的维度和度量值所用Editor + */ + public XMLANameEditor() { + this(ArrayUtils.EMPTY_STRING_ARRAY); + } + + /** + * 多维数据集过滤界面的维度和度量值所用Editor + * @param columnNames 度量值 + */ + public XMLANameEditor(String[] columnNames) { + this(columnNames, Inter.getLocText("Measure")); + } + + /** + * 多维数据集过滤界面的维度和度量值所用Editor + * @param columnNames 维度或度量值 + * @param name 显示名称 + */ + public XMLANameEditor(final String[] columnNames, String name) { + super(columnNames.length, name); + this.XMLANames = columnNames; + valueColumnIndexComboBox.setRenderer(new UIComboBoxRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value == null) { + this.setText(""); + } else { + this.setText(columnNames[((Integer) value).intValue() - 1]); + this.setToolTipText(columnNames[((Integer) value).intValue() - 1]); + } + + return this; + } + }); + } + + /** + *给XMLANames赋值 + * @param value 要赋予的值 + */ + @Override + public void setValue(Object value) { + for (int i = 0; i < XMLANames.length; i++) { + if (XMLANames[i].equalsIgnoreCase(String.valueOf(value))) { + super.setValue(i + 1); + return; + } + } + + super.reset(); + } + + /** + * 判断参数是否是String + * @param object 传进来用于判断的参数 + * @return 参数是否是String + */ + @Override + public boolean accept(Object object) { + return object instanceof String; + } + + /** + * 获取维度或度量值 + * @return 返回维度或度量值 + */ + public String getColumnName() { + int index = ((Integer) this.getValue()).intValue() - 1; + return getColumnNameAtIndex(index); + } + + /** + * 获取维度或度量值 + * @param index 所选择的序号 + * @return 返回序号对应的维度或度量值 + */ + public String getColumnNameAtIndex(int index) { + return index >= 0 && XMLANames.length > index ? XMLANames[index] : StringUtils.EMPTY; + } + + /** + * 获取图标名 + * @return + */ + public String getIconName() { + return "cube"; + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/event/ChangeEvent.java b/designer-base/src/com/fr/design/event/ChangeEvent.java similarity index 100% rename from designer_base/src/com/fr/design/event/ChangeEvent.java rename to designer-base/src/com/fr/design/event/ChangeEvent.java diff --git a/designer_base/src/com/fr/design/event/ChangeListener.java b/designer-base/src/com/fr/design/event/ChangeListener.java similarity index 100% rename from designer_base/src/com/fr/design/event/ChangeListener.java rename to designer-base/src/com/fr/design/event/ChangeListener.java diff --git a/designer_base/src/com/fr/design/event/GlobalNameListener.java b/designer-base/src/com/fr/design/event/GlobalNameListener.java similarity index 100% rename from designer_base/src/com/fr/design/event/GlobalNameListener.java rename to designer-base/src/com/fr/design/event/GlobalNameListener.java diff --git a/designer_base/src/com/fr/design/event/GlobalNameObserver.java b/designer-base/src/com/fr/design/event/GlobalNameObserver.java similarity index 100% rename from designer_base/src/com/fr/design/event/GlobalNameObserver.java rename to designer-base/src/com/fr/design/event/GlobalNameObserver.java diff --git a/designer-base/src/com/fr/design/event/TargetModifiedEvent.java b/designer-base/src/com/fr/design/event/TargetModifiedEvent.java new file mode 100644 index 0000000000..b9e7daaa29 --- /dev/null +++ b/designer-base/src/com/fr/design/event/TargetModifiedEvent.java @@ -0,0 +1,19 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.event; + +import java.util.EventObject; + +/** + * ReportDataChangeEvent. + */ +public class TargetModifiedEvent extends EventObject { + + /** + * Constructs a CellSelectionChangeEvent object. + */ + public TargetModifiedEvent(Object source) { + super(source); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/event/TargetModifiedListener.java b/designer-base/src/com/fr/design/event/TargetModifiedListener.java new file mode 100644 index 0000000000..0b6fbbe30d --- /dev/null +++ b/designer-base/src/com/fr/design/event/TargetModifiedListener.java @@ -0,0 +1,16 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.event; + +import java.util.EventListener; + +/** + * TemplateModifiedListener. + */ +public interface TargetModifiedListener extends EventListener { + /** + * Invoked when the target of the listener has changed the rpt content. + */ + public void targetModified(TargetModifiedEvent e); +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/event/UIObserver.java b/designer-base/src/com/fr/design/event/UIObserver.java similarity index 100% rename from designer_base/src/com/fr/design/event/UIObserver.java rename to designer-base/src/com/fr/design/event/UIObserver.java diff --git a/designer-base/src/com/fr/design/event/UIObserverListener.java b/designer-base/src/com/fr/design/event/UIObserverListener.java new file mode 100644 index 0000000000..9693367cf6 --- /dev/null +++ b/designer-base/src/com/fr/design/event/UIObserverListener.java @@ -0,0 +1,14 @@ +package com.fr.design.event; + +import java.util.EventListener; + +/** + * Created by IntelliJ IDEA. + * Author : Richer + * Version: 6.5.6 + * Date: 13-3-22 + * Time: 下午5:22 + */ +public interface UIObserverListener extends EventListener { + public void doChange(); +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/extra/After.java b/designer-base/src/com/fr/design/extra/After.java similarity index 100% rename from designer_base/src/com/fr/design/extra/After.java rename to designer-base/src/com/fr/design/extra/After.java diff --git a/designer_base/src/com/fr/design/extra/AppStoreBuilder.java b/designer-base/src/com/fr/design/extra/AppStoreBuilder.java similarity index 100% rename from designer_base/src/com/fr/design/extra/AppStoreBuilder.java rename to designer-base/src/com/fr/design/extra/AppStoreBuilder.java diff --git a/designer-base/src/com/fr/design/extra/LoginCheckContext.java b/designer-base/src/com/fr/design/extra/LoginCheckContext.java new file mode 100644 index 0000000000..42d544435a --- /dev/null +++ b/designer-base/src/com/fr/design/extra/LoginCheckContext.java @@ -0,0 +1,30 @@ +package com.fr.design.extra; + +import java.util.ArrayList; + +/** + * Created by 夏翔 on 2016/3/14 0014. + */ + + +public class LoginCheckContext { + private static ArrayList loginCheckListenerList = new ArrayList(); + + /** + * 触发登录框弹出的监听器 + */ + public static void fireLoginCheckListener() { + for (LoginCheckListener l : loginCheckListenerList) { + l.loginChecked(); + } + } + + /** + * 添加一个弹出登录框的监听事件 + * + * @param l 登录框弹出监听事件 + */ + public static void addLoginCheckListener(LoginCheckListener l) { + loginCheckListenerList.add(l); + } +} diff --git a/designer-base/src/com/fr/design/extra/LoginCheckListener.java b/designer-base/src/com/fr/design/extra/LoginCheckListener.java new file mode 100644 index 0000000000..aaf168c7ef --- /dev/null +++ b/designer-base/src/com/fr/design/extra/LoginCheckListener.java @@ -0,0 +1,8 @@ +package com.fr.design.extra; + +/** + * Created by 夏翔 on 2016/3/14 0013. + */ +public interface LoginCheckListener { + void loginChecked(); +} diff --git a/designer_base/src/com/fr/design/extra/LoginContextListener.java b/designer-base/src/com/fr/design/extra/LoginContextListener.java similarity index 100% rename from designer_base/src/com/fr/design/extra/LoginContextListener.java rename to designer-base/src/com/fr/design/extra/LoginContextListener.java diff --git a/designer_base/src/com/fr/design/extra/LoginDialog.java b/designer-base/src/com/fr/design/extra/LoginDialog.java similarity index 100% rename from designer_base/src/com/fr/design/extra/LoginDialog.java rename to designer-base/src/com/fr/design/extra/LoginDialog.java diff --git a/designer_base/src/com/fr/design/extra/LoginWebBridge.java b/designer-base/src/com/fr/design/extra/LoginWebBridge.java similarity index 100% rename from designer_base/src/com/fr/design/extra/LoginWebBridge.java rename to designer-base/src/com/fr/design/extra/LoginWebBridge.java diff --git a/designer_base/src/com/fr/design/extra/LoginWebPane.java b/designer-base/src/com/fr/design/extra/LoginWebPane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/LoginWebPane.java rename to designer-base/src/com/fr/design/extra/LoginWebPane.java diff --git a/designer_base/src/com/fr/design/extra/PluginAbstractLoadingViewPane.java b/designer-base/src/com/fr/design/extra/PluginAbstractLoadingViewPane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginAbstractLoadingViewPane.java rename to designer-base/src/com/fr/design/extra/PluginAbstractLoadingViewPane.java diff --git a/designer_base/src/com/fr/design/extra/PluginAbstractViewPane.java b/designer-base/src/com/fr/design/extra/PluginAbstractViewPane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginAbstractViewPane.java rename to designer-base/src/com/fr/design/extra/PluginAbstractViewPane.java diff --git a/designer-base/src/com/fr/design/extra/PluginConstants.java b/designer-base/src/com/fr/design/extra/PluginConstants.java new file mode 100644 index 0000000000..b218d9205b --- /dev/null +++ b/designer-base/src/com/fr/design/extra/PluginConstants.java @@ -0,0 +1,15 @@ +package com.fr.design.extra; + +/** + * Created by ibm on 2017/5/25. + */ +public class PluginConstants { + public static final int BYTES_NUM = 1024; + private static final String TEMP_PATH = System.getProperty("user.dir") + "/tmp"; + public static final String DOWNLOAD_PATH = System.getProperty("user.dir") + "/download"; + //插件依赖的下载位置 + public static final String DEPENDENCE_DOWNLOAD_PATH = System.getProperty("user.dir") + "/download/dependence"; + public static final String TEMP_FILE = "temp.zip"; + public static final String CONNECTION_404 = "404"; + +} diff --git a/designer_base/src/com/fr/design/extra/PluginControlPane.java b/designer-base/src/com/fr/design/extra/PluginControlPane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginControlPane.java rename to designer-base/src/com/fr/design/extra/PluginControlPane.java diff --git a/designer_base/src/com/fr/design/extra/PluginDescriptionLabel.java b/designer-base/src/com/fr/design/extra/PluginDescriptionLabel.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginDescriptionLabel.java rename to designer-base/src/com/fr/design/extra/PluginDescriptionLabel.java diff --git a/designer_base/src/com/fr/design/extra/PluginDetailPane.java b/designer-base/src/com/fr/design/extra/PluginDetailPane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginDetailPane.java rename to designer-base/src/com/fr/design/extra/PluginDetailPane.java diff --git a/designer_base/src/com/fr/design/extra/PluginFromStorePane.java b/designer-base/src/com/fr/design/extra/PluginFromStorePane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginFromStorePane.java rename to designer-base/src/com/fr/design/extra/PluginFromStorePane.java diff --git a/designer_base/src/com/fr/design/extra/PluginInstalledPane.java b/designer-base/src/com/fr/design/extra/PluginInstalledPane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginInstalledPane.java rename to designer-base/src/com/fr/design/extra/PluginInstalledPane.java diff --git a/designer_base/src/com/fr/design/extra/PluginListPane.java b/designer-base/src/com/fr/design/extra/PluginListPane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginListPane.java rename to designer-base/src/com/fr/design/extra/PluginListPane.java diff --git a/designer_base/src/com/fr/design/extra/PluginOperateUtils.java b/designer-base/src/com/fr/design/extra/PluginOperateUtils.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginOperateUtils.java rename to designer-base/src/com/fr/design/extra/PluginOperateUtils.java diff --git a/designer_base/src/com/fr/design/extra/PluginSelectListener.java b/designer-base/src/com/fr/design/extra/PluginSelectListener.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginSelectListener.java rename to designer-base/src/com/fr/design/extra/PluginSelectListener.java diff --git a/designer_base/src/com/fr/design/extra/PluginStatusCheckCompletePane.java b/designer-base/src/com/fr/design/extra/PluginStatusCheckCompletePane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginStatusCheckCompletePane.java rename to designer-base/src/com/fr/design/extra/PluginStatusCheckCompletePane.java diff --git a/designer_base/src/com/fr/design/extra/PluginTask.java b/designer-base/src/com/fr/design/extra/PluginTask.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginTask.java rename to designer-base/src/com/fr/design/extra/PluginTask.java diff --git a/designer_base/src/com/fr/design/extra/PluginUpdatePane.java b/designer-base/src/com/fr/design/extra/PluginUpdatePane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginUpdatePane.java rename to designer-base/src/com/fr/design/extra/PluginUpdatePane.java diff --git a/designer_base/src/com/fr/design/extra/PluginUtils.java b/designer-base/src/com/fr/design/extra/PluginUtils.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginUtils.java rename to designer-base/src/com/fr/design/extra/PluginUtils.java diff --git a/designer_base/src/com/fr/design/extra/PluginWebBridge.java b/designer-base/src/com/fr/design/extra/PluginWebBridge.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginWebBridge.java rename to designer-base/src/com/fr/design/extra/PluginWebBridge.java diff --git a/designer_base/src/com/fr/design/extra/PluginWebPane.java b/designer-base/src/com/fr/design/extra/PluginWebPane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginWebPane.java rename to designer-base/src/com/fr/design/extra/PluginWebPane.java diff --git a/designer_base/src/com/fr/design/extra/PluginsReaderFromStore.java b/designer-base/src/com/fr/design/extra/PluginsReaderFromStore.java similarity index 100% rename from designer_base/src/com/fr/design/extra/PluginsReaderFromStore.java rename to designer-base/src/com/fr/design/extra/PluginsReaderFromStore.java diff --git a/designer_base/src/com/fr/design/extra/Process.java b/designer-base/src/com/fr/design/extra/Process.java similarity index 100% rename from designer_base/src/com/fr/design/extra/Process.java rename to designer-base/src/com/fr/design/extra/Process.java diff --git a/designer_base/src/com/fr/design/extra/QQLoginDialog.java b/designer-base/src/com/fr/design/extra/QQLoginDialog.java similarity index 100% rename from designer_base/src/com/fr/design/extra/QQLoginDialog.java rename to designer-base/src/com/fr/design/extra/QQLoginDialog.java diff --git a/designer_base/src/com/fr/design/extra/QQLoginWebPane.java b/designer-base/src/com/fr/design/extra/QQLoginWebPane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/QQLoginWebPane.java rename to designer-base/src/com/fr/design/extra/QQLoginWebPane.java diff --git a/designer_base/src/com/fr/design/extra/ShopDialog.java b/designer-base/src/com/fr/design/extra/ShopDialog.java similarity index 100% rename from designer_base/src/com/fr/design/extra/ShopDialog.java rename to designer-base/src/com/fr/design/extra/ShopDialog.java diff --git a/designer_base/src/com/fr/design/extra/ShopManagerPane.java b/designer-base/src/com/fr/design/extra/ShopManagerPane.java similarity index 100% rename from designer_base/src/com/fr/design/extra/ShopManagerPane.java rename to designer-base/src/com/fr/design/extra/ShopManagerPane.java diff --git a/designer_base/src/com/fr/design/extra/ShopPaneConfig.java b/designer-base/src/com/fr/design/extra/ShopPaneConfig.java similarity index 100% rename from designer_base/src/com/fr/design/extra/ShopPaneConfig.java rename to designer-base/src/com/fr/design/extra/ShopPaneConfig.java diff --git a/designer_base/src/com/fr/design/extra/UserLoginContext.java b/designer-base/src/com/fr/design/extra/UserLoginContext.java similarity index 100% rename from designer_base/src/com/fr/design/extra/UserLoginContext.java rename to designer-base/src/com/fr/design/extra/UserLoginContext.java diff --git a/designer_base/src/com/fr/design/extra/WebViewDlgHelper.java b/designer-base/src/com/fr/design/extra/WebViewDlgHelper.java similarity index 100% rename from designer_base/src/com/fr/design/extra/WebViewDlgHelper.java rename to designer-base/src/com/fr/design/extra/WebViewDlgHelper.java diff --git a/designer_base/src/com/fr/design/extra/exe/Command.java b/designer-base/src/com/fr/design/extra/exe/Command.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/Command.java rename to designer-base/src/com/fr/design/extra/exe/Command.java diff --git a/designer_base/src/com/fr/design/extra/exe/Executor.java b/designer-base/src/com/fr/design/extra/exe/Executor.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/Executor.java rename to designer-base/src/com/fr/design/extra/exe/Executor.java diff --git a/designer_base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java b/designer-base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java rename to designer-base/src/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java diff --git a/designer_base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java b/designer-base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java rename to designer-base/src/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java diff --git a/designer_base/src/com/fr/design/extra/exe/GetPluginPrefixExecutor.java b/designer-base/src/com/fr/design/extra/exe/GetPluginPrefixExecutor.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/GetPluginPrefixExecutor.java rename to designer-base/src/com/fr/design/extra/exe/GetPluginPrefixExecutor.java diff --git a/designer_base/src/com/fr/design/extra/exe/PluginLoginExecutor.java b/designer-base/src/com/fr/design/extra/exe/PluginLoginExecutor.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/PluginLoginExecutor.java rename to designer-base/src/com/fr/design/extra/exe/PluginLoginExecutor.java diff --git a/designer_base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java b/designer-base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java rename to designer-base/src/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java diff --git a/designer_base/src/com/fr/design/extra/exe/SearchOnlineExecutor.java b/designer-base/src/com/fr/design/extra/exe/SearchOnlineExecutor.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/SearchOnlineExecutor.java rename to designer-base/src/com/fr/design/extra/exe/SearchOnlineExecutor.java diff --git a/designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java b/designer-base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java rename to designer-base/src/com/fr/design/extra/exe/callback/AbstractPluginTaskCallback.java diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java b/designer-base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java rename to designer-base/src/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java diff --git a/designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java b/designer-base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java rename to designer-base/src/com/fr/design/extra/exe/callback/InstallOnlineCallback.java diff --git a/designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java b/designer-base/src/com/fr/design/extra/exe/callback/JSCallback.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/callback/JSCallback.java rename to designer-base/src/com/fr/design/extra/exe/callback/JSCallback.java diff --git a/designer_base/src/com/fr/design/extra/exe/callback/JSExecutor.java b/designer-base/src/com/fr/design/extra/exe/callback/JSExecutor.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/callback/JSExecutor.java rename to designer-base/src/com/fr/design/extra/exe/callback/JSExecutor.java diff --git a/designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java b/designer-base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java rename to designer-base/src/com/fr/design/extra/exe/callback/ModifyStatusCallback.java diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java b/designer-base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java rename to designer-base/src/com/fr/design/extra/exe/callback/UninstallPluginCallback.java diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java b/designer-base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java rename to designer-base/src/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java diff --git a/designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java b/designer-base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java rename to designer-base/src/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java diff --git a/designer_base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java b/designer-base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java rename to designer-base/src/com/fr/design/extra/exe/extratask/AbstractExtraPluginTask.java diff --git a/designer_base/src/com/fr/design/extra/exe/extratask/ExtraPluginTask.java b/designer-base/src/com/fr/design/extra/exe/extratask/ExtraPluginTask.java similarity index 100% rename from designer_base/src/com/fr/design/extra/exe/extratask/ExtraPluginTask.java rename to designer-base/src/com/fr/design/extra/exe/extratask/ExtraPluginTask.java diff --git a/designer_base/src/com/fr/design/extra/modal-dialog.css b/designer-base/src/com/fr/design/extra/modal-dialog.css similarity index 100% rename from designer_base/src/com/fr/design/extra/modal-dialog.css rename to designer-base/src/com/fr/design/extra/modal-dialog.css diff --git a/designer_base/src/com/fr/design/extra/plugin.properties b/designer-base/src/com/fr/design/extra/plugin.properties similarity index 100% rename from designer_base/src/com/fr/design/extra/plugin.properties rename to designer-base/src/com/fr/design/extra/plugin.properties diff --git a/designer_base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java b/designer-base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java similarity index 100% rename from designer_base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java rename to designer-base/src/com/fr/design/extra/tradition/callback/UpdateOnlineCallback.java diff --git a/designer_base/src/com/fr/design/extra/ucenter/AbstractClient.java b/designer-base/src/com/fr/design/extra/ucenter/AbstractClient.java similarity index 100% rename from designer_base/src/com/fr/design/extra/ucenter/AbstractClient.java rename to designer-base/src/com/fr/design/extra/ucenter/AbstractClient.java diff --git a/designer_base/src/com/fr/design/extra/ucenter/Client.java b/designer-base/src/com/fr/design/extra/ucenter/Client.java similarity index 100% rename from designer_base/src/com/fr/design/extra/ucenter/Client.java rename to designer-base/src/com/fr/design/extra/ucenter/Client.java diff --git a/designer_base/src/com/fr/design/extra/ucenter/XMLHelper.java b/designer-base/src/com/fr/design/extra/ucenter/XMLHelper.java similarity index 100% rename from designer_base/src/com/fr/design/extra/ucenter/XMLHelper.java rename to designer-base/src/com/fr/design/extra/ucenter/XMLHelper.java diff --git a/designer-base/src/com/fr/design/file/FileOperations.java b/designer-base/src/com/fr/design/file/FileOperations.java new file mode 100644 index 0000000000..34b86cbc68 --- /dev/null +++ b/designer-base/src/com/fr/design/file/FileOperations.java @@ -0,0 +1,45 @@ +package com.fr.design.file; + + +public interface FileOperations { + /** + *打开选中的报表文件 + */ + public void openSelectedReport(); + + /** + *打开文件夹 + */ + public void openContainerFolder(); + + /** + *刷新 + */ + public void refresh(); + + /** + *删除文件 + */ + public void deleteFile(); + + /** + *加上文件锁 + */ + public void lockFile(); + + /** + *文件解锁 + */ + public void unLockFile(); + + public String getSelectedTemplatePath(); + + /** + *文件名是否存在 + * @param newName 原名 + * @param oldName 新的文件名 + * @param suffix 后缀名 + * @return 是否存在 + */ + public boolean isNameAlreadyExist(String newName, String oldName, String suffix); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/file/FileToolbarStateChangeListener.java b/designer-base/src/com/fr/design/file/FileToolbarStateChangeListener.java new file mode 100644 index 0000000000..837551ba0e --- /dev/null +++ b/designer-base/src/com/fr/design/file/FileToolbarStateChangeListener.java @@ -0,0 +1,5 @@ +package com.fr.design.file; + +public interface FileToolbarStateChangeListener { + public void stateChange(); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/file/HistoryTemplateListPane.java b/designer-base/src/com/fr/design/file/HistoryTemplateListPane.java new file mode 100644 index 0000000000..dfd1f123f2 --- /dev/null +++ b/designer-base/src/com/fr/design/file/HistoryTemplateListPane.java @@ -0,0 +1,441 @@ +package com.fr.design.file; + +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.*; +import java.util.List; +import java.util.logging.Level; + +import javax.swing.*; + +import com.fr.base.chart.chartdata.CallbackEvent; +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; +import javax.swing.event.ListSelectionListener; + +import com.fr.base.FRContext; +import com.fr.design.data.datapane.TableDataTreePane; +import com.fr.dav.LocalEnv; +import com.fr.design.DesignModelAdapter; +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; +import com.fr.design.utils.gui.GUIPaintUtils; + +public class HistoryTemplateListPane extends JPanel implements FileOperations, CallbackEvent { + //最大保存内存中面板数,为0时关闭优化内存 + private static final int DEAD_LINE = 5; + private static final int LIST_BORDER = 4; + private List> historyList; + private JTemplate editingTemplate; + private FileToolbarStateChangeListener toobarStateChangeListener; + + private static HistoryTemplateListPane THIS; + + private UIList list; + + public static final HistoryTemplateListPane getInstance() { + if (THIS == null) { + THIS = new HistoryTemplateListPane(); + } + return THIS; + } + + public HistoryTemplateListPane() { + setLayout(new BorderLayout()); + historyList = new ArrayList>(); + list = new UIList(new HistoryListDataMode()) { + public int locationToIndex(Point location) { + int rowCount = getModel().getSize(); + int height = getPreferredSize().height - 2 * LIST_BORDER; + int rowHeight = height / rowCount; + int index = (location.y - LIST_BORDER) / rowHeight; + if (location.y < LIST_BORDER || index > rowCount - 1) { + return -1; + } else { + return index; + } + } + }; + ToolTipManager.sharedInstance().registerComponent(list); + list.setBackground(UIConstants.NORMAL_BACKGROUND); + list.setCellRenderer(new HistoryListCellRender()); + list.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() < 2) { + return; + } + openSelectedReport(); + } + }); + + + list.addListSelectionListener(new ListSelectionListener() { + + @Override + public void valueChanged(ListSelectionEvent e) { + if (toobarStateChangeListener != null) { + toobarStateChangeListener.stateChange(); + } + + } + }); + list.setBorder(BorderFactory.createEmptyBorder(LIST_BORDER, LIST_BORDER, LIST_BORDER, LIST_BORDER)); + UIScrollPane scrollPane = new UIScrollPane(list); + scrollPane.setBorder(null); + + this.add(scrollPane, BorderLayout.CENTER); + + } + + /** + * 关闭选择的文件 + * + * @param selected 选择的 + */ + public void closeSelectedReport(JTemplate selected) { + DesignModuleFactory.clearChartPropertyPane(); + DesignTableDataManager.closeTemplate(selected); + GeneralContext.removeEnvWillChangedListener(selected.getFullPathName()); + if (contains(selected) == -1) { + return; + } + selected.fireJTemplateClosed(); + selected.stopEditing(); + try { + historyList.remove(contains(selected)); + selected.getEditingFILE().closeTemplate(); + FRLogger.getLogger().log(Level.INFO, Inter.getLocText(new String[]{"Template", "alraedy_close"}, new String[]{selected.getEditingFILE().getName(), "."})); + MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + + } + + /** + * 临时关闭选择的文件 + * + * @param selected 选择的 + */ + public void closeVirtualSelectedReport(JTemplate selected) { + DesignModuleFactory.clearChartPropertyPane(); + DesignTableDataManager.closeTemplate(selected); + GeneralContext.removeEnvWillChangedListener(selected.getFullPathName()); + if (contains(selected) == -1) { + return; + } + selected.fireJTemplateClosed(); + selected.stopEditing(); + try { + selected.getEditingFILE().closeTemplate(); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + } + + /** + * 关闭选择的文件 + */ + public void selectedReportToVirtual(int i) { + closeOverLineTemplate(); + } + + public JTemplate getCurrentEditingTemplate() { + return this.editingTemplate; + } + + public void setCurrentEditingTemplate(JTemplate jt) { + this.editingTemplate = jt; + //如果当前历史面板中没有 + + if (contains(jt) == -1) { + addHistory(); + } + MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList); + //设置tab栏为当前选中的那一栏 + if (editingTemplate != null) { + MutilTempalteTabPane.getInstance().setSelectedIndex(contains(jt)); + } + + } + + /** + * 添加历史记录 + */ + public void addHistory() { + if (editingTemplate == null) { + return; + } + DesignerEnvManager.getEnvManager().addRecentOpenedFilePath(editingTemplate.getFullPathName()); + ((HistoryListDataMode) list.getModel()).add(editingTemplate); + } + + + public List> getHistoryList() { + return historyList; + } + + + /** + * 清空历史记录 + */ + public void removeAllHistory() { + historyList.clear(); + this.editingTemplate = null; + } + + public int getHistoryCount() { + return list.getModel().getSize(); + } + + + public UIList getList() { + return list; + } + + + public JTemplate get(int index) { + return (JTemplate) list.getModel().getElementAt(index); + } + + + public JTemplate getTemplate(int index) { + return historyList.get(index); + } + + /** + * 获取模板的index + * + * @param jt 模板 + * @return 位置 + */ + public int contains(JTemplate jt) { + for (int i = 0; i < historyList.size(); i++) { + if (ComparatorUtils.equals(historyList.get(i).getEditingFILE(), jt.getEditingFILE())) { + return i; + } + } + return -1; + } + + + /** + * 判断是否打开过该模板 + * + * @param filename 文件名 + * @return 文件位置 + */ + public int contains(String filename) { + for (int i = 0; i < historyList.size(); i++) { + String historyPath = historyList.get(i).getFullPathName(); + if (ComparatorUtils.equals(historyPath, filename)) { + return i; + } + } + return -1; + } + + /** + * 是否是当前编辑的文件 + * + * @param filename 文件名 + * @return 是则返回TRUE + */ + public boolean isCurrentEditingFile(String filename) { + String editingFileName = editingTemplate.getFullPathName(); + return ComparatorUtils.equals(filename, editingFileName); + } + + @Override + public void callback() { + getCurrentEditingTemplate().repaint(); + } + + private class HistoryListCellRender extends DefaultListCellRenderer { + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, final boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + JTemplate jt = (JTemplate) value; + UILabel nameLabel = new UILabel(jt.getEditingFILE().getName()); + final int nameWidth = nameLabel.getPreferredSize().width; + UILabel uiLabel = new UILabel() { + public void paint(Graphics g) { + GUIPaintUtils.fillPaint((Graphics2D) g, 18, 0, nameWidth + 2, getHeight(), true, Constants.NULL, isSelected ? UIConstants.FLESH_BLUE : UIConstants.NORMAL_BACKGROUND, UIConstants.ARC); + super.paint(g); + } + + }; + uiLabel.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); + uiLabel.setIcon(jt.getIcon()); + uiLabel.setText(jt.getEditingFILE().getName()); + return uiLabel; + } + + } + + + private class HistoryListDataMode extends AbstractListModel { + + @Override + public int getSize() { + return historyList.size(); + } + + @Override + public JTemplate getElementAt(int index) { + if (index > getSize() - 1 || index < 0) { + return null; + } + Collections.reverse(historyList); + JTemplate select = historyList.get(index); + Collections.reverse(historyList); + return select; + } + + public void remove(int index) { + boolean outofindex = index >= historyList.size() || index < 0; + if (historyList.isEmpty() || outofindex) { + return; + } + historyList.remove(index); + } + + public void add(JTemplate jt) { + historyList.add(jt); + closeOverLineTemplate(); + refresh(); + } + } + + /** + * 打开new模板的同时关闭old模板,优先关已保存的、先打开的 + */ + public void closeOverLineTemplate() { + int size = historyList.size(); + int vCount = size - DEAD_LINE; + if (DEAD_LINE == 0 || vCount <= 0) { + return; + } + for (int i = 0; i < vCount; i++) { + JTemplate overTemplate = historyList.get(i); + + if (overTemplate.getEditingFILE().exists() && overTemplate.isALLSaved() && overTemplate != editingTemplate) { + historyList.get(i).closeOverLineTemplate(i); + } + } + MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList); + } + + /** + * 刷新 + */ + public void refresh() { + list.removeAll(); + list.setModel(new HistoryListDataMode()); + list.setSelectedIndex(list.getSelectedIndex()); + } + + /** + * 打开选择的文件 + */ + public void openSelectedReport() { + DesignerContext.getDesignerFrame().addAndActivateJTemplate((JTemplate) list.getSelectedValue()); + TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); + refresh(); + } + + /** + * 打开文件所在文件夹 + */ + public void openContainerFolder() { + FileNode fileNode = new FileNode(((JTemplate) list.getSelectedValue()).getEditingFILE().getPath(), false); + LocalEnv localEnv = (LocalEnv) FRContext.getCurrentEnv(); + localEnv.openContainerFolder(fileNode); + } + + /** + * 删除文件 + */ + public void deleteFile() { +// TODO Auto-generated method stub + + } + + /*** + * 琐文件 + */ + public void lockFile() { +// TODO Auto-generated method stub + + } + + /** + * 解锁 + */ + public void unLockFile() { +// TODO Auto-generated method stub + + } + + /** + * 路径 + * + * @return 路径 + */ + public String getSelectedTemplatePath() { + if (list.getSelectedIndex() < 0 || list.getSelectedIndex() > list.getModel().getSize() - 1) { + return null; + } + ; + String path = ((HistoryListDataMode) list.getModel()).getElementAt(list.getSelectedIndex()).getEditingFILE().getPath(); + if (path.startsWith(ProjectConstants.REPORTLETS_NAME)) { + return path.substring(ProjectConstants.REPORTLETS_NAME.length()); + } + return path; + } + + public void setToobarStateChangeListener(FileToolbarStateChangeListener toobarStateChangeListener) { + this.toobarStateChangeListener = toobarStateChangeListener; + } + + /** + * 文件是否存在 + * + * @param newName 文件名 + * @param oldName 原名 + * @param suffix 后缀名 + * @return 文件是否存在 + */ + public boolean isNameAlreadyExist(String newName, String oldName, String suffix) { + boolean isNameAreadyExist = false; + for (int i = 0; i < getHistoryCount(); i++) { + JTemplate jt = ((HistoryListDataMode) list.getModel()).getElementAt(i); + if (ComparatorUtils.equals(jt.getEditingFILE().getName(), newName + suffix)) { + isNameAreadyExist = true; + break; + } + } + if (ComparatorUtils.equals(newName, oldName)) { + isNameAreadyExist = false; + } + + return isNameAreadyExist; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/com/fr/design/file/MutilTempalteTabPane.java new file mode 100644 index 0000000000..5a05f20d2d --- /dev/null +++ b/designer-base/src/com/fr/design/file/MutilTempalteTabPane.java @@ -0,0 +1,957 @@ +package com.fr.design.file; + + +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.mainframe.JVirtualTemplate; +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; + +import javax.swing.*; +import javax.swing.plaf.basic.BasicMenuItemUI; +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.*; +import java.io.File; +import java.util.logging.Level; + +/** + * 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(58, 56, 58)); + 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; + tem.activeNewJTemplate(); + } + }); + } + 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); + //TODO hzzz delete +// 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.TEMPLATE_TAB_PANE_BACKGROUND, 1, getHeight() - 1, UIConstants.TEMPLATE_TAB_PANE_BACKGROUND)); + g2d.fillRect(0, 0, 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() + 1, getHeight() + 1, 1, 1}; + RoundRectangle2D.Double rect1 = new RoundRectangle2D.Double(templateStartX, 1, this.getWidth(), this.getHeight(), 7, 7); + g2d.setPaint(new GradientPaint(1, 1, UIConstants.SELECT_TAB, 1, getHeight() - 1, UIConstants.SELECT_TAB)); + //选了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(new Color(200, 201, 205)); + 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.TEMPLATE_TAB_PANE_BACKGROUND); + //TODO hzzz delete +// 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; + } + JTemplate evtXTemplate = openedTemplate.get(getTemplateIndex(evtX)); + evtXTemplate.activeNewJTemplate(); + } + 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); + } + //如果是已后台关闭的模板,则重新打开文件 + openedTemplate.get(selectedIndex).activeOldJTemplate(); + } + } + + /** + * 鼠标释放 + * + * @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/file/NewTemplatePane.java b/designer-base/src/com/fr/design/file/NewTemplatePane.java new file mode 100644 index 0000000000..47db76f4e5 --- /dev/null +++ b/designer-base/src/com/fr/design/file/NewTemplatePane.java @@ -0,0 +1,164 @@ +package com.fr.design.file; + +import com.fr.base.BaseUtils; +import com.fr.design.constants.UIConstants; +import com.fr.design.mainframe.DesignerContext; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.geom.Line2D; +import java.awt.geom.Rectangle2D; + +/** + * Author : daisy + * Date: 13-8-27 + * Time: 下午6:07 + */ +public abstract class NewTemplatePane extends JComponent implements MouseListener, MouseMotionListener { + + private static final Icon GRAY_NEW_CPT = BaseUtils.readIcon("/com/fr/design/images/buttonicon/additicon_grey.png"); + private static final int PRE_GAP = 0; + private static final int HEIGHT = 26; + private Graphics2D g2d; + private Icon newWorkBookIconMode = null; + private int newIconStartX = PRE_GAP; + + + public NewTemplatePane() { + newWorkBookIconMode = getNew(); + this.setLayout(new BorderLayout(0, 0)); + this.addMouseListener(this); + this.addMouseMotionListener(this); + this.setBorder(null); + this.setForeground(new Color(99, 99, 99)); + } + + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.width = HEIGHT; + return dim; + } + + + public void paintComponent(Graphics g) { + super.paintComponent(g); + g2d = (Graphics2D) g; + g2d.setColor(UIConstants.TEMPLATE_TAB_PANE_BACKGROUND); + g2d.fill(new Rectangle2D.Double(0, 0, getWidth(),getHeight())); + int sheetIconY = (getHeight() - newWorkBookIconMode.getIconHeight()) / 2; + newWorkBookIconMode.paintIcon(this, g2d, newIconStartX, sheetIconY); +// paintUnderLine(g2d); + } + + + private void paintUnderLine(Graphics2D g2d) { + //画下面的那条线 + g2d.setPaint(UIConstants.LINE_COLOR); + g2d.draw(new Line2D.Double((float) 0, (float) (getHeight()-1), getWidth(), (float) (getHeight()-1))); + } + + /** + *鼠标点击 + * @param e 事件 + */ + public void mouseClicked(MouseEvent e) { + if (BaseUtils.isAuthorityEditing()) { + newWorkBookIconMode = GRAY_NEW_CPT; + } + } + + /** + *鼠标按下 + * @param e 事件 + */ + public void mousePressed(MouseEvent e) { + int evtX = e.getX(); + if (BaseUtils.isAuthorityEditing()) { + newWorkBookIconMode = GRAY_NEW_CPT; + } + if (isOverNewIcon(evtX) && newWorkBookIconMode != GRAY_NEW_CPT) { + newWorkBookIconMode = getMousePressNew(); + newIconStartX = 0; + DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + } + this.repaint(); + } + + /** + *鼠标松开 + * @param e 事件 + */ + public void mouseReleased(MouseEvent e) { + if (BaseUtils.isAuthorityEditing()) { + newWorkBookIconMode = GRAY_NEW_CPT; + } + } + + /** + *鼠标进入 + * @param e 事件 + */ + public void mouseEntered(MouseEvent e) { + if (BaseUtils.isAuthorityEditing()) { + newWorkBookIconMode = GRAY_NEW_CPT; + } + } + + /** + *鼠标离开 + * @param e 事件 + */ + public void mouseExited(MouseEvent e) { + newIconStartX = PRE_GAP; + if (BaseUtils.isAuthorityEditing()) { + newWorkBookIconMode = GRAY_NEW_CPT; + } else { + newWorkBookIconMode = getNew(); + } + + this.repaint(); + } + + /** + *鼠标拖拽 + * @param e 事件 + */ + public void mouseDragged(MouseEvent e) { + } + + /** + *鼠标移动 + * @param e 事件 + */ + public void mouseMoved(MouseEvent e) { + int evtX = e.getX(); + if (BaseUtils.isAuthorityEditing()) { + newWorkBookIconMode = GRAY_NEW_CPT; + } else if (isOverNewIcon(evtX)) { + newIconStartX = 0; + newWorkBookIconMode = getMouseOverNew(); + } + + this.repaint(); + + } + + + private boolean isOverNewIcon(int evtX) { + return (evtX >= PRE_GAP && evtX <= PRE_GAP + newWorkBookIconMode.getIconWidth()); + } + + public void setButtonGray(boolean isGray) { + newWorkBookIconMode = isGray ? GRAY_NEW_CPT : getNew(); + } + + public abstract Icon getNew(); + + public abstract Icon getMouseOverNew(); + + public abstract Icon getMousePressNew(); + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/file/SaveSomeTemplatePane.java b/designer-base/src/com/fr/design/file/SaveSomeTemplatePane.java similarity index 100% rename from designer_base/src/com/fr/design/file/SaveSomeTemplatePane.java rename to designer-base/src/com/fr/design/file/SaveSomeTemplatePane.java diff --git a/designer-base/src/com/fr/design/file/TemplateTreePane.java b/designer-base/src/com/fr/design/file/TemplateTreePane.java new file mode 100644 index 0000000000..9061521a49 --- /dev/null +++ b/designer-base/src/com/fr/design/file/TemplateTreePane.java @@ -0,0 +1,334 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.file; + +import com.fr.base.FRContext; +import com.fr.dav.LocalEnv; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.itree.filetree.TemplateFileTree; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; +import com.fr.env.RemoteEnv; +import com.fr.file.FileNodeFILE; +import com.fr.file.filetree.FileNode; +import com.fr.file.filetree.IOFileNodeFilter; +import com.fr.general.ComparatorUtils; +import com.fr.general.FRLogger; +import com.fr.general.Inter; +import com.fr.stable.CoreConstants; +import com.fr.stable.ProductConstants; +import com.fr.stable.StableUtils; +import com.fr.stable.project.ProjectConstants; +import com.sun.jna.platform.FileUtils; + +import javax.swing.*; +import javax.swing.tree.DefaultMutableTreeNode; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.logging.Level; + +public class TemplateTreePane extends JPanel implements FileOperations { + + public static TemplateTreePane getInstance() { + return HOLDER.singleton; + } + + private static class HOLDER { + private static TemplateTreePane singleton = new TemplateTreePane(); + } + + private TemplateFileTree reportletsTree; + private FileToolbarStateChangeListener toobarStateChangeListener; + + private TemplateTreePane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setPreferredSize(new Dimension(250, super.getPreferredSize().height)); + JPanel contentPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.add(contentPane, BorderLayout.CENTER); + + reportletsTree = new TemplateFileTree(); + ToolTipManager.sharedInstance().registerComponent(reportletsTree); + UIScrollPane scrollPane = new UIScrollPane(reportletsTree); + scrollPane.setBorder(null); + contentPane.add(scrollPane, BorderLayout.CENTER); + + this.reportletsTree.addMouseListener(mouseFileTreeListener);// lx: add + // mouse + // listener + this.reportletsTree.addKeyListener(new KeyListener() { + + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + openSelectedReport(); + } + } + + @Override + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + openSelectedReport(); + } + if (toobarStateChangeListener != null) { + toobarStateChangeListener.stateChange(); + } + } + + @Override + public void keyTyped(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + openSelectedReport(); + } + } + }); + } + + public TemplateFileTree getTemplateFileTree() { + return this.reportletsTree; + } + + /** + * 刷新 + */ + public void refreshDockingView() { + reportletsTree.setFileNodeFilter(new IOFileNodeFilter(FRContext.getCurrentEnv().getSupportedTypes())); + reportletsTree.refreshEnv(FRContext.getCurrentEnv()); + } + + /* + * Tree.MouseAdapter + */ + MouseListener mouseFileTreeListener = new MouseAdapter() { + + @Override + public void mousePressed(MouseEvent evt) { + if (SwingUtilities.isRightMouseButton(evt)) { + return; + } else if (evt.getClickCount() == 2) { + openSelectedReport(); + } + + + } + + public void mouseReleased(MouseEvent e) { + if (toobarStateChangeListener != null) { + toobarStateChangeListener.stateChange(); + } + } + }; + + + /** + * 打开选中的报表文件 + */ + public void openSelectedReport() { + String reportPath = reportletsTree.getSelectedTemplatePath(); + final String selectedFilePath = StableUtils.pathJoin(new String[]{ProjectConstants.REPORTLETS_NAME, reportPath}); + DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(selectedFilePath, false))); + } + + /** + * 打开文件夹 + */ + public void openContainerFolder() { + FileNode fn = TemplateTreePane.this.reportletsTree.getSelectedFileNode(); + LocalEnv localEnv = (LocalEnv) FRContext.getCurrentEnv(); + String filePath = StableUtils.pathJoin(localEnv.path, fn.getEnvPath()); + filePath = filePath.substring(0, filePath.lastIndexOf(CoreConstants.SEPARATOR)); + try { + Desktop.getDesktop().open(new File(filePath)); + } catch (Exception e) { + localEnv.openContainerFolder(fn); + } + } + + /** + * 刷新 + */ + public void refresh() { + reportletsTree.refresh(); + FRLogger.getLogger().log(Level.INFO, Inter.getLocText(new String[]{"File-tree", "Refresh_Successfully"}) + "!"); + } + + /** + * 删除文件 + */ + public void deleteFile() { + String[] reportPaths = reportletsTree.getSelectedTemplatePaths(); + if (reportPaths.length == 0) { + return; + } + if (JOptionPane.showConfirmDialog(null, Inter.getLocText("Confirm-Delete-File")) != JOptionPane.OK_OPTION) { + return; + } + for (String reportPath : reportPaths) { + FileNodeFILE nodeFile = new FileNodeFILE(new FileNode(StableUtils.pathJoin(new String[]{ProjectConstants.REPORTLETS_NAME, reportPath}), false)); + + if (nodeFile.isLocked()) { + if (JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("fileLocked_undeleted"), + Inter.getLocText("Error"), JOptionPane.YES_OPTION, JOptionPane.ERROR_MESSAGE) == JOptionPane.YES_OPTION) { + refreshDockingView(); + } + break; + } + if (nodeFile.exists()) { + String path = StableUtils.pathJoin(new String[]{nodeFile.getEnvPath(), nodeFile.getPath()}); + moveToTrash(nodeFile); + deleteHistory(path.replaceAll("/", "\\\\")); + } else { + JOptionPane.showMessageDialog(this, Inter.getLocText("Warning-Template_Do_Not_Exsit"), ProductConstants.PRODUCT_NAME, + JOptionPane.INFORMATION_MESSAGE); + } + } + reportletsTree.refresh(); + } + + private void deleteHistory(String fileName) { + int index = HistoryTemplateListPane.getInstance().contains(fileName); + int size = HistoryTemplateListPane.getInstance().getHistoryCount(); + if (index == -1) { + return; + } + //如果打开过,则删除,实时刷新多tab面板 + HistoryTemplateListPane.getInstance().getHistoryList().remove(index); + int openfileCount = HistoryTemplateListPane.getInstance().getHistoryCount(); + if (openfileCount == 0) { + DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + } + MutilTempalteTabPane.getInstance().repaint(); + if (size == index + 1 && index != 0) { + //如果删除的是最后一个Tab,则定位到前一个 + MutilTempalteTabPane.getInstance().setSelectedIndex(index - 1); + } + JTemplate selectedfile = MutilTempalteTabPane.getInstance().getSelectedFile(); + if (!HistoryTemplateListPane.getInstance().isCurrentEditingFile(selectedfile.getFullPathName())) { + //如果此时面板上的实时刷新的selectedIndex得到的和历史的不一样 + DesignerContext.getDesignerFrame().activateJTemplate(selectedfile); + } + MutilTempalteTabPane.getInstance().repaint(); + } + + /** + * 加上文件锁 + */ + public void lockFile() { + FileNode fn = reportletsTree.getSelectedFileNode(); + RemoteEnv remoteEnv = (RemoteEnv) FRContext.getCurrentEnv(); + if (fn == null) { + return; + } + try { + remoteEnv.getLock(new String[]{fn.getEnvPath()}); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage()); + } + reportletsTree.refresh(); + } + + /** + * 文件解锁 + */ + public void unLockFile() { + FileNode fn = reportletsTree.getSelectedFileNode(); + if (fn == null) { + return; + } + RemoteEnv remoteEnv = (RemoteEnv) FRContext.getCurrentEnv(); + try { + remoteEnv.releaseLock(new String[]{fn.getEnvPath()}); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage()); + } + reportletsTree.refresh(); + } + + public String getSelectedTemplatePath() { + return reportletsTree.getSelectedTemplatePath(); + } + + public void setToobarStateChangeListener(FileToolbarStateChangeListener toobarStateChangeListener) { + this.toobarStateChangeListener = toobarStateChangeListener; + } + + /** + * 文件名是否存在 + * + * @param newName 原名 + * @param oldName 新的文件名 + * @param suffix 后缀名 + * @return 是否存在 + */ + public boolean isNameAlreadyExist(String newName, String oldName, String suffix) { + boolean isNameAlreadyExist = false; + + TemplateFileTree tt = reportletsTree; + DefaultMutableTreeNode gen = (DefaultMutableTreeNode) tt.getModel().getRoot(); + ArrayList al = new ArrayList(); + + findFiles(gen, al); + + for (int i = 0; i < al.size(); i++) { + if (ComparatorUtils.equals(al.get(i), newName + suffix)) { + isNameAlreadyExist = true; + break; + } + } + + if (ComparatorUtils.equals(newName, oldName)) { + isNameAlreadyExist = false; + } + + return isNameAlreadyExist; + } + + + private void findFiles(DefaultMutableTreeNode node, ArrayList al) { + String[] str = new String[node.getChildCount()]; + for (int j = 0; j < node.getChildCount(); j++) { + DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(j); + if (childNode.getChildCount() > 0) { + findFiles(childNode, al); + } else { + str[j] = node.getChildAt(j).toString(); + if (str[j].contains(".")) { + al.add(str[j]); + } + } + } + } + + /** + * 文件回收 + * + * @param nodeFile 节点文件 + */ + private void moveToTrash(FileNodeFILE nodeFile) { + FileUtils fileUtils = FileUtils.getInstance(); + if (fileUtils.hasTrash()) { + try { + fileUtils.moveToTrash(new File[]{new File(StableUtils.pathJoin(nodeFile.getEnvPath(), nodeFile.getPath()))}); + //todo 走下这个流程,否则集群下其它节点无法同步删除 + FRContext.getCurrentEnv().deleteFile(nodeFile.getPath()); + } catch (IOException e) { + FRLogger.getLogger().info(e.getMessage()); + FRContext.getCurrentEnv().deleteFile(nodeFile.getPath()); + } + } else { + FRLogger.getLogger().info("No Trash Available"); + FRContext.getCurrentEnv().deleteFile(nodeFile.getPath()); + } + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/foldablepane/HeaderPane.java b/designer-base/src/com/fr/design/foldablepane/HeaderPane.java similarity index 100% rename from designer_base/src/com/fr/design/foldablepane/HeaderPane.java rename to designer-base/src/com/fr/design/foldablepane/HeaderPane.java diff --git a/designer_base/src/com/fr/design/foldablepane/UIExpandablePane.java b/designer-base/src/com/fr/design/foldablepane/UIExpandablePane.java similarity index 100% rename from designer_base/src/com/fr/design/foldablepane/UIExpandablePane.java rename to designer-base/src/com/fr/design/foldablepane/UIExpandablePane.java diff --git a/designer_base/src/com/fr/design/formula/AbstractNameAndDescription.java b/designer-base/src/com/fr/design/formula/AbstractNameAndDescription.java similarity index 100% rename from designer_base/src/com/fr/design/formula/AbstractNameAndDescription.java rename to designer-base/src/com/fr/design/formula/AbstractNameAndDescription.java diff --git a/designer-base/src/com/fr/design/formula/CustomVariableResolver.java b/designer-base/src/com/fr/design/formula/CustomVariableResolver.java new file mode 100644 index 0000000000..ef3ecb8663 --- /dev/null +++ b/designer-base/src/com/fr/design/formula/CustomVariableResolver.java @@ -0,0 +1,22 @@ +package com.fr.design.formula; + +public class CustomVariableResolver extends VariableResolverAdapter { + private String[] columnNames; + private boolean isBindCell; + + public CustomVariableResolver(String[] columnNames, boolean isBindCell) { + this.columnNames = columnNames; + this.isBindCell = isBindCell; + } + + @Override + public String[] resolveColumnNames() { + return this.columnNames; + } + + @Override + public boolean isBindCell() { + return this.isBindCell; + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/formula/DefaultUIFormulaProcessor.java b/designer-base/src/com/fr/design/formula/DefaultUIFormulaProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/formula/DefaultUIFormulaProcessor.java rename to designer-base/src/com/fr/design/formula/DefaultUIFormulaProcessor.java diff --git a/designer_base/src/com/fr/design/formula/FormulaFactory.java b/designer-base/src/com/fr/design/formula/FormulaFactory.java similarity index 100% rename from designer_base/src/com/fr/design/formula/FormulaFactory.java rename to designer-base/src/com/fr/design/formula/FormulaFactory.java diff --git a/designer-base/src/com/fr/design/formula/FormulaPane.java b/designer-base/src/com/fr/design/formula/FormulaPane.java new file mode 100644 index 0000000000..4784462942 --- /dev/null +++ b/designer-base/src/com/fr/design/formula/FormulaPane.java @@ -0,0 +1,1028 @@ +package com.fr.design.formula; + +import com.fr.base.BaseFormula; +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.design.actions.UpdateAction; +import com.fr.design.border.UIRoundedBorder; +import com.fr.design.constants.UIConstants; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ilist.QuickList; +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.Inter; +import com.fr.parser.FRLexer; +import com.fr.parser.FRParser; +import com.fr.stable.EncodeConstants; +import com.fr.stable.ProductConstants; +import com.fr.stable.StringUtils; +import com.fr.stable.script.Expression; + +import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.MutableTreeNode; +import javax.swing.tree.TreePath; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringReader; +import java.util.Locale; + +/** + * 公式编辑面板 + * + * @editor zhou + * @since 2012-3-29下午1:50:53 + */ +public class FormulaPane extends BasicPane implements KeyListener, UIFormula { + + protected VariableTreeAndDescriptionArea variableTreeAndDescriptionArea; + protected RSyntaxTextArea formulaTextArea; + protected UITextField keyWordTextField = new UITextField(18); + protected int currentPosition = 0; + protected int beginPosition = 0; + protected int insertPosition = 0; + protected JList tipsList; + protected DefaultListModel listModel = new DefaultListModel(); + protected int ifHasBeenWriten = 0; + protected DefaultListModel functionTypeListModel = new DefaultListModel(); + protected QuickList functionTypeList; + protected DefaultListModel functionNameModel; + protected JList functionNameList; + + public FormulaPane() { + initComponents(); + } + + private void initFormulaTextAreaKeyListener() { + formulaTextArea.addKeyListener(this); + formulaTextArea.addKeyListener(new KeyAdapter() { + public void keyReleased(KeyEvent e) { + formulaTextArea.setForeground(Color.black); + String text = formulaTextArea.getText(); + // 判断在中文输入状态是否还包含提示符 要删掉 + //Tips:You_Can_Input_B1_To_Input_The_Data_Of_The_First_Row_Second_Column + String tip = "\n\n\n" + Inter.getLocText("FR-Designer_FormulaPane_Tips"); + if (text.contains(tip)) { + text = text.substring(0, text.indexOf(tip)); + insertPosition = 0; + formulaTextArea.setText(text); + } + } + }); + } + + private void initFormulaTextAreaMouseListener() { + formulaTextArea.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + insertPosition = formulaTextArea.getCaretPosition(); + if (ifHasBeenWriten == 0) { + formulaTextArea.setText(""); + ifHasBeenWriten = 1; + formulaTextArea.setForeground(Color.black); + insertPosition = 0; + } + } + + @Override + public void mouseReleased(MouseEvent e) { + currentPosition = formulaTextArea.getCaretPosition(); + if (currentPosition == insertPosition) { + beginPosition = getBeginPosition(); + insertPosition = beginPosition; + firstStepToFindTips(beginPosition); + fixFunctionNameList(); + } + } + }); + } + + private void initFormulaTextArea() { + formulaTextArea = new RSyntaxTextArea(); + configFormulaArea(); + initFormulaTextAreaKeyListener(); + initFormulaTextAreaMouseListener(); + } + + private void initKeyWordTextFieldKeyListener() { + keyWordTextField.addKeyListener(new KeyListener() { + @Override + public void keyTyped(KeyEvent e) { + } + + @Override + public void keyReleased(KeyEvent e) { + } + + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + String toFind = keyWordTextField.getText(); + search(toFind, false); + fixFunctionNameList(); + e.consume(); + } + } + }); + } + + private void initTipsPane() { + // tipsPane + JPanel tipsPane = new JPanel(new BorderLayout(4, 4)); + this.add(tipsPane, BorderLayout.EAST); + + JPanel searchPane = new JPanel(new BorderLayout(4, 4)); + searchPane.add(keyWordTextField, BorderLayout.CENTER); + UIButton searchButton = new UIButton(Inter.getLocText("FR-Designer_FormulaPane_Search")); + searchPane.add(searchButton, BorderLayout.EAST); + tipsPane.add(searchPane, BorderLayout.NORTH); + initKeyWordTextFieldKeyListener(); + tipsList = new JList(listModel); + tipsList.addMouseListener(new DoubleClick()); + UIScrollPane tipsScrollPane = new UIScrollPane(tipsList); + tipsScrollPane.setPreferredSize(new Dimension(170, 75)); + tipsScrollPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); + tipsPane.add(tipsScrollPane, BorderLayout.CENTER); + searchButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String toFind = keyWordTextField.getText(); + search(toFind, false); + formulaTextArea.requestFocusInWindow(); + fixFunctionNameList(); + } + }); + } + + protected void initComponents() { + this.setLayout(new BorderLayout(4, 4)); + // text + JPanel textPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.add(textPane, BorderLayout.CENTER); + JPanel checkBoxandbuttonPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + UILabel formulaLabel = new UILabel(Inter.getLocText("FormulaD-Input_formula_in_the_text_area_below") + ":" + + " "); + formulaLabel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + initFormulaTextArea(); + + UIScrollPane formulaTextAreaScrollPane = new UIScrollPane(formulaTextArea); + formulaTextAreaScrollPane.setBorder(null); + textPane.add(formulaLabel, BorderLayout.NORTH); + textPane.add(formulaTextAreaScrollPane, BorderLayout.CENTER); + textPane.add(checkBoxandbuttonPane, BorderLayout.SOUTH); + + initTipsPane(); + + UIButton checkValidButton = new UIButton(Inter.getLocText("FormulaD-Check_Valid")); + checkValidButton.addActionListener(checkValidActionListener); + + JPanel checkBoxPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + checkBoxPane.setPreferredSize(new Dimension(450, 30)); + checkBoxandbuttonPane.add(checkBoxPane, BorderLayout.WEST); + checkBoxandbuttonPane.add(checkValidButton, BorderLayout.EAST); + extendCheckBoxPane(checkBoxPane); + variableTreeAndDescriptionArea = new VariableTreeAndDescriptionArea(); + this.add(variableTreeAndDescriptionArea, BorderLayout.SOUTH); + } + + + protected void extendCheckBoxPane(JPanel checkBoxPane) { + + } + + protected void configFormulaArea() { + formulaTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_FORMULA); + formulaTextArea.setAnimateBracketMatching(true); + formulaTextArea.setAntiAliasingEnabled(true); + formulaTextArea.setAutoIndentEnabled(true); + formulaTextArea.setCodeFoldingEnabled(true); + formulaTextArea.setUseSelectedTextColor(true); + formulaTextArea.setCloseCurlyBraces(true); + formulaTextArea.setBracketMatchingEnabled(true); + formulaTextArea.setAntiAliasingEnabled(true); + formulaTextArea.setCloseMarkupTags(true); + formulaTextArea.setLineWrap(true); + } + + public class DoubleClick extends MouseAdapter { + + @Override + public void mouseClicked(MouseEvent e) { + int index = tipsList.getSelectedIndex(); + if (index != -1) { + String currentLineContent = (String) listModel.getElementAt(index); + if (e.getClickCount() == 2) { + if (ifHasBeenWriten == 0) { + formulaTextArea.setForeground(Color.black); + formulaTextArea.setText(""); + } + formulaTextArea.setForeground(Color.black); + currentPosition = formulaTextArea.getCaretPosition(); + String output = currentLineContent + "()"; + String textAll = formulaTextArea.getText(); + String textReplaced; + int position = 0; + if (insertPosition <= currentPosition) { + textReplaced = textAll.substring(0, insertPosition) + output + textAll.substring(currentPosition); + position = insertPosition + output.length() - 1; + } else { + textReplaced = textAll.substring(0, currentPosition) + output + textAll.substring(insertPosition); + position = currentPosition + output.length() - 1; + } + formulaTextArea.setText(textReplaced); + formulaTextArea.requestFocusInWindow(); + formulaTextArea.setCaretPosition(position); + insertPosition = position; + ifHasBeenWriten = 1; + listModel.removeAllElements(); + } else if (e.getClickCount() == 1) { + refreshDescriptionTextArea(currentLineContent); + + formulaTextArea.requestFocusInWindow(); + fixFunctionNameList(); + } + } + } + } + + @Override + public void keyPressed(KeyEvent e) { + if (ifHasBeenWriten == 0) { + this.formulaTextArea.setText(StringUtils.EMPTY); + } + } + + //hugh:为啥会是10呢?搞不懂~~~ + private static final int KEY_10 = 10; + //上下左右 + private static final int KEY_37 = 37; + private static final int KEY_38 = 38; + private static final int KEY_39 = 39; + private static final int KEY_40 = 40; + + @Override + public void keyReleased(KeyEvent e) { + int key = e.getKeyCode(); + if (key == KEY_38 || key == KEY_40 || key == KEY_37 || key == KEY_39 || key == KEY_10) //如果是删除符号 ,为了可读性 没有和其他按键的程序相融合 + { + listModel.removeAllElements(); + currentPosition = formulaTextArea.getCaretPosition(); + insertPosition = currentPosition; + beginPosition = getBeginPosition(); + } else { + if (this.formulaTextArea.getText().trim().length() == 0) { + insertPosition = 0; + this.listModel.removeAllElements(); + } else { + this.formulaTextArea.setForeground(Color.black); + currentPosition = formulaTextArea.getCaretPosition(); + beginPosition = getBeginPosition(); + insertPosition = beginPosition; + firstStepToFindTips(beginPosition); + fixFunctionNameList(); + ifHasBeenWriten = 1; + } + } + } + + protected void fixFunctionNameList() { + if (tipsList.getSelectedValue() != null) { + int signOfContinue = 1; + int indexOfFunction = 0; + for (int i = 0; i < functionTypeListModel.size(); i++) { + int signOfType = 0; + FunctionGroup functionType = (FunctionGroup) functionTypeListModel.getElementAt(i); + NameAndDescription[] nads = functionType.getDescriptions(); + if (signOfContinue == 1) { + functionNameModel.removeAllElements(); + String functionName = ((String) tipsList.getSelectedValue()); + for (int k = 0; k < nads.length; k++) { + functionNameModel.addElement(nads[k]); + if (functionName.equals(nads[k].getName()))//若相等,找出显示的函数的index,setSelectedIndex() + { + signOfType = 1; + signOfContinue = 0; + indexOfFunction = k; + } + } + + if (signOfType == 1) { + functionTypeList.setSelectedIndex(i); + signOfType = 0; + } + } + } + functionNameList.setSelectedIndex(indexOfFunction); + functionNameList.ensureIndexIsVisible(indexOfFunction); + } + + } + + protected int getBeginPosition() { + int i = currentPosition; + String textArea = formulaTextArea.getText(); + for (; i > 0; i--) { + String tested = textArea.substring(i - 1, i).toUpperCase(); + char[] testedChar = tested.toCharArray(); + if (isChar(testedChar[0]) || isNum(testedChar[0])) { + continue; + } else { + break; + } + } + return i; + } + + protected void firstStepToFindTips(int theBeginPosition) { + String textArea = formulaTextArea.getText(); + + if (currentPosition > 0 && theBeginPosition < currentPosition) { + String next = textArea.substring(theBeginPosition, theBeginPosition + 1); + char[] nextChar = next.toCharArray(); + if (!isNum(nextChar[0])) { + String toFind = textArea.substring(theBeginPosition, currentPosition); + search(toFind, false); + formulaTextArea.requestFocusInWindow(); + } else { + listModel.removeAllElements(); + } + } else { + String toFind = textArea.substring(theBeginPosition, currentPosition); + search(toFind, false); + formulaTextArea.requestFocusInWindow(); + } + } + + private static boolean isNum(char tested) { + return tested >= '0' && tested <= '9'; + } + + private boolean isChar(char tested) { + return tested >= 'A' && tested <= 'Z'; + } + + @Override + public void keyTyped(KeyEvent e) { + } + + protected void search(String keyWord, boolean findDescription) { + listModel.removeAllElements(); + + keyWord = removeAllSpace(keyWord); + if (keyWord.length() != 0) { + NameAndDescription[] descriptions = FunctionConstants.ALL.getDescriptions(); + int lengthOfDes = descriptions.length; + for (int i = 0; i < lengthOfDes; i++) { + NameAndDescription and = descriptions[i]; + + String functionName = and.searchResult(keyWord, findDescription); + if (StringUtils.isNotBlank(functionName)) { + listModel.addElement(functionName); + } + } + + if (!listModel.isEmpty()) { + tipsList.setSelectedIndex(0); + refreshDescriptionTextArea((String) listModel.getElementAt(0)); + } + } + } + + private void refreshDescriptionTextArea(String line) { + NameAndDescription[] descriptions = FunctionConstants.ALL.getDescriptions(); + int length = descriptions.length; + for (int i = 0; i < length; i++) { + NameAndDescription function = descriptions[i]; + String functionName = function.getName(); + if (functionName.equals(line)) { + variableTreeAndDescriptionArea.descriptionTextArea.setText(function.getDesc()); + variableTreeAndDescriptionArea.descriptionTextArea.moveCaretPosition(0); + break; + } + } + } + + private String removeAllSpace(String toFind) { + + int index = toFind.indexOf(" "); + while (index != -1) { + toFind = toFind.substring(0, index) + toFind.substring(index + 1); + index = toFind.indexOf(" "); + } + return toFind; + } + + /** + * Apply text. + */ + public void applyText(String text) { + if (text == null || text.length() <= 0) { + return; + } + if (ifHasBeenWriten == 0) { + formulaTextArea.setForeground(Color.black); + formulaTextArea.setText(""); + ifHasBeenWriten = 1; + insertPosition = 0; + } + String textAll = formulaTextArea.getText(); + currentPosition = formulaTextArea.getCaretPosition(); + int insert = 0; + int current = 0; + if (insertPosition <= currentPosition) { + insert = insertPosition; + current = currentPosition; + } else { + insert = currentPosition; + current = insertPosition; + } + String beforeIndexOfInsertString = textAll.substring(0, insert); + String afterIndexofInsertString = textAll.substring(current); + formulaTextArea.setText(beforeIndexOfInsertString + text + afterIndexofInsertString); + formulaTextArea.getText(); + if (text.indexOf("()") != -1) { + formulaTextArea.setCaretPosition(insert + text.length() - 1); + } + formulaTextArea.requestFocus(); + insertPosition = formulaTextArea.getCaretPosition(); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FormulaD-Formula_Definition"); + } + + /** + * Populate + */ + public void populate(BaseFormula formula) { + this.populate(formula, VariableResolver.DEFAULT); + } + + public void populate(BaseFormula formula, VariableResolver variableResolver) { + this.variableTreeAndDescriptionArea.populate(variableResolver); + + // set text + if (formula != null) { + String content = formula.getContent(); + if (content.trim().equals("=")) { + this.formulaTextArea.setForeground(Color.gray); + //Tips:You_Can_Input_B1_To_Input_The_Data_Of_The_First_Row_Second_Column + this.formulaTextArea.setText("\n\n\n" + Inter.getLocText("FR-Designer_FormulaPane_Tips")); + this.formulaTextArea.setCaretPosition(0); + ifHasBeenWriten = 0; + this.listModel.removeAllElements(); + } else if (content.trim().charAt(0) == '=') { + this.formulaTextArea.setText(content.trim().substring(1)); + currentPosition = formulaTextArea.getCaretPosition(); + beginPosition = getBeginPosition(); + insertPosition = beginPosition; + firstStepToFindTips(beginPosition); + fixFunctionNameList(); + ifHasBeenWriten = 1; + } else { + this.formulaTextArea.setText(content); + currentPosition = formulaTextArea.getCaretPosition(); + beginPosition = getBeginPosition(); + insertPosition = beginPosition; + firstStepToFindTips(beginPosition); + fixFunctionNameList(); + ifHasBeenWriten = 1; + } + } + } + + /** + * update + */ + public BaseFormula update() { + BaseFormula formula; + if (ifHasBeenWriten == 0) { + formula = BaseFormula.createFormulaBuilder().build(); + return formula; + } else { + String content = this.formulaTextArea.getText(); + + if (StringUtils.isEmpty(content) || content.trim().charAt(0) == '=') { + formula = BaseFormula.createFormulaBuilder().build(content); + } else { + formula = BaseFormula.createFormulaBuilder().build("=" + content); + } + return formula; + } + } + + // check valid + protected ActionListener checkValidActionListener = new ActionListener() { + + public void actionPerformed(ActionEvent evt) { + // Execute Formula default cell element. + String formulaText = formulaTextArea.getText().trim(); + + if (formulaText != null && formulaText.length() > 0) { + StringReader in = new StringReader(formulaText); + + FRLexer lexer = new FRLexer(in); + FRParser parser = new FRParser(lexer); + + Expression expression = null; + try { + expression = parser.parse(); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + // alex:继续往下面走,expression为null时告知不合法公式 + } + + JOptionPane.showMessageDialog( + FormulaPane.this, + /* + * alex:仅仅只需要根据expression是否为null作合法性判断 + * 不需要eval + * TODO 但有个问题,有些函数的参数个数是有规定的,何以判别之 + */ + (expression != null ? Inter.getLocText("FormulaD-Valid_Formula") : Inter.getLocText("FormulaD-Invalid_Formula")) + ".", ProductConstants.PRODUCT_NAME, + JOptionPane.INFORMATION_MESSAGE); + } + } + }; + + public class VariableTreeAndDescriptionArea extends JPanel { + + private JTree variablesTree; + private UITextArea descriptionTextArea; + + public VariableTreeAndDescriptionArea() { + this.initComponents(); + } + + private void initFunctionTypeList(JPanel functionPane) { + functionTypeList = new QuickList(functionTypeListModel); + UIScrollPane functionTypeScrollPane = new UIScrollPane(functionTypeList); + functionTypeScrollPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); + functionTypeScrollPane.setPreferredSize(new Dimension(140, 200)); + functionPane.add(this.createNamePane(Inter.getLocText("FormulaD-Function_category") + ":", functionTypeScrollPane), BorderLayout.WEST); + initTypeListCellRenderer(); + initGroupTypeModel(); + initTypeListSelectionListener(); + } + + private void initTypeListCellRenderer() { + functionTypeList.setCellRenderer( + new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof FunctionGroup) { + this.setText(((FunctionGroup) value).getGroupName()); + } + return this; + } + }); + } + + private void initTypeListSelectionListener() { + functionTypeList.addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent evt) { + Object selectedValue = ((JList) evt.getSource()).getSelectedValue(); + if (!(selectedValue instanceof FunctionGroup)) { + return; + } + NameAndDescription[] nads = ((FunctionGroup) selectedValue).getDescriptions(); + functionNameModel = (DefaultListModel) functionNameList.getModel(); + functionNameModel.clear(); + for (NameAndDescription nad : nads) { + functionNameModel.addElement(nad); + } + if (functionNameModel.size() > 0) { + functionNameList.setSelectedIndex(0); + functionNameList.ensureIndexIsVisible(0); + } + } + }); + } + + private void initGroupTypeModel() { + functionTypeListModel.addElement(FunctionConstants.COMMON); + for (int i = 0; i < FunctionConstants.EMBFUNCTIONS.length; i++) { + functionTypeListModel.addElement(FunctionConstants.EMBFUNCTIONS[i]); + } + functionTypeListModel.addElement(FunctionConstants.ALL); + functionTypeListModel.addElement(FunctionConstants.CUSTOM); + functionTypeListModel.addElement(FunctionConstants.PLUGIN); + + //hugh: 从函数分组插件中添加分组 + FunctionConstants.addFunctionGroupFromPlugins(functionTypeListModel); + } + + private void initFunctionNameListCellRenderer() { + functionNameList.setCellRenderer(new DefaultListCellRenderer() { + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof NameAndDescription) { + this.setText(((NameAndDescription) value).getName()); + } + return this; + } + }); + } + + private void initFunctionNameListSelectionListener() { + functionNameList.addListSelectionListener(new ListSelectionListener() { + + public void valueChanged(ListSelectionEvent evt) { + Object selectedValue = functionNameList.getSelectedValue(); + if (!(selectedValue instanceof NameAndDescription)) { + return; + } + + String description = ((NameAndDescription) selectedValue).getDesc(); + descriptionTextArea.setText(description); + setTextAreaText(description); + descriptionTextArea.moveCaretPosition(0); + } + }); + } + + private void initFunctionNameListMouseListener() { + functionNameList.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent evt) { + if (evt.getClickCount() >= 2) { + Object selectedValue = functionNameList.getSelectedValue(); + if (!(selectedValue instanceof NameAndDescription)) { + return; + } + String insert = ((NameAndDescription) selectedValue).getName() + "()"; + applyText(insert); + + } + if (SwingUtilities.isRightMouseButton(evt)) { + JPopupMenu popupMenu = new JPopupMenu(); + LookDetailAction lookDetailAction = new LookDetailAction(); + popupMenu.add(lookDetailAction); + + // peter: 只有弹出菜单有子菜单的时候,才需要弹出来. + GUICoreUtils.showPopupMenu(popupMenu, functionNameList, evt.getX() - 1, evt.getY() - 1); + } + } + }); + } + + private void initFunctionNameList(JPanel functionPane) { + functionNameList = new JList(new DefaultListModel()); + UIScrollPane functionNameScrollPane = new UIScrollPane(functionNameList); + functionNameScrollPane.setPreferredSize(new Dimension(140, 200)); + functionPane.add( + this.createNamePane(Inter.getLocText("FormulaD-Function_name") + ":", functionNameScrollPane), + BorderLayout.CENTER); + functionNameScrollPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); + initFunctionNameListCellRenderer(); + initFunctionNameListSelectionListener(); + initFunctionNameListMouseListener(); + } + + private void initDescriptionTextArea() { + // Description + descriptionTextArea = new UITextArea(16, 27); + + UIScrollPane desScrollPane = new UIScrollPane(descriptionTextArea); + desScrollPane.setBorder(null); + this.add(this.createNamePane(Inter.getLocText("FR-Designer_FormulaPane_Formula_Description") + ":", desScrollPane), BorderLayout.EAST); + descriptionTextArea.setBackground(Color.white); + descriptionTextArea.setLineWrap(true); + descriptionTextArea.setWrapStyleWord(true); + descriptionTextArea.setEditable(false); + descriptionTextArea.addMouseListener(new MouseAdapter() { + + public void mouseClicked(MouseEvent evt) { + if (evt.getClickCount() >= 2) { + showPopupPane(); + } + } + }); + + } + + private StringBuilder getText(TextUserObject selectedValue, String path) throws IOException { + Reader desReader; + StringBuilder desBuf = new StringBuilder(); + InputStream desInputStream = BaseUtils.readResource(path + ((TextUserObject) selectedValue).displayText + ".txt"); + if (desInputStream == null) { + String description = ""; + desReader = new StringReader(description); + } else { + desReader = new InputStreamReader(desInputStream, EncodeConstants.ENCODING_UTF_8); + } + BufferedReader reader = new BufferedReader(desReader); + String lineText; + while ((lineText = reader.readLine()) != null) { + if (desBuf.length() > 0) { + desBuf.append('\n'); + } + desBuf.append(lineText); + } + reader.close(); + desReader.close(); + return desBuf; + } + + private void initVariablesTreeSelectionListener() { + variablesTree.addTreeSelectionListener(new TreeSelectionListener() { + public void valueChanged(TreeSelectionEvent e) { + Object selectedValue = ((DefaultMutableTreeNode) variablesTree.getLastSelectedPathComponent()).getUserObject(); + if (selectedValue == null) { + return; + } + StringBuilder desBuf = new StringBuilder(); + try { + String path; + Locale locale = FRContext.getLocale(); + if (locale.equals(Locale.CHINA)) { + path = "/com/fr/design/insert/formula/variable/cn/"; + } else { + path = "/com/fr/design/insert/formula/variable/en/"; + } + if (selectedValue instanceof TextUserObject) { + desBuf = getText((TextUserObject) selectedValue, path); + } + } catch (IOException exp) { + FRContext.getLogger().error(exp.getMessage(), exp); + } + descriptionTextArea.setText(desBuf.toString()); + descriptionTextArea.moveCaretPosition(0); + } + }); + } + + private void initVariablesTree() { + // vairable. + variablesTree = new JTree(); + UIScrollPane variablesTreePane = new UIScrollPane(variablesTree); + variablesTreePane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC)); + this.add(this.createNamePane( + Inter.getLocText("FR-Designer_FormulaPane_Variables") + ":", variablesTreePane), BorderLayout.CENTER); + variablesTree.setRootVisible(false); + variablesTree.setShowsRootHandles(true); + variablesTree.addMouseListener(applyTextMouseListener); + variablesTree.setCellRenderer(applyTreeCellRenderer); + + initDescriptionTextArea(); + + initVariablesTreeSelectionListener(); + } + + private void initComponents() { + this.setLayout(new BorderLayout(4, 4)); + // Function + JPanel functionPane = new JPanel(new BorderLayout(4, 4)); + this.add(functionPane, BorderLayout.WEST); + initFunctionTypeList(functionPane); + initFunctionNameList(functionPane); + initVariablesTree(); + // 选择: + functionTypeList.setSelectedIndex(0); + } + + /* + * 查看函数的详细信息 + */ + private class LookDetailAction extends UpdateAction { + + public LookDetailAction() { + this.setName(Inter.getLocText("FR-Designer_FormulaPane_Function_Detail")); + this.setMnemonic('L'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/preview.png")); + } + + // 弹出的窗口中显示函数的用法明细 + public void actionPerformed(ActionEvent evt) { + showPopupPane(); + } + } + + private void showPopupPane() { + BasicPane basicPane = new BasicPane() { + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer_FormulaPane_Function_Detail"); + } + }; + basicPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + UITextArea desArea = new UITextArea(); +// desArea。setEnabled(false); + desArea.setText(this.getTextAreaText()); + basicPane.add(new UIScrollPane(desArea), BorderLayout.CENTER); + BasicDialog dialog = basicPane.showWindow(DesignerContext.getDesignerFrame()); + dialog.setVisible(true); + } + + private String getTextAreaText() { + return this.descriptionTextArea.getText(); + } + + private void setTextAreaText(String text) { + this.descriptionTextArea.setText(text); + } + + private JPanel createNamePane(String name, JComponent comp) { + JPanel namePane = new JPanel(new BorderLayout(4, 4)); + namePane.add(new UILabel(name), BorderLayout.NORTH); + namePane.add(comp, BorderLayout.CENTER); + return namePane; + } + + private MouseListener applyTextMouseListener = new MouseAdapter() { + + public void mouseClicked(MouseEvent evt) { + if (evt.getClickCount() >= 2) { + Object source = evt.getSource(); + + if (source instanceof JTree) { + JTree tree = (JTree) source; + TreePath selectedTreePah = tree.getSelectionPath(); + if (selectedTreePah != null) { + DefaultMutableTreeNode selectedTreeNode = (DefaultMutableTreeNode) selectedTreePah.getLastPathComponent(); + Object userObject = selectedTreeNode.getUserObject(); + if (userObject != null && userObject instanceof TextUserObject) { + + applyText(((TextUserObject) userObject).getText()); + } + } + } + } + } + }; + private DefaultTreeCellRenderer applyTreeCellRenderer = new DefaultTreeCellRenderer() { + + public Component getTreeCellRendererComponent(JTree tree, + Object value, boolean selected, boolean expanded, + boolean leaf, int row, boolean hasFocus) { + super.getTreeCellRendererComponent(tree, value, selected, + expanded, leaf, row, hasFocus); + + DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value; + Object userObj = treeNode.getUserObject(); + + if (userObj instanceof TextUserObject) { + this.setIcon(null); + this.setText(((TextUserObject) userObj).getDisplayText()); + } else if (userObj instanceof TextFolderUserObject) { + TextFolderUserObject textUserObject = (TextFolderUserObject) userObj; + if (leaf) { + this.setText(textUserObject.getText()); + } else { + this.setText(textUserObject.getText() + " - [" + + treeNode.getChildCount() + "]"); + } + + this.setIcon(textUserObject.getIcon()); + } + + return this; + } + }; + + public void populate(VariableResolver variableResolver) { + // varibale tree. + DefaultTreeModel variableModel = (DefaultTreeModel) variablesTree.getModel(); + + DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) variableModel.getRoot(); + rootNode.removeAllChildren(); + + if (variableResolver.isBindCell()) { + // 加上当前值"$$$" + DefaultMutableTreeNode bindCellNode = new DefaultMutableTreeNode(new TextUserObject("$$$")); + rootNode.add(bindCellNode); + } + + rootNode.add(new TextFolderUserObject(Inter.getLocText("FormulaD-Data_Fields"), + BaseUtils.readIcon("/com/fr/design/images/dialog/table.png"), + variableResolver.resolveColumnNames()).createMutableTreeNode()); + + // Set cutReport Variable + rootNode.add(new TextFolderUserObject(Inter.getLocText("FR-Designer_FormulaPane_Variables"), + BaseUtils.readIcon("/com/fr/design/images/dialog/variable.png"), + variableResolver.resolveCurReportVariables()).createMutableTreeNode()); + + rootNode.add(new TextFolderUserObject(Inter.getLocText(new String[]{"Datasource-Datasource", "Parameter"}), + BaseUtils.readIcon("/com/fr/design/images/dialog/parameter.gif"), + variableResolver.resolveTableDataParameterVariables()).createMutableTreeNode()); + + rootNode.add(new TextFolderUserObject(Inter.getLocText("ParameterD-Report_Parameter"), + BaseUtils.readIcon("/com/fr/design/images/m_report/p.gif"), + variableResolver.resolveReportParameterVariables()).createMutableTreeNode()); + + rootNode.add(new TextFolderUserObject(Inter.getLocText("M_Server-Global_Parameters"), + BaseUtils.readIcon("/com/fr/design/images/dialog/parameter.gif"), + variableResolver.resolveGlobalParameterVariables()).createMutableTreeNode()); + + variableModel.reload(); + // Expand + for (int row = 0; row < this.variablesTree.getRowCount(); row++) { + this.variablesTree.expandRow(row); + } + } + } + + public static class TextFolderUserObject { + + private String text; + private Icon icon; + private String[] subNodes = new String[0]; + + public TextFolderUserObject(String text, Icon icon, String[] subNodes) { + this.text = text; + this.icon = icon; + this.subNodes = subNodes; + } + + public String getText() { + return this.text; + } + + public Icon getIcon() { + return this.icon; + } + + MutableTreeNode createMutableTreeNode() { + DefaultMutableTreeNode variableTreeNode = new DefaultMutableTreeNode(this); + + for (String subNode : subNodes) { + variableTreeNode.add(new DefaultMutableTreeNode(new TextUserObject(subNode))); + } + + return variableTreeNode; + } + } + + public static class TextUserObject { + + public TextUserObject(String text) { + this(text, text); + } + + public TextUserObject(String text, String displayText) { + this.text = text; + this.displayText = displayText; + } + + public String getText() { + return this.text; + } + + public String getDisplayText() { + return this.displayText; + } + + private String text; + private String displayText; + } + + public static void main(String[] args) { + FunctionGroup group = FunctionConstants.ALL; + NameAndDescription[] nameAndDescriptions = group.getDescriptions(); + StringBuffer buffer = new StringBuffer(); + for (NameAndDescription d : nameAndDescriptions) { + String name = d.getName(); + buffer.append("\""); + buffer.append(name.toUpperCase()); + buffer.append("\""); + buffer.append("|"); + buffer.append("\n"); + buffer.append("\""); + buffer.append(name.toLowerCase()); + buffer.append("\""); + buffer.append("|"); + buffer.append("\n"); + } + FRContext.getLogger().debug(buffer.toString()); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/formula/FormulaPaneWhenReserveFormula.java b/designer-base/src/com/fr/design/formula/FormulaPaneWhenReserveFormula.java similarity index 100% rename from designer_base/src/com/fr/design/formula/FormulaPaneWhenReserveFormula.java rename to designer-base/src/com/fr/design/formula/FormulaPaneWhenReserveFormula.java diff --git a/designer-base/src/com/fr/design/formula/FunctionConstants.java b/designer-base/src/com/fr/design/formula/FunctionConstants.java new file mode 100644 index 0000000000..0384debe41 --- /dev/null +++ b/designer-base/src/com/fr/design/formula/FunctionConstants.java @@ -0,0 +1,264 @@ +package com.fr.design.formula; + +import com.fr.base.FRContext; +import com.fr.file.FunctionConfig; +import com.fr.function.AVERAGE; +import com.fr.function.CHAR; +import com.fr.function.COUNT; +import com.fr.function.DATE; +import com.fr.function.MAX; +import com.fr.function.MIN; +import com.fr.function.RANGE; +import com.fr.function.SUM; +import com.fr.function.TIME; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.plugin.ExtraClassManager; +import com.fr.stable.EncodeConstants; +import com.fr.stable.OperatingSystem; +import com.fr.stable.StableUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.fun.FunctionDefContainer; +import com.fr.stable.fun.mark.Mutable; +import com.fr.stable.script.Function; +import com.fr.stable.script.FunctionDef; + +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.net.URLDecoder; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import javax.swing.DefaultListModel; + +public abstract class FunctionConstants { + + /** + * 将函数分组插件中的函数添加到对应的列表中 + * @param listModel + */ + public static void addFunctionGroupFromPlugins(DefaultListModel listModel){ + //hugh:自定义函数分组 + Set containers = ExtraClassManager.getInstance().getArray(FunctionDefContainer.MARK_STRING); + if(!containers.isEmpty()){ + for(Mutable container : containers){ + listModel.addElement(createFunctionGroup((FunctionDefContainer)container)); + } + } + } + + /** + * 创建一个新的分组 + * @param container + * @return + */ + private static FunctionGroup createFunctionGroup(final FunctionDefContainer container){ + return new FunctionGroup() { + @Override + public String getGroupName() { + return container.getGroupName(); + } + + @Override + public NameAndDescription[] getDescriptions() { + FunctionDef[] fs = container.getFunctionDefs(); + int count = fs.length; + FunctionDefNAD[] nads = new FunctionDefNAD[count]; + for (int i = 0; i < count; i ++) { + nads[i] = new FunctionDefNAD(fs[i]); + } + return nads; + } + }; + } + + public static FunctionGroup PLUGIN = new FunctionGroup() { + @Override + public String getGroupName() { + return Inter.getLocText("FR-Base_Formula_Plugin"); + } + + @Override + public NameAndDescription[] getDescriptions() { + FunctionDef[] fs = ExtraClassManager.getInstance().getFunctionDef(); + int count = fs.length; + FunctionDefNAD[] nads = new FunctionDefNAD[count]; + for (int i = 0; i < count; i ++) { + nads[i] = new FunctionDefNAD(fs[i]); + } + return nads; + } + }; + + public static FunctionGroup CUSTOM = new FunctionGroup() { + @Override + public String getGroupName() { + return Inter.getLocText("FormulaD-Custom_Function"); + } + + @Override + public NameAndDescription[] getDescriptions() { + FunctionConfig funtionManager = FunctionConfig.getInstance(); + if (funtionManager != null) { + int functionDefCount = funtionManager.getFunctionDefCount(); + + FunctionDefNAD[] nads = new FunctionDefNAD[functionDefCount]; + for (int i = 0; i < functionDefCount; i++) { + nads[i] = new FunctionDefNAD(funtionManager.getFunctionDef(i)); + } + + return nads; + } + + return new NameAndDescription[0]; + } + }; + + public static NameAndFunctionList COMMON = new NameAndFunctionList(Inter.getLocText("FormulaD-Most_Recently_Used"), new Function[] { + new SUM(), new COUNT(), new AVERAGE(), new CHAR(), new DATE(), new MAX(), new MIN(), new TIME(), new RANGE() + }); + + public static NameAndTypeAndFunctionList[] EMBFUNCTIONS = new NameAndTypeAndFunctionList[] { + new NameAndTypeAndFunctionList(Inter.getLocText("FormulaD-Math_&_Trig"), Function.MATH), + new NameAndTypeAndFunctionList(Inter.getLocText("FR-Designer_FormulaD-Text"), Function.TEXT), + new NameAndTypeAndFunctionList(Inter.getLocText("FormulaD-Date_&_Time"), Function.DATETIME), + new NameAndTypeAndFunctionList(Inter.getLocText("FR-Designer_FormulaD-Logical"), Function.LOGIC), + new NameAndTypeAndFunctionList(Inter.getLocText("FR-Designer_FormulaD-Array"), Function.ARRAY), + new NameAndTypeAndFunctionList(Inter.getLocText("FR-Designer_FormulaD-Report"), Function.REPORT), + new NameAndTypeAndFunctionList(Inter.getLocText("FR-Designer_FormulaD-Other"), Function.OTHER), + new NameAndTypeAndFunctionList(Inter.getLocText(new String[]{"Level_coordinates", "FormulaD-Functions"}), Function.HA) + }; + + public static FunctionGroup ALL = new FunctionGroup() { + @Override + public String getGroupName() { + return Inter.getLocText("FR-Designer_FormulaD-All"); + } + + @Override + public NameAndDescription[] getDescriptions() { + List all = new ArrayList(); + for (int i = 0; i < EMBFUNCTIONS.length; i++) { + all.addAll(Arrays.asList(EMBFUNCTIONS[i].getDescriptions())); + } + Collections.addAll(all, PLUGIN.getDescriptions()); + Collections.addAll(all, CUSTOM.getDescriptions()); + //hugh:自定义函数分组 + Set containers = ExtraClassManager.getInstance().getArray(FunctionDefContainer.MARK_STRING); + if(!containers.isEmpty()){ + for(Mutable container : containers){ + Collections.addAll(all,createFunctionGroup(((FunctionDefContainer)container)).getDescriptions()); + } + } + java.util.Collections.sort(all, NameAndDescriptionComparator); + + return all.toArray(new NameAndDescription[all.size()]); + } + }; + + + + private static Comparator NameAndDescriptionComparator = new Comparator() { + @Override + public int compare(NameAndDescription o1, NameAndDescription o2) { + return ComparatorUtils.compare(o1.getName(), o2.getName()); + } + }; + + private static String[] findClassNamesUnderFilePath(String filePath) { + java.util.List classNameList = new ArrayList(); + /* + * alex:如果是jar包中的class文件 + * file:/D:/opt/FineReport6.5/WebReport/WEB-INF/lib/fr-server-6.5.jar!/com/fr/rpt/script/function + */ + if (filePath.indexOf("!/") >= 0) { + String[] arr = filePath.split("!/"); + String jarPath = arr[0].substring(6); // alex:substring(6)去掉前面的file:/这六个字符 + String classPath = arr[1]; + if(classPath.endsWith("/")){ + classPath = classPath.substring(0, classPath.length() - 1); + } + if (!OperatingSystem.isWindows()){ + //windows里substring后是d:\123\456, mac下substring后是Application/123/456 + jarPath = StringUtils.perfectStart(jarPath, "/"); + } + + ZipFile zip; + try { + zip = new ZipFile(jarPath); + Enumeration entries = zip.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = (ZipEntry) entries.nextElement(); + if (entry.isDirectory()) { + continue; + } + + String entryName = entry.getName(); + if (entryName.indexOf(classPath) < 0 || !entryName.endsWith(".class")) { + continue; + } + + classNameList.add(entryName.substring(classPath.length() + 1)); + } + } catch (IOException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + } else { + File dir = new File(filePath); + + for (File f : dir.listFiles()) { + String fileName = f.getName(); + if (fileName.endsWith(".class")) { + classNameList.add(fileName); + } + } + } + + return classNameList.toArray(new String[classNameList.size()]); + } + + // alex:读取com.fr.script.function包下面所有的Function类 + static { + String pkgName = "com.fr.function"; + Class iface = Function.class; + ClassLoader classloader = iface.getClassLoader(); + URL url = classloader.getResource(pkgName.replace('.', '/')); + String classFilePath = url.getFile(); + + /* + * alex:url.getFile获取的地址中,如果有空格或中文会被URLEncoder.encode处理 + * 会变成%20这种%打头的东西,但是new File的时候%20是无法解析成空格,所以在此需要做URLDecoder.decode处理 + */ + try { + classFilePath = URLDecoder.decode(classFilePath, EncodeConstants.ENCODING_UTF_8); + } catch (UnsupportedEncodingException e1) { + FRContext.getLogger().error(e1.getMessage(), e1); + } + FRContext.getLogger().info("ClassFilePath:" + classFilePath); + /* + * alex:如果是jar包中的class文件 + * file:/D:/opt/FineReport6.5/WebReport/WEB-INF/lib/fr-server-6.5.jar!/com/fr/rpt/script/function + */ + for (String fileName : findClassNamesUnderFilePath(classFilePath)) { + try { + Class cls = Class.forName(pkgName + "." + fileName.substring(0, fileName.length() - 6)); + if (StableUtils.classInstanceOf(cls, iface)) { + Function inst; + inst = (Function)cls.newInstance(); + for (int fi = 0; fi < EMBFUNCTIONS.length; fi++) { + if (EMBFUNCTIONS[fi].test(inst)) { + break; + } + } + + } + } catch (ClassNotFoundException e) { + } catch (InstantiationException e) { + } catch (IllegalAccessException e) { + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/formula/FunctionDefNAD.java b/designer-base/src/com/fr/design/formula/FunctionDefNAD.java new file mode 100644 index 0000000000..0aa0653b98 --- /dev/null +++ b/designer-base/src/com/fr/design/formula/FunctionDefNAD.java @@ -0,0 +1,22 @@ +package com.fr.design.formula; + +import com.fr.stable.script.FunctionDef; +import com.fr.stable.StringUtils; + +public class FunctionDefNAD extends AbstractNameAndDescription { + private FunctionDef def; + + public FunctionDefNAD(FunctionDef def) { + this.def = def; + } + + @Override + public String getName() { + return def == null ? StringUtils.EMPTY : def.getName(); + } + + @Override + public String getDesc() { + return def == null ? StringUtils.EMPTY : def.getDescription(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/formula/FunctionGroup.java b/designer-base/src/com/fr/design/formula/FunctionGroup.java new file mode 100644 index 0000000000..573d2b68dc --- /dev/null +++ b/designer-base/src/com/fr/design/formula/FunctionGroup.java @@ -0,0 +1,7 @@ +package com.fr.design.formula; + + +public interface FunctionGroup { + String getGroupName(); + NameAndDescription[] getDescriptions(); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/formula/FunctionManagerPane.java b/designer-base/src/com/fr/design/formula/FunctionManagerPane.java new file mode 100644 index 0000000000..3557591901 --- /dev/null +++ b/designer-base/src/com/fr/design/formula/FunctionManagerPane.java @@ -0,0 +1,226 @@ +package com.fr.design.formula; + +import com.fr.base.FRContext; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.data.tabledata.tabledatapane.ClassNameSelectPane; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.BasicPane; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.gui.controlpane.JListControlPane; +import com.fr.design.gui.controlpane.NameObjectCreator; +import com.fr.design.gui.controlpane.NameableCreator; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextarea.DescriptionTextArea; +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.file.FunctionConfig; +import com.fr.general.Inter; +import com.fr.general.NameObject; +import com.fr.stable.Nameable; +import com.fr.stable.project.ProjectConstants; +import com.fr.stable.script.FunctionDef; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class FunctionManagerPane extends BasicPane { + + private UITextField functionTextField; + private FunctionControlPane functionControlPane; + + public FunctionManagerPane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + //path pane + JPanel datasourcePathPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + this.add(datasourcePathPane, BorderLayout.NORTH); + + + datasourcePathPane.add(new UILabel(Inter.getLocText( + "Function-Function_File") + ":"), BorderLayout.WEST); + this.functionTextField = new UITextField(); + datasourcePathPane.add(this.functionTextField, BorderLayout.CENTER); + this.functionTextField.setEditable(false); + + functionControlPane = new FunctionControlPane(); + this.add(functionControlPane, BorderLayout.CENTER); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("Function-Function_Manager"); + } + + /** + * Populate. + */ + public void populate(FunctionConfig functionManager) { + //todo 原来界面上显示的xml路径 +// this.functionTextField.setText(FRContext.getCurrentEnv().getPath() + File.separator +// + ProjectConstants.RESOURCES_NAME +// + File.separator + functionManager.fileName()); + + List nameObjectList = new ArrayList(); + for (int i = 0; i < functionManager.getFunctionDefCount(); i++) { + String name = functionManager.getFunctionDef(i).getName(); + nameObjectList.add(new NameObject(name, functionManager.getFunctionDef(i))); + } + functionControlPane.populate(nameObjectList.toArray(new NameObject[nameObjectList.size()])); + + } + + /** + * Update. + */ + public void update(FunctionConfig functionManager) { + // Nameable[]居然不能强转成NameObject[],一定要这么写... + Nameable[] res = this.functionControlPane.update(); + NameObject[] res_array = new NameObject[res.length]; + java.util.Arrays.asList(res).toArray(res_array); + + functionManager.clearAllFunctionDef(); + + for (int i = 0; i < res_array.length; i++) { + FunctionDef fd = (FunctionDef) res_array[i].getObject(); + fd.setName(res_array[i].getName()); + functionManager.addFunctionDef(fd); + } + } + + /** + * CellRenderer. + */ + class FunctionControlPane extends JListControlPane { + + public FunctionControlPane() { + super(); + } + + @Override + public NameableCreator[] createNameableCreators() { + NameableCreator funcDef = new NameObjectCreator(Inter.getLocText("FR-Designer_Function"), FunctionDef.class, + FunctionContentPane.class); + return new NameableCreator[]{funcDef}; + } + + @Override + protected String title4PopupWindow() { + return FunctionManagerPane.this.title4PopupWindow(); + } + } + + public static class FunctionContentPane extends BasicBeanPane { + private FunctionDef editing; + + private UITextField classNameTextField; + private UITextArea descriptionTextArea; + + public FunctionContentPane() { + this.initComponents(); + } + + protected void initComponents() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0)); + JPanel northPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); + this.add(northPane, BorderLayout.NORTH); + JPanel reportletNamePane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + classNameTextField = new UITextField(25); + reportletNamePane.add(classNameTextField); + UIButton browserButton = new UIButton(Inter.getLocText("FR-Designer_Select")); + browserButton.setPreferredSize(new Dimension(browserButton.getPreferredSize().width, classNameTextField.getPreferredSize().height)); + reportletNamePane.add(browserButton); + browserButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + final ClassNameSelectPane bPane = new ClassNameSelectPane(); + bPane.setClassPath(classNameTextField.getText()); + bPane.showWindow( (Dialog) SwingUtilities.getWindowAncestor(FunctionContentPane.this), + new DialogActionAdapter() { + public void doOk() { + classNameTextField.setText(bPane.getClassPath()); + } + }).setVisible(true); + } + }); + UIButton editorButton = new UIButton(Inter.getLocText("FR-Designer_Edit")); + editorButton.setPreferredSize(new Dimension(editorButton.getPreferredSize().width, classNameTextField.getPreferredSize().height)); + reportletNamePane.add(editorButton); + editorButton.addActionListener(createEditorButtonActionListener()); + northPane.add(GUICoreUtils.createFlowPane(new Component[]{new UILabel(Inter.getLocText("DS-Class_Name") + ":"), + reportletNamePane}, FlowLayout.LEFT)); + DescriptionTextArea descriptionArea = new DescriptionTextArea(); + descriptionArea.setWrapStyleWord(true); + descriptionArea.setLineWrap(true); + northPane.add(descriptionArea); + + String path1 = getEscapePath(File.separator + ProjectConstants.WEBINF_NAME + File.separator + ProjectConstants.CLASSES_NAME); + String path2 = getEscapePath(FRContext.getCurrentEnv().getPath() + File.separator + ProjectConstants.CLASSES_NAME); + descriptionArea.setText(Inter.getLocText("FR-Designer_Function_Description_Area_Text", path1, path2)); + + JPanel descriptionPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); //Description Pane + this.add(descriptionPane, BorderLayout.SOUTH); + descriptionPane.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + descriptionPane.add(new UILabel(Inter.getLocText("FR-Designer_Description") + ":"), BorderLayout.NORTH); + this.descriptionTextArea = new UITextArea(6, 24); + descriptionPane.add(new JScrollPane(this.descriptionTextArea), BorderLayout.CENTER); + } + + private String getEscapePath(String path) { + return path.replace("\\", "\\\\"); + } + + private ActionListener createEditorButtonActionListener() { + return new ActionListener() { + public void actionPerformed(ActionEvent e) { + final JavaEditorPane javaEditorPane = new JavaEditorPane(classNameTextField.getText(), JavaEditorPane.DEFAULT_FUNCTION_STRING); + final BasicDialog dlg = javaEditorPane.showMediumWindow(SwingUtilities.getWindowAncestor(FunctionContentPane.this), + new DialogActionAdapter() { + public void doOk() { + classNameTextField.setText(javaEditorPane.getClassText()); + } + }); + javaEditorPane.addSaveActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dlg.doOK(); + } + }); + dlg.setVisible(true); + } + }; + } + + @Override + protected String title4PopupWindow() { + return "Function"; + } + + public String getReportletPath() { + return this.classNameTextField.getText(); + } + + @Override + public void populateBean(FunctionDef ob) { + editing = ob; + + this.classNameTextField.setText(ob.getClassName()); + this.descriptionTextArea.setText(ob.getDescription()); + } + + @Override + public FunctionDef updateBean() { + editing.setClassName(this.classNameTextField.getText()); + editing.setDescription(this.descriptionTextArea.getText()); + + return editing; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/formula/FunctionNAD.java b/designer-base/src/com/fr/design/formula/FunctionNAD.java new file mode 100644 index 0000000000..9a1fc9d4a5 --- /dev/null +++ b/designer-base/src/com/fr/design/formula/FunctionNAD.java @@ -0,0 +1,42 @@ +package com.fr.design.formula; + +import java.util.Locale; + +import com.fr.base.FRContext; +import com.fr.stable.StringUtils; +import com.fr.stable.script.Function; + +public class FunctionNAD extends AbstractNameAndDescription { + private Function fn; + + FunctionNAD(Function fn) { + this.fn = fn; + } + + public String getName() { + return fn == null ? StringUtils.EMPTY : fn.getClass().getSimpleName(); + } + + public String getDesc() { + if (fn == null) { + return StringUtils.EMPTY; + } else { + if (Locale.CHINA.equals(FRContext.getLocale())) { + return fn.getCN(); + } else { + return fn.getEN(); + } + } + } + + @Override + public String searchResult(String keyWord, boolean findDescription) { + String functionName = getName(); + String des = getDesc(); + if (findDescription && des.contains(keyWord)) { + return functionName; + } else { + return super.searchResult(keyWord, findDescription); + } + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/formula/JavaEditorPane.java b/designer-base/src/com/fr/design/formula/JavaEditorPane.java similarity index 100% rename from designer_base/src/com/fr/design/formula/JavaEditorPane.java rename to designer-base/src/com/fr/design/formula/JavaEditorPane.java diff --git a/designer-base/src/com/fr/design/formula/NameAndDescription.java b/designer-base/src/com/fr/design/formula/NameAndDescription.java new file mode 100644 index 0000000000..849b756d9a --- /dev/null +++ b/designer-base/src/com/fr/design/formula/NameAndDescription.java @@ -0,0 +1,10 @@ +package com.fr.design.formula; + +public interface NameAndDescription { + + String getName(); + + String getDesc(); + + String searchResult(String keyWord, boolean findDescription); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/formula/NameAndFunctionList.java b/designer-base/src/com/fr/design/formula/NameAndFunctionList.java new file mode 100644 index 0000000000..1f3fd0cc58 --- /dev/null +++ b/designer-base/src/com/fr/design/formula/NameAndFunctionList.java @@ -0,0 +1,31 @@ +package com.fr.design.formula; + +import java.util.ArrayList; +import java.util.Arrays; + +import com.fr.stable.script.Function; + +public class NameAndFunctionList implements FunctionGroup { + protected String name; + protected java.util.List fnList = new ArrayList(); + + public NameAndFunctionList(String name, Function[] fns) { + this.name = name; + fnList.addAll(Arrays.asList(fns)); + } + + @Override + public String getGroupName() { + return this.name; + } + + @Override + public NameAndDescription[] getDescriptions() { + NameAndDescription[] nads = new NameAndDescription[fnList.size()]; + for (int i = 0; i < nads.length; i++) { + nads[i] = new FunctionNAD(fnList.get(i)); + } + + return nads; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/formula/NameAndTypeAndFunctionList.java b/designer-base/src/com/fr/design/formula/NameAndTypeAndFunctionList.java new file mode 100644 index 0000000000..6f59a3547f --- /dev/null +++ b/designer-base/src/com/fr/design/formula/NameAndTypeAndFunctionList.java @@ -0,0 +1,21 @@ +package com.fr.design.formula; + +import com.fr.stable.script.Function; + +public class NameAndTypeAndFunctionList extends NameAndFunctionList { + private Function.Type type; + + public NameAndTypeAndFunctionList(String name, Function.Type type) { + super(name, new Function[0]); + + this.type = type; + } + + public boolean test(Function fn) { + if (fn != null && fn.getType() == this.type) { + return fnList.add(fn); + } + + return false; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/formula/SortFormulaPane.java b/designer-base/src/com/fr/design/formula/SortFormulaPane.java new file mode 100644 index 0000000000..0947236877 --- /dev/null +++ b/designer-base/src/com/fr/design/formula/SortFormulaPane.java @@ -0,0 +1,83 @@ +package com.fr.design.formula; + + +import com.fr.base.BaseFormula; +import com.fr.data.util.SortOrder; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icombobox.SortOrderComboBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public abstract class SortFormulaPane extends JPanel { + protected static final String InsetText = " "; + + protected SortOrderComboBox sortOrderComboBox; + protected UITextField sortFormulaTextField; + // 屏蔽掉“自定义比较规则”和“选择”按钮,只显示公式输入文本和公式按钮 + protected UIButton sortFormulaTextFieldButton; + + public SortFormulaPane() { + this.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); + sortOrderComboBox = new SortOrderComboBox(); + sortOrderComboBox.setSortOrder(new SortOrder(SortOrder.ORIGINAL)); + sortOrderComboBox.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent evt) { + checkSortButtonEnabled(); + } + }); + + sortFormulaTextField = new UITextField(16); + //Lance:添加一公式编辑器按钮 + sortFormulaTextFieldButton = new UIButton("..."); + sortFormulaTextFieldButton.setToolTipText(Inter.getLocText("Formula") + "..."); + sortFormulaTextFieldButton.setPreferredSize(new Dimension(25, sortFormulaTextFieldButton.getPreferredSize().height)); + sortFormulaTextFieldButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + formulaAction(); + } + }); + + this.add(GUICoreUtils.createFlowPane(new JComponent[]{new UILabel(InsetText), //new UILabel(Inter.getLocText("Select_sort_order") + ":"), + sortOrderComboBox, new UILabel(InsetText), + new UILabel(Inter.getLocText("Formula") + ":="), sortFormulaTextField, //selectButton, + sortFormulaTextFieldButton}, FlowLayout.LEFT)); + } + + public abstract void formulaAction(); + + public void showFormulaDialog(String[] displayNames) { + String text = sortFormulaTextField.getText(); + final UIFormula formulaPane = FormulaFactory.createFormulaPaneWhenReserveFormula(); + formulaPane.populate(BaseFormula.createFormulaBuilder().build(text), new CustomVariableResolver(displayNames, true)); + formulaPane.showLargeWindow(SwingUtilities.getWindowAncestor(SortFormulaPane.this), + new DialogActionAdapter() { + public void doOk() { + BaseFormula fm = formulaPane.update(); + if (fm.getContent().length() <= 1) { + sortFormulaTextField.setText(""); + } else { + sortFormulaTextField.setText(fm.getContent().substring(1)); + } + } + }).setVisible(true); + } + + private void checkSortButtonEnabled() { + if (this.sortOrderComboBox.getSortOrder().getOrder() == SortOrder.ORIGINAL) { + sortFormulaTextField.setEnabled(false); + sortFormulaTextFieldButton.setEnabled(false); + } else { + sortFormulaTextField.setEnabled(true); + sortFormulaTextFieldButton.setEnabled(true); + } + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/formula/TinyFormulaPane.java b/designer-base/src/com/fr/design/formula/TinyFormulaPane.java similarity index 100% rename from designer_base/src/com/fr/design/formula/TinyFormulaPane.java rename to designer-base/src/com/fr/design/formula/TinyFormulaPane.java diff --git a/designer_base/src/com/fr/design/formula/UIFormula.java b/designer-base/src/com/fr/design/formula/UIFormula.java similarity index 100% rename from designer_base/src/com/fr/design/formula/UIFormula.java rename to designer-base/src/com/fr/design/formula/UIFormula.java diff --git a/designer-base/src/com/fr/design/formula/VariableResolver.java b/designer-base/src/com/fr/design/formula/VariableResolver.java new file mode 100644 index 0000000000..76ca8666ae --- /dev/null +++ b/designer-base/src/com/fr/design/formula/VariableResolver.java @@ -0,0 +1,30 @@ +package com.fr.design.formula; + + +public interface VariableResolver { + + String[] resolveColumnNames(); + + boolean isBindCell(); + + String[] resolveCurReportVariables(); + + String[] resolveTableDataParameterVariables(); + + String[] resolveReportParameterVariables(); + + String[] resolveGlobalParameterVariables(); + + VariableResolver DEFAULT = new VariableResolverAdapter() { + + @Override + public String[] resolveColumnNames() { + return new String[0]; + } + + @Override + public boolean isBindCell() { + return false; + } + }; +} \ 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 new file mode 100644 index 0000000000..e5d1545b7b --- /dev/null +++ b/designer-base/src/com/fr/design/formula/VariableResolverAdapter.java @@ -0,0 +1,105 @@ +package com.fr.design.formula; + +import com.fr.base.Parameter; +import com.fr.base.ParameterConfig; +import com.fr.design.DesignModelAdapter; +import com.fr.plugin.ExtraClassManager; +import com.fr.script.ScriptConstants; +import com.fr.stable.ArrayUtils; +import com.fr.stable.Constants; +import com.fr.stable.fun.BuiltInParametersProvider; +import com.fr.stable.script.CalculatorProvider; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public abstract class VariableResolverAdapter implements VariableResolver { + private static final int TABLE_DATA_PARA = 0; + private static final int REPORT_DATA_PARA = 1; + + /** + * 获取模板内置的一些参数 + * + * @return 内置参数 + */ + public String[] resolveCurReportVariables() { + String [] variables = new String[] { ScriptConstants.SUMMARY_TAG + "page_number", + ScriptConstants.SUMMARY_TAG + "totalPage_number", + // 下面是权限相关的参数 + ScriptConstants.DETAIL_TAG + Constants.P.PRIVILEGE_USERNAME, ScriptConstants.DETAIL_TAG + Constants.P.PRIVILEGE_AUTHORITY, + ScriptConstants.DETAIL_TAG + Constants.P.PRIVILEGE_DEPARTMETN_AND_POST, + // 空值参数 + "NULL", "NOFILTER", + // request变量 + 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 + }; + Set set = ExtraClassManager.getInstance().getArray(BuiltInParametersProvider.XML_TAG); + for (BuiltInParametersProvider provider : set) { + return (String[]) ArrayUtils.addAll(variables, new String []{ + ScriptConstants.DETAIL_TAG + provider.getParametersName() + }); + } + return variables; + } + + private Parameter[] getCurrentModeParameters(int type) { + Parameter[] parameters = null; + if(DesignModelAdapter.getCurrentModelAdapter() == null) { + parameters = new Parameter[0]; + } else { + if(type == TABLE_DATA_PARA) { + parameters = DesignModelAdapter.getCurrentModelAdapter().getTableDataParameters(); + } else if(type == REPORT_DATA_PARA){ + parameters = DesignModelAdapter.getCurrentModelAdapter().getReportParameters(); + } + } + return parameters; + } + + /** + * 获取数据集参数 + * + * @return 所有参数 + */ + public String[] resolveTableDataParameterVariables() { + Parameter[] parameters = getCurrentModeParameters(TABLE_DATA_PARA); + String[] parameterNames = new String[parameters.length]; + for (int i = 0; i < parameters.length; i++) { + parameterNames[i] = ScriptConstants.DETAIL_TAG + parameters[i].getName(); + } + return parameterNames; + } + + /** + * 获取模板参数 + * + * @return 所有参数 + */ + public String[] resolveReportParameterVariables() { + Parameter[] parameters = getCurrentModeParameters(REPORT_DATA_PARA); + String[] parameterNames = new String[parameters.length]; + for (int i = 0; i < parameters.length; i++) { + parameterNames[i] = ScriptConstants.DETAIL_TAG + parameters[i].getName(); + } + return parameterNames; + } + + /** + * 获取全局参数 + * + * @return 所有参数 + */ + public String[] resolveGlobalParameterVariables() { + // 加上全局的参数 + Parameter[] globalParameters = ParameterConfig.getInstance().getGlobalParameters(); + + List variablesList = new ArrayList(); + for (int i = 0; i < (globalParameters == null ? 0 : globalParameters.length); i++) { + variablesList.add(ScriptConstants.DETAIL_TAG + (globalParameters[i]).getName()); + } + + return variablesList.toArray(new String[variablesList.size()]); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/fun/BackgroundQuickUIProvider.java b/designer-base/src/com/fr/design/fun/BackgroundQuickUIProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/BackgroundQuickUIProvider.java rename to designer-base/src/com/fr/design/fun/BackgroundQuickUIProvider.java diff --git a/designer_base/src/com/fr/design/fun/BackgroundUIProvider.java b/designer-base/src/com/fr/design/fun/BackgroundUIProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/BackgroundUIProvider.java rename to designer-base/src/com/fr/design/fun/BackgroundUIProvider.java diff --git a/designer-base/src/com/fr/design/fun/CellAttributeProvider.java b/designer-base/src/com/fr/design/fun/CellAttributeProvider.java new file mode 100644 index 0000000000..227333cd08 --- /dev/null +++ b/designer-base/src/com/fr/design/fun/CellAttributeProvider.java @@ -0,0 +1,20 @@ +package com.fr.design.fun; + +import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; +import com.fr.stable.fun.mark.Immutable; + +/** + * Created by zhouping on 2015/11/11. + */ +public interface CellAttributeProvider extends Immutable{ + String MARK_STRING = "CellAttributeProvider"; + + int CURRENT_LEVEL = 1; + + + /** + * 构造单元格属性面板 + * @return 面板类 + */ + AbstractAttrNoScrollPane createCellAttributePane(); +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/fun/CellWidgetOptionProvider.java b/designer-base/src/com/fr/design/fun/CellWidgetOptionProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/CellWidgetOptionProvider.java rename to designer-base/src/com/fr/design/fun/CellWidgetOptionProvider.java diff --git a/designer_base/src/com/fr/design/fun/ConnectionProvider.java b/designer-base/src/com/fr/design/fun/ConnectionProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/ConnectionProvider.java rename to designer-base/src/com/fr/design/fun/ConnectionProvider.java diff --git a/designer_base/src/com/fr/design/fun/DBTableDataMenuHandler.java b/designer-base/src/com/fr/design/fun/DBTableDataMenuHandler.java similarity index 100% rename from designer_base/src/com/fr/design/fun/DBTableDataMenuHandler.java rename to designer-base/src/com/fr/design/fun/DBTableDataMenuHandler.java diff --git a/designer_base/src/com/fr/design/fun/DesignerEnvProcessor.java b/designer-base/src/com/fr/design/fun/DesignerEnvProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/DesignerEnvProcessor.java rename to designer-base/src/com/fr/design/fun/DesignerEnvProcessor.java diff --git a/designer_base/src/com/fr/design/fun/DesignerFrameUpButtonProvider.java b/designer-base/src/com/fr/design/fun/DesignerFrameUpButtonProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/DesignerFrameUpButtonProvider.java rename to designer-base/src/com/fr/design/fun/DesignerFrameUpButtonProvider.java diff --git a/designer_base/src/com/fr/design/fun/DesignerStartOpenFileProcessor.java b/designer-base/src/com/fr/design/fun/DesignerStartOpenFileProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/DesignerStartOpenFileProcessor.java rename to designer-base/src/com/fr/design/fun/DesignerStartOpenFileProcessor.java diff --git a/designer_base/src/com/fr/design/fun/ElementUIProvider.java b/designer-base/src/com/fr/design/fun/ElementUIProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/ElementUIProvider.java rename to designer-base/src/com/fr/design/fun/ElementUIProvider.java diff --git a/designer_base/src/com/fr/design/fun/ExportAttrTabProvider.java b/designer-base/src/com/fr/design/fun/ExportAttrTabProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/ExportAttrTabProvider.java rename to designer-base/src/com/fr/design/fun/ExportAttrTabProvider.java diff --git a/designer-base/src/com/fr/design/fun/ExportToolBarProvider.java b/designer-base/src/com/fr/design/fun/ExportToolBarProvider.java new file mode 100644 index 0000000000..ca31869405 --- /dev/null +++ b/designer-base/src/com/fr/design/fun/ExportToolBarProvider.java @@ -0,0 +1,35 @@ +package com.fr.design.fun; + +import com.fr.plugin.injectable.SpecialLevel; +import com.fr.stable.fun.mark.Mutable; + +import javax.swing.*; + +/** + * 导出菜单设计器端拓展,用于控制该菜单是否在web端显示 + */ +public interface ExportToolBarProvider extends Mutable{ + + String XML_TAG = SpecialLevel.ExportToolBarProvider.getTagName(); + + int CURRENT_LEVEL = 1; + + /** + * + * 用于添加 控制web端是否显示该菜单的checkbox的面板 + * + * @param pane 面板 + * @return 该面板 + */ + JPanel updateCenterPane(JPanel pane); + + /** + * 更新界面 + */ + void populate(); + + /** + * 保存界面设置 + */ + void update(); +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/fun/ExtraButtonToolBarProvider.java b/designer-base/src/com/fr/design/fun/ExtraButtonToolBarProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/ExtraButtonToolBarProvider.java rename to designer-base/src/com/fr/design/fun/ExtraButtonToolBarProvider.java diff --git a/designer_base/src/com/fr/design/fun/Feedback.java b/designer-base/src/com/fr/design/fun/Feedback.java similarity index 100% rename from designer_base/src/com/fr/design/fun/Feedback.java rename to designer-base/src/com/fr/design/fun/Feedback.java diff --git a/designer_base/src/com/fr/design/fun/FormElementCaseEditorProcessor.java b/designer-base/src/com/fr/design/fun/FormElementCaseEditorProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/FormElementCaseEditorProcessor.java rename to designer-base/src/com/fr/design/fun/FormElementCaseEditorProcessor.java diff --git a/designer_base/src/com/fr/design/fun/FormElementCaseEditorProvider.java b/designer-base/src/com/fr/design/fun/FormElementCaseEditorProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/FormElementCaseEditorProvider.java rename to designer-base/src/com/fr/design/fun/FormElementCaseEditorProvider.java diff --git a/designer_base/src/com/fr/design/fun/FormWidgetOptionProvider.java b/designer-base/src/com/fr/design/fun/FormWidgetOptionProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/FormWidgetOptionProvider.java rename to designer-base/src/com/fr/design/fun/FormWidgetOptionProvider.java diff --git a/designer-base/src/com/fr/design/fun/GlobalListenerProvider.java b/designer-base/src/com/fr/design/fun/GlobalListenerProvider.java new file mode 100644 index 0000000000..11ebfdf583 --- /dev/null +++ b/designer-base/src/com/fr/design/fun/GlobalListenerProvider.java @@ -0,0 +1,23 @@ +package com.fr.design.fun; + + +import com.fr.stable.fun.mark.Mutable; + +import java.awt.event.AWTEventListener; + +/** + * Created by zack on 2015/8/17. + * 全局事件监听 + */ +public interface GlobalListenerProvider extends Mutable{ + + String XML_TAG = "GlobalListenerProvider"; + + int CURRENT_LEVEL = 1; + + /** + * 返回一个AWT监听事件给系统注册 + * @return AWT监听事件 + */ + AWTEventListener listener(); +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/fun/GridUIProcessor.java b/designer-base/src/com/fr/design/fun/GridUIProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/GridUIProcessor.java rename to designer-base/src/com/fr/design/fun/GridUIProcessor.java diff --git a/designer_base/src/com/fr/design/fun/HighlightProvider.java b/designer-base/src/com/fr/design/fun/HighlightProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/HighlightProvider.java rename to designer-base/src/com/fr/design/fun/HighlightProvider.java diff --git a/designer-base/src/com/fr/design/fun/HyperlinkProvider.java b/designer-base/src/com/fr/design/fun/HyperlinkProvider.java new file mode 100644 index 0000000000..448a120fea --- /dev/null +++ b/designer-base/src/com/fr/design/fun/HyperlinkProvider.java @@ -0,0 +1,21 @@ +package com.fr.design.fun; + +import com.fr.design.gui.controlpane.NameableCreator; +import com.fr.stable.fun.Level; +import com.fr.stable.fun.mark.Mutable; + +/** + * Created by zack on 2016/1/20. + */ +public interface HyperlinkProvider extends Mutable { + String XML_TAG = "HyperlinkProvider"; + + int CURRENT_LEVEL = 2; + + + /** + * 创建一个超级连接类型 + * @return NameableCreator + */ + NameableCreator createHyperlinkCreator(); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/fun/IndentationUnitProcessor.java b/designer-base/src/com/fr/design/fun/IndentationUnitProcessor.java new file mode 100644 index 0000000000..17b3fff0cb --- /dev/null +++ b/designer-base/src/com/fr/design/fun/IndentationUnitProcessor.java @@ -0,0 +1,31 @@ +package com.fr.design.fun; + +import com.fr.stable.fun.mark.Immutable; + +/** + * Created by zhouping on 2015/9/20. + */ +public interface IndentationUnitProcessor extends Immutable { + String MARK_STRING = "IndentationProcessor"; + + int CURRENT_LEVEL = 1; + + + int getIndentationUnit(); + + void setIndentationUnit(int value); + + /** + * 处理paddingunit + * @param value 输入 + * @return 输出 + */ + int paddingUnitProcessor(int value); + + /** + * 从spinner获得缩进值,并处理后变成paddingunit + * @param value 输入值 + * @return 输出 + */ + int paddingUnitGainFromSpinner(int value); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/fun/JavaScriptActionProvider.java b/designer-base/src/com/fr/design/fun/JavaScriptActionProvider.java new file mode 100644 index 0000000000..6d70e8785b --- /dev/null +++ b/designer-base/src/com/fr/design/fun/JavaScriptActionProvider.java @@ -0,0 +1,21 @@ +package com.fr.design.fun; + +import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.javascript.JavaScriptActionPane; +import com.fr.js.JavaScript; +import com.fr.stable.fun.mark.Mutable; + +/** + * Created by zack on 2015/8/14. + */ +public interface JavaScriptActionProvider extends Mutable{ + + String XML_TAG = "JavaScriptActionProvider"; + + int CURRENT_LEVEL = 1; + + FurtherBasicBeanPane getJavaScriptActionPane(); + + FurtherBasicBeanPane getJavaScriptActionPane(JavaScriptActionPane pane); + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/fun/MenuHandler.java b/designer-base/src/com/fr/design/fun/MenuHandler.java similarity index 100% rename from designer_base/src/com/fr/design/fun/MenuHandler.java rename to designer-base/src/com/fr/design/fun/MenuHandler.java diff --git a/designer_base/src/com/fr/design/fun/ParameterWidgetOptionProvider.java b/designer-base/src/com/fr/design/fun/ParameterWidgetOptionProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/ParameterWidgetOptionProvider.java rename to designer-base/src/com/fr/design/fun/ParameterWidgetOptionProvider.java diff --git a/designer_base/src/com/fr/design/fun/ParameterWindowEditorProcessor.java b/designer-base/src/com/fr/design/fun/ParameterWindowEditorProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/ParameterWindowEditorProcessor.java rename to designer-base/src/com/fr/design/fun/ParameterWindowEditorProcessor.java diff --git a/designer_base/src/com/fr/design/fun/PresentKindProvider.java b/designer-base/src/com/fr/design/fun/PresentKindProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/PresentKindProvider.java rename to designer-base/src/com/fr/design/fun/PresentKindProvider.java diff --git a/designer_base/src/com/fr/design/fun/PreviewProvider.java b/designer-base/src/com/fr/design/fun/PreviewProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/PreviewProvider.java rename to designer-base/src/com/fr/design/fun/PreviewProvider.java diff --git a/designer_base/src/com/fr/design/fun/ServerTableDataDefineProvider.java b/designer-base/src/com/fr/design/fun/ServerTableDataDefineProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/ServerTableDataDefineProvider.java rename to designer-base/src/com/fr/design/fun/ServerTableDataDefineProvider.java diff --git a/designer_base/src/com/fr/design/fun/SubmitProvider.java b/designer-base/src/com/fr/design/fun/SubmitProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/SubmitProvider.java rename to designer-base/src/com/fr/design/fun/SubmitProvider.java diff --git a/designer_base/src/com/fr/design/fun/TableDataCreatorProvider.java b/designer-base/src/com/fr/design/fun/TableDataCreatorProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/TableDataCreatorProvider.java rename to designer-base/src/com/fr/design/fun/TableDataCreatorProvider.java diff --git a/designer_base/src/com/fr/design/fun/TableDataDefineProvider.java b/designer-base/src/com/fr/design/fun/TableDataDefineProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/TableDataDefineProvider.java rename to designer-base/src/com/fr/design/fun/TableDataDefineProvider.java diff --git a/designer_base/src/com/fr/design/fun/TableDataPaneProcessor.java b/designer-base/src/com/fr/design/fun/TableDataPaneProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/TableDataPaneProcessor.java rename to designer-base/src/com/fr/design/fun/TableDataPaneProcessor.java diff --git a/designer_base/src/com/fr/design/fun/TitlePlaceProcessor.java b/designer-base/src/com/fr/design/fun/TitlePlaceProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/TitlePlaceProcessor.java rename to designer-base/src/com/fr/design/fun/TitlePlaceProcessor.java diff --git a/designer_base/src/com/fr/design/fun/ToolbarItemProvider.java b/designer-base/src/com/fr/design/fun/ToolbarItemProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/ToolbarItemProvider.java rename to designer-base/src/com/fr/design/fun/ToolbarItemProvider.java diff --git a/designer_base/src/com/fr/design/fun/UIFormulaProcessor.java b/designer-base/src/com/fr/design/fun/UIFormulaProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/UIFormulaProcessor.java rename to designer-base/src/com/fr/design/fun/UIFormulaProcessor.java diff --git a/designer_base/src/com/fr/design/fun/VerifyDefineProvider.java b/designer-base/src/com/fr/design/fun/VerifyDefineProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/VerifyDefineProvider.java rename to designer-base/src/com/fr/design/fun/VerifyDefineProvider.java diff --git a/designer_base/src/com/fr/design/fun/WidgetDesignHandler.java b/designer-base/src/com/fr/design/fun/WidgetDesignHandler.java similarity index 100% rename from designer_base/src/com/fr/design/fun/WidgetDesignHandler.java rename to designer-base/src/com/fr/design/fun/WidgetDesignHandler.java diff --git a/designer_base/src/com/fr/design/fun/WidgetPropertyUIProvider.java b/designer-base/src/com/fr/design/fun/WidgetPropertyUIProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/WidgetPropertyUIProvider.java rename to designer-base/src/com/fr/design/fun/WidgetPropertyUIProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractBackgroundQuickUIProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractBackgroundQuickUIProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractBackgroundQuickUIProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractBackgroundQuickUIProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractBackgroundUIProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractBackgroundUIProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractBackgroundUIProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractBackgroundUIProvider.java diff --git a/designer-base/src/com/fr/design/fun/impl/AbstractCellAttributeProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractCellAttributeProvider.java new file mode 100644 index 0000000000..5212e4610f --- /dev/null +++ b/designer-base/src/com/fr/design/fun/impl/AbstractCellAttributeProvider.java @@ -0,0 +1,20 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.CellAttributeProvider; +import com.fr.stable.fun.mark.API; + +/** + * Created by zhouping on 2015/11/11. + */ +@API(level = CellAttributeProvider.CURRENT_LEVEL) +public abstract class AbstractCellAttributeProvider implements CellAttributeProvider { + + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + public int layerIndex() { + return DEFAULT_LAYER_INDEX; + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractCellWidgetOptionProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractCellWidgetOptionProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractCellWidgetOptionProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractCellWidgetOptionProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractConnectionProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractConnectionProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractConnectionProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractConnectionProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractDBTableDataMenuHandler.java b/designer-base/src/com/fr/design/fun/impl/AbstractDBTableDataMenuHandler.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractDBTableDataMenuHandler.java rename to designer-base/src/com/fr/design/fun/impl/AbstractDBTableDataMenuHandler.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractDesignerEnvProcessor.java b/designer-base/src/com/fr/design/fun/impl/AbstractDesignerEnvProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractDesignerEnvProcessor.java rename to designer-base/src/com/fr/design/fun/impl/AbstractDesignerEnvProcessor.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractDesignerStartOpenFileProcessor.java b/designer-base/src/com/fr/design/fun/impl/AbstractDesignerStartOpenFileProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractDesignerStartOpenFileProcessor.java rename to designer-base/src/com/fr/design/fun/impl/AbstractDesignerStartOpenFileProcessor.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractDsinFrameUpButtonProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractDsinFrameUpButtonProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractDsinFrameUpButtonProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractDsinFrameUpButtonProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractElementUIProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractElementUIProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractElementUIProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractElementUIProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractExportAttrTabProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractExportAttrTabProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractExportAttrTabProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractExportAttrTabProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractExtraButtonToolBarProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractExtraButtonToolBarProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractExtraButtonToolBarProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractExtraButtonToolBarProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProcessor.java b/designer-base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProcessor.java rename to designer-base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProcessor.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractFormElementCaseEditorProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java diff --git a/designer-base/src/com/fr/design/fun/impl/AbstractGlobalListenerProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractGlobalListenerProvider.java new file mode 100644 index 0000000000..1dd42b228b --- /dev/null +++ b/designer-base/src/com/fr/design/fun/impl/AbstractGlobalListenerProvider.java @@ -0,0 +1,21 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.GlobalListenerProvider; +import com.fr.stable.fun.impl.AbstractProvider; +import com.fr.stable.fun.mark.API; + +/** + * Created by zack on 2015/8/17. + */ +@API(level = GlobalListenerProvider.CURRENT_LEVEL) +public abstract class AbstractGlobalListenerProvider extends AbstractProvider implements GlobalListenerProvider { + + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public String mark4Provider() { + return getClass().getName(); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractGridUIProcessor.java b/designer-base/src/com/fr/design/fun/impl/AbstractGridUIProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractGridUIProcessor.java rename to designer-base/src/com/fr/design/fun/impl/AbstractGridUIProcessor.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractHighlightProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractHighlightProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractHighlightProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractHighlightProvider.java diff --git a/designer-base/src/com/fr/design/fun/impl/AbstractHyperlinkProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractHyperlinkProvider.java new file mode 100644 index 0000000000..bc5d5115a8 --- /dev/null +++ b/designer-base/src/com/fr/design/fun/impl/AbstractHyperlinkProvider.java @@ -0,0 +1,21 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.HyperlinkProvider; +import com.fr.stable.fun.impl.AbstractProvider; +import com.fr.stable.fun.mark.API; + +/** + * Created by zack on 2016/1/18. + */ +@API(level = HyperlinkProvider.CURRENT_LEVEL) +public abstract class AbstractHyperlinkProvider extends AbstractProvider implements HyperlinkProvider { + + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public String mark4Provider() { + return getClass().getName(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/fun/impl/AbstractIndentationUnitProcessor.java b/designer-base/src/com/fr/design/fun/impl/AbstractIndentationUnitProcessor.java new file mode 100644 index 0000000000..52bdebd978 --- /dev/null +++ b/designer-base/src/com/fr/design/fun/impl/AbstractIndentationUnitProcessor.java @@ -0,0 +1,47 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.IndentationUnitProcessor; +import com.fr.stable.fun.mark.API; + +/** + * Created by zhouping on 2015/9/20. + */ +@API(level = IndentationUnitProcessor.CURRENT_LEVEL) +public abstract class AbstractIndentationUnitProcessor implements IndentationUnitProcessor { + private int indentationUnit = 1; + + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + public int layerIndex() { + return DEFAULT_LAYER_INDEX; + } + + + public void setIndentationUnit(int value){ + this.indentationUnit = value; + } + + public int getIndentationUnit(){ + return indentationUnit; + } + + /** + * 处理paddingunit的值 + * @param value 输入 + * @return 输出 + */ + public int paddingUnitProcessor(int value){ + return value; + } + + /** + * 处理从spinner处获得的值 + * @param value 输入值 + * @return 输出 + */ + public int paddingUnitGainFromSpinner(int value){ + return value; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java new file mode 100644 index 0000000000..daf4f92c81 --- /dev/null +++ b/designer-base/src/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java @@ -0,0 +1,29 @@ +package com.fr.design.fun.impl; + +import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.fun.JavaScriptActionProvider; +import com.fr.design.javascript.JavaScriptActionPane; +import com.fr.js.JavaScript; +import com.fr.stable.fun.impl.AbstractProvider; +import com.fr.stable.fun.mark.API; + +/** + * Created by zack on 2015/8/20. + */ +@API(level = JavaScriptActionProvider.CURRENT_LEVEL) +public abstract class AbstractJavaScriptActionProvider extends AbstractProvider implements JavaScriptActionProvider { + + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public String mark4Provider() { + return getClass().getName(); + } + + @Override + public FurtherBasicBeanPane getJavaScriptActionPane(JavaScriptActionPane pane) { + return getJavaScriptActionPane(); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractMenuHandler.java b/designer-base/src/com/fr/design/fun/impl/AbstractMenuHandler.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractMenuHandler.java rename to designer-base/src/com/fr/design/fun/impl/AbstractMenuHandler.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractParameterWidgetOptionProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractParameterWidgetOptionProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractParameterWidgetOptionProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractParameterWidgetOptionProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractParameterWindowEditorProcessor.java b/designer-base/src/com/fr/design/fun/impl/AbstractParameterWindowEditorProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractParameterWindowEditorProcessor.java rename to designer-base/src/com/fr/design/fun/impl/AbstractParameterWindowEditorProcessor.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractPresentKindProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractPresentKindProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractPresentKindProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractPresentKindProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractPreviewProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractPreviewProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractPreviewProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractPreviewProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractServerTableDataDefineProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractServerTableDataDefineProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractServerTableDataDefineProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractServerTableDataDefineProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractSubmitProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractSubmitProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractSubmitProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractSubmitProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractTDPaneProcessor.java b/designer-base/src/com/fr/design/fun/impl/AbstractTDPaneProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractTDPaneProcessor.java rename to designer-base/src/com/fr/design/fun/impl/AbstractTDPaneProcessor.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractTableDataDefineProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractTableDataDefineProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractTableDataDefineProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractTableDataDefineProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractTitleProcessor.java b/designer-base/src/com/fr/design/fun/impl/AbstractTitleProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractTitleProcessor.java rename to designer-base/src/com/fr/design/fun/impl/AbstractTitleProcessor.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractToolbarItem.java b/designer-base/src/com/fr/design/fun/impl/AbstractToolbarItem.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractToolbarItem.java rename to designer-base/src/com/fr/design/fun/impl/AbstractToolbarItem.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractUIFormulaProcessor.java b/designer-base/src/com/fr/design/fun/impl/AbstractUIFormulaProcessor.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractUIFormulaProcessor.java rename to designer-base/src/com/fr/design/fun/impl/AbstractUIFormulaProcessor.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractVerifyDefineProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractVerifyDefineProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractVerifyDefineProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractVerifyDefineProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractWidgetDesignHandler.java b/designer-base/src/com/fr/design/fun/impl/AbstractWidgetDesignHandler.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractWidgetDesignHandler.java rename to designer-base/src/com/fr/design/fun/impl/AbstractWidgetDesignHandler.java diff --git a/designer_base/src/com/fr/design/fun/impl/AbstractWidgetPropertyUIProvider.java b/designer-base/src/com/fr/design/fun/impl/AbstractWidgetPropertyUIProvider.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/AbstractWidgetPropertyUIProvider.java rename to designer-base/src/com/fr/design/fun/impl/AbstractWidgetPropertyUIProvider.java diff --git a/designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java b/designer-base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java similarity index 100% rename from designer_base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java rename to designer-base/src/com/fr/design/fun/impl/GlobalListenerProviderManager.java diff --git a/designer_base/src/com/fr/design/gui/HyperlinkFilterHelper.java b/designer-base/src/com/fr/design/gui/HyperlinkFilterHelper.java similarity index 100% rename from designer_base/src/com/fr/design/gui/HyperlinkFilterHelper.java rename to designer-base/src/com/fr/design/gui/HyperlinkFilterHelper.java diff --git a/designer-base/src/com/fr/design/gui/UIDefaultTheme.java b/designer-base/src/com/fr/design/gui/UIDefaultTheme.java new file mode 100644 index 0000000000..2537ddf92d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/UIDefaultTheme.java @@ -0,0 +1,199 @@ +package com.fr.design.gui; + + +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.border.LineBorder; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.FontUIResource; +import javax.swing.plaf.InsetsUIResource; +import javax.swing.plaf.metal.DefaultMetalTheme; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 13-12-31 + * Time: 下午2:14 + */ +public class UIDefaultTheme extends DefaultMetalTheme { + + + /** + * Secondary Color 1, used for the following: + * Dark border for flush 3D style. + */ + private static final ColorUIResource SECONDARY_1 = new ColorUIResource(167, 165, 163); + + /** + * Secondary Color 2, used for the following: + * Inactive internal window borders; dimmed button borders. + * Shadows; highlighting of toolbar buttons upon mouse button down. + * Dimmed text (for example, inactive menu items or labels). + */ + private static final ColorUIResource SECONDARY_2 = new ColorUIResource(167, 165, 163); + + /** + * 增加一些自定义的值到默认表中 + * + * @param table 默认表 + */ + public void addCustomEntriesToTable(UIDefaults table) { + super.addCustomEntriesToTable(table); + putMargin(table); + putTextConnection(table); + putToolTip(table); + putDisable(table); + putTreeAndList(table); + putOthers(table); + table.put("Desktop.background", new ColorUIResource(212, 210, 194)); + table.put("Separator.background", new ColorUIResource(232, 232, 233)); + table.put("Separator.foreground", new ColorUIResource(236, 233, 216)); + table.put("TitledBorder.border", new LineBorder( + new ColorUIResource(165, 163, 151))); + table.put("Panel.background", ThemeUtils.BACK_COLOR); + } + + public FontUIResource getMenuTextFont() { + return ThemeUtils.PLAIN_FONT; + } + + + private void putMargin(UIDefaults table) { + table.put("Button.margin", new InsetsUIResource(2, 12, 2, 12)); + table.put("CheckBox.margin", new InsetsUIResource(2, 2, 2, 2)); + table.put("RadioButton.margin", new InsetsUIResource(2, 2, 2, 2)); + } + + protected ColorUIResource getSecondary3() { + return ThemeUtils.BACK_COLOR; + } + + private void putOthers(UIDefaults table) { + table.put("Button.background", new ColorUIResource(231, 232, 245)); + table.put("Table.background", ThemeUtils.TEXT_BG_COLOR); + table.put("Table.selectionForeground", ThemeUtils.NORMAL_FOREGROUND); + table.put("Table.selectionBackground", new ColorUIResource(200, 221, 233)); + table.put("Table.gridColor", new ColorUIResource(200, 221, 233)); + table.put("TableHeader.background", new ColorUIResource(229, 229, 229)); + table.put("ProgressBar.foreground", ThemeUtils.PROCESS_COLOR); + table.put("ProgressBar.background", ThemeUtils.TEXT_BG_COLOR); + table.put("ProgressBar.selectionForeground", ThemeUtils.NORMAL_FOREGROUND); + table.put("ProgressBar.selectionBackground", ThemeUtils.NORMAL_FOREGROUND); + table.put("PopupMenu.background", ThemeUtils.NORMAL_BG); + table.put("TabbedPane.background", ThemeUtils.TEXT_BG_COLOR); + table.put("TabbedPane.background", ThemeUtils.NORMAL_BG); + table.put("TabbedPane.tabAreaInsets", new InsetsUIResource(4, 2, 0, 0)); + table.put("TabbedPane.tabInsets", new InsetsUIResource(1, 6, 4, 6)); + table.put("Table.gridColor", ThemeUtils.TABLE_GRID_COLOR); + table.put("MenuBar.background", new ColorUIResource(212, 212, 216)); + table.put("Menu.foreground", ThemeUtils.MENU_ITEM_FONT_COLOR); + table.put("MenuItem.foreground", ThemeUtils.MENU_ITEM_FONT_COLOR); + table.put("ToolBar.background", new ColorUIResource(239, 237, 229)); + + table.put("EditorPane.caretForeground", ThemeUtils.NORMAL_FOREGROUND); + table.put("PasswordField.caretForeground", ThemeUtils.NORMAL_FOREGROUND); + table.put("TextArea.caretForeground", ThemeUtils.NORMAL_FOREGROUND); + table.put("TextField.caretForeground", ThemeUtils.NORMAL_FOREGROUND); + table.put("FormattedTextField.caretForeground", ThemeUtils.NORMAL_FOREGROUND); + } + + private void putTextConnection(UIDefaults table) { + table.put("List.foreground", ThemeUtils.NORMAL_FOREGROUND); + table.put("List.background", ThemeUtils.TEXT_BG_COLOR); + table.put("ComboBox.foreground", ThemeUtils.NORMAL_FOREGROUND); + table.put("ComboBox.background", ThemeUtils.TEXT_BG_COLOR); + table.put("ComboBox.disabledBackground", ThemeUtils.TEXT_DISABLED_BG_COLOR); + table.put("EditorPane.background", ThemeUtils.TEXT_BG_COLOR); + table.put("EditorPane.foreground", ThemeUtils.NORMAL_FOREGROUND); + table.put("PasswordField.background", ThemeUtils.TEXT_BG_COLOR); + table.put("PasswordField.foreground", ThemeUtils.NORMAL_FOREGROUND); + table.put("PasswordField.inactiveBackground", ThemeUtils.TEXT_DISABLED_BG_COLOR); + table.put("TextArea.background", ThemeUtils.TEXT_BG_COLOR); + table.put("TextArea.foreground", ThemeUtils.NORMAL_FOREGROUND); + table.put("TextArea.inactiveBackground", ThemeUtils.TEXT_DISABLED_BG_COLOR); + table.put("TextField.background", ThemeUtils.TEXT_BG_COLOR); + table.put("TextField.foreground", ThemeUtils.NORMAL_FOREGROUND); + table.put("TextField.inactiveBackground", ThemeUtils.TEXT_DISABLED_BG_COLOR); + table.put("FormattedTextField.background", ThemeUtils.TEXT_BG_COLOR); + table.put("FormattedTextField.foreground", ThemeUtils.NORMAL_FOREGROUND); + table.put("FormattedTextField.inactiveBackground", ThemeUtils.TEXT_DISABLED_BG_COLOR); + table.put("TextPane.background", ThemeUtils.TEXT_BG_COLOR); + table.put("EditorPane.background", ThemeUtils.TEXT_BG_COLOR); + table.put("OptionPane.messageForeground", ThemeUtils.NORMAL_FOREGROUND); + table.put("ComboBox.selectionBackground", new ColorUIResource(43, 107, 197)); + table.put("ComboBox.selectionForeground", ThemeUtils.TEXT_BG_COLOR); + table.put("ComboBox.focusBackground", new ColorUIResource(43, 107, 197)); + table.put("PasswordField.selectionBackground", ThemeUtils.TEXT_SELECTED_BG_COLOR); + table.put("PasswordField.selectionForeground", ThemeUtils.TEXT_SELECTED_TEXT_COLOR); + table.put("TextField.selectionBackground", ThemeUtils.TEXT_SELECTED_BG_COLOR); + table.put("TextField.selectionForeground", ThemeUtils.TEXT_SELECTED_TEXT_COLOR); + table.put("FormattedTextField.selectionBackground", ThemeUtils.TEXT_SELECTED_BG_COLOR); + table.put("FormattedTextField.selectionForeground", ThemeUtils.TEXT_SELECTED_TEXT_COLOR); + table.put("TextArea.selectionBackground", ThemeUtils.TEXT_SELECTED_BG_COLOR); + table.put("TextArea.selectionForeground", ThemeUtils.TEXT_SELECTED_TEXT_COLOR); + table.put("TextPane.selectionBackground", ThemeUtils.TEXT_SELECTED_BG_COLOR); + table.put("TextPane.selectionForeground", ThemeUtils.TEXT_SELECTED_TEXT_COLOR); + table.put("MenuItem.acceleratorForeground", ThemeUtils.NORMAL_FOREGROUND); + } + + private void putToolTip(UIDefaults table) { + table.put("ToolTip.background", new ColorUIResource(255, 255, 255)); + table.put("ToolTip.backgroundInactive", new ColorUIResource(236, 233, 216)); + table.put("ToolTip.foreground", new ColorUIResource(0, 0, 0)); + table.put("ToolTip.foregroundInactive", new ColorUIResource(143, 141, 139)); + } + + private void putDisable(UIDefaults table) { + + table.put("Button.disabledText", ThemeUtils.DISABLE_TEXT); + table.put("CheckBox.disabledText", ThemeUtils.DISABLE_TEXT); + table.put("RadioButton.disabledText", ThemeUtils.DISABLE_TEXT); + table.put("ToggleButton.disabledText", ThemeUtils.DISABLE_TEXT); + table.put("ToggleButton.disabledSelectedText", ThemeUtils.DISABLE_TEXT); + table.put("TextArea.inactiveForeground", ThemeUtils.DISABLE_TEXT); + table.put("TextField.inactiveForeground", ThemeUtils.DISABLE_TEXT); + table.put("FormattedTextField.inactiveForeground", ThemeUtils.DISABLE_TEXT); + table.put("TextPane.inactiveForeground", ThemeUtils.DISABLE_TEXT); + table.put("PasswordField.inactiveForeground", ThemeUtils.DISABLE_TEXT); + table.put("ComboBox.disabledForeground", ThemeUtils.DISABLE_TEXT); + table.put("Label.disabledForeground", ThemeUtils.DISABLE_TEXT); + table.put("textInactiveText", ThemeUtils.DISABLE_TEXT); + } + + private void putTreeAndList(UIDefaults table) { + table.put("List.selectionForeground", new ColorUIResource(255, 255, 255)); + table.put("List.selectionBackground", ThemeUtils.TEXT_SELECTED_BG_COLOR); + table.put("Tree.background", ThemeUtils.TEXT_BG_COLOR); + table.put("Tree.textBackground", ThemeUtils.TEXT_BG_COLOR); + table.put("Tree.textForeground", ThemeUtils.NORMAL_FOREGROUND); + table.put("Tree.selectionBackground", ThemeUtils.TEXT_SELECTED_BG_COLOR); + table.put("Tree.selectionForeground", ThemeUtils.TEXT_SELECTED_TEXT_COLOR); + table.put("Tree.hash", new ColorUIResource(240, 240,243)); + table.put("Tree.line", new ColorUIResource(240, 240,243)); + } + + + /** + * Gets the first secondary color. + * + * @return The first secondary color. See field declaration for more details. + */ + protected ColorUIResource getSecondary1() { + return SECONDARY_1; + } + + /** + * Gets the second secondary color. + * + * @return The second secondary color. See field declaration for more details. + */ + protected ColorUIResource getSecondary2() { + return SECONDARY_2; + } + + public ColorUIResource getMenuSelectedBackground() { + return new ColorUIResource(200, 200, 255); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/UILookAndFeel.java b/designer-base/src/com/fr/design/gui/UILookAndFeel.java new file mode 100644 index 0000000000..f4fd5d4c45 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/UILookAndFeel.java @@ -0,0 +1,202 @@ +package com.fr.design.gui; + +import com.fr.design.gui.borders.*; +import com.fr.design.gui.frpane.UIBasicOptionPaneUI; +import com.fr.design.gui.ibutton.UIBasicButtonUI; +import com.fr.design.gui.ibutton.UIButtonBorder; +import com.fr.design.gui.ibutton.UIRadioButtonMenuItemUI; +import com.fr.design.gui.ibutton.UIRadioButtonUI; +import com.fr.design.gui.icheckbox.UICheckBoxUI; +import com.fr.design.gui.icombobox.UIBasicComboBoxUI; +import com.fr.design.gui.icontainer.UIScrollPaneBorder; +import com.fr.design.gui.icontainer.UIScrollPaneUI; +import com.fr.design.gui.icontainer.UITableScrollPaneBorder; +import com.fr.design.gui.imenu.UIBasicMenuItemUI; +import com.fr.design.gui.imenu.UIBasicMenuUI; +import com.fr.design.gui.imenu.UIPopupMenuBorder; +import com.fr.design.gui.imenu.UIPopupMenuSeparatorUI; +import com.fr.design.gui.iprogressbar.UIProgressBarBorder; +import com.fr.design.gui.iprogressbar.UIProgressBarUI; +import com.fr.design.gui.iscrollbar.UIBasicScrollBarUI; +import com.fr.design.gui.ispinner.UISpinnerUI; +import com.fr.design.gui.isplitpanedivider.UISplitPaneUI; +import com.fr.design.gui.itable.UIBasicTableUI; +import com.fr.design.gui.itoolbar.UIToolBarBorder; +import com.fr.design.gui.itoolbar.UIToolBarSeparatorUI; +import com.fr.design.gui.itooltip.UIToolTipBorder; +import com.fr.design.gui.itree.UITreeUI; +import com.fr.general.FRLogger; +import com.fr.general.IOUtils; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; +import javax.swing.plaf.BorderUIResource; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.basic.BasicBorders; +import javax.swing.plaf.metal.MetalLookAndFeel; +import java.awt.*; +import java.net.URL; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 13-12-31 + * Time: 上午9:38 + */ +public class UILookAndFeel extends MetalLookAndFeel { + + public static boolean CONTROL_PANEL_INSTANTIATED = false; + + + protected void createDefaultTheme() { + setCurrentTheme(new UIDefaultTheme()); + } + + + /** + * Initializes the uiClassID to BasicComponentUI mapping. + * The JComponent classes define their own uiClassID constants. This table + * must map those constants to a BasicComponentUI class of the appropriate + * type. + * + * @param table The ui defaults table. + */ + protected void initClassDefaults(UIDefaults table) { + super.initClassDefaults(table); + + table.putDefaults(new Object[]{ + "TreeUI", UITreeUI.class.getName(), + "PopupMenuSeparatorUI", UIPopupMenuSeparatorUI.class.getName(), + "SplitPaneUI", UISplitPaneUI.class.getName(), + "SpinnerUI", UISpinnerUI.class.getName(), + "ScrollPaneUI", UIScrollPaneUI.class.getName(), + "RadioButtonUI", UIRadioButtonUI.class.getName(), + "CheckBoxUI", UICheckBoxUI.class.getName(), + "ToolBarSeparatorUI", UIToolBarSeparatorUI.class.getName(), + "ScrollBarUI", UIBasicScrollBarUI.class.getName(), + "ComboBoxUI", UIBasicComboBoxUI.class.getName(), + "ButtonUI", UIBasicButtonUI.class.getName(), + "ToggleButtonUI", UIBasicButtonUI.class.getName(), + "TableUI", UIBasicTableUI.class.getName(), + "ProgressBarUI", UIProgressBarUI.class.getName(), + "MenuUI", UIBasicMenuUI.class.getName(), + "MenuItemUI", UIBasicMenuItemUI.class.getName(), + "RadioButtonMenuItemUI", UIRadioButtonMenuItemUI.class.getName(), + "OptionPaneUI",UIBasicOptionPaneUI.class.getName(), + }); + } + + + /** + * Initializes the default values for many ui widgets and puts them in the + * given ui defaults table. T + * Here is the place where borders can be changed. + * + * @param table The ui defaults table. + */ + protected void initComponentDefaults(UIDefaults table) { + super.initComponentDefaults(table); + table.put("Button.border", + new BorderUIResource.CompoundBorderUIResource( + new UIButtonBorder(), + new BasicBorders.MarginBorder())); + Border border = new EmptyBorder(2, 4, 2, 4); + table.put("Menu.border", border); + table.put("CheckBoxMenuItem.border", border); + table.put("MenuItem.border", border); + table.put("RadioButtonMenuItem.border", border); + table.put("ToolTip.border", new BorderUIResource(new UIToolTipBorder(true))); + table.put("ToolTip.borderInactive", new BorderUIResource(new UIToolTipBorder(false))); + table.put("PopupMenu.border", new UIPopupMenuBorder()); + table.put("PopupMenu.foreground", new ColorUIResource(255, 0, 0)); + table.put("SplitPane.dividerSize", new Integer(7)); + table.put("ToolBar.border", new UIToolBarBorder()); + table.put("Table.scrollPaneBorder", new UITableScrollPaneBorder()); + + border = new UIInternalFrameBorder(); + table.put("InternalFrame.border", border); + table.put("InternalFrame.paletteBorder", border); + table.put("InternalFrame.optionDialogBorder", border); + table.put("Table.scrollPaneBorder", new UITableScrollPaneBorder()); + + + table.put("TabbedPane.tabInsets", new Insets(1, 6, 4, 6)); + table.put("TabbedPane.selectedTabPadInsets", new Insets(2, 2, 1, 2)); + table.put("TabbedPane.unselected", new ColorUIResource(0, 0, 0)); + table.put("TabbedPane.tabAreaInsets", new Insets(6, 2, 0, 0)); + table.put("TabbedPane.contentBorderInsets", new Insets(1, 1, 3, 3)); + initOtherComponents(table); + + } + + private void initOtherComponents(UIDefaults table) { + table.put("RootPane.colorChooserDialogBorder", UIFrameBorder.getInstance()); + table.put("RootPane.errorDialogBorder", UIFrameBorder.getInstance()); + table.put("RootPane.fileChooserDialogBorder", UIFrameBorder.getInstance()); + table.put("RootPane.frameBorder", UIFrameBorder.getInstance()); + table.put("RootPane.informationDialogBorder", UIFrameBorder.getInstance()); + table.put("RootPane.plainDialogBorder", UIFrameBorder.getInstance()); + table.put("RootPane.questionDialogBorder", UIFrameBorder.getInstance()); + table.put("RootPane.warningDialogBorder", UIFrameBorder.getInstance()); + table.put("TableHeader.cellBorder", new UITableHeaderBorder()); + table.put("TableHeader.cellRolloverBorder", new UITableHeaderRolloverBorder()); + + table.put("Tree.expandedIcon", loadIcon("TreeMinusIcon.png", this)); + table.put("Tree.collapsedIcon", loadIcon("TreePlusIcon.png", this)); + table.put("Tree.openIcon", loadIcon("TreeFolderOpenedIcon.png", this)); + table.put("Tree.closedIcon", loadIcon("TreeFolderClosedIcon.png", this)); + table.put("Tree.leafIcon", loadIcon("TreeLeafIcon.png", this)); + table.put("FileView.directoryIcon", loadIcon("DirectoryIcon.png", this)); + table.put("FileView.computerIcon", loadIcon("ComputerIcon.png", this)); + table.put("FileView.fileIcon", loadIcon("FileIcon.png", this)); + table.put("FileView.floppyDriveIcon", loadIcon("FloppyIcon.png", this)); + table.put("FileView.hardDriveIcon", loadIcon("HarddiskIcon.png", this)); + table.put("FileChooser.detailsViewIcon", loadIcon("FileDetailsIcon.png", this)); + table.put("FileChooser.homeFolderIcon", loadIcon("HomeFolderIcon.png", this)); + table.put("FileChooser.listViewIcon", loadIcon("FileListIcon.png", this)); + table.put("FileChooser.newFolderIcon", loadIcon("NewFolderIcon.png", this)); + table.put("FileChooser.upFolderIcon", loadIcon("ParentDirectoryIcon.png", this)); + table.put("OptionPane.errorIcon", loadIcon("ErrorIcon.png", this)); + table.put("OptionPane.informationIcon", loadIcon("InformationIcon.png", this)); + table.put("OptionPane.warningIcon", loadIcon("WarningIcon.png", this)); + table.put("OptionPane.questionIcon", loadIcon("QuestionIcon.png", this)); + table.put("ScrollPane.border", new UIScrollPaneBorder()); + table.put("ProgressBar.border", new UIProgressBarBorder()); + table.put("Spinner.border", new UITextFieldBorder(new Insets(2, 2, 2, 2))); + table.put("FormattedTextField.border", new UITextFieldBorder()); + table.put("TextField.border", new UITextFieldBorder()); + table.put("PasswordField.border", new UITextFieldBorder()); + table.put("TextArea.border", new UITextFieldBorder()); + } + + + /** + * 加载图片 + * + * @param fileName 文件名 + * @param invoker 参数 + * @return 加载的图片 + */ + public static ImageIcon loadIcon(final String fileName, final Object invoker) { + // This should work for both applications and applets + URL url = Thread.currentThread().getContextClassLoader().getResource( + "com/fr/design/images/lookandfeel/" + fileName); + + if (url == null) { + // Another try + url = IOUtils.getResource( + "com/fr/design/images/lookandfeel/" + fileName, UILookAndFeel.class); + + if (url == null) { + FRLogger.getLogger().error("Icon directory could not be resolved."); + return null; + } + } + + return new ImageIcon(url); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/AbstractCompletion.java b/designer-base/src/com/fr/design/gui/autocomplete/AbstractCompletion.java new file mode 100644 index 0000000000..bd562c03b3 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/AbstractCompletion.java @@ -0,0 +1,153 @@ +/* + * 12/21/2008 + * + * AbstractCompletion.java - Base class for possible completions. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import javax.swing.Icon; +import javax.swing.text.JTextComponent; + + +/** + * Base class for possible completions. Most, if not all, {@link Completion} + * implementations can extend this class. It remembers the + * CompletionProvider that returns this completion, and also implements + * Comparable, allowing such completions to be compared + * lexicographically (ignoring case).

+ * + * This implementation assumes the input text and replacement text are the + * same value. It also returns the input text from its {@link #toString()} + * method (which is what DefaultListCellRenderer uses to render + * objects). Subclasses that wish to override any of this behavior can simply + * override the corresponding method(s) needed to do so. + * + * @author Robert Futrell + * @version 1.0 + */ +public abstract class AbstractCompletion implements Completion { + + /** + * The provider that created this completion; + */ + private CompletionProvider provider; + + /** + * The relevance of this completion. Completion instances with higher + * "relevance" values are inserted higher into the list of possible + * completions than those with lower values. Completion instances with + * equal relevance values are sorted alphabetically. + */ + private int relevance; + + + /** + * Constructor. + * + * @param provider The provider that created this completion. + */ + public AbstractCompletion(CompletionProvider provider) { + this.provider = provider; + } + + + /** + * {@inheritDoc} + */ + public int compareTo(Completion c2) { + if (c2==this) { + return 0; + } + else if (c2!=null) { + return toString().compareToIgnoreCase(c2.toString()); + } + return -1; + } + + + /** + * {@inheritDoc} + */ + public String getAlreadyEntered(JTextComponent comp) { + return provider.getAlreadyEnteredText(comp); + } + + + /** + * The default implementation returns null. Subclasses + * who wish to display an icon can override this method. + * + * @return The icon for this completion. + */ + public Icon getIcon() { + return null; + } + + + /** + * Returns the text the user has to (start) typing for this completion + * to be offered. The default implementation simply returns + * {@link #getReplacementText()}. + * + * @return The text the user has to (start) typing for this completion. + * @see #getReplacementText() + */ + public String getInputText() { + return getReplacementText(); + } + + + /** + * {@inheritDoc} + */ + public CompletionProvider getProvider() { + return provider; + } + + + /** + * {@inheritDoc} + */ + public int getRelevance() { + return relevance; + } + + + /** + * The default implementation returns null. Subclasses + * can override this method. + * + * @return The tool tip text. + */ + public String getToolTipText() { + return null; + } + + + /** + * Sets the relevance of this completion. + * + * @param relevance The new relevance of this completion. + * @see #getRelevance() + */ + public void setRelevance(int relevance) { + this.relevance = relevance; + } + + + /** + * Returns a string representation of this completion. The default + * implementation returns {@link #getInputText()}. + * + * @return A string representation of this completion. + */ + @Override + public String toString() { + return getInputText(); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/AbstractCompletionProvider.java b/designer-base/src/com/fr/design/gui/autocomplete/AbstractCompletionProvider.java new file mode 100644 index 0000000000..a03e3d8b00 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/AbstractCompletionProvider.java @@ -0,0 +1,245 @@ +/* + * 12/21/2008 + * + * AbstractCompletionProvider.java - Base class for completion providers. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import javax.swing.text.JTextComponent; + + +/** + * A base class for completion providers. {@link Completion}s are kept in + * a sorted list. To get the list of completions that match a given input, + * a binary search is done to find the first matching completion, then all + * succeeding completions that also match are also returned. + * + * @author Robert Futrell + * @version 1.0 + */ +public abstract class AbstractCompletionProvider + extends CompletionProviderBase { + + /** + * The completions this provider is aware of. Subclasses should ensure + * that this list is sorted alphabetically (case-insensitively). + */ + protected List completions; + + /** + * Compares a {@link Completion} against a String. + */ + protected CaseInsensitiveComparator comparator; + + + /** + * Constructor. + */ + public AbstractCompletionProvider() { + comparator = new CaseInsensitiveComparator(); + clearParameterizedCompletionParams(); + } + + + /** + * Adds a single completion to this provider. If you are adding multiple + * completions to this provider, for efficiency reasons please consider + * using {@link #addCompletions(List)} instead. + * + * @param c The completion to add. + * @throws IllegalArgumentException If the completion's provider isn't + * this CompletionProvider. + * @see #addCompletions(List) + * @see #removeCompletion(Completion) + * @see #clear() + */ + public void addCompletion(Completion c) { + checkProviderAndAdd(c); + Collections.sort(completions); + } + + + /** + * Adds {@link Completion}s to this provider. + * + * @param completions The completions to add. This cannot be + * null. + * @throws IllegalArgumentException If a completion's provider isn't + * this CompletionProvider. + * @see #addCompletion(Completion) + * @see #removeCompletion(Completion) + * @see #clear() + */ + public void addCompletions(List completions) { + //this.completions.addAll(completions); + for (Completion c : completions) { + checkProviderAndAdd(c); + } + Collections.sort(this.completions); + } + + + /** + * Adds simple completions for a list of words. + * + * @param words The words. + * @see BasicCompletion + */ + protected void addWordCompletions(String[] words) { + int count = words==null ? 0 : words.length; + for (int i=0; iCompletionProvider, if there is one. + * + * @see #addCompletion(Completion) + * @see #addCompletions(List) + * @see #removeCompletion(Completion) + */ + public void clear() { + completions.clear(); + } + + + /** + * Returns a list of Completions in this provider with the + * specified input text. + * + * @param inputText The input text to search for. + * @return A list of {@link Completion}s, or null if there + * are no matching Completions. + */ + @SuppressWarnings("unchecked") + public List getCompletionByInputText(String inputText) { + + // Find any entry that matches this input text (there may be > 1). + int end = Collections.binarySearch(completions, inputText, comparator); + if (end<0) { + return null; + } + + // There might be multiple entries with the same input text. + int start = end; + while (start>0 && + comparator.compare(completions.get(start-1), inputText)==0) { + start--; + } + int count = completions.size(); + while (++end getCompletionsImpl(JTextComponent comp) { + + List retVal = new ArrayList(); + String text = getAlreadyEnteredText(comp); + + if (text!=null) { + + int index = Collections.binarySearch(completions, text, comparator); + if (index<0) { // No exact match + index = -index - 1; + } + else { + // If there are several overloads for the function being + // completed, Collections.binarySearch() will return the index + // of one of those overloads, but we must return all of them, + // so search backward until we find the first one. + int pos = index - 1; + while (pos>0 && + comparator.compare(completions.get(pos), text)==0) { + retVal.add(completions.get(pos)); + pos--; + } + } + + while (indextrue if this provider contained the specified + * completion. + * @see #clear() + * @see #addCompletion(Completion) + * @see #addCompletions(List) + */ + public boolean removeCompletion(Completion c) { + // Don't just call completions.remove(c) as it'll be a linear search. + int index = Collections.binarySearch(completions, c); + if (index<0) { + return false; + } + completions.remove(index); + return true; + } + + + /** + * A comparator that compares the input text of a {@link Completion} + * against a String lexicographically, ignoring case. + */ + @SuppressWarnings("rawtypes") + protected static class CaseInsensitiveComparator implements Comparator, + Serializable { + + public int compare(Object o1, Object o2) { + Completion c = (Completion)o1; + // o2.toString() needed to help compile with 1.5+. + return String.CASE_INSENSITIVE_ORDER.compare( + c.getInputText(), o2.toString()); + } + + } + + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/autocomplete/AutoCompleteDemo.java b/designer-base/src/com/fr/design/gui/autocomplete/AutoCompleteDemo.java similarity index 100% rename from designer_base/src/com/fr/design/gui/autocomplete/AutoCompleteDemo.java rename to designer-base/src/com/fr/design/gui/autocomplete/AutoCompleteDemo.java diff --git a/designer-base/src/com/fr/design/gui/autocomplete/AutoCompleteDescWindow.java b/designer-base/src/com/fr/design/gui/autocomplete/AutoCompleteDescWindow.java new file mode 100644 index 0000000000..37188f3f85 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/AutoCompleteDescWindow.java @@ -0,0 +1,591 @@ +/* + * 12/21/2008 + * + * AutoCompleteDescWindow.java - A window containing a description of the + * currently selected completion. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.PopupWindowDecorator; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.ComponentOrientation; +import java.awt.Graphics; +import java.awt.Insets; +import java.awt.Window; +import java.awt.event.ActionEvent; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.ResourceBundle; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.BorderFactory; +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JEditorPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JToolBar; +import javax.swing.JWindow; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.UIManager; +import javax.swing.border.AbstractBorder; +import javax.swing.border.Border; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; + + + +/** + * The optional "description" window that describes the currently selected + * item in the auto-completion window. + * + * @author Robert Futrell + * @version 1.0 + */ +class AutoCompleteDescWindow extends JWindow implements HyperlinkListener, + DescWindowCallback { + + /** + * The parent AutoCompletion instance. + */ + private AutoCompletion ac; + + /** + * Renders the HTML description. + */ + private JEditorPane descArea; + + /** + * The scroll pane that {@link #descArea} is in. + */ + private JScrollPane scrollPane; + + /** + * The bottom panel, containing the toolbar and size grip. + */ + private JPanel bottomPanel; + + /** + * The toolbar with "back" and "forward" buttons. + */ + private JToolBar descWindowNavBar; + + /** + * Action that goes to the previous description displayed. + */ + private Action backAction; + + /** + * Action that goes to the next description displayed. + */ + private Action forwardAction; + + /** + * History of descriptions displayed. + */ + private List history; + + /** + * The current position in {@link #history}. + */ + private int historyPos; + + /** + * Provides a slight delay between asking to set a description and actually + * displaying it, so that if the user is scrolling quickly through + * completions, those with slow-to-calculate summaries won't bog down the + * scrolling. + */ + private Timer timer; + + /** + * The action that listens for the timer to fire. + */ + private TimerAction timerAction; + + /** + * The resource bundle for this window. + */ + private ResourceBundle bundle; + + /** + * The amount of time to wait after the user changes the selected + * completion to refresh the description. This delay is in place to help + * performance for {@link Completion}s that may be slow to compute their + * summary text. + */ + private static final int INITIAL_TIMER_DELAY = 120; + + /** + * The resource bundle name. + */ + private static final String MSG = + "com.fr.design.gui.autocomplete.AutoCompleteDescWindow"; + + + /** + * Constructor. + * + * @param owner The parent window. + * @param ac The parent auto-completion. + */ + public AutoCompleteDescWindow(Window owner, AutoCompletion ac) { + + super(owner); + this.ac = ac; + + ComponentOrientation o = ac.getTextComponentOrientation(); + + JPanel cp = new JPanel(new BorderLayout()); + cp.setBorder(TipUtil.getToolTipBorder()); + + descArea = new JEditorPane("text/html", null); + TipUtil.tweakTipEditorPane(descArea); + descArea.addHyperlinkListener(this); + scrollPane = new JScrollPane(descArea); + Border b = BorderFactory.createEmptyBorder(); + scrollPane.setBorder(b); + scrollPane.setViewportBorder(b); + scrollPane.setBackground(descArea.getBackground()); + scrollPane.getViewport().setBackground(descArea.getBackground()); + cp.add(scrollPane); + + descWindowNavBar = new JToolBar(); + backAction = new ToolBarBackAction(o.isLeftToRight()); + forwardAction = new ToolBarForwardAction(o.isLeftToRight()); + descWindowNavBar.setFloatable(false); + descWindowNavBar.add(new JButton(backAction)); + descWindowNavBar.add(new JButton(forwardAction)); + + bottomPanel = new JPanel(new BorderLayout()); + b = new AbstractBorder() { + @Override + public Insets getBorderInsets(Component c) { + return new Insets(1, 0, 0, 0); + } + @Override + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + g.setColor(UIManager.getColor("controlDkShadow")); + g.drawLine(x,y, x+w-1,y); + } + }; + bottomPanel.setBorder(b); + SizeGrip rp = new SizeGrip(); + bottomPanel.add(descWindowNavBar, BorderLayout.LINE_START); + bottomPanel.add(rp, BorderLayout.LINE_END); + cp.add(bottomPanel, BorderLayout.SOUTH); + setContentPane(cp); + + applyComponentOrientation(o); + setFocusableWindowState(false); + + // Give apps a chance to decorate us with drop shadows, etc. + if (Util.getShouldAllowDecoratingMainAutoCompleteWindows()) { + PopupWindowDecorator decorator = PopupWindowDecorator.get(); + if (decorator!=null) { + decorator.decorate(this); + } + } + + history = new ArrayList(1); // Usually small + historyPos = -1; + + timerAction = new TimerAction(); + timer = new Timer(INITIAL_TIMER_DELAY, timerAction); + timer.setRepeats(false); + + } + + + /** + * Sets the currently displayed description and updates the history. + * + * @param historyItem The item to add to the history. + */ + private void addToHistory(HistoryEntry historyItem) { + history.add(++historyPos, historyItem); + clearHistoryAfterCurrentPos(); + setActionStates(); + } + + + /** + * Clears the history of viewed descriptions. + */ + private void clearHistory() { + history.clear(); // Try to free some memory. + historyPos = -1; + if (descWindowNavBar!=null) { + setActionStates(); + } + } + + + /** + * Makes the current history page the last one in the history. + */ + private void clearHistoryAfterCurrentPos() { + for (int i=history.size()-1; i>historyPos; i--) { + history.remove(i); + } + setActionStates(); + } + + + /** + * Copies from the description text area, if it is visible and there is + * a selection. + * + * @return Whether a copy occurred. + */ + public boolean copy() { + if (isVisible() && + descArea.getSelectionStart()!=descArea.getSelectionEnd()) { + descArea.copy(); + return true; + } + return false; + } + + + /** + * Returns the localized message for the specified key. + * + * @param key The key. + * @return The localized message. + */ + private String getString(String key) { + if (bundle==null) { + bundle = ResourceBundle.getBundle(MSG); + } + return bundle.getString(key); + } + + + /** + * Called when a hyperlink is clicked. + * + * @param e The event. + */ + public void hyperlinkUpdate(HyperlinkEvent e) { + + HyperlinkEvent.EventType type = e.getEventType(); + if (!type.equals(HyperlinkEvent.EventType.ACTIVATED)) { + return; + } + + // Users can redirect URL's, perhaps to a local copy of documentation. + URL url = e.getURL(); + if (url!=null) { + LinkRedirector redirector = AutoCompletion.getLinkRedirector(); + if (redirector!=null) { + URL newUrl = redirector.possiblyRedirect(url); + if (newUrl!=null && newUrl!=url) { + url = newUrl; + e = new HyperlinkEvent(e.getSource(), e.getEventType(), + newUrl, e.getDescription(), e.getSourceElement()); + } + } + } + + // Custom hyperlink handler for this completion type + ExternalURLHandler handler = ac.getExternalURLHandler(); + if (handler!=null) { + HistoryEntry current = history.get(historyPos); + handler.urlClicked(e, current.completion, this); + return; + } + + // No custom handler... + if (url!=null) { + // Try loading in external browser (Java 6+ only). + try { + Util.browse(new URI(url.toString())); + } catch (/*IO*/URISyntaxException ioe) { + UIManager.getLookAndFeel().provideErrorFeedback(descArea); + } + } + else { // Assume simple function name text, like in c.xml + // FIXME: This is really a hack, and we assume we can find the + // linked-to item in the same CompletionProvider. + AutoCompletePopupWindow parent = + (AutoCompletePopupWindow)getParent(); + CompletionProvider p = parent.getSelection().getProvider(); + if (p instanceof AbstractCompletionProvider) { + String name = e.getDescription(); + List l = ((AbstractCompletionProvider)p). + getCompletionByInputText(name); + if (l!=null && !l.isEmpty()) { + // Just use the 1st one if there's more than 1 + Completion c = l.get(0); + setDescriptionFor(c, true); + } + else { + UIManager.getLookAndFeel().provideErrorFeedback(descArea); + } + } + } + + } + + + /** + * Enables or disables the back and forward actions as appropriate. + */ + private void setActionStates() { + // TODO: Localize this text! + String desc = null; + if (historyPos>0) { + backAction.setEnabled(true); + desc = "Back to " + history.get(historyPos-1); + } + else { + backAction.setEnabled(false); + } + backAction.putValue(Action.SHORT_DESCRIPTION, desc); + if (historyPos>-1 && historyPosnull if none. + * @param addToHistory Whether to add this page to the page history + * (as opposed to clearing it and starting anew). + */ + protected void setDescriptionFor(Completion item, String anchor, + boolean addToHistory) { + timer.stop(); + timerAction.setCompletion(item, anchor, addToHistory); + timer.start(); + } + + + private void setDisplayedDesc(Completion completion, final String anchor, + boolean addToHistory) { + + String desc = completion==null ? null : completion.getSummary(); + if (desc==null) { + desc = "" + getString("NoDescAvailable") + ""; + } + descArea.setText(desc); + if (anchor!=null) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + descArea.scrollToReference(anchor); + } + }); + } + else { + descArea.setCaretPosition(0); // In case of scrolling + } + + if (!addToHistory) { + // Remove everything first if this is going to be the only + // thing in history. + clearHistory(); + } + addToHistory(new HistoryEntry(completion, desc, null)); + + } + + + /** + * {@inheritDoc} + */ + @Override + public void setVisible(boolean visible) { + if (!visible) { + clearHistory(); + } + super.setVisible(visible); + } + + + /** + * Callback for custom ExternalURLHandlers. + * + * @param completion The completion to display. + * @param anchor The anchor in the HTML to jump to, or null + * if none. + */ + public void showSummaryFor(Completion completion, String anchor) { + setDescriptionFor(completion, anchor, true); + } + + + /** + * Called by the parent completion popup window the LookAndFeel is updated. + */ + public void updateUI() { + SwingUtilities.updateComponentTreeUI(this); + // Update editor pane for new font, bg, selection colors, etc. + TipUtil.tweakTipEditorPane(descArea); + scrollPane.setBackground(descArea.getBackground()); + scrollPane.getViewport().setBackground(descArea.getBackground()); + ((JPanel)getContentPane()).setBorder(TipUtil.getToolTipBorder()); + } + + + /** + * A completion and its cached summary text. + */ + private static class HistoryEntry { + + public Completion completion; + public String summary; + public String anchor; + + public HistoryEntry(Completion completion, String summary, + String anchor) { + this.completion = completion; + this.summary = summary; + this.anchor = anchor; + } + + /** + * Overridden to display a short name for the completion, since it's + * used in the tool tips for the "back" and "forward" buttons. + * + * @return A string representation of this history entry. + */ + @Override + public String toString() { + return completion.getInputText(); + } + + } + + + /** + * Action that actually updates the summary text displayed. + */ + private class TimerAction extends AbstractAction { + + private Completion completion; + private String anchor; + private boolean addToHistory; + + /** + * Called when the timer is fired. + */ + public void actionPerformed(ActionEvent e) { + setDisplayedDesc(completion, anchor, addToHistory); + } + + public void setCompletion(Completion c, String anchor, + boolean addToHistory) { + this.completion = c; + this.anchor = anchor; + this.addToHistory = addToHistory; + } + + } + + + /** + * Action that moves to the previous description displayed. + */ + class ToolBarBackAction extends AbstractAction { + + public ToolBarBackAction(boolean ltr) { + String img = "org/fife/ui/autocomplete/arrow_" + + (ltr ? "left.png" : "right.png"); + ClassLoader cl = getClass().getClassLoader(); + Icon icon = new ImageIcon(cl.getResource(img)); + putValue(Action.SMALL_ICON, icon); + } + + public void actionPerformed(ActionEvent e) { + if (historyPos>0) { + HistoryEntry pair = history.get(--historyPos); + descArea.setText(pair.summary); + if (pair.anchor!=null) { + //System.out.println("Scrolling to: " + pair.anchor); + descArea.scrollToReference(pair.anchor); + } + else { + descArea.setCaretPosition(0); + } + setActionStates(); + } + } + + } + + + /** + * Action that moves to the previous description displayed. + */ + class ToolBarForwardAction extends AbstractAction { + + public ToolBarForwardAction(boolean ltr) { + String img = "org/fife/ui/autocomplete/arrow_" + + (ltr ? "right.png" : "left.png"); + ClassLoader cl = getClass().getClassLoader(); + Icon icon = new ImageIcon(cl.getResource(img)); + putValue(Action.SMALL_ICON, icon); + } + + public void actionPerformed(ActionEvent e) { + if (history!=null && historyPosnull if nothing is selected. + * + * @return The selected value. + */ + public Completion getSelection() { + return isShowing() ? (Completion) list.getSelectedValue() : lastSelection; + } + + + /** + * Inserts the currently selected completion. + * + * @see #getSelection() + */ + private void insertSelectedCompletion() { + Completion comp = getSelection(); + ac.insertCompletion(comp); + } + + + /** + * Registers keyboard actions to listen for in the text component and + * intercept. + * + * @see #uninstallKeyBindings() + */ + private void installKeyBindings() { + + if (AutoCompletion.isDebug()) { + FRLogger.getLogger().debug("PopupWindow: Installing keybindings"); + } + + if (escapeKap == null) { // Lazily create actions. + createKeyActionPairs(); + } + + JTextComponent comp = ac.getTextComponent(); + InputMap im = comp.getInputMap(); + ActionMap am = comp.getActionMap(); + + replaceAction(im, am, KeyEvent.VK_ESCAPE, escapeKap, oldEscape); + if (AutoCompletion.isDebug() && oldEscape.action == escapeKap.action) { + Thread.dumpStack(); + } + replaceAction(im, am, KeyEvent.VK_UP, upKap, oldUp); + replaceAction(im, am, KeyEvent.VK_LEFT, leftKap, oldLeft); + replaceAction(im, am, KeyEvent.VK_DOWN, downKap, oldDown); + replaceAction(im, am, KeyEvent.VK_RIGHT, rightKap, oldRight); + replaceAction(im, am, KeyEvent.VK_ENTER, enterKap, oldEnter); + replaceAction(im, am, KeyEvent.VK_TAB, tabKap, oldTab); + replaceAction(im, am, KeyEvent.VK_HOME, homeKap, oldHome); + replaceAction(im, am, KeyEvent.VK_END, endKap, oldEnd); + replaceAction(im, am, KeyEvent.VK_PAGE_UP, pageUpKap, oldPageUp); + replaceAction(im, am, KeyEvent.VK_PAGE_DOWN, pageDownKap, oldPageDown); + + // Make Ctrl+C copy from description window. This isn't done + // automagically because the desc. window is not focusable, and copying + // from text components can only be done from focused components. + KeyStroke ks = getCopyKeyStroke(); + oldCtrlC.key = im.get(ks); + im.put(ks, ctrlCKap.key); + oldCtrlC.action = am.get(ctrlCKap.key); + am.put(ctrlCKap.key, ctrlCKap.action); + + comp.addCaretListener(this); + + } + + + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + insertSelectedCompletion(); + } + } + + + public void mouseEntered(MouseEvent e) { + } + + + public void mouseExited(MouseEvent e) { + } + + + public void mousePressed(MouseEvent e) { + } + + + public void mouseReleased(MouseEvent e) { + } + + + /** + * Positions the description window relative to the completion choices + * window. We assume there is room on one side of the other for this + * entire window to fit. + */ + private void positionDescWindow() { + + boolean showDescWindow = descWindow != null && ac.isShowDescWindow(); + if (!showDescWindow) { + return; + } + + // Don't use getLocationOnScreen() as this throws an exception if + // window isn't visible yet, but getLocation() doesn't, and is in + // screen coordinates! + Point p = getLocation(); + Rectangle screenBounds = Util.getScreenBoundsForPoint(p.x, p.y); + //Dimension screenSize = getToolkit().getScreenSize(); + //int totalH = Math.max(getHeight(), descWindow.getHeight()); + + // Try to position to the right first (LTR) + int x; + if (ac.getTextComponentOrientation().isLeftToRight()) { + x = getX() + getWidth() + DIS; + if (x + descWindow.getWidth() > screenBounds.x + screenBounds.width) { // doesn't fit + x = getX() - DIS - descWindow.getWidth(); + } + } else { // RTL + x = getX() - DIS - descWindow.getWidth(); + if (x < screenBounds.x) { // Doesn't fit + x = getX() + getWidth() + DIS; + } + } + + int y = getY(); + if (aboveCaret) { + y = y + getHeight() - descWindow.getHeight(); + } + + if (x != descWindow.getX() || y != descWindow.getY()) { + descWindow.setLocation(x, y); + } + + } + + + /** + * "Puts back" the original key/Action pair for a keystroke. This is used + * when this popup is hidden. + * + * @param im The input map. + * @param am The action map. + * @param key The keystroke whose key/Action pair to change. + * @param kap The (original) key/Action pair. + * @see #replaceAction(InputMap, ActionMap, int, KeyActionPair, KeyActionPair) + */ + private void putBackAction(InputMap im, ActionMap am, int key, + KeyActionPair kap) { + KeyStroke ks = KeyStroke.getKeyStroke(key, 0); + am.put(im.get(ks), kap.action); // Original action for the "new" key + im.put(ks, kap.key); // Original key for the keystroke. + } + + + /** + * Replaces a key/Action pair in an InputMap and ActionMap with a new + * pair. + * + * @param im The input map. + * @param am The action map. + * @param key The keystroke whose information to replace. + * @param kap The new key/Action pair for key. + * @param old A buffer in which to place the old key/Action pair. + * @see #putBackAction(InputMap, ActionMap, int, KeyActionPair) + */ + private void replaceAction(InputMap im, ActionMap am, int key, + KeyActionPair kap, KeyActionPair old) { + KeyStroke ks = KeyStroke.getKeyStroke(key, 0); + old.key = im.get(ks); + im.put(ks, kap.key); + old.action = am.get(kap.key); + am.put(kap.key, kap.action); + } + + + /** + * Selects the first item in the completion list. + * + * @see #selectLastItem() + */ + private void selectFirstItem() { + if (model.getSize() > 0) { + list.setSelectedIndex(0); + list.ensureIndexIsVisible(0); + } + } + + + /** + * Selects the last item in the completion list. + * + * @see #selectFirstItem() + */ + private void selectLastItem() { + int index = model.getSize() - 1; + if (index > -1) { + list.setSelectedIndex(index); + list.ensureIndexIsVisible(index); + } + } + + + /** + * Selects the next item in the completion list. + * + * @see #selectPreviousItem() + */ + private void selectNextItem() { + int index = list.getSelectedIndex(); + if (index > -1) { + index = (index + 1) % model.getSize(); + list.setSelectedIndex(index); + list.ensureIndexIsVisible(index); + } + } + + + /** + * Selects the completion item one "page down" from the currently selected + * one. + * + * @see #selectPageUpItem() + */ + private void selectPageDownItem() { + int visibleRowCount = list.getVisibleRowCount(); + int i = Math.min(list.getModel().getSize() - 1, + list.getSelectedIndex() + visibleRowCount); + list.setSelectedIndex(i); + list.ensureIndexIsVisible(i); + } + + + /** + * Selects the completion item one "page up" from the currently selected + * one. + * + * @see #selectPageDownItem() + */ + private void selectPageUpItem() { + int visibleRowCount = list.getVisibleRowCount(); + int i = Math.max(0, list.getSelectedIndex() - visibleRowCount); + list.setSelectedIndex(i); + list.ensureIndexIsVisible(i); + } + + + /** + * Selects the previous item in the completion list. + * + * @see #selectNextItem() + */ + private void selectPreviousItem() { + int index = list.getSelectedIndex(); + switch (index) { + case 0: + index = list.getModel().getSize() - 1; + break; + case -1: // Check for an empty list (would be an error) + index = list.getModel().getSize() - 1; + if (index == -1) { + return; + } + break; + default: + index = index - 1; + break; + } + list.setSelectedIndex(index); + list.ensureIndexIsVisible(index); + } + + + /** + * Sets the completions to display in the choices list. The first + * completion is selected. + * + * @param completions The completions to display. + */ + public void setCompletions(List completions) { + model.setContents(completions); + selectFirstItem(); + } + + + /** + * Sets the size of the description window. + * + * @param size The new size. This cannot be null. + */ + public void setDescriptionWindowSize(Dimension size) { + if (descWindow != null) { + descWindow.setSize(size); + } else { + preferredDescWindowSize = size; + } + } + + + /** + * Sets the default list cell renderer to use when a completion provider + * does not supply its own. + * + * @param renderer The renderer to use. If this is null, + * a default renderer is used. + * @see #getListCellRenderer() + */ + public void setListCellRenderer(ListCellRenderer renderer) { + DelegatingCellRenderer dcr = (DelegatingCellRenderer) list. + getCellRenderer(); + dcr.setFallbackCellRenderer(renderer); + } + + + /** + * Sets the location of this window to be "good" relative to the specified + * rectangle. That rectangle should be the location of the text + * component's caret, in screen coordinates. + * + * @param r The text component's caret position, in screen coordinates. + */ + public void setLocationRelativeTo(Rectangle r) { + + // Multi-monitor support - make sure the completion window (and + // description window, if applicable) both fit in the same window in + // a multi-monitor environment. To do this, we decide which monitor + // the rectangle "r" is in, and use that one (just pick top-left corner + // as the defining point). + Rectangle screenBounds = Util.getScreenBoundsForPoint(r.x, r.y); + //Dimension screenSize = getToolkit().getScreenSize(); + + boolean showDescWindow = descWindow != null && ac.isShowDescWindow(); + int totalH = getHeight(); + if (showDescWindow) { + totalH = Math.max(totalH, descWindow.getHeight()); + } + + // Try putting our stuff "below" the caret first. We assume that the + // entire height of our stuff fits on the screen one way or the other. + aboveCaret = false; + int y = r.y + r.height + VERTICAL_SPACE; + if (y + totalH > screenBounds.height) { + y = r.y - VERTICAL_SPACE - getHeight(); + aboveCaret = true; + } + + // Get x-coordinate of completions. Try to align left edge with the + // caret first. + int x = r.x; + if (!ac.getTextComponentOrientation().isLeftToRight()) { + x -= getWidth(); // RTL => align right edge + } + if (x < screenBounds.x) { + x = screenBounds.x; + } else if (x + getWidth() > screenBounds.x + screenBounds.width) { // completions don't fit + x = screenBounds.x + screenBounds.width - getWidth(); + } + + setLocation(x, y); + + // Position the description window, if necessary. + if (showDescWindow) { + positionDescWindow(); + } + + } + + + /** + * Toggles the visibility of this popup window. + * + * @param visible Whether this window should be visible. + */ + @Override + public void setVisible(boolean visible) { + + if (visible != isVisible()) { + + if (visible) { + installKeyBindings(); + lastLine = ac.getLineOfCaret(); + selectFirstItem(); + if (descWindow == null && ac.isShowDescWindow()) { + descWindow = createDescriptionWindow(); + positionDescWindow(); + } + // descWindow needs a kick-start the first time it's displayed. + // Also, the newly-selected item in the choices list is + // probably different from the previous one anyway. + if (descWindow != null) { + Completion c = (Completion) list.getSelectedValue(); + if (c != null) { + descWindow.setDescriptionFor(c); + } + } + } else { + uninstallKeyBindings(); + } + + super.setVisible(visible); + + // Some languages, such as Java, can use quite a lot of memory + // when displaying hundreds of completion choices. We pro-actively + // clear our list model here to make them available for GC. + // Otherwise, they stick around, and consider the following: a + // user starts code-completion for Java 5 SDK classes, then hides + // the dialog, then changes the "class path" to use a Java 6 SDK + // instead. On pressing Ctrl+space, a new array of Completions is + // created. If this window holds on to the previous Completions, + // you're getting roughly 2x the necessary Completions in memory + // until the Completions are actually passed to this window. + if (!visible) { // Do after super.setVisible(false) + lastSelection = (Completion) list.getSelectedValue(); + model.clear(); + } + + // Must set descWindow's visibility one way or the other each time, + // because of the way child JWindows' visibility is handled - in + // some ways it's dependent on the parent, in other ways it's not. + if (descWindow != null) { + descWindow.setVisible(visible && ac.isShowDescWindow()); + } + + } + + } + + + /** + * Stops intercepting certain keystrokes from the text component. + * + * @see #installKeyBindings() + */ + private void uninstallKeyBindings() { + + if (AutoCompletion.isDebug()) { + FRLogger.getLogger().debug("PopupWindow: Removing keybindings"); + } + + JTextComponent comp = ac.getTextComponent(); + InputMap im = comp.getInputMap(); + ActionMap am = comp.getActionMap(); + + putBackAction(im, am, KeyEvent.VK_ESCAPE, oldEscape); + putBackAction(im, am, KeyEvent.VK_UP, oldUp); + putBackAction(im, am, KeyEvent.VK_DOWN, oldDown); + putBackAction(im, am, KeyEvent.VK_LEFT, oldLeft); + putBackAction(im, am, KeyEvent.VK_RIGHT, oldRight); + putBackAction(im, am, KeyEvent.VK_ENTER, oldEnter); + putBackAction(im, am, KeyEvent.VK_TAB, oldTab); + putBackAction(im, am, KeyEvent.VK_HOME, oldHome); + putBackAction(im, am, KeyEvent.VK_END, oldEnd); + putBackAction(im, am, KeyEvent.VK_PAGE_UP, oldPageUp); + putBackAction(im, am, KeyEvent.VK_PAGE_DOWN, oldPageDown); + + // Ctrl+C + KeyStroke ks = getCopyKeyStroke(); + am.put(im.get(ks), oldCtrlC.action); // Original action + im.put(ks, oldCtrlC.key); // Original key + + comp.removeCaretListener(this); + + } + + + /** + * Updates the LookAndFeel of this window and the description + * window. + */ + public void updateUI() { + SwingUtilities.updateComponentTreeUI(this); + if (descWindow != null) { + descWindow.updateUI(); + } + } + + + /** + * Called when a new item is selected in the popup list. + * + * @param e The event. + */ + public void valueChanged(ListSelectionEvent e) { + if (!e.getValueIsAdjusting()) { + Object value = list.getSelectedValue(); + if (value != null && descWindow != null) { + descWindow.setDescriptionFor((Completion) value); + positionDescWindow(); + } + } + } + + + class CopyAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + boolean doNormalCopy = false; + if (descWindow != null && descWindow.isVisible()) { + doNormalCopy = !descWindow.copy(); + } + if (doNormalCopy) { + ac.getTextComponent().copy(); + } + } + + } + + + class DownAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + if (isVisible()) { + selectNextItem(); + } + } + + } + + + class EndAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + if (isVisible()) { + selectLastItem(); + } + } + + } + + + class EnterAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + if (isVisible()) { + insertSelectedCompletion(); + } + } + + } + + + class EscapeAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + if (isVisible()) { + setVisible(false); + } + } + + } + + + class HomeAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + if (isVisible()) { + selectFirstItem(); + } + } + + } + + + /** + * A mapping from a key (an Object) to an Action. + */ + private static class KeyActionPair { + + public Object key; + public Action action; + + public KeyActionPair() { + } + + public KeyActionPair(Object key, Action a) { + this.key = key; + this.action = a; + } + + } + + + class LeftAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + if (isVisible()) { + JTextComponent comp = ac.getTextComponent(); + Caret c = comp.getCaret(); + int dot = c.getDot(); + if (dot > 0) { + c.setDot(--dot); + // Ensure moving left hasn't moved us up a line, thus + // hiding the popup window. + if (comp.isVisible()) { + if (lastLine != -1) { + doAutocomplete(); + } + } + } + } + } + + } + + + class PageDownAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + if (isVisible()) { + selectPageDownItem(); + } + } + + } + + + class PageUpAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + if (isVisible()) { + selectPageUpItem(); + } + } + + } + + + /** + * The actual list of completion choices in this popup window. + */ + private class PopupList extends JList { + + public PopupList(CompletionListModel model) { + super(model); + } + + @Override + public void setUI(ListUI ui) { + if (Util.getUseSubstanceRenderers() && + SUBSTANCE_LIST_UI.equals(ui.getClass().getName())) { + // Substance requires its special ListUI be installed for + // its renderers to actually render (!), but long completion + // lists (e.g. PHPCompletionProvider in RSTALanguageSupport) + // will simply populate too slowly on initial display (when + // calculating preferred size of all items), so in this case + // we give a prototype cell value. + CompletionProvider p = ac.getCompletionProvider(); + BasicCompletion bc = new BasicCompletion(p, "Hello world"); + setPrototypeCellValue(bc); + } else { + // Our custom UI that is faster for long HTML completion lists. + ui = new FastListUI(); + setPrototypeCellValue(null); + } + super.setUI(ui); + } + + } + + + class RightAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + if (isVisible()) { + JTextComponent comp = ac.getTextComponent(); + Caret c = comp.getCaret(); + int dot = c.getDot(); + if (dot < comp.getDocument().getLength()) { + c.setDot(++dot); + // Ensure moving right hasn't moved us up a line, thus + // hiding the popup window. + if (comp.isVisible()) { + if (lastLine != -1) { + doAutocomplete(); + } + } + } + } + } + + } + + + class UpAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + if (isVisible()) { + selectPreviousItem(); + } + } + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/AutoCompletion.java b/designer-base/src/com/fr/design/gui/autocomplete/AutoCompletion.java new file mode 100644 index 0000000000..36c56ae182 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/AutoCompletion.java @@ -0,0 +1,1329 @@ +/* + * 12/21/2008 + * + * AutoCompletion.java - Handles auto-completion for a text component. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import javax.swing.*; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.*; +import java.awt.*; +import java.awt.event.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.List; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + + +/** + * Adds auto-completion to a text component. Provides a popup window with a + * list of auto-complete choices on a given keystroke, such as Crtrl+Space.

+ *

+ * Depending on the {@link CompletionProvider} installed, the following + * auto-completion features may be enabled: + *

+ *

    + *
  • An auto-complete choices list made visible via e.g. Ctrl+Space
  • + *
  • A "description" window displayed alongside the choices list that + * provides documentation on the currently selected completion choice + * (as seen in Eclipse and NetBeans).
  • + *
  • Parameter assistance. If this is enabled, if the user enters a + * "parameterized" completion, such as a method or a function, then + * they will receive a tool tip describing the arguments they have to + * enter to the completion. Also, the arguments can be navigated via + * tab and shift+tab (a la Eclipse and NetBeans).
  • + *
+ * + * @author Robert Futrell + * @version 1.0 + */ +/* + * This class handles intercepting window and hierarchy events from the text + * component, so the popup window is only visible when it should be visible. + * It also handles communication between the CompletionProvider and the actual + * popup Window. + */ +public class AutoCompletion { + + /** + * The text component we're providing completion for. + */ + private JTextComponent textComponent; + + /** + * The parent window of {@link #textComponent}. + */ + private Window parentWindow; + + /** + * The popup window containing completion choices. + */ + private AutoCompletePopupWindow popupWindow; + + /** + * The preferred size of the completion choices window. This field exists + * because the user will likely set the preferred size of the window + * before it is actually created. + */ + private Dimension preferredChoicesWindowSize; + + /** + * The preferred size of the optional description window. This field + * only exists because the user may (and usually will) set the size of + * the description window before it exists (it must be parented to a + * Window). + */ + private Dimension preferredDescWindowSize; + + /** + * Manages any parameterized completions that are inserted. + */ + private ParameterizedCompletionContext pcc; + + /** + * Provides the completion options relevant to the current caret position. + */ + private CompletionProvider provider; + + /** + * The renderer to use for the completion choices. If this is + * null, then a default renderer is used. + */ + private ListCellRenderer renderer; + + /** + * The handler to use when an external URL is clicked in the help + * documentation. + */ + private ExternalURLHandler externalURLHandler; + + /** + * An optional redirector that converts URL's to some other location before + * being handed over to externalURLHandler. + */ + private static LinkRedirector linkRedirector; + + /** + * Whether the description window should be displayed along with the + * completion choice window. + */ + private boolean showDescWindow; + + /** + * Whether auto-complete is enabled. + */ + private boolean autoCompleteEnabled; + + /** + * Whether the auto-activation of auto-complete (after a delay, after the + * user types an appropriate character) is enabled. + */ + private boolean autoActivationEnabled; + + /** + * Whether or not, when there is only a single auto-complete option + * that matches the text at the current text position, that text should + * be auto-inserted, instead of the completion window displaying. + */ + private boolean autoCompleteSingleChoices; + + /** + * Whether parameter assistance is enabled. + */ + private boolean parameterAssistanceEnabled; + + /** + * A renderer used for {@link Completion}s in the optional parameter + * choices popup window (displayed when a {@link ParameterizedCompletion} + * is code-completed). If this isn't set, a default renderer is used. + */ + private ListCellRenderer paramChoicesRenderer; + + /** + * The keystroke that triggers the completion window. + */ + private KeyStroke trigger; + + /** + * The previous key in the text component's InputMap for the + * trigger key. + */ + private Object oldTriggerKey; + + /** + * The action previously assigned to {@link #trigger}, so we can reset it + * if the user disables auto-completion. + */ + private Action oldTriggerAction; + + /** + * The previous key in the text component's InputMap for the + * parameter completion trigger key. + */ + private Object oldParenKey; + + /** + * The action previously assigned to the parameter completion key, so we + * can reset it when we uninstall. + */ + private Action oldParenAction; + + /** + * Listens for events in the parent window that affect the visibility of + * the popup windows. + */ + private ParentWindowListener parentWindowListener; + + /** + * Listens for events from the text component that affect the visibility + * of the popup windows. + */ + private TextComponentListener textComponentListener; + + /** + * Listens for events in the text component that cause the popup windows + * to automatically activate. + */ + private AutoActivationListener autoActivationListener; + + /** + * Listens for LAF changes so the auto-complete windows automatically + * update themselves accordingly. + */ + private LookAndFeelChangeListener lafListener; + + /** + * The key used in the input map for the AutoComplete action. + */ + private static final String PARAM_TRIGGER_KEY = "AutoComplete"; + + /** + * Key used in the input map for the parameter completion action. + */ + private static final String PARAM_COMPLETE_KEY = "AutoCompletion.FunctionStart"; + + /** + * Stores how to render auto-completion-specific highlights in text + * components. + */ + private static final AutoCompletionStyleContext STYLE_CONTEXT = + new AutoCompletionStyleContext(); + + /** + * Whether debug messages should be printed to stdout as AutoCompletion + * runs. + */ + private static final boolean DEBUG = initDebug(); + + + /** + * Constructor. + * + * @param provider The completion provider. This cannot be + * null. + */ + public AutoCompletion(CompletionProvider provider) { + + setChoicesWindowSize(350, 200); + setDescriptionWindowSize(350, 250); + + setCompletionProvider(provider); + setTriggerKey(getDefaultTriggerKey()); + setAutoCompleteEnabled(true); + setAutoCompleteSingleChoices(true); + setAutoActivationEnabled(false); + setShowDescWindow(false); + parentWindowListener = new ParentWindowListener(); + textComponentListener = new TextComponentListener(); + autoActivationListener = new AutoActivationListener(); + lafListener = new LookAndFeelChangeListener(); + + } + + + /** + * Displays the popup window. Hosting applications can call this method + * to programmatically begin an auto-completion operation. + */ + public void doCompletion() { + refreshPopupWindow(); + } + + + /** + * Returns the delay between when the user types a character and when the + * code completion popup should automatically appear (if applicable). + * + * @return The delay, in milliseconds. + * @see #setAutoActivationDelay(int) + */ + public int getAutoActivationDelay() { + return autoActivationListener.timer.getDelay(); + } + + + /** + * Returns whether, if a single auto-complete choice is available, it + * should be automatically inserted, without displaying the popup menu. + * + * @return Whether to auto-complete single choices. + * @see #setAutoCompleteSingleChoices(boolean) + */ + public boolean isAutoCompleteSingleChoices() { + return autoCompleteSingleChoices; + } + + + /** + * Returns the completion provider. + * + * @return The completion provider. + */ + public CompletionProvider getCompletionProvider() { + return provider; + } + + + /** + * Returns whether debug is enabled for AutoCompletion. + * + * @return Whether debug is enabled. + */ + static boolean isDebug() { + return DEBUG; + } + + + /** + * Returns the default auto-complete "trigger key" for this OS. For + * Windows, for example, it is Ctrl+Space. + * + * @return The default auto-complete trigger key. + */ + public static KeyStroke getDefaultTriggerKey() { + // Default to CTRL, even on Mac, since Ctrl+Space activates Spotlight + return KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, DEFAULT_MODIFIER); + } + + + /** + * Returns the handler to use when an external URL is clicked in the + * description window. + * + * @return The handler. + * @see #setExternalURLHandler(ExternalURLHandler) + * @see #getLinkRedirector() + */ + public ExternalURLHandler getExternalURLHandler() { + return externalURLHandler; + } + + + int getLineOfCaret() { + Document doc = textComponent.getDocument(); + Element root = doc.getDefaultRootElement(); + return root.getElementIndex(textComponent.getCaretPosition()); + } + + + /** + * Returns the link redirector, if any. + * + * @return The link redirector, or null if none. + * @see #setLinkRedirector(LinkRedirector) + */ + public static LinkRedirector getLinkRedirector() { + return linkRedirector; + } + + + /** + * Returns the default list cell renderer used when a completion provider + * does not supply its own. + * + * @return The default list cell renderer. + * @see #setListCellRenderer(ListCellRenderer) + */ + public ListCellRenderer getListCellRenderer() { + return renderer; + } + + + /** + * Returns the renderer to use for {@link Completion}s in the optional + * parameter choices popup window (displayed when a + * {@link ParameterizedCompletion} is code-completed). If this returns + * null, a default renderer is used. + * + * @return The renderer to use. + * @see #setParamChoicesRenderer(ListCellRenderer) + * @see #isParameterAssistanceEnabled() + */ + public ListCellRenderer getParamChoicesRenderer() { + return paramChoicesRenderer; + } + + + /** + * Returns the text to replace with in the document. This is a + * "last-chance" hook for subclasses to make special modifications to the + * completion text inserted. The default implementation simply returns + * c.getReplacementText(). You usually will not need to modify + * this method. + * + * @param c The completion being inserted. + * @param doc The document being modified. + * @param start The start of the text being replaced. + * @param len The length of the text being replaced. + * @return The text to replace with. + */ + protected String getReplacementText(Completion c, Document doc, int start, + int len) { + return c.getReplacementText(); + } + + + /** + * Returns whether the "description window" should be shown alongside + * the completion window. + * + * @return Whether the description window should be shown. + * @see #setShowDescWindow(boolean) + */ + public boolean isShowDescWindow() { + return showDescWindow; + } + + + /** + * Returns the style context describing how auto-completion related + * highlights in the editor are rendered. + * + * @return The style context. + */ + public static AutoCompletionStyleContext getStyleContext() { + return STYLE_CONTEXT; + } + + + /** + * Returns the text component for which auto-completion is enabled. + * + * @return The text component, or null if this + * {@link AutoCompletion} is not installed on any text component. + * @see #install(JTextComponent) + */ + public JTextComponent getTextComponent() { + return textComponent; + } + + + /** + * Returns the orientation of the text component we're installed to. + * + * @return The orientation of the text component, or null if + * we are not installed on one. + */ + ComponentOrientation getTextComponentOrientation() { + return textComponent == null ? null : + textComponent.getComponentOrientation(); + } + + + /** + * Returns the "trigger key" used for auto-complete. + * + * @return The trigger key. + * @see #setTriggerKey(KeyStroke) + */ + public KeyStroke getTriggerKey() { + return trigger; + } + + + /** + * Hides any child windows being displayed by the auto-completion system. + * + * @return Whether any windows were visible. + */ + public boolean hideChildWindows() { + //return hidePopupWindow() || hideToolTipWindow(); + boolean res = hidePopupWindow(); + res |= hideParameterCompletionPopups(); + return res; + } + + + /** + * Hides and disposes of any parameter completion-related popups. + * + * @return Whether any such windows were visible (and thus hidden). + */ + private boolean hideParameterCompletionPopups() { + if (pcc != null) { + pcc.deactivate(); + pcc = null; + return true; + } + return false; + } + + + /** + * Hides the popup window, if it is visible. + * + * @return Whether the popup window was visible. + */ + private boolean hidePopupWindow() { + if (popupWindow != null) { + if (popupWindow.isVisible()) { + popupWindow.setVisible(false); + return true; + } + } + return false; + } + + + /** + * Determines whether debug should be enabled for the AutoCompletion + * library. This method checks a system property, but takes care of + * {@link SecurityException}s in case we're in an applet or WebStart. + * + * @return Whether debug should be enabled. + */ + private static final boolean initDebug() { + boolean debug = false; + try { + debug = Boolean.getBoolean("AutoCompletion.debug"); + } catch (SecurityException se) { // We're in an applet or WebStart. + debug = false; + } + return debug; + } + + + /** + * Inserts a completion. Any time a code completion event occurs, the + * actual text insertion happens through this method. + * + * @param c A completion to insert. This cannot be null. + */ + protected final void insertCompletion(Completion c) { + insertCompletion(c, false); + } + + + /** + * Inserts a completion. Any time a code completion event occurs, the + * actual text insertion happens through this method. + * + * @param c A completion to insert. This cannot be null. + * @param typedParamListStartChar Whether the parameterized completion + * start character was typed (typically '('). + */ + protected void insertCompletion(Completion c, + boolean typedParamListStartChar) { + + JTextComponent textComp = getTextComponent(); + String alreadyEntered = c.getAlreadyEntered(textComp); + hidePopupWindow(); + Caret caret = textComp.getCaret(); + + int dot = caret.getDot(); + int len = alreadyEntered.length(); + int start = dot - len; + String replacement = getReplacementText(c, textComp.getDocument(), + start, len); + + caret.setDot(start); + caret.moveDot(dot); + textComp.replaceSelection(replacement); + + if (isParameterAssistanceEnabled() && + (c instanceof ParameterizedCompletion)) { + ParameterizedCompletion pc = (ParameterizedCompletion) c; + startParameterizedCompletionAssistance(pc, typedParamListStartChar); + } + + } + + + /** + * Installs this auto-completion on a text component. If this + * {@link AutoCompletion} is already installed on another text component, + * it is uninstalled first. + * + * @param c The text component. + * @see #uninstall() + */ + public void install(JTextComponent c) { + + if (textComponent != null) { + uninstall(); + } + + this.textComponent = c; + installTriggerKey(getTriggerKey()); + + // Install the function completion key, if there is one. + // NOTE: We cannot do this if the start char is ' ' (e.g. just a space + // between the function name and parameters) because it overrides + // RSTA's special space action. It seems KeyStorke.getKeyStroke(' ') + // hoses ctrl+space, shift+space, etc., even though I think it + // shouldn't... + char start = provider.getParameterListStart(); + if (start != 0 && start != ' ') { + InputMap im = c.getInputMap(); + ActionMap am = c.getActionMap(); + KeyStroke ks = KeyStroke.getKeyStroke(start); + oldParenKey = im.get(ks); + im.put(ks, PARAM_COMPLETE_KEY); + oldParenAction = am.get(PARAM_COMPLETE_KEY); + am.put(PARAM_COMPLETE_KEY, + new ParameterizedCompletionStartAction(start)); + } + + textComponentListener.addTo(this.textComponent); + // In case textComponent is already in a window... + textComponentListener.hierarchyChanged(null); + + if (isAutoActivationEnabled()) { + autoActivationListener.addTo(this.textComponent); + } + + UIManager.addPropertyChangeListener(lafListener); + updateUI(); // In case there have been changes since we uninstalled + + } + + + /** + * Installs a "trigger key" action onto the current text component. + * + * @param ks The keystroke that should trigger the action. + * @see #uninstallTriggerKey() + */ + private void installTriggerKey(KeyStroke ks) { + InputMap im = textComponent.getInputMap(); + oldTriggerKey = im.get(ks); + im.put(ks, PARAM_TRIGGER_KEY); + ActionMap am = textComponent.getActionMap(); + oldTriggerAction = am.get(PARAM_TRIGGER_KEY); + am.put(PARAM_TRIGGER_KEY, new AutoCompleteAction()); + } + + + /** + * Returns whether auto-activation is enabled (that is, whether the + * completion popup will automatically appear after a delay when the user + * types an appropriate character). Note that this parameter will be + * ignored if auto-completion is disabled. + * + * @return Whether auto-activation is enabled. + * @see #setAutoActivationEnabled(boolean) + * @see #getAutoActivationDelay() + * @see #isAutoCompleteEnabled() + */ + public boolean isAutoActivationEnabled() { + return autoActivationEnabled; + } + + + /** + * Returns whether auto-completion is enabled. + * + * @return Whether auto-completion is enabled. + * @see #setAutoCompleteEnabled(boolean) + */ + public boolean isAutoCompleteEnabled() { + return autoCompleteEnabled; + } + + + /** + * Returns whether parameter assistance is enabled. + * + * @return Whether parameter assistance is enabled. + * @see #setParameterAssistanceEnabled(boolean) + */ + public boolean isParameterAssistanceEnabled() { + return parameterAssistanceEnabled; + } + + + /** + * Returns whether the completion popup window is visible. + * + * @return Whether the completion popup window is visible. + */ + public boolean isPopupVisible() { + return popupWindow != null && popupWindow.isVisible(); + } + + + /** + * Refreshes the popup window. First, this method gets the possible + * completions for the current caret position. If there are none, and the + * popup is visible, it is hidden. If there are some completions and the + * popup is hidden, it is made visible and made to display the completions. + * If there are some completions and the popup is visible, its list is + * updated to the current set of completions. + * + * @return The current line number of the caret. + */ + protected int refreshPopupWindow() { + // A return value of null => don't suggest completions + String text = provider.getAlreadyEnteredText(textComponent); + if (text == null && !isPopupVisible()) { + return getLineOfCaret(); + } + // If the popup is currently visible, and they type a space (or any + // character that resets the completion list to "all completions"), + // the popup window should be hidden instead of being reset to show + // everything. + int textLen = text == null ? 0 : text.length(); + if (textLen == 0 && isPopupVisible()) { + hidePopupWindow(); + return getLineOfCaret(); + } + final List completions = provider.getCompletions(textComponent); + int count = completions.size(); + if (needSetPopupWindow(count, textLen)) { + if (popupWindow == null) { + popupWindow = createAutoCompletePopupWindow(); + } + popupWindow.setCompletions(completions); + if (!popupWindow.isVisible()) { + Rectangle r = null; + try { + r = textComponent.modelToView(textComponent.getCaretPosition()); + } catch (BadLocationException ble) { + return -1; + } + Point p = new Point(r.x, r.y); + SwingUtilities.convertPointToScreen(p, textComponent); + r.x = p.x; + r.y = p.y; + popupWindow.setLocationRelativeTo(r); + popupWindow.setVisible(true); + } + } else if (count == 1) { // !isPopupVisible && autoCompleteSingleChoices + SwingUtilities.invokeLater(new Runnable() { + public void run() { + insertCompletion(completions.get(0)); + } + }); + } else { + hidePopupWindow(); + } + return getLineOfCaret(); + } + + private boolean needSetPopupWindow(int count, int textLen) { + return (count == 1 && (isPopupVisible() || textLen == 0)) + || (count == 1 && !isAutoCompleteSingleChoices()) + || count > 1; + } + + private AutoCompletePopupWindow createAutoCompletePopupWindow() { + AutoCompletePopupWindow popupWindow = new AutoCompletePopupWindow(parentWindow, this); + // Completion is usually done for code, which is always done + // LTR, so make completion stuff RTL only if text component is + // also RTL. + popupWindow.applyComponentOrientation( + getTextComponentOrientation()); + if (renderer != null) { + popupWindow.setListCellRenderer(renderer); + } + if (preferredChoicesWindowSize != null) { + popupWindow.setSize(preferredChoicesWindowSize); + } + if (preferredDescWindowSize != null) { + popupWindow.setDescriptionWindowSize( + preferredDescWindowSize); + } + return popupWindow; + } + + /** + * Sets the delay between when the user types a character and when the + * code completion popup should automatically appear (if applicable). + * + * @param ms The delay, in milliseconds. This should be greater than zero. + * @see #getAutoActivationDelay() + */ + public void setAutoActivationDelay(int ms) { + ms = Math.max(0, ms); + autoActivationListener.timer.stop(); + autoActivationListener.timer.setInitialDelay(ms); + } + + + /** + * Toggles whether auto-activation is enabled. Note that auto-activation + * also depends on auto-completion itself being enabled. + * + * @param enabled Whether auto-activation is enabled. + * @see #isAutoActivationEnabled() + * @see #setAutoActivationDelay(int) + */ + public void setAutoActivationEnabled(boolean enabled) { + if (enabled != autoActivationEnabled) { + autoActivationEnabled = enabled; + if (textComponent != null) { + if (autoActivationEnabled) { + autoActivationListener.addTo(textComponent); + } else { + autoActivationListener.removeFrom(textComponent); + } + } + } + } + + + /** + * Sets whether auto-completion is enabled. + * + * @param enabled Whether auto-completion is enabled. + * @see #isAutoCompleteEnabled() + */ + public void setAutoCompleteEnabled(boolean enabled) { + if (enabled != autoCompleteEnabled) { + autoCompleteEnabled = enabled; + hidePopupWindow(); + } + } + + + /** + * Sets whether, if a single auto-complete choice is available, it should + * be automatically inserted, without displaying the popup menu. + * + * @param autoComplete Whether to auto-complete single choices. + * @see #isAutoCompleteSingleChoices() + */ + public void setAutoCompleteSingleChoices(boolean autoComplete) { + autoCompleteSingleChoices = autoComplete; + } + + + /** + * Sets the completion provider being used. + * + * @param provider The new completion provider. This cannot be + * null. + * @throws IllegalArgumentException If provider is + * null. + */ + public void setCompletionProvider(CompletionProvider provider) { + if (provider == null) { + throw new IllegalArgumentException("provider cannot be null"); + } + this.provider = provider; + hidePopupWindow(); // In case new choices should be displayed. + } + + + /** + * Sets the size of the completion choices window. + * + * @param w The new width. + * @param h The new height. + * @see #setDescriptionWindowSize(int, int) + */ + public void setChoicesWindowSize(int w, int h) { + preferredChoicesWindowSize = new Dimension(w, h); + if (popupWindow != null) { + popupWindow.setSize(preferredChoicesWindowSize); + } + } + + + /** + * Sets the size of the description window. + * + * @param w The new width. + * @param h The new height. + * @see #setChoicesWindowSize(int, int) + */ + public void setDescriptionWindowSize(int w, int h) { + preferredDescWindowSize = new Dimension(w, h); + if (popupWindow != null) { + popupWindow.setDescriptionWindowSize(preferredDescWindowSize); + } + } + + + /** + * Sets the handler to use when an external URL is clicked in the + * description window. This handler can perform some action, such as + * open the URL in a web browser. The default implementation will open + * the URL in a browser, but only if running in Java 6. If you want + * browser support for Java 5 and below, or otherwise want to respond to + * hyperlink clicks, you will have to install your own handler to do so. + * + * @param handler The new handler. + * @see #getExternalURLHandler() + */ + public void setExternalURLHandler(ExternalURLHandler handler) { + this.externalURLHandler = handler; + } + + + /** + * Sets the redirector for external URL's found in code completion + * documentation. When a non-local link in completion popups is clicked, + * this redirector is given the chance to modify the URL fetched and + * displayed. + * + * @param linkRedirector The link redirector, or null for + * none. + * @see #getLinkRedirector() + */ + public static void setLinkRedirector(LinkRedirector linkRedirector) { + AutoCompletion.linkRedirector = linkRedirector; + } + + + /** + * Sets the default list cell renderer to use when a completion provider + * does not supply its own. + * + * @param renderer The renderer to use. If this is null, + * a default renderer is used. + * @see #getListCellRenderer() + */ + public void setListCellRenderer(ListCellRenderer renderer) { + this.renderer = renderer; + if (popupWindow != null) { + popupWindow.setListCellRenderer(renderer); + hidePopupWindow(); + } + } + + + /** + * Sets the renderer to use for {@link Completion}s in the optional + * parameter choices popup window (displayed when a + * {@link ParameterizedCompletion} is code-completed). If this isn't set, + * a default renderer is used. + * + * @param r The renderer to use. + * @see #getParamChoicesRenderer() + * @see #setParameterAssistanceEnabled(boolean) + */ + public void setParamChoicesRenderer(ListCellRenderer r) { + paramChoicesRenderer = r; + } + + + /** + * Sets whether parameter assistance is enabled. If parameter assistance + * is enabled, and a "parameterized" completion (such as a function or + * method) is inserted, the user will get "assistance" in inserting the + * parameters in the form of a popup window with documentation and easy + * tabbing through the arguments (as seen in Eclipse and NetBeans). + * + * @param enabled Whether parameter assistance should be enabled. + * @see #isParameterAssistanceEnabled() + */ + public void setParameterAssistanceEnabled(boolean enabled) { + parameterAssistanceEnabled = enabled; + } + + + /** + * Sets whether the "description window" should be shown beside the + * completion window. + * + * @param show Whether to show the description window. + * @see #isShowDescWindow() + */ + public void setShowDescWindow(boolean show) { + hidePopupWindow(); // Needed to force it to take effect + showDescWindow = show; + } + + + /** + * Sets the keystroke that should be used to trigger the auto-complete + * popup window. + * + * @param ks The keystroke. + * @throws IllegalArgumentException If ks is null. + * @see #getTriggerKey() + */ + public void setTriggerKey(KeyStroke ks) { + if (ks == null) { + throw new IllegalArgumentException("trigger key cannot be null"); + } + if (!ks.equals(trigger)) { + if (textComponent != null) { + // Put old trigger action back. + uninstallTriggerKey(); + // Grab current action for new trigger and replace it. + installTriggerKey(ks); + } + trigger = ks; + } + } + + + /** + * Displays a "tool tip" detailing the inputs to the function just entered. + * + * @param pc The completion. + * @param typedParamListStartChar Whether the parameterized completion list + * starting character was typed. + */ + private void startParameterizedCompletionAssistance( + ParameterizedCompletion pc, boolean typedParamListStartChar) { + + // Get rid of the previous tool tip window, if there is one. + hideParameterCompletionPopups(); + + // Don't bother with a tool tip if there are no parameters, but if + // they typed e.g. the opening '(', make them overtype the ')'. + if (pc.getParamCount() == 0 && !(pc instanceof TemplateCompletion)) { + CompletionProvider p = pc.getProvider(); + char end = p.getParameterListEnd(); // Might be '\0' + String text = end == '\0' ? "" : Character.toString(end); + if (typedParamListStartChar) { + String template = "${}" + text + "${cursor}"; + textComponent.replaceSelection(Character.toString(p.getParameterListStart())); + TemplateCompletion tc = new TemplateCompletion(p, null, null, template); + pc = tc; + } else { + text = p.getParameterListStart() + text; + textComponent.replaceSelection(text); + return; + } + } + + pcc = new ParameterizedCompletionContext(parentWindow, this, pc); + pcc.activate(); + + } + + + /** + * Uninstalls this auto-completion from its text component. If it is not + * installed on any text component, nothing happens. + * + * @see #install(JTextComponent) + */ + public void uninstall() { + + if (textComponent != null) { + + hidePopupWindow(); // Unregisters listeners, actions, etc. + + uninstallTriggerKey(); + + // Uninstall the function completion key. + char start = provider.getParameterListStart(); + if (start != 0) { + KeyStroke ks = KeyStroke.getKeyStroke(start); + InputMap im = textComponent.getInputMap(); + im.put(ks, oldParenKey); + ActionMap am = textComponent.getActionMap(); + am.put(PARAM_COMPLETE_KEY, oldParenAction); + } + + textComponentListener.removeFrom(textComponent); + if (parentWindow != null) { + parentWindowListener.removeFrom(parentWindow); + } + + if (isAutoActivationEnabled()) { + autoActivationListener.removeFrom(textComponent); + } + + UIManager.removePropertyChangeListener(lafListener); + + textComponent = null; + popupWindow = null; + + } + + } + + + /** + * Replaces the "trigger key" action with the one that was there + * before auto-completion was installed. + * + * @see #installTriggerKey(KeyStroke) + */ + private void uninstallTriggerKey() { + InputMap im = textComponent.getInputMap(); + im.put(trigger, oldTriggerKey); + ActionMap am = textComponent.getActionMap(); + am.put(PARAM_TRIGGER_KEY, oldTriggerAction); + } + + + /** + * Updates the LookAndFeel of the popup window. Applications can call + * this method as appropriate if they support changing the LookAndFeel + * at runtime. + */ + private void updateUI() { + if (popupWindow != null) { + popupWindow.updateUI(); + } + if (pcc != null) { + pcc.updateUI(); + } + // Will practically always be a JComponent (a JLabel) + if (paramChoicesRenderer instanceof JComponent) { + ((JComponent) paramChoicesRenderer).updateUI(); + } + } + + + /** + * Listens for events in the text component to auto-activate the code + * completion popup. + */ + private class AutoActivationListener extends FocusAdapter + implements DocumentListener, CaretListener, ActionListener { + + private Timer timer; + private boolean justInserted; + + public AutoActivationListener() { + timer = new Timer(200, this); + timer.setRepeats(false); + } + + public void actionPerformed(ActionEvent e) { + doCompletion(); + } + + public void addTo(JTextComponent tc) { + tc.addFocusListener(this); + tc.getDocument().addDocumentListener(this); + tc.addCaretListener(this); + } + + public void caretUpdate(CaretEvent e) { + if (justInserted) { + justInserted = false; + } else { + timer.stop(); + } + } + + public void changedUpdate(DocumentEvent e) { + // Ignore + } + + @Override + public void focusLost(FocusEvent e) { + timer.stop(); + //hideChildWindows(); Other listener will do this + } + + public void insertUpdate(DocumentEvent e) { + justInserted = false; + if (isAutoCompleteEnabled() && isAutoActivationEnabled() && + e.getLength() == 1) { + if (provider.isAutoActivateOkay(textComponent)) { + timer.restart(); + justInserted = true; + } else { + timer.stop(); + } + } else { + timer.stop(); + } + } + + public void removeFrom(JTextComponent tc) { + tc.removeFocusListener(this); + tc.getDocument().removeDocumentListener(this); + tc.removeCaretListener(this); + timer.stop(); + justInserted = false; + } + + public void removeUpdate(DocumentEvent e) { + timer.stop(); + } + + } + + + /** + * The Action that displays the popup window if + * auto-completion is enabled. + */ + private class AutoCompleteAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + if (isAutoCompleteEnabled()) { + refreshPopupWindow(); + } else if (oldTriggerAction != null) { + oldTriggerAction.actionPerformed(e); + } + } + + } + + + /** + * Listens for LookAndFeel changes and updates the various popup windows + * involved in auto-completion accordingly. + */ + private class LookAndFeelChangeListener implements PropertyChangeListener { + + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if ("lookAndFeel".equals(name)) { + updateUI(); + } + } + + } + + + /** + * Action that starts a parameterized completion, e.g. after '(' is + * typed. + */ + private class ParameterizedCompletionStartAction extends AbstractAction { + + private String start; + + public ParameterizedCompletionStartAction(char ch) { + this.start = Character.toString(ch); + } + + public void actionPerformed(ActionEvent e) { + + // Prevents keystrokes from messing up + boolean wasVisible = hidePopupWindow(); + + // Only proceed if they were selecting a completion + if (!wasVisible || !isParameterAssistanceEnabled()) { + textComponent.replaceSelection(start); + return; + } + + Completion c = popupWindow.getSelection(); + if (c instanceof ParameterizedCompletion) { // Should always be true + // Fixes capitalization of the entered text. + insertCompletion(c, true); + } + + } + + } + + + /** + * Listens for events in the parent window of the text component with + * auto-completion enabled. + */ + private class ParentWindowListener extends ComponentAdapter + implements WindowFocusListener { + + public void addTo(Window w) { + w.addComponentListener(this); + w.addWindowFocusListener(this); + } + + @Override + public void componentHidden(ComponentEvent e) { + hideChildWindows(); + } + + @Override + public void componentMoved(ComponentEvent e) { + hideChildWindows(); + } + + @Override + public void componentResized(ComponentEvent e) { + hideChildWindows(); + } + + public void removeFrom(Window w) { + w.removeComponentListener(this); + w.removeWindowFocusListener(this); + } + + public void windowGainedFocus(WindowEvent e) { + } + + public void windowLostFocus(WindowEvent e) { + hideChildWindows(); + } + + } + + + /** + * Listens for events from the text component we're installed on. + */ + private class TextComponentListener extends FocusAdapter + implements HierarchyListener { + + void addTo(JTextComponent tc) { + tc.addFocusListener(this); + tc.addHierarchyListener(this); + } + + /** + * Hide the auto-completion windows when the text component loses + * focus. + */ + @Override + public void focusLost(FocusEvent e) { + hideChildWindows(); + } + + /** + * Called when the component hierarchy for our text component changes. + * When the text component is added to a new {@link Window}, this + * method registers listeners on that Window. + * + * @param e The event. + */ + public void hierarchyChanged(HierarchyEvent e) { + + // NOTE: e many be null as we call this method at other times. + //System.out.println("Hierarchy changed! " + e); + + Window oldParentWindow = parentWindow; + parentWindow = SwingUtilities.getWindowAncestor(textComponent); + if (parentWindow != oldParentWindow) { + if (oldParentWindow != null) { + parentWindowListener.removeFrom(oldParentWindow); + } + if (parentWindow != null) { + parentWindowListener.addTo(parentWindow); + } + } + + } + + public void removeFrom(JTextComponent tc) { + tc.removeFocusListener(this); + tc.removeHierarchyListener(this); + } + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/AutoCompletionStyleContext.java b/designer-base/src/com/fr/design/gui/autocomplete/AutoCompletionStyleContext.java new file mode 100644 index 0000000000..ed25c1148a --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/AutoCompletionStyleContext.java @@ -0,0 +1,120 @@ +/* + * 06/24/2012 + * + * AutoCompletionStyleContext.java - Manages styles related to auto-completion. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.awt.Color; + + +/** + * Manages the colors shared across the library. + * + * @author Robert Futrell + * @version 1.0 + */ +public class AutoCompletionStyleContext { + + /** + * The color used to denote the ending caret position for parameterized + * completions. + */ + private Color parameterizedCompletionCursorPositionColor; + + /** + * The color used to highlight copies of editable parameters in + * parameterized completions. + */ + private Color parameterCopyColor; + + /** + * The color of the outline highlight used to denote editable parameters + * in parameterized completions. + */ + private Color parameterOutlineColor; + + + public AutoCompletionStyleContext() { + setParameterOutlineColor(Color.gray); + setParameterCopyColor(new Color(0xb4d7ff)); + setParameterizedCompletionCursorPositionColor(new Color(0x00b400)); + } + + + /** + * Returns the color of the highlight painted on copies of editable + * parameters in parameterized completions. + * + * @return The color used. + * @see #setParameterCopyColor(Color) + */ + public Color getParameterCopyColor() { + return parameterCopyColor; + } + + + /** + * Returns the color used to denote the ending caret position for + * parameterized completions. + * + * @return The color used. + * @see #setParameterizedCompletionCursorPositionColor(Color) + */ + public Color getParameterizedCompletionCursorPositionColor() { + return parameterizedCompletionCursorPositionColor; + } + + + /** + * Returns the color of the outline highlight used to denote editable + * parameters in parameterized completions. + * + * @return The color used. + * @see #setParameterOutlineColor(Color) + */ + public Color getParameterOutlineColor() { + return parameterOutlineColor; + } + + + /** + * Sets the color of the highlight painted on copies of editable + * parameters in parameterized completions. + * + * @param color The color to use. + * @see #setParameterCopyColor(Color) + */ + public void setParameterCopyColor(Color color) { + this.parameterCopyColor = color; + } + + + /** + * Sets the color used to denote the ending caret position for + * parameterized completions. + * + * @param color The color to use. + * @see #getParameterizedCompletionCursorPositionColor() + */ + public void setParameterizedCompletionCursorPositionColor(Color color) { + this.parameterizedCompletionCursorPositionColor = color; + } + + + /** + * Sets the color of the outline highlight used to denote editable + * parameters in parameterized completions. + * + * @param color The color to use. + * @see #getParameterOutlineColor() + */ + public void setParameterOutlineColor(Color color) { + this.parameterOutlineColor = color; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/BasicCompletion.java b/designer-base/src/com/fr/design/gui/autocomplete/BasicCompletion.java new file mode 100644 index 0000000000..c8f1136f68 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/BasicCompletion.java @@ -0,0 +1,144 @@ +/* + * 01/03/2009 + * + * BasicCompletion.java - A straightforward Completion implementation. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + + +/** + * A straightforward {@link Completion} implementation. This implementation + * can be used if you have a relatively short number of static completions + * with no (or short) summaries.

+ * + * This implementation uses the replacement text as the input text. It also + * includes a "short description" field, which (if non-null), is + * used in the completion choices list. + * + * @author Robert Futrell + * @version 1.0 + */ +public class BasicCompletion extends AbstractCompletion { + + private String replacementText; + private String shortDesc; + private String summary; + + + /** + * Constructor. + * + * @param provider The parent completion provider. + * @param replacementText The text to replace. + */ + public BasicCompletion(CompletionProvider provider, String replacementText){ + this(provider, replacementText, null); + } + + + /** + * Constructor. + * + * @param provider The parent completion provider. + * @param replacementText The text to replace. + * @param shortDesc A short description of the completion. This will be + * displayed in the completion list. This may be null. + */ + public BasicCompletion(CompletionProvider provider, String replacementText, + String shortDesc) { + this(provider, replacementText, shortDesc, null); + } + + + /** + * Constructor. + * + * @param provider The parent completion provider. + * @param replacementText The text to replace. + * @param shortDesc A short description of the completion. This will be + * displayed in the completion list. This may be null. + * @param summary The summary of this completion. This should be HTML. + * This may be null. + */ + public BasicCompletion(CompletionProvider provider, String replacementText, + String shortDesc, String summary) { + super(provider); + this.replacementText = replacementText; + this.shortDesc = shortDesc; + this.summary = summary; + } + + + /** + * {@inheritDoc} + */ + public String getReplacementText() { + return replacementText; + } + + + /** + * Returns the short description of this completion, usually used in + * the completion choices list. + * + * @return The short description, or null if there is none. + * @see #setShortDescription(String) + */ + public String getShortDescription() { + return shortDesc; + } + + + /** + * {@inheritDoc} + */ + public String getSummary() { + return summary; + } + + + /** + * Sets the short description of this completion. + * + * @param shortDesc The short description of this completion. + * @see #getShortDescription() + */ + public void setShortDescription(String shortDesc) { + this.shortDesc = shortDesc; + } + + + /** + * Sets the summary for this completion. + * + * @param summary The summary for this completion. + * @see #getSummary() + */ + public void setSummary(String summary) { + this.summary = summary; + } + + + /** + * Returns a string representation of this completion. If the short + * description is not null, this method will return: + * + * getInputText() + " - " + shortDesc + * + * otherwise, it will return getInputText(). + * + * @return A string representation of this completion. + */ + @Override + public String toString() { + if (shortDesc==null) { + return getInputText(); + } + return getInputText() + " - " + shortDesc; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/Completion.java b/designer-base/src/com/fr/design/gui/autocomplete/Completion.java new file mode 100644 index 0000000000..eafaeac1a4 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/Completion.java @@ -0,0 +1,153 @@ +/* + * 12/21/2008 + * + * Completion.java - Represents a single completion choice. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import javax.swing.Icon; +import javax.swing.text.JTextComponent; + + +/** + * Represents a completion choice. A {@link CompletionProvider} returns lists + * of objects implementing this interface. A Completion contains the + * following information: + * + *

    + *
  • The text the user must (begin to) input for this to be a completion + * choice. + *
  • The text that will be filled in if the user chooses this completion. + * Note that often, this is the same as the text the user must (begin to) + * enter, but this doesn't have to be the case. + *
  • Summary HTML that describes this completion. This is information that + * can be displayed in a helper "tooltip"-style window beside the + * completion list. This may be null. It may also be + * lazily generated to cut down on memory usage. + *
  • The CompletionProvider that returned this completion. + *
  • Tool tip text that can be displayed when a mouse hovers over this + * completion in a text component. + *
+ * + * @author Robert Futrell + * @version 1.0 + * @see AbstractCompletion + */ +public interface Completion extends Comparable { + + + /** + * Compares this completion to another one lexicographically, ignoring + * case. + * + * @param other Another completion instance. + * @return How this completion compares to the other one. + */ + public int compareTo(Completion other); + + + /** + * Returns the portion of this completion that has already been entered + * into the text component. The match is case-insensitive.

+ * + * This is a convenience method for: + * getProvider().getAlreadyEnteredText(comp). + * + * @param comp The text component. + * @return The already-entered portion of this completion. + */ + public String getAlreadyEntered(JTextComponent comp); + + + /** + * Returns the icon to use for this completion. + * + * @return The icon, or null for none. + */ + public Icon getIcon(); + + + /** + * Returns the text that the user has to (start) typing for this completion + * to be offered. Note that this will usually be the same value as + * {@link #getReplacementText()}, but not always (a completion could be + * a way to implement shorthand, for example, "sysout" mapping + * to "System.out.println("). + * + * @return The text the user has to (start) typing for this completion to + * be offered. + * @see #getReplacementText() + */ + public String getInputText(); + + + /** + * Returns the provider that returned this completion. + * + * @return The provider. + */ + public CompletionProvider getProvider(); + + + /** + * Returns the "relevance" of this completion. This is used when sorting + * completions by their relevance. It is an abstract concept that may + * mean different things to different languages, and may depend on the + * context of the completion.

+ * + * By default, all completions have a relevance of 0. The + * higher the value returned by this method, the higher up in the list + * this completion will be; the lower the value returned, the lower it will + * be. Completions with equal relevance values will be + * sorted alphabetically. + * + * @return The relevance of this completion. + */ + public int getRelevance(); + + + /** + * Returns the text to insert as the result of this auto-completion. This + * is the "complete" text, including any text that replaces what the user + * has already typed. + * + * @return The replacement text. + * @see #getInputText() + */ + public String getReplacementText(); + + + /** + * Returns the description of this auto-complete choice. This can be + * used in a popup "description window." + * + * @return This item's description. This should be HTML. It may be + * null if there is no description for this + * completion. + */ + public String getSummary(); + + + /** + * Returns the tool tip text to display for mouse hovers over this + * completion.

+ * + * Note that for this functionality to be enabled, a + * JTextComponent must be registered with the + * ToolTipManager, and the text component must know to search + * for this value. In the case of an + * RSyntaxTextArea, this + * can be done with a org.fife.ui.rtextarea.ToolTipSupplier that + * calls into + * {@link CompletionProvider#getCompletionsAt(JTextComponent, java.awt.Point)}. + * + * @return The tool tip text for this completion, or null if + * none. + */ + public String getToolTipText(); + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/CompletionCellRenderer.java b/designer-base/src/com/fr/design/gui/autocomplete/CompletionCellRenderer.java new file mode 100644 index 0000000000..fd70ac26b3 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/CompletionCellRenderer.java @@ -0,0 +1,625 @@ +/* + * 12/23/2008 + * + * CompletionCellRenderer.java - Cell renderer that can render the standard + * completion types like Eclipse or NetBeans does. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Rectangle; +import javax.swing.DefaultListCellRenderer; +import javax.swing.Icon; +import javax.swing.JList; +import javax.swing.SwingUtilities; +import javax.swing.plaf.basic.BasicHTML; +import javax.swing.text.View; + + +/** + * A cell renderer that adds some pizazz when rendering the standard + * {@link Completion} types, like Eclipse and NetBeans do. Specifically, + * this renderer handles: + * + *

    + *
  • {@link FunctionCompletion}s
  • + *
  • {@link VariableCompletion}s
  • + *
  • {@link MarkupTagCompletion}s
  • + *
  • {@link ShorthandCompletion}s
  • + *
  • {@link TemplateCompletion}s
  • + *
+ * + * @author Robert Futrell + * @version 1.0 + */ +public class CompletionCellRenderer extends DefaultListCellRenderer { + + /** + * The alternating background color, or null if alternating + * row colors should not be used. + */ + private static Color altBG; + + /** + * The font to use when rendering items, or null if the + * list's default font should be used. + */ + private Font font; + + /** + * Whether to display the types of fields and return types of functions + * in the completion text. + */ + private boolean showTypes; + + /** + * The color to use when rendering types in completion text. + */ + private String typeColor; + + /** + * During rendering, whether the item being rendered is selected. + */ + private boolean selected; + + /** + * During rendering, this is the "real" background color of the item being + * rendered (i.e., what its background color is if it isn't selected). + */ + private Color realBG; + + /** + * The color to use for function arguments. + */ + private String paramColor; + + /** + * Used in rendering calculations. + */ + private Rectangle paintTextR; + + /** + * An optional delegate renderer (primarily for Substance). + */ + private DefaultListCellRenderer delegate; + + private static final String SUBSTANCE_RENDERER_CLASS_NAME = + "org.pushingpixels.substance.api.renderers.SubstanceDefaultListCellRenderer"; + + /** + * Keeps the HTML descriptions from "wrapping" in the list, which cuts off + * words. + */ + private static final String PREFIX = ""; + + + /** + * Constructor. + */ + public CompletionCellRenderer() { + init(); + } + + + /** + * Constructor. This is primarily a hook for Substance, or any other + * Look and Feel whose renderers look drastically different than standard + * DefaultListCellRenderers. Everything except for the text + * rendering will be done by the delegate. In almost all scenarios, you + * will want to use the no-argument constructor instead of this one. + * + * @param delegate The delegate renderer. + * @see #delegateToSubstanceRenderer() + */ + public CompletionCellRenderer(DefaultListCellRenderer delegate) { + setDelegateRenderer(delegate); + init(); + } + + + /** + * Returns a decent "parameter" color based on the current default + * foreground color. + * + * @return The parameter color to use. + */ + private String createParamColor() { + return Util.isLightForeground(getForeground()) ? + Util.getHexString(Util.getHyperlinkForeground()): "#aa0077"; + } + + + /** + * Returns a decent "type" color based on the current default foreground + * color. + * + * @return The type color to use. + */ + private String createTypeColor() { + return "#808080"; + } + + + /** + * Attempts to delegate rendering to a Substance cell renderer. This + * should only be called if Substance is known to be on the classpath. + * + * @throws Exception If Substance is not on the classpath, or some other + * error occurs creating the Substance cell renderer. + * @see Util#getUseSubstanceRenderers() + * @see #setDelegateRenderer(DefaultListCellRenderer) + */ + public void delegateToSubstanceRenderer() throws Exception { + Class clazz = Class.forName(SUBSTANCE_RENDERER_CLASS_NAME); + DefaultListCellRenderer delegate = + (DefaultListCellRenderer)clazz.newInstance(); + setDelegateRenderer(delegate); + } + + + /** + * Returns the background color to use on alternating lines. + * + * @return The alternate background color. If this is null, + * alternating colors are not used. + * @see #setAlternateBackground(Color) + */ + public static Color getAlternateBackground() { + return altBG; + } + + + /** + * Returns the delegate renderer, or null if there is none. + * + * @return The delegate renderer. + * @see #setDelegateRenderer(DefaultListCellRenderer) + */ + public DefaultListCellRenderer getDelegateRenderer() { + return delegate; + } + + + /** + * Returns the font used when rendering completions. + * + * @return The font. If this is null, then the default list + * font is used. + * @see #setDisplayFont(Font) + */ + public Font getDisplayFont() { + return font; + } + + + /** + * Returns the renderer. + * + * @param list The list of choices being rendered. + * @param value The {@link Completion} being rendered. + * @param index The index into list being rendered. + * @param selected Whether the item is selected. + * @param hasFocus Whether the item has focus. + */ + @Override + public Component getListCellRendererComponent(JList list, Object value, + int index, boolean selected, boolean hasFocus) { + + super.getListCellRendererComponent(list,value,index,selected,hasFocus); + if (font!=null) { + setFont(font); // Overrides super's setFont(list.getFont()). + } + this.selected = selected; + this.realBG = altBG!=null && (index&1)==1 ? altBG : list.getBackground(); + + Completion c = (Completion)value; + setIcon(c.getIcon()); + + if (c instanceof FunctionCompletion) { + FunctionCompletion fc = (FunctionCompletion)value; + prepareForFunctionCompletion(list, fc, index, selected, hasFocus); + } + else if (c instanceof VariableCompletion) { + VariableCompletion vc = (VariableCompletion)value; + prepareForVariableCompletion(list, vc, index, selected, hasFocus); + } + else if (c instanceof TemplateCompletion) { + TemplateCompletion tc = (TemplateCompletion)value; + prepareForTemplateCompletion(list, tc, index, selected, hasFocus); + } + else if (c instanceof MarkupTagCompletion) { + MarkupTagCompletion mtc = (MarkupTagCompletion)value; + prepareForMarkupTagCompletion(list, mtc, index, selected, hasFocus); + } + else { + prepareForOtherCompletion(list, c, index, selected, hasFocus); + } + + // A delegate renderer might do its own alternate row striping + // (Substance does). + if (delegate!=null) { + delegate.getListCellRendererComponent(list, getText(), index, + selected, hasFocus); + delegate.setFont(getFont()); + delegate.setIcon(getIcon()); + return delegate; + } + + if (!selected && (index&1)==1 && altBG!=null) { + setBackground(altBG); + } + + return this; + + } + + + /** + * Returns whether the types of fields and return types of methods are + * shown in the completion text. + * + * @return Whether to show the types. + * @see #setShowTypes(boolean) + */ + public boolean getShowTypes() { + return showTypes; + } + + + private void init() { + //setDisplayFont(new Font("Monospaced", Font.PLAIN, 12)); + setShowTypes(true); + typeColor = createTypeColor(); + paramColor = createParamColor(); + paintTextR = new Rectangle(); + } + + + @Override + protected void paintComponent(Graphics g) { + + //super.paintComponent(g); + + g.setColor(realBG); + int iconW = 0; + if (getIcon()!=null) { + iconW = getIcon().getIconWidth(); + } + if (selected && iconW>0) { // The icon area is never in the "selection" + g.fillRect(0, 0, iconW, getHeight()); + g.setColor(getBackground()); + g.fillRect(iconW,0, getWidth()-iconW,getHeight()); + } + else { + g.setColor(getBackground()); + g.fillRect(0, 0, getWidth(), getHeight()); + } + if (getIcon()!=null) { + getIcon().paintIcon(this, g, 0, 0); + } + + String text = getText(); + if (text != null) { + paintTextR.setBounds(iconW,0, getWidth()-iconW,getHeight()); + paintTextR.x += 3; // Force a slight margin + int space = paintTextR.height - g.getFontMetrics().getHeight(); + View v = (View)getClientProperty(BasicHTML.propertyKey); + if (v != null) { + // HTML rendering doesn't auto-center vertically, for some + // reason + paintTextR.y += space/2; + paintTextR.height -= space; + v.paint(g, paintTextR); + } + else { + int textX = paintTextR.x; + int textY = paintTextR.y;// + g.getFontMetrics().getAscent(); + //System.out.println(g.getFontMetrics().getAscent()); + g.drawString(text, textX, textY); + } + } + + } + + + /** + * Prepares this renderer to display a function completion. + * + * @param list The list of choices being rendered. + * @param fc The completion to render. + * @param index The index into list being rendered. + * @param selected Whether the item is selected. + * @param hasFocus Whether the item has focus. + */ + protected void prepareForFunctionCompletion(JList list, + FunctionCompletion fc, int index, boolean selected, boolean hasFocus) { + + StringBuilder sb = new StringBuilder(PREFIX); + sb.append(fc.getName()); + + char paramListStart = fc.getProvider().getParameterListStart(); + if (paramListStart!=0) { // 0 => no start char + sb.append(paramListStart); + } + + int paramCount = fc.getParamCount(); + for (int i=0; i"); + } + sb.append(type); + if (!selected) { + sb.append(""); + } + if (name!=null) { + sb.append(' '); + } + } + if (name!=null) { + sb.append(name); + } + if (i No parameter list end char + sb.append(paramListEnd); + } + + if (getShowTypes() && fc.getType()!=null) { + sb.append(" : "); + if (!selected) { + sb.append(""); + } + sb.append(fc.getType()); + if (!selected) { + sb.append(""); + } + } + + setText(sb.toString()); + + } + + + /** + * Prepares this renderer to display a markup tag completion. + * + * @param list The list of choices being rendered. + * @param mc The completion to render. + * @param index The index into list being rendered. + * @param selected Whether the item is selected. + * @param hasFocus Whether the item has focus. + */ + protected void prepareForMarkupTagCompletion(JList list, + MarkupTagCompletion mc, int index, boolean selected, boolean hasFocus) { + + StringBuilder sb = new StringBuilder(PREFIX); + sb.append(mc.getName()); + + setText(sb.toString()); + + } + + + /** + * Prepares this renderer to display a completion not specifically handled + * elsewhere. + * + * @param list The list of choices being rendered. + * @param c The completion to render. + * @param index The index into list being rendered. + * @param selected Whether the item is selected. + * @param hasFocus Whether the item has focus. + */ + protected void prepareForOtherCompletion(JList list, + Completion c, int index, boolean selected, boolean hasFocus) { + + StringBuilder sb = new StringBuilder(PREFIX); + sb.append(c.getInputText()); + + if (c instanceof BasicCompletion) { + String definition = ((BasicCompletion)c).getShortDescription(); + if (definition!=null) { + sb.append(" - "); + if (!selected) { + sb.append(""); + } + sb.append(definition); + if (!selected) { + sb.append(""); + } + } + } + + setText(sb.toString()); + + } + + + /** + * Prepares this renderer to display a template completion. + * + * @param list The list of choices being rendered. + * @param tc The completion to render. + * @param index The index into list being rendered. + * @param selected Whether the item is selected. + * @param hasFocus Whether the item has focus. + */ + protected void prepareForTemplateCompletion(JList list, + TemplateCompletion tc, int index, boolean selected, boolean hasFocus) { + + StringBuilder sb = new StringBuilder(PREFIX); + sb.append(tc.getInputText()); + + String definition = tc.getShortDescription(); + if (definition!=null) { + sb.append(" - "); + if (!selected) { + sb.append(""); + } + sb.append(definition); + if (!selected) { + sb.append(""); + } + } + + setText(sb.toString()); + + } + + + /** + * Prepares this renderer to display a variable completion. + * + * @param list The list of choices being rendered. + * @param vc The completion to render. + * @param index The index into list being rendered. + * @param selected Whether the item is selected. + * @param hasFocus Whether the item has focus. + */ + protected void prepareForVariableCompletion(JList list, + VariableCompletion vc, int index, boolean selected, boolean hasFocus) { + + StringBuilder sb = new StringBuilder(PREFIX); + sb.append(vc.getName()); + + if (getShowTypes() && vc.getType()!=null) { + sb.append(" : "); + if (!selected) { + sb.append(""); + } + sb.append(vc.getType()); + if (!selected) { + sb.append(""); + } + } + + setText(sb.toString()); + + } + + + /** + * Sets the background color to use on alternating lines. + * + * @param altBG The new alternate background color. If this is + * null, alternating lines will not use different + * background colors. + * @see #getAlternateBackground() + */ + public static void setAlternateBackground(Color altBG) { + CompletionCellRenderer.altBG = altBG; + } + + + /** + * Sets the delegate renderer. Most users will never use this method; it + * is primarily a hook for Substance and other Look and Feels whose + * renderers look drastically different from the standard + * DefaultListCellRenderer. + * + * @param delegate The new delegate renderer. If this is null, + * the default rendering of this component is used. + * @see #getDelegateRenderer() + * @see #delegateToSubstanceRenderer() + */ + public void setDelegateRenderer(DefaultListCellRenderer delegate) { + this.delegate = delegate; + } + + + /** + * Sets the font to use when rendering completion items. + * + * @param font The font to use. If this is null, then + * the default list font is used. + * @see #getDisplayFont() + */ + public void setDisplayFont(Font font) { + this.font = font; + } + + + /** + * Sets the icon to display based off of a completion, falling back to a + * default icon if the completion has no icon. + * + * @param completion The completion to check. + * @param defaultIcon The icon to use if completion does not + * specify an icon. + */ + protected void setIconWithDefault(Completion completion, Icon defaultIcon) { + Icon icon = completion.getIcon(); + setIcon(icon!=null ? icon : defaultIcon); + } + + + /** + * Sets the color to use for function arguments. + * + * @param color The color to use. This is ignored if null. + * @see #setTypeColor(Color) + */ + public void setParamColor(Color color) { + if (color!=null) { + paramColor = Util.getHexString(color); + } + } + + + /** + * Sets whether the types of fields and return types of methods are + * shown in the completion text. + * + * @param show Whether to show the types. + * @see #getShowTypes() + */ + public void setShowTypes(boolean show) { + this.showTypes = show; + } + + + /** + * Sets the color to use for function/field types. Note that if + * {@link #getShowTypes()} returns false, this property + * effectively does nothing. + * + * @param color The color to use for types. This is ignored if + * null. + * @see #setShowTypes(boolean) + * @see #setParamColor(Color) + */ + public void setTypeColor(Color color) { + if (color!=null) { + typeColor = Util.getHexString(color); + } + } + + + /** + * Overridden to update our delegate, if necessary. + */ + @Override + public void updateUI() { + super.updateUI(); + if (delegate!=null) { + SwingUtilities.updateComponentTreeUI(delegate); + } + paramColor = createParamColor(); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/CompletionListModel.java b/designer-base/src/com/fr/design/gui/autocomplete/CompletionListModel.java new file mode 100644 index 0000000000..35525184e5 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/CompletionListModel.java @@ -0,0 +1,88 @@ +/* + * 12/22/2008 + * + * CompletionListModel.java - A model that allows bulk addition of elements. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.swing.AbstractListModel; + + +/** + * A list model implementation that allows the bulk addition of elements. + * This is the only feature missing from DefaultListModel that + * we need. + * + * @author Robert Futrell + * @version 1.0 + */ +class CompletionListModel extends AbstractListModel { + + /** + * Container for items in this model. + */ + private List delegate; + + + /** + * Constructor. + */ + public CompletionListModel() { + delegate = new ArrayList(); + } + + + /** + * Removes all of the elements from this list. The list will + * be empty after this call returns (unless it throws an exception). + * + * @see #setContents(Collection) + */ + public void clear() { + int end = delegate.size()-1; + delegate.clear(); + if (end >= 0) { + fireIntervalRemoved(this, 0, end); + } + } + + + /** + * {@inheritDoc} + */ + public Object getElementAt(int index) { + return delegate.get(index); + } + + + /** + * {@inheritDoc} + */ + public int getSize() { + return delegate.size(); + } + + + /** + * Sets the contents of this model. All previous contents are removed. + * + * @param contents The new contents of this model. + */ + public void setContents(Collection contents) { + clear(); + int count = contents.size(); + if (count>0) { + delegate.addAll(contents); + fireIntervalAdded(this, 0, count-1); // endpoints included (!) + } + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/CompletionProvider.java b/designer-base/src/com/fr/design/gui/autocomplete/CompletionProvider.java new file mode 100644 index 0000000000..8c36298f23 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/CompletionProvider.java @@ -0,0 +1,213 @@ +/* + * 12/21/2008 + * + * CompletionProvider.java - Provides autocompletion values based on the + * text currently in a text component. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.awt.Point; +import java.util.List; + +import javax.swing.ListCellRenderer; +import javax.swing.text.JTextComponent; + + +/** + * Provides autocompletion values to an {@link AutoCompletion}.

+ * + * Completion providers can have an optional parent. Parents are searched for + * completions when their children are. This allows for chaining of completion + * providers. + * + * @author Robert Futrell + * @version 1.0 + */ +public interface CompletionProvider { + + + /** + * Clears the values used to identify and insert "parameterized completions" + * (e.g. functions or methods). After this method is called, functions and + * methods will not have their parameters auto-completed. + * + * @see #setParameterizedCompletionParams(char, String, char) + */ + public void clearParameterizedCompletionParams(); + + + /** + * Returns the text just before the current caret position that could be + * the start of something auto-completable. + * + * @param comp The text component. + * @return The text. A return value of null means nothing + * should be auto-completed; a value of an empty string + * ("") means auto-completion should still be + * considered (i.e., all possible choices are valid). + */ + public String getAlreadyEnteredText(JTextComponent comp); + + + /** + * Gets the possible completions for the text component at the current + * caret position. + * + * @param comp The text component. + * @return The list of {@link Completion}s. If no completions are + * available, this may be null. + */ + public List getCompletions(JTextComponent comp); + + + /** + * Returns the completions that have been entered at the specified visual + * location. This can be used for tool tips when the user hovers the + * mouse over completed text. + * + * @param comp The text component. + * @param p The position, usually from a MouseEvent. + * @return The completions, or an empty list if there are none. + */ + public List getCompletionsAt(JTextComponent comp, Point p); + + + /** + * Returns the cell renderer for completions returned from this provider. + * + * @return The cell renderer, or null if the default should + * be used. + * @see #setListCellRenderer(ListCellRenderer) + */ + public ListCellRenderer getListCellRenderer(); + + + /** + * Returns an object that can return a list of completion choices for + * parameters. This is used when a user code-completes a parameterized + * completion, such as a function or method. For any parameter to the + * function/method, this object can return possible completions. + * + * @return The parameter choices provider, or null if + * none is installed. + */ + public ParameterChoicesProvider getParameterChoicesProvider(); + + + /** + * Returns a list of parameterized completions that have been entered + * at the current caret position of a text component (and thus can have + * their completion choices displayed). + * + * @param tc The text component. + * @return The list of {@link ParameterizedCompletion}s. If no completions + * are available, this may be null. + */ + public List getParameterizedCompletions(JTextComponent tc); + + + /** + * Returns the text that marks the end of a list of parameters to a + * function or method. + * + * @return The text for a parameter list end, for example, + * ')'. + * @see #getParameterListStart() + * @see #getParameterListSeparator() + * @see #setParameterizedCompletionParams(char, String, char) + */ + public char getParameterListEnd(); + + + /** + * Returns the text that separates parameters to a function or method. + * + * @return The text that separates parameters, for example, + * ", ". + * @see #getParameterListStart() + * @see #getParameterListEnd() + * @see #setParameterizedCompletionParams(char, String, char) + */ + public String getParameterListSeparator(); + + + /** + * Returns the text that marks the start of a list of parameters to a + * function or method. + * + * @return The text for a parameter list start, for example, + * "(". + * @see #getParameterListEnd() + * @see #getParameterListSeparator() + * @see #setParameterizedCompletionParams(char, String, char) + */ + public char getParameterListStart(); + + + /** + * Returns the parent completion provider. + * + * @return The parent completion provider. + * @see #setParent(CompletionProvider) + */ + public CompletionProvider getParent(); + + + /** + * This method is called if auto-activation is enabled in the parent + * {@link AutoCompletion} after the user types a single character. This + * provider should check the text at the current caret position of the + * text component, and decide whether auto-activation would be appropriate + * here. For example, a CompletionProvider for Java might + * want to return true for this method only if the last + * character typed was a '.'. + * + * @param tc The text component. + * @return Whether auto-activation would be appropriate. + */ + public boolean isAutoActivateOkay(JTextComponent tc); + + + /** + * Sets the renderer to use when displaying completion choices. + * + * @param r The renderer to use. + * @see #getListCellRenderer() + */ + public void setListCellRenderer(ListCellRenderer r); + + + /** + * Sets the values used to identify and insert "parameterized completions" + * (e.g. functions or methods). If this method isn't called, functions + * and methods will not have their parameters auto-completed. + * + * @param listStart The character that marks the beginning of a list of + * parameters, such as '(' in C or Java. + * @param separator Text that should separate parameters in a parameter + * list when one is inserted. For example, ", ". + * @param listEnd The character that marks the end of a list of parameters, + * such as ')' in C or Java. + * @throws IllegalArgumentException If either listStart or + * listEnd is not printable ASCII, or if + * separator is null or an empty string. + * @see #clearParameterizedCompletionParams() + */ + public void setParameterizedCompletionParams(char listStart, + String separator, char listEnd); + + + /** + * Sets the parent completion provider. + * + * @param parent The parent provider. null means there will + * be no parent provider. + * @see #getParent() + */ + public void setParent(CompletionProvider parent); + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/CompletionProviderBase.java b/designer-base/src/com/fr/design/gui/autocomplete/CompletionProviderBase.java new file mode 100644 index 0000000000..dcc877f7c7 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/CompletionProviderBase.java @@ -0,0 +1,261 @@ +/* + * 02/06/2010 + * + * CompletionProviderBase.java - Base completion provider implementation. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import javax.swing.ListCellRenderer; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.JTextComponent; +import javax.swing.text.Segment; + + +/** + * A base class for all standard completion providers. This class implements + * functionality that should be sharable across all CompletionProvider + * implementations. + * + * @author Robert Futrell + * @version 1.0 + * @see AbstractCompletionProvider + */ +public abstract class CompletionProviderBase implements CompletionProvider { + + /** + * The parent completion provider. + */ + private CompletionProvider parent; + + /** + * The renderer to use for completions from this provider. If this is + * null, a default renderer is used. + */ + private ListCellRenderer listCellRenderer; + + /** + * Text that marks the beginning of a parameter list, for example, '('. + */ + private char paramListStart; + + /** + * Text that marks the end of a parameter list, for example, ')'. + */ + private char paramListEnd; + + /** + * Text that separates items in a parameter list, for example, ", ". + */ + private String paramListSeparator; + + /** + * Whether auto-activation should occur after letters. + */ + private boolean autoActivateAfterLetters; + + /** + * Non-letter chars that should cause auto-activation to occur. + */ + private String autoActivateChars; + + /** + * Provides completion choices for a parameterized completion's parameters. + */ + private ParameterChoicesProvider paramChoicesProvider; + + /** + * A segment to use for fast char access. + */ + private Segment s = new Segment(); + + protected static final String EMPTY_STRING = ""; + + /** + * Comparator used to sort completions by their relevance before sorting + * them lexicographically. + */ + private static final Comparator sortByRelevanceComparator = + new SortByRelevanceComparator(); + + + /** + * {@inheritDoc} + */ + public void clearParameterizedCompletionParams() { + paramListEnd = paramListStart = 0; + paramListSeparator = null; + } + + + /** + * {@inheritDoc} + */ + public List getCompletions(JTextComponent comp) { + + List completions = getCompletionsImpl(comp); + if (parent!=null) { + completions.addAll(parent.getCompletions(comp)); + Collections.sort(completions); + } + + // NOTE: We can't sort by relevance prior to this; we need to have + // things alphabetical so we can easily narrow down completions to + // those starting with what was already typed. + if (/*sortByRelevance*/true) { + Collections.sort(completions, sortByRelevanceComparator); + } + + return completions; + + } + + + /** + * Does the dirty work of creating a list of completions. + * + * @param comp The text component to look in. + * @return The list of possible completions, or an empty list if there + * are none. + */ + protected abstract List getCompletionsImpl(JTextComponent comp); + + + /** + * {@inheritDoc} + */ + public ListCellRenderer getListCellRenderer() { + return listCellRenderer; + } + + + /** + * {@inheritDoc} + */ + public ParameterChoicesProvider getParameterChoicesProvider() { + return paramChoicesProvider; + } + + + /** + * {@inheritDoc} + */ + public char getParameterListEnd() { + return paramListEnd; + } + + + /** + * {@inheritDoc} + */ + public String getParameterListSeparator() { + return paramListSeparator; + } + + + /** + * {@inheritDoc} + */ + public char getParameterListStart() { + return paramListStart; + } + + + /** + * {@inheritDoc} + */ + public CompletionProvider getParent() { + return parent; + } + + + /** + * {@inheritDoc} + */ + public boolean isAutoActivateOkay(JTextComponent tc) { + Document doc = tc.getDocument(); + char ch = 0; + try { + doc.getText(tc.getCaretPosition(), 1, s); + ch = s.first(); + } catch (BadLocationException ble) { // Never happens + + } + return (autoActivateAfterLetters && Character.isLetter(ch)) || + (autoActivateChars!=null && autoActivateChars.indexOf(ch)>-1); + } + + + /** + * Sets the characters that auto-activation should occur after. A Java + * completion provider, for example, might want to set others + * to ".", to allow auto-activation for members of an object. + * + * @param letters Whether auto-activation should occur after any letter. + * @param others A string of (non-letter) chars that auto-activation should + * occur after. This may be null. + */ + public void setAutoActivationRules(boolean letters, String others) { + autoActivateAfterLetters = letters; + autoActivateChars = others; + } + + + /** + * Sets the param choices provider. This is used when a user + * code-completes a parameterized completion, such as a function or method. + * For any parameter to the function/method, this object can return + * possible completions. + * + * @param pcp The parameter choices provider, or null for + * none. + * @see #getParameterChoicesProvider() + */ + public void setParameterChoicesProvider(ParameterChoicesProvider pcp) { + paramChoicesProvider = pcp; + } + + + /** + * {@inheritDoc} + */ + public void setListCellRenderer(ListCellRenderer r) { + listCellRenderer = r; + } + + + /** + * {@inheritDoc} + */ + public void setParameterizedCompletionParams(char listStart, + String separator, char listEnd) { + if (listStart<0x20 || listStart==0x7F) { + throw new IllegalArgumentException("Invalid listStart"); + } + if (listEnd<0x20 || listEnd==0x7F) { + throw new IllegalArgumentException("Invalid listEnd"); + } + if (separator==null || separator.length()==0) { + throw new IllegalArgumentException("Invalid separator"); + } + paramListStart = listStart; + paramListSeparator = separator; + paramListEnd = listEnd; + } + + + /** + * {@inheritDoc} + */ + public void setParent(CompletionProvider parent) { + this.parent = parent; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/CompletionXMLParser.java b/designer-base/src/com/fr/design/gui/autocomplete/CompletionXMLParser.java new file mode 100644 index 0000000000..2de20f5b77 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/CompletionXMLParser.java @@ -0,0 +1,446 @@ +/* + * 02/06/2010 + * + * CompletionXMLParser.java - Parses XML representing code completion for a + * C-like language. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.List; +import org.xml.sax.Attributes; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + + +/** + * Parser for an XML file describing a procedural language such as C. XML + * files will be validated against the CompletionXml.dtd DTD + * found in this package. + * + * @author Robert Futrell + * @version 1.0 + */ +public class CompletionXMLParser extends DefaultHandler { + + /** + * The completions found after parsing the XML. + */ + private List completions; + + /** + * The provider we're getting completions for. + */ + private CompletionProvider provider; + + /** + * The completion provider to use when loading classes, such as custom + * {@link FunctionCompletion}s. + */ + private ClassLoader completionCL; + + + private String name; + private String type; + private String returnType; + private StringBuilder returnValDesc; + private StringBuilder desc; + private String paramName; + private String paramType; + private StringBuilder paramDesc; + private List params; + private String definedIn; + private boolean doingKeywords; + private boolean inKeyword; + private boolean gettingReturnValDesc; + private boolean gettingDesc; + private boolean gettingParams; + private boolean inParam; + private boolean gettingParamDesc; + private boolean inCompletionTypes; + private char paramStartChar; + private char paramEndChar; + private String paramSeparator; + + /** + * If specified in the XML, this class will be used instead of + * {@link FunctionCompletion} when appropriate. This class should extend + * FunctionCompletion, or stuff will break. + */ + private String funcCompletionType; + + /** + * The class loader to use to load custom completion classes, such as + * the one defined by {@link #funcCompletionType}. If this is + * null, then a default class loader is used. This field + * will usually be null. + */ + private static ClassLoader DEFAULT_COMPLETION_CLASS_LOADER; + + + /** + * Constructor. + * + * @param provider The provider to get completions for. + * @see #reset(CompletionProvider) + */ + public CompletionXMLParser(CompletionProvider provider) { + this(provider, null); + } + + + /** + * Constructor. + * + * @param provider The provider to get completions for. + * @param cl The class loader to use, if necessary, when loading classes + * from the XML (custom {@link FunctionCompletion}s, for example). + * This may be null if the default is to be used, or + * if the XML does not define specific classes for completion types. + * @see #reset(CompletionProvider) + */ + public CompletionXMLParser(CompletionProvider provider, ClassLoader cl) { + this.provider = provider; + this.completionCL = cl; + if (completionCL==null) { + // May also be null, but that's okay. + completionCL = DEFAULT_COMPLETION_CLASS_LOADER; + } + completions = new ArrayList(); + params = new ArrayList(1); + desc = new StringBuilder(); + paramDesc = new StringBuilder(); + returnValDesc = new StringBuilder(); + paramStartChar = paramEndChar = 0; + paramSeparator = null; + } + + + /** + * Called when character data inside an element is found. + */ + @Override + public void characters(char[] ch, int start, int length) { + if (gettingDesc) { + desc.append(ch, start, length); + } + else if (gettingParamDesc) { + paramDesc.append(ch, start, length); + } + else if (gettingReturnValDesc) { + returnValDesc.append(ch, start, length); + } + } + + + private FunctionCompletion createFunctionCompletion() { + + FunctionCompletion fc = null; + if (funcCompletionType!=null) { + try { + Class clazz = null; + if (completionCL!=null) { + clazz = Class.forName(funcCompletionType, true, + completionCL); + } + else { + clazz = Class.forName(funcCompletionType); + } + Constructor c = clazz.getDeclaredConstructor( + CompletionProvider.class, String.class, String.class); + fc = (FunctionCompletion)c.newInstance(provider, name, + returnType); + } catch (RuntimeException re) { // FindBugs + throw re; + } catch (Exception e) { + + } + } + + if (fc==null) { // Fallback if completion failed for some reason + fc = new FunctionCompletion(provider, name, returnType); + } + + if (desc.length()>0) { + fc.setShortDescription(desc.toString()); + desc.setLength(0); + } + fc.setParams(params); + fc.setDefinedIn(definedIn); + if (returnValDesc.length()>0) { + fc.setReturnValueDescription(returnValDesc.toString()); + returnValDesc.setLength(0); + } + + return fc; + + } + + + private BasicCompletion createOtherCompletion() { + BasicCompletion bc = new BasicCompletion(provider, name); + if (desc.length()>0) { + bc.setSummary(desc.toString()); + desc.setLength(0); + } + return bc; + } + + + private MarkupTagCompletion createMarkupTagCompletion() { + MarkupTagCompletion mc = new MarkupTagCompletion(provider, + name); + if (desc.length()>0) { + mc.setDescription(desc.toString()); + desc.setLength(0); + } + mc.setAttributes(params); + mc.setDefinedIn(definedIn); + return mc; + } + + + private VariableCompletion createVariableCompletion() { + VariableCompletion vc = new VariableCompletion(provider, + name, returnType); + if (desc.length()>0) { + vc.setShortDescription(desc.toString()); + desc.setLength(0); + } + vc.setDefinedIn(definedIn); + return vc; + } + + + /** + * Called when an element is closed. + */ + @Override + public void endElement(String uri, String localName, String qName) { + + if ("keywords".equals(qName)) { + doingKeywords = false; + } + + else if (doingKeywords) { + + if ("keyword".equals(qName)) { + Completion c = null; + if ("function".equals(type)) { + c = createFunctionCompletion(); + } + else if ("constant".equals(type)) { + c = createVariableCompletion(); + } + else if ("tag".equals(type)) { // Markup tag, such as HTML + c = createMarkupTagCompletion(); + } + else if ("other".equals(type)) { + c = createOtherCompletion(); + } + else { + throw new InternalError("Unexpected type: " + type); + } + completions.add(c); + inKeyword = false; + } + else if (inKeyword) { + if ("returnValDesc".equals(qName)) { + gettingReturnValDesc = false; + } + else if (gettingParams) { + if ("params".equals(qName)) { + gettingParams = false; + } + else if ("param".equals(qName)) { + FunctionCompletion.Parameter param = + new FunctionCompletion.Parameter(paramType, + paramName); + if (paramDesc.length()>0) { + param.setDescription(paramDesc.toString()); + paramDesc.setLength(0); + } + params.add(param); + inParam = false; + } + else if (inParam) { + if ("desc".equals(qName)) { + gettingParamDesc = false; + } + } + } + else if ("desc".equals(qName)) { + gettingDesc = false; + } + } + + } + + else if (inCompletionTypes) { + if ("completionTypes".equals(qName)) { + inCompletionTypes = false; + } + } + + } + + + @Override + public void error(SAXParseException e) throws SAXException { + throw e; + } + + /** + * Returns the completions found after parsing the XML. + * + * @return The completions. + */ + public List getCompletions() { + return completions; + } + + + /** + * Returns the parameter end character specified. + * + * @return The character, or 0 if none was specified. + */ + public char getParamEndChar() { + return paramEndChar; + } + + + /** + * Returns the parameter end string specified. + * + * @return The string, or null if none was specified. + */ + public String getParamSeparator() { + return paramSeparator; + } + + + /** + * Returns the parameter start character specified. + * + * @return The character, or 0 if none was specified. + */ + public char getParamStartChar() { + return paramStartChar; + } + + + private static final char getSingleChar(String str) { + return str.length()==1 ? str.charAt(0) : 0; + } + + + /** + * Resets this parser to grab more completions. + * + * @param provider The new provider to get completions for. + */ + public void reset(CompletionProvider provider) { + this.provider = provider; + completions.clear(); + doingKeywords = inKeyword = gettingDesc = gettingParams = inParam = + gettingParamDesc = false; + paramStartChar = paramEndChar = 0; + paramSeparator = null; + } + + + @Override + public InputSource resolveEntity(String publicID, + String systemID) throws SAXException { + return new InputSource(getClass(). + getResourceAsStream("CompletionXml.dtd")); + } + + /** + * Sets the class loader to use when loading custom classes to use for + * various {@link Completion} types, such as {@link FunctionCompletion}s, + * from XML.

+ * + * Users should very rarely have a need to use this method. + * + * @param cl The class loader to use. If this is null, then + * a default is used. + */ + public static void setDefaultCompletionClassLoader(ClassLoader cl) { + DEFAULT_COMPLETION_CLASS_LOADER = cl; + } + + + /** + * Called when an element starts. + */ + @Override + public void startElement(String uri, String localName, String qName, + Attributes attrs) { + if ("keywords".equals(qName)) { + doingKeywords = true; + } + else if (doingKeywords) { + if ("keyword".equals(qName)) { + name = attrs.getValue("name"); + type = attrs.getValue("type"); + returnType = attrs.getValue("returnType"); + params.clear(); + definedIn = attrs.getValue("definedIn"); + inKeyword = true; + } + else if (inKeyword) { + if ("returnValDesc".equals(qName)) { + gettingReturnValDesc = true; + } + else if ("params".equals(qName)) { + gettingParams = true; + } + else if (gettingParams) { + if ("param".equals(qName)) { + paramName = attrs.getValue("name"); + paramType = attrs.getValue("type"); + inParam = true; + } + if (inParam) { + if ("desc".equals(qName)) { + gettingParamDesc = true; + } + } + } + else if ("desc".equals(qName)) { + gettingDesc = true; + } + } + } + else if ("environment".equals(qName)) { + paramStartChar = getSingleChar(attrs.getValue("paramStartChar")); + paramEndChar = getSingleChar(attrs.getValue("paramEndChar")); + paramSeparator = attrs.getValue("paramSeparator"); + //paramTerminal = attrs.getValua("terminal"); + } + else if ("completionTypes".equals(qName)) { + inCompletionTypes = true; + } + else if (inCompletionTypes) { + if ("functionCompletionType".equals(qName)) { + funcCompletionType = attrs.getValue("type"); + } + } + } + + + @Override + public void warning(SAXParseException e) throws SAXException { + throw e; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/CompletionXml.dtd b/designer-base/src/com/fr/design/gui/autocomplete/CompletionXml.dtd new file mode 100644 index 0000000000..10b81e83c9 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/CompletionXml.dtd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + diff --git a/designer-base/src/com/fr/design/gui/autocomplete/DefaultCompletionProvider.java b/designer-base/src/com/fr/design/gui/autocomplete/DefaultCompletionProvider.java new file mode 100644 index 0000000000..4a002cf010 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/DefaultCompletionProvider.java @@ -0,0 +1,374 @@ +/* + * 12/21/2008 + * + * DefaultCompletionProvider.java - A basic completion provider implementation. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.awt.Point; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.Element; +import javax.swing.text.JTextComponent; +import javax.swing.text.Segment; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import org.xml.sax.SAXException; + + +/** + * A basic completion provider implementation. This provider has no + * understanding of language semantics. It simply checks the text entered up + * to the caret position for a match against known completions. This is all + * that is needed in the majority of cases. + * + * @author Robert Futrell + * @version 1.0 + */ +public class DefaultCompletionProvider extends AbstractCompletionProvider { + + protected Segment seg; + + /** + * Used to speed up {@link #getCompletionsAt(JTextComponent, Point)}. + */ + private String lastCompletionsAtText; + + /** + * Used to speed up {@link #getCompletionsAt(JTextComponent, Point)}, + * since this may be called multiple times in succession (this is usually + * called by JTextComponent.getToolTipText(), and if the user + * wiggles the mouse while a tool tip is displayed, this method gets + * repeatedly called. It can be costly so we try to speed it up a tad). + */ + private List lastParameterizedCompletionsAt; + + /** + * Constructor. The returned provider will not be aware of any completions. + * + * @see #addCompletion(Completion) + */ + public DefaultCompletionProvider() { + init(); + } + + + /** + * Creates a completion provider that provides completion for a simple + * list of words. + * + * @param words The words to offer as completion suggestions. If this is + * null, no completions will be known. + * @see BasicCompletion + */ + public DefaultCompletionProvider(String[] words) { + init(); + addWordCompletions(words); + } + + + /** + * Returns the text just before the current caret position that could be + * the start of something auto-completable.

+ * + * This method returns all characters before the caret that are matched + * by {@link #isValidChar(char)}. + * + * {@inheritDoc} + */ + public String getAlreadyEnteredText(JTextComponent comp) { + + Document doc = comp.getDocument(); + + int dot = comp.getCaretPosition(); + Element root = doc.getDefaultRootElement(); + int index = root.getElementIndex(dot); + Element elem = root.getElement(index); + int start = elem.getStartOffset(); + int len = dot-start; + try { + doc.getText(start, len, seg); + } catch (BadLocationException ble) { + + return EMPTY_STRING; + } + + int segEnd = seg.offset + len; + start = segEnd - 1; + while (start>=seg.offset && isValidChar(seg.array[start])) { + start--; + } + start++; + + len = segEnd - start; + return len==0 ? EMPTY_STRING : new String(seg.array, start, len); + + } + + + /** + * {@inheritDoc} + */ + public List getCompletionsAt(JTextComponent tc, Point p) { + + int offset = tc.viewToModel(p); + if (offset<0 || offset>=tc.getDocument().getLength()) { + lastCompletionsAtText = null; + return lastParameterizedCompletionsAt = null; + } + + Segment s = new Segment(); + Document doc = tc.getDocument(); + Element root = doc.getDefaultRootElement(); + int line = root.getElementIndex(offset); + Element elem = root.getElement(line); + int start = elem.getStartOffset(); + int end = elem.getEndOffset() - 1; + + try { + + doc.getText(start, end-start, s); + + // Get the valid chars before the specified offset. + int startOffs = s.offset + (offset-start) - 1; + while (startOffs>=s.offset && isValidChar(s.array[startOffs])) { + startOffs--; + } + + // Get the valid chars at and after the specified offset. + int endOffs = s.offset + (offset-start); + while (endOffs list = getCompletionByInputText(text); + lastCompletionsAtText = text; + return lastParameterizedCompletionsAt = list; + + } catch (BadLocationException ble) { + // Never happens + } + + lastCompletionsAtText = null; + return lastParameterizedCompletionsAt = null; + + } + + + /** + * {@inheritDoc} + */ + public List getParameterizedCompletions( + JTextComponent tc) { + + List list = null; + + // If this provider doesn't support parameterized completions, + // bail out now. + char paramListStart = getParameterListStart(); + if (paramListStart==0) { + return list; // null + } + + int dot = tc.getCaretPosition(); + Segment s = new Segment(); + Document doc = tc.getDocument(); + Element root = doc.getDefaultRootElement(); + int line = root.getElementIndex(dot); + Element elem = root.getElement(line); + int offs = elem.getStartOffset(); + int len = dot - offs - 1/*paramListStart.length()*/; + if (len<=0) { // Not enough chars on line for a method. + return list; // null + } + + try { + + doc.getText(offs, len, s); + + // Get the identifier preceding the '(', ignoring any whitespace + // between them. + offs = s.offset + len - 1; + while (offs>=s.offset && Character.isWhitespace(s.array[offs])) { + offs--; + } + int end = offs; + while (offs>=s.offset && isValidChar(s.array[offs])) { + offs--; + } + + String text = new String(s.array, offs+1, end-offs); + + // Get a list of all Completions matching the text, but then + // narrow it down to just the ParameterizedCompletions. + List l = getCompletionByInputText(text); + if (l!=null && !l.isEmpty()) { + for (int i=0; i(1); + } + list.add((ParameterizedCompletion)o); + } + } + } + + } catch (BadLocationException ble) { + // Never happens + } + + return list; + + } + + + /** + * Initializes this completion provider. + */ + protected void init() { + completions = new ArrayList(); + seg = new Segment(); + } + + + /** + * Returns whether the specified character is valid in an auto-completion. + * The default implementation is equivalent to + * "Character.isLetterOrDigit(ch) || ch=='_'". Subclasses + * can override this method to change what characters are matched. + * + * @param ch The character. + * @return Whether the character is valid. + */ + protected boolean isValidChar(char ch) { + return Character.isLetterOrDigit(ch) || ch=='_'; + } + + + /** + * Loads completions from an XML file. The XML should validate against + * CompletionXml.dtd. + * + * @param file An XML file to load from. + * @throws IOException If an IO error occurs. + */ + public void loadFromXML(File file) throws IOException { + BufferedInputStream bin = new BufferedInputStream( + new FileInputStream(file)); + try { + loadFromXML(bin); + } finally { + bin.close(); + } + } + + + /** + * Loads completions from an XML input stream. The XML should validate + * against CompletionXml.dtd. + * + * @param in The input stream to read from. + * @throws IOException If an IO error occurs. + */ + public void loadFromXML(InputStream in) throws IOException { + loadFromXML(in, null); + } + + + /** + * Loads completions from an XML input stream. The XML should validate + * against CompletionXml.dtd. + * + * @param in The input stream to read from. + * @param cl The class loader to use when loading any extra classes defined + * in the XML, such as custom {@link FunctionCompletion}s. This + * may be null if the default is to be used, or if no + * custom completions are defined in the XML. + * @throws IOException If an IO error occurs. + */ + public void loadFromXML(InputStream in, ClassLoader cl) throws IOException { + + //long start = System.currentTimeMillis(); + + SAXParserFactory factory = SAXParserFactory.newInstance(); + factory.setValidating(true); + CompletionXMLParser handler = new CompletionXMLParser(this, cl); + BufferedInputStream bin = new BufferedInputStream(in); + try { + SAXParser saxParser = factory.newSAXParser(); + saxParser.parse(bin, handler); + List completions = handler.getCompletions(); + addCompletions(completions); + char startChar = handler.getParamStartChar(); + if (startChar!=0) { + char endChar = handler.getParamEndChar(); + String sep = handler.getParamSeparator(); + if (endChar!=0 && sep!=null && sep.length()>0) { // Sanity + setParameterizedCompletionParams(startChar, sep, endChar); + } + } + } catch (SAXException se) { + throw new IOException(se.toString()); + } catch (ParserConfigurationException pce) { + throw new IOException(pce.toString()); + } finally { + //long time = System.currentTimeMillis() - start; + //System.out.println("XML loaded in: " + time + "ms"); + bin.close(); + } + + } + + + /** + * Loads completions from an XML file. The XML should validate against + * CompletionXml.dtd. + * + * @param resource A resource the current ClassLoader can get to. + * @throws IOException If an IO error occurs. + */ + public void loadFromXML(String resource) throws IOException { + ClassLoader cl = getClass().getClassLoader(); + InputStream in = cl.getResourceAsStream(resource); + if (in==null) { + File file = new File(resource); + if (file.isFile()) { + in = new FileInputStream(file); + } + else { + throw new IOException("No such resource: " + resource); + } + } + BufferedInputStream bin = new BufferedInputStream(in); + try { + loadFromXML(bin); + } finally { + bin.close(); + } + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/DelegatingCellRenderer.java b/designer-base/src/com/fr/design/gui/autocomplete/DelegatingCellRenderer.java new file mode 100644 index 0000000000..9c2a5671fa --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/DelegatingCellRenderer.java @@ -0,0 +1,94 @@ +/* + * 12/22/2008 + * + * DelegatingCellRenderer.java - A renderer for Completions that will delegate + * to the Completion's provider's renderer, if there is one. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.awt.Component; +import javax.swing.DefaultListCellRenderer; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.ListCellRenderer; + + +/** + * List cell renderer that delegates to a {@link CompletionProvider}'s + * renderer, if it has one. If it doesn't, it calls into a fallback renderer. + * If a fallback renderer isn't specified, it simply renders + * (({@link Completion})value).toString(). + * + * @author Robert Futrell + * @version 1.0 + */ +class DelegatingCellRenderer extends DefaultListCellRenderer { + + /** + * The renderer to fall back on if one isn't specified by a provider. + * This is usually this. + */ + private ListCellRenderer fallback; + + + /** + * Returns the fallback cell renderer. + * + * @return The fallback cell renderer. + * @see #setFallbackCellRenderer(ListCellRenderer) + */ + public ListCellRenderer getFallbackCellRenderer() { + return fallback; + } + + + /** + * {@inheritDoc} + */ + @Override + public Component getListCellRendererComponent(JList list, Object value, + int index, boolean selected, boolean hasFocus) { + Completion c = (Completion)value; + CompletionProvider p = c.getProvider(); + ListCellRenderer r = p.getListCellRenderer(); + if (r!=null) { + return r.getListCellRendererComponent(list, value, index, selected, + hasFocus); + } + if (fallback==null) { + return super.getListCellRendererComponent(list, value, index, + selected, hasFocus); + } + return fallback.getListCellRendererComponent(list, value, index, + selected, hasFocus); + } + + + /** + * Sets the fallback cell renderer. + * + * @param fallback The fallback cell renderer. If this is + * null, this will be used. + * @see #getFallbackCellRenderer() + */ + public void setFallbackCellRenderer(ListCellRenderer fallback) { + this.fallback = fallback; + } + + + /** + * {@inheritDoc} + */ + @Override + public void updateUI() { + super.updateUI(); + if ((fallback instanceof JComponent) && fallback!=this) { + ((JComponent)fallback).updateUI(); + } + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/DescWindowCallback.java b/designer-base/src/com/fr/design/gui/autocomplete/DescWindowCallback.java new file mode 100644 index 0000000000..ecec26bf0f --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/DescWindowCallback.java @@ -0,0 +1,35 @@ +/* + * 05/11/2012 + * + * Copyright (C) 2012 Robert Futrell + * robert_futrell at users.sourceforge.net + * http://fifesoft.com/rsyntaxtextarea + * + * This library is distributed under a modified BSD license. See the included + * RSTALanguageSupport.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + + +/** + * Passed to {@link ExternalURLHandler}s as a way for them to display a summary + * for a new completion in response to a link event. + * + * @author Robert Futrell + * @version 1.0 + * @see ExternalURLHandler + */ +public interface DescWindowCallback { + + + /** + * Callback allowing a new code completion's description to be displayed + * in the description window. + * + * @param completion The new completion. + * @param anchor The anchor to scroll to, or null if none. + */ + public void showSummaryFor(Completion completion, String anchor); + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/EmptyIcon.java b/designer-base/src/com/fr/design/gui/autocomplete/EmptyIcon.java new file mode 100644 index 0000000000..694ab2b0e0 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/EmptyIcon.java @@ -0,0 +1,49 @@ +/* + * 04/29/2010 + * + * EmptyIcon.java - The canonical icon that paints nothing. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.awt.Component; +import java.awt.Graphics; +import java.io.Serializable; +import javax.swing.Icon; + + +/** + * A standard icon that doesn't paint anything. This can be used when some + * Completions have icons and others don't, to visually align the + * text of all completions. + * + * @author Robert Futrell + * @version 1.0 + */ +public class EmptyIcon implements Icon, Serializable { + + private int size; + + + public EmptyIcon(int size) { + this.size = size; + } + + + public int getIconHeight() { + return size; + } + + + public int getIconWidth() { + return size; + } + + + public void paintIcon(Component c, Graphics g, int x, int y) { + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/ExternalURLHandler.java b/designer-base/src/com/fr/design/gui/autocomplete/ExternalURLHandler.java new file mode 100644 index 0000000000..f4673e073f --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/ExternalURLHandler.java @@ -0,0 +1,46 @@ +/* + * 12/23/2008 + * + * ExternalURLHandler.java - Implementations can be registered as a callback + * to handle the user clicking on external URL's. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import javax.swing.event.HyperlinkEvent; + + +/** + * A callback for when an external URL is clicked in the description window. + * If no handler is installed, and if running in Java 6, the system default + * web browser is used to open the URL. If not running Java 6, nothing will + * happen. If you want browser support for pre-Java 6 JRE's, you will need + * to register one of these callbacks on your {@link AutoCompletion}, and + * open the URL in a web browser yourself.

+ * + * Alternatively, folks implementing robust code completion support for a + * language might install an ExternalURLHandler to handle + * navigating through linked documentation of objects, functions, etc. + * + * @author Robert Futrell + * @version 1.0 + * @see AutoCompletion#setExternalURLHandler(ExternalURLHandler) + */ +public interface ExternalURLHandler { + + + /** + * Called when an external URL is clicked in the description window. + * + * @param e The event containing the hyperlink clicked. + * @param c The completion currently being displayed. + * @param callback Allows you to display new content in the description + * window. + */ + public void urlClicked(HyperlinkEvent e, Completion c, + DescWindowCallback callback); + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/FastListUI.java b/designer-base/src/com/fr/design/gui/autocomplete/FastListUI.java new file mode 100644 index 0000000000..fa172caafa --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/FastListUI.java @@ -0,0 +1,189 @@ +/* + * 04/26/2010 + * + * FastListUI.java - A JList UI implementation that computes the preferred size + * of all cells really fast, to facilitate lists of possibly thousands of items + * rendered with HTML, which is slow with BasicListUI extensions. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.SystemColor; +import javax.swing.JViewport; +import javax.swing.ListCellRenderer; +import javax.swing.ListModel; +import javax.swing.UIManager; +import javax.swing.plaf.basic.BasicListUI; + + +/** + * A custom list UI, used by the completion choices list. If the number of + * completion choices is "large," it does a fast estimate of the preferred + * width and height of list items. This allows HTML renderers to be used (such + * as {@link CompletionCellRenderer}), with thousands of completion choices, + * with no performance penalty. With standard BasicListUI subclasses, this can + * cause very poor performance each time the list is displayed, which + * is bad for lists that are repeatedly hidden and re-displayed, such as + * completion choices. This is all because the calculation to get the + * preferred size of each list item, when it is displayed with HTML, is slow. + * + * @author Robert Futrell + * @version 1.0 + */ +class FastListUI extends BasicListUI { + + /** + * Whether the selection background was overridden (usually because of + * Nimbus) so we know to manually uninstall the color we installed. + */ + private boolean overriddenBackground; + + /** + * Whether the selection foreground was overridden (usually because of + * Nimbus) so we know to manually uninstall the color we installed. + */ + private boolean overriddenForeground; + + /** + * If there are more than this many completions in a single list, this + * UI will estimate the cell width and height needed for each item instead + * of computing it, for performance reasons. + */ + private static final int ESTIMATION_THRESHOLD = 200; + + + private Color determineSelectionBackground() { + Color c = UIManager.getColor("List.selectionBackground"); + if (c==null) { + c = UIManager.getColor("nimbusSelectionBackground"); + if (c==null) { // Not Nimbus, but still need a value - fallback + c = UIManager.getColor("textHighlight"); + if (c==null) { + c = SystemColor.textHighlight; + } + } + } + + // Nimbus unfortunately requires a Color, not a ColorUIResource, for + // the background override to work. This causes this color to "stick" + // even if the LAF is changed to something else later. "c" here may + // actually be a ColorUIResource + return new Color(c.getRGB());//new ColorUIResource(c); + + } + + + private Color determineSelectionForeground() { + Color c = UIManager.getColor("List.selectionForeground"); + if (c==null) { + c = UIManager.getColor("nimbusSelectedText"); + if (c==null) { // Not Nimbus, but still need a value - fallback + c = UIManager.getColor("textHighlightText"); + if (c==null) { + c = SystemColor.textHighlightText; + } + } + } + // Nimbus unfortunately requires Color, not ColorUIResource, and "c" + // may actually be a ColorUIResource + return new Color(c.getRGB()); + } + + + /** + * Overridden to ensure we have selection background/foreground colors + * defined, even if we're in some weirdo LAF such as Nimbus which doesn't + * define them. Since FastListUI extends BasicListUI, we need these values + * to be defined. + */ + @Override + protected void installDefaults() { + + super.installDefaults(); + + if (list.getSelectionBackground()==null) { + list.setSelectionBackground(determineSelectionBackground()); + overriddenBackground = true; + } + + if (list.getSelectionForeground()==null) { + list.setSelectionForeground(determineSelectionForeground()); + overriddenForeground = true; + } + } + + + /** + * Overridden to work around a Nimbus issue. + */ + @Override + protected void uninstallDefaults() { + + super.uninstallDefaults(); + + if (overriddenBackground) { + list.setSelectionBackground(null); + } + + if (overriddenForeground) { + list.setSelectionForeground(null); + } + + } + + + /** + * Recalculates the cell width and height of each cell in the list. This + * method is overridden to do a fast estimation if the completion list is + * too long, to improve performance for lists with huge amounts of + * completions. + */ + @Override + protected void updateLayoutState() { + + ListModel model = list.getModel(); + int itemCount = model.getSize(); + + // If the item count is small enough to run fast on practically all + // machines, go ahead and use the super implementation to determine + // the optimal cell sizes. + if (itemCount0) { + Object value = model.getElementAt(0); + java.awt.Component c = renderer.getListCellRendererComponent(list, + value, 0, false, false); + rendererPane.add(c); + Dimension cellSize = c.getPreferredSize(); + cellHeight = cellSize.height; + cellWidth = Math.max(cellWidth, cellSize.width); + } + else { + cellHeight = 20; + } + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/FunctionCompletion.java b/designer-base/src/com/fr/design/gui/autocomplete/FunctionCompletion.java new file mode 100644 index 0000000000..f6bbbfffd8 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/FunctionCompletion.java @@ -0,0 +1,322 @@ +/* + * 12/22/2008 + * + * FunctionCompletion.java - A completion representing a function. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.util.ArrayList; +import java.util.List; +import javax.swing.text.BadLocationException; +import javax.swing.text.JTextComponent; +import javax.swing.text.Position; + + +/** + * A completion choice representing a function. + * + * @author Robert Futrell + * @version 1.0 + */ +public class FunctionCompletion extends VariableCompletion + implements ParameterizedCompletion { + + /** + * Parameters to the function. + */ + private List params; + + /** + * A description of the return value of this function. + */ + private String returnValDesc; + + + /** + * Constructor. + * + * @param provider The parent provider. + * @param name The name of this function. + * @param returnType The return type of this function. + */ + public FunctionCompletion(CompletionProvider provider, String name, + String returnType) { + super(provider, name, returnType); + } + + + @Override + protected void addDefinitionString(StringBuilder sb) { + sb.append(""); + sb.append(getDefinitionString()); + sb.append(""); + } + + + /** + * Adds HTML describing the parameters to this function to a buffer. + * + * @param sb The buffer to append to. + */ + protected void addParameters(StringBuilder sb) { + + // TODO: Localize me + + int paramCount = getParamCount(); + if (paramCount>0) { + sb.append("Parameters:
"); + sb.append("

"); + for (int i=0; i"); + sb.append(param.getName()!=null ? param.getName() : + param.getType()); + sb.append(" "); + String desc = param.getDescription(); + if (desc!=null) { + sb.append(desc); + } + sb.append("
"); + } + sb.append("


"); + } + + if (returnValDesc!=null) { + sb.append("Returns:
"); + sb.append(returnValDesc); + sb.append("


"); + } + + } + + + /** + * Returns the "definition string" for this function completion. For + * example, for the C "printf" function, this would return + * "int printf(const char *, ...)". + * + * @return The definition string. + */ + @Override + public String getDefinitionString() { + + StringBuilder sb = new StringBuilder(); + + // Add the return type if applicable (C macros like NULL have no type). + String type = getType(); + if (type!=null) { + sb.append(type).append(' '); + } + + // Add the item being described's name. + sb.append(getName()); + + // Add parameters for functions. + CompletionProvider provider = getProvider(); + char start = provider.getParameterListStart(); + if (start!=0) { + sb.append(start); + } + for (int i=0; i 2 - + // thanks to Matthew Adereth! + String sep = getProvider().getParameterListSeparator(); + if (i0 ? (dot+firstParamLen) : dot; + info.setInitialSelection(dot, selectionEnd); + info.setTextToInsert(sb.toString()); + return info; + + } + + + /** + * {@inheritDoc} + */ + public Parameter getParam(int index) { + return params.get(index); + } + + + /** + * Returns the number of parameters to this function. + * + * @return The number of parameters to this function. + * @see #getParam(int) + */ + public int getParamCount() { + return params==null ? 0 : params.size(); + } + + + /** + * {@inheritDoc} + */ + public boolean getShowParameterToolTip() { + return true; + } + + + /** + * Returns the text to insert for a parameter. + * + * @param param The parameter. + * @return The text. + */ + private String getParamText(ParameterizedCompletion.Parameter param) { + String text = param.getName(); + if (text==null) { + text = param.getType(); + if (text==null) { // Shouldn't ever happen + text = "arg"; + } + } + return text; + } + + + /** + * Returns the description of the return value of this function. + * + * @return The description, or null if there is none. + * @see #setReturnValueDescription(String) + */ + public String getReturnValueDescription() { + return returnValDesc; + } + + + /** + * {@inheritDoc} + */ + @Override + public String getSummary() { + StringBuilder sb = new StringBuilder(); + addDefinitionString(sb); + if (!possiblyAddDescription(sb)) { + sb.append("


"); + } + addParameters(sb); + possiblyAddDefinedIn(sb); + return sb.toString(); + } + + + /** + * {@inheritDoc} + */ + @Override + public String getToolTipText() { + String text = getSummary(); + if (text==null) { + text = getDefinitionString(); + } + return text; + } + + + /** + * Sets the parameters to this function. + * + * @param params The parameters. This should be a list of + * {@link ParameterizedCompletion.Parameter}s. + * @see #getParam(int) + * @see #getParamCount() + */ + public void setParams(List params) { + if (params!=null) { + // Deep copy so parsing can re-use its array. + this.params = new ArrayList(params); + } + } + + + /** + * Sets the description of the return value of this function. + * + * @param desc The description. + * @see #getReturnValueDescription() + */ + public void setReturnValueDescription(String desc) { + this.returnValDesc = desc; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java b/designer-base/src/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java new file mode 100644 index 0000000000..b9d9afcc08 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/LanguageAwareCompletionProvider.java @@ -0,0 +1,429 @@ +/* + * 01/03/2009 + * + * LanguageAwareCompletionProvider.java - A completion provider that is aware + * of the language it is working with. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.awt.Point; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import javax.swing.text.JTextComponent; + +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxDocument; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxUtilities; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.Token; +import com.fr.design.gui.syntax.ui.rtextarea.RTextArea; +import com.fr.design.gui.syntax.ui.rtextarea.ToolTipSupplier; + + +/** + * A completion provider for the C programming language (and other languages + * with similar syntax). This provider simply delegates to another provider, + * depending on whether the caret is in: + * + *
    + *
  • Code (plain text)
  • + *
  • A string
  • + *
  • A comment
  • + *
  • A documentation comment
  • + *
+ * + * This allows for different completion choices in comments than in code, + * for example.

+ * + * This provider also implements the + * org.fife.ui.rtextarea.ToolTipSupplier interface, which allows it + * to display tooltips for completion choices. Thus the standard + * {@link VariableCompletion} and {@link FunctionCompletion} completions should + * be able to display tooltips with the variable declaration or function + * definition (provided the RSyntaxTextArea was registered with the + * javax.swing.ToolTipManager). + * + * @author Robert Futrell + * @version 1.0 + */ +public class LanguageAwareCompletionProvider extends CompletionProviderBase + implements ToolTipSupplier { + + /** + * The provider to use when no provider is assigned to a particular token + * type. + */ + private CompletionProvider defaultProvider; + + /** + * The provider to use when completing in a string. + */ + private CompletionProvider stringCompletionProvider; + + /** + * The provider to use when completing in a comment. + */ + private CompletionProvider commentCompletionProvider; + + /** + * The provider to use while in documentation comments. + */ + private CompletionProvider docCommentCompletionProvider; + + + /** + * Constructor subclasses can use when they don't have their default + * provider created at construction time. They should call + * {@link #setDefaultCompletionProvider(CompletionProvider)} in this + * constructor. + */ + protected LanguageAwareCompletionProvider() { + } + + + /** + * Constructor. + * + * @param defaultProvider The provider to use when no provider is assigned + * to a particular token type. This cannot be null. + */ + public LanguageAwareCompletionProvider(CompletionProvider defaultProvider) { + setDefaultCompletionProvider(defaultProvider); + } + + + /** + * Calling this method will result in an + * {@link UnsupportedOperationException} being thrown. To set the + * parameter completion parameters, do so on the provider returned by + * {@link #getDefaultCompletionProvider()}. + * + * @throws UnsupportedOperationException Always. + * @see #setParameterizedCompletionParams(char, String, char) + */ + @Override + public void clearParameterizedCompletionParams() { + throw new UnsupportedOperationException(); + } + + + /** + * {@inheritDoc} + */ + public String getAlreadyEnteredText(JTextComponent comp) { + if (!(comp instanceof RSyntaxTextArea)) { + return EMPTY_STRING; + } + CompletionProvider provider = getProviderFor(comp); + return provider!=null ? provider.getAlreadyEnteredText(comp) : null; + } + + + /** + * Returns the completion provider to use for comments. + * + * @return The completion provider to use. + * @see #setCommentCompletionProvider(CompletionProvider) + */ + public CompletionProvider getCommentCompletionProvider() { + return commentCompletionProvider; + } + + + /** + * {@inheritDoc} + */ + public List getCompletionsAt(JTextComponent tc, Point p) { + return defaultProvider==null ? null : + defaultProvider.getCompletionsAt(tc, p); + } + + + /** + * Does the dirty work of creating a list of completions. + * + * @param comp The text component to look in. + * @return The list of possible completions, or an empty list if there + * are none. + */ + @Override + protected List getCompletionsImpl(JTextComponent comp) { + if (!(comp instanceof RSyntaxTextArea)) { + return new ArrayList(0); + } + CompletionProvider provider = getProviderFor(comp); + if (provider!=null) { + return provider.getCompletions(comp); + } + return Collections.emptyList(); + } + + + /** + * Returns the completion provider used when one isn't defined for a + * particular token type. + * + * @return The completion provider to use. + * @see #setDefaultCompletionProvider(CompletionProvider) + */ + public CompletionProvider getDefaultCompletionProvider() { + return defaultProvider; + } + + + /** + * Returns the completion provider to use for documentation comments. + * + * @return The completion provider to use. + * @see #setDocCommentCompletionProvider(CompletionProvider) + */ + public CompletionProvider getDocCommentCompletionProvider() { + return docCommentCompletionProvider; + } + + + /** + * {@inheritDoc} + */ + public List getParameterizedCompletions( + JTextComponent tc) { + // Parameterized completions can only come from the "code" completion + // provider. We do not do function/method completions while editing + // strings or comments. + CompletionProvider provider = getProviderFor(tc); + return provider==defaultProvider ? + provider.getParameterizedCompletions(tc) : null; + } + + + /** + * {@inheritDoc} + */ + @Override + public char getParameterListEnd() { + return defaultProvider.getParameterListEnd(); + } + + + /** + * {@inheritDoc} + */ + @Override + public String getParameterListSeparator() { + return defaultProvider.getParameterListSeparator(); + } + + + /** + * {@inheritDoc} + */ + @Override + public char getParameterListStart() { + return defaultProvider.getParameterListStart(); + } + + + /** + * Returns the completion provider to use at the current caret position in + * a text component. + * + * @param comp The text component to check. + * @return The completion provider to use. + */ + private CompletionProvider getProviderFor(JTextComponent comp) { + + RSyntaxTextArea rsta = (RSyntaxTextArea)comp; + RSyntaxDocument doc = (RSyntaxDocument)rsta.getDocument(); + int line = rsta.getCaretLineNumber(); + Token t = doc.getTokenListForLine(line); + if (t==null) { + return getDefaultCompletionProvider(); + } + + int dot = rsta.getCaretPosition(); + Token curToken = RSyntaxUtilities.getTokenAtOffset(t, dot); + + if (curToken==null) { // At end of the line + + int type = doc.getLastTokenTypeOnLine(line); + if (type==Token.NULL) { + Token temp = t.getLastPaintableToken(); + if (temp==null) { + return getDefaultCompletionProvider(); + } + type = temp.getType(); + } + + // TokenMakers can use types < 0 for "internal types." This + // gives them a chance to map their internal types back to "real" + // types to get completion providers. + else if (type<0) { + type = doc.getClosestStandardTokenTypeForInternalType(type); + } + + switch (type) { + case Token.ERROR_STRING_DOUBLE: + return getStringCompletionProvider(); + case Token.COMMENT_EOL: + case Token.COMMENT_MULTILINE: + return getCommentCompletionProvider(); + case Token.COMMENT_DOCUMENTATION: + return getDocCommentCompletionProvider(); + default: + return getDefaultCompletionProvider(); + } + + } + + // FIXME: This isn't always a safe assumption. + if (dot==curToken.getOffset()) { // At the very beginning of a new token + // Need to check previous token for its type before deciding. + // Previous token may also be on previous line! + return getDefaultCompletionProvider(); + } + + switch (curToken.getType()) { + case Token.LITERAL_STRING_DOUBLE_QUOTE: + case Token.ERROR_STRING_DOUBLE: + return getStringCompletionProvider(); + case Token.COMMENT_EOL: + case Token.COMMENT_MULTILINE: + return getCommentCompletionProvider(); + case Token.COMMENT_DOCUMENTATION: + return getDocCommentCompletionProvider(); + case Token.NULL: + case Token.WHITESPACE: + case Token.IDENTIFIER: + case Token.VARIABLE: + case Token.PREPROCESSOR: + case Token.DATA_TYPE: + case Token.FUNCTION: + case Token.OPERATOR: + return getDefaultCompletionProvider(); + } + + return null; // In a token type we can't auto-complete from. + + } + + + /** + * Returns the completion provider to use for strings. + * + * @return The completion provider to use. + * @see #setStringCompletionProvider(CompletionProvider) + */ + public CompletionProvider getStringCompletionProvider() { + return stringCompletionProvider; + } + + + /** + * {@inheritDoc} + */ + @Override + public boolean isAutoActivateOkay(JTextComponent tc) { + CompletionProvider provider = getProviderFor(tc); + return provider!=null ? provider.isAutoActivateOkay(tc) : false; + } + + + /** + * Sets the comment completion provider. + * + * @param provider The provider to use in comments. + * @see #getCommentCompletionProvider() + */ + public void setCommentCompletionProvider(CompletionProvider provider) { + this.commentCompletionProvider = provider; + } + + + /** + * Sets the default completion provider. + * + * @param provider The provider to use when no provider is assigned to a + * particular token type. This cannot be null. + * @see #getDefaultCompletionProvider() + */ + public void setDefaultCompletionProvider(CompletionProvider provider) { + if (provider==null) { + throw new IllegalArgumentException("provider cannot be null"); + } + this.defaultProvider = provider; + } + + + /** + * Sets the documentation comment completion provider. + * + * @param provider The provider to use in comments. + * @see #getDocCommentCompletionProvider() + */ + public void setDocCommentCompletionProvider(CompletionProvider provider) { + this.docCommentCompletionProvider = provider; + } + + + /** + * Calling this method will result in an + * {@link UnsupportedOperationException} being thrown. To set the + * parameter completion parameters, do so on the provider returned by + * {@link #getDefaultCompletionProvider()}. + * + * @throws UnsupportedOperationException Always. + * @see #clearParameterizedCompletionParams() + */ + @Override + public void setParameterizedCompletionParams(char listStart, + String separator, char listEnd) { + throw new UnsupportedOperationException(); + } + + + /** + * Sets the completion provider to use while in a string. + * + * @param provider The provider to use. + * @see #getStringCompletionProvider() + */ + public void setStringCompletionProvider(CompletionProvider provider) { + stringCompletionProvider = provider; + } + + + /** + * Returns the tool tip to display for a mouse event.

+ * + * For this method to be called, the RSyntaxTextArea must be + * registered with the javax.swing.ToolTipManager like so: + * + *

+	 * ToolTipManager.sharedInstance().registerComponent(textArea);
+	 * 
+ * + * @param textArea The text area. + * @param e The mouse event. + * @return The tool tip text, or null if none. + */ + public String getToolTipText(RTextArea textArea, MouseEvent e) { + + String tip = null; + + List completions = getCompletionsAt(textArea, e.getPoint()); + if (completions!=null && completions.size()>0) { + // Only ever 1 match for us in C... + Completion c = completions.get(0); + tip = c.getToolTipText(); + } + + return tip; + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/LinkRedirector.java b/designer-base/src/com/fr/design/gui/autocomplete/LinkRedirector.java new file mode 100644 index 0000000000..b51c9872bc --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/LinkRedirector.java @@ -0,0 +1,20 @@ +package com.fr.design.gui.autocomplete; + +import java.net.URL; + + +/** + * Possibly redirects one URL to another. Useful if you want "external" URL's + * in code completion documentation to point to a local copy instead, for + * example. + * + * @author Robert Futrell + * @version 1.0 + */ +public interface LinkRedirector { + + + public URL possiblyRedirect(URL original); + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/MarkupTagCompletion.java b/designer-base/src/com/fr/design/gui/autocomplete/MarkupTagCompletion.java new file mode 100644 index 0000000000..d0dcd170fa --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/MarkupTagCompletion.java @@ -0,0 +1,240 @@ +/* + * 01/06/2009 + * + * MarkupTagComletion.java - A completion representing a tag in markup, such + * as HTML or XML. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.util.ArrayList; +import java.util.List; + +import com.fr.design.gui.autocomplete.ParameterizedCompletion.Parameter; + + +/** + * A completion representing a tag in markup, such as HTML or XML. + * + * @author Robert Futrell + * @version 1.0 + */ +public class MarkupTagCompletion extends AbstractCompletion { + + private String name; + private String desc; + private String definedIn; + + /** + * Attributes of the tag. + */ + private List attrs; + + + /** + * Constructor. + * + * @param provider The parent provider instance. + * @param name The name of the tag. + */ + public MarkupTagCompletion(CompletionProvider provider, String name) { + super(provider); + this.name = name; + } + + + /** + * Adds HTML describing the attributes of this tag to a buffer. + * + * @param sb The buffer to append to. + */ + protected void addAttributes(StringBuilder sb) { + + // TODO: Localize me. + + int attrCount = getAttributeCount(); + if (attrCount>0) { + sb.append("Attributes:
"); + sb.append("
"); + for (int i=0; i"); + sb.append(attr.getName()!=null ? attr.getName() : + attr.getType()); + sb.append(" "); + String desc = attr.getDescription(); + if (desc!=null) { + sb.append(desc); + } + sb.append("
"); + } + sb.append("


"); + } + + } + + + protected void addDefinitionString(StringBuilder sb) { + sb.append("").append(name).append(""); + } + + + /** + * Returns all attributes of this tag. + * + * @return A list of {@link ParameterizedCompletion.Parameter}s. + * @see #getAttribute(int) + * @see #getAttributeCount() + */ + public List getAttributes() { + return attrs; + } + + + /** + * Returns the specified {@link ParameterizedCompletion.Parameter}. + * + * @param index The index of the attribute to retrieve. + * @return The attribute. + * @see #getAttributeCount() + */ + public Parameter getAttribute(int index) { + return attrs.get(index); + } + + + /** + * Returns the number of attributes of this tag. + * + * @return The number of attributes of this tag. + * @see #getAttribute(int) + */ + public int getAttributeCount() { + return attrs==null ? 0 : attrs.size(); + } + + + /** + * Returns where this variable is defined. + * + * @return Where this variable is defined. + * @see #setDefinedIn(String) + */ + public String getDefinedIn() { + return definedIn; + } + + + /** + * Returns a short description of this variable. This should be an + * HTML snippet. + * + * @return A short description of this variable. This may be + * null. + * @see #setDescription(String) + */ + public String getDescription() { + return desc; + } + + + /** + * Returns the name of this tag. + * + * @return The name of this tag. + */ + public String getName() { + return name; + } + + + /** + * {@inheritDoc} + */ + public String getReplacementText() { + return getName(); + } + + + /** + * {@inheritDoc} + */ + public String getSummary() { + StringBuilder sb = new StringBuilder(); + addDefinitionString(sb); + possiblyAddDescription(sb); + addAttributes(sb); + possiblyAddDefinedIn(sb); + return sb.toString(); + } + + + /** + * Adds some HTML describing where this variable is defined, if this + * information is known. + * + * @param sb The buffer to append to. + */ + protected void possiblyAddDefinedIn(StringBuilder sb) { + if (definedIn!=null) { + sb.append("
Defined in:"); // TODO: Localize me + sb.append(" ").append(definedIn).append(""); + } + } + + + /** + * Adds the description text as HTML to a buffer, if a description is + * defined. + * + * @param sb The buffer to append to. + */ + protected void possiblyAddDescription(StringBuilder sb) { + if (desc!=null) { + sb.append("

"); + sb.append(desc); + sb.append("


"); + } + } + + + /** + * Sets where this variable is defined. + * + * @param definedIn Where this variable is defined. + * @see #getDefinedIn() + */ + public void setDefinedIn(String definedIn) { + this.definedIn = definedIn; + } + + + /** + * Sets the short description of this tag. This should be an + * HTML snippet. + * + * @param desc A short description of this tag. This may be + * null. + * @see #getDescription() + */ + public void setDescription(String desc) { + this.desc = desc; + } + + + /** + * Sets the attributes of this tag. + * + * @param attrs The attributes. + * @see #getAttribute(int) + * @see #getAttributeCount() + */ + public void setAttributes(List attrs) { + // Deep copy so parsing can re-use its array. + this.attrs = new ArrayList(attrs); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/OutlineHighlightPainter.java b/designer-base/src/com/fr/design/gui/autocomplete/OutlineHighlightPainter.java new file mode 100644 index 0000000000..6804107198 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/OutlineHighlightPainter.java @@ -0,0 +1,143 @@ +/* + * 04/26/2009 + * + * OutlineHighlightPainter.java - Highlight painter that draws an outline + * around its text. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Rectangle; +import java.awt.Shape; +import javax.swing.text.BadLocationException; +import javax.swing.text.DefaultHighlighter; +import javax.swing.text.JTextComponent; +import javax.swing.text.Position; +import javax.swing.text.View; + + +/** + * Highlight painter that draws an outline around the text. This is used to + * draw bounds around function/method parameters. + * + * @author Robert Futrell + * @version 1.0 + */ +/* + * NOTE: Whenever you see text like "Workaround for Java Highlight issues", + * this is because highlighted text in a JTextComponent gets "pushed" forward + * when the caret is at the Highlight's start, when we need it to instead get + * prepended to. For this reason, the auto-complete package adds its Highlights + * 1 char too long (1 char earlier than where it should really start), but only + * paint the Highlight from the 2nd char on. + */ +class OutlineHighlightPainter extends + DefaultHighlighter.DefaultHighlightPainter { + + /** + * DefaultHighlightPainter doesn't allow changing color, so we must cache + * ours here. + */ + private Color color; + + + /** + * Constructor. + * + * @param color The color to draw the bounding boxes with. This cannot + * be null. + */ + public OutlineHighlightPainter(Color color) { + super(color); + setColor(color); + } + + + /** + * Returns the color to paint bounding boxes with. + * + * @return The color. + * @see #setColor(Color) + */ + @Override + public Color getColor() { + return color; + } + + + /** + * {@inheritDoc} + */ + @Override + public Shape paintLayer(Graphics g, int p0, int p1, Shape viewBounds, + JTextComponent c, View view) { + + g.setColor(getColor()); + p0++; // Workaround for Java Highlight issues. + + // This special case isn't needed for most standard Swing Views (which + // always return a width of 1 for modelToView() calls), but it is + // needed for RSTA views, which actually return the width of chars for + // modelToView calls. But this should be faster anyway, as we + // short-circuit and do only one modelToView() for one offset. + if (p0==p1) { + try { + Shape s = view.modelToView(p0, viewBounds, + Position.Bias.Forward); + Rectangle r = s.getBounds(); + g.drawLine(r.x, r.y, r.x, r.y+r.height); + return r; + } catch (BadLocationException ble) { + // Never happens + return null; + } + } + + if (p0 == view.getStartOffset() && p1 == view.getEndOffset()) { + // Contained in view, can just use bounds. + Rectangle alloc; + if (viewBounds instanceof Rectangle) { + alloc = (Rectangle) viewBounds; + } else { + alloc = viewBounds.getBounds(); + } + g.drawRect(alloc.x, alloc.y, alloc.width - 1, alloc.height - 1); + return alloc; + } + + // Should only render part of View. + try { + // --- determine locations --- + Shape shape = view.modelToView(p0, Position.Bias.Forward, p1, + Position.Bias.Backward, viewBounds); + Rectangle r = (shape instanceof Rectangle) ? (Rectangle) shape + : shape.getBounds(); + g.drawRect(r.x, r.y, r.width - 1, r.height - 1); + return r; + } catch (BadLocationException e) { // Never happens + + return null; + } + + } + + + /** + * Sets the color to paint the bounding boxes with. + * + * @param color The new color. This cannot be null. + * @see #getColor() + */ + public void setColor(Color color) { + if (color==null) { + throw new IllegalArgumentException("color cannot be null"); + } + this.color = color; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/ParameterChoicesProvider.java b/designer-base/src/com/fr/design/gui/autocomplete/ParameterChoicesProvider.java new file mode 100644 index 0000000000..d2b1a37afe --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/ParameterChoicesProvider.java @@ -0,0 +1,40 @@ +/* + * 12/14/2010 + * + * ParameterChoicesProvider.java - Provides completions for a + * ParameterizedCompletion's parameters. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.util.List; +import javax.swing.text.JTextComponent; + + +/** + * Provides completions for a {@link ParameterizedCompletion}'s parameters. + * So, for example, if the user code-completes a function or method, if + * a ParameterChoicesProvider is installed, it can return possible + * completions for the parameters to that function or method. + * + * @author Robert Futrell + * @version 1.0 + */ +public interface ParameterChoicesProvider { + + + /** + * Returns a list of choices for a specific parameter. + * + * @param tc The text component. + * @param param The currently focused parameter. + * @return The list of parameters. This may be null for + * "no parameters," but might also be an empty list. + */ + public List getParameterChoices(JTextComponent tc, + ParameterizedCompletion.Parameter param); + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletion.java b/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletion.java new file mode 100644 index 0000000000..9ddea1f919 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletion.java @@ -0,0 +1,172 @@ +/* + * 12/11/2010 + * + * ParameterizedCompletion.java - A completion option. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import javax.swing.text.JTextComponent; + + +/** + * A completion option that takes parameters, such as a function or method. + * + * @author Robert Futrell + * @version 1.0 + */ +public interface ParameterizedCompletion extends Completion { + + + /** + * Returns the "definition string" for this completion. For example, + * for the C "printf" function, this would return + * "int printf(const char *, ...)". + * + * @return The definition string. + */ + public String getDefinitionString(); + + + /** + * Returns the specified {@link Parameter}. + * + * @param index The index of the parameter to retrieve. + * @return The parameter. + * @see #getParamCount() + */ + public Parameter getParam(int index); + + + /** + * Returns the number of parameters this completion takes. + * + * @return The number of parameters this completion takes. + * @see #getParam(int) + */ + public int getParamCount(); + + + public ParameterizedCompletionInsertionInfo getInsertionInfo( + JTextComponent tc, boolean replaceTabsWithSpaces); + + + /** + * Returns whether a tool tip displaying assistance for each parameter + * while it is being edited is appropriate for this completion. + * + * @return Whether the tool tip is appropriate to display. + */ + public boolean getShowParameterToolTip(); + + + /** + * A parameter passed to a parameterized {@link Completion}. + */ + public static class Parameter { + + private String name; + private Object type; + private String desc; + private boolean isEndParam; + + /** + * Constructor. + * + * @param type The type of this parameter. This may be + * null for languages without specific types, + * dynamic typing, etc. Usually you'll pass a String for this + * value, but you may pass any object representing a type in + * your language, as long as its toString() method + * returns a string representation of the type. + * @param name The name of the parameter. + */ + public Parameter(Object type, String name) { + this(type, name, false); + } + + /** + * Constructor. + * + * @param type The type of this parameter. This may be + * null for languages without specific types, + * dynamic typing, etc. Usually you'll pass a String for this + * value, but you may pass any object representing a type in + * your language, as long as its toString() method + * returns a string representation of the type. + * @param name The name of the parameter. + * @param endParam Whether this parameter is an "ending parameter;" + * that is, whether this parameter is at a logical "ending + * point" in the completion text. If the user types in a + * parameter that is an ending point, parameter completion mode + * terminates. Set this to true for a trailing + * parameter after a function call's closing ')', for example. + */ + public Parameter(Object type, String name, boolean endParam) { + this.name = name; + this.type = type; + this.isEndParam = endParam; + } + + public String getDescription() { + return desc; + } + + public String getName() { + return name; + } + + /** + * Returns the type of this parameter, as a string. + * + * @return The type of the parameter, or null for none. + */ + public String getType() { + return type==null ? null : type.toString(); + } + + /** + * Returns the object used to describe the type of this parameter. + * + * @return The type object, or null for none. + */ + public Object getTypeObject() { + return type; + } + + /** + * @return Whether this parameter is an "ending parameter;" + * that is, whether this parameter is at a logical "ending + * point" in the completion text. If the user types in a + * parameter that is an ending point, parameter completion mode + * terminates. + */ + public boolean isEndParam() { + return isEndParam; + } + + public void setDescription(String desc) { + this.desc = desc; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if (getType()!=null) { + sb.append(getType()); + } + if (getName()!=null) { + if (getType()!=null) { + sb.append(' '); + } + sb.append(getName()); + } + return sb.toString(); + } + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionChoicesWindow.java b/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionChoicesWindow.java new file mode 100644 index 0000000000..19d114a918 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionChoicesWindow.java @@ -0,0 +1,301 @@ +/* + * 12/11/2010 + * + * ParameterizedCompletionChoicesWindow.java - A list of likely choices for a + * parameter. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.PopupWindowDecorator; + +import javax.swing.*; +import javax.swing.text.JTextComponent; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + + +/** + * A small popup window offering a list of likely choices for a parameter + * when the user has code-completed a parameterized completion. For example, + * if they have just code-completed the C function "fprintf", + * when entering the file name, this popup might display all local variables + * of type "char *". + * + * @author Robert Futrell + * @version 1.0 + */ +public class ParameterizedCompletionChoicesWindow extends JWindow { + + /** + * The parent AutoCompletion instance. + */ + private AutoCompletion ac; + + /** + * The list of completion choices. + */ + private JList list; + + /** + * The currently displayed completion choices. + */ + private DefaultListModel model; + + /** + * A list of lists of choices for each parameter. + */ + private List> choicesListList; + + /** + * The scroll pane containing the list. + */ + private JScrollPane sp; + + /** + * Comparator used to sort completions by their relevance before sorting + * them lexicographically. + */ + private static final Comparator sortByRelevanceComparator = + new SortByRelevanceComparator(); + + + /** + * Constructor. + * + * @param parent The parent window (hosting the text component). + * @param ac The auto-completion instance. + * @param context The completion context. + */ + public ParameterizedCompletionChoicesWindow(Window parent, + AutoCompletion ac, + final ParameterizedCompletionContext context) { + + super(parent); + this.ac = ac; + ComponentOrientation o = ac.getTextComponentOrientation(); + + model = new DefaultListModel(); + list = new JList(model); + if (ac.getParamChoicesRenderer() != null) { + list.setCellRenderer(ac.getParamChoicesRenderer()); + } + list.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + context.insertSelectedChoice(); + } + } + }); + sp = new JScrollPane(list); + + setContentPane(sp); + applyComponentOrientation(o); + setFocusableWindowState(false); + + // Give apps a chance to decorate us with drop shadows, etc. + PopupWindowDecorator decorator = PopupWindowDecorator.get(); + if (decorator != null) { + decorator.decorate(this); + } + + } + + + /** + * Returns the selected value. + * + * @return The selected value, or null if nothing is + * selected. + */ + public String getSelectedChoice() { + Completion c = (Completion) list.getSelectedValue(); + return c == null ? null : c.toString(); + } + + + /** + * Changes the selected index. + * + * @param amount The amount by which to change the selected index. + */ + public void incSelection(int amount) { + int selection = list.getSelectedIndex(); + selection += amount; + if (selection < 0) { + // Account for nothing selected yet + selection = model.getSize() - 1;//+= model.getSize(); + } else { + selection %= model.getSize(); + } + list.setSelectedIndex(selection); + list.ensureIndexIsVisible(selection); + } + + + /** + * Initializes this window to offer suggestions for the parameters of + * a specific completion. + * + * @param pc The completion whose parameters we should offer suggestions + * for. + */ + public void initialize(ParameterizedCompletion pc) { + + CompletionProvider provider = pc.getProvider(); + ParameterChoicesProvider pcp = provider.getParameterChoicesProvider(); + if (pcp == null) { + choicesListList = null; + return; + } + + int paramCount = pc.getParamCount(); + choicesListList = new ArrayList>(paramCount); + JTextComponent tc = ac.getTextComponent(); + + for (int i = 0; i < paramCount; i++) { + ParameterizedCompletion.Parameter param = pc.getParam(i); + List choices = pcp.getParameterChoices(tc, param); + choicesListList.add(choices); + } + + } + + + /** + * Sets the location of this window relative to the given rectangle. + * + * @param r The visual position of the caret (in screen coordinates). + */ + public void setLocationRelativeTo(Rectangle r) { + + // Multi-monitor support - make sure the completion window (and + // description window, if applicable) both fit in the same window in + // a multi-monitor environment. To do this, we decide which monitor + // the rectangle "r" is in, and use that one (just pick top-left corner + // as the defining point). + Rectangle screenBounds = Util.getScreenBoundsForPoint(r.x, r.y); + //Dimension screenSize = tooltip.getToolkit().getScreenSize(); + + // Try putting our stuff "below" the caret first. + int y = r.y + r.height + 5; + + // Get x-coordinate of completions. Try to align left edge with the + // caret first. + int x = r.x; + if (x < screenBounds.x) { + x = screenBounds.x; + } else if (x + getWidth() > screenBounds.x + screenBounds.width) { // completions don't fit + x = screenBounds.x + screenBounds.width - getWidth(); + } + + setLocation(x, y); + + } + + + /** + * Displays the choices for the specified parameter matching the given + * text. This will display or hide this popup window as necessary. + * + * @param param The index of the parameter the caret is currently in. + * This may be -1 if not in a parameter (i.e., on + * the comma between parameters). + * @param prefix Text in the parameter before the dot. This may + * be null to represent the empty string. + */ + public void setParameter(int param, String prefix) { + + model.clear(); + List temp = new ArrayList(); + + if (choicesListList != null && param >= 0 && param < choicesListList.size()) { + + List choices = choicesListList.get(param); + if (choices != null) { + for (Completion c : choices) { + String choice = c.getReplacementText(); + if (prefix == null || Util.startsWithIgnoreCase(choice, prefix)) { + temp.add(c); + } + } + } + + // Sort completions appropriately. + Comparator c = null; + if (/*sortByRelevance*/true) { + c = sortByRelevanceComparator; + } + Collections.sort(temp, c); + for (int i = 0; i < temp.size(); i++) { + model.addElement(temp.get(i)); + } + + int visibleRowCount = Math.min(model.size(), 10); + list.setVisibleRowCount(visibleRowCount); + + // Toggle visibility, if necessary. + if (visibleRowCount == 0 && isVisible()) { + setVisible(false); + } else if (visibleRowCount > 0) { + Dimension size = getPreferredSize(); + if (size.width < 150) { + setSize(150, size.height); + } else { + pack(); + } + // Make sure nothing is ever obscured by vertical scroll bar. + if (sp.getVerticalScrollBar() != null && + sp.getVerticalScrollBar().isVisible()) { + size = getSize(); + int w = size.width + sp.getVerticalScrollBar().getWidth() + 5; + setSize(w, size.height); + } + list.setSelectedIndex(0); + list.ensureIndexIsVisible(0); + if (!isVisible()) { + setVisible(true); + } + } + + } else { + setVisible(false); + } + + } + + + /** + * Toggles the visibility of this popup window. + * + * @param visible Whether this window should be visible. + */ + @Override + public void setVisible(boolean visible) { + if (visible != isVisible()) { + // i.e. if no possibilities matched what's been typed + if (visible && model.size() == 0) {//list.getVisibleRowCount()==0) { + return; + } + super.setVisible(visible); + } + } + + + /** + * Updates the LookAndFeel of this window. + */ + public void updateUI() { + SwingUtilities.updateComponentTreeUI(this); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java b/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java new file mode 100644 index 0000000000..8b93f8540a --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionContext.java @@ -0,0 +1,1190 @@ +/* + * 06/17/2012 + * + * ParameritizedCompletionContext.java - Manages the state of parameterized + * completion-related UI components during code completion. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import com.fr.design.gui.autocomplete.ParameterizedCompletion.Parameter; +import com.fr.design.gui.autocomplete.ParameterizedCompletionInsertionInfo.ReplacementCopy; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.DocumentRange; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea; +import com.fr.design.gui.syntax.ui.rtextarea.ChangeableHighlightPainter; +import com.fr.general.FRLogger; + +import javax.swing.*; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.*; +import javax.swing.text.Highlighter.Highlight; +import javax.swing.text.Highlighter.HighlightPainter; +import java.awt.*; +import java.awt.event.*; +import java.util.ArrayList; +import java.util.List; + + +/** + * Manages UI and state specific to parameterized completions - the parameter + * description tool tip, the parameter completion choices list, the actual + * highlights in the editor, etc. This component installs new key bindings + * when appropriate to allow the user to cycle through the parameters of the + * completion, and optionally cycle through completion choices for those + * parameters. + * + * @author Robert Futrell + * @version 1.0 + */ +class ParameterizedCompletionContext { + + /** + * The parent window. + */ + private Window parentWindow; + + /** + * The parent AutoCompletion instance. + */ + private AutoCompletion ac; + + /** + * The completion being described. + */ + private ParameterizedCompletion pc; + + /** + * Whether parameterized completion assistance is active. + */ + private boolean active; + + /** + * A tool tip displaying the currently edited parameter name and type. + */ + private ParameterizedCompletionDescriptionToolTip tip; + + /** + * The painter to paint borders around the variables. + */ + private Highlighter.HighlightPainter p; + + private Highlighter.HighlightPainter endingP; + + private Highlighter.HighlightPainter paramCopyP; + + /** + * The tags for the highlights around parameters. + */ + private List tags; + + private List paramCopyInfos; + + private transient boolean ignoringDocumentEvents; + + /** + * Listens for events in the text component while this window is visible. + */ + private Listener listener; + + /** + * The minimum offset into the document that the caret can move to + * before this tool tip disappears. + */ + private int minPos; + + /** + * The maximum offset into the document that the caret can move to + * before this tool tip disappears. + */ + private Position maxPos; // Moves with text inserted. + + private Position defaultEndOffs; + + /** + * The currently "selected" parameter in the displayed text. + */ + private int lastSelectedParam; + + /** + * A small popup window giving likely choices for parameterized completions. + */ + private ParameterizedCompletionChoicesWindow paramChoicesWindow; + + /** + * The text before the caret for the current parameter. If + * {@link #paramChoicesWindow} is non-null, this is used to + * determine what parameter choices to actually show. + */ + private String paramPrefix; + + private Object oldTabKey; + private Action oldTabAction; + private Object oldShiftTabKey; + private Action oldShiftTabAction; + private Object oldUpKey; + private Action oldUpAction; + private Object oldDownKey; + private Action oldDownAction; + private Object oldEnterKey; + private Action oldEnterAction; + private Object oldEscapeKey; + private Action oldEscapeAction; + private Object oldClosingKey; + private Action oldClosingAction; + + private static final String IM_KEY_TAB = "ParamCompKey.Tab"; + private static final String IM_KEY_SHIFT_TAB = "ParamCompKey.ShiftTab"; + private static final String IM_KEY_UP = "ParamCompKey.Up"; + private static final String IM_KEY_DOWN = "ParamCompKey.Down"; + private static final String IM_KEY_ESCAPE = "ParamCompKey.Escape"; + private static final String IM_KEY_ENTER = "ParamCompKey.Enter"; + private static final String IM_KEY_CLOSING = "ParamCompKey.Closing"; + + + /** + * Constructor. + */ + public ParameterizedCompletionContext(Window owner, + AutoCompletion ac, ParameterizedCompletion pc) { + + this.parentWindow = owner; + this.ac = ac; + this.pc = pc; + listener = new Listener(); + + AutoCompletionStyleContext sc = AutoCompletion.getStyleContext(); + p = new OutlineHighlightPainter(sc.getParameterOutlineColor()); + endingP = new OutlineHighlightPainter( + sc.getParameterizedCompletionCursorPositionColor()); + paramCopyP = new ChangeableHighlightPainter(sc.getParameterCopyColor()); + tags = new ArrayList(1); // Usually small + paramCopyInfos = new ArrayList(1); + + } + + + /** + * Activates parameter completion support. + * + * @see #deactivate() + */ + public void activate() { + + if (active) { + return; + } + + active = true; + JTextComponent tc = ac.getTextComponent(); + lastSelectedParam = -1; + + if (pc.getShowParameterToolTip()) { + tip = new ParameterizedCompletionDescriptionToolTip( + parentWindow, this, ac, pc); + try { + int dot = tc.getCaretPosition(); + Rectangle r = tc.modelToView(dot); + Point p = new Point(r.x, r.y); + SwingUtilities.convertPointToScreen(p, tc); + r.x = p.x; + r.y = p.y; + tip.setLocationRelativeTo(r); + tip.setVisible(true); + } catch (BadLocationException ble) { // Should never happen + UIManager.getLookAndFeel().provideErrorFeedback(tc); + + tip = null; + } + } + + listener.install(tc); + // First time through, we'll need to create this window. + if (paramChoicesWindow == null) { + paramChoicesWindow = createParamChoicesWindow(); + } + lastSelectedParam = getCurrentParameterIndex(); + prepareParamChoicesWindow(); + paramChoicesWindow.setVisible(true); + + } + + + /** + * Creates the completion window offering suggestions for parameters. + * + * @return The window. + */ + private ParameterizedCompletionChoicesWindow createParamChoicesWindow() { + ParameterizedCompletionChoicesWindow pcw = + new ParameterizedCompletionChoicesWindow(parentWindow, + ac, this); + pcw.initialize(pc); + return pcw; + } + + + /** + * Hides any popup windows and terminates parameterized completion + * assistance. + * + * @see #activate() + */ + public void deactivate() { + if (!active) { + return; + } + active = false; + listener.uninstall(); + if (tip != null) { + tip.setVisible(false); + } + if (paramChoicesWindow != null) { + paramChoicesWindow.setVisible(false); + } + } + + + /** + * Returns the text inserted for the parameter containing the specified + * offset. + * + * @param offs The offset into the document. + * @return The text of the parameter containing the offset, or + * null if the offset is not in a parameter. + */ + public String getArgumentText(int offs) { + List paramHighlights = getParameterHighlights(); + if (paramHighlights == null || paramHighlights.size() == 0) { + return null; + } + for (Highlight h : paramHighlights) { + if (offs >= h.getStartOffset() && offs <= h.getEndOffset()) { + int start = h.getStartOffset() + 1; + int len = h.getEndOffset() - start; + JTextComponent tc = ac.getTextComponent(); + Document doc = tc.getDocument(); + try { + return doc.getText(start, len); + } catch (BadLocationException ble) { + UIManager.getLookAndFeel().provideErrorFeedback(tc); + + return null; + } + } + } + return null; + } + + + /** + * Returns the highlight of the current parameter. + * + * @return The current parameter's highlight, or null if + * the caret is not in a parameter's bounds. + * @see #getCurrentParameterStartOffset() + */ + private Highlight getCurrentParameterHighlight() { + + JTextComponent tc = ac.getTextComponent(); + int dot = tc.getCaretPosition(); + if (dot > 0) { + dot--; // Workaround for Java Highlight issues + } + + List paramHighlights = getParameterHighlights(); + for (Highlight h : paramHighlights) { + if (dot >= h.getStartOffset() && dot < h.getEndOffset()) { + return h; + } + } + + return null; + + } + + + private int getCurrentParameterIndex() { + + JTextComponent tc = ac.getTextComponent(); + int dot = tc.getCaretPosition(); + if (dot > 0) { + dot--; // Workaround for Java Highlight issues + } + + List paramHighlights = getParameterHighlights(); + for (int i = 0; i < paramHighlights.size(); i++) { + Highlight h = paramHighlights.get(i); + if (dot >= h.getStartOffset() && dot < h.getEndOffset()) { + return i; + } + } + + return -1; + + } + + + /** + * Returns the starting offset of the current parameter. + * + * @return The current parameter's starting offset, or -1 if + * the caret is not in a parameter's bounds. + * @see #getCurrentParameterHighlight() + */ + private int getCurrentParameterStartOffset() { + Highlight h = getCurrentParameterHighlight(); + return h != null ? h.getStartOffset() + 1 : -1; + } + + + /** + * Returns the highlight from a list that comes "first" in a list. Even + * though most parameter highlights are ordered, sometimes they aren't + * (e.g. the "cursor" parameter in a template completion is always last, + * even though it can be anywhere in the template). + * + * @param highlights The list of highlights. Assumed to be non-empty. + * @return The highlight that comes first in the document. + * @see #getLastHighlight(List) + */ + private static final int getFirstHighlight(List highlights) { + int first = -1; + Highlight firstH = null; + for (int i = 0; i < highlights.size(); i++) { + Highlight h = highlights.get(i); + if (firstH == null || h.getStartOffset() < firstH.getStartOffset()) { + firstH = h; + first = i; + } + } + return first; + } + + + /** + * Returns the highlight from a list that comes "last" in that list. Even + * though most parameter highlights are ordered, sometimes they aren't + * (e.g. the "cursor" parameter in a template completion is always last, + * even though it can be anywhere in the template. + * + * @param highlights The list of highlights. Assumed to be non-empty. + * @return The highlight that comes last in the document. + * @see #getFirstHighlight(List) + */ + private static final int getLastHighlight(List highlights) { + int last = -1; + Highlight lastH = null; + for (int i = highlights.size() - 1; i >= 0; i--) { + Highlight h = highlights.get(i); + if (lastH == null || h.getStartOffset() > lastH.getStartOffset()) { + lastH = h; + last = i; + } + } + return last; + } + + + public List getParameterHighlights() { + List paramHighlights = new ArrayList(2); + JTextComponent tc = ac.getTextComponent(); + Highlight[] highlights = tc.getHighlighter().getHighlights(); + for (int i = 0; i < highlights.length; i++) { + HighlightPainter painter = highlights[i].getPainter(); + if (painter == p || painter == endingP) { + paramHighlights.add(highlights[i]); + } + } + return paramHighlights; + } + + + /** + * Inserts the choice selected in the parameter choices window. + * + * @return Whether the choice was inserted. This will be false + * if the window is not visible, or no choice is selected. + */ + boolean insertSelectedChoice() { + if (paramChoicesWindow != null && paramChoicesWindow.isVisible()) { + String choice = paramChoicesWindow.getSelectedChoice(); + if (choice != null) { + JTextComponent tc = ac.getTextComponent(); + Highlight h = getCurrentParameterHighlight(); + if (h != null) { + // "+1" is a workaround for Java Highlight issues. + tc.setSelectionStart(h.getStartOffset() + 1); + tc.setSelectionEnd(h.getEndOffset()); + tc.replaceSelection(choice); + moveToNextParam(); + } else { + UIManager.getLookAndFeel().provideErrorFeedback(tc); + } + return true; + } + } + return false; + } + + + /** + * Installs key bindings on the text component that facilitate the user + * editing this completion's parameters. + * + * @see #uninstallKeyBindings() + */ + private void installKeyBindings() { + if (AutoCompletion.isDebug()) { + FRLogger.getLogger().debug("CompletionContext: Installing keybindings"); + } + JTextComponent tc = ac.getTextComponent(); + InputMap im = tc.getInputMap(); + ActionMap am = tc.getActionMap(); + + KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0); + oldTabKey = im.get(ks); + im.put(ks, IM_KEY_TAB); + oldTabAction = am.get(IM_KEY_TAB); + am.put(IM_KEY_TAB, new NextParamAction()); + + ks = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_MASK); + oldShiftTabKey = im.get(ks); + im.put(ks, IM_KEY_SHIFT_TAB); + oldShiftTabAction = am.get(IM_KEY_SHIFT_TAB); + am.put(IM_KEY_SHIFT_TAB, new PrevParamAction()); + + ks = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0); + oldUpKey = im.get(ks); + im.put(ks, IM_KEY_UP); + oldUpAction = am.get(IM_KEY_UP); + am.put(IM_KEY_UP, new NextChoiceAction(-1, oldUpAction)); + + ks = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0); + oldDownKey = im.get(ks); + im.put(ks, IM_KEY_DOWN); + oldDownAction = am.get(IM_KEY_DOWN); + am.put(IM_KEY_DOWN, new NextChoiceAction(1, oldDownAction)); + + ks = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); + oldEnterKey = im.get(ks); + im.put(ks, IM_KEY_ENTER); + oldEnterAction = am.get(IM_KEY_ENTER); + am.put(IM_KEY_ENTER, new GotoEndAction()); + + ks = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); + oldEscapeKey = im.get(ks); + im.put(ks, IM_KEY_ESCAPE); + oldEscapeAction = am.get(IM_KEY_ESCAPE); + am.put(IM_KEY_ESCAPE, new HideAction()); + + char end = pc.getProvider().getParameterListEnd(); + ks = KeyStroke.getKeyStroke(end); + oldClosingKey = im.get(ks); + im.put(ks, IM_KEY_CLOSING); + oldClosingAction = am.get(IM_KEY_CLOSING); + am.put(IM_KEY_CLOSING, new ClosingAction()); + } + + + /** + * Moves to and selects the next parameter. + * + * @see #moveToPreviousParam() + */ + private void moveToNextParam() { + + JTextComponent tc = ac.getTextComponent(); + int dot = tc.getCaretPosition(); + int tagCount = tags.size(); + if (tagCount == 0) { + tc.setCaretPosition(maxPos.getOffset()); + deactivate(); + } + + Highlight currentNext = null; + int pos = -1; + List highlights = getParameterHighlights(); + for (int i = 0; i < highlights.size(); i++) { + Highlight hl = highlights.get(i); + if (needUpdate(currentNext, hl, dot)) { + currentNext = hl; + pos = i; + } + } + + // No params after caret - go to first one + if (currentNext.getStartOffset() + 1 <= dot) { + int nextIndex = getFirstHighlight(highlights); + currentNext = highlights.get(nextIndex); + pos = 0; + } + + // "+1" is a workaround for Java Highlight issues. + tc.setSelectionStart(currentNext.getStartOffset() + 1); + tc.setSelectionEnd(currentNext.getEndOffset()); + updateToolTipText(pos); + + } + + private boolean needUpdate(Highlight currentNext, Highlight hl, int dot) { + // Check "< dot", not "<= dot" as OutlineHighlightPainter paints + // starting at one char AFTER the highlight starts, to work around + // Java issue. Thanks to Matthew Adereth! + return currentNext == null || currentNext.getStartOffset() dot && + hl.getStartOffset() <= currentNext.getStartOffset()); + } + + + /** + * Moves to and selects the previous parameter. + * + * @see #moveToNextParam() + */ + private void moveToPreviousParam() { + + JTextComponent tc = ac.getTextComponent(); + + int tagCount = tags.size(); + if (tagCount == 0) { // Should never happen + tc.setCaretPosition(maxPos.getOffset()); + deactivate(); + } + + int dot = tc.getCaretPosition(); + int selStart = tc.getSelectionStart() - 1; // Workaround for Java Highlight issues. + Highlight currentPrev = null; + int pos = 0; + List highlights = getParameterHighlights(); + + for (int i = 0; i < highlights.size(); i++) { + Highlight h = highlights.get(i); + if (pos == lastSelectedParam || needUpdate(currentPrev, dot, h, selStart)) { + currentPrev = h; + pos = i; + } + } + + // Loop back from param 0 to last param. + int firstIndex = getFirstHighlight(highlights); + //if (pos==0 && lastSelectedParam==0 && highlights.size()>1) { + if (pos == firstIndex && lastSelectedParam == firstIndex && highlights.size() > 1) { + pos = getLastHighlight(highlights); + currentPrev = highlights.get(pos); + // "+1" is a workaround for Java Highlight issues. + tc.setSelectionStart(currentPrev.getStartOffset() + 1); + tc.setSelectionEnd(currentPrev.getEndOffset()); + updateToolTipText(pos); + } else if (currentPrev != null && dot > currentPrev.getStartOffset()) { + // "+1" is a workaround for Java Highlight issues. + tc.setSelectionStart(currentPrev.getStartOffset() + 1); + tc.setSelectionEnd(currentPrev.getEndOffset()); + updateToolTipText(pos); + } else { + tc.setCaretPosition(maxPos.getOffset()); + deactivate(); + } + + } + + private boolean needUpdate(Highlight currentPrev, int dot, Highlight h, int selStart) { + return currentPrev == null + || currentPrev.getStartOffset() >= dot + || (currentPrev.getStartOffset() < h.getStartOffset() && h.getStartOffset() < selStart); + } + + + private void possiblyUpdateParamCopies(Document doc) { + + int index = getCurrentParameterIndex(); + // FunctionCompletions add an extra param at end of inserted text + if (index > -1 && index < pc.getParamCount()) { + + // Typing in an "end parameter" => stop parameter assistance. + Parameter param = pc.getParam(index); + if (param.isEndParam()) { + deactivate(); + return; + } + + // Get the current value of the current parameter. + List paramHighlights = getParameterHighlights(); + Highlight h = paramHighlights.get(index); + int start = h.getStartOffset() + 1; // param offsets are offset (!) by 1 + int len = h.getEndOffset() - start; + String replacement = null; + try { + replacement = doc.getText(start, len); + } catch (BadLocationException ble) { + // Never happens + } + + // Replace any param copies tracking this parameter with the + // value of this parameter. + for (ParamCopyInfo pci : paramCopyInfos) { + if (pci.paramName.equals(param.getName())) { + pci.h = replaceHighlightedText(doc, pci.h, replacement); + } + } + + } else { // Probably the "end parameter" for FunctionCompletions. + deactivate(); + } + + } + + + /** + * Updates the optional window listing likely completion choices, + */ + private void prepareParamChoicesWindow() { + + // If this window was set to null, the user pressed Escape to hide it + if (paramChoicesWindow != null) { + + int offs = getCurrentParameterStartOffset(); + if (offs == -1) { + paramChoicesWindow.setVisible(false); + return; + } + + JTextComponent tc = ac.getTextComponent(); + try { + Rectangle r = tc.modelToView(offs); + Point p = new Point(r.x, r.y); + SwingUtilities.convertPointToScreen(p, tc); + r.x = p.x; + r.y = p.y; + paramChoicesWindow.setLocationRelativeTo(r); + } catch (BadLocationException ble) { // Should never happen + UIManager.getLookAndFeel().provideErrorFeedback(tc); + + } + + // Toggles visibility, if necessary. + paramChoicesWindow.setParameter(lastSelectedParam, paramPrefix); + + } + + } + + + /** + * Removes the bounding boxes around parameters. + */ + private void removeParameterHighlights() { + JTextComponent tc = ac.getTextComponent(); + Highlighter h = tc.getHighlighter(); + for (int i = 0; i < tags.size(); i++) { + h.removeHighlight(tags.get(i)); + } + tags.clear(); + for (ParamCopyInfo pci : paramCopyInfos) { + h.removeHighlight(pci.h); + } + paramCopyInfos.clear(); + } + + + /** + * Replaces highlighted text with new text. Takes special care so that + * the highlight stays just around the newly-highlighted text, since + * Swing's Highlight classes are funny about insertions at + * their start offsets. + * + * @param doc The document. + * @param h The highlight whose text to change. + * @param replacement The new text to be in the highlight. + * @return The replacement highlight for h. + */ + private Highlight replaceHighlightedText(Document doc, Highlight h, + String replacement) { + try { + + int start = h.getStartOffset(); + int len = h.getEndOffset() - start; + Highlighter highlighter = ac.getTextComponent().getHighlighter(); + highlighter.removeHighlight(h); + + if (doc instanceof AbstractDocument) { + ((AbstractDocument) doc).replace(start, len, replacement, null); + } else { + doc.remove(start, len); + doc.insertString(start, replacement, null); + } + + int newEnd = start + replacement.length(); + h = (Highlight) highlighter.addHighlight(start, newEnd, paramCopyP); + return h; + + } catch (BadLocationException ble) { + // Never happens + } + + return null; + + } + + + /** + * Removes the key bindings we installed. + * + * @see #installKeyBindings() + */ + private void uninstallKeyBindings() { + + if (AutoCompletion.isDebug()) { + FRLogger.getLogger().debug("CompletionContext Uninstalling keybindings"); + } + + JTextComponent tc = ac.getTextComponent(); + InputMap im = tc.getInputMap(); + ActionMap am = tc.getActionMap(); + + KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0); + im.put(ks, oldTabKey); + am.put(IM_KEY_TAB, oldTabAction); + + ks = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_MASK); + im.put(ks, oldShiftTabKey); + am.put(IM_KEY_SHIFT_TAB, oldShiftTabAction); + + ks = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0); + im.put(ks, oldUpKey); + am.put(IM_KEY_UP, oldUpAction); + + ks = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0); + im.put(ks, oldDownKey); + am.put(IM_KEY_DOWN, oldDownAction); + + ks = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); + im.put(ks, oldEnterKey); + am.put(IM_KEY_ENTER, oldEnterAction); + + ks = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); + im.put(ks, oldEscapeKey); + am.put(IM_KEY_ESCAPE, oldEscapeAction); + + char end = pc.getProvider().getParameterListEnd(); + ks = KeyStroke.getKeyStroke(end); + im.put(ks, oldClosingKey); + am.put(IM_KEY_CLOSING, oldClosingAction); + + } + + + /** + * Updates the text in the tool tip to have the current parameter + * displayed in bold. The "current parameter" is determined from the + * current caret position. + * + * @return The "prefix" of text in the caret's parameter before the caret. + */ + private String updateToolTipText() { + + JTextComponent tc = ac.getTextComponent(); + int dot = tc.getSelectionStart(); + int mark = tc.getSelectionEnd(); + int index = -1; + String paramPrefix = null; + + List paramHighlights = getParameterHighlights(); + for (int i = 0; i < paramHighlights.size(); i++) { + Highlight h = paramHighlights.get(i); + // "+1" because of param hack - see OutlineHighlightPainter + int start = h.getStartOffset() + 1; + if (dot >= start && dot <= h.getEndOffset()) { + try { + // All text selected => offer all suggestions, otherwise + // use prefix before selection + if (dot != start || mark != h.getEndOffset()) { + paramPrefix = tc.getText(start, dot - start); + } + } catch (BadLocationException ble) { + + } + index = i; + break; + } + } + + updateToolTipText(index); + return paramPrefix; + + } + + + private void updateToolTipText(int selectedParam) { + if (selectedParam != lastSelectedParam) { + if (tip != null) { + tip.updateText(selectedParam); + } + this.lastSelectedParam = selectedParam; + } + } + + + /** + * Updates the LookAndFeel of all popup windows this context + * manages. + */ + public void updateUI() { + if (tip != null) { + tip.updateUI(); + } + if (paramChoicesWindow != null) { + paramChoicesWindow.updateUI(); + } + } + + + /** + * Called when the user presses Enter while entering parameters. + */ + private class GotoEndAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + + // If the param choices window is visible and something is chosen, + // replace the parameter with it and move to the next one. + if (paramChoicesWindow != null && paramChoicesWindow.isVisible()) { + if (insertSelectedChoice()) { + return; + } + } + + // Otherwise, just move to the end. + deactivate(); + JTextComponent tc = ac.getTextComponent(); + int dot = tc.getCaretPosition(); + if (dot != defaultEndOffs.getOffset()) { + tc.setCaretPosition(defaultEndOffs.getOffset()); + } else { + // oldEnterAction isn't what we're looking for (wrong key) + Action a = getDefaultEnterAction(tc); + if (a != null) { + a.actionPerformed(e); + } else { + tc.replaceSelection("\n"); + } + } + + } + + private Action getDefaultEnterAction(JTextComponent tc) { + ActionMap am = tc.getActionMap(); + return am.get(DefaultEditorKit.insertBreakAction); + } + + } + + + /** + * Called when the user types the character marking the closing of the + * parameter list, such as ')'. + */ + private class ClosingAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + + JTextComponent tc = ac.getTextComponent(); + int dot = tc.getCaretPosition(); + char end = pc.getProvider().getParameterListEnd(); + + // Are they at or past the end of the parameters? + if (dot >= maxPos.getOffset() - 2) { // ">=" for overwrite mode + + // Try to decide if we're closing a paren that is a part + // of the (last) arg being typed. + String text = getArgumentText(dot); + if (text != null) { + char start = pc.getProvider().getParameterListStart(); + int startCount = getCount(text, start); + int endCount = getCount(text, end); + if (startCount > endCount) { // Just closing a paren + tc.replaceSelection(Character.toString(end)); + return; + } + } + //tc.setCaretPosition(maxPos.getOffset()); + tc.setCaretPosition(Math.min(tc.getCaretPosition() + 1, + tc.getDocument().getLength())); + + deactivate(); + + } + + // If not (in the middle of parameters), just insert the paren. + else { + tc.replaceSelection(Character.toString(end)); + } + + } + + public int getCount(String text, char ch) { + int count = 0; + int old = 0; + int pos = 0; + while ((pos = text.indexOf(ch, old)) > -1) { + count++; + old = pos + 1; + } + + return count; + } + + } + + + /** + * Action performed when the user hits the escape key. + */ + private class HideAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + // On first escape press, if the param choices window is visible, + // just remove it, but keep ability to tab through params. If + // param choices window isn't visible, or second escape press, + // exit tabbing through params entirely. + if (paramChoicesWindow != null && paramChoicesWindow.isVisible()) { + paramChoicesWindow.setVisible(false); + paramChoicesWindow = null; + } else { + deactivate(); + } + } + + } + + + /** + * Listens for various events in the text component while this tool tip + * is visible. + */ + private class Listener implements FocusListener, CaretListener, + DocumentListener { + + private boolean markOccurrencesEnabled; + + /** + * Called when the text component's caret moves. + * + * @param e The event. + */ + public void caretUpdate(CaretEvent e) { + if (maxPos == null) { // Sanity check + deactivate(); + return; + } + int dot = e.getDot(); + if (dot < minPos || dot > maxPos.getOffset()) { + deactivate(); + return; + } + paramPrefix = updateToolTipText(); + if (active) { + prepareParamChoicesWindow(); + } + } + + + public void changedUpdate(DocumentEvent e) { + } + + + /** + * Called when the text component gains focus. + * + * @param e The event. + */ + public void focusGained(FocusEvent e) { + // Do nothing + } + + + /** + * Called when the text component loses focus. + * + * @param e The event. + */ + public void focusLost(FocusEvent e) { + deactivate(); + } + + + private void handleDocumentEvent(final DocumentEvent e) { + if (!ignoringDocumentEvents) { + ignoringDocumentEvents = true; + SwingUtilities.invokeLater(new Runnable() { + public void run() { + possiblyUpdateParamCopies(e.getDocument()); + ignoringDocumentEvents = false; + } + }); + } + } + + + public void insertUpdate(DocumentEvent e) { + handleDocumentEvent(e); + } + + + /** + * Installs this listener onto a text component. + * + * @param tc The text component to install onto. + * @see #uninstall() + */ + public void install(JTextComponent tc) { + boolean replaceTabs = false; + if (tc instanceof RSyntaxTextArea) { + RSyntaxTextArea textArea = (RSyntaxTextArea) tc; + markOccurrencesEnabled = textArea.getMarkOccurrences(); + textArea.setMarkOccurrences(false); + replaceTabs = textArea.getTabsEmulated(); + } + + Highlighter h = tc.getHighlighter(); + try { + // Insert the parameter text + ParameterizedCompletionInsertionInfo info = pc.getInsertionInfo(tc, replaceTabs); + tc.replaceSelection(info.getTextToInsert()); + // Add highlights around the parameters. + final int replacementCount = info.getReplacementCount(); + for (int i = 0; i < replacementCount; i++) { + DocumentRange dr = info.getReplacementLocation(i); + HighlightPainter painter = i < replacementCount - 1 ? p : endingP; + // "-1" is a workaround for Java Highlight issues. + tags.add(h.addHighlight( + dr.getStartOffset() - 1, dr.getEndOffset(), painter)); + } + for (int i = 0; i < info.getReplacementCopyCount(); i++) { + ReplacementCopy rc = info.getReplacementCopy(i); + paramCopyInfos.add(new ParamCopyInfo(rc.getId(), + (Highlight) h.addHighlight(rc.getStart(), rc.getEnd(), paramCopyP))); + } + // Go back and start at the first parameter. + tc.setCaretPosition(info.getSelectionStart()); + if (info.hasSelection()) { + tc.moveCaretPosition(info.getSelectionEnd()); + } + minPos = info.getMinOffset(); + maxPos = info.getMaxOffset(); + try { + defaultEndOffs = tc.getDocument().createPosition(info.getDefaultEndOffs()); + } catch (BadLocationException ble) { + // Never happens + } + // Listen for document events AFTER we insert + tc.getDocument().addDocumentListener(this); + } catch (BadLocationException ble) { + // Never happens + } + // Add listeners to the text component, AFTER text insertion. + tc.addCaretListener(this); + tc.addFocusListener(this); + installKeyBindings(); + } + + public void removeUpdate(DocumentEvent e) { + handleDocumentEvent(e); + } + + + /** + * Uninstalls this listener from the current text component. + */ + public void uninstall() { + + JTextComponent tc = ac.getTextComponent(); + tc.removeCaretListener(this); + tc.removeFocusListener(this); + tc.getDocument().removeDocumentListener(this); + uninstallKeyBindings(); + + if (markOccurrencesEnabled) { + ((RSyntaxTextArea) tc).setMarkOccurrences(markOccurrencesEnabled); + } + + // Remove WeakReferences in javax.swing.text. + maxPos = null; + minPos = -1; + removeParameterHighlights(); + + } + + + } + + + /** + * Action performed when the user presses the up or down arrow keys and + * the parameter completion choices popup is visible. + */ + private class NextChoiceAction extends AbstractAction { + + private Action oldAction; + private int amount; + + public NextChoiceAction(int amount, Action oldAction) { + this.amount = amount; + this.oldAction = oldAction; + } + + public void actionPerformed(ActionEvent e) { + if (paramChoicesWindow != null && paramChoicesWindow.isVisible()) { + paramChoicesWindow.incSelection(amount); + } else if (oldAction != null) { + oldAction.actionPerformed(e); + } else { + deactivate(); + } + } + + } + + + /** + * Action performed when the user hits the tab key. + */ + private class NextParamAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + moveToNextParam(); + } + + } + + + private static class ParamCopyInfo { + + private String paramName; + private Highlight h; + + public ParamCopyInfo(String paramName, Highlight h) { + this.paramName = paramName; + this.h = h; + } + + } + + + /** + * Action performed when the user hits shift+tab. + */ + private class PrevParamAction extends AbstractAction { + + public void actionPerformed(ActionEvent e) { + moveToPreviousParam(); + } + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionDescriptionToolTip.java b/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionDescriptionToolTip.java new file mode 100644 index 0000000000..65b7a6cea9 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionDescriptionToolTip.java @@ -0,0 +1,204 @@ +/* + * 12/21/2008 + * + * ParameterizedCompletionDescriptionToolTip.java - A "tool tip" displaying + * information on the function or method currently being entered. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.PopupWindowDecorator; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxUtilities; + +import javax.swing.*; +import java.awt.*; + + +/** + * A "tool tip" that displays information on the function or method currently + * being entered. + * + * @author Robert Futrell + * @version 1.0 + */ +class ParameterizedCompletionDescriptionToolTip { + + /** + * The actual tool tip. + */ + private JWindow tooltip; + + /** + * The label that holds the description. + */ + private JLabel descLabel; + + /** + * The completion being described. + */ + private ParameterizedCompletion pc; + + + /** + * Constructor. + * + * @param owner The parent window. + * @param ac The parent auto-completion. + * @param pc The completion being described. + */ + public ParameterizedCompletionDescriptionToolTip(Window owner, + ParameterizedCompletionContext context, + AutoCompletion ac, ParameterizedCompletion pc) { + + tooltip = new JWindow(owner); + + this.pc = pc; + + descLabel = new JLabel(); + descLabel.setBorder(BorderFactory.createCompoundBorder( + TipUtil.getToolTipBorder(), + BorderFactory.createEmptyBorder(2, 5, 2, 5))); + descLabel.setOpaque(true); + descLabel.setBackground(TipUtil.getToolTipBackground()); + // It appears that if a JLabel is set as a content pane directly, when + // using the JDK's opacity API's, it won't paint its background, even + // if label.setOpaque(true) is called. You have to have a container + // underneath it for it to paint its background. Thus, we embed our + // label in a parent JPanel to handle this case. + //tooltip.setContentPane(descLabel); + JPanel panel = new JPanel(new BorderLayout()); + panel.add(descLabel); + tooltip.setContentPane(panel); + + // Give apps a chance to decorate us with drop shadows, etc. + PopupWindowDecorator decorator = PopupWindowDecorator.get(); + if (decorator != null) { + decorator.decorate(tooltip); + } + + updateText(0); + + tooltip.setFocusableWindowState(false); + + } + + + /** + * Returns whether this tool tip is visible. + * + * @return Whether this tool tip is visible. + * @see #setVisible(boolean) + */ + public boolean isVisible() { + return tooltip.isVisible(); + } + + + /** + * Sets the location of this tool tip relative to the given rectangle. + * + * @param r The visual position of the caret (in screen coordinates). + */ + public void setLocationRelativeTo(Rectangle r) { + + // Multi-monitor support - make sure the completion window (and + // description window, if applicable) both fit in the same window in + // a multi-monitor environment. To do this, we decide which monitor + // the rectangle "r" is in, and use that one (just pick top-left corner + // as the defining point). + Rectangle screenBounds = Util.getScreenBoundsForPoint(r.x, r.y); + //Dimension screenSize = tooltip.getToolkit().getScreenSize(); + + // Try putting our stuff "above" the caret first. + int y = r.y - 5 - tooltip.getHeight(); + if (y < 0) { + y = r.y + r.height + 5; + } + + // Get x-coordinate of completions. Try to align left edge with the + // caret first. + int x = r.x; + if (x < screenBounds.x) { + x = screenBounds.x; + } else if (x + tooltip.getWidth() > screenBounds.x + screenBounds.width) { // completions don't fit + x = screenBounds.x + screenBounds.width - tooltip.getWidth(); + } + + tooltip.setLocation(x, y); + + } + + + /** + * Toggles the visibility of this tool tip. + * + * @param visible Whether this tool tip should be visible. + * @see #isVisible() + */ + public void setVisible(boolean visible) { + tooltip.setVisible(visible); + } + + + /** + * Updates the text in the tool tip to have the current parameter + * displayed in bold. + * + * @param selectedParam The index of the selected parameter. + * @return Whether the text needed to be updated. + */ + public boolean updateText(int selectedParam) { + + StringBuilder sb = new StringBuilder(""); + int paramCount = pc.getParamCount(); + for (int i = 0; i < paramCount; i++) { + + if (i == selectedParam) { + sb.append(""); + } + + // Some parameter types may have chars in them unfriendly to HTML + // (such as type parameters in Java). We need to take care to + // escape these. + String temp = pc.getParam(i).toString(); + sb.append(RSyntaxUtilities.escapeForHtml(temp, "
", false)); + + if (i == selectedParam) { + sb.append("
"); + } + if (i < paramCount - 1) { + sb.append(pc.getProvider().getParameterListSeparator()); + } + + } + + if (selectedParam >= 0 && selectedParam < paramCount) { + ParameterizedCompletion.Parameter param = + pc.getParam(selectedParam); + String desc = param.getDescription(); + if (desc != null) { + sb.append("
"); + sb.append(desc); + } + } + + descLabel.setText(sb.toString()); + tooltip.pack(); + + return true; + + } + + + /** + * Updates the LookAndFeel of this window and the description + * window. + */ + public void updateUI() { + SwingUtilities.updateComponentTreeUI(tooltip); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionInsertionInfo.java b/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionInsertionInfo.java new file mode 100644 index 0000000000..13ee42639b --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/ParameterizedCompletionInsertionInfo.java @@ -0,0 +1,251 @@ +/* + * 05/26/2012 + * + * ParameterizedCompletionInsertionInfo.java - Used internally to track the + * changes required for a specific parameterized completion. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.DocumentRange; + +import javax.swing.text.Position; +import java.util.ArrayList; +import java.util.List; + + +/** + * Describes a parameterized completion - what's being inserted, where the + * parameters are in the inserted text, etc. + * + * @author Robert Futrell + * @version 1.0 + */ +class ParameterizedCompletionInsertionInfo { + + private int minOffs; + private Position maxOffs; + private int defaultEnd; + private int selStart; + private int selEnd; + private String textToInsert; + private List replacementLocations; + private List replacementCopies; + + + public ParameterizedCompletionInsertionInfo() { + defaultEnd = -1; + } + + + public void addReplacementCopy(String id, int start, int end) { + if (replacementCopies == null) { + replacementCopies = new ArrayList(1); + } + replacementCopies.add(new ReplacementCopy(id, start, end)); + } + + + /** + * Marks a region of the replacement text as representing a variable name + * or some other construct that the user should replace. + * + * @param start The start offset. + * @param end The end offset. + * @see #getReplacementCount() + * @see #getReplacementLocation(int) + */ + public void addReplacementLocation(int start, int end) { + if (replacementLocations == null) { + replacementLocations = new ArrayList(1); + } + replacementLocations.add(new DocumentRange(start, end)); + } + + + public int getDefaultEndOffs() { + return defaultEnd > -1 ? defaultEnd : getMaxOffset().getOffset(); + } + + + /** + * Returns the maximum offset the caret can move to before being outside + * of the text inserted for this completion. + * + * @return The maximum offset. + * @see #getMinOffset() + */ + public Position getMaxOffset() { + return maxOffs; + } + + + /** + * Returns the minimum offset the caret can move to before being outside + * of the text inserted for this completion. + * + * @return The minimum offset. + * @see #getMaxOffset() + */ + public int getMinOffset() { + return minOffs; + } + + + public int getReplacementCopyCount() { + return replacementCopies == null ? 0 : replacementCopies.size(); + } + + + /** + * Returns the number of replacements in the completion. + * + * @return The number of replacements in the completion. + */ + public int getReplacementCount() { + return replacementLocations == null ? 0 : replacementLocations.size(); + } + + + public ReplacementCopy getReplacementCopy(int index) { + return replacementCopies.get(index); + } + + + /** + * Returns the starting- and ending-offsets of the replacement regions + * in the completion. + * + * @param index The replacement region. + * @return The range in the document of that replacement region. + * @see #getReplacementCount() + */ + public DocumentRange getReplacementLocation(int index) { + return replacementLocations.get(index); + } + + + /** + * Returns the offset that should be the end of the initially selected + * text when the completion is inserted (i.e., the end offset of the first + * replacement region). + * + * @return The end offset for the initial selection. + * @see #getSelectionStart() + */ + public int getSelectionEnd() { + return selEnd; + } + + + /** + * Returns the offset that should be the start of the initially selected + * text when the completion is inserted (i.e., the start offset of the + * first replacement region). + * + * @return The start offset for the initial selection. + * @see #getSelectionEnd() + */ + public int getSelectionStart() { + return selStart; + } + + + /** + * Returns the actual text to insert when the completion is selected. + * + * @return The text to insert. + * @see #setTextToInsert(String) + */ + public String getTextToInsert() { + return textToInsert; + } + + + /** + * Returns whether or not there is an initial selected region for the + * completion (i.e., whether the completion actually has any parameters). + * + * @return Whether there is a region to initially select for the completion. + */ + public boolean hasSelection() { + return selEnd != selStart; + } + + + /** + * Sets the initially selected region for the completion. + * + * @param selStart The selection start. + * @param selEnd The selection end. + * @see #getSelectionEnd() + * @see #getSelectionStart() + */ + public void setInitialSelection(int selStart, int selEnd) { + this.selStart = selStart; + this.selEnd = selEnd; + } + + + /** + * Sets the document range the caret can move around in before being + * outside of the text inserted for the completion. + * + * @param minOffs The minimum offset. + * @param maxOffs The maximum offset, that will track its location as the + * document is modified. + * @see #getMinOffset() + * @see #getMaxOffset() + */ + public void setCaretRange(int minOffs, Position maxOffs) { + this.minOffs = minOffs; + this.maxOffs = maxOffs; + } + + + public void setDefaultEndOffs(int end) { + defaultEnd = end; + } + + + /** + * Sets the text to insert for the completion. + * + * @param text The text to insert. + * @see #getTextToInsert() + */ + public void setTextToInsert(String text) { + this.textToInsert = text; + } + + + public static class ReplacementCopy { + + private String id; + private int start; + private int end; + + public ReplacementCopy(String id, int start, int end) { + this.id = id; + this.start = start; + this.end = end; + } + + public int getEnd() { + return end; + } + + public String getId() { + return id; + } + + public int getStart() { + return start; + } + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/ShorthandCompletion.java b/designer-base/src/com/fr/design/gui/autocomplete/ShorthandCompletion.java new file mode 100644 index 0000000000..2b1abd324e --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/ShorthandCompletion.java @@ -0,0 +1,117 @@ +/* + * 12/22/2008 + * + * ShorhandCompletion.java - A completion that is shorthand for some other + * text. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + + +/** + * A completion where the input text is shorthand for (really, just different + * than) the actual text to be inserted. For example, the input text + * "sysout" could be associated with the completion + * "System.out.println(" in Java. + * + * @author Robert Futrell + * @version 1.0 + */ +public class ShorthandCompletion extends BasicCompletion { + + /** + * The text the user can start typing that will match this completion. + */ + private String inputText; + + + /** + * Constructor. + * + * @param provider The provider that returns this completion. + * @param inputText The text the user inputs to get this completion. + * @param replacementText The replacement text of the completion. + */ + public ShorthandCompletion(CompletionProvider provider, String inputText, + String replacementText) { + super(provider, replacementText); + this.inputText = inputText; + } + + + /** + * Constructor. + * + * @param provider The provider that returns this completion. + * @param inputText The text the user inputs to get this completion. + * @param replacementText The replacement text of the completion. + * @param shortDesc A short description of the completion. This will be + * displayed in the completion list. This may be null. + */ + public ShorthandCompletion(CompletionProvider provider, String inputText, + String replacementText, String shortDesc) { + super(provider, replacementText, shortDesc); + this.inputText = inputText; + } + + + /** + * Constructor. + * + * @param provider The provider that returns this completion. + * @param inputText The text the user inputs to get this completion. + * @param replacementText The replacement text of the completion. + * @param shortDesc A short description of the completion. This will be + * displayed in the completion list. This may be null. + * @param summary The summary of this completion. This should be HTML. + * This may be null. + */ + public ShorthandCompletion(CompletionProvider provider, String inputText, + String replacementText, String shortDesc, String summary) { + super(provider, replacementText, shortDesc, summary); + this.inputText = inputText; + } + + + /** + * Returns the text the user must start typing to get this completion. + * + * @return The text the user must start to input. + */ + @Override + public String getInputText() { + return inputText; + } + + + /** + * If a summary has been set, that summary is returned. Otherwise, the + * replacement text is returned. + * + * @return A description of this completion (the text that will be + * inserted). + * @see #getReplacementText() + */ + @Override + public String getSummary() { + String summary = super.getSummary(); + return summary!=null ? summary : ("" + getSummaryBody()); + } + + + /** + * Returns the "body" of the HTML returned by {@link #getSummary()} when + * no summary text has been set. This is defined to return the replacement + * text in a monospaced font. + * + * @return The summary text's body, if no other summary has been defined. + * @see #getReplacementText() + */ + protected String getSummaryBody() { + return "" + getReplacementText(); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/SizeGrip.java b/designer-base/src/com/fr/design/gui/autocomplete/SizeGrip.java new file mode 100644 index 0000000000..5fb4b1d98a --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/SizeGrip.java @@ -0,0 +1,256 @@ +/* + * 12/23/2008 + * + * SizeGrip.java - A size grip component that sits at the bottom of the window, + * allowing the user to easily resize that window. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.awt.Color; +import java.awt.ComponentOrientation; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.Point; +import java.awt.Window; +import java.awt.event.MouseEvent; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import javax.imageio.ImageIO; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.event.MouseInputAdapter; + + +/** + * A component that allows its parent window to be resizable, similar to the + * size grip seen on status bars. This is essentially a copy of the class with + * the same name in RSyntaxTextArea, but is duplicated to prevent a dependency + * on that library. + * + * @author Robert Futrell + * @version 1.0 + */ +class SizeGrip extends JPanel { + + /** + * The size grip to use if we're on OS X. + */ + private Image osxSizeGrip; + + + public SizeGrip() { + MouseHandler adapter = new MouseHandler(); + addMouseListener(adapter); + addMouseMotionListener(adapter); + setPreferredSize(new Dimension(16, 16)); + } + + + /** + * Overridden to ensure that the cursor for this component is appropriate + * for the orientation. + * + * @param o The new orientation. + */ + @Override + public void applyComponentOrientation(ComponentOrientation o) { + possiblyFixCursor(o.isLeftToRight()); + super.applyComponentOrientation(o); + } + + + /** + * Creates and returns the OS X size grip image. + * + * @return The OS X size grip. + */ + private Image createOSXSizeGrip() { + ClassLoader cl = getClass().getClassLoader(); + URL url = cl.getResource("org/fife/ui/autocomplete/osx_sizegrip.png"); + if (url==null) { + // We're not running in a jar - we may be debugging in Eclipse, + // for example + File f = new File("../AutoComplete/src/org/fife/ui/autocomplete/osx_sizegrip.png"); + if (f.isFile()) { + try { + url = f.toURI().toURL(); + } catch (MalformedURLException mue) { // Never happens + return null; + } + } + else { + return null; // Can't find resource or image file + } + } + Image image = null; + try { + image = ImageIO.read(url); + } catch (IOException ioe) { // Never happens + + } + return image; + } + + + /** + * Paints this panel. + * + * @param g The graphics context. + */ + @Override + protected void paintComponent(Graphics g) { + + super.paintComponent(g); + + Dimension dim = getSize(); + + if (osxSizeGrip!=null) { + g.drawImage(osxSizeGrip, dim.width-16, dim.height-16, null); + return; + } + + Color c1 = UIManager.getColor("Label.disabledShadow"); + Color c2 = UIManager.getColor("Label.disabledForeground"); + ComponentOrientation orientation = getComponentOrientation(); + + if (orientation.isLeftToRight()) { + int width = dim.width -= 3; + int height = dim.height -= 3; + g.setColor(c1); + g.fillRect(width-9,height-1, 3,3); + g.fillRect(width-5,height-1, 3,3); + g.fillRect(width-1,height-1, 3,3); + g.fillRect(width-5,height-5, 3,3); + g.fillRect(width-1,height-5, 3,3); + g.fillRect(width-1,height-9, 3,3); + g.setColor(c2); + g.fillRect(width-9,height-1, 2,2); + g.fillRect(width-5,height-1, 2,2); + g.fillRect(width-1,height-1, 2,2); + g.fillRect(width-5,height-5, 2,2); + g.fillRect(width-1,height-5, 2,2); + g.fillRect(width-1,height-9, 2,2); + } + else { + int height = dim.height -= 3; + g.setColor(c1); + g.fillRect(10,height-1, 3,3); + g.fillRect(6,height-1, 3,3); + g.fillRect(2,height-1, 3,3); + g.fillRect(6,height-5, 3,3); + g.fillRect(2,height-5, 3,3); + g.fillRect(2,height-9, 3,3); + g.setColor(c2); + g.fillRect(10,height-1, 2,2); + g.fillRect(6,height-1, 2,2); + g.fillRect(2,height-1, 2,2); + g.fillRect(6,height-5, 2,2); + g.fillRect(2,height-5, 2,2); + g.fillRect(2,height-9, 2,2); + } + + } + + + /** + * Ensures that the cursor for this component is appropriate for the + * orientation. + * + * @param ltr Whether the current component orientation is LTR. + */ + protected void possiblyFixCursor(boolean ltr) { + int cursor = Cursor.NE_RESIZE_CURSOR; + if (ltr) { + cursor = Cursor.NW_RESIZE_CURSOR; + } + if (cursor!=getCursor().getType()) { + setCursor(Cursor.getPredefinedCursor(cursor)); + } + } + + + @Override + public void updateUI() { + super.updateUI(); + // TODO: Key off of Aqua LaF, not just OS X, as this size grip looks + // bad on other LaFs on Mac such as Nimbus. + if (System.getProperty("os.name").contains("OS X")) { + if (osxSizeGrip==null) { + osxSizeGrip = createOSXSizeGrip(); + } + } + else { // Clear memory in case of runtime LaF change. + osxSizeGrip = null; + } + + } + + + /** + * Listens for mouse events on this panel and resizes the parent window + * appropriately. + */ + /* + * NOTE: We use SwingUtilities.convertPointToScreen() instead of just using + * the locations relative to the corner component because the latter proved + * buggy - stretch the window too wide and some kind of arithmetic error + * started happening somewhere - our window would grow way too large. + */ + private class MouseHandler extends MouseInputAdapter { + + private Point origPos; + + @Override + public void mouseDragged(MouseEvent e) { + Point newPos = e.getPoint(); + SwingUtilities.convertPointToScreen(newPos, SizeGrip.this); + int xDelta = newPos.x - origPos.x; + int yDelta = newPos.y - origPos.y; + Window wind = SwingUtilities.getWindowAncestor(SizeGrip.this); + if (wind!=null) { // Should always be true + if (getComponentOrientation().isLeftToRight()) { + int w = wind.getWidth(); + if (newPos.x>=wind.getX()) { + w += xDelta; + } + int h = wind.getHeight(); + if (newPos.y>=wind.getY()) { + h += yDelta; + } + wind.setSize(w,h); + } + else { // RTL + int newW = Math.max(1, wind.getWidth()-xDelta); + int newH = Math.max(1, wind.getHeight()+yDelta); + wind.setBounds(newPos.x, wind.getY(), newW, newH); + } + // invalidate()/validate() needed pre-1.6. + wind.invalidate(); + wind.validate(); + } + origPos.setLocation(newPos); + } + + @Override + public void mousePressed(MouseEvent e) { + origPos = e.getPoint(); + SwingUtilities.convertPointToScreen(origPos, SizeGrip.this); + } + + @Override + public void mouseReleased(MouseEvent e) { + origPos = null; + } + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/SortByRelevanceComparator.java b/designer-base/src/com/fr/design/gui/autocomplete/SortByRelevanceComparator.java new file mode 100644 index 0000000000..50946b5386 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/SortByRelevanceComparator.java @@ -0,0 +1,33 @@ +/* + * 12/17/2010 + * + * SortByRelevanceComparator.java - Sorts two Completions by relevance before + * sorting them lexicographically. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.util.Comparator; + + +/** + * Compares two Completions by their relevance before + * sorting them lexicographically. + * + * @author Robert Futrell + * @version 1.0 + */ +public class SortByRelevanceComparator implements Comparator { + + + public int compare(Completion c1, Completion c2) { + int rel1 = c1.getRelevance(); + int rel2 = c2.getRelevance(); + int diff = rel2 - rel1;//rel1 - rel2; + return diff==0 ? c1.compareTo(c2) : diff; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/TemplateCompletion.java b/designer-base/src/com/fr/design/gui/autocomplete/TemplateCompletion.java new file mode 100644 index 0000000000..dcf1bfcdc6 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/TemplateCompletion.java @@ -0,0 +1,363 @@ +/* + * 05/26/2012 + * + * TemplateCompletion.java - A completion used to insert boilerplate code + * snippets that have arbitrary sections the user will want to change, such as + * for-loops. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import com.fr.design.gui.autocomplete.TemplatePiece.Param; +import com.fr.design.gui.autocomplete.TemplatePiece.ParamCopy; +import com.fr.design.gui.autocomplete.TemplatePiece.Text; +import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxUtilities; + +import javax.swing.text.*; +import java.util.ArrayList; +import java.util.List; + + +/** + * A completion made up of a template with arbitrary parameters that the user + * can tab through and fill in. This completion type is useful for inserting + * common boilerplate code, such as for-loops.

+ *

+ * The format of a template is similar to those in Eclipse. The following + * example would be the format for a for-loop template: + *

+ *

+ * for (int ${i} = 0; ${i} < ${array}.length; ${i}++) {
+ *    ${cursor}
+ * }
+ * 
+ *

+ * In the above example, the first ${i} is a parameter for the + * user to type into; all the other ${i} instances are + * automatically changed to what the user types in the first one. The parameter + * named ${cursor} is the "ending position" of the template. It's + * where the caret moves after it cycles through all other parameters. If the + * user types into it, template mode terminates. If more than one + * ${cursor} parameter is specified, behavior is undefined.

+ *

+ * Two dollar signs in a row ("$$") will be evaluated as a single + * dollar sign. Otherwise, the template parsing is pretty straightforward and + * fault-tolerant.

+ *

+ * Leading whitespace is automatically added to lines if the template spans + * more than one line, and if used with a text component using a + * PlainDocument, tabs will be converted to spaces if requested. + * + * @author Robert Futrell + * @version 1.0 + */ +public class TemplateCompletion extends AbstractCompletion + implements ParameterizedCompletion { + + private List pieces; + + private String inputText; + + private String definitionString; + + private String shortDescription; + + private String summary; + + /** + * The template's parameters. + */ + private List params; + + + public TemplateCompletion(CompletionProvider provider, + String inputText, String definitionString, String template) { + this(provider, inputText, definitionString, template, null, null); + } + + + public TemplateCompletion(CompletionProvider provider, + String inputText, String definitionString, String template, + String shortDescription, String summary) { + super(provider); + this.inputText = inputText; + this.definitionString = definitionString; + this.shortDescription = shortDescription; + this.summary = summary; + pieces = new ArrayList(3); + params = new ArrayList(3); + parse(template); + } + + + private void addTemplatePiece(TemplatePiece piece) { + pieces.add(piece); + if (piece instanceof Param && !"cursor".equals(piece.getText())) { + final String type = null; // TODO + Parameter param = new Parameter(type, piece.getText()); + params.add(param); + } + } + + + @Override + public String getInputText() { + return inputText; + } + + + private String getPieceText(int index, String leadingWS) { + TemplatePiece piece = pieces.get(index); + String text = piece.getText(); + if (text.indexOf('\n') > -1) { + text = text.replaceAll("\n", "\n" + leadingWS); + } + return text; + } + + + /** + * Returns null; template completions insert all of their + * text via getInsertionInfo(). + * + * @return null always. + */ + public String getReplacementText() { + return null; + } + + + public String getSummary() { + return summary; + } + + + public String getDefinitionString() { + return definitionString; + } + + public String getShortDescription() { + return shortDescription; + } + + + /** + * {@inheritDoc} + */ + public boolean getShowParameterToolTip() { + return false; + } + + + public ParameterizedCompletionInsertionInfo getInsertionInfo( + JTextComponent tc, boolean replaceTabsWithSpaces) { + + ParameterizedCompletionInsertionInfo info = + new ParameterizedCompletionInsertionInfo(); + + StringBuilder sb = new StringBuilder(); + int dot = tc.getCaretPosition(); + + // Get the range in which the caret can move before we hide + // this tool tip. + int minPos = dot; + Position maxPos = null; + int defaultEndOffs = -1; + try { + maxPos = tc.getDocument().createPosition(dot); + } catch (BadLocationException ble) { + // Never happens + } + info.setCaretRange(minPos, maxPos); + int selStart = dot; // Default value + int selEnd = selStart; + + Document doc = tc.getDocument(); + String leadingWS = null; + try { + leadingWS = RSyntaxUtilities.getLeadingWhitespace(doc, dot); + } catch (BadLocationException ble) { // Never happens + + leadingWS = ""; + } + + // Create the text to insert (keep it one completion for + // performance and simplicity of undo/redo). + int start = dot; + for (int i = 0; i < pieces.size(); i++) { + TemplatePiece piece = pieces.get(i); + String text = getPieceText(i, leadingWS); + if (piece instanceof Text) { + if (replaceTabsWithSpaces) { + start = possiblyReplaceTabsWithSpaces(sb, text, tc, start); + } else { + sb.append(text); + start += text.length(); + } + } else if (piece instanceof Param && "cursor".equals(text)) { + defaultEndOffs = start; + } else { + int end = start + text.length(); + sb.append(text); + if (piece instanceof Param) { + info.addReplacementLocation(start, end); + if (selStart == dot) { + selStart = start; + selEnd = selStart + text.length(); + } + } else if (piece instanceof ParamCopy) { + info.addReplacementCopy(piece.getText(), start, end); + } + start = end; + } + } + + // Highlight the first parameter. If no params were specified, move + // the caret to the ${cursor} location, if specified + if (selStart == minPos && selStart == selEnd && getParamCount() == 0) { + if (defaultEndOffs > -1) { // ${cursor} specified + selStart = selEnd = defaultEndOffs; + } + } + info.setInitialSelection(selStart, selEnd); + + if (defaultEndOffs > -1) { + // Keep this location "after" all others when tabbing + info.addReplacementLocation(defaultEndOffs, defaultEndOffs); + } + info.setDefaultEndOffs(defaultEndOffs); + info.setTextToInsert(sb.toString()); + + return info; + + } + + + /** + * {@inheritDoc} + */ + public Parameter getParam(int index) { + return params.get(index); + } + + + /** + * {@inheritDoc} + */ + public int getParamCount() { + return params == null ? 0 : params.size(); + } + + + /** + * Returns whether a parameter is already defined with a specific name. + * + * @param name The name. + * @return Whether a parameter is defined with that name. + */ + private boolean isParamDefined(String name) { + for (int i = 0; i < getParamCount(); i++) { + Parameter param = getParam(i); + if (name.equals(param.getName())) { + return true; + } + } + return false; + } + + + /** + * Parses a template string into logical pieces used by this class. + * + * @param template The template to parse. + */ + private void parse(String template) { + + int offs = 0; + int lastOffs = 0; + + while ((offs = template.indexOf('$', lastOffs)) > -1 && offs < template.length() - 1) { + + char next = template.charAt(offs + 1); + switch (next) { + case '$': // "$$" => escaped single dollar sign + addTemplatePiece(new TemplatePiece.Text( + template.substring(lastOffs, offs + 1))); + lastOffs = offs += 2; + break; + case '{': // "${...}" => variable + int closingCurly = template.indexOf('}', offs + 2); + if (closingCurly > -1) { + addTemplatePiece(new TemplatePiece.Text( + template.substring(lastOffs, offs))); + String varName = template.substring(offs + 2, closingCurly); + if (!"cursor".equals(varName) && isParamDefined(varName)) { + addTemplatePiece(new TemplatePiece.ParamCopy(varName)); + } else { + addTemplatePiece(new TemplatePiece.Param(varName)); + } + lastOffs = offs = closingCurly + 1; + } + break; + } + + } + + if (lastOffs < template.length()) { + String text = template.substring(lastOffs); + addTemplatePiece(new TemplatePiece.Text(text)); + } + + } + + + private int possiblyReplaceTabsWithSpaces(StringBuilder sb, String text, + JTextComponent tc, int start) { + + int tab = text.indexOf('\t'); + if (tab > -1) { + + int startLen = sb.length(); + + int size = 4; + Document doc = tc.getDocument(); + if (doc != null) { + Integer i = (Integer) doc.getProperty(PlainDocument.tabSizeAttribute); + if (i != null) { + size = i.intValue(); + } + } + String tabStr = ""; + for (int i = 0; i < size; i++) { + tabStr += " "; + } + + int lastOffs = 0; + do { + sb.append(text.substring(lastOffs, tab)); + sb.append(tabStr); + lastOffs = tab + 1; + } while ((tab = text.indexOf('\t', lastOffs)) > -1); + sb.append(text.substring(lastOffs)); + + start += sb.length() - startLen; + + } else { + sb.append(text); + start += text.length(); + } + + return start; + + } + + + @Override + public String toString() { + return getDefinitionString(); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/TemplatePiece.java b/designer-base/src/com/fr/design/gui/autocomplete/TemplatePiece.java new file mode 100644 index 0000000000..60563a00fe --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/TemplatePiece.java @@ -0,0 +1,86 @@ +/* + * 06/17/2012 + * + * TemplatePiece.java - A logical piece of a template completion. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + + +/** + * A piece of a TemplateCompletion. You add instances of this + * class to template completions to define them. + * + * @author Robert Futrell + * @version 1.0 + * @see TemplateCompletion + */ +interface TemplatePiece { + + + String getText(); + + + public class Text implements TemplatePiece { + + private String text; + + public Text(String text) { + this.text = text; + } + + public String getText() { + return text; + } + + @Override + public String toString() { + return "[TemplatePiece.Text: text=" + text + "]"; + } + + } + + + public class Param implements TemplatePiece { + + String text; + + public Param(String text) { + this.text = text; + } + + public String getText() { + return text; + } + + @Override + public String toString() { + return "[TemplatePiece.Param: param=" + text + "]"; + } + + } + + + public class ParamCopy implements TemplatePiece { + + private String text; + + public ParamCopy(String text) { + this.text = text; + } + + public String getText() { + return text; + } + + @Override + public String toString() { + return "[TemplatePiece.ParamCopy: param=" + text + "]"; + } + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/TipUtil.java b/designer-base/src/com/fr/design/gui/autocomplete/TipUtil.java new file mode 100644 index 0000000000..c5584e22bb --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/TipUtil.java @@ -0,0 +1,179 @@ +/* + * 08/13/2009 + * + * TipUtil.java - Utility methods for homemade tool tips. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import java.awt.Color; +import java.awt.Font; +import java.awt.SystemColor; +import java.net.URL; +import javax.swing.BorderFactory; +import javax.swing.JEditorPane; +import javax.swing.UIManager; +import javax.swing.border.Border; +import javax.swing.plaf.ColorUIResource; +import javax.swing.text.html.HTMLDocument; + + +/** + * Static utility methods for homemade tool tips.

+ * + * This is blatantly ripped off from RSyntaxTextArea's "FocusableTips" class + * of the same name, but isn't re-used to prevent a hard dependency on the + * RSTA library. + * + * @author Robert Futrell + * @version 1.0 + */ +class TipUtil { + + + private TipUtil() { + } + + + /** + * Returns the default background color to use for tool tip windows. + * + * @return The default background color. + */ + public static Color getToolTipBackground() { + + Color c = UIManager.getColor("ToolTip.background"); + + // Tooltip.background is wrong color on Nimbus (!) + boolean isNimbus = isNimbusLookAndFeel(); + if (c==null || isNimbus) { + c = UIManager.getColor("info"); // Used by Nimbus (and others) + if (c==null || (isNimbus && isDerivedColor(c))) { + c = SystemColor.info; // System default + } + } + + // Workaround for a bug (?) with Nimbus - calling JLabel.setBackground() + // with a ColorUIResource does nothing, must be a normal Color + if (c instanceof ColorUIResource) { + c = new Color(c.getRGB()); + } + + return c; + + } + + + /** + * Returns the border used by tool tips in this look and feel. + * + * @return The border. + */ + public static Border getToolTipBorder() { + + Border border = UIManager.getBorder("ToolTip.border"); + + if (border==null || isNimbusLookAndFeel()) { + border = UIManager.getBorder("nimbusBorder"); + if (border==null) { + border = BorderFactory.createLineBorder(SystemColor.controlDkShadow); + } + } + + return border; + + } + + + /** + * Returns whether a color is a Nimbus DerivedColor, which is troublesome + * in that it doesn't use its RGB values (uses HSB instead?) and so + * querying them is useless. + * + * @param c The color to check. + * @return Whether it is a DerivedColor + */ + private static final boolean isDerivedColor(Color c) { + return c!=null && (c.getClass().getName().endsWith(".DerivedColor") || + c.getClass().getName().endsWith(".DerivedColor$UIResource")); + } + + + /** + * Returns whether the Nimbus Look and Feel is installed. + * + * @return Whether the current LAF is Nimbus. + */ + private static final boolean isNimbusLookAndFeel() { + return UIManager.getLookAndFeel().getName().equals("Nimbus"); + } + + + /** + * Tweaks a JEditorPane so it can be used to render the + * content in a focusable pseudo-tool tip. It is assumed that the editor + * pane is using an HTMLDocument. + * + * @param textArea The editor pane to tweak. + */ + public static void tweakTipEditorPane(JEditorPane textArea) { + + // Jump through a few hoops to get things looking nice in Nimbus + boolean isNimbus = isNimbusLookAndFeel(); + if (isNimbus) { + Color selBG = textArea.getSelectionColor(); + Color selFG = textArea.getSelectedTextColor(); + textArea.setUI(new javax.swing.plaf.basic.BasicEditorPaneUI()); + textArea.setSelectedTextColor(selFG); + textArea.setSelectionColor(selBG); + } + + textArea.setEditable(false); // Required for links to work! + textArea.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); + + // Make selection visible even though we are not (initially) focusable. + textArea.getCaret().setSelectionVisible(true); + + // Set the foreground color. Important because when rendering HTML, + // default foreground becomes black, which may not match all LAF's + // (e.g. Substance). + Color fg = UIManager.getColor("Label.foreground"); + if (fg==null || (isNimbus && isDerivedColor(fg))) { + fg = SystemColor.textText; + } + textArea.setForeground(fg); + + // Make it use the "tool tip" background color. + textArea.setBackground(TipUtil.getToolTipBackground()); + + // Force JEditorPane to use a certain font even in HTML. + // All standard LookAndFeels, even Nimbus (!), define Label.font. + Font font = UIManager.getFont("Label.font"); + if (font == null) { // Try to make a sensible default + font = new Font("SansSerif", Font.PLAIN, 12); + } + HTMLDocument doc = (HTMLDocument) textArea.getDocument(); + doc.getStyleSheet().addRule( + "body { font-family: " + font.getFamily() + + "; font-size: " + font.getSize() + "pt" + + "; color: " + Util.getHexString(fg) + "; }"); + + // Always add link foreground rule. Unfortunately these CSS rules + // stack each time the LaF is changed (how can we overwrite them + // without clearing out the important "standard" ones?). + Color linkFG = Util.getHyperlinkForeground(); + doc.getStyleSheet().addRule( + "a { color: " + Util.getHexString(linkFG) + "; }"); + + URL url = TipUtil.class.getResource("bullet_black.png"); + if (url!=null) { + doc.getStyleSheet().addRule( + "ul { list-style-image: '" + url.toString() + "'; }"); + } + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/Util.java b/designer-base/src/com/fr/design/gui/autocomplete/Util.java new file mode 100644 index 0000000000..3b7ac22989 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/Util.java @@ -0,0 +1,323 @@ +/* + * 12/21/2008 + * + * Util.java - Utility methods for the autocompletion package. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import javax.swing.*; +import java.awt.*; +import java.lang.reflect.Method; +import java.net.URI; +import java.security.AccessControlException; +import java.util.regex.Pattern; + + +/** + * Utility methods for the auto-complete framework. + * + * @author Robert Futrell + * @version 1.0 + */ +public class Util { + + /** + * If a system property is defined with this name and set, ignoring case, + * to true, this library will not attempt to use Substance + * renderers. Otherwise, if a Substance Look and Feel is installed, we + * will attempt to use Substance cell renderers in all of our dropdowns.

+ *

+ * Note that we do not have a build dependency on Substance, so all access + * to Substance stuff is done via reflection. We will fall back onto + * default renderers if something goes horribly wrong. + */ + public static final String PROPERTY_DONT_USE_SUBSTANCE_RENDERERS = + "com.fr.design.gui.autocomplete.DontUseSubstanceRenderers"; + + /** + * If this system property is true, then even the "main" two + * auto-complete windows will allow window decorations via + * {@link com.fr.design.gui.syntax.ui.rsyntaxtextarea.PopupWindowDecorator}. If this property is undefined or + * false, they won't honor such decorations. This is due to + * certain performance issues with translucent windows (used for drop + * shadows), even as of Java 7u2. + */ + public static final String PROPERTY_ALLOW_DECORATED_AUTOCOMPLETE_WINDOWS = + "com.fr.design.gui.autocomplete.allowDecoratedAutoCompleteWindows"; + + /** + * Used for the color of hyperlinks when a LookAndFeel uses light text + * against a dark background. + */ + private static final Color LIGHT_HYPERLINK_FG = new Color(0xd8ffff); + + private static final Pattern TAG_PATTERN = Pattern.compile("<[^>]*>"); + + private static final boolean useSubstanceRenderers; + private static boolean desktopCreationAttempted; + private static Object desktop; + private static final Object LOCK_DESKTOP_CREATION = new Object(); + + + /** + * Attempts to open a web browser to the specified URI. + * + * @param uri The URI to open. If this is null, nothing + * happens and this method returns false. + * @return Whether the operation was successful. This will be + * false on JRE's older than 1.6. + */ + public static boolean browse(URI uri) { + + boolean success = false; + + if (uri != null) { + Object desktop = getDesktop(); + if (desktop != null) { + try { + Method m = desktop.getClass().getDeclaredMethod( + "browse", new Class[]{URI.class}); + m.invoke(desktop, new Object[]{uri}); + success = true; + } catch (RuntimeException re) { + throw re; // Keep FindBugs happy + } catch (Exception e) { + // Ignore, just return "false" below. + } + } + } + + return success; + + } + + + /** + * Returns the singleton java.awt.Desktop instance, or + * null if it is unsupported on this platform (or the JRE + * is older than 1.6). + * + * @return The desktop, as an {@link Object}. + */ + private static Object getDesktop() { + + synchronized (LOCK_DESKTOP_CREATION) { + + if (!desktopCreationAttempted) { + + desktopCreationAttempted = true; + + try { + Class desktopClazz = Class.forName("java.awt.Desktop"); + Method m = desktopClazz. + getDeclaredMethod("isDesktopSupported"); + + boolean supported = ((Boolean) m.invoke(null)).booleanValue(); + if (supported) { + m = desktopClazz.getDeclaredMethod("getDesktop"); + desktop = m.invoke(null); + } + + } catch (RuntimeException re) { + throw re; // Keep FindBugs happy + } catch (Exception e) { + // Ignore; keeps desktop as null. + } + + } + + } + + return desktop; + + } + + + /** + * Returns a hex string for the specified color, suitable for HTML. + * + * @param c The color. + * @return The string representation, in the form "#rrggbb", + * or null if c is null. + */ + public static String getHexString(Color c) { + + if (c == null) { + return null; + } + + // Don't assume 0xff alpha + //return "#" + Integer.toHexString(c.getRGB()&0xffffff).substring(2); + + StringBuilder sb = new StringBuilder("#"); + int r = c.getRed(); + if (r < 16) { + sb.append('0'); + } + sb.append(Integer.toHexString(r)); + int g = c.getGreen(); + if (g < 16) { + sb.append('0'); + } + sb.append(Integer.toHexString(g)); + int b = c.getBlue(); + if (b < 16) { + sb.append('0'); + } + sb.append(Integer.toHexString(b)); + + return sb.toString(); + + } + + + /** + * Returns the color to use for hyperlink-style components. This method + * will return Color.blue unless it appears that the current + * LookAndFeel uses light text on a dark background, in which case a + * brighter alternative is returned. + * + * @return The color to use for hyperlinks. + */ + static final Color getHyperlinkForeground() { + + // This property is defined by all standard LaFs, even Nimbus (!), + // but you never know what crazy LaFs there are... + Color fg = UIManager.getColor("Label.foreground"); + if (fg == null) { + fg = new JLabel().getForeground(); + } + + return isLightForeground(fg) ? LIGHT_HYPERLINK_FG : Color.blue; + + } + + + /** + * Returns the screen coordinates for the monitor that contains the + * specified point. This is useful for setups with multiple monitors, + * to ensure that popup windows are positioned properly. + * + * @param x The x-coordinate, in screen coordinates. + * @param y The y-coordinate, in screen coordinates. + * @return The bounds of the monitor that contains the specified point. + */ + public static Rectangle getScreenBoundsForPoint(int x, int y) { + GraphicsEnvironment env = GraphicsEnvironment. + getLocalGraphicsEnvironment(); + GraphicsDevice[] devices = env.getScreenDevices(); + for (int i = 0; i < devices.length; i++) { + GraphicsConfiguration config = devices[i].getDefaultConfiguration(); + Rectangle gcBounds = config.getBounds(); + if (gcBounds.contains(x, y)) { + return gcBounds; + } + } + // If point is outside all monitors, default to default monitor (?) + return env.getMaximumWindowBounds(); + } + + + /** + * Give apps a chance to decorate us with drop shadows, etc. Since very + * scrolly things such as lists (of e.g. completions) are *very* slow when + * in per-pixel translucent windows, even as of Java 7u2, we force the user + * to specify an extra option for the two "main" auto-complete windows. + * + * @return Whether to allow decorating the main auto-complete windows. + * @see #PROPERTY_ALLOW_DECORATED_AUTOCOMPLETE_WINDOWS + */ + public static boolean getShouldAllowDecoratingMainAutoCompleteWindows() { + try { + return Boolean.getBoolean( + PROPERTY_ALLOW_DECORATED_AUTOCOMPLETE_WINDOWS); + } catch (AccessControlException ace) { // We're in an applet. + return false; + } + } + + + /** + * Returns whether we should attempt to use Substance cell renderers and + * styles for things such as completion choices, if a Substance Look and + * Feel is installed. If this is false, we'll use our + * standard rendering for completions, even when Substance is being used. + * + * @return Whether to use Substance renderers if Substance is installed. + */ + public static boolean getUseSubstanceRenderers() { + return useSubstanceRenderers; + } + + + /** + * Returns whether the specified color is "light" to use as a foreground. + * Colors that return true indicate that the current Look and + * Feel probably uses light text colors on a dark background. + * + * @param fg The foreground color. + * @return Whether it is a "light" foreground color. + */ + public static final boolean isLightForeground(Color fg) { + return fg.getRed() > 0xa0 && fg.getGreen() > 0xa0 && fg.getBlue() > 0xa0; + } + + + /** + * Returns whether str starts with start, + * ignoring case. + * + * @param str The string to check. + * @param start The prefix to check for. + * @return Whether str starts with start, + * ignoring case. + */ + public static boolean startsWithIgnoreCase(String str, String start) { + int startLen = start.length(); + if (str.length() >= startLen) { + for (int i = 0; i < startLen; i++) { + char c1 = str.charAt(i); + char c2 = start.charAt(i); + if (Character.toLowerCase(c1) != Character.toLowerCase(c2)) { + return false; + } + } + return true; + } + return false; + } + + + /** + * Strips any HTML from a string. The string must start with + * "<html>" for markup tags to be stripped. + * + * @param text The string. + * @return The string, with any HTML stripped. + */ + public static String stripHtml(String text) { + if (text == null || !text.startsWith("")) { + return text; + } + // TODO: Micro-optimize me, might be called in renderers and loops + return TAG_PATTERN.matcher(text).replaceAll(""); + } + + + static { + + boolean use = true; + try { + use = !Boolean.getBoolean(PROPERTY_DONT_USE_SUBSTANCE_RENDERERS); + } catch (AccessControlException ace) { // We're in an applet. + use = true; + } + useSubstanceRenderers = use; + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/autocomplete/VariableCompletion.java b/designer-base/src/com/fr/design/gui/autocomplete/VariableCompletion.java new file mode 100644 index 0000000000..8418be9603 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/autocomplete/VariableCompletion.java @@ -0,0 +1,196 @@ +/* + * 12/22/2008 + * + * VariableCompletion.java - A completion for a variable. + * + * This library is distributed under a modified BSD license. See the included + * RSyntaxTextArea.License.txt file for details. + */ +package com.fr.design.gui.autocomplete; + +import javax.swing.text.JTextComponent; + + +/** + * A completion for a variable (or constant) in a programming language.

+ * + * This completion type uses its shortDescription property as part of + * its summary returned by {@link #getSummary()}; for this reason, it may be + * a little longer (even much longer), if desired, than what is recommended + * for BasicCompletions (where the shortDescription is used + * in {@link #toString()} for ListCellRenderers). + * + * @author Robert Futrell + * @version 1.0 + */ +public class VariableCompletion extends BasicCompletion { + + /** + * The variable's type. + */ + private String type; + + /** + * What library (for example) this variable is defined in. + */ + private String definedIn; + + + /** + * Constructor. + * + * @param provider The parent provider. + * @param name The name of this variable. + * @param type The type of this variable (e.g. "int", + * "String", etc.). + */ + public VariableCompletion(CompletionProvider provider, String name, + String type) { + super(provider, name); + this.type = type; + } + + + protected void addDefinitionString(StringBuilder sb) { + sb.append("").append(getDefinitionString()).append(""); + } + + + public String getDefinitionString() { + + StringBuilder sb = new StringBuilder(); + + // Add the return type if applicable (C macros like NULL have no type). + if (type!=null) { + sb.append(type).append(' '); + } + + // Add the item being described's name. + sb.append(getName()); + + return sb.toString(); + + } + + + /** + * Returns where this variable is defined. + * + * @return Where this variable is defined. + * @see #setDefinedIn(String) + */ + public String getDefinedIn() { + return definedIn; + } + + + /** + * Returns the name of this variable. + * + * @return The name. + */ + public String getName() { + return getReplacementText(); + } + + + /** + * {@inheritDoc} + */ + @Override + public String getSummary() { + StringBuilder sb = new StringBuilder(); + addDefinitionString(sb); + possiblyAddDescription(sb); + possiblyAddDefinedIn(sb); + return sb.toString(); + } + + + /** + * Returns the tool tip text to display for mouse hovers over this + * completion.

+ * + * Note that for this functionality to be enabled, a + * JTextComponent must be registered with the + * ToolTipManager, and the text component must know to search + * for this value. In the case of an + * RSyntaxTextArea, this + * can be done with a org.fife.ui.rtextarea.ToolTipSupplier that + * calls into + * {@link CompletionProvider#getCompletionsAt(JTextComponent, java.awt.Point)}. + * + * @return The tool tip text for this completion, or null if + * none. + */ + @Override + public String getToolTipText() { + return getDefinitionString(); + } + + + /** + * Returns the type of this variable. + * + * @return The type. + */ + public String getType() { + return type; + } + + + /** + * Adds some HTML describing where this variable is defined, if this + * information is known. + * + * @param sb The buffer to append to. + */ + protected void possiblyAddDefinedIn(StringBuilder sb) { + if (definedIn!=null) { + sb.append("


Defined in:"); // TODO: Localize me + sb.append(" ").append(definedIn).append(""); + } + } + + + /** + * Adds the description text as HTML to a buffer, if a description is + * defined. + * + * @param sb The buffer to append to. + * @return Whether there was a description to add. + */ + protected boolean possiblyAddDescription(StringBuilder sb) { + if (getShortDescription()!=null) { + sb.append("

"); + sb.append(getShortDescription()); + sb.append("


"); + return true; + } + return false; + } + + + /** + * Sets where this variable is defined. + * + * @param definedIn Where this variable is defined. + * @see #getDefinedIn() + */ + public void setDefinedIn(String definedIn) { + this.definedIn = definedIn; + } + + + /** + * Overridden to return the name of the variable being completed. + * + * @return A string representation of this completion. + */ + @Override + public String toString() { + return getName(); + } + + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/autocomplete/arrow_left.png b/designer-base/src/com/fr/design/gui/autocomplete/arrow_left.png similarity index 100% rename from designer_base/src/com/fr/design/gui/autocomplete/arrow_left.png rename to designer-base/src/com/fr/design/gui/autocomplete/arrow_left.png diff --git a/designer_base/src/com/fr/design/gui/autocomplete/arrow_right.png b/designer-base/src/com/fr/design/gui/autocomplete/arrow_right.png similarity index 100% rename from designer_base/src/com/fr/design/gui/autocomplete/arrow_right.png rename to designer-base/src/com/fr/design/gui/autocomplete/arrow_right.png diff --git a/designer_base/src/com/fr/design/gui/autocomplete/bullet_black.png b/designer-base/src/com/fr/design/gui/autocomplete/bullet_black.png similarity index 100% rename from designer_base/src/com/fr/design/gui/autocomplete/bullet_black.png rename to designer-base/src/com/fr/design/gui/autocomplete/bullet_black.png diff --git a/designer_base/src/com/fr/design/gui/autocomplete/osx_sizegrip.png b/designer-base/src/com/fr/design/gui/autocomplete/osx_sizegrip.png similarity index 100% rename from designer_base/src/com/fr/design/gui/autocomplete/osx_sizegrip.png rename to designer-base/src/com/fr/design/gui/autocomplete/osx_sizegrip.png diff --git a/designer-base/src/com/fr/design/gui/borders/UIFrameBorder.java b/designer-base/src/com/fr/design/gui/borders/UIFrameBorder.java new file mode 100644 index 0000000000..d4ff794e84 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/borders/UIFrameBorder.java @@ -0,0 +1,583 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.borders; + +import com.fr.design.utils.ColorRoutines; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.UIResource; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.HashMap; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-6 + * Time: 下午3:08 + */ +public class UIFrameBorder extends AbstractBorder implements UIResource { + + // cache for already painted captions + private static HashMap cache = new HashMap(); + + public static Color buttonUpperColor, buttonLowerColor; + private static UIFrameBorder onlyInstance; + private static Robot robot; + private static boolean robotsSupported = true; + private Window window; + private int titleHeight; + private boolean isActive; + + public static UIFrameBorder getInstance() { + if (onlyInstance == null) { + onlyInstance = new UIFrameBorder(); + + if (robot == null && robotsSupported) { + try { + robot = new Robot(); + } catch (Exception ex) { + robotsSupported = false; + } + } + } + + return onlyInstance; + } + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + window = SwingUtilities.getWindowAncestor(c); + isActive = window.isActive(); + + if (window instanceof JFrame) { + titleHeight = ThemeUtils.FRAME_TITLE_HEIGHT; + } else { + titleHeight = ThemeUtils.FRAME_INTERNAL_TITLE_HEIGHT; + } + + if (isActive) { + g.setColor(ThemeUtils.FRAME_BORDER_COLOR); + } else { + g.setColor(ThemeUtils.FRAME_BORDER_DISABLED_COLOR); + } + + drawXpBorder(g, x, y, w, h); + + + Color col = null; + if (isActive) { + col = ThemeUtils.FRAME_CAPTION_COLOR; + } else { + col = ThemeUtils.FRAME_CAPTION_DISABLED_COLOR; + } + g.setColor(col); + + drawXpCaption(g, x, y, w, h, col); + + } + + + private void drawXpBorder(Graphics g, int x, int y, int w, int h) { + // left + g.drawLine(x, y + 6, x, y + h - 1); + g.drawLine(x + 2, y + titleHeight, x + 2, y + h - 3); + // right + g.drawLine(x + w - 1, y + 6, x + w - 1, y + h - 1); + g.drawLine(x + w - 3, y + titleHeight, x + w - 3, y + h - 3); + // bottom + g.drawLine(x + 2, y + h - 3, x + w - 3, y + h - 3); + g.drawLine(x, y + h - 1, x + w - 1, y + h - 1); + if (robot != null) { + int wx = window.getLocationOnScreen().x - 4; + int wy = window.getLocationOnScreen().y; + Rectangle screenRect = new Rectangle(wx, wy, 4, 4); + g.drawImage(robot.createScreenCapture(screenRect), x, y, null); + wx = window.getLocationOnScreen().x + window.getWidth() + 1; + screenRect = new Rectangle(wx, wy, 4, 4); + g.drawImage(robot.createScreenCapture(screenRect), x + w - 4, y, null); + } else { + g.setColor(ThemeUtils.BACK_COLOR); + g.fillRect(0, 0, w, 3); + } + if (isActive) { + g.setColor(ThemeUtils.FRAME_CAPTION_COLOR); + } else { + g.setColor(ThemeUtils.FRAME_CAPTION_DISABLED_COLOR); + } + // left + g.drawLine(x + 1, y + titleHeight, x + 1, y + h - 2); + // right + g.drawLine(x + w - 2, y + titleHeight, x + w - 2, y + h - 2); + // bottom + g.drawLine(x + 1, y + h - 2, x + w - 2, y + h - 2); + Color c = null; + if (isActive) { + c = ThemeUtils.FRAME_BORDER_COLOR; + } else { + c = ThemeUtils.FRAME_BORDER_DISABLED_COLOR; + } + g.setColor(ColorRoutines.getAlphaColor(c, 82)); + g.drawLine(x, y + 3, x, y + 3); + g.drawLine(x + w - 1, y + 3, x + w - 1, y + 3); + g.setColor(ColorRoutines.getAlphaColor(c, 156)); + g.drawLine(x, y + 4, x, y + 4); + g.drawLine(x + w - 1, y + 4, x + w - 1, y + 4); + g.setColor(ColorRoutines.getAlphaColor(c, 215)); + g.drawLine(x, y + 5, x, y + 5); + g.drawLine(x + w - 1, y + 5, x + w - 1, y + 5); + } + + + private void drawXpCaption(Graphics g, int x, int y, int w, int h, Color c) { + if (titleHeight == ThemeUtils.FRAME_INTERNAL_TITLE_HEIGHT) { + drawXpInternalCaption(g, x, y, w, h, c); + return; + } + int spread1 = ThemeUtils.FRAME_SPREAD_DARK_DISABLED; + int spread2 = ThemeUtils.FRAME_SPREAD_LIGHT_DISABLED; + int y2 = y; + Color borderColor = null; + drawFirstCaption(g, borderColor, spread1, spread2, x, y2, w); + Color c2 = ColorRoutines.darken(c, 4 * spread1); + drawSecondCaption(g, c2, c, spread2, x, y2, w); + c2 = ColorRoutines.darken(c, 6 * spread1); + drawThirdLine(g, c2, c, spread1, spread2, x, y2, w); + CaptionKey key = new CaptionKey(isActive, titleHeight); + Object value = cache.get(key); + if (value != null) { + g.drawImage((Image) value, + x + 6, y, x + w - 6, y + 5, + 0, 0, 1, 5, + window); + g.drawImage((Image) value, + x + 1, y + 5, x + w - 1, y + titleHeight, + 0, 5, 1, titleHeight, + window); + buttonUpperColor = ColorRoutines.darken(c, 4 * spread1); + buttonLowerColor = ColorRoutines.lighten(c, 10 * spread2); + return; + } + Image img = new BufferedImage(1, titleHeight, BufferedImage.TYPE_INT_ARGB); + Graphics imgGraphics = img.getGraphics(); + drawLines(img, imgGraphics, borderColor, spread1, spread2, c); + if (isActive) { + imgGraphics.setColor(ThemeUtils.FRAME_LIGHT_COLOR); + } else { + imgGraphics.setColor(ThemeUtils.FRAME_LIGHT_DISABLED_COLOR); + } + imgGraphics.drawLine(0, 28, 1, 28); + imgGraphics.dispose(); + g.drawImage(img, + x + 6, y, x + w - 6, y + 5, + 0, 0, 1, 5, + window); + g.drawImage(img, + x + 1, y + 5, x + w - 1, y + titleHeight, + 0, 5, 1, titleHeight, + window); + cache.put(key, img); + } + + + private void drawThirdLine(Graphics g, Color c2, Color c, int spread1, int spread2, int x, int y2, int w) { + g.setColor(c2); + g.drawLine(x + 2, y2, x + 2, y2); + g.setColor(ColorRoutines.getAlphaColor(c2, 139)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + y2++; + // darker border + g.setColor(c); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.darken(c, 6 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + // blend from lightest color + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(ColorRoutines.lighten(c, 7 * spread2)); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + g.setColor(ColorRoutines.lighten(c, 3 * spread2)); + g.drawLine(x + 5, y2, x + 5, y2); + g.drawLine(x + w - 6, y2, x + w - 6, y2); + g.setColor(c); + g.drawLine(x + 6, y2, x + 6, y2); + g.drawLine(x + w - 7, y2, x + w - 7, y2); + y2++; + g.setColor(ColorRoutines.darken(c, 2 * spread1)); + g.drawLine(x + 5, y2, x + 6, y2); // left + g.drawLine(x + x + w - 7, y2, x + w - 6, y2); // right + // darker border + g.setColor(ColorRoutines.darken(c, 6 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + // blend from lightest color + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.lighten(c, 5 * spread2)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(c); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + y2++; + g.setColor(ColorRoutines.darken(c, 4 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + } + + private void drawSecondCaption(Graphics g, Color c2, Color c, int spread2, int x, int y2, int w) { + g.setColor(c2); + g.drawLine(x + 3, y2, x + 5, y2); // left + g.drawLine(x + w - 6, y2, x + w - 4, y2); // right + // blend + g.setColor(ColorRoutines.getAlphaColor(c2, 139)); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.getAlphaColor(c2, 23)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + y2++; + // 3 + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 4, y2, x + 5, y2); // left + g.drawLine(x + w - 6, y2, x + w - 5, y2); // right + // darker border + g.setColor(c); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + } + + private void drawFirstCaption(Graphics g, Color borderColor, int spread1, int spread2, int x, int y2, int w) { + if (isActive) { + borderColor = ThemeUtils.FRAME_BORDER_COLOR; + spread1 = ThemeUtils.FRAME_SPREAD_DARK; + spread2 = ThemeUtils.FRAME_SPREAD_LIGHT; + } else { + borderColor = ThemeUtils.FRAME_BORDER_DISABLED_COLOR; + } + // always paint the semi-transparent parts +// 1 + // blend + g.setColor(ColorRoutines.getAlphaColor(borderColor, 82)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(ColorRoutines.getAlphaColor(borderColor, 156)); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + g.setColor(ColorRoutines.getAlphaColor(borderColor, 215)); + g.drawLine(x + 5, y2, x + 5, y2); + g.drawLine(x + w - 6, y2, x + w - 6, y2); + y2++; + } + + + private void drawLines(Image img, Graphics imgGraphics, Color borderColor, int spread1, int spread2, Color c) { + imgGraphics.setColor(borderColor); + imgGraphics.drawLine(0, 0, 1, 0); + imgGraphics.setColor(ColorRoutines.darken(c, 4 * spread1)); + imgGraphics.drawLine(0, 1, 1, 1); + imgGraphics.setColor(ColorRoutines.lighten(c, 10 * spread2)); + imgGraphics.drawLine(0, 2, 1, 2); + imgGraphics.setColor(c); + imgGraphics.drawLine(0, 3, 1, 3); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 4, 1, 4); + buttonUpperColor = ColorRoutines.darken(c, 4 * spread1); + imgGraphics.setColor(buttonUpperColor); + imgGraphics.drawLine(0, 5, 1, 5); + imgGraphics.setColor(ColorRoutines.darken(c, 4 * spread1)); + imgGraphics.drawLine(0, 6, 1, 6); + imgGraphics.drawLine(0, 7, 1, 7); + imgGraphics.setColor(ColorRoutines.darken(c, 3 * spread1)); + imgGraphics.drawLine(0, 8, 1, 8); + imgGraphics.drawLine(0, 9, 1, 9); + imgGraphics.drawLine(0, 10, 1, 10); + imgGraphics.drawLine(0, 11, 1, 11); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 12, 1, 12); + imgGraphics.drawLine(0, 13, 1, 13); + imgGraphics.drawLine(0, 14, 1, 14); + imgGraphics.setColor(ColorRoutines.darken(c, spread1)); + imgGraphics.drawLine(0, 15, 1, 15); + imgGraphics.drawLine(0, 16, 1, 16); + imgGraphics.setColor(c); + imgGraphics.drawLine(0, 17, 1, 17); + imgGraphics.drawLine(0, 18, 1, 18); + imgGraphics.setColor(ColorRoutines.lighten(c, 2 * spread2)); + imgGraphics.drawLine(0, 19, 1, 19); + imgGraphics.setColor(ColorRoutines.lighten(c, 4 * spread2)); + imgGraphics.drawLine(0, 20, 1, 20); + imgGraphics.setColor(ColorRoutines.lighten(c, 5 * spread2)); + imgGraphics.drawLine(0, 21, 1, 21); + imgGraphics.setColor(ColorRoutines.lighten(c, 6 * spread2)); + imgGraphics.drawLine(0, 22, 1, 22); + imgGraphics.setColor(ColorRoutines.lighten(c, 8 * spread2)); + imgGraphics.drawLine(0, 23, 1, 23); + imgGraphics.setColor(ColorRoutines.lighten(c, 9 * spread2)); + imgGraphics.drawLine(0, 24, 1, 24); + imgGraphics.setColor(ColorRoutines.lighten(c, 10 * spread2)); + imgGraphics.drawLine(0, 25, 1, 25); + imgGraphics.setColor(ColorRoutines.lighten(c, 4 * spread2)); + imgGraphics.drawLine(0, 26, 1, 26); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 27, 1, 27); + } + + private void drawXpInternalCaption(Graphics g, int x, int y, int w, int h, Color c) { + int spread1 = ThemeUtils.FRAME_SPREAD_DARK_DISABLED; + int spread2 = ThemeUtils.FRAME_SPREAD_LIGHT_DISABLED; + int y2 = y; + Color borderColor = null; + paintCaptionLine(g, borderColor, spread1, spread2, x, y2, w); + Color c2 = ColorRoutines.darken(c, 4 * spread1); + paintFirstLine(g, c2, c, spread2, x, y2, w); + c2 = ColorRoutines.darken(c, 6 * spread1); + paintSecondLine(g, c2, c, spread1, spread2, x, y2, w); + // now either paint from cache or create cached image + CaptionKey key = new CaptionKey(isActive, titleHeight); + Object value = cache.get(key); + if (value != null) { + // image is cached - paint and return + g.drawImage((Image) value, + x + 6, y, x + w - 6, y + 5, + 0, 0, 1, 5, + window); + g.drawImage((Image) value, + x + 1, y + 5, x + w - 1, y + titleHeight, + 0, 5, 1, titleHeight, + window); + buttonUpperColor = ColorRoutines.darken(c, 4 * spread1); + buttonLowerColor = ColorRoutines.lighten(c, 10 * spread2); + + return; + } + Image img = new BufferedImage(1, titleHeight, BufferedImage.TYPE_INT_ARGB); + Graphics imgGraphics = img.getGraphics(); + paintCaptionImage(imgGraphics, borderColor, spread1, spread2, c); + if (isActive) { + imgGraphics.setColor(ThemeUtils.FRAME_LIGHT_COLOR); + } else { + imgGraphics.setColor(ThemeUtils.FRAME_LIGHT_DISABLED_COLOR); + } + imgGraphics.drawLine(0, 24, 1, 24); + imgGraphics.dispose(); + g.drawImage(img, + x + 6, y, x + w - 6, y + 5, + 0, 0, 1, 5, + window); + g.drawImage(img, + x + 1, y + 5, x + w - 1, y + titleHeight, + 0, 5, 1, titleHeight, + window); + cache.put(key, img); + } + + private void paintCaptionImage(Graphics imgGraphics, Color borderColor, int spread1, int spread2, Color c) { + imgGraphics.setColor(borderColor); + imgGraphics.drawLine(0, 0, 1, 0); + imgGraphics.setColor(ColorRoutines.darken(c, 4 * spread1)); + imgGraphics.drawLine(0, 1, 1, 1); + imgGraphics.setColor(ColorRoutines.lighten(c, 10 * spread2)); + imgGraphics.drawLine(0, 2, 1, 2); + imgGraphics.setColor(c); + imgGraphics.drawLine(0, 3, 1, 3); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 4, 1, 4); + imgGraphics.setColor(ColorRoutines.darken(c, 4 * spread1)); + imgGraphics.drawLine(0, 5, 1, 5); + imgGraphics.setColor(ColorRoutines.darken(c, 4 * spread1)); + imgGraphics.drawLine(0, 6, 1, 6); + imgGraphics.setColor(ColorRoutines.darken(c, 3 * spread1)); + imgGraphics.drawLine(0, 7, 1, 7); + imgGraphics.drawLine(0, 8, 1, 8); + imgGraphics.drawLine(0, 9, 1, 9); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 10, 1, 10); + imgGraphics.drawLine(0, 11, 1, 11); + imgGraphics.setColor(ColorRoutines.darken(c, spread1)); + imgGraphics.drawLine(0, 12, 1, 12); + imgGraphics.setColor(c); + imgGraphics.drawLine(0, 13, 1, 13); + imgGraphics.drawLine(0, 14, 1, 14); + imgGraphics.setColor(ColorRoutines.lighten(c, 2 * spread2)); + imgGraphics.drawLine(0, 15, 1, 15); + imgGraphics.setColor(ColorRoutines.lighten(c, 4 * spread2)); + imgGraphics.drawLine(0, 16, 1, 16); + imgGraphics.setColor(ColorRoutines.lighten(c, 5 * spread2)); + imgGraphics.drawLine(0, 17, 1, 17); + imgGraphics.setColor(ColorRoutines.lighten(c, 6 * spread2)); + imgGraphics.drawLine(0, 18, 1, 18); + imgGraphics.setColor(ColorRoutines.lighten(c, 8 * spread2)); + imgGraphics.drawLine(0, 19, 1, 19); + imgGraphics.setColor(ColorRoutines.lighten(c, 9 * spread2)); + imgGraphics.drawLine(0, 20, 1, 20); + imgGraphics.setColor(ColorRoutines.lighten(c, 10 * spread2)); + imgGraphics.drawLine(0, 21, 1, 21); + imgGraphics.setColor(ColorRoutines.lighten(c, 4 * spread2)); + imgGraphics.drawLine(0, 22, 1, 22); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 23, 1, 23); + } + + + private void paintSecondLine(Graphics g, Color c2, Color c, int spread1, int spread2, int x, int y2, int w) { + g.setColor(c2); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + // blend + g.setColor(ColorRoutines.getAlphaColor(c2, 139)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + y2++; + g.setColor(c); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.darken(c, 6 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(ColorRoutines.lighten(c, 7 * spread2)); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + g.setColor(ColorRoutines.lighten(c, 3 * spread2)); + g.drawLine(x + 5, y2, x + 5, y2); + g.drawLine(x + w - 6, y2, x + w - 6, y2); + g.setColor(c); + g.drawLine(x + 6, y2, x + 6, y2); + g.drawLine(x + w - 7, y2, x + w - 7, y2); + y2++; + g.setColor(ColorRoutines.darken(c, 2 * spread1)); + g.drawLine(x + 5, y2, x + 6, y2); // left + g.drawLine(x + x + w - 7, y2, x + w - 6, y2); // right + g.setColor(ColorRoutines.darken(c, 6 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.lighten(c, 5 * spread2)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(c); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + y2++; + g.setColor(ColorRoutines.darken(c, 4 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + } + + private void paintFirstLine(Graphics g, Color c2, Color c, int spread2, int x, int y2, int w) { + g.setColor(c2); + g.drawLine(x + 3, y2, x + 5, y2); // left + g.drawLine(x + w - 6, y2, x + w - 4, y2); // right + // blend + g.setColor(ColorRoutines.getAlphaColor(c2, 139)); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.getAlphaColor(c2, 23)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + y2++; + // 3 + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 4, y2, x + 5, y2); // left + g.drawLine(x + w - 6, y2, x + w - 5, y2); // right + // darker border + g.setColor(c); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + } + + + private void paintCaptionLine(Graphics g, Color borderColor, int spread1, int spread2, int x, int y2, int w) { + + if (isActive) { + borderColor = ThemeUtils.FRAME_BORDER_COLOR; + spread1 = ThemeUtils.FRAME_SPREAD_DARK; + spread2 = ThemeUtils.FRAME_SPREAD_LIGHT; + } else { + borderColor = ThemeUtils.FRAME_BORDER_DISABLED_COLOR; + } + + // always paint the semi-transparent parts +// 1 + // blend + g.setColor(ColorRoutines.getAlphaColor(borderColor, 82)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(ColorRoutines.getAlphaColor(borderColor, 156)); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + g.setColor(ColorRoutines.getAlphaColor(borderColor, 215)); + g.drawLine(x + 5, y2, x + 5, y2); + g.drawLine(x + w - 6, y2, x + w - 6, y2); + y2++; + } + + + /** + * @see javax.swing.border.Border#getBorderInsets(Component) + */ + public Insets getBorderInsets(Component c) { + Window w = SwingUtilities.getWindowAncestor(c); + + if (w != null && (w instanceof Frame)) { + Frame f = (Frame) w; + + // if the frame is maximized, the border should not be visible + if (f.getExtendedState() == (f.getExtendedState() | Frame.MAXIMIZED_BOTH)) { + return new Insets(0, 0, 0, 0); + } + } + + return new Insets(0, ThemeUtils.FRAME_BORDER_WIDTH, + ThemeUtils.FRAME_BORDER_WIDTH, ThemeUtils.FRAME_BORDER_WIDTH); + } + + /** + * CaptionKey is used as key in the cache HashMap. + * Overrides equals() and hashCode(). + */ + static class CaptionKey { + + private boolean isActive; + private int titleHeight; + + CaptionKey(boolean isActive, int titleHeight) { + this.isActive = isActive; + this.titleHeight = titleHeight; + } + + public boolean equals(Object o) { + if (o == null){ + return false; + } + if (!(o instanceof CaptionKey)) { + return false; + } + + CaptionKey other = (CaptionKey) o; + + return isActive == other.isActive && + titleHeight == other.titleHeight; + } + + public int hashCode() { + return (isActive ? 1 : 2) * titleHeight; + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/borders/UIInternalFrameBorder.java b/designer-base/src/com/fr/design/gui/borders/UIInternalFrameBorder.java new file mode 100644 index 0000000000..ef2d505f77 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/borders/UIInternalFrameBorder.java @@ -0,0 +1,592 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.borders; + +import com.fr.design.utils.ColorRoutines; +import com.fr.design.utils.ThemeUtils; + + +import javax.swing.*; +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.UIResource; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.HashMap; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-5 + * Time: 下午3:13 + */ +public class UIInternalFrameBorder extends AbstractBorder implements UIResource { + private static HashMap cache = new HashMap(); + + public static Color frameUpperColor, frameLowerColor; + public static Color disabledUpperColor, disabledLowerColor; + private JInternalFrame frame; + private boolean isPalette; + private int titleHeight; + + /** + * indicates whether the internal frame is active + */ + private boolean isActive; + + /** + * @see javax.swing.border.Border#paintBorder(Component, Graphics, int, int, int, int) + */ + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + frame = (JInternalFrame) c; + + if (ThemeUtils.FRAME_IS_TRANSPARENT) { + frame.setOpaque(false); + } + + isActive = frame.isSelected(); + isPalette = (frame.getClientProperty("isPalette") == Boolean.TRUE); + + if (isPalette) { + titleHeight = ThemeUtils.FRAME_PALETTE_TITLE_HEIGHT; + } else { + titleHeight = ThemeUtils.FRAME_INTERNAL_TITLE_HEIGHT; + } + + if (isActive) { + g.setColor(ThemeUtils.FRAME_BORDER_COLOR); + } else { + g.setColor(ThemeUtils.FRAME_BORDER_DISABLED_COLOR); + } + + drawXpBorder(g, x, y, w, h); + + + Color col = null; + if (isActive) { + col = ThemeUtils.FRAME_CAPTION_COLOR; + } else { + col = ThemeUtils.FRAME_CAPTION_DISABLED_COLOR; + } + g.setColor(col); + drawXpCaption(g, x, y, w, h, col); + } + + + private void drawXpBorder(Graphics g, int x, int y, int w, int h) { + // left + g.drawLine(x, y + 6, x, y + h - 1); + g.drawLine(x + 2, y + titleHeight, x + 2, y + h - 3); + // right + g.drawLine(x + w - 1, y + 6, x + w - 1, y + h - 1); + g.drawLine(x + w - 3, y + titleHeight, x + w - 3, y + h - 3); + // bottom + g.drawLine(x + 2, y + h - 3, x + w - 3, y + h - 3); + g.drawLine(x, y + h - 1, x + w - 1, y + h - 1); + + if (isActive) { + g.setColor(ThemeUtils.FRAME_CAPTION_COLOR); + } else { + g.setColor(ThemeUtils.FRAME_CAPTION_DISABLED_COLOR); + } + + // left + g.drawLine(x + 1, y + titleHeight, x + 1, y + h - 2); + // right + g.drawLine(x + w - 2, y + titleHeight, x + w - 2, y + h - 2); + // bottom + g.drawLine(x + 1, y + h - 2, x + w - 2, y + h - 2); + + // outer blend over 3 px + Color c = null; + if (isActive) { + c = ThemeUtils.FRAME_BORDER_COLOR; + } else { + c = ThemeUtils.FRAME_BORDER_DISABLED_COLOR; + } + + g.setColor(ColorRoutines.getAlphaColor(c, 82)); + g.drawLine(x, y + 3, x, y + 3); + g.drawLine(x + w - 1, y + 3, x + w - 1, y + 3); + g.setColor(ColorRoutines.getAlphaColor(c, 156)); + g.drawLine(x, y + 4, x, y + 4); + g.drawLine(x + w - 1, y + 4, x + w - 1, y + 4); + g.setColor(ColorRoutines.getAlphaColor(c, 215)); + g.drawLine(x, y + 5, x, y + 5); + g.drawLine(x + w - 1, y + 5, x + w - 1, y + 5); + } + + + private void drawXpCaption(Graphics g, int x, int y, int w, int h, Color c) { + // Note: this method is equal to TinyFrameBorder.drawXpInternalCaption() + if (isPalette) { + drawXpPaletteCaption(g, x, y, w, h, c); + return; + } + int spread1 = ThemeUtils.FRAME_SPREAD_DARK_DISABLED; + int spread2 = ThemeUtils.FRAME_SPREAD_LIGHT_DISABLED; + int y2 = y; + Color borderColor = null; + if (isActive) { + borderColor = ThemeUtils.FRAME_BORDER_COLOR; + spread1 = ThemeUtils.FRAME_SPREAD_DARK; + spread2 = ThemeUtils.FRAME_SPREAD_LIGHT; + } else { + borderColor = ThemeUtils.FRAME_BORDER_DISABLED_COLOR; + } + // always paint the semi-transparent parts + // 1 + // blend + drawFirstLine(g, x, y, w, h, y2, spread1, spread2, c, borderColor); + // 4 + // darker border + drawSecondLine(g, x, y, w, h, y2, spread1, spread2, c); + // now either paint from cache or create cached image + CaptionKey key = new CaptionKey(isActive, titleHeight); + Object value = cache.get(key); + if (value != null) { + g.drawImage((Image) value, + x + 6, y, x + w - 6, y + 5, + 0, 0, 1, 5, + frame); + g.drawImage((Image) value, + x + 1, y + 5, x + w - 1, y + titleHeight, + 0, 5, 1, titleHeight, + frame); + if (isActive) { + frameUpperColor = ColorRoutines.darken(c, 4 * spread1); + frameLowerColor = ColorRoutines.lighten(c, 10 * spread2); + } else { + disabledUpperColor = ColorRoutines.darken(c, 4 * spread1); + disabledLowerColor = ColorRoutines.lighten(c, 10 * spread2); + } + return; + } + Image img = new BufferedImage(1, titleHeight, BufferedImage.TYPE_INT_ARGB); + Graphics imgGraphics = img.getGraphics(); + drawImageLine(imgGraphics, borderColor, c, spread1, spread2); + drawImageLast(img, imgGraphics, g, x, y, w, key); + } + + private void drawImageLast(Image img, Graphics imgGraphics, Graphics g, int x, int y, int w, CaptionKey key) { + // 25 + if (isActive) { + imgGraphics.setColor(ThemeUtils.FRAME_LIGHT_COLOR); + } else { + imgGraphics.setColor(ThemeUtils.FRAME_LIGHT_DISABLED_COLOR); + } + imgGraphics.drawLine(0, 24, 1, 24); + + // dispose of image graphics + imgGraphics.dispose(); + + // paint image + g.drawImage(img, + x + 6, y, x + w - 6, y + 5, + 0, 0, 1, 5, + frame); + g.drawImage(img, + x + 1, y + 5, x + w - 1, y + titleHeight, + 0, 5, 1, titleHeight, + frame); + + // add the image to the cache + cache.put(key, img); + } + + private void drawImageLine(Graphics imgGraphics, Color borderColor, Color c, int spread1, int spread2) { + imgGraphics.setColor(borderColor); + imgGraphics.drawLine(0, 0, 1, 0); + imgGraphics.setColor(ColorRoutines.darken(c, 4 * spread1)); + imgGraphics.drawLine(0, 1, 1, 1); + imgGraphics.setColor(ColorRoutines.lighten(c, 10 * spread2)); + imgGraphics.drawLine(0, 2, 1, 2); + imgGraphics.setColor(c); + imgGraphics.drawLine(0, 3, 1, 3); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 4, 1, 4); + imgGraphics.setColor(ColorRoutines.darken(c, 4 * spread1)); + imgGraphics.drawLine(0, 5, 1, 5); + imgGraphics.setColor(ColorRoutines.darken(c, 4 * spread1)); + imgGraphics.drawLine(0, 6, 1, 6); + imgGraphics.setColor(ColorRoutines.darken(c, 3 * spread1)); + imgGraphics.drawLine(0, 7, 1, 7); + imgGraphics.drawLine(0, 8, 1, 8); + imgGraphics.drawLine(0, 9, 1, 9); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 10, 1, 10); + imgGraphics.drawLine(0, 11, 1, 11); + imgGraphics.setColor(ColorRoutines.darken(c, spread1)); + imgGraphics.drawLine(0, 12, 1, 12); + imgGraphics.setColor(c); + imgGraphics.drawLine(0, 13, 1, 13); + imgGraphics.drawLine(0, 14, 1, 14); + imgGraphics.setColor(ColorRoutines.lighten(c, 2 * spread2)); + imgGraphics.drawLine(0, 15, 1, 15); + imgGraphics.setColor(ColorRoutines.lighten(c, 4 * spread2)); + imgGraphics.drawLine(0, 16, 1, 16); + imgGraphics.setColor(ColorRoutines.lighten(c, 5 * spread2)); + imgGraphics.drawLine(0, 17, 1, 17); + imgGraphics.setColor(ColorRoutines.lighten(c, 6 * spread2)); + imgGraphics.drawLine(0, 18, 1, 18); + imgGraphics.setColor(ColorRoutines.lighten(c, 8 * spread2)); + imgGraphics.drawLine(0, 19, 1, 19); + imgGraphics.setColor(ColorRoutines.lighten(c, 9 * spread2)); + imgGraphics.drawLine(0, 20, 1, 20); + imgGraphics.setColor(ColorRoutines.lighten(c, 10 * spread2)); + imgGraphics.drawLine(0, 21, 1, 21); + imgGraphics.setColor(ColorRoutines.lighten(c, 4 * spread2)); + imgGraphics.drawLine(0, 22, 1, 22); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 23, 1, 23); + } + + private void drawFirstLine(Graphics g, int x, int y, int w, int h, int y2, int spread1, int spread2, Color c, Color borderColor) { + g.setColor(ColorRoutines.getAlphaColor(borderColor, 82)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(ColorRoutines.getAlphaColor(borderColor, 156)); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + g.setColor(ColorRoutines.getAlphaColor(borderColor, 215)); + g.drawLine(x + 5, y2, x + 5, y2); + g.drawLine(x + w - 6, y2, x + w - 6, y2); + y2++; + // 2 + Color c2 = ColorRoutines.darken(c, 4 * spread1); + g.setColor(c2); + g.drawLine(x + 3, y2, x + 5, y2); // left + g.drawLine(x + w - 6, y2, x + w - 4, y2); // right + // blend + g.setColor(ColorRoutines.getAlphaColor(c2, 139)); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.getAlphaColor(c2, 23)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + y2++; + // 3 + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 4, y2, x + 5, y2); // left + g.drawLine(x + w - 6, y2, x + w - 5, y2); // right + // darker border + g.setColor(c); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + c2 = ColorRoutines.darken(c, 6 * spread1); + g.setColor(c2); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + // blend + g.setColor(ColorRoutines.getAlphaColor(c2, 139)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + y2++; + } + + private void drawSecondLine(Graphics g, int x, int y, int w, int h, int y2, int spread1, int spread2, Color c) { + g.setColor(c); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.darken(c, 6 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + // blend from lightest color + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(ColorRoutines.lighten(c, 7 * spread2)); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + g.setColor(ColorRoutines.lighten(c, 3 * spread2)); + g.drawLine(x + 5, y2, x + 5, y2); + g.drawLine(x + w - 6, y2, x + w - 6, y2); + g.setColor(c); + g.drawLine(x + 6, y2, x + 6, y2); + g.drawLine(x + w - 7, y2, x + w - 7, y2); + y2++; + g.setColor(ColorRoutines.darken(c, 2 * spread1)); + g.drawLine(x + 5, y2, x + 6, y2); // left + g.drawLine(x + x + w - 7, y2, x + w - 6, y2); // right + // darker border + g.setColor(ColorRoutines.darken(c, 6 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + // blend from lightest color + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.lighten(c, 5 * spread2)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(c); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + y2++; + // 6 + // lighten little + g.setColor(ColorRoutines.darken(c, 4 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + } + + private void drawXpPaletteCaption(Graphics g, int x, int y, int w, int h, Color c) { + int y2 = y; + int spread1 = ThemeUtils.FRAME_SPREAD_DARK_DISABLED; + int spread2 = ThemeUtils.FRAME_SPREAD_LIGHT_DISABLED; + Color borderColor = null; + if (isActive) { + borderColor = ThemeUtils.FRAME_BORDER_COLOR; + spread1 = ThemeUtils.FRAME_SPREAD_DARK; + spread2 = ThemeUtils.FRAME_SPREAD_LIGHT; + } else { + borderColor = ThemeUtils.FRAME_BORDER_DISABLED_COLOR; + } + // always paint the semi-transparent parts + paintFirstLine(g, x, y, w, h, y2, spread1, spread2, c, borderColor); + // blend from lightest color + paintSecondLine(g, x, y, w, h, y2, spread1, spread2, c); + // now either paint from cache or create cached image + CaptionKey key = new CaptionKey(isActive, titleHeight); + Object value = cache.get(key); + + if (value != null) { + // image is cached - paint and return + g.drawImage((Image) value, + x + 6, y, x + w - 6, y + 5, + 0, 0, 1, 5, + frame); + g.drawImage((Image) value, + x + 1, y + 5, x + w - 1, y + titleHeight, + 0, 5, 1, titleHeight, + frame); + + // store button colors + if (isActive) { + frameUpperColor = ColorRoutines.darken(c, 4 * spread1); + frameLowerColor = ColorRoutines.lighten(c, 10 * spread2); + } else { + disabledUpperColor = ColorRoutines.darken(c, 4 * spread1); + disabledLowerColor = ColorRoutines.lighten(c, 10 * spread2); + } + + return; + } + + Image img = new BufferedImage(1, titleHeight, BufferedImage.TYPE_INT_ARGB); + Graphics imgGraphics = img.getGraphics(); + paintImageLine(imgGraphics, borderColor, c, spread1, spread2); + paintImageLast(img, imgGraphics, g, x, y, w, key); + } + + + private void paintImageLast(Image img, Graphics imgGraphics, Graphics g, int x, int y, int w, CaptionKey key) { + // 21 + if (isActive) { + imgGraphics.setColor(ThemeUtils.FRAME_LIGHT_COLOR); + } else { + imgGraphics.setColor(ThemeUtils.FRAME_LIGHT_DISABLED_COLOR); + } + imgGraphics.drawLine(0, 20, 1, 20); + + // dispose of image graphics + imgGraphics.dispose(); + + // paint image + g.drawImage(img, + x + 6, y, x + w - 6, y + 5, + 0, 0, 1, 5, + frame); + g.drawImage(img, + x + 1, y + 5, x + w - 1, y + titleHeight, + 0, 5, 1, titleHeight, + frame); + + // add the image to the cache + cache.put(key, img); + + } + + private void paintImageLine(Graphics imgGraphics, Color borderColor, Color c, int spread1, int spread2) { + imgGraphics.setColor(borderColor); + imgGraphics.drawLine(0, 0, 1, 0); + imgGraphics.setColor(ColorRoutines.darken(c, 4 * spread1)); + imgGraphics.drawLine(0, 1, 1, 1); + imgGraphics.setColor(ColorRoutines.lighten(c, 10 * spread2)); + imgGraphics.drawLine(0, 2, 1, 2); + imgGraphics.setColor(c); + imgGraphics.drawLine(0, 3, 1, 3); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 4, 1, 4); + imgGraphics.setColor(ColorRoutines.darken(c, 4 * spread1)); + imgGraphics.drawLine(0, 5, 1, 5); + imgGraphics.drawLine(0, 6, 1, 6); + imgGraphics.setColor(ColorRoutines.darken(c, 3 * spread1)); + imgGraphics.drawLine(0, 7, 1, 7); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 8, 1, 8); + imgGraphics.setColor(ColorRoutines.darken(c, spread1)); + imgGraphics.drawLine(0, 9, 1, 9); + imgGraphics.setColor(c); + imgGraphics.drawLine(0, 10, 1, 10); + imgGraphics.setColor(ColorRoutines.lighten(c, 2 * spread2)); + imgGraphics.drawLine(0, 11, 1, 11); + imgGraphics.setColor(ColorRoutines.lighten(c, 4 * spread2)); + imgGraphics.drawLine(0, 12, 1, 12); + imgGraphics.setColor(ColorRoutines.lighten(c, 5 * spread2)); + imgGraphics.drawLine(0, 13, 1, 13); + imgGraphics.setColor(ColorRoutines.lighten(c, 6 * spread2)); + imgGraphics.drawLine(0, 14, 1, 14); + imgGraphics.setColor(ColorRoutines.lighten(c, 8 * spread2)); + imgGraphics.drawLine(0, 15, 1, 15); + imgGraphics.setColor(ColorRoutines.lighten(c, 9 * spread2)); + imgGraphics.drawLine(0, 16, 1, 16); + imgGraphics.setColor(ColorRoutines.lighten(c, 10 * spread2)); + imgGraphics.drawLine(0, 17, 1, 17); + imgGraphics.setColor(ColorRoutines.lighten(c, 4 * spread2)); + imgGraphics.drawLine(0, 18, 1, 18); + imgGraphics.setColor(ColorRoutines.darken(c, 2 * spread1)); + imgGraphics.drawLine(0, 19, 1, 19); + } + + private void paintSecondLine(Graphics g, int x, int y, int w, int h, int y2, int spread1, int spread2, Color c) { + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(ColorRoutines.lighten(c, 7 * spread2)); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + g.setColor(ColorRoutines.lighten(c, 3 * spread2)); + g.drawLine(x + 5, y2, x + 5, y2); + g.drawLine(x + w - 6, y2, x + w - 6, y2); + g.setColor(c); + g.drawLine(x + 6, y2, x + 6, y2); + g.drawLine(x + w - 7, y2, x + w - 7, y2); + y2++; + // 5 + g.setColor(ColorRoutines.darken(c, 2 * spread1)); + g.drawLine(x + 5, y2, x + 6, y2); // left + g.drawLine(x + x + w - 7, y2, x + w - 6, y2); // right + // darker border + g.setColor(ColorRoutines.darken(c, 6 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + // blend from lightest color + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.lighten(c, 5 * spread2)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(c); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + y2++; + // 6 + // lighten little + g.setColor(ColorRoutines.darken(c, 4 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2);/**/ + } + + private void paintFirstLine(Graphics g, int x, int y, int w, int h, int y2, int spread1, int spread2, Color c, Color borderColor) { + // 1 + g.setColor(ColorRoutines.getAlphaColor(borderColor, 82)); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + g.setColor(ColorRoutines.getAlphaColor(borderColor, 156)); + g.drawLine(x + 4, y2, x + 4, y2); + g.drawLine(x + w - 5, y2, x + w - 5, y2); + g.setColor(ColorRoutines.getAlphaColor(borderColor, 215)); + g.drawLine(x + 5, y2, x + 5, y2); + g.drawLine(x + w - 6, y2, x + w - 6, y2); + y2++; + // 2 + Color c2 = ColorRoutines.darken(c, 4 * spread1); + g.setColor(c2); + g.drawLine(x + 3, y2, x + 5, y2); // left + g.drawLine(x + w - 6, y2, x + w - 4, y2); // right + g.setColor(ColorRoutines.getAlphaColor(c2, 139)); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.getAlphaColor(c2, 23)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + y2++; + g.setColor(ColorRoutines.lighten(c, 10 * spread2)); + g.drawLine(x + 4, y2, x + 5, y2); // left + g.drawLine(x + w - 6, y2, x + w - 5, y2); // right + // darker border + g.setColor(c); + g.drawLine(x + 3, y2, x + 3, y2); + g.drawLine(x + w - 4, y2, x + w - 4, y2); + c2 = ColorRoutines.darken(c, 6 * spread1); + g.setColor(c2); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.getAlphaColor(c2, 139)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + y2++; + // 4 + // darker border + g.setColor(c); + g.drawLine(x + 2, y2, x + 2, y2); + g.drawLine(x + w - 3, y2, x + w - 3, y2); + g.setColor(ColorRoutines.darken(c, 6 * spread1)); + g.drawLine(x + 1, y2, x + 1, y2); + g.drawLine(x + w - 2, y2, x + w - 2, y2); + } + + + /** + * @see javax.swing.border.Border#getBorderInsets(Component) + */ + public Insets getBorderInsets(Component c) { + JInternalFrame frame = (JInternalFrame) c; + + // if the frame is maximized, the border should not be visible + if (frame.isMaximum()) { + return new Insets(0, 0, 0, 0); + } + + return new Insets(0, ThemeUtils.FRAME_BORDER_WIDTH, + ThemeUtils.FRAME_BORDER_WIDTH, ThemeUtils.FRAME_BORDER_WIDTH); + } + + + /** + * CaptionKey is used as key in the cache HashMap. + * Overrides equals() and hashCode(). + */ + static class CaptionKey { + + private boolean isActive; + private int titleHeight; + + CaptionKey(boolean isActive, int titleHeight) { + this.isActive = isActive; + this.titleHeight = titleHeight; + } + + public boolean equals(Object o) { + if (o == null){ + return false; + } + if (!(o instanceof CaptionKey)){ + return false; + } + + CaptionKey other = (CaptionKey) o; + + return isActive == other.isActive && + titleHeight == other.titleHeight; + } + + public int hashCode() { + return (isActive ? 1 : 2) * titleHeight; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/borders/UITableHeaderBorder.java b/designer-base/src/com/fr/design/gui/borders/UITableHeaderBorder.java new file mode 100644 index 0000000000..0d5a2081b6 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/borders/UITableHeaderBorder.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.borders; + +import com.fr.design.utils.ColorRoutines; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.UIResource; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-6 + * Time: 下午3:37 + */ +public class UITableHeaderBorder extends AbstractBorder implements UIResource { + protected static final Insets INSETS_XP = new Insets(3, 0, 3, 2); + protected Color color1, color2, color3, color4, color5; + + public Insets getBorderInsets(Component c) { + return INSETS_XP; + + } + + public Insets getBorderInsets(Component c, Insets insets) { + insets.left = INSETS_XP.left; + insets.top = INSETS_XP.top; + insets.right = INSETS_XP.right; + insets.bottom = INSETS_XP.bottom; + + return insets; + } + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + if (color1 == null) { + color1 = ColorRoutines.darken(c.getBackground(), 5); + color2 = ColorRoutines.darken(c.getBackground(), 10); + color3 = ColorRoutines.darken(c.getBackground(), 15); + color4 = ThemeUtils.TABLE_HEADER_DARK_COLOR; + color5 = ThemeUtils.TABLE_HEADER_LIGHT_COLOR; + } + + // paint 3 bottom lines + g.setColor(color1); + g.drawLine(x, y + h - 3, x + w - 1, y + h - 3); + + g.setColor(color2); + g.drawLine(x, y + h - 2, x + w - 1, y + h - 2); + + g.setColor(color3); + g.drawLine(x, y + h - 1, x + w - 1, y + h - 1); + + // paint separator + g.setColor(color4); + g.drawLine(x + w - 2, y + 3, x + w - 2, y + h - 5); + + g.setColor(color5); + g.drawLine(x + w - 1, y + 3, x + w - 1, y + h - 5); + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/borders/UITableHeaderRolloverBorder.java b/designer-base/src/com/fr/design/gui/borders/UITableHeaderRolloverBorder.java new file mode 100644 index 0000000000..b5df31a060 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/borders/UITableHeaderRolloverBorder.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.borders; + +import com.fr.design.utils.ColorRoutines; +import com.fr.design.utils.ThemeUtils; + +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-6 + * Time: 下午3:36 + */ +public class UITableHeaderRolloverBorder extends UITableHeaderBorder { + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + if (color1 == null) { + color1 = ThemeUtils.TABLE_HEADER_ROLLOVER_COLOR; + color2 = ColorRoutines.lighten(color1, 25); + } + + g.setColor(color1); + g.drawLine(x, y + h - 3, x + w - 1, y + h - 3); // top + g.drawLine(x, y + h - 1, x + w - 1, y + h - 1); // bottom + + g.setColor(color2); + g.drawLine(x, y + h - 2, x + w - 1, y + h - 2); // mid + + // don't paint separator + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/borders/UITableScrollPaneBorder.java b/designer-base/src/com/fr/design/gui/borders/UITableScrollPaneBorder.java new file mode 100644 index 0000000000..91dd157815 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/borders/UITableScrollPaneBorder.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.borders; + +import com.fr.design.utils.ThemeUtils; + +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.UIResource; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-7 + * Time: 上午9:25 + */ +public class UITableScrollPaneBorder extends AbstractBorder implements UIResource { + private static final Insets INSETS = new Insets(1, 1, 1, 1); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + g.setColor(ThemeUtils.TABLE_BORDER_LIGHT_COLOR); + g.drawLine(x + w - 1, y, x + w - 1, y + h - 1); // right + g.drawLine(x, y + h - 1, x + w - 1, y + h - 1); // bottom + + g.setColor(ThemeUtils.TABLE_BORDER_DARK_COLOR); + g.drawLine(x, y, x, y + h - 1); // left + g.drawLine(x, y, x + w - 1, y); // top + } + + public Insets getBorderInsets(Component c) { + return INSETS; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/borders/UITextFieldBorder.java b/designer-base/src/com/fr/design/gui/borders/UITextFieldBorder.java new file mode 100644 index 0000000000..ba859612d9 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/borders/UITextFieldBorder.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.borders; + +import com.fr.design.constants.UIConstants; +import com.fr.design.utils.DrawRoutines; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.UIResource; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-5 + * Time: 下午2:49 + */ +public class UITextFieldBorder extends AbstractBorder implements UIResource { + private Insets insets; + + public UITextFieldBorder() { + insets = ThemeUtils.TEXT_INSETS; + } + + public UITextFieldBorder(Insets insets) { + this.insets = insets; + } + + /** + * Gets the border insets for a given component. + * + * @param c The component to get its border insets. + * @return Always returns the same insets as defined in insets. + */ + public Insets getBorderInsets(Component c) { + return insets; + } + + /** + * Use the skin to paint the border + * + * @see javax.swing.border.Border#paintBorder(Component, Graphics, int, int, int, int) + */ + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + drawXpBorder(c, g, x, y, w, h); + } + + private void drawXpBorder(Component c, Graphics g, int x, int y, int w, int h) { + if (!c.isEnabled()) { + DrawRoutines.drawBorder( + g, ThemeUtils.TEXT_BORDER_DISABLED_COLOR, x, y, w, h); + } else { + DrawRoutines.drawBorder( + g, UIConstants.POP_DIALOG_BORDER, x, y, w, h); + } + } +} \ 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 new file mode 100644 index 0000000000..503b9472cd --- /dev/null +++ b/designer-base/src/com/fr/design/gui/chart/BaseChartPropertyPane.java @@ -0,0 +1,28 @@ +package com.fr.design.gui.chart; + +import com.fr.base.chart.BaseChartCollection; +import com.fr.design.designer.TargetComponent; +import com.fr.design.mainframe.DockingView; + +/** + * 图表属性界面 抽象, 用于多工程协作.. + * @author kunsnat E-mail:kunsnat@gmail.com + * @version 创建时间:2013-7-10 上午09:12:11 + */ +public abstract class BaseChartPropertyPane extends DockingView { + + public abstract void setSureProperty(); + + /** + * 设置是否支持单元格数据. + */ + public abstract void setSupportCellData(boolean supportCellData); + + public abstract void populateChartPropertyPane(BaseChartCollection collection, TargetComponent ePane); + + public abstract ChartEditPaneProvider getChartEditPane(); + + public abstract void addChartEditPane(String plotID); + + //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 similarity index 100% rename from designer_base/src/com/fr/design/gui/chart/ChartEditPaneProvider.java rename to designer-base/src/com/fr/design/gui/chart/ChartEditPaneProvider.java diff --git a/designer-base/src/com/fr/design/gui/chart/MiddleChartComponent.java b/designer-base/src/com/fr/design/gui/chart/MiddleChartComponent.java new file mode 100644 index 0000000000..9d16d6787a --- /dev/null +++ b/designer-base/src/com/fr/design/gui/chart/MiddleChartComponent.java @@ -0,0 +1,25 @@ +package com.fr.design.gui.chart; + +import javax.swing.JComponent; + +import com.fr.base.chart.BaseChart; +import com.fr.base.chart.BaseChartCollection; +import com.fr.stable.core.PropertyChangeAdapter; +import com.fr.stable.core.PropertyChangeListener; + +/** + * @author kunsnat E-mail:kunsnat@gmail.com + * @version 创建时间:2013-7-10 上午09:19:36 + */ +public abstract class MiddleChartComponent extends JComponent { + + public abstract void populate(BaseChartCollection cc); + + public abstract BaseChartCollection update(); + + public abstract void reset(); + + public abstract BaseChart getEditingChart(); + + public abstract void addStopEditingListener(PropertyChangeListener list); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/chart/MiddleChartDialog.java b/designer-base/src/com/fr/design/gui/chart/MiddleChartDialog.java new file mode 100644 index 0000000000..66ca0df792 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/chart/MiddleChartDialog.java @@ -0,0 +1,28 @@ +package com.fr.design.gui.chart; + +import java.awt.Dialog; +import java.awt.Frame; + +import com.fr.base.chart.BaseChartCollection; +import com.fr.design.dialog.BasicDialog; + +/** + * * 抽象的, 用于多工程间协作, 封装一层 图表新建的对话框, 配合属性表确定: 先单独只要一种图表类型的对话框. + * @author kunsnat E-mail:kunsnat@gmail.com + * @version 创建时间:2013-7-10 上午10:07:56 + */ +public abstract class MiddleChartDialog extends BasicDialog{ + + public MiddleChartDialog(Dialog parent) { + super(parent); + } + + public MiddleChartDialog(Frame owner) { + super(owner); + } + + public abstract BaseChartCollection getChartCollection(); + + public abstract void populate(BaseChartCollection cc); + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/columnrow/ColumnRowPane.java b/designer-base/src/com/fr/design/gui/columnrow/ColumnRowPane.java new file mode 100644 index 0000000000..8f9e508d93 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/columnrow/ColumnRowPane.java @@ -0,0 +1,260 @@ +package com.fr.design.gui.columnrow; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GridLayout; + +import javax.swing.JFormattedTextField; +import javax.swing.JPanel; +import javax.swing.JSpinner.DefaultEditor; +import javax.swing.SpinnerListModel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.AbstractDocument; +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.DocumentFilter; + +import com.fr.design.designer.IntervalConstants; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.gui.ispinner.UIBasicSpinner; +import com.fr.design.gui.ispinner.UpperCaseSpinner; +import com.fr.design.gui.ispinner.ColumnRowSpinner; +import com.fr.general.ComparatorUtils; +import com.fr.stable.ColumnRow; +import com.fr.stable.StableUtils; +import com.fr.stable.StringUtils; +import com.fr.design.utils.gui.GUICoreUtils; + +/** + * the component to edit ColumnRow + * + * @editor zhou 2012-3-22下午3:55:53 + */ +public class ColumnRowPane extends JPanel implements UIObserver { + + private static final long serialVersionUID = 1L; + private static String[] columnarray = new String[1000]; + private static String[] rowarray = new String[5000]; + + + protected UpperCaseSpinner columnSpinner; + protected UIBasicSpinner rowSpinner; + + static { + for (int i = 1; i < 1000; i++) { + columnarray[i - 1] = StableUtils.convertIntToABC(i); + } + for (int i = 1; i < 5000; i++) { + rowarray[i - 1] = StringUtils.EMPTY + i; + } + } + + protected DocumentListener d = new DocumentListener() { + + + @Override + public void removeUpdate(DocumentEvent e) { + String rolText = ((DefaultEditor) columnSpinner.getEditor()).getTextField().getText(); + String rowText = ((DefaultEditor) rowSpinner.getEditor()).getTextField().getText(); + if (rolText == null || rolText.length() == 0 || rowText == null || rowText.length() == 0) { + return; + } + int col = StableUtils.convertABCToInt(rolText) - 1; + int row = Integer.parseInt(rowText) - 1; + setColumnRow(ColumnRow.valueOf(col, row)); + } + + @Override + public void insertUpdate(DocumentEvent e) { + int col = StableUtils.convertABCToInt(((DefaultEditor) columnSpinner.getEditor()).getTextField().getText()) - 1; + int row = Integer.parseInt(((DefaultEditor) rowSpinner.getEditor()).getTextField().getText()) - 1; + setColumnRow(ColumnRow.valueOf(col, row)); + } + + @Override + public void changedUpdate(DocumentEvent e) { + + } + }; + + + private UIObserverListener uiObserverListener; + private ColumnRow cr; + + + public ColumnRowPane() { + this.initComponents(); + iniListener(); + } + + + /** + * 初始化元素 + */ + public void initComponents() { + this.setLayout(new GridLayout(0, 2, IntervalConstants.INTERVAL_L6, 0)); + initColSpinner(); + this.add(columnSpinner, BorderLayout.WEST); + initRowSpinner(); + this.add(rowSpinner); + this.addDocumentListener(d); + } + + private void iniListener() { + if (shouldResponseChangeListener()) { + this.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (uiObserverListener == null) { + return; + } + uiObserverListener.doChange(); + } + }); + } + } + + + protected void initRowSpinner() { + rowSpinner = new ColumnRowSpinner((new SpinnerListModel(rowarray))) { + public boolean shouldResponseChangeListener() { + return false; + } + + }; + rowSpinner.setPreferredSize(new Dimension(60, 24)); + JFormattedTextField rftf = GUICoreUtils.getSpinnerTextField(rowSpinner); + if (rftf != null) { + rftf.setColumns(4); // specify more width than we need + rftf.setHorizontalAlignment(UITextField.LEFT); + } + } + + protected void initColSpinner() { + SpinnerListModel columnSpinnerListModel = new SpinnerListModel(columnarray); + columnSpinner = new UpperCaseSpinner(columnSpinnerListModel) { + public boolean shouldResponseChangeListener() { + return false; + } + }; + columnSpinner.setPreferredSize(new Dimension(60, 24)); + JFormattedTextField cftf = GUICoreUtils.getSpinnerTextField(columnSpinner); + if (cftf != null) { + cftf.setColumns(3); // specify more width than we need + cftf.setHorizontalAlignment(UITextField.LEFT); + } + + ((AbstractDocument) cftf.getDocument()).setDocumentFilter(new DocumentFilter() { + public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { + fb.insertString(offset, string.toUpperCase(), attr); + } + + public void replace(FilterBypass fb, int offset, int length, String string, AttributeSet attr) throws BadLocationException { + if (string != null) { + string = string.toUpperCase(); + } + fb.replace(offset, length, string, attr); + } + }); + } + + protected void addDocumentListener(DocumentListener l) { + ((DefaultEditor) columnSpinner.getEditor()).getTextField().getDocument().addDocumentListener(l); + ((DefaultEditor) rowSpinner.getEditor()).getTextField().getDocument().addDocumentListener(l); + } + + private void removeDocumentListener(DocumentListener l) { + ((DefaultEditor) columnSpinner.getEditor()).getTextField().getDocument().removeDocumentListener(l); + ((DefaultEditor) rowSpinner.getEditor()).getTextField().getDocument().removeDocumentListener(l); + } + + /** + * columnSpinner与rowSpinner应该整体考虑,设置ColumnRow应该只触发一次事件 + * + * @param columnRow + */ + public void setColumnRow(ColumnRow columnRow) { + if (!ComparatorUtils.equals(cr, columnRow)) { + setGlobalName(); + removeDocumentListener(d); + cr = columnRow; + addDocumentListener(d); + fireChanged(); + } + } + + public void setGlobalName(){ + + } + + public void populate(ColumnRow columnRow) { + cr = columnRow; + int column = columnRow.getColumn(); + if (column < 0) { + column = 0; + } + removeDocumentListener(d); + columnSpinner.setValue(StableUtils.convertIntToABC(column + 1)); + int row = columnRow.getRow(); + // shoc 小于0就蹦了 + if (row < 0) { + row = 0; + } + rowSpinner.setValue("" + (row + 1)); + addDocumentListener(d); + fireChanged(); + } + + + public ColumnRow update() { + return cr; + } + + /** + * 添加一个listener到listenerList中 + * @param l 监听 + */ + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + } + + /** + * 从listenerList中移除一个listener + * @param l 监听 + */ + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + // august: Process the listeners last to first + protected void fireChanged() { + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + + /** + * 给组件登记一个观察者监听事件 + * @param listener 监听 + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } + + /** + * 组件是否需要响应添加的观察者事件 + * @return 如果需要响应观察者事件则返回true,否则返回false + */ + public boolean shouldResponseChangeListener() { + return true; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/columnrow/ColumnRowVerticalPane.java b/designer-base/src/com/fr/design/gui/columnrow/ColumnRowVerticalPane.java new file mode 100644 index 0000000000..68f94321b1 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/columnrow/ColumnRowVerticalPane.java @@ -0,0 +1,43 @@ +package com.fr.design.gui.columnrow; + +import java.awt.BorderLayout; + +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JPanel; + +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; + + +/** + * @author kunsnat E-mail:kunsnat@gmail.com + * @version 创建时间:2011-12-29 下午02:28:43 + * 类说明: 行列选择界面 只是和ColumnRowPane的布局不同. + */ +public class ColumnRowVerticalPane extends ColumnRowPane { + + private static final long serialVersionUID = 2222494927594030309L; + + public ColumnRowVerticalPane( ) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + JPanel pane = FRGUIPaneFactory.createYBoxEmptyBorderPane(); + this.add(pane, BorderLayout.NORTH); + + JPanel colPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + colPane.add(new UILabel(Inter.getLocText("Column") + ":")); + pane.add(colPane); + + initColSpinner(); + colPane.add(columnSpinner); + + JPanel rowPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + pane.add(rowPane); + + rowPane.add(new UILabel(Inter.getLocText("Row") + ":")); + initRowSpinner(); + rowPane.add(rowSpinner); + + this.addDocumentListener(d); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/controlpane/AbstractNameableCreator.java b/designer-base/src/com/fr/design/gui/controlpane/AbstractNameableCreator.java new file mode 100644 index 0000000000..45c940ed4d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/controlpane/AbstractNameableCreator.java @@ -0,0 +1,117 @@ +package com.fr.design.gui.controlpane; + +import com.fr.base.BaseUtils; +import com.fr.design.beans.BasicBeanPane; +import com.fr.general.ComparatorUtils; +import com.fr.general.NameObject; +import com.fr.js.JavaScript; + +import javax.swing.*; + + +public abstract class AbstractNameableCreator implements NameableCreator { + protected String menuName; + protected Icon menuIcon; + protected Class clazzOfObject; + protected Class clazzOfInitCase; + protected Class clazzOfEditor; + + public AbstractNameableCreator(String menuName, Class clazz, Class clazzOfEditor) { + this.menuName = menuName; + this.clazzOfObject = clazz; + this.clazzOfInitCase = clazz; + this.clazzOfEditor = clazzOfEditor; + } + + public AbstractNameableCreator(String menuName, String iconPath, Class clazz) { + this.menuName = menuName; + this.menuIcon = BaseUtils.readIcon(iconPath); + this.clazzOfObject = clazz; + this.clazzOfInitCase = clazz; + } + + public AbstractNameableCreator(String menuName, String iconPath, Class clazz, Class clazzOfEditor) { + this.menuName = menuName; + this.menuIcon = BaseUtils.readIcon(iconPath); + this.clazzOfObject = clazz; + this.clazzOfEditor = clazzOfEditor; + this.clazzOfInitCase = clazz; + } + + public AbstractNameableCreator(String menuName, String iconPath, Class clazz, Class clazz4Init, Class clazzOfEditor) { + this.menuName = menuName; + this.menuIcon = BaseUtils.readIcon(iconPath); + this.clazzOfObject = clazz; + this.clazzOfEditor = clazzOfEditor; + this.clazzOfInitCase = clazz; + this.clazzOfInitCase = clazz4Init; + } + + /** + * get menuName + * @return + */ + public String menuName() { + return this.menuName; + } + + /** + * get menuIcon + * @return + */ + public Icon menuIcon() { + return this.menuIcon; + } + + @Override + public Class getHyperlink() { + return this.clazzOfObject; + } + + /** + * get clazzOfEditor + * @return + */ + public Class getUpdatePane() { + return this.clazzOfEditor; + } + + /** + * + * @param ob + * @return + */ + public Object acceptObject2Populate(Object ob) { + if (ob instanceof NameObject) { + ob = ((NameObject)ob).getObject(); + } + if (clazzOfObject != null && clazzOfObject.isInstance(ob)) { + doSthChanged4Icon(ob); + return ob; + } + + return null; + } + + protected void doSthChanged4Icon(Object ob){ + + } + + /** + * + * @return + */ + public String createTooltip(){ + return null; + } + + public boolean isNeedParameterWhenPopulateJControlPane(){ + return false; + } + + public boolean equals(Object obj) { + return obj instanceof AbstractNameableCreator + && ComparatorUtils.equals(menuName, ((AbstractNameableCreator) obj).menuName) + && ComparatorUtils.equals(clazzOfObject, ((AbstractNameableCreator) obj).clazzOfObject); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/controlpane/ControlPane.java b/designer-base/src/com/fr/design/gui/controlpane/ControlPane.java new file mode 100644 index 0000000000..4b4991300c --- /dev/null +++ b/designer-base/src/com/fr/design/gui/controlpane/ControlPane.java @@ -0,0 +1,38 @@ +package com.fr.design.gui.controlpane; + +import java.util.Enumeration; + +import javax.swing.JTree; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; + +import com.fr.design.dialog.BasicPane; + +public abstract class ControlPane extends BasicPane{ + + public void expandAll(JTree tree, boolean expand) { + TreeNode root = (TreeNode) tree.getModel().getRoot(); + expandAll(tree, new TreePath(root), expand); + } + + private void expandAll(JTree tree, TreePath parent, boolean expand) { + // Traverse children + TreeNode node = (TreeNode) parent.getLastPathComponent(); + if (node.getChildCount() >= 0) { + for (Enumeration e = node.children(); e.hasMoreElements();) { + TreeNode n = (TreeNode) e.nextElement(); + TreePath path = parent.pathByAddingChild(n); + expandAll(tree, path, expand); + } + } + + // Expansion or collapse must be done bottom-up + if (expand) { + tree.expandPath(parent); + } else { + tree.collapsePath(parent); + } + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/controlpane/JControlPane.java b/designer-base/src/com/fr/design/gui/controlpane/JControlPane.java new file mode 100644 index 0000000000..55201d639e --- /dev/null +++ b/designer-base/src/com/fr/design/gui/controlpane/JControlPane.java @@ -0,0 +1,212 @@ +package com.fr.design.gui.controlpane; + +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.menu.ToolBarDef; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.stable.ArrayUtils; +import com.fr.stable.Nameable; + +import javax.swing.*; +import java.awt.*; + +/** + * Coder: zack + * Date: 2016/5/17 + * Time: 15:07 + */ +public abstract class JControlPane extends BasicPane implements UnrepeatedNameHelper { + protected static final int SHORT_WIDTH = 30; //每加一个short Divider位置加30 + protected JPanel controlUpdatePane; + + private ShortCut4JControlPane[] shorts; + private NameableCreator[] creators; + private ToolBarDef toolbarDef; + + private UIToolbar toolBar; + // peter:这是整体的一个cardLayout Pane + protected CardLayout cardLayout; + + protected JPanel cardPane; + + public JControlPane() { + this.initComponentPane(); + } + + /** + * 生成添加按钮的NameableCreator + * + * @return 按钮的NameableCreator + */ + public abstract NameableCreator[] createNameableCreators(); + + public ShortCut4JControlPane[] getShorts() { + return shorts; + } + + public void setShorts(ShortCut4JControlPane[] shorts) { + this.shorts = shorts; + } + + public void setCreators(NameableCreator[] creators) { + this.creators = creators; + } + + public ToolBarDef getToolbarDef() { + return toolbarDef; + } + + public void setToolbarDef(ToolBarDef toolbarDef) { + this.toolbarDef = toolbarDef; + } + + public UIToolbar getToolBar() { + return toolBar; + } + + public void setToolBar(UIToolbar toolBar) { + this.toolBar = toolBar; + } + + public CardLayout getCardLayout() { + return cardLayout; + } + + public void setCardLayout(CardLayout cardLayout) { + this.cardLayout = cardLayout; + } + + public JPanel getCardPane() { + return cardPane; + } + + public void setCardPane(JPanel cardPane) { + this.cardPane = cardPane; + } + + protected void initComponentPane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.creators = this.createNameableCreators(); + this.controlUpdatePane = createControlUpdatePane(); + + // p: edit card layout + this.cardLayout = new CardLayout(); + cardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); + cardPane.setLayout(this.cardLayout); + // p:选择的Label + UILabel selectLabel = new UILabel(); + cardPane.add(selectLabel, "SELECT"); + cardPane.add(controlUpdatePane, "EDIT"); + // SplitPane + JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, getLeftPane(), cardPane); + mainSplitPane.setBorder(BorderFactory.createLineBorder(GUICoreUtils.getTitleLineBorderColor())); + mainSplitPane.setOneTouchExpandable(true); + + this.add(mainSplitPane, BorderLayout.CENTER); + mainSplitPane.setDividerLocation(getLeftPreferredSize()); + this.checkButtonEnabled(); + } + + protected abstract JPanel createControlUpdatePane(); + + protected JPanel getLeftPane() { + // LeftPane + JPanel leftPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + + initLeftPane(leftPane); + + shorts = this.createShortcuts(); + if (ArrayUtils.isEmpty(shorts)) { + return leftPane; + } + + toolbarDef = new ToolBarDef(); + for (ShortCut4JControlPane sj : shorts) { + toolbarDef.addShortCut(sj.getShortCut()); + } + toolBar = ToolBarDef.createJToolBar(); + toolbarDef.updateToolBar(toolBar); + leftPane.add(toolBar, BorderLayout.NORTH); + return leftPane; + } + + /** + * 初始化左边面板 + */ + protected void initLeftPane(JPanel leftPane) { + + } + + protected int getLeftPreferredSize() { + return shorts.length * SHORT_WIDTH; + } + + + protected ShortCut4JControlPane[] createShortcuts() { + return new ShortCut4JControlPane[]{ + addItemShortCut(), + removeItemShortCut(), + copyItemShortCut(), + moveUpItemShortCut(), + moveDownItemShortCut(), + sortItemShortCut() + }; + } + + protected abstract ShortCut4JControlPane addItemShortCut(); + + protected abstract ShortCut4JControlPane removeItemShortCut(); + + protected abstract ShortCut4JControlPane copyItemShortCut(); + + protected abstract ShortCut4JControlPane moveUpItemShortCut(); + + protected abstract ShortCut4JControlPane moveDownItemShortCut(); + + protected abstract ShortCut4JControlPane sortItemShortCut(); + + public abstract Nameable[] update(); + + + public void populate(Nameable[] nameableArray) { + } + + /** + * 检查按钮可用状态 Check button enabled. + */ + public void checkButtonEnabled() { + } + + protected void doBeforeRemove() { + } + + protected void doAfterRemove() { + } + + public NameableCreator[] creators() { + return creators == null ? new NameableCreator[0] : creators; + } + + protected abstract boolean hasInvalid(boolean isAdd); + + /** + * 刷新 NameableCreator + * + * @param creators 生成器 + */ + public void refreshNameableCreator(NameableCreator[] creators) { + this.creators = creators; + shorts = this.createShortcuts(); + toolbarDef.clearShortCuts(); + for (ShortCut4JControlPane sj : shorts) { + toolbarDef.addShortCut(sj.getShortCut()); + } + + toolbarDef.updateToolBar(toolBar); + toolBar.validate(); + toolBar.repaint(); + this.repaint(); + } +} diff --git a/designer_base/src/com/fr/design/gui/controlpane/JListControlPane.java b/designer-base/src/com/fr/design/gui/controlpane/JListControlPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/controlpane/JListControlPane.java rename to designer-base/src/com/fr/design/gui/controlpane/JListControlPane.java diff --git a/designer_base/src/com/fr/design/gui/controlpane/NameObjectCreator.java b/designer-base/src/com/fr/design/gui/controlpane/NameObjectCreator.java similarity index 100% rename from designer_base/src/com/fr/design/gui/controlpane/NameObjectCreator.java rename to designer-base/src/com/fr/design/gui/controlpane/NameObjectCreator.java diff --git a/designer-base/src/com/fr/design/gui/controlpane/NameableCreator.java b/designer-base/src/com/fr/design/gui/controlpane/NameableCreator.java new file mode 100644 index 0000000000..e667675ec3 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/controlpane/NameableCreator.java @@ -0,0 +1,29 @@ +package com.fr.design.gui.controlpane; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.ilist.ListModelElement; +import com.fr.js.JavaScript; +import com.fr.stable.Nameable; + +import javax.swing.*; + +public interface NameableCreator { + public String menuName(); + + public Icon menuIcon(); + + public String createTooltip(); + + public Nameable createNameable(UnrepeatedNameHelper helper); + + public Class getUpdatePane(); + + public Object acceptObject2Populate(Object ob); + + public void saveUpdatedBean(ListModelElement wrapper, Object bean); + + public Class getHyperlink(); + + + public boolean isNeedParameterWhenPopulateJControlPane(); +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/controlpane/NameableSelfCreator.java b/designer-base/src/com/fr/design/gui/controlpane/NameableSelfCreator.java similarity index 100% rename from designer_base/src/com/fr/design/gui/controlpane/NameableSelfCreator.java rename to designer-base/src/com/fr/design/gui/controlpane/NameableSelfCreator.java diff --git a/designer-base/src/com/fr/design/gui/controlpane/ObjectJControlPane.java b/designer-base/src/com/fr/design/gui/controlpane/ObjectJControlPane.java new file mode 100644 index 0000000000..d55dca8c69 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/controlpane/ObjectJControlPane.java @@ -0,0 +1,76 @@ +package com.fr.design.gui.controlpane; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + +import com.fr.design.beans.BasicBeanPane; + +/** + * 生成带参数的BasicBeanPane + * + * @author zhou + * @since 2012-4-5上午9:29:20 + */ +public abstract class ObjectJControlPane extends JListControlPane { + private Object object; + + public ObjectJControlPane() { + this(null); + } + + public ObjectJControlPane(Object object) { + super(); + this.object = object; + } + + @Override + protected BasicBeanPane createPaneByCreators(NameableCreator creator) { + try { + if (object == null) { + return super.createPaneByCreators(creator); + } else if (object.getClass().isArray()) { + return creator.getUpdatePane().getConstructor(object.getClass()).newInstance(object); + } else { + Constructor constructor = getConstructor(creator.getUpdatePane(), object.getClass()); + return constructor == null ? super.createPaneByCreators(creator) : constructor.newInstance(object); + } + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (IllegalArgumentException e) { + throw new RuntimeException(e); + } catch (SecurityException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + + /** + * 传进BasicBeanPane的构造函数的参数,可能是 + * + * @param clazz + * @param cls + * @return + */ + private Constructor getConstructor(Class clazz, Class cls) { + Constructor constructor = null; + try { + constructor = clazz.getConstructor(cls); + } catch (SecurityException e) { + } catch (NoSuchMethodException e) { + } + if (constructor != null) { + return constructor; + } else { + if (cls.getName() == Object.class.getName()) { + return null; + } + return getConstructor(clazz, cls.getSuperclass()); + } + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/controlpane/ObjectUIControlPane.java b/designer-base/src/com/fr/design/gui/controlpane/ObjectUIControlPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/controlpane/ObjectUIControlPane.java rename to designer-base/src/com/fr/design/gui/controlpane/ObjectUIControlPane.java diff --git a/designer-base/src/com/fr/design/gui/controlpane/ShortCut4JControlPane.java b/designer-base/src/com/fr/design/gui/controlpane/ShortCut4JControlPane.java new file mode 100644 index 0000000000..db14da614d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/controlpane/ShortCut4JControlPane.java @@ -0,0 +1,16 @@ +package com.fr.design.gui.controlpane; + +import com.fr.design.menu.ShortCut; + +public abstract class ShortCut4JControlPane { + protected ShortCut shortCut; + + public ShortCut getShortCut() { + return shortCut; + } + + /** + * 检查是否可用 + */ + public abstract void checkEnable(); +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/controlpane/UIControlPane.java b/designer-base/src/com/fr/design/gui/controlpane/UIControlPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/controlpane/UIControlPane.java rename to designer-base/src/com/fr/design/gui/controlpane/UIControlPane.java diff --git a/designer_base/src/com/fr/design/gui/controlpane/UIListControlPane.java b/designer-base/src/com/fr/design/gui/controlpane/UIListControlPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/controlpane/UIListControlPane.java rename to designer-base/src/com/fr/design/gui/controlpane/UIListControlPane.java diff --git a/designer_base/src/com/fr/design/gui/controlpane/UINameableListCellRenderer.java b/designer-base/src/com/fr/design/gui/controlpane/UINameableListCellRenderer.java similarity index 100% rename from designer_base/src/com/fr/design/gui/controlpane/UINameableListCellRenderer.java rename to designer-base/src/com/fr/design/gui/controlpane/UINameableListCellRenderer.java diff --git a/designer_base/src/com/fr/design/gui/controlpane/UnrepeatedNameHelper.java b/designer-base/src/com/fr/design/gui/controlpane/UnrepeatedNameHelper.java similarity index 100% rename from designer_base/src/com/fr/design/gui/controlpane/UnrepeatedNameHelper.java rename to designer-base/src/com/fr/design/gui/controlpane/UnrepeatedNameHelper.java diff --git a/designer-base/src/com/fr/design/gui/core/CustomWidgetOption.java b/designer-base/src/com/fr/design/gui/core/CustomWidgetOption.java new file mode 100644 index 0000000000..5cd22d6d49 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/core/CustomWidgetOption.java @@ -0,0 +1,48 @@ +package com.fr.design.gui.core; + +import javax.swing.Icon; + +import com.fr.base.FRContext; +import com.fr.form.ui.Widget; + +public class CustomWidgetOption extends WidgetOption { + private static final long serialVersionUID = -8144214820100962842L; + private String optionName; + private Icon optionIcon; + private Class widgetClass; + + public CustomWidgetOption(String optionName, Icon optionIcon, Class widgetClass) { + this.optionName = optionName; + this.optionIcon = optionIcon; + this.widgetClass = widgetClass; + } + @Override + public Widget createWidget() { + Class cls = widgetClass(); + try { + Widget ins = cls.newInstance(); + return ins ; + } catch (InstantiationException e) { + FRContext.getLogger().error(e.getMessage(), e); + } catch (IllegalAccessException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + + return null; + } + @Override + public String optionName() { + return this.optionName; + } + + @Override + public Icon optionIcon() { + return this.optionIcon; + } + + @Override + public Class widgetClass() { + return this.widgetClass; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/core/UIFurtherTabComponent.java b/designer-base/src/com/fr/design/gui/core/UIFurtherTabComponent.java new file mode 100644 index 0000000000..93b3749138 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/core/UIFurtherTabComponent.java @@ -0,0 +1,24 @@ +package com.fr.design.gui.core; + +/** + * 带render功能 + * + * @author zhou + * @since 2012-5-28下午4:27:24 + */ +public interface UIFurtherTabComponent extends UITabComponent { + + /** + * set the SelectedItem by the element + * + * @param ob + */ + public void setSelectedItem(T element); + + /** + * get the SelectedItem + * + * @return + */ + public T getSelectedItem(); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/core/UISelectedComponent.java b/designer-base/src/com/fr/design/gui/core/UISelectedComponent.java new file mode 100644 index 0000000000..439df980a5 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/core/UISelectedComponent.java @@ -0,0 +1,32 @@ +package com.fr.design.gui.core; + +import javax.swing.event.ChangeListener; + +/** + * 这个接口说明一个基本组件是可以选择的 + * + * @author zhou + * @since 2012-5-17下午4:38:17 + */ +public interface UISelectedComponent { + /** + * isSelected + * + * @return + */ + public boolean isSelected(); + + /** + * setSelected + * + * @param isSelected + */ + public void setSelected(boolean isSelected); + + /** + * the selected changed listener + * @param l + */ + void addChangeListener(ChangeListener l); + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/core/UITabComponent.java b/designer-base/src/com/fr/design/gui/core/UITabComponent.java new file mode 100644 index 0000000000..1af8e6893d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/core/UITabComponent.java @@ -0,0 +1,35 @@ +package com.fr.design.gui.core; + +import javax.swing.event.ChangeListener; + +/** + * 这个接口说明一个基本组件是类似于tabbedpane的形式 + * + * @author zhou + * @since 2012-5-17下午4:46:00 + */ +public interface UITabComponent { + /** + * 获取当前选中的tab + * + * @return + */ + public int getSelectedIndex(); + + /** + * 设置选中的tab + * + * @param newSelectedIndex + */ + public void setSelectedIndex(int newSelectedIndex); + + /** + * Adds a ChangeListener to the listener list. + */ + public void addChangeListener(ChangeListener l); + + /** + * removes a ChangeListener from the listener list. + */ + public void removeChangeListener(ChangeListener l); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/core/UserDefinedWidgetOption.java b/designer-base/src/com/fr/design/gui/core/UserDefinedWidgetOption.java new file mode 100644 index 0000000000..40490702de --- /dev/null +++ b/designer-base/src/com/fr/design/gui/core/UserDefinedWidgetOption.java @@ -0,0 +1,36 @@ +package com.fr.design.gui.core; + +import javax.swing.Icon; + +import com.fr.base.BaseUtils; +import com.fr.form.ui.NameWidget; +import com.fr.form.ui.Widget; + +public class UserDefinedWidgetOption extends WidgetOption { + + private String widgetConfigName; + + public UserDefinedWidgetOption(String name) { + this.widgetConfigName = name; + } + + @Override + public Widget createWidget() { + return new NameWidget(widgetConfigName); + } + + @Override + public Icon optionIcon() { + return BaseUtils.readIcon("/com/fr/design/images/data/user_widget.png"); + } + + @Override + public String optionName() { + return widgetConfigName; + } + + @Override + public Class widgetClass() { + return NameWidget.class; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/core/WidgetConstants.java b/designer-base/src/com/fr/design/gui/core/WidgetConstants.java new file mode 100644 index 0000000000..bf0028e3dc --- /dev/null +++ b/designer-base/src/com/fr/design/gui/core/WidgetConstants.java @@ -0,0 +1,78 @@ +package com.fr.design.gui.core; + +import com.fr.general.Inter; + +public class WidgetConstants { + + //没有控件 + public static final int NONE = -1; + + // TextEditor + public static final int TEXT = 0; + + // ComboBox + public static final int COMBOBOX = 1; + // NumberEditor + public static final int NUMBER = 2; + + // DateEditor + public static final int DATE = 3; + + public static final int COMBOCHECKBOX = 5; + + // TreeEditor + public static final int TREE = 6; + + // TreeComboBoxEditor + public static final int TREECOMBOBOX = 7; + + // ListEditor + public static final int LIST = 8; + + public static final int RADIO = 9; + + public static final int RADIOGROUP = 10; + // CheckBox + public static final int CHECKBOX = 11; + // CheckBoxGroup + public static final int CHECKBOXGROUP = 12; + + // FileEditor +// public static final int FILE = 13; +// public static final String NAME_FILE = Inter.getLocText("File"); + + public static final int BUTTON = 14; + + // TextArea & Password + public static final int TEXTAREA = 15; + + public static final int PASSWORD = 16; + + public static final int TABLETREE = 17; + + public static final int IFRAME = 18; + + public static final int MULTI_FILE = 19; + + // 默认控件 + public static final String DEFAULT_WIDGETCONFIG = Inter.getLocText("Widget-Form_Widget_Config"); + + // 报表控件,与默认控件不同,比如label,table,SEARCH等,这里是不需要的 + public static final String REPORT_WIDGETCONFIG = Inter.getLocText("Widget-Default_Widget_Config"); + + public static final String FORM_CHARTWIDGET = Inter.getLocText("Widget-Chart_Widget_Config"); + + // 表单容器控件 + public static final String FORM_WIDGETCONTAINER = Inter.getLocText("Widget-Form_Widget_Container"); + + public static final String POLY_REPORT_WIDGET = Inter.getLocText("Poly-Report_Component"); + // 服务器预定义控件 + public static final String USER_DEFINED_WIDGETCONFIG = Inter.getLocText("Widget-User_Defined_Widget_Config"); + + // 服务器组合控件 + public static final String COMB_WIDGETCONFIG = Inter.getLocText("Widget-Comb_Widget_Config"); + + // 服务器自定义控件 + public static final String CUSTOM_WIDGETCONFIG = Inter.getLocText("Widget-Custom_Widget_Config"); + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/core/WidgetOption.java b/designer-base/src/com/fr/design/gui/core/WidgetOption.java new file mode 100644 index 0000000000..1ceb1f25ff --- /dev/null +++ b/designer-base/src/com/fr/design/gui/core/WidgetOption.java @@ -0,0 +1,228 @@ +package com.fr.design.gui.core; + +import com.fr.base.BaseUtils; +import com.fr.form.ui.*; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; + +import javax.swing.*; +import java.io.Serializable; +import java.util.ArrayList; + +public abstract class WidgetOption implements Serializable { + + private static final long serialVersionUID = -5213215153654191184L; + + private static final java.util.List STATIC_WIDGET_OPTION_LIST = new java.util.ArrayList(); + + public WidgetOption() { + STATIC_WIDGET_OPTION_LIST.add(this); + } + + /** + * 名字 + * + * @return 名字 + */ + public abstract String optionName(); + + /** + * 图标 + * + * @return 图标 + */ + public abstract Icon optionIcon(); + + /** + * 类 + * + * @return 类 + */ + public abstract Class widgetClass(); + + /** + * 创建控件 + * + * @return 控件 + */ + public abstract Widget createWidget(); + + public boolean equals(Object obj) { + return obj instanceof WidgetOption && ComparatorUtils.equals(((WidgetOption) obj).optionName(), optionName()); + } + + /** + * 这个name的hashcode + * + * @return 这个name的hashcode + */ + public int hashCode() { + return optionName().hashCode(); + } + + public static WidgetOption getToolBarButton(Class cls) { + for (int i = 0, len = STATIC_WIDGET_OPTION_LIST.size(); i < len; i++) { + if (STATIC_WIDGET_OPTION_LIST.get(i).widgetClass() == cls) { + return STATIC_WIDGET_OPTION_LIST.get(i); + } + } + return null; + } + + public static String getWidgetType(Widget widget) { + WidgetOption wo = getToolBarButton(widget.getClass()); + return wo == null ? null : wo.optionName(); + } + + public static Icon getWidgetIcon(Widget widget) { + WidgetOption wo = getToolBarButton(widget.getClass()); + return wo == null ? null : wo.optionIcon(); + } + + /* + * 预定义控件 + */ + public static WidgetOption[] getPredefinedWidget() { + java.util.List list = new ArrayList(); + WidgetInfoConfig mgr = WidgetInfoConfig.getInstance(); + java.util.Iterator nameIt = mgr.getWidgetConfigNameIterator(); + while (nameIt.hasNext()) { + String name = nameIt.next(); + WidgetConfig widgetConfig = mgr.getWidgetConfig(name); + if (widgetConfig instanceof UserDefinedWidgetConfig) { + list.add(WidgetOptionFactory.createByWidgetClass(name, BaseUtils.readIcon("/com/fr/design/images/data/user_widget.png"), + ((UserDefinedWidgetConfig) widgetConfig).getWidget().getClass())); + } + } + return list.toArray(new WidgetOption[list.size()]); + } + + /* + * 应用与报表设计的控件 + */ + public static WidgetOption[] getReportWidgetInstance() { + return new WidgetOption[]{TEXTEDITOR, TEXTAREA, NUMBEREDITOR, PASSWORD, BUTTON, CHECKBOX, RADIOGROUP, CHECKBOXGROUP, COMBOBOX, + COMBOCHECKBOX, DATEEDITOR, MULTI_FILEEDITOR, LIST, IFRAMEDITOR, TREECOMBOBOX, TREE}; + } + + + /** + * 报表工具栏的控件 + * + * @return 报表工具栏控件 + */ + public static WidgetOption[] getReportParaWidgetIntance() { + return new WidgetOption[]{TEXTEDITOR, LABEL, FREEBUTTON, COMBOBOX, COMBOCHECKBOX, DATEEDITOR, + NUMBEREDITOR, TREECOMBOBOX, RADIOGROUP, CHECKBOXGROUP, TEXTAREA, PASSWORD, CHECKBOX, TREE}; + } + + /** + * 表单工具栏控件 + * + * @return 表单工具栏控件 + */ + public static WidgetOption[] getFormWidgetIntance() { + return new WidgetOption[]{TEXTEDITOR, LABEL, FREEBUTTON, COMBOBOX, COMBOCHECKBOX, DATEEDITOR, + NUMBEREDITOR, TREECOMBOBOX, RADIOGROUP, CHECKBOXGROUP, TEXTAREA, PASSWORD, CHECKBOX, TREE, MULTI_FILEEDITOR}; + } + + public static final WidgetOption DATEEDITOR = WidgetOptionFactory.createByWidgetClass(Inter.getLocText(new String[]{"Date", "Widget"}), + BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/date_16.png"), + DateEditor.class); + + public static final WidgetOption TREE = WidgetOptionFactory.createByWidgetClass(Inter.getLocText("Form-View_Tree"), + BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/tree_16.png"), TreeEditor.class); + + public static final WidgetOption TREECOMBOBOX = WidgetOptionFactory.createByWidgetClass(Inter.getLocText("FR-Designer_Tree-ComboBox"), BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/comboboxtree.png"), + TreeComboBoxEditor.class); + + public static final WidgetOption CHECKBOXGROUP = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Form-CheckBoxGroup", "Widget"}), BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/checkbox_group_16.png"), CheckBoxGroup.class); + + public static final WidgetOption RADIOGROUP = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Form-RadioGroup", "Widget"}), BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/button_group_16.png"), + RadioGroup.class); + + public static final WidgetOption NUMBEREDITOR = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Number", "Widget"}), BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/number_field_16.png"), NumberEditor.class); + + public static final WidgetOption LABEL = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Label", "Widget"}), BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/label_16.png"), + Label.class); + + public static final WidgetOption BUTTON = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Form-Button", "Widget"}), BaseUtils.readIcon("/com/fr/web/images/form/resources/button_16.png"), + Button.class); + + public static final WidgetOption FREEBUTTON = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Form-Button", "Widget"}), BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/button_16.png"), + FreeButton.class); + + public static final WidgetOption MULTI_FILEEDITOR = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"File", "Widget"}), BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/files_up.png"), + MultiFileEditor.class); + + public static final WidgetOption COMBOBOX = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Form-ComboBox", "Widget"}), BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/combo_box_16.png"), + ComboBox.class); + + public static final WidgetOption COMBOCHECKBOX = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Form-ComboCheckBox", "Widget"}), BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/combo_check_16.png"), + ComboCheckBox.class); + + public static final WidgetOption CHECKBOX = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Form-CheckBox", "Widget"}), BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/check_box_16.png"), + CheckBox.class); + + public static final WidgetOption LIST = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Form-List", "Widget"}), BaseUtils.readIcon("/com/fr/web/images/form/resources/list_16.png"), + ListEditor.class); + + public static final WidgetOption TABLETREE = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Form-TableTree", "Widget"}), BaseUtils.readIcon("/com/fr/web/images/form/resources/list_16.png"), + TableTree.class); + + public static final WidgetOption TEXTEDITOR = WidgetOptionFactory.createByWidgetClass(Inter.getLocText(new String[]{"Text", "Widget"}) + , BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/text_field_16.png"), + TextEditor.class); + + public static final WidgetOption TEXTAREA = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Form-TextArea", "Widget"}), BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/text_area_16.png"), + TextArea.class); + + public static final WidgetOption PASSWORD = WidgetOptionFactory.createByWidgetClass( + Inter.getLocText(new String[]{"Form-Password", "Widget"}), + BaseUtils.readIcon("/com/fr/design/images/buttonicon/widget/password_field_16.png"), Password.class); + + public static final WidgetOption IFRAMEDITOR = WidgetOptionFactory.createByWidgetClass(Inter.getLocText("FR-Designer_Form-Iframe"), BaseUtils.readIcon("/com/fr/web/images/form/resources/iframe_16.png"), + IframeEditor.class); + +// public static final WidgetOption DATATABLE = WidgetOptionFactory.createByWidgetClass(Inter +// .getLocText("Form-DataTable"), BaseUtils.readIcon("/com/fr/web/images/form/resources/table_16.png"), +// DataTable.class); + +// public static final WidgetOption CHARTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter.getLocText("Chart") +// + Inter.getLocText("Widget"), ChartEditor.class); + + +// public static final WidgetOption ABSOLUTELAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter +// .getLocText("AbsoluteLayout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/layout_absolute.png"), +// WAbsoluteLayout.class); +// +// public static final WidgetOption BORDERLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter +// .getLocText("BorderLayout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/layout_border.png"), +// WBorderLayout.class); +// +// public static final WidgetOption CARDLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter +// .getLocText("CardLayout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/card_layout_16.png"), +// WCardLayout.class); +// +// public static final WidgetOption HORIZONTALBOXLAYOUTCONTAINER = WidgetOptionFactory.createByWidgetClass(Inter +// .getLocText("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("VerticalBoxLayout"), BaseUtils.readIcon("/com/fr/web/images/form/resources/boxlayout_v_16.png"), +// WVerticalBoxLayout.class); + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/core/WidgetOptionFactory.java b/designer-base/src/com/fr/design/gui/core/WidgetOptionFactory.java new file mode 100644 index 0000000000..0266d9eb97 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/core/WidgetOptionFactory.java @@ -0,0 +1,17 @@ +package com.fr.design.gui.core; + +import com.fr.base.BaseUtils; +import com.fr.form.ui.Widget; + +import javax.swing.*; + +public class WidgetOptionFactory { + + public static WidgetOption createByWidgetClass(String optionName, Class widgetClass) { + return new CustomWidgetOption(optionName, BaseUtils.readIcon("/com/fr/design/images/data/user_widget.png"), widgetClass); + } + + public static WidgetOption createByWidgetClass(String optionName, Icon optionIcon, Class widgetClass) { + return new CustomWidgetOption(optionName, optionIcon, widgetClass); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/date/CalendarNumberField.java b/designer-base/src/com/fr/design/gui/date/CalendarNumberField.java new file mode 100644 index 0000000000..65a63aeed7 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/date/CalendarNumberField.java @@ -0,0 +1,108 @@ +package com.fr.design.gui.date; + +import com.fr.design.gui.itextfield.UINumberField; +import com.fr.general.Inter; + +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.PlainDocument; +import java.awt.*; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; + +/** + * Created with IntelliJ IDEA. + * User: 小灰灰 + * Date: 13-9-30 + * Time: 上午11:06 + * To change this template use File | Settings | File Templates. + */ +public class CalendarNumberField extends UINumberField { + + private static final int NUM_TEN = 10; + + public CalendarNumberField( double maxValue) { + super(2, 0, 0, maxValue); + this.setBorderPainted(false); + addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + setValue(getIntValue()); + } + }); + this.setFont(new Font(Inter.getLocText("Song_TypeFace"),0,12)); + } + + public void setValue(int value) { + if (value < 0) { + value = (int)getMaxValue(); + } + if (value > getMaxValue()) { + value = 0; + } + this.setText(getValueText(value)); + } + + public int getIntValue () { + if (this.getText().length() == 0) { + return 0; + } + return Integer.parseInt(getText()); + } + + private String getValueText(int value) { + String str; + if (value < NUM_TEN) { + str = "0" + value; + } else { + str = Integer.toString(value); + } + return str; + } + + + + public void setFieldDocument(){ + setDocument(new NumberDocument()); + } + + class NumberDocument extends PlainDocument { + public NumberDocument() { + } + + public void insertString(int offset, String s, AttributeSet a) throws BadLocationException { + String str = getText(0, getLength()); + + if (!s.matches("^[0-9]+$")) { + Toolkit.getDefaultToolkit().beep(); + return; + } + + String strNew = str.substring(0, offset) + s + str.substring(offset, getLength()); + + if (isOverMaxOrMinValue(strNew)) { + Toolkit.getDefaultToolkit().beep(); + return; + } + + setisContentChanged(true); + super.insertString(offset, s, a); + } + + private boolean isOverMaxOrMinValue( String strNew) { + return (Double.parseDouble(strNew)getMaxValue()); + } + } + + public Dimension getPreferredSize() { + return new Dimension(24, 11); + } + public boolean shouldResponseChangeListener() { + return false; + } + + public Insets getInsets() { + return new Insets(0, 6, 0, 4); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/date/JDateDocument.java b/designer-base/src/com/fr/design/gui/date/JDateDocument.java new file mode 100644 index 0000000000..00606c619b --- /dev/null +++ b/designer-base/src/com/fr/design/gui/date/JDateDocument.java @@ -0,0 +1,329 @@ +package com.fr.design.gui.date; + +import java.awt.Toolkit; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.JTextComponent; +import javax.swing.text.PlainDocument; + +/** + */ +public class JDateDocument extends PlainDocument{ + private JTextComponent textComponent; //日期输入文本框 + private SimpleDateFormat dateFormat; + + /****************************************************************** + ** 函数名称:JDateDocument + ** 功能描述:设置此文本框显示的默认值、格式限制和当前日期 + ** 入口参数: + ** tc : JTextComponent类型,当前操作的文本框 + ** dateFormat : SimpleDateFormat类型,当前操作文本框的格式限制 + ** initDateTime : String类型,当前日期 + ** 返回值:无 + ** 调用者:类JDateDocument + *******************************************************************/ + public JDateDocument(JTextComponent tc, SimpleDateFormat dateFormat) throws + UnsupportedOperationException{ + //当前日期构造 + this(tc, dateFormat, getCurrentDate(dateFormat)); + } + + public JDateDocument(JTextComponent tc, + SimpleDateFormat dateFormat, + String initDateTime) throws + UnsupportedOperationException{ + //设置当前日期格式 + setDateFormat(dateFormat); + //保存操作的文本框 + textComponent = tc; + //设置显示为当前日期,同时完成显示的格式化 + try{ + insertString(0, initDateTime, null); + } catch(BadLocationException ex){ + throw new UnsupportedOperationException(ex.getMessage()); + } + } + + /** + * 设置当前日期格式 + * @param dateFormat SimpleDateFormat + */ + public void setDateFormat(SimpleDateFormat dateFormat){ + this.dateFormat = dateFormat; + } + + /** + * 取得当前日期格式 + * @return SimpleDateFormat + */ + public SimpleDateFormat getDateFormat(){ + return dateFormat; + } + + /** + * 取得当前系统日时 + * @return String + */ + public static String getCurrentDate(SimpleDateFormat smFormat){ + return smFormat.format(new Date()); + } + + /****************************************************************** + ** 函数名称:public void insertString(int offset, String s, + ** AttributeSet attributeSet) throws BadLocationException + ** 功能描述:重载原方法,限制用户插入格式为日期格式 + ** 入口参数:offset: int型,插入位置 + ** s: String型,插入字符串 + ** attributeSet: AttributeSet型,属性集 + ** 返回值:无 + ** 调用者:类JDateDocument + *******************************************************************/ + public void insertString(int offset, String s, + AttributeSet attributeSet) throws BadLocationException{ + String toTest; //用于测试输入合法性的字符串 + //判断插入字符串长度 + if(s.length() == 1){ + //长度为1 + try{ + //限制输入为整数 + Integer.parseInt(s); + } catch(Exception ex){ + //错误则提示并返回 + Toolkit.getDefaultToolkit().beep(); + return; + } + //取得原始插入位置 + int newOffset = offset; + //如果插入位置为"/"," ","-"符号的前面,则移动到其后面插入(改变newOffset的值) + if(offset == 4 || offset == 7 || + offset == 10 || offset == 13 || + offset == 16){ + newOffset++; + textComponent.setCaretPosition(newOffset); + } + //如果插入位置为最后,则不插入 + if(offset == dateFormat.toPattern().length()){ + return; + } + //取得显示的时间,处理后得到要显示的字符串 + toTest = textComponent.getText(); + toTest = toTest.substring(0, newOffset) + s + + toTest.substring(newOffset + 1); + //如果要显示的字符串合法,则显示,否则给出提示并退出 + boolean isValid = isValidDate(toTest); + if(!isValid){ + Toolkit.getDefaultToolkit().beep(); + return; + } + //插入字符串 + super.remove(newOffset, 1); + super.insertString(newOffset, s, attributeSet); + } + //如果插入长度10 + else if(s.length() == 10 || s.length() == 19){ + //合法则显示,否则给出提示退出 + if(!isValidDate(s)){ + Toolkit.getDefaultToolkit().beep(); + return; + } + //插入字符串 + super.remove(0, getLength()); + super.insertString(0, s, attributeSet); + } + } + + /********************************************************************************** + ** 函数名称:public void remove(int offset, int length) throws BadLocationException + ** 功能描述:重载原方法,删除合适位置的字符串 + ** 入口参数:offset: int型,插入位置 + ** length: int型,删除长度 + ** 返回值:无 + ** 调用者:insertString(int, String,AttributeSet) + ***********************************************************************************/ + public void remove(int offset, int length) throws BadLocationException{ + //如果插入位置在"-"前,则回退一个光标位置 + //yyyy-MM-dd HH:mm:ss + if(offset == 4 || offset == 7 || + offset == 10 || offset == 13 || + offset == 16) + textComponent.setCaretPosition(offset - 1); + else + textComponent.setCaretPosition(offset); + } + + /********************************************************************************** + ** 函数名称:public boolean isLegalDate(String strDate) + ** 功能描述:判断插入的长度为10的字符串是否合法 + ** 入口参数:intY: int型,年的值 + ** intM: int型,月的值 + ** intD: int型,日的值 + ** 返回值:boolean型,真,表示是合法的,假,表示不合法 + ** 调用者:insertString(int, String,AttributeSet) + ***********************************************************************************/ + private boolean isValidDate(String strDate){ + int intY, intM, intD; //年,月,日,时,分,秒的值 + int intH = 0, intMi = 0, intS = 0; + int iCaretPosition; //光标位置 + int iPatternLen = getDateFormat().toPattern().length(); + //获取字符串 + if(strDate == null){ + return false; + } + strDate = strDate.trim(); + //如果为空,长度不对,则为非法,返回false + if(strDate.length() != iPatternLen){ + return false; + } + //如果是全角字符,则返回false + for(int i = 0; i < 10; i++){ + if(((int)strDate.charAt(i)) > 255){ + return false; + } + } + //取年,月,日的值 + try{ + intY = Integer.parseInt(strDate.substring(0, 4)); + intM = Integer.parseInt(strDate.substring(5, 7)); + intD = Integer.parseInt(strDate.substring(8, 10)); + } catch(Exception e){ + //失败则返回false + return false; + } +// System.err.println("int:intY="+intY+",intM="+intM+",intD="+intD); + iCaretPosition = textComponent.getCaretPosition(); + boolean isValid = true; + + //月越界 + if(intM > 12 || intM < 1){ + intM = Math.min(12, Math.max(1, intM)); + isValid = false; + } + //根据月份,判断日期输入,如越界,则修改 + if(intD < 1){ + intD = 1; + isValid = false; + } + switch(intM){ + case 4: + case 6: + case 9: + case 11: //最大天数为30天 + + //如果输入大于30,则修改为30 + if(intD > 30){ + intD = 30; + isValid = false; + } + break; + case 2: //2月份 + + //区别闰年 + if((intY % 4 == 0 && intY % 100 != 0) || intY % 400 == 0){ + //如果输入大于29,则修改为29 + if(intD > 29){ + intD = 29; + isValid = false; + } + } else{ + //如果输入大于28,则修改为28 + if(intD > 28){ + intD = 28; + isValid = false; + } + } + break; + default: //最大天数为31天 + + //如果输入大于31,则修改为31 + if(intD > 31){ + intD = 31; + isValid = false; + } + } +// System.err.println("out:intY="+intY+",intM="+intM+",intD="+intD); + + //yyyy-MM-dd HH:mm:ss + if(iPatternLen > 10){ + try{ + intH = Integer.parseInt(strDate.substring(11, 13)); + intMi = Integer.parseInt(strDate.substring(14, 16)); + intS = Integer.parseInt(strDate.substring(17)); + } catch(Exception e){ + return false; + } + //时越界 + if(intH > 23 || intH < 0){ + intH = Math.min(23, Math.max(0, intH)); + isValid = false; + } + //分越界 + if(intMi > 59 || intMi < 0){ + intMi = Math.min(59, Math.max(0, intMi)); + isValid = false; + } + //秒越界 + if(intS > 59 || intS < 0){ + intS = Math.min(59, Math.max(0, intS)); + isValid = false; + } + } + if(!isValid){ + textComponent.setText(toDateString(intY, intM, intD, intH, intMi, + intS)); + textComponent.setCaretPosition(iCaretPosition + 1); + } + return isValid; + } + + private String toDateString(int y, int m, int d, int h, int mi, int s){ + m = Math.max(1, Math.min(12, m)); + //最大天数为31天 + d = Math.max(1, Math.min(31, d)); + switch(m){ + case 4: + case 6: + case 9: + case 11: + d = Math.min(30, d); //最大天数为30天 + break; + case 2: + + //润年 + if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0){ + d = Math.min(29, d); //最大天数为29天 + } else{ + d = Math.min(28, d); //最大天数为28天 + } + break; + } + h = Math.max(1, Math.min(24, h)); + mi = Math.max(1, Math.min(59, mi)); + s = Math.max(1, Math.min(59, s)); + + String strPattern = getDateFormat().toPattern(); + String strY = rPad0(4, "" + y); + String strM = rPad0(2, "" + m); + String strD = rPad0(2, "" + d); + + String strDate; + strDate = strY + strPattern.substring(4, 5) + + strM + strPattern.substring(7, 8) + strD; + if(strPattern.length() == 19){ + strDate += strPattern.substring(10, 11) + + rPad0(2, "" + h) + strPattern.substring(13, 14) + + rPad0(2, "" + mi) + strPattern.substring(16, 17) + + rPad0(2, "" + s); + } + return strDate; + } + + private String rPad0(int maxLen, String str){ + if(str.length() < maxLen){ + str = "0" + str; + } + return str; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/date/SingleObjectComboBoxModel.java b/designer-base/src/com/fr/design/gui/date/SingleObjectComboBoxModel.java new file mode 100644 index 0000000000..193fe64196 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/date/SingleObjectComboBoxModel.java @@ -0,0 +1,72 @@ +package com.fr.design.gui.date; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.swing.AbstractListModel; +import javax.swing.ComboBoxModel; + +import com.fr.base.FRContext; + +public class SingleObjectComboBoxModel extends AbstractListModel implements ComboBoxModel { + private SimpleDateFormat dateFormat; + private String selectedDate = ""; + + public SingleObjectComboBoxModel() { + } + + public SingleObjectComboBoxModel(SimpleDateFormat dateFormat) { + setDateFormat(dateFormat); + } + + public void setDateFormat(SimpleDateFormat dateFormat) { + this.dateFormat = dateFormat; + } + + public SimpleDateFormat getDateFormat() { + return dateFormat; + } + + public void setSelectedItem(Object anItem) { + if (anItem == null) { + return; + } + if (anItem instanceof Date) { + try { + selectedDate = this.dateFormat.format((Date) anItem); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + } else { + try { + String strDate = anItem.toString().trim(); + if (strDate.length() != 10 && strDate.length() != 19) { + return; + } + String pattern = dateFormat.toPattern(); + if (strDate.length() == 10 && pattern.length() == 19) { + strDate = strDate + selectedDate.substring(10); + } + dateFormat.parse(strDate); + selectedDate = strDate; + } catch (Exception ex) { + throw new UnsupportedOperationException( + "Invalid datetime: string [" + anItem + + "], format is [" + dateFormat.toPattern() + "]. "); + } + } + fireContentsChanged(this, -1, -1); + } + + public Object getSelectedItem() { + return selectedDate; + } + + public Object getElementAt(int index) { + return selectedDate; + } + + public int getSize() { + return 1; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/date/UICalendarPanel.java b/designer-base/src/com/fr/design/gui/date/UICalendarPanel.java new file mode 100644 index 0000000000..36172b9dc6 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/date/UICalendarPanel.java @@ -0,0 +1,772 @@ +package com.fr.design.gui.date; + +import com.fr.base.BaseUtils; +import com.fr.base.background.GradientBackground; +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.utils.gui.GUIPaintUtils; +import com.fr.general.Inter; +import com.fr.stable.Constants; +import com.fr.stable.StringUtils; + +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import javax.swing.UIManager; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.EventListenerList; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.geom.RoundRectangle2D; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +public class UICalendarPanel extends JPanel { + private static final Font FONT_SONG = new Font(Inter.getLocText("Song_TypeFace"),0,12); + private static final Font FONT_BLACK = new Font(Inter.getLocText("Black_Font"),0,12); + private static final int WEEKDAY_COUNT = 7; + private static final int TOTAL_DAYS_COUNT = 42; + + protected Color selectedBackground; + protected Color selectedForeground; + protected Color background; + protected Color foreground; + + private Calendar calendar = null; + private UILabel monthLabel = null; + private DayPane days = null; + private HMSPane hms = null; + private MouseListener dayBttListener = null; + private boolean isSupportDateChangeListener = false; + private java.util.Date selectedDate = null; + private boolean isTimePicker; + /** + * 年月格式 + */ + final SimpleDateFormat monthFormat + = new SimpleDateFormat("yyyy-MM"); + + public UICalendarPanel() { + this(new Date(), false); + } + + public UICalendarPanel(boolean isTimerPicker) { + this(new Date(), isTimerPicker); + } + + public UICalendarPanel(Date selectedDate, boolean isTimerPicker) { + + this.selectedDate = selectedDate; + this.isTimePicker = isTimerPicker; + calendar = Calendar.getInstance(); + + selectedBackground = UIManager.getColor( + "ComboBox.selectionBackground"); + selectedForeground = UIManager.getColor( + "ComboBox.selectionForeground"); + background = UIManager.getColor("ComboBox.background"); + foreground = UIManager.getColor("ComboBox.foreground"); + + dayBttListener = createDayBttListener(); + + //renderer this + setPreferredSize(new Dimension(218, 179)); + setBackground(new Color(0xFFFFFF)); + setBorder(BorderFactory.createLineBorder(new Color(0x959595))); + + setLayout(FRGUIPaneFactory.createBorderLayout()); + add(BorderLayout.NORTH, createNorthPane()); + add(BorderLayout.CENTER, createCenterPane()); + if (isTimerPicker) { + setPreferredSize(new Dimension(218, 209)); + add(BorderLayout.SOUTH, createSouthPane()); + updateHMS(); + } + } + + // << < yyyy/MM/dd > >> + private JPanel createNorthPane () { + JPanel pNorth = FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); + pNorth.setBackground(new Color(0xFFFFFF)); + pNorth.setPreferredSize(new Dimension(1, 22)); + + pNorth.add(Box.createHorizontalStrut(5)); + pNorth.add(createSkipButton(Calendar.YEAR, -1 , new Icon[] { + BaseUtils.readIcon("/com/fr/design/images/calender/year_reduce.png"), + BaseUtils.readIcon("/com/fr/design/images/calender/year_reduce_hover.png"), + BaseUtils.readIcon("/com/fr/design/images/calender/year_reduce_click.png") + })); + pNorth.add(Box.createHorizontalStrut(11)); + UILabel monthMinus = createSkipButton(Calendar.MONTH, -1, new Icon[]{ + BaseUtils.readIcon("/com/fr/design/images/calender/month_reduce.png"), + BaseUtils.readIcon("/com/fr/design/images/calender/month_reduce_hover.png"), + BaseUtils.readIcon("/com/fr/design/images/calender/month_reduce_click.png") + }); + monthMinus.setPreferredSize(new Dimension(20, 20)); + pNorth.add(monthMinus); + monthLabel = new UILabel("", UILabel.CENTER); + monthLabel.setBackground(new Color(0xFFFFFF)); + monthLabel.setForeground(new Color(0x000000)); + monthLabel.setFont(FONT_SONG); + pNorth.add(Box.createHorizontalGlue()); + pNorth.add(monthLabel); + pNorth.add(Box.createHorizontalGlue()); + + UILabel monthPlus = createSkipButton(Calendar.MONTH, 1, new Icon[]{ + BaseUtils.readIcon("/com/fr/design/images/calender/month_add.png"), + BaseUtils.readIcon("/com/fr/design/images/calender/month_add_hover.png"), + BaseUtils.readIcon("/com/fr/design/images/calender/month_add_click.png") + }); + monthPlus.setPreferredSize(new Dimension(20, 20)); + monthPlus.setHorizontalAlignment(SwingConstants.RIGHT); + pNorth.add(monthPlus); + pNorth.add(Box.createHorizontalStrut(11)); + pNorth.add(createSkipButton(Calendar.YEAR, 1 , new Icon[] { + BaseUtils.readIcon("/com/fr/design/images/calender/year_add.png"), + BaseUtils.readIcon("/com/fr/design/images/calender/year_add_hover.png"), + BaseUtils.readIcon("/com/fr/design/images/calender/year_add_click.png") + })); + pNorth.add(Box.createHorizontalStrut(5)); + + return pNorth; + } + + + private JPanel createCenterPane() { + //星期日 星期一 星期二 星期三 星期四 星期五 星期六 + JPanel pWeeks = new JPanel(new GridLayout(1, 7, 1, 0)); + pWeeks.setPreferredSize(new Dimension(216, 22)); + pWeeks.setBackground(new Color(0xFFFFFF)); + pWeeks.setOpaque(true); + String[] strWeeks = new String[] {StringUtils.EMPTY, Inter.getLocText("Sun"), Inter.getLocText("Mon"), + Inter.getLocText("Tue"),Inter.getLocText("Wed"),Inter.getLocText("Thu"), + Inter.getLocText("Fri"),Inter.getLocText("Sat") + }; + for (int i = 1; i <= WEEKDAY_COUNT; i++) { + UILabel label = new UILabel(); + label.setHorizontalAlignment(UILabel.CENTER); + label.setForeground(new Color(0x4D4C4C)); + label.setFont(FONT_BLACK); + label.setText(strWeeks[i]); + pWeeks.add(label); + } + + //中间放日期的面板 + days = new DayPane(); + days.setOpaque(true); + days.setPreferredSize(new Dimension(216, 115)); + JPanel pCenter = FRGUIPaneFactory.createBorderLayout_S_Pane(); + pCenter.setOpaque(true); + pCenter.add(pWeeks, BorderLayout.NORTH); + pCenter.add(days, BorderLayout.CENTER); + + //显示今天的日期,直接单击图标跳到今天 + GradientPane pToday = new GradientPane(new GradientBackground(new Color(0x097BDA), new Color(0x40A3EE), GradientBackground.TOP2BOTTOM), false); + pToday.setPreferredSize(new Dimension(216, 18)); + pToday.setLayout(new BorderLayout()); + UIDayLabel lbToday = new UIDayLabel(new Date(), false); + lbToday.setForeground(new Color(0x000000)); + lbToday.addMouseListener(createTodayListener(pToday, lbToday)); + pToday.setBackground(new Color(0xF0F0F0)); + pToday.add(lbToday, BorderLayout.CENTER); + pCenter.add(pToday, BorderLayout.SOUTH); + + return pCenter; + } + + private JPanel createSouthPane () { + JPanel sPane = new JPanel(); + sPane.setPreferredSize(new Dimension(216, 30)); + sPane.setBackground(Color.WHITE); + sPane.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 6)); + UILabel timeLabel = new UILabel(Inter.getLocText("Time") + ":"); + timeLabel.setBorder(BorderFactory.createEmptyBorder(0,9,0,5)); + timeLabel.setFont(FONT_SONG); + sPane.add(timeLabel); + hms = new HMSPane(); + sPane.add(hms); + + UILabel gap = new UILabel(); + gap.setPreferredSize(new Dimension(26,1)); + sPane.add(gap); + + UIButton okButton = new UIButton(Inter.getLocText("OK")) { + public Dimension getPreferredSize() { + return new Dimension(32,18); + } + + public Insets getInsets() { + return new Insets(0, 0, 0, 0); + } + }; + okButton.setFont(FONT_SONG); + okButton.setVerticalAlignment(SwingConstants.CENTER); + okButton.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + hms.update(UICalendarPanel.this.calendar); + UICalendarPanel.this.selectedDate = UICalendarPanel.this.calendar.getTime(); + fireDateChanged(new ChangeEvent(UICalendarPanel.this.selectedDate)); + } + }); + + sPane.add(okButton); + + return sPane; + } + + public void resetHMSPaneSelectedNumberField() { + if (this.hms != null) { + this.hms.selectedNumberField = this.hms.hField; + this.hms.nextButton.requestFocus(); + } + } + + /** + * 创建上一月,下一月,上一年,下一年"按钮" + * @param field int + * @param amount int + * @return UILabel + */ + protected UILabel createSkipButton(final int field, final int amount,final Icon[] icons) { + if (icons.length != 3) { + return new UILabel(); + } + UILabel label = new UILabel(); + label.setIcon(icons[0]); + label.setRequestFocusEnabled(false); + label.addMouseListener(createSkipListener(label, field, amount, icons)); + return label; + } + + protected MouseListener createSkipListener(final UILabel label, final int field, + final int amount, final Icon[] icons) { + return new MouseAdapter() { + public void mouseReleased(MouseEvent e) { + label.setIcon(icons[1]); + calendar.add(field, amount); + updateDays(); + resetHMSPaneSelectedNumberField(); + } + + public void mouseEntered(MouseEvent e) { + label.setIcon(icons[1]); + } + + public void mouseExited(MouseEvent e) { + label.setIcon(icons[0]); + } + + public void mousePressed(MouseEvent e) { + label.setIcon(icons[2]); + } + }; + } + + /** + * 更新日期 + */ + protected void updateDays() { + //更新月份 + monthLabel.setText(monthFormat.format(calendar.getTime())); + days.removeAll(); + days.setFloatIndex(-1); + Calendar selectedCalendar = Calendar.getInstance(); + selectedCalendar.setTime(selectedDate); + Calendar setupCalendar = (Calendar) calendar.clone(); + setupCalendar.set(Calendar.DAY_OF_MONTH, 1); + int first = setupCalendar.get(Calendar.DAY_OF_WEEK); + setupCalendar.add(Calendar.DATE, -first); + + boolean isCurrentMonth = false; + for (int i = 0; i < TOTAL_DAYS_COUNT; i++) { + setupCalendar.add(Calendar.DATE, 1); + GradientPane gp = new GradientPane(new GradientBackground(new Color(0xFEFEFE), new Color(0xF3F2F3), GradientBackground.TOP2BOTTOM), true); + gp.setIndex(i); + gp.setLayout(new BorderLayout()); + gp.setBorder(null); + UIDayLabel label = new UIDayLabel(setupCalendar.getTime()); + label.setHorizontalAlignment(SwingConstants.RIGHT); + label.setBorder(BorderFactory.createEmptyBorder(0,0,0,9)); + label.addMouseListener(dayBttListener); + if ("1".equals(label.getText())) { + isCurrentMonth = !isCurrentMonth; + } + label.setEnabled(isCurrentMonth); + if (!isCurrentMonth) { + label.setForeground(new Color(0x6F6F6)); + } + //当前选择的日期 + if (setupCalendar.get(Calendar.DAY_OF_MONTH) == selectedCalendar.get(Calendar.DAY_OF_MONTH) && isCurrentMonth) { + gp.setGradientBackground(new GradientBackground(new Color(0x097BD9), new Color(0x41A3EE), GradientBackground.TOP2BOTTOM)); + gp.add(label, BorderLayout.CENTER); + days.add(gp); + days.setSelectedIndex(i); + this.selectedDate = label.getDate(); + this.calendar.setTime(this.selectedDate); + }else { + gp.add(label, BorderLayout.CENTER); + days.add(gp); + } + } + days.validate(); + } + + public void updateHMS() { + if (hms != null){ + hms.populate(this.calendar); + hms.validate(); + } + } + + protected MouseListener createTodayListener(final GradientPane jp, final UIDayLabel label) { + return new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + jp.setBorder(BorderFactory.createLineBorder(new Color(0x3868AA))); + jp.setPaintGradientBackground(true); + jp.repaint(); + label.setForeground(new Color(0xFFFFFF)); + } + + @Override + public void mouseExited(MouseEvent e) { + jp.setBackground(new Color(0xF0F0F0)); + } + + @Override + public void mouseEntered(MouseEvent e) { + jp.setBackground(new Color(0xC8DDEE)); + } + + @Override + public void mouseReleased(MouseEvent e) { + jp.setBackground(new Color(0xF0F0F0)); + label.setForeground(new Color(0x000000)); + jp.setBorder(null); + jp.setPaintGradientBackground(false); + jp.repaint(); + if (isTimePicker) { + UICalendarPanel.this.setSelectedDate(label.getDate()); + updateDays(); + } else { + UICalendarPanel.this.isSupportDateChangeListener = true; + UICalendarPanel.this.setSelectedDate(label.getDate()); + UICalendarPanel.this.isSupportDateChangeListener = false; + } + resetHMSPaneSelectedNumberField(); + } + }; + } + + protected MouseListener createDayBttListener() { + return new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if (isEnabled()) { + UIDayLabel com = (UIDayLabel) e.getComponent(); + GradientPane gp = (GradientPane)com.getParent(); + if (days.selectedIndex != -1) { + ((GradientPane)days.getComponent(days.selectedIndex)).setGradientBackground(new GradientBackground(new Color(0xFEFEFE), new Color(0xF3F2F3), GradientBackground.TOP2BOTTOM)); + } + gp.setGradientBackground(new GradientBackground(new Color(0x097BD9), new Color(0x41A3EE), GradientBackground.TOP2BOTTOM)); + days.setSelectedIndex(gp.getIndex()); + } + } + + + public void mouseReleased(MouseEvent e) { + UIDayLabel com = (UIDayLabel) e.getComponent(); + if (isTimePicker) { + UICalendarPanel.this.setSelectedDate(com.getDate()); + } else { + UICalendarPanel.this.isSupportDateChangeListener = true; + UICalendarPanel.this.setSelectedDate(com.getDate()); + UICalendarPanel.this.isSupportDateChangeListener = false; + } + resetHMSPaneSelectedNumberField(); + } + + public void mouseEntered(MouseEvent e) { + if (isEnabled()) { + JComponent com = (JComponent) e.getComponent(); + GradientPane gp = (GradientPane)com.getParent(); + if (gp.getIndex() == days.selectedIndex) { + return; + } + gp.setGradientBackground(new GradientBackground(new Color(0xFFFFFF), new Color(0xEAF4FC), GradientBackground.TOP2BOTTOM)); + days.setFloatIndex(gp.getIndex()); + } + + } + + public void mouseExited(MouseEvent e) { + if (isEnabled()) { + JComponent com = (JComponent) e.getComponent(); + GradientPane gp = (GradientPane)com.getParent(); + if (gp.getIndex() != days.selectedIndex) { + gp.setGradientBackground(new GradientBackground(new Color(0xFEFEFE), new Color(0xF3F2F3), GradientBackground.TOP2BOTTOM)); + } + days.setFloatIndex(-1); + days.repaint(); + } + } + }; + } + + protected EventListenerList listenerList = new EventListenerList(); + + public void addDateChangeListener(ChangeListener l) { + listenerList.add(ChangeListener.class, l); + } + + public void removeDateChangeListener(ChangeListener l) { + listenerList.remove(ChangeListener.class, l); + } + + protected void fireDateChanged(ChangeEvent e) { + Object[] listeners = listenerList.getListenerList(); + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener) listeners[i + 1]).stateChanged(e); + } + } + } + + public void setSelectedDate(Date selectedDate) { + this.selectedDate = selectedDate; + this.calendar.setTime(selectedDate); + updateDays(); + if (isSupportDateChangeListener) { + fireDateChanged(new ChangeEvent(selectedDate)); + } + } + + public void setSelectedHMS() { + hms.update(this.calendar); + } + + public Date getSelectedDate() { + return selectedDate; + } + + private class GradientPane extends JPanel { + + private int index; + private boolean isGradientBackground; + private GradientBackground gradientBackground; + + public GradientPane() { + + } + + public GradientPane(GradientBackground gradientBackground, boolean isGradientBackground) { + super(); + this.gradientBackground = gradientBackground; + this.isGradientBackground = isGradientBackground; + } + + public void paint(Graphics g){ + super.paint(g); + if (isGradientBackground && gradientBackground != null) { + gradientBackground.paint(g, new Rectangle(this.getWidth(), this.getHeight())); + } + paintChildren(g); + } + + public void setPaintGradientBackground(boolean flag) { + this.isGradientBackground = flag; + } + + public void setGradientBackground(GradientBackground gradientBackground) { + this.gradientBackground = gradientBackground; + } + + public void setIndex(int i) { + this.index = i; + } + + public int getIndex () { + return this.index; + } + + public void setForeground(Color c) { + super.setForeground(c); + if (getComponentCount() > 0) { + getComponent(0).setForeground(c); + } + } + } + + private class DayPane extends JPanel { + private Color floatColor = new Color(0xC5E2F9); + private Color selectedColor = new Color(0x41A3EE); + private int floateIndex; + private int selectedIndex; + + public DayPane() { + floateIndex = -1; + selectedIndex = -1; + this.setLayout(new GridLayout(6,7,1,1)); + this.setBackground(new Color(0xFFFFFF)); + this.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, new Color(0xDADADA))); + } + + public void paint (Graphics g) { + super.paint(g); + int width = 31; + int height = 19; + Color oldColor = g.getColor(); + g.setColor(new Color(0xDADADA)); + int start_x = 30; + int start_y = 19; + for (int i = 0; i < 6; i ++) { + g.drawLine(start_x, 0, start_x, getHeight()); + start_x += width; + } + for (int i = 0; i < 5; i ++){ + g.drawLine(0, start_y, getWidth(), start_y); + start_y += height; + } + + if (floateIndex > -1) { + g.setColor(floatColor); + paintChindPane(g, floateIndex); + } + if (selectedIndex > -1) { + g.setColor(selectedColor); + paintChindPane(g,selectedIndex); + } + g.setColor(oldColor); + } + + private void paintChindPane(Graphics g, int index) { + if (index%7 == 0 ) { + int y1 = index/7*19; + g.drawLine(0,y1,30,y1); + g.drawLine(0,y1 + 19, 30, y1 +19); + g.drawLine(30, y1, 30 ,y1 + 19); + }else if (index%7 == 6) { + int y1 = index/7*19; + g.drawLine(185,y1,216,y1); + g.drawLine(185,y1 + 19, 216, y1 +19); + g.drawLine(185, y1, 185 ,y1 + 19); + } else { + int x1 = index%7*31 -1; + int y1 = index/7*19; + g.drawRect(x1, y1, 31, 19); + } + } + + public void setFloatIndex(int index) { + this.floateIndex = index; + repaint(); + } + + public void setSelectedIndex(int index) { + if (this.selectedIndex != -1 && this.selectedIndex < getComponentCount()) { + this.getComponent(selectedIndex).setForeground(Color.black); + } + if (index != -1 && index < getComponentCount()) { + this.getComponent(index).setForeground(Color.WHITE); + } + this.selectedIndex = index; + repaint(); + } + + } + + private class HMSPane extends JPanel{ + private boolean isRolOver; + private UIButton preButton; + private UIButton nextButton; + private CalendarNumberField hField; + private CalendarNumberField mField; + private CalendarNumberField sField; + private CalendarNumberField selectedNumberField; + + public HMSPane () { + this.setPreferredSize(new Dimension(101, 18)); + this.setLayout(new BorderLayout(0, 0)); + this.setBackground(null); + + initComponents(); + initListener(); + + this.addMouseListener(new MouseAdapter() { + @Override + public void mouseExited(MouseEvent e) { + isRolOver = false; + repaint(); + } + + @Override + public void mouseEntered(MouseEvent e) { + isRolOver = true; + repaint(); + } + }); + + } + + private void initComponents() { + JPanel jp = new JPanel(new FlowLayout(FlowLayout.LEFT,0,2)); + jp.setBackground(null); + jp.setBorder(null); + + hField = new CalendarNumberField(23); + mField = new CalendarNumberField(59); + sField = new CalendarNumberField(59); + selectedNumberField = hField; + + jp.add(hField); + jp.add(createGapLabel()); + jp.add(mField); + jp.add(createGapLabel()); + jp.add(sField); + + this.add(jp, BorderLayout.CENTER); + preButton = new UIButton(UIConstants.ARROW_UP_ICON){ + public boolean shouldResponseChangeListener() { + return false; + } + }; + preButton.setRoundBorder(true, Constants.LEFT); + nextButton = new UIButton(UIConstants.ARROW_DOWN_ICON){ + public boolean shouldResponseChangeListener() { + return false; + } + }; + nextButton.setRoundBorder(true, Constants.LEFT); + JPanel arrowPane = new JPanel(); + arrowPane.setPreferredSize(new Dimension(11, 18)); + arrowPane.setLayout(new GridLayout(2, 1)); + arrowPane.add(preButton); + arrowPane.add(nextButton); + this.add(arrowPane, BorderLayout.EAST); + } + + private void initListener() { + MouseAdapter backgroundAdapter = new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + HMSPane.this.selectedNumberField = (CalendarNumberField)e.getComponent(); + } + + @Override + public void mouseExited(MouseEvent e) { + isRolOver = false; + HMSPane.this.repaint(); + } + + @Override + public void mouseEntered(MouseEvent e) { + isRolOver = true; + HMSPane.this.repaint(); + } + }; + hField.addMouseListener(backgroundAdapter); + mField.addMouseListener(backgroundAdapter); + sField.addMouseListener(backgroundAdapter); + nextButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + HMSPane.this.selectedNumberField.setValue(HMSPane.this.selectedNumberField.getIntValue() - 1); + HMSPane.this.selectedNumberField.requestFocus(); + HMSPane.this.selectedNumberField.selectAll(); + + } + }); + preButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + HMSPane.this.selectedNumberField.setValue(HMSPane.this.selectedNumberField.getIntValue() + 1); + HMSPane.this.selectedNumberField.requestFocus(); + HMSPane.this.selectedNumberField.selectAll(); + } + }); + } + + private UILabel createGapLabel () { + UILabel uiLabel = new UILabel(":"); + uiLabel.setHorizontalAlignment(SwingConstants.CENTER); + uiLabel.setBackground(null); + uiLabel.setBorder(null); + uiLabel.setPreferredSize(new Dimension(6,10)); + return uiLabel; + } + + public Insets getInsets() { + return new Insets(1,3,1,0); + } + + public void paint(Graphics g) { + super.paint(g); + paintBorder(g); + } + + public void paintBorder(Graphics g) { + Graphics2D g2d = (Graphics2D)g; + if (isRolOver) { + Shape shape = new RoundRectangle2D.Double(1, 1, 86, 15, UIConstants.ARC, UIConstants.ARC); + GUIPaintUtils.paintBorderShadow(g2d, 3, shape, UIConstants.HOVER_BLUE, Color.WHITE); + } else { + GUIPaintUtils.drawBorder(g2d, 0, 0, 101, 18, true, 3); + } + } + + public void populate(Calendar calendar){ + this.hField.setValue(calendar.get(Calendar.HOUR_OF_DAY)); + this.mField.setValue(calendar.get(Calendar.MINUTE)); + this.sField.setValue(calendar.get(Calendar.SECOND)); + } + + public void update(Calendar calendar) { + calendar.set(Calendar.HOUR_OF_DAY, hField.getIntValue()); + calendar.set(Calendar.MINUTE, mField.getIntValue()); + calendar.set(Calendar.SECOND, sField.getIntValue()); + } + } + + public static void main(String[] args){ + JFrame frame = new JFrame(); + + UICalendarPanel calendarPanel = new UICalendarPanel(); + final UITextField field = new UITextField(); + field.setPreferredSize(new Dimension(120, 25)); + calendarPanel.addDateChangeListener(new ChangeListener(){ + public void stateChanged(ChangeEvent e){ + Date selectedDate = (Date)e.getSource(); + SimpleDateFormat f = new SimpleDateFormat("yyyy/MM/dd"); + field.setText(f.format(selectedDate)); + } + }); + frame.getContentPane().setLayout(FRGUIPaneFactory.createCenterFlowLayout()); + frame.getContentPane().add(field); + frame.getContentPane().add(calendarPanel); + frame.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/date/UIDatePicker.java b/designer-base/src/com/fr/design/gui/date/UIDatePicker.java new file mode 100644 index 0000000000..f01dd98630 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/date/UIDatePicker.java @@ -0,0 +1,289 @@ +package com.fr.design.gui.date; + +import com.fr.base.FRContext; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.icombobox.UIComboBoxUI; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.ComboBoxUI; +import javax.swing.plaf.basic.BasicComboPopup; +import javax.swing.plaf.basic.ComboPopup; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.io.Serializable; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * UIDatePicker + */ +public class UIDatePicker extends UIComboBox implements Serializable { + /** + * 日期格式类型 + */ + public static final int STYLE_CN_DATE = 0; + public static final int STYLE_CN_DATE1 = 1; + public static final int STYLE_CN_DATETIME = 2; + public static final int STYLE_CN_DATETIME1 = 3; + public static final int STYLE_EN_DATE = 4; + public boolean isWillHide = false; + /** + * 日期格式类型 + */ + private int formatStyle = STYLE_CN_DATETIME; + /** + * 当前设置日期格式 + */ + private SimpleDateFormat dateFormat = null; + + /** + * 只有一个值的ComboBoxModel + */ + private SingleObjectComboBoxModel model = new SingleObjectComboBoxModel(); + JDateDocument dateDocument = null; + + /** + * 构造式 + */ + public UIDatePicker() throws UnsupportedOperationException { + this(STYLE_CN_DATE); + } + + public UIDatePicker(int formatStyle) throws UnsupportedOperationException { + this(formatStyle, new Date()); + } + + public UIDatePicker(int formatStyle, Date initialDatetime) throws UnsupportedOperationException { + this.setStyle(formatStyle); + //设置可编辑 + this.setEditable(true); + + this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); + + //设置编辑器属性(只能输入正确日期) + JTextField textField = ((JTextField) getEditor().getEditorComponent()); + textField.setHorizontalAlignment(SwingConstants.CENTER); + dateDocument = new JDateDocument(textField, this.dateFormat); + textField.setDocument(dateDocument); + //设置Model为单值Model + this.setModel(model); + //设置当前选择日期 + this.setSelectedItem(initialDatetime == null ? new Date() : initialDatetime); + updateUI(); + } + + /** + * 设置日期格式 + * STYLE_CN_DATE + * STYLE_CN_DATE1 + * STYLE_CN_DATETIME + * STYLE_CN_DATETIME1 + * + * @param formatStyle int + */ + public void setStyle(int formatStyle) throws UnsupportedOperationException { + this.formatStyle = formatStyle; + dateFormat = getDateFormat(formatStyle); + model.setDateFormat(dateFormat); + if (dateDocument != null) { + dateDocument.setDateFormat(dateFormat); + } + } + + /** + * 取得指定类型的日期格式 + * + * @param formatStyle int + * @return SimpleDateFormat + * @throws UnsupportedOperationException + */ + private static SimpleDateFormat getDateFormat(int formatStyle) throws + UnsupportedOperationException { + switch (formatStyle) { + case STYLE_CN_DATE: + return new SimpleDateFormat("yyyy/MM/dd"); + case STYLE_CN_DATE1: + return new SimpleDateFormat("yyyy-MM-dd"); + case STYLE_CN_DATETIME: + return new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + case STYLE_CN_DATETIME1: + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + case STYLE_EN_DATE: + return new SimpleDateFormat("MM/dd/yyyy"); + default: + throw new UnsupportedOperationException( + "invalid formatStyle parameter!"); + } + } + + /** + * 取得日期格式 + * STYLE_CN_DATE + * STYLE_CN_DATE1 + * STYLE_CN_DATETIME + * STYLE_CN_DATETIME1 + * + * @return int + */ + public int getStyle() { + return formatStyle; + } + + /** + * 取得当前选择的日期 + * + * @return Date + */ + public Date getSelectedDate() throws ParseException { + synchronized (this) { + return dateFormat.parse(getSelectedItem().toString()); + } + } + + /** + * 设置当前选择的日期 + */ + public void setSelectedDate(Date date) throws ParseException { + this.setSelectedItem(dateFormat.format(date)); + } + + public void setSelectedItem(Object anObject) { + model.setSelectedItem(anObject); + super.setSelectedItem(anObject); + } + + /** + *

Title: UIDatePicker

+ *

Description: DatePopup 选择框弹出的日期选择面板

+ *

Copyright: Copyright (c) 2004

+ *

Company:

+ * + * @author Sunking + * @version 1.0 + */ + class DatePopup extends BasicComboPopup implements ChangeListener { + UICalendarPanel calendarPanel = null; + + public DatePopup(JComboBox box) { + super(box); + + setLayout(FRGUIPaneFactory.createBorderLayout()); + calendarPanel = new UICalendarPanel(formatStyle > 1); + calendarPanel.addDateChangeListener(this); + add(calendarPanel, BorderLayout.CENTER); + setBorder(BorderFactory.createEmptyBorder()); + } + + public void hide() { + if (isWillHide) { + super.hide(); + } + } + + public void show() { + if (isWillHide || UIDatePicker.this.isEnabled() == false) { + return; + } + if (calendarPanel != null) { + calendarPanel.resetHMSPaneSelectedNumberField(); + } + super.show(); + } + + /** + * 显示弹出面板 + */ + protected void firePropertyChange(String propertyName, + Object oldValue, + Object newValue) { + if (ComparatorUtils.equals(propertyName, "visible")) { + if (ComparatorUtils.equals(oldValue, Boolean.FALSE) + && ComparatorUtils.equals(newValue, Boolean.TRUE)) { //SHOW + try { + String strDate = comboBox.getSelectedItem().toString(); + synchronized (this) { + Date selectionDate = dateFormat.parse(strDate); + calendarPanel.setSelectedDate(selectionDate); + calendarPanel.updateHMS(); + } + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + } else if (ComparatorUtils.equals(oldValue, Boolean.TRUE) + && ComparatorUtils.equals(newValue, Boolean.FALSE)) { //HIDE + } + } + super.firePropertyChange(propertyName, oldValue, newValue); + } + + public void stateChanged(ChangeEvent e) { + if (calendarPanel.getSelectedDate() != null && dateFormat != null) { + String strDate = dateFormat.format(calendarPanel.getSelectedDate()); + if (comboBox.isEditable() && comboBox.getEditor() != null) { + comboBox.configureEditor(comboBox.getEditor(), strDate); + } + comboBox.setSelectedItem(strDate); + } + comboBox.repaint(); + setVisible(false); + } + } + + protected ComboBoxUI getUIComboBoxUI() { + return new UIComboBoxUI() { + protected ComboPopup createPopup() { + return new DatePopup(comboBox); + } + + public void mousePressed(MouseEvent e) { + if (UIDatePicker.this.isPopupVisible()) { + isWillHide = true; + UIDatePicker.this.hidePopup(); + } else { + isWillHide = false; + UIDatePicker.this.showPopup(); + } + } + }; + } + + + + //设置dataFormat + public void setDateFormat(SimpleDateFormat format){ + this.dateFormat = format; + } + + //获取dateFormat + public SimpleDateFormat getDateFormat(){ + return this.dateFormat; + } + + public JDateDocument getDateDocument(){ + return this.dateDocument; + } + + public static void main(String[] args) { + LayoutManager layoutManager = null; + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(layoutManager); + UIDatePicker bb = new UIDatePicker(); + if (args.length != 0) { + bb = new UIDatePicker(STYLE_CN_DATETIME); + } + bb.setEditable(true); + bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); + content.add(bb); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/date/UIDayLabel.java b/designer-base/src/com/fr/design/gui/date/UIDayLabel.java new file mode 100644 index 0000000000..d7dffd4368 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/date/UIDayLabel.java @@ -0,0 +1,49 @@ +package com.fr.design.gui.date; + +import java.awt.*; +import java.text.SimpleDateFormat; +import java.util.Date; + +import com.fr.design.gui.ilable.UILabel; + +import com.fr.general.Inter; + +public class UIDayLabel extends UILabel { + + private Date date = null; + + /** + * 日期格式(TODAY/TIP用) + */ + final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); + /** + * 日格式 + */ + final SimpleDateFormat dayFormat = new SimpleDateFormat("d"); + + public UIDayLabel(Date date) { + this(date, true); + } + + public UIDayLabel(Date date, boolean isSmallLabel) { + setHorizontalAlignment(UILabel.CENTER); + setFont(new Font(Inter.getLocText("Song_TypeFace"), 0, 12)); + this.date = date; + setPreferredSize(new Dimension(30, 18)); + if (isSmallLabel) { + setText(dayFormat.format(date)); + } else { + setText(Inter.getLocText("Today")+":" + dateFormat.format(new Date())); + } + } + + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/demo/ComboBoxDemo.java b/designer-base/src/com/fr/design/gui/demo/ComboBoxDemo.java new file mode 100644 index 0000000000..a47ea5b0ce --- /dev/null +++ b/designer-base/src/com/fr/design/gui/demo/ComboBoxDemo.java @@ -0,0 +1,176 @@ +package com.fr.design.gui.demo; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.util.ArrayList; + +import javax.swing.DefaultListCellRenderer; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JTree; +import javax.swing.ListCellRenderer; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreePath; + +import com.fr.base.FRContext; +import com.fr.design.gui.icombobox.filter.Filter; +import com.fr.design.gui.icombobox.ComboCheckBox; +import com.fr.design.gui.icombobox.DictionaryComboBox; +import com.fr.design.gui.icombobox.ExtendedComboBox; +import com.fr.design.gui.icombobox.FRTreeComboBox; +import com.fr.design.gui.icombobox.FilterComboBox; +import com.fr.design.gui.icombobox.LazyComboBox; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.general.Inter; +import com.fr.stable.StringUtils; + +/** + * Created by IntelliJ IDEA. + * User: Richer + * Date: 11-6-30 + * Time: 下午8:21 + */ +public class ComboBoxDemo extends JPanel { + public ComboBoxDemo() { + setLayout(FRGUIPaneFactory.createBorderLayout()); + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + + Component[][] coms = new Component[][]{ + {new UILabel(Inter.getLocText("Form-ComboCheckBox")+":"), createComboCheckBox()}, + {new UILabel(Inter.getLocText(new String[]{"DS-Dictionary", "Form-ComboBox"})+":"), createDictComboBox()}, + {new UILabel(Inter.getLocText("long_data_can_not_show_fully")+":"), createExtendedComboBox()}, + {new UILabel(Inter.getLocText(new String[]{"Filter", "Form-ComboBox"})+":"), createFilterComboBox()}, + {new UILabel(Inter.getLocText("Form-ComboBox")+":"), createTreeComboBox()}, + {new UILabel(Inter.getLocText(new String[]{"Delay", "Load", "Form-ComboBox"})+":"), createLazyComboBox()} + }; + double[] rowSize = new double[coms.length]; + double[] columnSize = {p, f}; + for (int i = 0; i < rowSize.length; i++) { + rowSize[i] = p; + } + JPanel centerPane = TableLayoutHelper.createTableLayoutPane(coms, rowSize, columnSize); + add(centerPane, BorderLayout.CENTER); + } + + private ComboCheckBox createComboCheckBox() { + ComboCheckBox ccb = new ComboCheckBox(new Object[]{"张三", "李四", "王五", "赵六"}); + ccb.setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value != null) { + if (value instanceof Object[]) { + Object[] objs = (Object[]) value; + String[] res = new String[objs.length]; + for (int i = 0, len = objs.length; i < len; i++) { + res[i] = objs[i].toString(); + } + setText(StringUtils.join(",", res)); + } + } + return this; + } + }); + return ccb; + } + + private DictionaryComboBox createDictComboBox() { + DictionaryComboBox dcb = new DictionaryComboBox( + new Integer[]{1, 2, 3, 4}, + new String[]{"一", "二", "三", "四"} + ); + return dcb; + } + + private ExtendedComboBox createExtendedComboBox() { + ExtendedComboBox ecb = new ExtendedComboBox(new String[]{ + "Hello world, alksdfjlaskdjflaskjdflaksdf", + "Hello world, alksdfjlaskdjflaskjdflaksdfasdfklajsdflkasjdflkasdf", + "Hello world, alksdfjlaskdjflaskjdflaksdfasdfklajsdflkasjdflkasdfaaaaaaaaaaaaaaaaaadfsdf", + "Hello world, 太长了,都看不全了jlaskdjflaskjdflaksdfasdfklajsdflkasjdflkasdfsdfgklsdjfgklsdfjgklsjdfgkljsdflkgjsdlfk"}); + return ecb; + } + + private FilterComboBox createFilterComboBox() { + ArrayList items = new ArrayList(); + items.add("abc"); + items.add("abcd"); + items.add("dfee"); + items.add("asdfg"); + items.add("cdefg"); + Filter filter = new Filter() { + @Override + public boolean accept(String prefix, Object object) { + return prefix == null || object != null && + object.toString().toLowerCase().startsWith(prefix.toLowerCase()); + } + }; + + FilterComboBox fcb = new FilterComboBox(filter, items); + return fcb; + } + + private FRTreeComboBox createTreeComboBox() { + + DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点"); + DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("子节点1"); + root.add(child1); + DefaultMutableTreeNode child11 = new DefaultMutableTreeNode("子节点1-1"); + child1.add(child11); + DefaultMutableTreeNode child12 = new DefaultMutableTreeNode("子节点1-2"); + child1.add(child12); + DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("子节点2"); + root.add(child2); + DefaultMutableTreeNode child21 = new DefaultMutableTreeNode("子节点2-1"); + child2.add(child21); + JTree tree = new JTree(root); + TreeCellRenderer treeCellRender = new DefaultTreeCellRenderer() { + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { + super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); + if (value instanceof DefaultMutableTreeNode) { + DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; + Object userObj = node.getUserObject(); + setText(userObj + "-我是渲染器额外加的"); + } + return this; + } + }; + FRTreeComboBox tcb = new FRTreeComboBox(tree, treeCellRender, true, false); + ListCellRenderer listCellRenderer = new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof TreePath) { + DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) ((TreePath) value).getLastPathComponent(); + setText(treeNode.getUserObject().toString()); + } + return this; + } + }; + tcb.setRenderer(listCellRenderer); + tcb.setOnlyLeafSelectable(false); + return tcb; + } + + private LazyComboBox createLazyComboBox() { + LazyComboBox lcb = new LazyComboBox() { + @Override + public Object[] load() { + // 睡5秒 + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + return new Object[]{"11", "22", "33", "44", "55", "66"}; + } + }; + return lcb; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/demo/LabelDemo.java b/designer-base/src/com/fr/design/gui/demo/LabelDemo.java new file mode 100644 index 0000000000..4e9733214b --- /dev/null +++ b/designer-base/src/com/fr/design/gui/demo/LabelDemo.java @@ -0,0 +1,62 @@ +package com.fr.design.gui.demo; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +import com.fr.design.gui.ilable.ActionLabel; +import com.fr.design.gui.ilable.MultilineLabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.general.Inter; + +/** + * Created by IntelliJ IDEA. + * User: Richer + * Date: 11-7-1 + * Time: 上午8:54 + */ +public class LabelDemo extends JPanel { + public LabelDemo() { + setLayout(FRGUIPaneFactory.createBorderLayout()); + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + + Component[][] coms = new Component[][]{ + {new UILabel(Inter.getLocText(new String[]{"Hyperlink", "Label"})+":"), createActionLabel()}, + {new UILabel("多行字的标签:"), createMultilineLabel()} + }; + double[] rowSize = new double[coms.length]; + double[] columnSize = {p, f}; + for (int i = 0; i < rowSize.length; i++) { + rowSize[i] = p; + } + + + + JPanel centerPane = TableLayoutHelper.createTableLayoutPane(coms, rowSize, columnSize); + add(centerPane, BorderLayout.CENTER); + } + + private ActionLabel createActionLabel() { + ActionLabel al = new ActionLabel("点我,我看的反应"); + al.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JOptionPane.showMessageDialog(LabelDemo.this, "我能对点击做出反应!"); + } + }); + return al; + } + + private MultilineLabel createMultilineLabel() { + MultilineLabel mll = new MultilineLabel("abc\n伊尔"); + return mll; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/demo/ListDemo.java b/designer-base/src/com/fr/design/gui/demo/ListDemo.java new file mode 100644 index 0000000000..910c682982 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/demo/ListDemo.java @@ -0,0 +1,42 @@ +package com.fr.design.gui.demo; + +import java.awt.BorderLayout; +import java.awt.Component; + +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JPanel; + +import com.fr.design.gui.ilist.CheckBoxList; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; + +/** + * Created by IntelliJ IDEA. + * User: Richer + * Date: 11-6-30 + * Time: 下午9:17 + */ +public class ListDemo extends JPanel { + public ListDemo() { + setLayout(FRGUIPaneFactory.createBorderLayout()); + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + + Component[][] coms = new Component[][]{ + {new UILabel("复选框列表:"), createCheckBoxList()}, + }; + double[] rowSize = new double[coms.length]; + double[] columnSize = {p, f}; + for (int i = 0; i < rowSize.length; i++) { + rowSize[i] = p; + } + JPanel centerPane = TableLayoutHelper.createTableLayoutPane(coms, rowSize, columnSize); + add(centerPane, BorderLayout.CENTER); + } + + private CheckBoxList createCheckBoxList() { + CheckBoxList cbl = new CheckBoxList(new Object[] {"张三", "李四", "王五", "赵六"}); + return cbl; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/demo/LoadingPaneDemo.java b/designer-base/src/com/fr/design/gui/demo/LoadingPaneDemo.java new file mode 100644 index 0000000000..ec59dd3f4b --- /dev/null +++ b/designer-base/src/com/fr/design/gui/demo/LoadingPaneDemo.java @@ -0,0 +1,55 @@ +/* + * Copyright(c) 2001-2011, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.demo; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JPanel; + +import com.fr.base.FRContext; +import com.fr.design.gui.frpane.LoadingBasicPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.dialog.BasicDialog; + +/** + * Created by IntelliJ IDEA. + * user : Richer + * version: 6.5.5 + * Date : 11-7-1 + * Time : 下午3:32 + */ +public class LoadingPaneDemo extends JPanel { + public LoadingPaneDemo() { + setLayout(FRGUIPaneFactory.createCenterFlowLayout()); + UIButton btn = new UIButton("点我看效果"); + add(btn); + btn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + LoadingBasicPane lb = new LoadingBasicPane() { + protected void initComponents(JPanel container) { + for (int i = 0; i < 10; i++) { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + container.add(new UIButton(i + "adfadwdadawdwad")); + } + } + + @Override + protected String title4PopupWindow() { + return "测试"; + } + }; + + BasicDialog dlg = lb.showWindow(null); + dlg.setVisible(true); + } + }); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/demo/MultiLineTooltipDemo.java b/designer-base/src/com/fr/design/gui/demo/MultiLineTooltipDemo.java new file mode 100644 index 0000000000..d510d243ee --- /dev/null +++ b/designer-base/src/com/fr/design/gui/demo/MultiLineTooltipDemo.java @@ -0,0 +1,34 @@ +package com.fr.design.gui.demo; + +import java.awt.BorderLayout; + +import javax.swing.JPanel; +import javax.swing.JToolTip; + +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.itooltip.MultiLineToolTip; +import com.fr.design.layout.FRGUIPaneFactory; + +/** + * Created by IntelliJ IDEA. + * User: Richer + * Date: 11-6-30 + * Time: 下午9:14 + */ +public class MultiLineTooltipDemo extends JPanel { + public MultiLineTooltipDemo() { + setLayout(FRGUIPaneFactory.createBorderLayout()); + UIButton button = new UIButton("鼠标移动在此按钮上查看多行提示") { + + @Override + public JToolTip createToolTip() { + MultiLineToolTip tip = new MultiLineToolTip(); + tip.setComponent(this); + tip.setOpaque(false); + return tip; + } + }; + button.setToolTipText("Hello\nworld "); + add(button, BorderLayout.NORTH); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/demo/SwingComponentsDemo.java b/designer-base/src/com/fr/design/gui/demo/SwingComponentsDemo.java new file mode 100644 index 0000000000..6a08e38b06 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/demo/SwingComponentsDemo.java @@ -0,0 +1,52 @@ +package com.fr.design.gui.demo; + +import java.awt.BorderLayout; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.SwingUtilities; +import javax.swing.WindowConstants; + +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.utils.DesignUtils; +import com.fr.design.utils.gui.GUICoreUtils; + +/** + * Created by IntelliJ IDEA. + * User: Richer + * Date: 11-6-27 + * Time: 下午4:54 + */ +public class SwingComponentsDemo extends JFrame { + public SwingComponentsDemo() { + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + init(); + JPanel contentPane = (JPanel)getContentPane(); + contentPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + JTabbedPane tab = new JTabbedPane(); + contentPane.add(tab, BorderLayout.CENTER); + tab.addTab("下拉框", new ComboBoxDemo()); + tab.addTab("多行提示", new MultiLineTooltipDemo()); + tab.addTab("列表", new ListDemo()); + tab.addTab("标签", new LabelDemo()); + tab.addTab("加载耗时较多的面板", new LoadingPaneDemo()); + } + + private void init() { + DesignUtils.initLookAndFeel(); + setTitle("设计器组件演示"); + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + JFrame f = new SwingComponentsDemo(); + f.setSize(500, 500); + f.setVisible(true); + GUICoreUtils.centerWindow(f); + f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + } + }); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java b/designer-base/src/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java new file mode 100644 index 0000000000..8f5fa9804d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/AbstractAttrNoScrollPane.java @@ -0,0 +1,162 @@ +package com.fr.design.gui.frpane; + +import com.fr.design.dialog.BasicPane; +import com.fr.design.event.GlobalNameListener; +import com.fr.design.event.GlobalNameObserver; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; + +import javax.swing.*; +import java.awt.*; + + +/** + * 用于属性表中的面板,主要是为了给包含于这个面板内部的众多UI控件加监听事件,在UI控件改变的时候,通知模板做相应的变化 + */ +public abstract class AbstractAttrNoScrollPane extends BasicPane { + private static final int DEFAULT_HEIGHT = 250; + private static boolean hasChangeListener; + + protected JPanel leftContentPane; + protected Color original; + + private AttributeChangeListener listener; + private String globalName = ""; + + protected AbstractAttrNoScrollPane() { + initAll(); + } + + protected void initAll() { + enableEvents(AWTEvent.MOUSE_WHEEL_EVENT_MASK); + original = this.getBackground(); + this.setLayout(new BorderLayout()); + hasChangeListener = false; + initContentPane(); + initAllListeners(); + } + + /** + * 后台初始化所有事件. + */ + public void initAllListeners() { + initListener(AbstractAttrNoScrollPane.this); + } + + protected void initContentPane() { + leftContentPane = createContentPane(); + leftContentPane.setBorder(BorderFactory.createMatteBorder(10, 10, 0, 0, original)); + this.add(leftContentPane, BorderLayout.CENTER); + } + + protected abstract JPanel createContentPane(); + + /** + * august:不容易啊 还要用笔画图立个方程才计算出来 + */ + protected void adjustValues() { + doLayout(); + } + + protected void removeAttributeChangeListener() { + this.listener = null; + hasChangeListener = false; + } + + + protected void initListener(Container parentComponent) { + for (int i = 0; i < parentComponent.getComponentCount(); i++) { + Component tmpComp = parentComponent.getComponent(i); + + if (tmpComp instanceof Container) { + initListener((Container) tmpComp); + } + if (tmpComp instanceof GlobalNameObserver) { + ((GlobalNameObserver) tmpComp).registerNameListener(new GlobalNameListener() { + public void setGlobalName(String name) { + globalName = name; + } + + public String getGlobalName() { + return globalName; + } + }); + } + if (tmpComp instanceof UIObserver) { + ((UIObserver) tmpComp).registerChangeListener(new UIObserverListener() { + @Override + public void doChange() { + attributeChanged(); + } + }); + } + } + } + + /** + * 是否有改变监听 + * @return 是则返回true + */ + public static boolean isHasChangeListener() { + return hasChangeListener; + } + + /** + * 返回预定义的大小. + */ + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, DEFAULT_HEIGHT); + } + + + /** + * 返回绑定的属性事件. + * @param listener 增加监听 + */ + public void addAttributeChangeListener(AttributeChangeListener listener) { + this.listener = listener; + hasChangeListener = true; + } + + /** + * 响应属性事件. + */ + public void attributeChanged() { + synchronized (this) { + if (listener != null) { + listener.attributeChange(); + } + } + } + + /** + * 返回图标的路径 + */ + public abstract String getIconPath(); + + /** + * 界面标题 + * @return 标题 + */ + public abstract String title4PopupWindow(); + + /** + * 设置选中的ID, 用于双击展示界面. + */ + public void setSelectedByIds(int level, String... id) { + + } + + public String getGlobalName(){ + return globalName; + } + + /** + * 主要用于图表设计器 + * @return 是 + */ + public boolean isNeedPresentPaneWhenFilterData(){ + return true; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/AttributeChangeListener.java b/designer-base/src/com/fr/design/gui/frpane/AttributeChangeListener.java new file mode 100644 index 0000000000..50859537b9 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/AttributeChangeListener.java @@ -0,0 +1,7 @@ +package com.fr.design.gui.frpane; + +public interface AttributeChangeListener { + + public void attributeChange(); + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/BaseHyperlinkGroup.java b/designer-base/src/com/fr/design/gui/frpane/BaseHyperlinkGroup.java new file mode 100644 index 0000000000..fbc9678d5a --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/BaseHyperlinkGroup.java @@ -0,0 +1,23 @@ +package com.fr.design.gui.frpane; + +import com.fr.design.gui.controlpane.NameableCreator; +import com.fr.design.module.DesignModuleFactory; + +/** + * 基础的超级链接类型, 不包括图表相关超链. + * + * @author kunsnat E-mail:kunsnat@gmail.com + * @version 创建时间:2013-6-26 下午04:46:02 + */ +public class BaseHyperlinkGroup implements HyperlinkGroupType { + + /** + * 返回支持的超级链接类型 + * + * @return + */ + public NameableCreator[] getHyperlinkCreators() { + return DesignModuleFactory.getCreators4Hyperlink(); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/CommitTabbedPane.java b/designer-base/src/com/fr/design/gui/frpane/CommitTabbedPane.java new file mode 100644 index 0000000000..5ca8ba6e8f --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/CommitTabbedPane.java @@ -0,0 +1,538 @@ +package com.fr.design.gui.frpane; + + +import com.fr.base.BaseUtils; +import com.fr.design.constants.UIConstants; +import com.fr.design.write.submit.DBManipulationPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.javascript.Commit2DBJavaScriptPane; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.*; +import java.util.List; + +/** + * User: zheng + * Date: 14-3-28 + * Time: 下午3:24 + */ + +public class CommitTabbedPane extends JComponent implements MouseListener, MouseMotionListener { + + private Icon closeIcon = BaseUtils.readIcon("com/fr/design/images/gui/tab_delete.png"); + private static final Icon ADD_NORMAL = BaseUtils.readIcon("com/fr/design/images/gui/tab_add_normal.png"); + private static final Icon ADD_OVER = BaseUtils.readIcon("com/fr/design/images/gui/tab_add_hover.png"); + private static final Icon ADD_CLICK = BaseUtils.readIcon("com/fr/design/images/gui/tab_add_click.png"); + private static final Image DESIGN_IMAGE = BaseUtils.readImage("com/fr/design/images/sheet/left_right_btn.png"); + private static final Icon LEFT_ICON = BaseUtils.createIcon(DESIGN_IMAGE, 0, 0, 14, 14); + private static final Icon RIGHT_ICON = BaseUtils.createIcon(DESIGN_IMAGE, 14, 0, 14, 14); + private static final Icon DISABLED_LEFT_ICON = BaseUtils.createIcon(DESIGN_IMAGE, 0, 14, 14, 14); + private static final Icon DISABLED_RIGHT_ICON = BaseUtils.createIcon(DESIGN_IMAGE, 14, 14, 14, 14); + private Icon addIcon = ADD_NORMAL; + + private static final int TOOLBAR_HEIGHT = 16; // 按钮高度 + private static final int GAP = 5; //间隔 + private static final int SMALLGAP = 3; + + private static final int FIRST_TAB_POSITION = 20; + + + // 左移和右移按钮 + private UIButton leftButton; + private UIButton rightButton; + + private JPanel buttonPane; + + private List dbManipulationPaneList ; + + private Commit2DBJavaScriptPane commit2DBJavaScriptPane; + + // 能显示的tab个数 + private int showCount = 0; + + //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 + private double specialLocation1 = 2.5; + private double specialLocation2 = 4.330127; + + private int mouseOveredIndex = -1; + + private int selectedIndex = -1; + + private static final double CORNOR_RADIUS = 5.0; + + + //tab栏可以放下的每个tab的实际宽度 + private int tabWidth = 70; + + + //当前标签页栏存放的所有标签页的index + private int scrollIndex = 0; + private int lastOneIndex = 0; + + //添加标签位置 + private int addX = -1; + private int addY = -1; + + + //各删除标签位置 + private int[] closeIconStartX; + + + public CommitTabbedPane(Commit2DBJavaScriptPane commit2DBJavaScriptPane, List dbManipulationPaneList ){ + this.commit2DBJavaScriptPane = commit2DBJavaScriptPane; + this.dbManipulationPaneList = dbManipulationPaneList; + this.setLayout(new BorderLayout(0, 0)); + this.addMouseListener(this); + this.addMouseMotionListener(this); + this.setBorder(null); + this.setForeground(new Color(99, 99, 99)); + leftButton = new UIButton(LEFT_ICON) { + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); + } + }; + leftButton.set4ToolbarButton(); + leftButton.setDisabledIcon(DISABLED_LEFT_ICON); + rightButton = new UIButton(RIGHT_ICON) { + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, TOOLBAR_HEIGHT); + } + }; + rightButton.set4ToolbarButton(); + rightButton.setDisabledIcon(DISABLED_RIGHT_ICON); + buttonPane = new JPanel(new BorderLayout(3, 0)); + buttonPane.add(rightButton, BorderLayout.EAST); + buttonPane.add(leftButton, BorderLayout.CENTER); + this.add(buttonPane, BorderLayout.EAST); + leftButton.addActionListener(createLeftButtonActionListener()); + rightButton.addActionListener(createRightButtonActionListener()); + + } + + private ActionListener createRightButtonActionListener(){ + return new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int tabCount = getTabCount(); + if (lastOneIndex < tabCount && lastOneIndex + showCount <= tabCount) { + scrollIndex += showCount; + lastOneIndex += showCount; + selectedIndex = lastOneIndex; + } else if(lastOneIndex < tabCount && lastOneIndex + showCount > tabCount){ + lastOneIndex = tabCount -1; + scrollIndex = lastOneIndex - showCount; + selectedIndex = lastOneIndex; + } + repaint(); + } + }; + } + + private ActionListener createLeftButtonActionListener() { + return new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + if(scrollIndex >= showCount) { + scrollIndex -= showCount; + selectedIndex = scrollIndex; + lastOneIndex -= showCount; + } else if (scrollIndex > 0 && scrollIndex< showCount){ + scrollIndex =0; + selectedIndex = 0; + lastOneIndex = showCount; + + } + repaint(); + } + }; + } + + private void checkButton(boolean buttonEnabled) { + leftButton.setEnabled(buttonEnabled); + rightButton.setEnabled(buttonEnabled); + } + + public int getSelectedIndex(){ + return selectedIndex; + } + + public void paintComponent(Graphics g){ + super.paintComponent(g); + double maxWidth = getWidth() - buttonPane.getWidth(); + Graphics2D g2d = (Graphics2D) g; + paintBackgroundAndLine(g2d, maxWidth); + + } + + private void paintBackgroundAndLine(Graphics2D g2d, double maxWidth) { + //能画的个数 + showCount = (int) (maxWidth) / tabWidth; + //计算开始画的最小模板index和最大模板index + if (selectedIndex >= dbManipulationPaneList.size()) { + selectedIndex = dbManipulationPaneList.size() - 1; + } + if (selectedIndex < 0) { + selectedIndex = 0; + } + calMinAndMaxIndex(); + closeIconStartX = new int[lastOneIndex - scrollIndex + 1]; + + int startX = 0; + //从可以开始展示在tab面板上的tab开始画 + for (int i = scrollIndex; i <= lastOneIndex; i++) { + DBManipulationPane dbManipulationPane = (DBManipulationPane)dbManipulationPaneList.get(i); + String name ; + if (dbManipulationPane.getSubMitName() != null){ + name = dbManipulationPane.getSubMitName(); + } else { + name = createName(); + dbManipulationPane.setSubMitName(name); + } + if (i == selectedIndex) { + closeIconStartX[i - scrollIndex] = paintSelectedTab(g2d, startX,name, i); + } else { + closeIconStartX[i - scrollIndex] = paintUnSelectedTab(g2d,startX,name,i); + } + startX += tabWidth; + } + paintUnderLine(startX, maxWidth, g2d); + addX = startX + GAP; + addIcon.paintIcon(this,g2d,addX,0); + checkButton(getTabCount() > showCount); + } + + public int getTabCount(){ + return dbManipulationPaneList.size(); + } + + private String createName(){ + String prefix = Inter.getLocText("FR-Designer-CommitTab_Submit"); + int count = getTabCount(); + while (true) { + //从提交1开始 + count = count == 0 ? 1 : count; + String newName = prefix + count; + boolean repeated = false; + for (int i= 0;i < getTabCount();i++) { + if (ComparatorUtils.equals( ((DBManipulationPane)dbManipulationPaneList.get(i)).getSubMitName(), newName)) { + repeated = true; + break; + } + } + + if (!repeated) { + return newName; + } + + count++; + } + } + + + + private void paintUnderLine(double startX, double maxWidth, Graphics2D g2d) { + //画下面的那条线 + if (startX < maxWidth) { + GeneralPath generalPath = new GeneralPath(Path2D.WIND_EVEN_ODD, 2); + generalPath.moveTo((float) startX, (float) (getHeight() - 1)); + generalPath.lineTo((float) maxWidth, (float) (getHeight() - 1)); + g2d.fill(generalPath); + g2d.setPaint(UIConstants.LINE_COLOR); + g2d.draw(new Line2D.Double((float) startX, (float) (getHeight() - 1), (float) maxWidth , (float) (getHeight() - 1))); + } + } + + + private void calMinAndMaxIndex() { //如果个数大于最多能容纳的个数,则多余的进行处理 + + if (dbManipulationPaneList.size() > showCount) { + + if (selectedIndex >= lastOneIndex) { //所点击列表中的标签页处在标签页栏最后一个标签页之后,则标签页栏左移至所点击标签页出现 + scrollIndex = selectedIndex - showCount + 1; + lastOneIndex = selectedIndex; + if (scrollIndex <= 0) { + scrollIndex = 0; + lastOneIndex = showCount - 1; + } + } else if (selectedIndex <= scrollIndex) { //所点击列表中的标签页处在标签页栏第一个标签页之前,则标签页栏右移至所点击标签页出现 + + scrollIndex = selectedIndex; + lastOneIndex = scrollIndex + showCount - 1; + if (lastOneIndex > dbManipulationPaneList.size() - 1) { + lastOneIndex = dbManipulationPaneList.size() - 1; + } + } else { + if (selectedIndex >= dbManipulationPaneList.size() - 1) { + selectedIndex = dbManipulationPaneList.size() - 1; + lastOneIndex = selectedIndex; + scrollIndex = selectedIndex - showCount + 1; + } else { + lastOneIndex = scrollIndex + showCount - 1; + if (lastOneIndex > dbManipulationPaneList.size() - 1) { + lastOneIndex = dbManipulationPaneList.size() - 1; + } + } + } + } else { + scrollIndex = 0; + lastOneIndex = dbManipulationPaneList.size() - 1; + } + } + + + /** + * 画选中的tab + * + * @param g2d + * @param sheetName + * @return + */ + private int paintSelectedTab(Graphics2D g2d,int startX, String sheetName, int selfIndex) { + double[] x = {startX, startX, startX + tabWidth, startX + tabWidth, startX}; + double[] y = {-1, getHeight(), getHeight(), -1, -1}; + RoundRectangle2D.Double rect1 = new RoundRectangle2D.Double(startX, 1, this.getWidth(), this.getHeight(), 7, 7); + g2d.setPaint(new GradientPaint(1, 1, new Color(255, 255, 255), 1, getHeight() - 1, UIConstants.NORMAL_BACKGROUND)); + + 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), (double) 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 Line2D.Double(x[0] + 3 ,0,x[2] - 3,0)); + 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); + // 画字符 + g2d.setPaint(getForeground()); + g2d.drawString(sheetName, startX + 2 * GAP, getHeight()-GAP); + int closePosition = startX + tabWidth - closeIcon.getIconWidth() - SMALLGAP; + int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; + if (canClose() && mouseOveredIndex == selfIndex){ + closeIcon.paintIcon(this, g2d, closePosition, closeY); + } + return closePosition; + + } + + /** + * 画没有选中的tab + * + * @param g2d + * @param startX + * @param sheetName + * @return + */ + private int paintUnSelectedTab(Graphics2D g2d, int startX, String sheetName, int selfIndex) { + double[] x = {startX, startX, startX + tabWidth, startX + tabWidth, startX}; + double[] y = {-1, getHeight() - 1, getHeight() - 1, -1, -1}; + if (selfIndex == mouseOveredIndex) { + g2d.setPaint(new GradientPaint(1, 1, new Color(255, 255, 255), 1, getHeight() - 1, UIConstants.NORMAL_BACKGROUND)); + } else { + g2d.setPaint(new GradientPaint(1, 1, UIConstants.NORMAL_BACKGROUND, 1, getHeight() - 1, UIConstants.NORMAL_BACKGROUND)); + } + + + 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), (double) 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 Line2D.Double(x[0] + 3 ,0,x[2] - 3,0)); + 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); + // 画字符 + g2d.setPaint(getForeground()); + g2d.drawString(sheetName, startX + 2 * GAP, getHeight() - GAP ); + int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; + int closePosition = startX + tabWidth - closeIcon.getIconWidth() - SMALLGAP; + if (canClose() && mouseOveredIndex == selfIndex){ + closeIcon.paintIcon(this, g2d, closePosition, closeY); + } + return closePosition; + } + + + /** + * 鼠标按下 + * @param e 事件 + */ + public void mouseClicked(MouseEvent e) { + } + + /** + * 鼠标按下 + * @param e 事件 + */ + public void mousePressed(MouseEvent e) { + int x = e.getX(), y = e.getY(); + if (addX!= -1 && isOverAddIcon(x, y)){ + addIcon = ADD_CLICK; + commit2DBJavaScriptPane.createDBManipulationPane(); + selectedIndex = dbManipulationPaneList.size()-1; + commit2DBJavaScriptPane.updateCardPane(); + } else if (isOverCloseIcon(x)){ + int re = JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(this), Inter.getLocText("FR-Designer-CommitTab_SureToDelete")+ "?", Inter.getLocText("FR-Designer-CommitTab_Remove") + , JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + if (re == JOptionPane.OK_OPTION) { + dbManipulationPaneList.remove(getTabIndex(x)); + commit2DBJavaScriptPane.setList(dbManipulationPaneList); + // 删除tab以后,获得第一个tab,再刷新一下,否则画面会停留在已删除的tab上,第一个tab是不可删除的 + selectedIndex = getTabIndex(FIRST_TAB_POSITION); + commit2DBJavaScriptPane.updateCardPane(); + + } + } else if (selectedIndex != getTabIndex(x)){ + selectedIndex = getTabIndex(x); + commit2DBJavaScriptPane.updateCardPane(); + } + repaint(); + } + + /** + * 鼠标离开 + * @param e 事件 + */ + public void mouseReleased(MouseEvent e) { + if(addX != -1 && isOverAddIcon(e.getX(), e.getY())){ + addIcon = ADD_NORMAL; + } + } + + /** + * 鼠标进入 + * @param e 事件 + */ + public void mouseEntered(MouseEvent e) { + } + + /** + * 鼠标离开 + * @param e 事件 + */ + public void mouseExited(MouseEvent e) { + mouseOveredIndex = -1; + repaint(); + } + + /** + * 鼠标拖动 + * @param e 事件 + */ + public void mouseDragged(MouseEvent e) { + } + + /** + * 鼠标移动 + * @param e 事件 + */ + public void mouseMoved(MouseEvent e) { + if(addX!= -1 && isOverAddIcon(e.getX(), e.getY())){ + addIcon = ADD_OVER; + } else { + mouseOveredIndex = getTabIndex(e.getX()); + addIcon = ADD_NORMAL; + } + repaint(); + } + + + /** + * 判断鼠标所在Tab + * @param evtX + * @return index + */ + private int getTabIndex ( int evtX ){ + int x = 0; + for( int i = scrollIndex;i <= lastOneIndex;i++){ + if(evtX > x && evtX <= x + tabWidth ){ + return i; + } + x = x + tabWidth; + } + return -1; + } + + /** + * 判断鼠标是否在添加按钮上 + * @param x 鼠标坐标x + * @param y 鼠标坐标y + * @return 返回鼠标是否在添加按钮上 + */ + private boolean isOverAddIcon(int x, int y){ + int addWidth = addIcon.getIconWidth(),addHeight = addIcon.getIconHeight(); + return x >= addX && x <= addX + addWidth && y > addY && y <= addY + addHeight; + } + + + /** + * 判断鼠标是否在关闭按钮上 + * @param evtX x + * @return 返回鼠标是否在关闭按钮上 + */ + private boolean isOverCloseIcon(int evtX) { + boolean isOverCloseIcon = false; + if( canClose()){ + for (int i = 0; i < closeIconStartX.length; i++) { + if (evtX >= closeIconStartX[i] && evtX <= closeIconStartX[i] + closeIcon.getIconWidth()) { + isOverCloseIcon = true; + break; + } + } + } + return isOverCloseIcon; + } + + /** + * 如果tab只剩下最后一个,则不画删除按钮 + * @return 返回当前tab还可否关闭 + */ + private boolean canClose(){ + return closeIconStartX.length > 1; + } + + /** + * 刷新tab,停留在第一个tab上面 + */ + public void refreshTab(){ + selectedIndex = getTabIndex(FIRST_TAB_POSITION); + commit2DBJavaScriptPane.updateCardPane(); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/EditingStringListPane.java b/designer-base/src/com/fr/design/gui/frpane/EditingStringListPane.java new file mode 100644 index 0000000000..7f98dc615e --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/EditingStringListPane.java @@ -0,0 +1,208 @@ +package com.fr.design.gui.frpane; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.BorderFactory; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.ListSelectionModel; +import javax.swing.SwingUtilities; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +import com.fr.stable.StringUtils; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.design.utils.gui.JListUtils; + +public abstract class EditingStringListPane extends BasicBeanPane> { + + private static final long serialVersionUID = 1L; + private DefaultListModel model; + private JList jlist; + private UIButton addButton; + private UIButton editButton; + private UIButton removeButton; + private UIButton moveUpButton; + private UIButton moveDownButton; + + public EditingStringListPane() { + super(); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + model = new DefaultListModel(); + jlist = new JList(model); + jlist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + jlist.setCellRenderer(new DefaultListCellRenderer() { + private static final long serialVersionUID = 1L; + + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + this.setText(value.toString()); + return this; + } + + }); + + addButton = new UIButton(Inter.getLocText("Add")); + editButton = new UIButton(Inter.getLocText("Modify")); + removeButton = new UIButton(Inter.getLocText("Remove")); + moveUpButton = new UIButton(Inter.getLocText("Utils-Move_Up")); + moveDownButton = new UIButton(Inter.getLocText("Utils-Move_Down")); + + JPanel eastPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1); + eastPane.add(editButton); + eastPane.add(removeButton); + eastPane.add(moveUpButton); + eastPane.add(moveDownButton); + this.add(GUICoreUtils.createBorderPane(eastPane, BorderLayout.NORTH), BorderLayout.EAST); + + JPanel centerPane = new JPanel(new BorderLayout(0, 5)); + this.add(centerPane, BorderLayout.CENTER); + JPanel northcenterPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + northcenterPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); + northcenterPane.add(addButton, BorderLayout.EAST); + centerPane.add(northcenterPane, BorderLayout.NORTH); + centerPane.add(new JScrollPane(jlist), BorderLayout.CENTER); + + this.addListener(); + + this.addButton.setEnabled(false); + this.checkEnableState(); + } + + private void addListener() { + addListener1(); + + moveUpButton.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + JListUtils.upListSelectedIndex(jlist); + } + }); + moveDownButton.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + JListUtils.downListSelectedIndex(jlist); + } + }); + jlist.addListSelectionListener(new ListSelectionListener() { + + @Override + public void valueChanged(ListSelectionEvent e) { + Object selected = jlist.getSelectedValue(); + selectedChanged((String)selected); + } + }); + jlist.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + Object selected = jlist.getSelectedValue(); + selectedChanged((String)selected); + } + }); + } + + private void addListener1() { + addButton.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + String newvalue = getAddOrEditString(); + if (!model.contains(newvalue)) { + if (!StringUtils.isEmpty(newvalue)) { + model.add(model.size(), newvalue); + setAddEnabled(false); + } + } else { + JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(EditingStringListPane.this), newvalue + Inter.getLocText("Already_exists_not_add_repeat")+"!"); + } + } + }); + editButton.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + int selectededIndex = jlist.getSelectedIndex(); + if (selectededIndex > -1) { + if (!StringUtils.isEmpty(getAddOrEditString())) { + model.setElementAt(getAddOrEditString(), selectededIndex); + } + } + } + }); + removeButton.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + Object selected = jlist.getSelectedValue(); + if (selected != null) { + int re = JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(EditingStringListPane.this), Inter.getLocText("sure_to_delete") + selected.toString() + "?"); + if (re == JOptionPane.OK_OPTION) { + JListUtils.removeSelectedListItems(jlist); + } + } + checkEnableState(); + } + }); + } + + public void checkEnableState() { + if (jlist.getSelectedIndex() < 0) { + setEditEnabled(false); + } else { + setEditEnabled(true); + } + } + + private void setEditEnabled(boolean enabled) { + this.removeButton.setEnabled(enabled); + this.editButton.setEnabled(enabled); + this.moveUpButton.setEnabled(enabled); + this.moveDownButton.setEnabled(enabled); + } + + public void setAddEnabled(boolean enabled) { + this.addButton.setEnabled(enabled); + } + + protected abstract void selectedChanged(String selected); + + protected abstract String getAddOrEditString(); + + @Override + protected String title4PopupWindow() { + return "iloveyou"; + } + + @Override + public void populateBean(List lists) { + for (String ob : lists) { + model.addElement(ob); + } + jlist.setSelectedIndex(0); + } + + @Override + public List updateBean() { + List lists = new ArrayList(); + for (int i = 0, len = model.size(); i < len; i++) { + lists.add((String)model.get(i)); + } + return lists; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/HyperlinkGroupPane.java b/designer-base/src/com/fr/design/gui/frpane/HyperlinkGroupPane.java new file mode 100644 index 0000000000..5e7ce66279 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/HyperlinkGroupPane.java @@ -0,0 +1,132 @@ +package com.fr.design.gui.frpane; + +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.designer.TargetComponent; +import com.fr.design.fun.HyperlinkProvider; +import com.fr.design.gui.controlpane.NameableCreator; +import com.fr.design.gui.controlpane.UIListControlPane; +import com.fr.design.module.DesignModuleFactory; +import com.fr.general.GeneralContext; +import com.fr.general.Inter; +import com.fr.general.NameObject; +import com.fr.js.JavaScript; +import com.fr.js.NameJavaScript; +import com.fr.js.NameJavaScriptGroup; +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.manage.PluginFilter; +import com.fr.plugin.observer.PluginEvent; +import com.fr.plugin.observer.PluginEventListener; +import com.fr.stable.ListMap; +import com.fr.stable.Nameable; + +import java.util.ArrayList; +import java.util.Map; +import java.util.Set; + +/** + * 超级链接 界面. + * + * @author kunsnat E-mail:kunsnat@gmail.com + * @version 创建时间:2013-6-25 上午11:17:57 + */ +public abstract class HyperlinkGroupPane extends UIListControlPane { + protected HyperlinkGroupPaneActionProvider hyperlinkGroupPaneActionProvider; + + public HyperlinkGroupPane(HyperlinkGroupPaneActionProvider hyperlinkGroupPaneActionProvider) { + super(); + this.hyperlinkGroupPaneActionProvider = hyperlinkGroupPaneActionProvider; + } + + @Override + protected void initComponentPane() { + super.initComponentPane(); + GeneralContext.listenPluginRunningChanged(new PluginEventListener() { + + @Override + public void on(PluginEvent event) { + + refreshNameableCreator(createNameableCreators()); + + } + }, new PluginFilter() { + + @Override + public boolean accept(PluginContext context) { + + return context.contain(HyperlinkProvider.XML_TAG); + } + }); + } + + /** + * 生成添加按钮的NameableCreator + * + * @return 返回Nameable按钮数组. + */ + public NameableCreator[] createNameableCreators() { + Map nameCreators = new ListMap<>(); + NameableCreator[] creators = DesignModuleFactory.getHyperlinkGroupType().getHyperlinkCreators(); + for (NameableCreator creator : creators) { + nameCreators.put(creator.menuName(), creator); + } + Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); + for (HyperlinkProvider provider : providers) { + NameableCreator nc = provider.createHyperlinkCreator(); + nameCreators.put(nc.menuName(), nc); + } + return nameCreators.values().toArray(new NameableCreator[nameCreators.size()]); + } + + /** + * 弹出列表的标题. + * + * @return 返回标题字符串. + */ + public String title4PopupWindow() { + return Inter.getLocText("FR-Designer_Hyperlink"); + } + + @Override + protected String getAddItemText() { + return Inter.getLocText("FR-Designer_Add_Hyperlink"); + } + + public void populate(NameJavaScriptGroup nameHyperlink_array) { + java.util.List list = new ArrayList(); + if (nameHyperlink_array != null) { + for (int i = 0; i < nameHyperlink_array.size(); i++) { + list.add(new NameObject(nameHyperlink_array.getNameHyperlink(i).getName(), nameHyperlink_array.getNameHyperlink(i).getJavaScript())); + } + } + + this.populate(list.toArray(new NameObject[list.size()])); + } + + public void populate(TargetComponent elementCasePane) { + hyperlinkGroupPaneActionProvider.populate(this, elementCasePane); + } + + /** + * updateJs的Group + * + * @return 返回NameJavaScriptGroup + */ + public NameJavaScriptGroup updateJSGroup() { + Nameable[] res = this.update(); + NameJavaScript[] res_array = new NameJavaScript[res.length]; + for (int i = 0; i < res.length; i++) { + NameObject no = (NameObject) res[i]; + res_array[i] = new NameJavaScript(no.getName(), (JavaScript) no.getObject()); + } + + return new NameJavaScriptGroup(res_array); + } + + @Override + public void saveSettings() { + if (isPopulating) { + return; + } + hyperlinkGroupPaneActionProvider.saveSettings(this); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/frpane/HyperlinkGroupPaneActionProvider.java b/designer-base/src/com/fr/design/gui/frpane/HyperlinkGroupPaneActionProvider.java similarity index 100% rename from designer_base/src/com/fr/design/gui/frpane/HyperlinkGroupPaneActionProvider.java rename to designer-base/src/com/fr/design/gui/frpane/HyperlinkGroupPaneActionProvider.java diff --git a/designer-base/src/com/fr/design/gui/frpane/HyperlinkGroupType.java b/designer-base/src/com/fr/design/gui/frpane/HyperlinkGroupType.java new file mode 100644 index 0000000000..37a64a2905 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/HyperlinkGroupType.java @@ -0,0 +1,18 @@ +package com.fr.design.gui.frpane; + +import com.fr.design.gui.controlpane.NameableCreator; + +/** + * 超级链接 支持的类型 种类. + * @author kunsnat E-mail:kunsnat@gmail.com + * @version 创建时间:2013-6-26 下午04:41:55 + */ +public interface HyperlinkGroupType { + + /** + * 返回支持的超级链接类型 + * @return NameableCreator[] + */ + public NameableCreator[] getHyperlinkCreators(); + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/ImgChoosePane.java b/designer-base/src/com/fr/design/gui/frpane/ImgChoosePane.java new file mode 100644 index 0000000000..957da465d6 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/ImgChoosePane.java @@ -0,0 +1,122 @@ +package com.fr.design.gui.frpane; + +import com.fr.base.BaseUtils; +import com.fr.base.background.ImageBackground; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.style.background.image.ImageFileChooser; +import com.fr.design.style.background.image.ImagePreviewPane; +import com.fr.general.Inter; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; + +public class ImgChoosePane extends BasicPane { + + private ImagePreviewPane previewPane; + private UIButton chooseButton; + private UIButton clearButton; + private UILabel imgSizeLabel; + private ImageFileChooser imageFileChooser; + + public ImgChoosePane() { + this.initComponents(); + } + + protected void initComponents() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + JPanel previewContainner = new JPanel(); + previewContainner.setBorder(BorderFactory.createTitledBorder(Inter.getLocText("Preview"))); + + previewPane = new ImagePreviewPane(); + previewContainner.add(previewPane); + previewPane.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent evt) { + Image image = ((ImagePreviewPane) evt.getSource()).getImage(); + + if (image == null) { + imgSizeLabel.setText(""); + } else { +// imgSizeLabel.setText(Inter.getLocText("Size") + ": " + image.getWidth(null) + "px" +// + image.getHeight(null) + Inter.getLocText("px")); + imgSizeLabel.setText(Inter.getLocText(new String[]{"Size", "px", "px"}, + new String[]{": " + image.getWidth(null), image.getHeight(null) + ""})); + } + } + }); + + this.add(previewContainner, BorderLayout.CENTER); + + JPanel choosePane = new JPanel(new BorderLayout(0, 10)); + choosePane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); + JPanel choosePane1 = new JPanel(new BorderLayout(0, 10)); + + initButton(); + choosePane.add(chooseButton, BorderLayout.NORTH); + + choosePane1.add(clearButton,BorderLayout.NORTH); + choosePane.add(choosePane1,BorderLayout.CENTER); + + imgSizeLabel = new UILabel(); + imgSizeLabel.setHorizontalAlignment(SwingConstants.CENTER); + choosePane1.add(imgSizeLabel,BorderLayout.CENTER); + this.add(choosePane,BorderLayout.EAST); + + imageFileChooser = new ImageFileChooser(); + } + + private void initButton() { + chooseButton = new UIButton(Inter.getLocText("Image-Select_Picture")); + chooseButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + + int returnVal = imageFileChooser.showOpenDialog(ImgChoosePane.this); + if (returnVal != JFileChooser.CANCEL_OPTION) { + File selectedFile = imageFileChooser.getSelectedFile(); + if (selectedFile != null && selectedFile.isFile()) { + Image image = BaseUtils.readImage(selectedFile.getPath()); + previewPane.setImage(image); + previewPane.repaint(); + } else { + previewPane.setImage(null); + } + } + } + }); + + clearButton = new UIButton(Inter.getLocText("Clear")); + clearButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + previewPane.setImage(null); + previewPane.repaint(); + } + }); + } + + public void populate(ImageBackground background) { + if(background != null && background.getImage() != null) { + previewPane.setImage(background.getImage()); + } + } + + public ImageBackground update() { + if(previewPane.getImage() == null) { + return null; + } + return new ImageBackground(previewPane.getImage()); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("Image"); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/frpane/JTreeAutoBuildPane.java b/designer-base/src/com/fr/design/gui/frpane/JTreeAutoBuildPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/frpane/JTreeAutoBuildPane.java rename to designer-base/src/com/fr/design/gui/frpane/JTreeAutoBuildPane.java diff --git a/designer-base/src/com/fr/design/gui/frpane/JTreeControlPane.java b/designer-base/src/com/fr/design/gui/frpane/JTreeControlPane.java new file mode 100644 index 0000000000..b83959d440 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/JTreeControlPane.java @@ -0,0 +1,270 @@ +package com.fr.design.gui.frpane; + +import com.fr.base.BaseUtils; +import com.fr.data.impl.TreeNodeAttr; +import com.fr.data.impl.TreeNodeWrapper; +import com.fr.design.actions.UpdateAction; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.controlpane.ControlPane; +import com.fr.design.gui.controlpane.NameableCreator; +import com.fr.design.gui.controlpane.UnrepeatedNameHelper; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.menu.ToolBarDef; +import com.fr.form.ui.TreeEditor; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.general.NameObject; +import com.fr.stable.Nameable; + +import javax.swing.*; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.util.ArrayList; +import java.util.List; + +public class JTreeControlPane extends ControlPane { + // 添加一个treeNode + private AddTreeNodeAction addTreeNode; + // 移除一个treeNode + private RemoveTreeNodeAction removeTreeNode; + + private BasicBeanPane updatePane; + + private JTree tree; + private DefaultTreeModel defaultTreeModel; + + + boolean isEditor = false; + + private UICheckBox isPerformanceFirst; + + public JTreeControlPane(NameableCreator[] creators, BasicBeanPane updatePane, boolean isEditor) { + this.initComponents(creators, updatePane); + this.isEditor = isEditor; + } + + private void initComponents(NameableCreator[] creators, BasicBeanPane updatePane) { + this.setLayout(new BorderLayout(2, 2)); + this.updatePane = updatePane; + // LeftPane + JPanel leftPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + JPanel northPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane(); + DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(Inter.getLocText("FR-Designer_Root")); + defaultTreeModel = new DefaultTreeModel(rootNode); + DefaultMutableTreeNode firstLayer = new DefaultMutableTreeNode(new NameObject(Inter.getLocText("FR-Designer_Gradation") + 1, new TreeNodeAttr())); + tree = new JTree(defaultTreeModel); + tree.setRootVisible(false); + ((DefaultMutableTreeNode) defaultTreeModel.getRoot()).getLastLeaf().add(firstLayer); + tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + leftPane.add(new UIScrollPane(tree), BorderLayout.CENTER); + tree.addTreeSelectionListener(new TreeSelectionListener() { + public void valueChanged(TreeSelectionEvent e) { + JTreeControlPane.this.updatePane.updateBean(); + refreshCurrentUpdatePane(); + checkButtonEnabled(); + } + }); + tree.setPreferredSize(new Dimension(170, 350)); + tree.setCellRenderer(renderer); + + // JTreeControlPane控制栏 + ToolBarDef toolbarDef = new ToolBarDef(); + toolbarDef.addShortCut(addTreeNode = new AddTreeNodeAction(creators)); + toolbarDef.addShortCut(removeTreeNode = new RemoveTreeNodeAction()); + UIToolbar toolBar = ToolBarDef.createJToolBar(); + toolbarDef.updateToolBar(toolBar); + leftPane.add(toolBar, BorderLayout.NORTH); + + + isPerformanceFirst = new UICheckBox(Inter.getLocText("FR-Designer_Performance_First")); + northPane.add(new UILabel(" ")); + northPane.add(isPerformanceFirst); + this.add(northPane, BorderLayout.NORTH); + this.add(leftPane, BorderLayout.WEST); + this.add(this.updatePane, BorderLayout.CENTER); + + this.checkButtonEnabled(); + } + + @Override + protected String title4PopupWindow() { + return "tree"; + } + + private void checkButtonEnabled() { + this.addTreeNode.setEnabled(true); + this.removeTreeNode.setEnabled(true); + + // richer:当选择了树根节点时,不能被删除、上移和下移 + DefaultMutableTreeNode root = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); + TreePath rootPath = new TreePath(defaultTreeModel.getPathToRoot(root)); + if (ComparatorUtils.equals(rootPath, tree.getSelectionPath())) { + this.removeTreeNode.setEnabled(false); + } + } + + public void populate(NameObject nameObject) { + // 重新添加tree节点的时候需要remove掉原来的所有子节点 + ((DefaultMutableTreeNode) defaultTreeModel.getRoot()).removeAllChildren(); + Object obj = nameObject.getObject(); + TreeNodeAttr[] treeNodeAttr = null; + if (obj instanceof TreeNodeAttr[]) { + treeNodeAttr = ((TreeNodeAttr[]) obj); + isPerformanceFirst.setSelected(false); + } else if (obj instanceof TreeEditor) { + TreeEditor treeEditor = (TreeEditor) obj; + treeNodeAttr = treeEditor.getTreeNodeAttr(); + isPerformanceFirst.setSelected(treeEditor.isPerformanceFirst()); + } else if (obj instanceof TreeNodeWrapper) { + treeNodeAttr = ((TreeNodeWrapper) obj).getTreeNodeAttrs(); + isPerformanceFirst.setSelected(((TreeNodeWrapper) obj).isPerformanceFirst()); + } + + int count = treeNodeAttr == null ? 0 : treeNodeAttr.length; + //将树的层次一层一层的加上去 + DefaultMutableTreeNode node4root = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); + for (int i = 0; i < count; i++) { + + DefaultMutableTreeNode node4add = new DefaultMutableTreeNode( + new NameObject(Inter.getLocText("FR-Designer_Gradation") + (i + 1), treeNodeAttr[i])); + node4root.add(node4add); + node4root = node4add; + } + + defaultTreeModel.reload(); + expandAll(tree, true); + tree.setSelectionRow(0); + } + + public NameObject update() { + if (isEditor) { + TreeEditor treeEditor = new TreeEditor(); + + treeEditor.setTreeNodeAttr(updateTreeNodeAttr()); + + treeEditor.setPerformanceFirst(isPerformanceFirst.isSelected()); + + return new NameObject("tree", treeEditor); + } else { + TreeNodeWrapper treeNodeWrapper = new TreeNodeWrapper(isPerformanceFirst.isSelected(), updateTreeNodeAttr()); + return new NameObject("tree", treeNodeWrapper); + } + } + + public TreeNodeAttr[] updateTreeNodeAttr() { + updatePane.updateBean(); + DefaultMutableTreeNode root = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); + List nodeList = new ArrayList(); + + for (; root != null; root = root.getNextNode()) { + if (!(root.getUserObject() instanceof NameObject)) { + continue; + } + NameObject no = (NameObject) root.getUserObject(); + if (no.getObject() instanceof TreeNodeAttr) { + nodeList.add((TreeNodeAttr) no.getObject()); + } + } + + return nodeList.toArray(new TreeNodeAttr[nodeList.size()]); + } + + public void refreshCurrentUpdatePane() { + TreePath selectTreePath = this.tree.getSelectionPath(); + if (selectTreePath != null) { + Object object = ((DefaultMutableTreeNode) selectTreePath.getLastPathComponent()).getUserObject(); + if (object != null) { + JTreeControlPane.this.updatePane.populateBean(object); + } + } + } + + + private class AddTreeNodeAction extends UpdateAction { + private NameableCreator creator; + + public AddTreeNodeAction(NameableCreator[] creators) { + this.creator = creators[0]; + this.setName(Inter.getLocText("FR-Designer_Add")); + this.setMnemonic('A'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png")); + } + + public void actionPerformed(ActionEvent e) { + // TODO add tree node + final DefaultMutableTreeNode node = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); + Nameable nameable = creator.createNameable(new UnrepeatedNameHelper() { + + @Override + public String createUnrepeatedName(String prefix) { + DefaultMutableTreeNode innerNode = node; + int nodeCount = 0; + do { + nodeCount++; + } while ((innerNode = innerNode.getNextNode()) != null); + return prefix + nodeCount; + } + }); + + + node.getLastLeaf().add(new DefaultMutableTreeNode(nameable)); + defaultTreeModel.reload(); + TreePath path = new TreePath(defaultTreeModel.getPathToRoot(node.getLastLeaf())); + tree.setSelectionPath(path); + } + } + + private class RemoveTreeNodeAction extends UpdateAction { + public RemoveTreeNodeAction() { + this.setName(Inter.getLocText("FR-Designer_Remove")); + this.setMnemonic('R'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + } + + public void actionPerformed(ActionEvent e) { + // TODO remove tree node + int val = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Utils-Are_you_sure_to_remove_the_selected_item") + "?", + Inter.getLocText("FR-Designer_Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (val != JOptionPane.OK_OPTION) { + return; + } + TreePath selectionPath = tree.getSelectionPath(); + DefaultMutableTreeNode tmpNode = (DefaultMutableTreeNode) selectionPath.getLastPathComponent(); + tmpNode.removeFromParent(); + defaultTreeModel.reload(); + DefaultMutableTreeNode node = (DefaultMutableTreeNode) defaultTreeModel.getRoot(); + TreePath path = new TreePath(defaultTreeModel.getPathToRoot(node.getLastLeaf())); + tree.setSelectionPath(path); + } + } + + TreeCellRenderer renderer = new DefaultTreeCellRenderer() { + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + if (leaf) { + this.setIcon(BaseUtils.readIcon("com/fr/design/images/data/default_widget.png")); + } else { + this.setIcon(BaseUtils.readIcon("com/fr/design/images/data/arrow_branch.png")); + } + + if (value instanceof DefaultMutableTreeNode) { + DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; + Object userObj = node.getUserObject(); + if (userObj instanceof NameObject) { + this.setText(((NameObject) userObj).getName()); + } + } + this.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 0)); + return this; + } + }; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/LimitedDocument.java b/designer-base/src/com/fr/design/gui/frpane/LimitedDocument.java new file mode 100644 index 0000000000..01bfd24c21 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/LimitedDocument.java @@ -0,0 +1,46 @@ +package com.fr.design.gui.frpane; + +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.PlainDocument; + +public class LimitedDocument extends PlainDocument { + + private int maxLength = -1; + private String allowCharAsString = null; + + public LimitedDocument() { + super(); + } + + public LimitedDocument(int maxLength, String str) { + super(); + this.maxLength = maxLength; + allowCharAsString = str; + } + + @Override + public void insertString(int offset, String str, AttributeSet attrSet) + throws BadLocationException { + + if (str == null) { + return; + } + + if (allowCharAsString != null && str.length() == 1) { + if (allowCharAsString.indexOf(str) == -1) { + return; + } + } + + char[] charVal = str.toCharArray(); + String strOldValue = getText(0, getLength()); + byte[] tmp = strOldValue.getBytes(); + + if (maxLength != -1 && (tmp.length + charVal.length > maxLength)) { + return; + } + + super.insertString(offset, str, attrSet); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/ListenerUpdatePane.java b/designer-base/src/com/fr/design/gui/frpane/ListenerUpdatePane.java new file mode 100644 index 0000000000..3845799c1d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/ListenerUpdatePane.java @@ -0,0 +1,53 @@ +package com.fr.design.gui.frpane; + + +import java.awt.BorderLayout; + +import com.fr.general.Inter; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.javascript.JavaScriptActionPane; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.form.event.Listener; + +public abstract class ListenerUpdatePane extends BasicBeanPane { + private JavaScriptActionPane actionPane; + + private Listener editing; + + public ListenerUpdatePane() { + this.initComponents(); + } + + protected void initComponents(){ + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.add(actionPane = createJavaScriptActionPane(), BorderLayout.CENTER); + } + + protected abstract JavaScriptActionPane createJavaScriptActionPane(); + + protected abstract boolean supportCellAction(); + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer_Event"); + } + + @Override + public void populateBean(Listener ob) { + editing = ob; + actionPane.reset(); + actionPane.populateBean(ob.getAction()); + } + + @Override + public Listener updateBean() { + editing.setAction(actionPane.updateBean()); + + return editing; + } + + @Override + public void checkValid() throws Exception{ + actionPane.checkValid(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/LoadingBasicPane.java b/designer-base/src/com/fr/design/gui/frpane/LoadingBasicPane.java new file mode 100644 index 0000000000..db89371fd5 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/LoadingBasicPane.java @@ -0,0 +1,90 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.frpane; + +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.utils.gui.LayoutUtils; +import com.fr.general.Inter; + +import javax.swing.*; +import java.awt.*; + +/** + * @author richer + * @since 6.5.5 创建于2011-6-16 会显示正在加载的标志 + * august:改成不确定式 + */ +public abstract class LoadingBasicPane extends BasicPane { + private CardLayout card; + private JPanel container; + private JProgressBar progressBar; + public LoadingBasicPane() { + initCards(); + new SwingWorker() { + + @Override + protected Integer doInBackground() throws Exception { + initComponents(container); + return 0; + } + + @Override + protected void done() { + complete(); + LayoutUtils.layoutRootContainer(LoadingBasicPane.this); + card.show(LoadingBasicPane.this, "CONTAINER"); + } + + }.execute(); + } + + + private void initCards() { + card = new CardLayout(); + setLayout(card); + JPanel loadingDisPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + String[] message = {"Loading","Please-Wait"}; + String[] operator = {",","..."}; + UILabel loadingPane = new UILabel(Inter.getLocText(message,operator) , SwingConstants.CENTER); + loadingDisPane.add(loadingPane, BorderLayout.CENTER); + progressBar = new JProgressBar(); + progressBar.setIndeterminate(true); + loadingDisPane.add(progressBar, BorderLayout.SOUTH); + + add("LOADING", loadingDisPane); + container = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + add("CONTAINER", container); + card.show(this, "LOADING"); + + + } + + protected void renameConnection(String oldName,String newName){ + + } + + protected void initComponents(JPanel container) { + + } + + /** + * 为了alphafine搜索使用,预加载面板控件,获取全部控件的信息 + * @return + */ + public JPanel getAllComponents() { + JPanel panel = new JPanel(); + initComponents(panel); + return panel; + } + + /** + * 完成时 + */ + public void complete() { + + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/LoadingBasicPaneTest.java b/designer-base/src/com/fr/design/gui/frpane/LoadingBasicPaneTest.java new file mode 100644 index 0000000000..d92d604106 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/LoadingBasicPaneTest.java @@ -0,0 +1,41 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.frpane; + +import javax.swing.JPanel; + +import com.fr.base.FRContext; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.dialog.BasicDialog; +import com.fr.general.Inter; + +/** + * @author richer + * @since 6.5.5 创建于2011-6-16 + */ +public class LoadingBasicPaneTest { + + public static void main(String[] args) { + LoadingBasicPane lb = new LoadingBasicPane() { + protected void initComponents(JPanel container) { + for (int i = 0; i < 10; i++) { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + container.add(new UIButton(i + "adfadwdadawdwad")); + } + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("Test") ; + } + }; + BasicDialog dlg = lb.showWindow(null); + dlg.setVisible(true); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/ObjectProperiesPane.java b/designer-base/src/com/fr/design/gui/frpane/ObjectProperiesPane.java new file mode 100644 index 0000000000..3b3f8cccac --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/ObjectProperiesPane.java @@ -0,0 +1,164 @@ +package com.fr.design.gui.frpane; + +import com.fr.base.BaseUtils; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.editor.ValueEditorPane; +import com.fr.design.editor.ValueEditorPaneFactory; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +import com.fr.general.NameObject; +import com.fr.stable.ListMap; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.Iterator; + + +public class ObjectProperiesPane extends BasicBeanPane { + private UIButton addButton; + private JPanel selectedItemPane; + private java.util.List propertyPaneList = new ArrayList(); + + public ObjectProperiesPane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + JPanel buttonPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.addButton = new UIButton(Inter.getLocText("Add") + " " +Inter.getLocText("Property")); + buttonPane.add(this.addButton, BorderLayout.WEST); + this.add(buttonPane, BorderLayout.NORTH); + + this.addButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + addPropertyPane(new PropertyPane()); + ObjectProperiesPane.this.validate(); + ObjectProperiesPane.this.repaint(); + } + }); + + selectedItemPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_S_Pane(); +// selectedItemPane.setLayout(new BoxLayout(selectedItemPane,BoxLayout.Y_AXIS)); + + JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + northPane.add(selectedItemPane, BorderLayout.NORTH); + + JScrollPane selectedItemScrollPane = new JScrollPane(); + selectedItemScrollPane.setViewportView(northPane); + selectedItemScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + this.add(selectedItemScrollPane, BorderLayout.CENTER); + } + + @Override + protected String title4PopupWindow() { + return "property"; + } + + @Override + public void populateBean(ListMap propertyMap) { + this.selectedItemPane.removeAll(); + this.propertyPaneList.removeAll(propertyPaneList); + + Iterator iterator = propertyMap.entrySet().iterator(); + while (iterator.hasNext()) { + java.util.Map.Entry entry = (java.util.Map.Entry)iterator.next(); + String key = (String)entry.getKey(); + Object obj = entry.getValue(); + PropertyPane propertyPane = new PropertyPane(); + propertyPane.populate(new NameObject(key, obj)); + addPropertyPane(propertyPane); + } + + ObjectProperiesPane.this.validate(); + ObjectProperiesPane.this.repaint(); + } + + /** + * set addButton enable state + * @param enable + */ + public void enableAddButton(boolean enable) { + this.addButton.setEnabled(enable); + } + + /** + * add propertyPane + * @param propertyPane + */ + public void addPropertyPane(PropertyPane propertyPane) { + this.selectedItemPane.add(propertyPane); + this.propertyPaneList.add(propertyPane); + } + + /** + * remove propertyPane + * @param propertyPane + */ + public void removePropertyPane(PropertyPane propertyPane) { + this.selectedItemPane.remove(propertyPane); + this.propertyPaneList.remove(propertyPane); + } + + @Override + public ListMap updateBean() { + ListMap propertyMap = new ListMap(); + + for (int i = 0; i < propertyPaneList.size(); i ++) { + NameObject nameO = ((PropertyPane)propertyPaneList.get(i)).update(); + propertyMap.put(nameO.getName(), nameO.getObject()); + } + + return propertyMap; + } + + public class PropertyPane extends JPanel { + private UITextField nameField; + private ValueEditorPane valueEditorPane; + + public PropertyPane () { + this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); + + UIButton cancel = new UIButton(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + cancel.setToolTipText(Inter.getLocText("Remove")); + cancel.addActionListener(cancleListener); + cancel.setMargin(new Insets(0, 0, 0, 0)); + this.add(cancel); + + this.add(new UILabel(Inter.getLocText("Name")+":")); + this.nameField = new UITextField(6); + this.add(this.nameField); + + this.add(new UILabel(Inter.getLocText("Value")+ ":")); + this.valueEditorPane = ValueEditorPaneFactory.createExtendedValueEditorPane(); + this.add(this.valueEditorPane); + } + + public void populate(NameObject nameObject) { + if (nameObject == null) { + return; + } + this.nameField.setText(nameObject.getName()); + this.valueEditorPane.populate(nameObject.getObject()); + } + + public NameObject update() { + NameObject nameO = new NameObject(); + nameO.setName(this.nameField.getText()); + nameO.setObject(this.valueEditorPane.update()); + return nameO; + } + + ActionListener cancleListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + removePropertyPane(PropertyPane.this); + ObjectProperiesPane.this.validate(); + ObjectProperiesPane.this.repaint(); + } + }; + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/frpane/RegFieldPane.java b/designer-base/src/com/fr/design/gui/frpane/RegFieldPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/frpane/RegFieldPane.java rename to designer-base/src/com/fr/design/gui/frpane/RegFieldPane.java diff --git a/designer_base/src/com/fr/design/gui/frpane/RegPane.java b/designer-base/src/com/fr/design/gui/frpane/RegPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/frpane/RegPane.java rename to designer-base/src/com/fr/design/gui/frpane/RegPane.java diff --git a/designer-base/src/com/fr/design/gui/frpane/ReportletParameterViewPane.java b/designer-base/src/com/fr/design/gui/frpane/ReportletParameterViewPane.java new file mode 100644 index 0000000000..5942570d72 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/ReportletParameterViewPane.java @@ -0,0 +1,146 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.frpane; + +import com.fr.base.Parameter; +import com.fr.base.core.KV; +import com.fr.design.dialog.BasicPane; +import com.fr.design.editor.ValueEditorPane; +import com.fr.design.editor.ValueEditorPaneFactory; +import com.fr.design.gui.itableeditorpane.ParameterTableModel; +import com.fr.design.gui.itableeditorpane.UITableEditAction; +import com.fr.design.gui.itableeditorpane.UITableEditorPane; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; +import com.fr.stable.ArrayUtils; +import com.fr.stable.ParameterProvider; + +import javax.swing.event.TableModelListener; +import java.awt.*; +import java.util.List; + +/** + * Defin hyperlink. + * in fact,this is a TablEditorPane + * + * @editor zhou + * @since 2012-3-23下午3:48:10 + */ +public class ReportletParameterViewPane extends BasicPane { + private UITableEditorPane editorPane; + + public ReportletParameterViewPane() { + this(null, ParameterTableModel.NO_CHART_USE); + } + + // kunsnat: 控制是否用Chart的热点链接actions + public ReportletParameterViewPane(int useParaType) { + this(null, useParaType); + } + + public ReportletParameterViewPane(UITableEditAction[] actions, int useParaType) { + this(actions, useParaType, ValueEditorPaneFactory.createVallueEditorPaneWithUseType(useParaType), + ValueEditorPaneFactory.createVallueEditorPaneWithUseType(useParaType)); + } + + public ReportletParameterViewPane(int useParaType, ValueEditorPane valueEditorPane, ValueEditorPane valueRenderPane) { + this(null, useParaType, valueEditorPane, valueRenderPane); + } + + public ReportletParameterViewPane(UITableEditAction[] actions, int useParaType, ValueEditorPane valueEditorPane, ValueEditorPane valueRenderPane) { + this.initComponent(actions, useParaType, valueEditorPane, valueRenderPane); + } + + /** + * 初始化组件 + * + * @param actions Chart的热点链接actions + * @param useParaType 类型 + */ + public void initComponent(final UITableEditAction[] actions, int useParaType, ValueEditorPane valueEditorPane, ValueEditorPane valueRenderPane) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + if (useParaType != ParameterTableModel.NO_CHART_USE) { + ParameterTableModel model = new ParameterTableModel(valueEditorPane, valueRenderPane, this) { + @Override + public UITableEditAction[] createAction() { + UITableEditAction[] tableEditActions = new UITableEditAction[]{new AddChartParameterAction(), new DeleteAction(this.component), + new MoveUpAction(), new MoveDownAction()}; + return (UITableEditAction[]) ArrayUtils.addAll(tableEditActions, actions); + } + }; + editorPane = new UITableEditorPane(model); + } else { + editorPane = new UITableEditorPane(new ParameterTableModel() { + @Override + public UITableEditAction[] createAction() { + return (UITableEditAction[]) ArrayUtils.addAll(super.createAction(), actions); + } + }); + } + + this.add(editorPane, BorderLayout.CENTER); + } + + + /** + * 增加事件监听 + * + * @param l 加的东东 + */ + public void addTableEditorListener(TableModelListener l) { + editorPane.addTableListener(l); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("Parameters"); + } + + public void populate(ParameterProvider[] parameters) { + if (parameters == null) { + return; + } + editorPane.populate(parameters); + } + + public void populate(KV[] kv) { + if (kv == null) { + return; + } + Parameter[] parameters = new Parameter[kv.length]; + for (int i = 0; i < kv.length; i++) { + parameters[i] = new Parameter(kv[i].getKey(), kv[i].getValue()); + } + this.populate(parameters); + } + + public List update() { + return editorPane.update(); + } + + public void update(List list) { + editorPane.update(list); + } + + + /** + * 更新 + * + * @return 数组 + */ + public KV[] updateKV() { + List list = this.update(); + int length = list.size(); + KV[] kv = new KV[length]; + for (int i = 0; i < length; i++) { + kv[i] = new KV(); + kv[i].setKey(list.get(i).getName()); + kv[i].setValue(list.get(i).getValue()); + } + return kv; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/TemplateParameterPane.java b/designer-base/src/com/fr/design/gui/frpane/TemplateParameterPane.java new file mode 100644 index 0000000000..7ed1f84fa9 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/TemplateParameterPane.java @@ -0,0 +1,89 @@ +package com.fr.design.gui.frpane; + +import java.awt.BorderLayout; +import java.awt.Component; + +import javax.swing.BorderFactory; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JPanel; + +import com.fr.base.Parameter; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.dialog.BasicPane; +import com.fr.design.editor.ValueEditorPane; +import com.fr.design.editor.ValueEditorPaneFactory; +import com.fr.general.Inter; + +/** + * 模板的参数添加面板 + * @since 6.5.4 + */ +public class TemplateParameterPane extends BasicPane { + private UITextField nameTextField; + private ValueEditorPane valuePane; + + public TemplateParameterPane() { + this.initComponents(); + } + + public void initComponents() { + this.setBorder(BorderFactory.createTitledBorder(Inter.getLocText("Parameter"))); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + + JPanel northPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.add(northPane, BorderLayout.NORTH); +// northPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + + JPanel defaultPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); + northPane.add(defaultPane, BorderLayout.CENTER); + UILabel nameLabel = new UILabel(Inter.getLocText("Name") + ":"); + UILabel valueLabel = new UILabel(Inter.getLocText("Value") + ":"); + + nameTextField = new UITextField(12); + valuePane = ValueEditorPaneFactory.createBasicValueEditorPane(); + double i = TableLayout.PREFERRED; + double j = TableLayout.FILL; + double[] column = {i, j}; + double[] row = {i, i}; + Component[][] coms = {{nameLabel, nameTextField}, {valueLabel, valuePane}}; + JPanel centerPane = TableLayoutHelper.createTableLayoutPane(coms, row, column); + defaultPane.add(centerPane, BorderLayout.CENTER); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("Parameter"); + } + + public void populate(Parameter parameter) { + if (parameter == null) { + return; + } + + nameTextField.setText(parameter.getName()); + valuePane.populate(parameter.getValue()); + } + + public Parameter update() { + Parameter parameter = new Parameter(); + + parameter.setName(this.nameTextField.getText()); + parameter.setValue(valuePane.update()); + return parameter; + } + + /** + * Check valid. + */ + @Override + public void checkValid() throws Exception { + Parameter parameter = this.update(); + if (parameter.getName() == null || parameter.getName().trim().length() <= 0) { + throw new Exception(Inter.getLocText("ParameterD-Parameter_name_cannot_be_null") + "."); + } + this.valuePane.checkValid(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/TreeSettingPane.java b/designer-base/src/com/fr/design/gui/frpane/TreeSettingPane.java new file mode 100644 index 0000000000..31e5e67dcc --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/TreeSettingPane.java @@ -0,0 +1,270 @@ +package com.fr.design.gui.frpane; + +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.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_DataTable-Build"), + Inter.getLocText("FR-Designer_Auto-Build"), Inter.getLocText("FR-Designer_Layer-Build")}; + + public TreeSettingPane(boolean isEditor) { + this.initComponents(isEditor); + } + + private void initComponents(boolean isEditor) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel buildWayPanel= FRGUIPaneFactory.createMediumHGapFlowInnerContainer_M_Pane(); + buildWayPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + UILabel buildWayLabel = new UILabel(Inter.getLocText("FR-Designer_Build-Way") + " :"); + buildWayPanel.add(buildWayLabel); + buildBox = new UIComboBox(buildWay); + buildBox.addItemListener(new ItemListener() { + + @Override + public void itemStateChanged(ItemEvent e) { + cardChanged(buildBox.getSelectedIndex()); + } + }); + buildWayPanel.add(buildBox); + + 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.remove(layerDataControlPane); + switch (index) { + case 0: + this.add(layerDataControlPane); + break; + case 1: + this.add(autoBuildPane); + break; + case 2: + this.add(controlPane); + + break; + default: + break; + } + validate(); + repaint(); + revalidate(); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("FR-Designer_Create_Tree"); + } + + @Override + public JComponent toSwingComponent() { + return this; + } + + NameableCreator treeNode = new NameObjectCreator( + Inter.getLocText("FR-Designer_Gradation"), + "/com/fr/design/images/data/source/jdbcTableData.png", + TreeNodeAttr.class); + + /** + * + * @param treeEditor + */ + public void populate(TreeEditor treeEditor) { + boolean isAutoBuild = treeEditor.isAutoBuild(); + TreeAttr treeAttr = treeEditor.getTreeAttr(); + if (treeAttr != null) { + NameObject no = new NameObject("name", treeEditor); + controlPane.populate(no); + } + if (isAutoBuild) { + buildBox.setSelectedIndex(1); + TableDataDictionary dictionary = treeEditor.getDictionary(); + autoBuildPane.populate(dictionary); + } 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); + } + } + + /** + * 视图树的update + * @return + */ + public TreeEditor updateTreeEditor() { +// NameObject no = this.controlPane.update(); +// if (no != null) { +// return ((TreeEditor) no.getObject()); +// } +// +// return null; + TreeEditor te = new TreeEditor(); + if (buildBox.getSelectedIndex() == 1) { + TableDataDictionary dictionary = this.autoBuildPane.update(); + te.setAutoBuild(true); + te.setLayerBuild(false); + te.setDictionary(dictionary); + te.setNodeOrDict(dictionary); + } else if (buildBox.getSelectedIndex() == 2) { + te.setAutoBuild(false); + te.setLayerBuild(false); + NameObject no = this.controlPane.update(); + if (no != null) { + TreeEditor editor = (TreeEditor) no.getObject(); + te.setAllowBlank(editor.isAllowBlank()); + te.setEnabled(editor.isEnabled()); + te.setDirectEdit(editor.isDirectEdit()); + te.setErrorMessage(editor.getErrorMessage()); + te.setWidgetName(editor.getWidgetName()); + te.setVisible(editor.isVisible()); + te.setWaterMark(editor.getWaterMark()); + te.setRemoveRepeat(editor.isRemoveRepeat()); + te.setTreeAttr(editor.getTreeAttr()); + te.setTreeNodeAttr(editor.getTreeNodeAttr()); + te.setNodeOrDict(editor.getTreeNodeAttr()); + te.setPerformanceFirst(editor.isPerformanceFirst()); + } + } else { + LayerConfig[] configs = (LayerConfig[]) layerDataControlPane.update().getObject(); + te.setAutoBuild(false); + te.setLayerBuild(true); + te.setLayerConfigs(Arrays.asList(configs)); + } + return te; + } + + /** + * 树节点属性的update + * @return + */ + public Object updateTreeNodeAttrs() { + + 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(); + } + return null; + } + + /** + * 下拉树的update + * @return + */ + public TreeComboBoxEditor updateTreeComboBox() { + TreeComboBoxEditor tcb = new TreeComboBoxEditor(); + if (buildBox.getSelectedIndex() == 1) { + TableDataDictionary dictionary = this.autoBuildPane.update(); + tcb.setAutoBuild(true); + 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()); + tcb.setEnabled(editor.isEnabled()); + tcb.setDirectEdit(editor.isDirectEdit()); + tcb.setErrorMessage(editor.getErrorMessage()); + tcb.setWidgetName(editor.getWidgetName()); + tcb.setVisible(editor.isVisible()); + tcb.setWaterMark(editor.getWaterMark()); + tcb.setRemoveRepeat(editor.isRemoveRepeat()); + tcb.setTreeAttr(editor.getTreeAttr()); + tcb.setTreeNodeAttr(editor.getTreeNodeAttr()); + 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; + } + + /** + * + * @param nodeOrDict + */ + public void populate(Object nodeOrDict) { + if(nodeOrDict instanceof TreeNodeAttr[] || nodeOrDict instanceof TreeNodeWrapper) { + 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/UIAdvancedTextPane.java b/designer-base/src/com/fr/design/gui/frpane/UIAdvancedTextPane.java new file mode 100644 index 0000000000..937457c0bd --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UIAdvancedTextPane.java @@ -0,0 +1,199 @@ +package com.fr.design.gui.frpane; + +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import javax.swing.Action; +import javax.swing.KeyStroke; +import javax.swing.event.DocumentEvent; +import javax.swing.event.UndoableEditEvent; +import javax.swing.event.UndoableEditListener; +import javax.swing.text.AbstractDocument.DefaultDocumentEvent; +import javax.swing.text.Document; +import javax.swing.undo.UndoManager; +import javax.swing.undo.UndoableEdit; + +import com.fr.base.BaseUtils; +import com.fr.design.actions.UpdateAction; +import com.fr.design.menu.KeySetUtils; +import com.fr.general.Inter; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + +/** + * p:这是一个增强的JTextPane,支持很多Action + */ +public class UIAdvancedTextPane extends UITextPane { + /** + * + */ + private static final long serialVersionUID = 1L; + private UpdateAction undoAction, redoAction, + cutAction, copyAction, pasteAction; + private UndoManager undoManager = new UndoManager(); + + /** + * Constructor + */ + public UIAdvancedTextPane() { + undoAction = new UndoAction(); + redoAction = new RedoAction(); + cutAction = new CutAction(); + copyAction = new CopyAction(); + pasteAction = new PasteAction(); + + applyDocument(); + + //p:当调用setDocument()方法的时候,调用这个property change的方法. + this.addPropertyChangeListener("document", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + applyDocument(); + } + }); + } + + //p:将Listener加到Document里面 + private void applyDocument() { + Document textDocument = getDocument(); + textDocument.addUndoableEditListener(new UndoableEditListener() { + public void undoableEditHappened(UndoableEditEvent evt) { + UndoableEdit undoableEdit = evt.getEdit(); + if(undoableEdit instanceof DefaultDocumentEvent) { + DefaultDocumentEvent comEdit = (DefaultDocumentEvent) undoableEdit; + if(comEdit.getType() == DocumentEvent.EventType.CHANGE) { + return; + } + } + + undoManager.addEdit(evt.getEdit()); + } + }); + this.getInputMap().put((KeyStroke)undoAction.getValue(Action.ACCELERATOR_KEY), "undo"); + this.getInputMap().put((KeyStroke)redoAction.getValue(Action.ACCELERATOR_KEY), "redo"); + this.getActionMap().put("undo", undoAction); + this.getActionMap().put("redo", redoAction); + } + + public UpdateAction getUndoAction() { + return undoAction; + } + + public UpdateAction getRedoAction() { + return redoAction; + } + + public UpdateAction getCutAction() { + return cutAction; + } + + public UpdateAction getCopyAction() { + return copyAction; + } + + public UpdateAction getPasteAction() { + return pasteAction; + } + + private class UndoAction extends UpdateAction { + public UndoAction() { + this.setMenuKeySet(KeySetUtils.UNDO); + this.setName(getMenuKeySet().getMenuKeySetName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/undo.png")); + this.setAccelerator(getMenuKeySet().getKeyStroke()); + } + + public void actionPerformed(ActionEvent evt) { + if(undoManager.canUndo()) { + undoManager.undo(); + requestFocus(); + } + } + + @Override + public boolean isEnabled() { + return undoManager.canUndo(); + } + } + + class RedoAction extends UpdateAction { + public RedoAction() { + this.setMenuKeySet(KeySetUtils.REDO); + this.setName(getMenuKeySet().getMenuKeySetName()); + this.setMnemonic(getMenuKeySet().getMnemonic()); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/redo.png")); + this.setAccelerator(getMenuKeySet().getKeyStroke()); + } + + public void actionPerformed(ActionEvent evt) { + if(undoManager.canRedo()) { + undoManager.redo(); + requestFocus(); + } + } + + @Override + public boolean isEnabled() { + return undoManager.canRedo(); + } + } + + private class CutAction extends UpdateAction { + public CutAction() { + setName(Inter.getLocText("M_Edit-Cut")); + setMnemonic('T'); + setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png")); + setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DEFAULT_MODIFIER)); + } + + public void actionPerformed(ActionEvent evt) { + cut(); + requestFocus(); + } + + @Override + public boolean isEnabled() { + return UIAdvancedTextPane.this.getSelectedText() == null; + } + } + + private class CopyAction extends UpdateAction { + public CopyAction() { + this.setName(Inter.getLocText("M_Edit-Copy")); + this.setMnemonic('C'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER)); + } + + public void actionPerformed(ActionEvent evt) { + copy(); + requestFocus(); + } + + @Override + public boolean isEnabled() { + return UIAdvancedTextPane.this.getSelectedText() == null; + } + } + + private class PasteAction extends UpdateAction { + public PasteAction() { + this.setName(Inter.getLocText("M_Edit-Paste")); + this.setMnemonic('P'); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/paste.png")); + this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER)); + } + + public void actionPerformed(ActionEvent evt) { + paste(); + requestFocus(); + } + + @Override + public boolean isEnabled() { + return true; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/UIBasicOptionPaneUI.java b/designer-base/src/com/fr/design/gui/frpane/UIBasicOptionPaneUI.java new file mode 100644 index 0000000000..a33d7e325a --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UIBasicOptionPaneUI.java @@ -0,0 +1,266 @@ +package com.fr.design.gui.frpane; + +import com.fr.design.gui.ibutton.UIButton; +import com.fr.stable.ArrayUtils; +import sun.swing.DefaultLookup; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicOptionPaneUI; +import java.awt.*; +import java.awt.event.ActionListener; +import java.awt.event.HierarchyEvent; +import java.awt.event.HierarchyListener; +import java.util.Locale; + +/** + * Created by zack on 2015/3/3. + */ +public class UIBasicOptionPaneUI extends BasicOptionPaneUI { + private static final int NUM_8 = 8; + private static final int NUM_4 = 4; + + /** + * 创建组件UI + * @param x 组件 + * @return 组件 + */ + public static ComponentUI createUI(JComponent x) { + return new UIBasicOptionPaneUI(); + } + @Override + protected Object[] getButtons() { + if (optionPane != null) { + int minimumWidth = + DefaultLookup.getInt(optionPane, this, + "OptionPane.buttonMinimumWidth", -1); + Object[] suppliedOptions = optionPane.getOptions(); + if (suppliedOptions == null) { + Object[] defaultOptions; + int type = optionPane.getOptionType(); + Locale l = optionPane.getLocale(); + if (type == JOptionPane.YES_NO_OPTION) { + defaultOptions = new ButtonFactory[2]; + defaultOptions[0] = new ButtonFactory( + UIManager.getString("OptionPane.yesButtonText", l), + getMnemonic("OptionPane.yesButtonMnemonic", l), + (Icon)DefaultLookup.get(optionPane, this, + "OptionPane.yesIcon"), minimumWidth); + defaultOptions[1] = new ButtonFactory(UIManager.getString("OptionPane.noButtonText", l), + getMnemonic("OptionPane.noButtonMnemonic", l), + (Icon)DefaultLookup.get(optionPane, this, + "OptionPane.noIcon"), minimumWidth); + } else if (type == JOptionPane.YES_NO_CANCEL_OPTION) { + defaultOptions = getYNCTypeOptions(minimumWidth, l); + } else if (type == JOptionPane.OK_CANCEL_OPTION) { + defaultOptions = new ButtonFactory[2]; + defaultOptions[0] = new ButtonFactory(UIManager.getString("OptionPane.okButtonText",l), + getMnemonic("OptionPane.okButtonMnemonic", l), + (Icon)DefaultLookup.get(optionPane, this, + "OptionPane.okIcon"), minimumWidth); + defaultOptions[1] = new ButtonFactory( + UIManager.getString("OptionPane.cancelButtonText",l), + getMnemonic("OptionPane.cancelButtonMnemonic", l), + (Icon)DefaultLookup.get(optionPane, this, + "OptionPane.cancelIcon"), minimumWidth); + } else { + defaultOptions = new ButtonFactory[1]; + defaultOptions[0] = new ButtonFactory(UIManager.getString("OptionPane.okButtonText",l), + getMnemonic("OptionPane.okButtonMnemonic", l), + (Icon)DefaultLookup.get(optionPane, this, + "OptionPane.okIcon"), minimumWidth); + } + return defaultOptions; + } + Object[] suppliedFlatOptions =new ButtonFactory[suppliedOptions.length]; + for (int i = 0; i < suppliedOptions.length; i++) { + suppliedFlatOptions[i]=new ButtonFactory(suppliedOptions[i].toString(), 0, null, minimumWidth); + } + return suppliedFlatOptions; + } + return ArrayUtils.EMPTY_OBJECT_ARRAY; + } + private int getMnemonic(String key, Locale l) { + String value = (String)UIManager.get(key, l); + + if (value == null) { + return 0; + } + try { + return Integer.parseInt(value); + } + catch (NumberFormatException nfe) { } + return 0; + } + private Object[] getYNCTypeOptions(int minimumWidth, Locale l){ + Object[] defaultOptions = new ButtonFactory[3]; + defaultOptions[0] = new ButtonFactory( + UIManager.getString("OptionPane.yesButtonText", l), + getMnemonic("OptionPane.yesButtonMnemonic", l), + (Icon)DefaultLookup.get(optionPane, this, + "OptionPane.yesIcon"), minimumWidth); + defaultOptions[1] = new ButtonFactory( + UIManager.getString("OptionPane.noButtonText",l), + getMnemonic("OptionPane.noButtonMnemonic", l), + (Icon)DefaultLookup.get(optionPane, this, + "OptionPane.noIcon"), minimumWidth); + defaultOptions[2] = new ButtonFactory( + UIManager.getString("OptionPane.cancelButtonText",l), + getMnemonic("OptionPane.cancelButtonMnemonic", l), + (Icon)DefaultLookup.get(optionPane, this, + "OptionPane.cancelIcon"), minimumWidth); + return defaultOptions; + } + protected void addButtonComponents(Container container, Object[] buttons, + int initialIndex) { + if (ArrayUtils.isNotEmpty(buttons)) { + boolean sizeButtonsToSame = getSizeButtonsToSameWidth(); + boolean createdAll = true; + int numButtons = buttons.length; + JButton[] createdButtons = null; + int maxWidth = 0; + + if (sizeButtonsToSame) { + createdButtons = new JButton[numButtons]; + } + + for(int counter = 0; counter < numButtons; counter++) { + Object button = buttons[counter]; + Component newComponent; + + if (button instanceof Component) { + createdAll = false; + newComponent = (Component)button; + container.add(newComponent); + hasCustomComponents = true; + + } else { + JButton aButton; + + if (button instanceof ButtonFactory) { + aButton = ((ButtonFactory)button).createButton(); + } + else if (button instanceof Icon) + aButton = new JButton((Icon)button); + else + aButton = new JButton(button.toString()); + + aButton.setName("OptionPane.button"); + aButton.setMultiClickThreshhold(DefaultLookup.getInt( + optionPane, this, "OptionPane.buttonClickThreshhold", + 0)); + configureButton(aButton); + + container.add(aButton); + + ActionListener buttonListener = createButtonActionListener(counter); + if (buttonListener != null) { + aButton.addActionListener(buttonListener); + } + newComponent = aButton; + } + if (sizeButtonsToSame && createdAll) { + if ((newComponent instanceof JButton)) { + createdButtons[counter] = (JButton)newComponent; + maxWidth = Math.max(maxWidth, + newComponent.getMinimumSize().width); + } + } + if (counter == initialIndex) { + initialFocusComponent = newComponent; + if (initialFocusComponent instanceof JButton) { + JButton defaultB = (JButton)initialFocusComponent; + defaultB.addHierarchyListener(new HierarchyListener() { + public void hierarchyChanged(HierarchyEvent e) { + if ((e.getChangeFlags() & + HierarchyEvent.PARENT_CHANGED) != 0) { + JButton defaultButton = (JButton) e.getComponent(); + JRootPane root = + SwingUtilities.getRootPane(defaultButton); + if (root != null) { + root.setDefaultButton(defaultButton); + } + } + } + }); + } + } + } + ((ButtonAreaLayout)container.getLayout()). + setSyncAllWidths((sizeButtonsToSame && createdAll)); + /* Set the padding, windows seems to use 8 if <= 2 components, + otherwise 4 is used. It may actually just be the size of the + buttons is always the same, not sure. */ + if (DefaultLookup.getBoolean(optionPane, this, + "OptionPane.setButtonMargin", true)) { + if (sizeButtonsToSame && createdAll) { + JButton aButton; + int padSize; + padSize = (numButtons <= 2 ? NUM_8 : NUM_4); + for(int counter = 0; counter < numButtons; counter++) { + aButton = createdButtons[counter]; + aButton.setMargin(new Insets(2, padSize, 2, padSize)); + } + } + } + } + } + private void configureButton(JButton button) { + Font buttonFont = (Font)DefaultLookup.get(optionPane, this, + "OptionPane.buttonFont"); + if (buttonFont != null) { + button.setFont(buttonFont); + } + } + private static class ButtonFactory { + private String text; + private int mnemonic; + private Icon icon; + private int minimumWidth = -1; + + ButtonFactory(String text, int mnemonic, Icon icon, int minimumWidth) { + this.text = text; + this.mnemonic = mnemonic; + this.icon = icon; + this.minimumWidth = minimumWidth; + } + + JButton createButton() { + JButton button = null; + + if (minimumWidth > 0) { + button = new ConstrainedButton(text, minimumWidth); + } else { + button = new UIButton(text); + } + if (icon != null) { + button.setIcon(icon); + } + if (mnemonic != 0) { + button.setMnemonic(mnemonic); + } + return button; + } + + private static class ConstrainedButton extends JButton { + int minimumWidth; + + ConstrainedButton(String text, int minimumWidth) { + super(text); + this.minimumWidth = minimumWidth; + } + + public Dimension getMinimumSize() { + Dimension min = super.getMinimumSize(); + min.width = Math.max(min.width, minimumWidth); + return min; + } + + public Dimension getPreferredSize() { + Dimension pref = super.getPreferredSize(); + pref.width = Math.max(pref.width, minimumWidth); + return pref; + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/UIBubbleFloatPane.java b/designer-base/src/com/fr/design/gui/frpane/UIBubbleFloatPane.java new file mode 100644 index 0000000000..0a2325cebf --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UIBubbleFloatPane.java @@ -0,0 +1,318 @@ +package com.fr.design.gui.frpane; + +import java.awt.*; +import java.awt.event.AWTEventListener; +import java.awt.event.MouseEvent; + +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +import com.fr.base.FRContext; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.dialog.UIDialog; +import com.fr.stable.Constants; +import com.sun.awt.AWTUtilities; + +/** + * @author Jerry + * 非模态悬浮对话框,气泡形状 + */ +public abstract class UIBubbleFloatPane extends BasicBeanPane { + private static final long serialVersionUID = -6386018511442190959L; + private static int OFF_LEFT = 10; + private static final int ARROR_PARALLEL = 30; + private static final int ARROR_VERTICAL = 20; + private static final int TITLE_HEIGHT = 60; + private static final double TIME_DEFAULT = 0.5; + private static final double TIME_GAP = 0.1; + + private BasicBeanPane contentPane; + private Rectangle bounds; + private int arrowPosition; + private double time = 0.5; + + private UIDialog showDialog; + + /** + * @param arrowPosition 箭头的位置,上下左右,暂时只处理了左边,后面用到了再说 TODO + * @param arrowPoint 箭头的坐标点 + * @param contentPane 对话框中的Panel + */ + public UIBubbleFloatPane(int arrowPosition, Point arrowPoint, BasicBeanPane contentPane) { + this(arrowPosition, arrowPoint, contentPane, contentPane.getPreferredSize().width, contentPane.getPreferredSize().height); + } + + /** + * 这个方法主要用于那些宽度和高度有变化的面板,因为显然外面的气泡要固定大小,不然忽大忽小,体验太差了 + * + * @param arrowPosition 箭头的位置,上下左右,暂时只处理了左边,后面用到了再说 TODO + * @param arrowPoint 箭头的坐标点 + * @param contentPane 对话框中的Panel + * @param width 对话框中的Panel的宽度,写死了 + * @param height 对话框中的Panel的高度,写死了 + */ + public UIBubbleFloatPane(int arrowPosition, Point arrowPoint, BasicBeanPane contentPane, int width, int height) { + this.contentPane = contentPane; + this.arrowPosition = arrowPosition; + this.time = initBoundsTime(arrowPosition, arrowPoint, width, height); + if (arrowPosition == Constants.LEFT) { + this.bounds = new Rectangle(arrowPoint.x - width, (int) (arrowPoint.y - height * time), width, height); + } else if (arrowPosition == Constants.TOP) { + this.bounds = new Rectangle((int) (arrowPoint.x - width * time), arrowPoint.y , width, height); + } else if (arrowPosition == Constants.RIGHT) { + this.bounds = new Rectangle(arrowPoint.x - OFF_LEFT * 2 - width, (int) (arrowPoint.y - height * time), width, height); + } + + initComponents(); + } + + /** + * show对话框 + * @param fatherPane 上一层界面 parentPane + * @param ob 传入的内容,在show之前populate + */ + public void show(JComponent fatherPane, T ob) { + populateBean(ob); + UIDialog dialog = showUnsizedWindow(SwingUtilities.getWindowAncestor(fatherPane)); + showDialog = dialog; + Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); + dialog.setVisible(true); + } + + /** + * 数据展现 + */ + public void populateBean(T ob) { + contentPane.populateBean(ob); + } + + /** + * 停止编辑, 更新至最新的面板到属性保存 + */ + public T updateBean() { + updateContentPane(); + return contentPane.updateBean(); + } + + /** + * 需要实现更新内容,将updateBean传值给对象即可,在窗口消失的时候会被调用 + */ + protected abstract void updateContentPane(); + + /** + * 以对话框的形式弹出 + * + * @param window 窗口 + * @return 对话框 + */ + public UIDialog showUnsizedWindow(Window window) { + CustomShapedDialog dg = null; + if (window instanceof Frame) { + dg = new CustomShapedDialog((Frame) window); + } else { + dg = new CustomShapedDialog((Dialog) window); + } + if (arrowPosition == Constants.LEFT || arrowPosition == Constants.RIGHT) { + dg.setSize(bounds.width + ARROR_PARALLEL, bounds.height + ARROR_VERTICAL); + } else { + dg.setSize(bounds.width + ARROR_VERTICAL, bounds.height + ARROR_PARALLEL); + } + + dg.setLocation(bounds.x, bounds.y); + dg.setBackground(Color.blue); + dg.setResizable(false); + return dg; + } + + @Override + protected String title4PopupWindow() { + return null; + } + + private double initBoundsTime(int arrowPosition, Point arrowPoint, int width, int height) { + int x = arrowPoint.x; + int y = arrowPoint.y; + int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width; + int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height - TITLE_HEIGHT; + double time = TIME_DEFAULT; + + if (arrowPosition == Constants.LEFT || arrowPosition == Constants.RIGHT) { + while (y + time * height > screenHeight && time > 0) { + time -= TIME_GAP; + } + + while (y - (1 - time) * height < 0 && time < 1) { + time += TIME_GAP; + } + } else if (arrowPosition == Constants.TOP) { + while (x + time * width > screenWidth && time > 0) { + time -= TIME_GAP; + } + + while (x - (1 - time) * width < 0 && time < 1) { + time += TIME_GAP; + } + } + return 1 - time; + } + + private AWTEventListener awt = new AWTEventListener() { + public void eventDispatched(AWTEvent event) { + doSomeInAll(event); + } + }; + + private void doSomeInAll(AWTEvent event) { + if (event instanceof MouseEvent) { + MouseEvent mv = (MouseEvent) event; + if (mv.getClickCount() > 0) { + Point point = new Point((int) (mv.getLocationOnScreen().getX()) - 2 * OFF_LEFT, (int) mv.getLocationOnScreen().getY()); + // 判断鼠标点击是否在边界内 + if (!containsPoint(point) && showDialog != null) { + updateContentPane(); + showDialog.setVisible(false); + Toolkit.getDefaultToolkit().removeAWTEventListener(awt); + } + } + } + } + + private boolean containsPoint(Point point) { + if(arrowPosition == Constants.TOP){ + //箭头和按钮也算在pane内 + Rectangle judgedBounds = new Rectangle(bounds.x, bounds.y - OFF_LEFT * 2, bounds.width, bounds.height + OFF_LEFT * 2 + OFF_LEFT); + return judgedBounds.contains(point); + } + return bounds.contains(point); + } + + private void initComponents() { + if(arrowPosition == Constants.LEFT || arrowPosition == Constants.RIGHT) { + this.setBounds(20, 10, bounds.width, bounds.height); + } else { + this.setBounds(10, 10, bounds.width, bounds.height); + } + + this.setLayout(new BorderLayout()); + this.add(contentPane, BorderLayout.CENTER); + } + + private class CustomShapedDialog extends UIDialog { + + private static final int GAP_SMALL = 10; + private static final int GAP = 20; + private static final int GAP_BIG = 30; + + public CustomShapedDialog(Frame parent) { + super(parent); + this.initComponents(); + } + + public CustomShapedDialog(Dialog parent) { + super(parent); + this.initComponents(); + } + + + private Shape getCustomShap() { + Polygon polygon = new Polygon(); + if (arrowPosition == Constants.LEFT) { + polygon.addPoint(GAP_SMALL, 0); + polygon.addPoint(bounds.width + GAP_BIG, 0); + polygon.addPoint(bounds.width + GAP_BIG, bounds.height + GAP); + polygon.addPoint(GAP_SMALL, bounds.height + GAP); + polygon.addPoint(GAP_SMALL, (int) ((bounds.height + GAP) * time) - GAP_SMALL); + polygon.addPoint(0, (int) ((bounds.height + GAP) * time - GAP)); + polygon.addPoint(GAP_SMALL, (int) ((bounds.height + GAP) * time - GAP_BIG)); + polygon.addPoint(GAP_SMALL, 0); + } else if (arrowPosition == Constants.TOP) { + polygon.addPoint(0, GAP_SMALL); + polygon.addPoint((int) (bounds.width * time + GAP_SMALL), GAP_SMALL); + polygon.addPoint((int) (bounds.width * time + GAP), 0); + polygon.addPoint((int) (bounds.getWidth() * time + GAP_BIG), GAP_SMALL); + polygon.addPoint(bounds.width + GAP, GAP_SMALL); + polygon.addPoint(bounds.width + GAP, bounds.height + GAP_BIG); + polygon.addPoint(0, bounds.height + GAP_BIG); + polygon.addPoint(0, GAP_SMALL); + } else if (arrowPosition == Constants.RIGHT) { + polygon.addPoint(0, 0); + polygon.addPoint(bounds.width + GAP, 0); + polygon.addPoint(bounds.width + GAP, (int) ((bounds.height + GAP) * time) - GAP_BIG); + polygon.addPoint(bounds.width + GAP_BIG, (int) ((bounds.height + GAP) * time) - GAP); + polygon.addPoint(bounds.width + GAP, (int) ((bounds.height + GAP) * time) - GAP_SMALL); + polygon.addPoint(bounds.width + GAP, bounds.height + GAP); + polygon.addPoint(0, bounds.height + GAP); + polygon.addPoint(0, 0); + } + + return polygon; + } + + private Shape getShape4Board() { + Polygon polygon = new Polygon(); + if (arrowPosition == Constants.LEFT) { + polygon.addPoint(GAP_SMALL, 1); + polygon.addPoint(bounds.width + GAP_BIG - 1, 1); + polygon.addPoint(bounds.width + GAP_BIG - 1, bounds.height + GAP - 1); + polygon.addPoint(GAP_SMALL + 1, bounds.height + GAP - 1); + polygon.addPoint(GAP_SMALL + 1, (int) ((bounds.height + GAP) * time) - GAP_SMALL); + polygon.addPoint(1, (int) ((bounds.height + GAP) * time - GAP)); + polygon.addPoint(GAP_SMALL + 1, (int) ((bounds.height + GAP) * time - GAP_BIG)); + polygon.addPoint(GAP_SMALL + 1, 1); + } else if (arrowPosition == Constants.TOP) { + polygon.addPoint(1, GAP_SMALL + 1); + polygon.addPoint((int) (bounds.width * time + GAP_SMALL), GAP_SMALL + 1); + polygon.addPoint((int) (bounds.width * time + GAP), 1); + polygon.addPoint((int) (bounds.getWidth() * time + GAP_BIG), GAP_SMALL + 1); + polygon.addPoint(bounds.width + GAP - 1, GAP_SMALL + 1); + polygon.addPoint(bounds.width + GAP - 1, bounds.height + GAP_BIG - 1); + polygon.addPoint(1, bounds.height + GAP_BIG - 1); + polygon.addPoint(1, GAP_SMALL + 1); + } else if(arrowPosition == Constants.RIGHT) { + polygon.addPoint(1, 1); + polygon.addPoint(bounds.width + GAP - 1, 1); + polygon.addPoint(bounds.width + GAP - 1, (int) ((bounds.height + GAP) * time) - GAP_BIG); + polygon.addPoint(bounds.width + GAP_BIG - 1, (int) ((bounds.height + GAP) * time) - GAP); + polygon.addPoint(bounds.width + GAP - 1, (int) ((bounds.height + GAP) * time) - GAP_SMALL); + polygon.addPoint(bounds.width + GAP - 1, bounds.height + GAP - 1); + polygon.addPoint(1, bounds.height + GAP - 1); + polygon.addPoint(1, 0); + } + return polygon; + } + + /** + * 画出界面的样式, 边框等. + */ + public void paint(Graphics g) { + super.paint(g); + Graphics2D g2d = (Graphics2D) g; + Stroke oldStroke = g2d.getStroke(); + g2d.setStroke(new BasicStroke(2, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND)); + g2d.setColor(new Color(51, 51, 51)); + g2d.drawPolygon((Polygon) getShape4Board()); + g2d.setStroke(oldStroke); + } + + protected void initComponents() { + setUndecorated(true); + try { + AWTUtilities.setWindowShape(CustomShapedDialog.this, this.getCustomShap()); + } catch (UnsupportedOperationException e) { + FRContext.getLogger().info("Not support"); + } + final JPanel contentPane = (JPanel) this.getContentPane(); + this.setLayout(null); + contentPane.add(UIBubbleFloatPane.this); + setVisible(true); + } + + /** + * 检查 + */ + public void checkValid() throws Exception { + + } + } +} \ 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 similarity index 100% rename from designer_base/src/com/fr/design/gui/frpane/UIComboBoxPane.java rename to designer-base/src/com/fr/design/gui/frpane/UIComboBoxPane.java diff --git a/designer-base/src/com/fr/design/gui/frpane/UICorrelationComboBoxPane.java b/designer-base/src/com/fr/design/gui/frpane/UICorrelationComboBoxPane.java new file mode 100644 index 0000000000..8ce51a7d62 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UICorrelationComboBoxPane.java @@ -0,0 +1,414 @@ +package com.fr.design.gui.frpane; + +import com.fr.base.BaseUtils; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.UIConstants; +import com.fr.design.dialog.DialogActionAdapter; +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.gui.HyperlinkFilterHelper; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.imenu.UIMenuItem; +import com.fr.design.gui.imenutable.UIMenuNameableCreator; +import com.fr.design.gui.imenutable.UIMenuTable; +import com.fr.design.hyperlink.ReportletHyperlinkPane; +import com.fr.design.hyperlink.WebHyperlinkPane; +import com.fr.design.javascript.EmailPane; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.js.AbstractJavaScript; +import com.fr.js.EmailJavaScript; +import com.fr.js.ReportletHyperlink; +import com.fr.js.WebHyperlink; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; + +public class UICorrelationComboBoxPane extends JPanel implements UIObserver { + private static final Dimension DIALOG_SIZE = new Dimension(500, 500); + private JPopupMenu popMenu; + private UIMenuTable tablePane; + private UIButton addButton; + private List values; + private UIObserverListener uiObserverListener; + + public UICorrelationComboBoxPane() { + this(null); + iniListener(); + } + + public UICorrelationComboBoxPane(List values) { + initComponents(); + initLayout(); + refreshMenuAndAddMenuAction(values); + iniListener(); + } + + + private void iniListener() { + if (shouldResponseChangeListener()) { + this.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (uiObserverListener == null) { + return; + } + uiObserverListener.doChange(); + } + }); + } + } + + protected Dimension getDialogSize() { + return DIALOG_SIZE; + } + + /** + * 刷新下拉列表和按钮 + * @param values 下拉列表里的值 + */ + public void refreshMenuAndAddMenuAction(List values) { + if (values == null || values.isEmpty()) { + return; + } + this.values = values; + popMenu.removeAll(); + // 如果只有一个弹出项,那么就不弹出,直接让add按钮替代 + if (values.size() > 1) { + for (UIMenuNameableCreator value : values) { + final String itemName = value.getName(); + if(!HyperlinkFilterHelper.whetherAddHyperlink4Chart(itemName)){ + continue; + } + UIMenuItem item = new UIMenuItem(itemName); + final UIMenuNameableCreator creator = value; + item.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + UIMenuNameableCreator ui = creator.clone(); + ui.setName(createUnrepeatedName(itemName)); + tablePane.addLine(ui); + + final Object obj = ui.getObj(); + final BasicBeanPane pane = ui.getPane(); + UIDialog dialog = pane.showUnsizedWindow(SwingUtilities.getWindowAncestor(new JPanel()), new DialogActionAdapter() { + public void doOk() { + pane.updateBean(obj); + fireTargetChanged(); + } + + public void doCancel() { + int row = tablePane.getRowCount(); + tablePane.removeLine(row - 1); + fireTargetChanged(); + } + }); + dialog.setSize(getDialogSize()); + GUICoreUtils.centerWindow(dialog); + dialog.setVisible(true); + } + }); + popMenu.add(item); + } + } + initAddButtonListener(); + } + + private String createUnrepeatedName(String prefix) { + List all = tablePane.updateBean(); + // richer:生成的名字从1开始. kunsnat: 添加属性从0开始. + int count = all.size() + 1; + while (true) { + String name_test = prefix + count; + boolean repeated = false; + for (int i = 0, len = all.size(); i < len; i++) { + UIMenuNameableCreator nameable = all.get(i); + if (ComparatorUtils.equals(nameable.getName(), name_test)) { + repeated = true; + break; + } + } + + if (!repeated) { + return name_test; + } + count++; + } + } + + private ActionListener addAction = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (values.size() == 1) { + UIMenuNameableCreator current = values.get(0); + + UIMenuNameableCreator ui = current.clone(); + ui.setName(createUnrepeatedName(current.getName())); + tablePane.addLine(ui); + fireTargetChanged(); + + final Object obj = ui.getObj(); + final BasicBeanPane pane = ui.getPane(); + + pane.populateBean(obj); + + UIDialog dialog = pane.showUnsizedWindow(SwingUtilities.getWindowAncestor(new JPanel()), new DialogActionListener() { + @Override + public void doOk() { + pane.updateBean(obj); + fireTargetChanged(); + } + + @Override + public void doCancel() { + int row = tablePane.getRowCount(); + tablePane.removeLine(row - 1); + fireTargetChanged(); + } + }); + dialog.setSize(getDialogSize()); + dialog.setVisible(true); + } else { + popMenu.show(UICorrelationComboBoxPane.this, addButton.getX() + 1, addButton.getY() + addButton.getHeight()); + } + } + }; + + protected ActionListener addAction(final List values) { + return new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (values.size() == 1) { + UIMenuNameableCreator current = values.get(0); + current.setName(createUnrepeatedName(current.getName())); + tablePane.addLine(current); + fireTargetChanged(); + } else { + popMenu.show(UICorrelationComboBoxPane.this, addButton.getX() + 1, addButton.getY() + addButton.getHeight()); + } + } + }; + } + + protected void initComponents() { + tablePane = new UIMenuTable(); + popMenu = new JPopupMenu() { + @Override + public Dimension getPreferredSize() { + Dimension dimension = new Dimension(); + dimension.height = super.getPreferredSize().height; + dimension.width = addButton.getWidth() - 2; + return dimension; + } + }; + initAddButton(); + } + + protected void initAddButton() { + addButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); + addButton.setBorderType(UIButton.OTHER_BORDER); + addButton.setOtherBorder(UIConstants.BS, UIConstants.LINE_COLOR); + } + + private void initAddButtonListener() { + ActionListener[] listeners = addButton.getListeners(ActionListener.class); + if (!ArrayUtils.contains(listeners, addAction)) { + addButton.addActionListener(addAction); + } + } + + protected void initLayout() { + this.setLayout(new Layout()); + this.add(addButton); + this.add(tablePane); + } + + public class Layout implements LayoutManager { + + /** + * 增加布局 + * @param name 名字 + * @param comp 组件 + */ + public void addLayoutComponent(String name, Component comp) { + + } + + /** + * 删除组件 + * @param comp 组件 + */ + public void removeLayoutComponent(Component comp) { + + } + + /** + * 获得组件的大小 + * @param parent 上层容器 + * @return 组件的大小 + */ + public Dimension preferredLayoutSize(Container parent) { + int h = addButton.getPreferredSize().height + tablePane.getPreferredSize().height; + return new Dimension(parent.getWidth(), h + 2); + } + + /** + * 最小的布局大小 + * @param parent 上层容器 + * @return 最小的大小 + */ + public Dimension minimumLayoutSize(Container parent) { + return preferredLayoutSize(parent); + } + + /** + * 布局容器 + * @param parent 上层容器 + */ + public void layoutContainer(Container parent) { + int width = parent.getWidth(); + int y = 0; + tablePane.setBounds(0, y, width, tablePane.getPreferredSize().height); + y += tablePane.getPreferredSize().height + 2; + addButton.setBounds(0, y, width, addButton.getPreferredSize().height); + } + } + + /** + * 增加监听事件 + * @param l 监听的对象 + */ + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + this.tablePane.addChangeListener(l); + } + + /** + * 删除监听事件 + * @param l 需要删除的事件 + */ + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + // august: Process the listeners last to first + protected void fireChanged() { + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + + this.tablePane.fireTargetChanged(); + } + + /** + * 响应事件 + */ + public void fireTargetChanged() { + this.validate(); + this.repaint(); + this.revalidate(); + fireChanged(); + } + + /** + * 预定义的宽度和高度 + */ + public Dimension getPreferredSize() { + Dimension dim = new Dimension(); + dim.width = super.getPreferredSize().width; + dim.height = addButton.getPreferredSize().height + tablePane.getPreferredSize().height + 2; + return dim; + } + + /** + * 更新并且重载 当前列表的值 + * @param list 更新的列表 + */ + public void populateBean(List list) { + tablePane.populateBean(list); + } + + /** + * 返回 当前列表保存的值, 嵌套的一层, 主要对应creator中的obj + */ + public List updateBean() { + return tablePane.updateBean(); + } + + /** + * 重置每个条目的名字 + */ + public void resetItemName(){ + for(int i = 0; i < tablePane.getRowCount(); i++){ + UIMenuNameableCreator line = tablePane.getLine(i); + Object obj = line.getObj(); + if(obj instanceof AbstractJavaScript){ + AbstractJavaScript script = (AbstractJavaScript)obj; + String itemName = script.getItemName(); + if(!StringUtils.isBlank(itemName)){ + line.setName(itemName); + } + } + } + } + + /** + * 测试例子界面 + * @param args 参数向量 + */ + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(new BorderLayout()); + List data = new ArrayList(); + UIMenuNameableCreator reportlet = new UIMenuNameableCreator(Inter.getLocText("FR-Hyperlink_Reportlet"), + new ReportletHyperlink(), ReportletHyperlinkPane.class); + + UIMenuNameableCreator email = new UIMenuNameableCreator(Inter.getLocText("FR-Designer_Email"), + new EmailJavaScript(), EmailPane.class); + + UIMenuNameableCreator web = new UIMenuNameableCreator(Inter.getLocText("Hyperlink-Web_link"), + new WebHyperlink(), WebHyperlinkPane.class); + data.add(reportlet); + data.add(email); + data.add(web); + UICorrelationComboBoxPane pane = new UICorrelationComboBoxPane(data); + content.add(pane, BorderLayout.CENTER); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } + + /** + * 注册观察者监听事件 + * @param listener 观察者监听事件 + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + + } + + /** + * 是否需要响应事件 + * @return 需要相应 + */ + public boolean shouldResponseChangeListener() { + return true; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/UICorrelationPane.java b/designer-base/src/com/fr/design/gui/frpane/UICorrelationPane.java new file mode 100644 index 0000000000..739e2b9a72 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UICorrelationPane.java @@ -0,0 +1,409 @@ +package com.fr.design.gui.frpane; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GridLayout; +import java.awt.LayoutManager; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.table.TableCellEditor; + +import com.fr.base.BaseUtils; +import com.fr.design.constants.UIConstants; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itable.UIDefaultTableCellEditor; +import com.fr.design.gui.itable.UITable; +import com.fr.design.gui.itable.UITableEditor; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.general.Inter; +import com.fr.design.utils.gui.GUICoreUtils; + +/** + * @author jerry + */ +public class UICorrelationPane extends JPanel implements UIObserver { + + private static int size = 20; + protected UIButton addButton; + protected UITable tablePane; + protected int columnCount; + private UIObserverListener uiObserverListener; + private HeaderPane header; + + /** + * @param 标题栏的名字,length代表列数 + */ + public UICorrelationPane(String... names) { + columnCount = names.length; + initComponents(); + header = new HeaderPane(names); + initLayout(); + iniListener(); + } + + /** + * @param column 列数 + * 没有标题栏的CorrelationPane + */ + public UICorrelationPane(int column) { + columnCount = column; + initComponents(); + initLayout(); + iniListener(); + } + + /** + * 不需要使用添加按钮, 目前只有图表: 股价图, 甘特图单元格数据界面用到. + */ + public void noAddUse() { + addButton.setEnabled(false); + addButton.setVisible(false); + } + + protected boolean isDeletable(){ + return true; + } + + /** + * 添加按钮 等 是否可用 + * @param use 是否可用 + */ + public void checkBoxUse(boolean use) { + addButton.setEnabled(use); + } + + public void populateBean(List values) { + tablePane.populateBean(values); + this.validate(); + this.repaint(); + this.revalidate(); + } + + public List updateBean() { + List list = tablePane.updateBean(); + + if (tablePane.isEditing()) { + TableCellEditor editor = tablePane.getCellEditor(); + if (editor != null) { + Object value = editor.getCellEditorValue(); + int row = tablePane.getEditingRow(); + int col = tablePane.getEditingColumn(); + if (list.size() > row) { + Object[] objs = list.get(row); + if (objs != null && objs.length > col) { + objs[col] = value; + } + } + } + } + + return list; + } + + + /** + *添加一行 + * @param line 行 + */ + public void addLine(Object[] line) { + tablePane.addLine(line); + } + + /** + * 删除某行内容 + * @param rowIndex 行号 + */ + public void removeLine(int rowIndex) { + tablePane.removeLine(rowIndex); + } + + /** + * @return 添加按钮的事件接口 + */ + protected ActionListener getAddButtonListener() { + return new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + tablePane.addBlankLine(); + fireTargetChanged(); + } + }; + } + + protected void initLayout() { + this.setLayout(new Layout()); + this.add(addButton); + if (header != null) { + this.add(header); + } + this.add(tablePane); + } + + protected void initComponents() { + tablePane = initUITable(); + initAddButton(); + } + + private void iniListener() { + if (shouldResponseChangeListener()) { + this.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (uiObserverListener == null) { + return; + } + uiObserverListener.doChange(); + } + }); + } + } + + /** + * 停止单元格编辑 + */ + public void stopCellEditing() { + if (tablePane.getDefaultEditor(UITable.class) != null) { + tablePane.getDefaultEditor(UITable.class).stopCellEditing(); + } + } + + /** + * 停止面板编辑 + * @param e 事件 + */ + public void stopPaneEditing(ChangeEvent e) { + fireChanged(); + } + + /** + * 创建table编辑器 + * @return 编辑器 + */ + public UITableEditor createUITableEditor() { + return new UIDefaultTableCellEditor(new UITextField()); + } + + protected UITable initUITable() { + return new UITable(columnCount) { + + public UITableEditor createTableEditor() { + return UICorrelationPane.this.createUITableEditor(); + } + + public void tableCellEditingStopped(ChangeEvent e) { + UICorrelationPane.this.stopPaneEditing(e); + } + + }; + } + + protected void initAddButton() { + addButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")) { + public boolean shouldResponseChangeListener() { + return false; + } + }; + addButton.setBorderType(UIButton.OTHER_BORDER); + addButton.setOtherBorder(UIConstants.BS, UIConstants.LINE_COLOR); + addButton.addActionListener(getAddButtonListener()); + } + + /** + * 通知变化 + */ + public void fireTargetChanged() { + this.validate(); + this.repaint(); + this.revalidate(); + fireChanged(); + } + + /** + * 给组件登记一个观察者监听事件 + * + * @param listener 观察者监听事件 + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } + + /** + * 组件是否需要响应添加的观察者事件 + * + * @return 如果需要响应观察者事件则返回true,否则返回false + */ + public boolean shouldResponseChangeListener() { + return true; + } + + public class Layout implements LayoutManager { + + /** + * 增加组件 + * @param name 组件名 + * @param comp 组件 + */ + public void addLayoutComponent(String name, Component comp) { + + } + + /** + *移除组件 + * @param comp 组件 + */ + public void removeLayoutComponent(Component comp) { + + } + + /** + *最佳大小 + * @param parent 父容器 + * @return 大小 + */ + public Dimension preferredLayoutSize(Container parent) { + int h = addButton.getPreferredSize().height + tablePane.getPreferredSize().height; + if (header != null) { + h = header.getPreferredSize().height; + } + return new Dimension(parent.getWidth(), h + 2); + } + + /** + * 最小布局大小 + * @param parent 父容器 + * @return 大小 + */ + public Dimension minimumLayoutSize(Container parent) { + return preferredLayoutSize(parent); + } + + /** + * 布局容器 + * @param parent 父容器 + */ + public void layoutContainer(Container parent) { + int width = parent.getWidth(); + int y = 0; + if (header != null) { + header.setBounds(0, y, width - (isDeletable() ?size:0), header.getPreferredSize().height); + y = y + header.getPreferredSize().height; + } + tablePane.setBounds(0, y, width+(isDeletable() ?0:size), tablePane.getPreferredSize().height); + y += tablePane.getPreferredSize().height + 2; + addButton.setBounds(0, y, width, addButton.getPreferredSize().height); + } + } + + private class HeaderPane extends JPanel { + + public HeaderPane(String[] names) { + UILabel[] labels = new UILabel[names.length]; + this.setLayout(new GridLayout(0, names.length)); + for (int i = 0; i < names.length; i++) { + labels[i] = new UILabel(names[i], UILabel.CENTER) { + @Override + public void paint(Graphics g) { + super.paint(g); + int width = getWidth(); + int height = getHeight(); + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(UIConstants.LINE_COLOR); + g2d.drawLine(4, height - 1, width - 4, height - 1); + } + + }; + this.add(labels[i]); + } + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width - (isDeletable() ?size:0), size); + } + + } + + /** + * 增加监听 + * @param l 监听 + */ + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + } + + /** + * 移除监听 + * @param l 监听 + */ + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + // august: Process the listeners last to first + protected void fireChanged() { + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + + @Override + public Dimension getPreferredSize() { + Dimension dim = new Dimension(); + dim.width = super.getPreferredSize().width; + dim.height = addButton.getPreferredSize().height + tablePane.getPreferredSize().height + 2; + if (header != null) { + dim.height += header.getPreferredSize().height; + } + return dim; + } + + public UITable getTable() { + return tablePane; + } + + + /** + * 主函数 + * @param args 参数 + */ + public static void main(String... args) { + JFrame jf = new JFrame("test"); + final String[] columnNames = {Inter.getLocText("Actual_Value"), Inter.getLocText("Display_Value")}; + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(new BorderLayout()); + UICorrelationPane pane = new UICorrelationPane(columnNames); + content.add(pane, BorderLayout.CENTER); + List values = new ArrayList(); + values.add(new String[]{"askdjf1", "skdjfasjdf1"}); + values.add(new String[]{"askdjf2", "skdjfasjdf2"}); + values.add(new String[]{"askdjf3", "skdjfasjdf3"}); + values.add(new String[]{"askdjf4", "skdjfasjdf4"}); + values.add(new String[]{"askdjf5", "skdjfasjdf5"}); + values.add(new String[]{"askdjf6", "skdjfasjdf6"}); + values.add(new String[]{"askdjf7", "skdjfasjdf7"}); + values.add(new String[]{"askdjf8", "skdjfasjdf8"}); + pane.populateBean(values); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/frpane/UIExtensionPane.java b/designer-base/src/com/fr/design/gui/frpane/UIExtensionPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/frpane/UIExtensionPane.java rename to designer-base/src/com/fr/design/gui/frpane/UIExtensionPane.java diff --git a/designer-base/src/com/fr/design/gui/frpane/UINumberDragPane.java b/designer-base/src/com/fr/design/gui/frpane/UINumberDragPane.java new file mode 100644 index 0000000000..7ec8f6e021 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UINumberDragPane.java @@ -0,0 +1,140 @@ +package com.fr.design.gui.frpane; + +import java.awt.BorderLayout; +import java.awt.Dimension; + +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.event.GlobalNameListener; +import com.fr.design.event.GlobalNameObserver; +import com.fr.design.gui.ispinner.UISpinner; +import com.fr.design.gui.style.NumberDragBar; +import com.fr.general.Inter; + +public class UINumberDragPane extends BasicBeanPane implements GlobalNameObserver { + private static final long serialVersionUID = -8681716725163358249L; + private NumberDragBar dragBar; + private UISpinner spinner; + private boolean isEditing = false; + private String numberDargPaneName = ""; + private GlobalNameListener globalNameListener = null; + + /** + * 带说明 + * @param value 带说明 + */ + public void userEvent(double value) { + + } + + public UINumberDragPane(double minValue, double maxValue) { + this(minValue, maxValue, 1); + } + + public UINumberDragPane(double minValue, double maxValue, double dierta) { + dragBar = new NumberDragBar((int) minValue, (int) maxValue); + spinner = new UISpinner(minValue, maxValue, dierta, minValue); + spinner.setGlobalName(Inter.getLocText("StyleAlignment-Text_Rotation")); + this.setLayout(new BorderLayout(4, 0)); + this.add(spinner, BorderLayout.EAST); + this.add(dragBar, BorderLayout.CENTER); + dragBar.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(numberDargPaneName); + } + spinner.setValue(dragBar.getValue()); + if (isEditing) { + userEvent(updateBean()); + } + } + }); + spinner.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(numberDargPaneName); + } + dragBar.setValue((int) spinner.getValue()); + if (isEditing) { + userEvent(updateBean()); + } + } + }); + } + + /** + * 添加事件 + * @param l 事件 + */ + public void addChangeListener(ChangeListener l) { + spinner.addChangeListener(l); + + } + + /** + * 移除事件 + * @param l 事件 + */ + + public void removeChangeListener(ChangeListener l) { + spinner.removeChangeListener(l); + } + + /** + * @param name + */ + public void setGlobalName(String name) { + numberDargPaneName = name; + } + + @Override + public void populateBean(Double ob) { + isEditing = false; + dragBar.setValue(ob.intValue()); + spinner.setValue(ob); + isEditing = true; + } + + @Override + public Dimension getPreferredSize() { + Dimension dim = new Dimension(); + dim.width = super.getPreferredSize().width; + dim.height = super.getPreferredSize().height + 2; + return dim; + } + + public void setEnabled(boolean enabled) { + dragBar.setEnabled(enabled); + spinner.setEnabled(enabled); + } + + @Override + public Double updateBean() { + return spinner.getValue(); + } + + @Override + protected String title4PopupWindow() { + return null; + } + + /** + * 注册 + * @param listener 观察者监听事件 + */ + public void registerNameListener(GlobalNameListener listener) { + globalNameListener = listener; + } + + /** + * 是否应该响应 + * @return 是否应该响应 + */ + public boolean shouldResponseNameListener() { + return true; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/UINumberSlidePane.java b/designer-base/src/com/fr/design/gui/frpane/UINumberSlidePane.java new file mode 100644 index 0000000000..7585c09490 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UINumberSlidePane.java @@ -0,0 +1,137 @@ +/** + * + */ +package com.fr.design.gui.frpane; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.itextfield.UINumberField; +import com.fr.design.gui.style.NumberDragBar; + +/** + * 拖拽的滑条和对应滑条值的数字 + * + * @author jim + * @date 2014-8-20 + */ +public class UINumberSlidePane extends BasicBeanPane { + + /** + * + */ + private static final long serialVersionUID = -3863821662526890552L; + private static final double MIN_DIFF_VALUE = 5.0; + private NumberDragBar dragBar; + private UINumberField manual; + private double minValue; + private double maxValue; + private double value; + + public UINumberSlidePane(double minValue, double maxValue) { + this.minValue = minValue; + this.maxValue = maxValue; + dragBar = new NumberDragBar((int)minValue, (int)maxValue); + manual = new UINumberField(3, 0); + manual.setHorizontalAlignment(manual.CENTER); + this.setLayout(new BorderLayout(4, 0)); + this.add(dragBar, BorderLayout.CENTER); + this.add(manual, BorderLayout.EAST); + dragBar.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + checkValue(dragBar.getValue()); + } + }); + manual.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + checkValue(manual.getValue()); + } + }); + } + + + /** + * 手动输入滑条值后,check下 + * @param value 值 + */ + public void checkValue(double value) { + value = Math.max(value, minValue); + value = Math.min(value, maxValue); + if (this.value == value) { + return; + } + double diff = Math.abs(value - this.value); + manual.setValue(value); + dragBar.setValue((int)value); + // 拖动的比较小,就先不调整界面显示大小,暂时设5px门槛 + if (diff < MIN_DIFF_VALUE) { + return; + } + this.value = value; + fireStateChanged(); + } + + public double getValue() { + return this.value; + } + + @Override + public void populateBean(Double ob) { + dragBar.setValue(ob.intValue()); + manual.setValue(ob); + this.value = ob; + } + + @Override + public Double updateBean() { + return manual.getValue(); + } + + @Override + public Dimension getPreferredSize() { + Dimension dim = new Dimension(); + dim.width = super.getPreferredSize().width; + dim.height = super.getPreferredSize().height + 2; + return dim; + } + + @Override + protected String title4PopupWindow() { + return null; + } + + /** + * 添加改变事件 + * @param l 变化事件 + */ + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + } + + /** + * remove ChangeListener事件 + * @param l ChangeListener事件 + */ + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + protected void fireStateChanged() { + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/UIRadioPane.java b/designer-base/src/com/fr/design/gui/frpane/UIRadioPane.java new file mode 100644 index 0000000000..4cbff5b1d2 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UIRadioPane.java @@ -0,0 +1,107 @@ +package com.fr.design.gui.frpane; + +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.util.List; + +import javax.swing.JPanel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.beans.FurtherBasicBeanPane; +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.layout.FRGUIPaneFactory; + +/** + * + * @author zhou + * @since 2012-5-30下午1:12:00 + */ +public abstract class UIRadioPane extends BasicBeanPane { + private static final long serialVersionUID = 1L; + + protected UIButtonGroup cardNamesPane; + protected JPanel cardPane; + + // 放弃下面带泛型的数组,用list,因为Java不支持泛型数组,导致初始化数组时不能用泛型、从而不能严格控制类型,那么用泛型就没有什么意义了 + // private FurtherBasicBeanPane[] cards; august + private List> cards; + + private String[] cardNames; + + protected abstract List> initPaneList(); + + public UIRadioPane() { + cards = initPaneList(); + initComponents(); + } + + protected void initComponents() { + cardNames = new String[cards.size()]; + cardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); + + for (int i = 0; i < this.cards.size(); i++) { + cardNames[i] = getCardName(i); + cardPane.add(this.cards.get(i), cardNames[i]); + } + + cardNamesPane = getCardNamePane(cardNames); + + cardNamesPane.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + showCard(); + } + }); + initLayout(); + cardNamesPane.setSelectedIndex(0);// 默认选中第一个 + } + + protected UIButtonGroup getCardNamePane(String[] cardNames) { + return new UIButtonGroup(cardNames); + } + + private void showCard() { + CardLayout cl = (CardLayout)cardPane.getLayout(); + cl.show(cardPane, cardNames[cardNamesPane.getSelectedIndex()]); + } + + /** + * august 如果需要的布局有变化,覆盖之 + */ + protected void initLayout() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel northPane = new JPanel(new BorderLayout(4, 6)); + northPane.add(cardNamesPane, BorderLayout.CENTER); + + this.add(northPane, BorderLayout.NORTH); + this.add(cardPane, BorderLayout.CENTER); + + } + + protected String getCardName(int i) { + return this.cards.get(i).title4PopupWindow(); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public void populateBean(T ob) { + for (int i = 0; i < this.cards.size(); i++) { + FurtherBasicBeanPane pane = cards.get(i); + if (pane.accept(ob)) { + pane.populateBean(ob); + cardNamesPane.setSelectedIndex(i); + showCard(); + return; + } + } + } + + @Override + public T updateBean() { + return cards.get(cardNamesPane.getSelectedIndex()).updateBean(); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/UITabbedPane.java b/designer-base/src/com/fr/design/gui/frpane/UITabbedPane.java new file mode 100644 index 0000000000..619448c46e --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UITabbedPane.java @@ -0,0 +1,122 @@ +package com.fr.design.gui.frpane; + +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; + +import javax.swing.*; +import javax.swing.plaf.TabbedPaneUI; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : Richer + * Version: 6.5.6 + * Date: 13-3-28 + * Time: 上午9:14 + */ +public class UITabbedPane extends JTabbedPane{ + + private boolean isClosable = false; //Tab是否可关闭 + private String classPath; //panel对象的类名 + private String tabName; //Tab名称 + private int tabSize = 0; + public UITabbedPane() { + super(); + } + + public UITabbedPane(int tabPlacement) { + super(tabPlacement); + } + + public UITabbedPane(int tabPlacement, int tabLayoutPolicy) { + super(tabPlacement, tabLayoutPolicy); + } + + public UITabbedPane(boolean closable,String tabname,String classpath){ + super(); + setClosable(closable); + setTabName(tabname); + setClassPath(classpath); + } + + /** + * 添加tab + * @param s tab名 + * @param component 组件 + */ + public void addTab(String s, Component component) { + if(isClosable() && ComparatorUtils.equals(s, getTabName())){ + super.addTab(s + tabSize, component); + }else{ + super.addTab(s, component); + } + tabSize++; + } + + /** + * 设置tab可关闭/添加 + * @param isClosable 是否可关闭/添加 + */ + public void setClosable(boolean isClosable){ + this.isClosable = isClosable; + } + + /** + * tab可关闭 + * @return 返回是否tab可关闭 + */ + public boolean isClosable(){ + return this.isClosable; + } + + public void setClassPath(String classpath){ + this.classPath = classpath; + } + + public String getClassPath(){ + return this.classPath; + } + + public void setTabName(String tabname){ + this.tabName = tabname; + } + + public String getTabName(){ + return this.tabName; + } + + public void setTabSize(int tabsize){ + tabSize = tabsize; + } + + public int getTabSize(){ + return tabSize; + } + @Override + /** + * 获取UI对象 + */ + public TabbedPaneUI getUI(){ + return new UITabbedPaneUI(); + } + + @Override + /** + * 更新UI + */ + public void updateUI() { + setUI(getUI()); + } + + /** + * 删除tab,不能直接复写removeTabAt + * @param i tab索引 + */ + public void doRemoveTab(int i){ + int re = JOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(UITabbedPane.this), Inter.getLocText("sure_to_delete")+ "?", Inter.getLocText("Remove") + , JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + if (re == JOptionPane.OK_OPTION) { + super.removeTabAt(i); + } + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/frpane/UITabbedPaneUI.java b/designer-base/src/com/fr/design/gui/frpane/UITabbedPaneUI.java similarity index 100% rename from designer_base/src/com/fr/design/gui/frpane/UITabbedPaneUI.java rename to designer-base/src/com/fr/design/gui/frpane/UITabbedPaneUI.java diff --git a/designer-base/src/com/fr/design/gui/frpane/UITextPane.java b/designer-base/src/com/fr/design/gui/frpane/UITextPane.java new file mode 100644 index 0000000000..45c27e6ea6 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UITextPane.java @@ -0,0 +1,93 @@ +package com.fr.design.gui.frpane; + +import com.fr.common.inputevent.InputEventBaseOnOS; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.StyledDocument; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : Richer + * Version: 6.5.6 + * Date: 13-3-27 + * Time: 上午10:50 + */ +public class UITextPane extends JTextPane implements UIObserver { + + private UIObserverListener uiObserverListener; + + public UITextPane() { + super(); + InputEventBaseOnOS.addBasicEditInputMap(this); + iniListener(); + } + + public UITextPane(StyledDocument doc) { + super(doc); + InputEventBaseOnOS.addBasicEditInputMap(this); + iniListener(); + } + + private void iniListener() { + if (shouldResponseChangeListener()) { + this.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + EventQueue.invokeLater(new Runnable() { + public void run() { + attributeChanged(); + } + }); + } + + @Override + public void removeUpdate(DocumentEvent e) { + EventQueue.invokeLater(new Runnable() { + public void run() { + attributeChanged(); + } + }); + } + + @Override + public void changedUpdate(DocumentEvent e) { + EventQueue.invokeLater(new Runnable() { + public void run() { + attributeChanged(); + } + }); + } + }); + } + } + + + private void attributeChanged() { + if (uiObserverListener == null) { + return; + } + uiObserverListener.doChange(); + + } + + @Override + /** + * + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } + + @Override + /** + * + */ + public boolean shouldResponseChangeListener() { + return true; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/UITitlePanel.java b/designer-base/src/com/fr/design/gui/frpane/UITitlePanel.java new file mode 100644 index 0000000000..d1dbb12ec7 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UITitlePanel.java @@ -0,0 +1,46 @@ +/** + * + */ +package com.fr.design.gui.frpane; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; + +import javax.swing.BorderFactory; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JPanel; + +import com.fr.design.layout.FRGUIPaneFactory; + +/** + * @author zhou + * + */ +public class UITitlePanel extends JPanel { + public UITitlePanel(JPanel contentPanel) { + this.setLayout(new BorderLayout()); + this.setBorder(null); + this.add(contentPanel, BorderLayout.CENTER); + } + + public UITitlePanel(JPanel contentPanel, String title) { + JPanel TitleBar = FRGUIPaneFactory.createBorderLayout_S_Pane(); + TitleBar.setBackground(new Color(148, 148, 148)); + TitleBar.setForeground(Color.WHITE); + TitleBar.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, new Color(85, 85, 85))); + + UILabel titlelabel = new UILabel(" " + title); + titlelabel.setBackground(new Color(148, 148, 148)); + titlelabel.setForeground(new Color(242, 242, 242)); + TitleBar.setPreferredSize(new Dimension(getWidth(), 20)); + TitleBar.setRequestFocusEnabled(true); + TitleBar.add(titlelabel, BorderLayout.WEST); + this.setLayout(new BorderLayout()); + this.setBorder(BorderFactory.createEmptyBorder()); + this.add(TitleBar, BorderLayout.NORTH); + this.add(contentPanel, BorderLayout.CENTER); + + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/frpane/UnitInputPane.java b/designer-base/src/com/fr/design/gui/frpane/UnitInputPane.java new file mode 100644 index 0000000000..ca44c8a228 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/frpane/UnitInputPane.java @@ -0,0 +1,170 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.frpane; + +import com.fr.base.Utils; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.ispinner.UIBasicSpinner; +import com.fr.design.gui.itextfield.UINumberField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.math.BigDecimal; + +/** + * For input Number. + */ +public abstract class UnitInputPane extends BasicPane { + private static final double NUM_POINT = 0.000001; + private int scale = -1; + String title; + + public UnitInputPane(int scale, String name) { + this.scale = scale; + title = name; + initComponents(); + } + + protected void initComponents() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel centerPane = FRGUIPaneFactory.createTitledBorderPane(""); + this.add(centerPane, BorderLayout.CENTER); + centerPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 30)); + UILabel titleLabel = new UILabel(title + ":"); + centerPane.add(titleLabel); + + // Denny:在对话框中加入JSpinner对象 + numberFieldSpinner = new UIBasicSpinner(new SpinnerNumberModel(0, 0, 999, 1)); + GUICoreUtils.setColumnForSpinner(numberFieldSpinner, 24); + numberFieldSpinner.setPreferredSize(new Dimension(60, 20)); + numberFieldSpinner.setMinimumSize(new Dimension(60, 20)); + centerPane.add(numberFieldSpinner); + numberFieldSpinner.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent arg0) { + if (Math.abs((((Double) numberFieldSpinner.getValue()).floatValue() - popValue)) > NUM_POINT) { + changed = true; + } + } + }); + + unitLabel = new UILabel(""); + centerPane.add(unitLabel); + } + + public void setUnitText(String unit) { + this.unitLabel.setText("(" + unit + ")"); + } + + public void populate(float floatValue) { + popValue = floatValue; + numberFieldSpinner.setModel(new SpinnerNumberModel(0.00, 0.00, 999.00, 0.01)); + + JFormattedTextField temp = GUICoreUtils.getSpinnerTextField(numberFieldSpinner); + addChangeListener(temp); + BigDecimal de = new BigDecimal(floatValue + ""); + if (scale > 0) { + floatValue = de.setScale(scale, BigDecimal.ROUND_DOWN).floatValue(); + } else { + floatValue = de.floatValue(); + } + //选中多列, 并且列宽不完全一致的话, 就不显示值了. + temp.setText(floatValue == 0 ? StringUtils.EMPTY : Utils.convertNumberStringToString(new Float(floatValue))); + + // denny:默认应该为选中,方便用户修改 + temp.selectAll(); + } + + private void addChangeListener(JFormattedTextField temp) { + temp.removeKeyListener(kl); + temp.addKeyListener(kl); + temp.removeMouseListener(ml); + temp.addMouseListener(ml); + } + + // 抛个错只是为了通知外面值没变 + public double update() throws ValueNotChangeException { + // 值没变就不改 + if (!changed) { + throw vncExp; + } + // Denny: get numberFieldSpinner 的 TextField + JFormattedTextField temp = GUICoreUtils.getSpinnerTextField(numberFieldSpinner); + + try { + if (temp.getText().length() == 0) { + return 0; + } + BigDecimal de = new BigDecimal(temp.getText()); + if (scale > 0) { + return de.setScale(scale, BigDecimal.ROUND_DOWN).floatValue(); + } else { + return de.floatValue(); + } + } catch (NumberFormatException numberFormatException) { + + return UINumberField.ERROR_VALUE; + } + } + + public static class ValueNotChangeException extends Exception { + } + + private UILabel unitLabel; + private UIBasicSpinner numberFieldSpinner; + private float popValue; + private boolean changed = false; + private ValueNotChangeException vncExp = new ValueNotChangeException(); + + private KeyListener kl = new KeyListener() { + + @Override + public void keyTyped(KeyEvent arg0) { + } + + @Override + public void keyReleased(KeyEvent arg0) { + } + + @Override + public void keyPressed(KeyEvent arg0) { + changed = true; + } + }; + + private MouseListener ml = new MouseListener() { + + @Override + public void mouseReleased(MouseEvent arg0) { + } + + @Override + public void mousePressed(MouseEvent arg0) { + changed = true; + } + + @Override + public void mouseExited(MouseEvent arg0) { + } + + @Override + public void mouseEntered(MouseEvent arg0) { + } + + @Override + public void mouseClicked(MouseEvent arg0) { + } + }; +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java b/designer-base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java rename to designer-base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataConfigPane.java diff --git a/designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java b/designer-base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java rename to designer-base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDataControlPane.java diff --git a/designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDependenceSettingPane.java b/designer-base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDependenceSettingPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDependenceSettingPane.java rename to designer-base/src/com/fr/design/gui/frpane/tree/layer/config/LayerDependenceSettingPane.java diff --git a/designer-base/src/com/fr/design/gui/ibutton/FiveButtonLayout.java b/designer-base/src/com/fr/design/gui/ibutton/FiveButtonLayout.java new file mode 100644 index 0000000000..8932361d1e --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/FiveButtonLayout.java @@ -0,0 +1,61 @@ +package com.fr.design.gui.ibutton; + +import java.awt.*; + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-5-27 + * Time: 下午4:51 + * To change this template use File | Settings | File Templates. + */ +public class FiveButtonLayout extends GridLayout { + private static final double SECOND_ROW = 1.25; + + public FiveButtonLayout(int rows) { + super(rows, 3, 1, 1); + } + + /** + * 容器布局 + * + * @param parent 容器 + */ + public void layoutContainer(Container parent) { + synchronized (parent.getTreeLock()) { + Insets insets = parent.getInsets(); + int ncomponents = parent.getComponentCount(); + int nrows = 2; + int ncols = 3; + if (ncomponents == 3) { + nrows = 1; + ncols = 3; + } + + if (ncomponents == 0) { + return; + } + if (nrows > 0) { + ncols = (ncomponents + nrows - 1) / nrows; + } else { + nrows = (ncomponents + ncols - 1) / ncols; + } + int w = parent.getWidth() - (insets.left + insets.right); + int h = parent.getHeight() - (insets.top + insets.bottom); + w = (w - (ncols - 1)) / ncols; + h = (h - (nrows - 1)) / nrows; + for (int i = 0, x = insets.left, y = insets.top; i < ncols; i++, x += w + 1) { + parent.getComponent(i).setBounds(x, y, w, h); + } + int line2w = (int) (SECOND_ROW * w); + int secondRowCount = ncomponents - ncols; + int startx = (parent.getWidth() - line2w * secondRowCount - secondRowCount - 1) / 2; + for (int i = ncols, x = startx, y = insets.top + h + 1; i < ncomponents; i++, x += line2w + 1) { + parent.getComponent(i).setBounds(x, y, line2w, h); + } + + } + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/SpecialUIButton.java b/designer-base/src/com/fr/design/gui/ibutton/SpecialUIButton.java new file mode 100644 index 0000000000..338cbac7ef --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/SpecialUIButton.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.ibutton; + +import javax.swing.*; +import javax.swing.plaf.ButtonUI; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-5 + * Time: 下午4:52 + */ +public class SpecialUIButton extends JButton { + public SpecialUIButton(ButtonUI ui) { + this.ui = ui; + ui.installUI(this); + } + + /** + * refuses to change the UI delegate. It keeps the one set in the constructor. + * + * @see javax.swing.AbstractButton#setUI(ButtonUI) + */ + public void setUI(ButtonUI ui) { + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIBasicButtonUI.java b/designer-base/src/com/fr/design/gui/ibutton/UIBasicButtonUI.java new file mode 100644 index 0000000000..185e4c18fc --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIBasicButtonUI.java @@ -0,0 +1,346 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.ibutton; + +import com.fr.design.gui.itoolbar.UIToolBarUI; +import com.fr.design.utils.ColorRoutines; +import com.fr.design.utils.ThemeUtils; +import com.fr.general.ComparatorUtils; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.metal.MetalButtonUI; +import java.awt.*; +import java.awt.event.KeyEvent; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-19 + * Time: 上午9:29 + */ +public class UIBasicButtonUI extends MetalButtonUI { + + // if a button has not the defined background, it will + // be darkened resp. lightened by BG_CHANGE amount if + // pressed or rollover + public static final int BG_CHANGE_AMOUNT = 10; + + /** + * The Cached UI delegate. + */ + private static final UIBasicButtonUI BUTTON_UI = new UIBasicButtonUI(); + + /* the only instance of the stroke for the focus */ + private static final BasicStroke FOCUS_STROKE = + new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 1.0f, new float[]{1.0f, 1.0f}, 0.0f); + + private boolean graphicsTranslated; + private boolean isToolBarButton, isFileChooserButton; + private boolean isDefault; + + public UIBasicButtonUI() { + } + + /** + * 初始化UI + * + * @param c 组件c + */ + public void installUI(JComponent c) { + super.installUI(c); + + if (!ThemeUtils.BUTTON_ENTER) { + return; + } + if (!c.isFocusable()) { + return; + } + + InputMap km = (InputMap) UIManager.get(getPropertyPrefix() + "focusInputMap"); + + if (km != null) { + // replace SPACE with ENTER (but SPACE will still work, don't know why) + km.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false), "pressed"); + km.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), "released"); + } + } + + /** + * 加载默认的 + * + * @param button 按钮 + */ + public void installDefaults(AbstractButton button) { + super.installDefaults(button); + button.setRolloverEnabled(true); + } + + protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect, Rectangle textRect, Rectangle iconRect) { + boolean isToolButtonFocus = isToolBarButton && !ThemeUtils.TOOL_FOCUS; + boolean isOk = isFileChooserButton || !ThemeUtils.BUTTON_FOCUS; + if (isOk || isToolButtonFocus) { + return; + } + + Graphics2D g2d = (Graphics2D) g; + Rectangle focusRect = b.getBounds(); + + g.setColor(Color.black); + g2d.setStroke(FOCUS_STROKE); + + int x1 = 2; + int y1 = 2; + int x2 = x1 + focusRect.width - 5; + int y2 = y1 + focusRect.height - 5; + + if (!isToolBarButton) { + x1++; + y1++; + x2--; + y2--; + } + } + + /** + * 创建UI + * + * @param c 组件 + * @return 创建的UI + */ + public static ComponentUI createUI(final JComponent c) { + return BUTTON_UI; + } + + protected void paintButtonPressed(Graphics g, AbstractButton button) { + if (isToolBarButton || isFileChooserButton) { + return; + } + + Color col = null; + if (!ComparatorUtils.equals(button.getBackground(), ThemeUtils.BUTTON_NORMAL_COLOR)) { + col = ColorRoutines.darken(button.getBackground(), BG_CHANGE_AMOUNT); + } else { + col = ThemeUtils.BUTTON_PRESS_COLOR; + } + + g.setColor(col); + + drawXpButton(g, button, col, false); + if (!(button instanceof JToggleButton)) { + // Changed in 1.3.04: If button is icon-only + // then don't shift + if (ThemeUtils.SHIFT_BUTTON_TEXT && button.getText() != null && !"".equals(button.getText())) { + g.translate(1, 1); + graphicsTranslated = true; + } + } + } + + public void paintToolBarButton(Graphics g, AbstractButton b) { + Color col = null; + + // New in 1.3.7 + boolean isRollover = b.getModel().isRollover() || b.getModel().isArmed(); + Color toolButtColor = null; + + if (isFileChooserButton) { + toolButtColor = b.getParent().getBackground(); + } else { + toolButtColor = ThemeUtils.TOOLBUTT_COLOR; + } + + if (b.getModel().isPressed()) { + if (isRollover) { + col = ThemeUtils.TOOLBUTT_PRESSED_COLOR; + } else { + if (b.isSelected()) { + col = ThemeUtils.TOOLBUTT_SELECTED_COLOR; + } else { + col = toolButtColor; + } + } + } else if (isRollover) { + if (b.isSelected()) { + col = ThemeUtils.TOOLBUTT_SELECTED_COLOR; + } else { + col = ThemeUtils.TOOLBUTT_ROLLOVER_COLOR; + } + } else if (b.isSelected()) { + col = ThemeUtils.TOOLBUTT_SELECTED_COLOR; + } else { + col = toolButtColor; + } + g.setColor(col); + drawXpToolBarButton(g, b, col, false); + } + + public void paint(Graphics g, JComponent c) { + AbstractButton button = (AbstractButton) c; + if (isToolBarButton || isFileChooserButton) { + paintToolBarButton(g, button); + // the base class may paint text and/or icons + super.paint(g, c); + return; + } + if ((button instanceof JToggleButton) && button.isSelected()) { + paintButtonPressed(g, button); + // the base class may paint text and/or icons + super.paint(g, c); + return; + } + isDefault = (c instanceof JButton) && (((JButton) c).isDefaultButton()); + boolean isRollover = button.getModel().isRollover() && ThemeUtils.BUTTON_ROLLOVER; + boolean isDefinedBackground = ComparatorUtils.equals(c.getBackground(), ThemeUtils.BUTTON_NORMAL_COLOR); + Color col = null; + if (!button.isEnabled()) { + col = ThemeUtils.BUTTON_DISABLE_COLOR; + } else if (button.getModel().isPressed()) { + if (isRollover) { + if (isDefinedBackground) { + col = ThemeUtils.BUTTON_PRESS_COLOR; + } else { + col = ColorRoutines.darken(c.getBackground(), BG_CHANGE_AMOUNT); + } + } else { + // button pressed but mouse exited + col = c.getBackground(); + } + } else if (isRollover) { + if (isDefinedBackground) { + col = ThemeUtils.BUTTON_ROLLOVER_BG_COLOR; + } else { + col = ColorRoutines.lighten(c.getBackground(), BG_CHANGE_AMOUNT); + } + } else { + col = c.getBackground(); + } + g.setColor(col); + drawXpButton(g, button, col, isRollover); + // the base class may paint text and/or icons + super.paint(g, c); + } + + // this overrides BasicButtonUI.paintIcon(...) + protected void paintIcon(Graphics g, JComponent c, Rectangle iconRect) { + if (c instanceof JToggleButton) { + paintToggleButtonIcon(g, c, iconRect); + } else { + super.paintIcon(g, c, iconRect); + } + } + + protected void paintToggleButtonIcon(Graphics g, JComponent c, Rectangle iconRect) { + AbstractButton b = (AbstractButton) c; + ButtonModel model = b.getModel(); + Icon icon = null; + + if (!model.isEnabled()) { + if (model.isSelected()) { + icon = (Icon) b.getDisabledSelectedIcon(); + } else { + icon = (Icon) b.getDisabledIcon(); + } + } else if (model.isPressed() && model.isArmed()) { + icon = (Icon) b.getPressedIcon(); + if (icon == null) { + // Use selected icon + icon = (Icon) b.getSelectedIcon(); + } + } else if (model.isSelected()) { + if (b.isRolloverEnabled() && model.isRollover()) { + icon = (Icon) b.getRolloverSelectedIcon(); + if (icon == null) { + icon = (Icon) b.getSelectedIcon(); + } + } else { + icon = (Icon) b.getSelectedIcon(); + } + } else if (model.isRollover()) { + icon = (Icon) b.getRolloverIcon(); + } + + if (icon == null) { + icon = (Icon) b.getIcon(); + } + + icon.paintIcon(b, g, iconRect.x, iconRect.y); + } + + public void update(Graphics g, JComponent c) { + + isToolBarButton = ComparatorUtils.equals(Boolean.TRUE, c.getClientProperty(UIToolBarUI.IS_TOOL_BAR_BUTTON_KEY)); + isFileChooserButton = ComparatorUtils.equals(Boolean.TRUE, c.getClientProperty("JFileChooser.isFileChooserButton")); + paint(g, c); + graphicsTranslated = false; + } + + private void drawXpButton(Graphics g, AbstractButton b, Color c, boolean isRollover) { + if (!b.isContentAreaFilled()) { + return; + } + if (!b.isOpaque()) { + return; + } + int w = b.getWidth(); + int h = b.getHeight(); + + // paint border background + if (b.getParent() != null) { + Color bg = b.getParent().getBackground(); + g.setColor(bg); + } + g.drawRect(0, 0, w - 1, h - 1); + + Color normalLightColor = ThemeUtils.NORMAL_LIGHT_COLOR; + Color normalDarkColor = ThemeUtils.NORMAL_DARK_COLOR; + Graphics2D g2 = (Graphics2D) g; + drawHighLightButton(g2, normalLightColor, normalDarkColor, w, h); + + // 1 pixel away from each corner + if (isRollover) { + g2.setColor(ThemeUtils.BUTTON_ROLLOVER_COLOR); + g2.drawLine(1, h - 2, 1, h - 2); + g2.drawLine(w - 2, h - 2, w - 2, h - 2); + Color rolloverLightColor = ThemeUtils.ROLLOVER_LIGHT_COLOR; + Color rolloverDarkColor = ThemeUtils.ROLLOVER_DARK_COLOR; + drawHighLightButton(g2, rolloverLightColor, rolloverDarkColor, w, h); + + } else if (isDefault) { + g2.setColor(ThemeUtils.BUTTON_DEFAULT_COLOR); + g2.drawLine(1, h - 2, 1, h - 2); + g2.drawLine(w - 2, h - 2, w - 2, h - 2); + Color defaultLightColor = ThemeUtils.DEFAULT_LIGHT_COLOR; + Color defaultDarkColor = ThemeUtils.DEFAULT_DARK_COLOR; + drawHighLightButton(g2, defaultLightColor, defaultDarkColor, w, h); + } + } + + //harry: 画带有高光的按钮。 + private void drawHighLightButton(Graphics2D g2, Color color1, Color color2, int w, int h) { + GradientPaint buttonPaint = new GradientPaint(0, 0, color1, 0, h - 1, color2); + GradientPaint buttonHighLightPaint = new GradientPaint(0, 0, new Color(1.0f, 1.0f, 1.0f, 0.6f), 0, h / 2, new Color(1.0f, 1.0f, 1.0f, 0.2f)); + GradientPaint buttonHighLightLinePaint = new GradientPaint(1, 1, new Color(1.0f, 1.0f, 1.0f, 0.8f), 0, h / 2, new Color(1.0f, 1.0f, 1.0f, 0.4f)); + g2.setPaint(buttonPaint); + g2.fillRoundRect(0, 0, w - 1, h - 1, 3, 3); + g2.setPaint(buttonHighLightLinePaint);//按钮内侧高光线(内发光,0%阻塞) + g2.drawRoundRect(1, 1, w - 3, h - 3, 2, 2); + g2.setPaint(buttonHighLightPaint); + g2.fillRoundRect(0, 0, w - 1, h / 2, 3, 3);//按钮高光,覆盖按钮的上半部分。 + } + + + private void drawXpToolBarButton(Graphics g, AbstractButton b, Color c, boolean isPressed) { + int w = b.getWidth(); + int h = b.getHeight(); + b.setOpaque(false); + + if (b.isContentAreaFilled()) { + g.fillRect(1, 1, w - 2, h - 2); + } + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIButton.java b/designer-base/src/com/fr/design/gui/ibutton/UIButton.java new file mode 100644 index 0000000000..2af8c8f918 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIButton.java @@ -0,0 +1,365 @@ +package com.fr.design.gui.ibutton; + +import com.fr.base.BaseUtils; +import com.fr.base.CellBorderStyle; +import com.fr.base.GraphHelper; +import com.fr.design.constants.UIConstants; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.stable.Constants; +import com.fr.stable.StringUtils; +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.*; +import javax.swing.plaf.ButtonUI; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.geom.RoundRectangle2D; + +public class UIButton extends JButton implements UIObserver { + + public static final int OTHER_BORDER = 1; + public static final int NORMAL_BORDER = 2; + private static final int HEIGH = 20; + private boolean isExtraPainted = true; + private boolean isRoundBorder = true; + private int rectDirection = Constants.NULL; + private Stroke borderStroke = UIConstants.BS; + private Color borderColor = UIConstants.LINE_COLOR; + + private boolean isPressedPainted = true; + private boolean isNormalPainted = true; + protected boolean isBorderPaintedOnlyWhenPressed = false; + + private int borderType = NORMAL_BORDER; + private CellBorderStyle border = null; + + protected UIObserverListener uiObserverListener; + private static final int TOOLTIP_INIT_DELAY = 300; // 延迟 0.3s 显示提示文字 + + public UIButton() { + this(StringUtils.EMPTY); + } + + public UIButton(String string) { + super(string); + init(); + } + + + public UIButton(Icon icon) { + super(icon); + init(); + } + + public UIButton(Action action) { + super(action); + init(); + } + + public UIButton(String text, Icon icon) { + super(text, icon); + init(); + } + + /** + * 是否进行过权限编辑 + * @param role 角色 + * @return 否 + */ + public boolean isDoneAuthorityEdited(String role) { + return false; + } + + public UIButton(Icon normal, Icon rollOver, Icon pressed) { + super(normal); + setBorderPainted(false); + setRolloverIcon(rollOver); + setPressedIcon(pressed); + setExtraPainted(false); + setBackground(null); + setForeground(UIConstants.FONT_COLOR); + setOpaque(false); + initListener(); + } + + protected void initListener() { + if (shouldResponseChangeListener()) { + this.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (uiObserverListener == null) { + return; + } + uiObserverListener.doChange(); + } + }); + } + } + + + //确定是正常的边框类型,还是其他的Border类型 + //若是其他的border类型,则要setOtherType,即设置线型颜色等。若是其他类型,但是没有设置,则默认的是虚线型边框 + public void setBorderType(int borderType) { + this.borderType = borderType; + } + + + public void setBorderStyle(CellBorderStyle border) { + this.border = border; + } + + public void set4ToolbarButton() { + setNormalPainted(false); + Dimension dim = getPreferredSize(); + dim.height = HEIGH; + setBackground(null); + setOpaque(false); + setSize(dim); + setBorderPaintedOnlyWhenPressed(true); + } + + public void set4LargeToolbarButton() { + setNormalPainted(false); + setBackground(null); + setOpaque(false); + setSize(new Dimension(40, 40)); + setBorderPaintedOnlyWhenPressed(true); + } + + public void set4ChartLargeToolButton(){ + setNormalPainted(false); + setBackground(null); + setOpaque(false); + setSize(new Dimension(34, 44)); + setBorderPaintedOnlyWhenPressed(true); + } + + + private void init() { + setOpaque(false); + setBackground(null); + setRolloverEnabled(true); + initListener(); + ToolTipManager.sharedInstance().setInitialDelay(TOOLTIP_INIT_DELAY); + } + + @Override + public ButtonUI getUI() { + return new UIButtonUI(); + } + + /** + * 更新界面 + */ + public void updateUI() { + setUI(getUI()); + } + + public CellBorderStyle getBorderStyle() { + return this.border; + } + + @Override + public Insets getInsets() { + if (getIcon() != null) { + return new Insets(0, 3, 0, 3); + } + return new Insets(0, 10, 0, 10); + } + + //@Override + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, 20); + } + + + public int getBorderType() { + return borderType; + } + + public void setOtherBorder(Stroke s, Color c) { + borderStroke = s; + borderColor = c; + } + + + @Override + protected void paintBorder(Graphics g) { + + if (!isBorderPainted()) { + return; + } + if (borderType == OTHER_BORDER) { + paintOtherBorder(g); + } else { + boolean isPress = (isBorderPaintedOnlyWhenPressed && getModel().isPressed()); + if (isPress || !isBorderPaintedOnlyWhenPressed) { + if (ui instanceof UIButtonUI) { + ((UIButtonUI) ui).paintBorder(g, this); + + } else { + super.paintBorder(g); + + } + } + } + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + Dimension size = this.getSize(); + Graphics2D g2d = (Graphics2D) g; + Stroke oldStroke = g2d.getStroke(); + if (border != null) { + g2d.setColor(border.getTopColor()); + GraphHelper.drawLine(g2d, 3, 4, size.getWidth() - 4, 4, border.getTopStyle()); + g2d.setColor(border.getLeftColor()); + GraphHelper.drawLine(g2d, 3, 4, 3, size.getHeight() - 4, border.getLeftStyle()); + g2d.setColor(border.getBottomColor()); + GraphHelper.drawLine(g2d, 3, size.getHeight() - 4, size.getWidth() - 4, size.getHeight() - 4, border.getBottomStyle()); + g2d.setColor(border.getRightColor()); + GraphHelper.drawLine(g2d, size.getWidth() - 4, 4, size.getWidth() - 4, size.getHeight() - 4, border.getRightStyle()); + } else { + GraphHelper.drawLine(g2d, 2, 4, size.getWidth() - 4, 4, Constants.LINE_NONE); + GraphHelper.drawLine(g2d, 2, 4, 2, size.getHeight() - 4, Constants.LINE_NONE); + GraphHelper.drawLine(g2d, 2, size.getHeight() - 4, size.getWidth() - 4, size.getHeight() - 4, Constants.LINE_NONE); + GraphHelper.drawLine(g2d, size.getWidth() - 4, 4, size.getWidth() - 4, size.getHeight() - 4, Constants.LINE_NONE); + } + g2d.setStroke(oldStroke); + } + + + protected void paintOtherBorder(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + g2d.setStroke(borderStroke); + Shape shape = new RoundRectangle2D.Float(0.5f, 0.5f, getWidth() - 1, getHeight() - 1, UIConstants.ARC, UIConstants.ARC); + g2d.setColor(borderColor); + g2d.draw(shape); + } + + public void setExtraPainted(boolean extra) { + this.isExtraPainted = extra; + } + + /** + * 是否额外画 + * @return 是则返回TRUE + */ + public boolean isExtraPainted() { + return this.isExtraPainted; + } + + /** + * @return + */ + public int getRectDirection() { + return rectDirection; + } + + /** + * 是否圆边框 + * @return 是则返回true + */ + public boolean isRoundBorder() { + return isRoundBorder; + } + + /** + * @param isRoundBorder + */ + public void setRoundBorder(boolean isRoundBorder) { + setRoundBorder(isRoundBorder, Constants.NULL); + } + + /** + * @param isRound + * @param rectDirection + */ + public void setRoundBorder(boolean isRound, int rectDirection) { + this.isRoundBorder = isRound; + this.rectDirection = rectDirection; + } + + /** + * 是否按压画 + * @return 是则返回TRUE + */ + public boolean isPressedPainted() { + return isPressedPainted; + } + + /** + * @param isPressedPainted + */ + public void setPressedPainted(boolean isPressedPainted) { + this.isPressedPainted = isPressedPainted; + } + + /** + * 是否正常画 + * @return 是则返回TRUE + */ + public boolean isNormalPainted() { + return isNormalPainted; + } + + /** + * @param isNormalPressed + */ + public void setNormalPainted(boolean isNormalPressed) { + this.isNormalPainted = isNormalPressed; + if (!isNormalPressed) { + setBackground(null); + setOpaque(false); + } + } + + /** + * @param value + */ + public void setBorderPaintedOnlyWhenPressed(boolean value) { + this.isBorderPaintedOnlyWhenPressed = value; + } + + /** + * 主函数 + * @param args 入口参数 + */ + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(null); + + UIButton bb = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); + bb.setEnabled(false); + bb.setBorderType(OTHER_BORDER); + // bb.setBounds(20, 20,content.getSize().width, bb.getPreferredSize().height); + bb.setPreferredSize(new Dimension(100, 30)); + bb.setBounds(0, 0, bb.getPreferredSize().width, bb.getPreferredSize().height); + content.add(bb); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } + + /** + * 给组件登记一个观察者监听事件 + * + * @param listener 观察者监听事件 + */ + public void registerChangeListener(UIObserverListener listener) { + this.uiObserverListener = listener; + } + + /** + * 组件是否需要响应添加的观察者事件 + * + * @return 如果需要响应观察者事件则返回true,否则返回false + */ + public boolean shouldResponseChangeListener() { + return true; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIButtonBorder.java b/designer-base/src/com/fr/design/gui/ibutton/UIButtonBorder.java new file mode 100644 index 0000000000..623db56b9e --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIButtonBorder.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.ibutton; + +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.DrawRoutines; +import com.fr.design.utils.ThemeUtils; + + +import javax.swing.*; +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.UIResource; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-19 + * Time: 上午10:30 + */ +public class UIButtonBorder extends AbstractBorder implements UIResource { + protected final Insets borderInsets = new Insets(2, 2, 2, 2); + + /** + * Draws the button border for the given component. + * + * @param c The component to draw its border. + * @param g The graphics context. + * @param x The x coordinate of the top left corner. + * @param y The y coordinate of the top left corner. + * @param w The width. + * @param h The height. + */ + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + drawXpBorder(c, g, x, y, w, h); + } + + + private void drawXpBorder(Component c, Graphics g, int x, int y, int w, int h) { + AbstractButton b = (AbstractButton) c; + boolean isDefault = (c instanceof JButton) && (((JButton) c).isDefaultButton()); + boolean isComboBoxButton = ComparatorUtils.equals(Boolean.TRUE,b.getClientProperty("isComboBoxButton")); + if (isComboBoxButton) { + if (!b.isEnabled()) { + DrawRoutines.drawRoundedBorder( + g, ThemeUtils.COMBO_BORDER_DISABLED_COLOR, x, y, w, h); + } else { + DrawRoutines.drawRoundedBorder( + g, ThemeUtils.COMBO_BORDER_COLOR, x, y, w, h); + + if (b.getModel().isPressed()){ + return; + } + } + } else { // it's a normal JButton or a JSpinner button + boolean isSpinnerButton = ComparatorUtils.equals(Boolean.TRUE,b.getClientProperty("isSpinnerButton")) ; + if (!b.isEnabled()) { + DrawRoutines.drawRoundedBorder( + g, ThemeUtils.BUTTON_BORDER_DISABLE_COLOR, x, y, w, h); + } else { + DrawRoutines.drawRoundedBorder( + g, ThemeUtils.BUTTON_BORDER_COLOR, x, y, w, h); + + if (b.getModel().isPressed()){ + return; + } + + } + } + } + + /** + * Gets the border insets for a given component. + * + * @param c The component to get its border insets. + * @return Always returns the same insets as defined in insets. + */ + public Insets getBorderInsets(Component c) { + return borderInsets; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIButtonGroup.java b/designer-base/src/com/fr/design/gui/ibutton/UIButtonGroup.java new file mode 100644 index 0000000000..59ad63de60 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIButtonGroup.java @@ -0,0 +1,449 @@ +package com.fr.design.gui.ibutton; + +import com.fr.design.constants.UIConstants; +import com.fr.design.event.GlobalNameListener; +import com.fr.design.event.GlobalNameObserver; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; +import sun.swing.SwingUtilities2; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.basic.BasicHTML; +import javax.swing.text.View; +import java.awt.*; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.geom.RoundRectangle2D; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class UIButtonGroup extends JPanel implements GlobalNameObserver { + private static final long serialVersionUID = 1L; + protected List labelButtonList; + protected int selectedIndex = -1; + private List objectList;// 起到一个render的作用 + private GlobalNameListener globalNameListener = null; + private String buttonGroupName = StringUtils.EMPTY; + private boolean isToolBarComponent = false; + private boolean isClick; + + public UIButtonGroup(String[] textArray) { + this(textArray, null); + } + + public UIButtonGroup(Icon[] iconArray) { + this(iconArray, null); + } + + public UIButtonGroup(Icon[][] iconArray) { + this(iconArray, null); + } + + public UIButtonGroup(Icon[] iconArray, T[] objects) { + if (!ArrayUtils.isEmpty(objects) && iconArray.length == objects.length) { + this.objectList = Arrays.asList(objects); + } + labelButtonList = new ArrayList(iconArray.length); + this.setLayout(getGridLayout(iconArray.length)); + this.setBorder(getGroupBorder()); + for (int i = 0; i < iconArray.length; i++) { + final int index = i; + Icon icon = iconArray[i]; + final UIToggleButton labelButton = new UIToggleButton(icon) { + @Override + protected MouseListener getMouseListener() { + return new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + isClick = true; + if (!isEnabled()) { + return; + } + if (globalNameListener != null) { + globalNameListener.setGlobalName(buttonGroupName); + } + setSelectedWithFireChanged(index); + } + }; + } + + public boolean shouldResponseNameListener() { + return false; + } + }; + initButton(labelButton); + } + } + + public UIButtonGroup(Icon[][] iconArray, T[] objects) { + if (!ArrayUtils.isEmpty(objects) && iconArray.length == objects.length) { + this.objectList = Arrays.asList(objects); + } + labelButtonList = new ArrayList(iconArray.length); + this.setLayout(getGridLayout(iconArray.length)); + this.setBorder(getGroupBorder()); + for (int i = 0; i < iconArray.length; i++) { + final int index = i; + Icon[] icon = iconArray[i]; + final UIToggleButton labelButton = new UIToggleButton(icon) { + @Override + protected MouseListener getMouseListener() { + return new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + isClick = true; + if (!isEnabled()) { + return; + } + if (globalNameListener != null) { + globalNameListener.setGlobalName(buttonGroupName); + } + setSelectedWithFireChanged(index); + } + }; + } + + public boolean shouldResponseNameListener() { + return false; + } + }; + initButton(labelButton); + } + } + + public boolean hasClick() { + return isClick; + } + + public void setClickState(boolean changeFlag) { + isClick = changeFlag; + } + + public void setForToolBarButtonGroup(boolean isToolBarComponent) { + this.isToolBarComponent = isToolBarComponent; + if (isToolBarComponent) { + for (int i = 0; i < labelButtonList.size(); i++) { + labelButtonList.get(i).set4ToolbarButton(); + } + } + repaint(); + + } + + + /** + * setEnabled + * + * @param enabled + */ + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + for (int i = 0; i < labelButtonList.size(); i++) { + labelButtonList.get(i).setEnabled(enabled); + } + } + + public UIButtonGroup(String[] textArray, T[] objects) { + if (!ArrayUtils.isEmpty(objects) && textArray.length == objects.length) { + this.objectList = Arrays.asList(objects); + } + labelButtonList = new ArrayList(textArray.length); + this.setLayout(getGridLayout(textArray.length)); + this.setBorder(getGroupBorder()); + for (int i = 0; i < textArray.length; i++) { + final int index = i; + final UIToggleButton labelButton = new UIToggleButton(textArray[i]) { + @Override + protected MouseListener getMouseListener() { + return new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + if (!isEnabled()) { + return; + } + if (globalNameListener != null) { + globalNameListener.setGlobalName(buttonGroupName); + } + setSelectedWithFireChanged(index); + } + }; + } + + @Override + public Insets getInsets() { + return new Insets(0, 2, 0, 2); + } + + public boolean shouldResponseNameListener() { + return false; + } + + }; + labelButton.setUI(new UIButtonUI() { + protected void paintText(Graphics g, AbstractButton b, String text, Rectangle textRec) { + View v = (View) b.getClientProperty(BasicHTML.propertyKey); + if (v != null) { + v.paint(g, textRec); + return; + } + FontMetrics fm = SwingUtilities2.getFontMetrics(b, g); + int mnemonicIndex = b.getDisplayedMnemonicIndex(); + if (isPressed(b)) { + g.setColor(Color.white); + } else { + g.setColor(b.isEnabled() ? Color.black : UIConstants.LINE_COLOR); + } + + SwingUtilities2.drawStringUnderlineCharAt(b, g, text, mnemonicIndex, textRec.x + getTextShiftOffset(), textRec.y + fm.getAscent() + getTextShiftOffset()); + } + }); + initButton(labelButton); + } + } + + public void setGlobalName(String name) { + buttonGroupName = name; + } + + protected void initButton(UIToggleButton labelButton) { + labelButton.setBorderPainted(false); + labelButtonList.add(labelButton); + this.add(labelButton); + } + + protected Border getGroupBorder() { + return BorderFactory.createEmptyBorder(1, 1, 1, 1); + } + + protected LayoutManager getGridLayout(int number) { + return new GridLayout(0, number, 0, 0); + } + + /** + * paintComponent + * + * @param g + */ + public void paintComponents(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + Shape oldClip = g2d.getClip(); + g2d.clip(new RoundRectangle2D.Double(1, 1, getWidth(), getHeight(), UIConstants.ARC, UIConstants.ARC)); + super.paintComponents(g); + g2d.setClip(oldClip); + } + + /** + * setSelectedItem + * + * @param ob + */ + public void setSelectedItem(T ob) { + if (objectList == null) { + setSelectedIndex(-1); + return; + } + setSelectedIndex(objectList.indexOf(ob)); + } + + /** + * getSelectedItem + * + * @return + */ + public T getSelectedItem() { + if (selectedIndex == -1) { + return null; + } + return objectList.get(selectedIndex); + } + + /** + * getSelectedIndex + * + * @return + */ + public int getSelectedIndex() { + return selectedIndex; + } + + protected void setSelectedWithFireChanged(int newSelectedIndex) { + selectedIndex = newSelectedIndex; + for (int i = 0; i < labelButtonList.size(); i++) { + if (i == selectedIndex) { + labelButtonList.get(i).setSelectedWithFireListener(true); + } else { + labelButtonList.get(i).setSelected(false); + } + } + } + + /** + * setSelectedIndex + * + * @param newSelectedIndex + */ + public void setSelectedIndex(int newSelectedIndex) { + selectedIndex = newSelectedIndex; + for (int i = 0; i < labelButtonList.size(); i++) { + labelButtonList.get(i).setSelected(i == selectedIndex); + } + } + + private void fireStateChanged() { + Object[] listeners = listenerList.getListenerList(); + ChangeEvent e = null; + + for (int i = 0; i < listeners.length; i++) { + if (listeners[i] == ChangeListener.class) { + if (e == null) { + e = new ChangeEvent(this); + } + ((ChangeListener) listeners[i + 1]).stateChanged(e); + } + } + } + + /** + * getButton + * + * @param index + * @return + */ + public UIToggleButton getButton(int index) { + return labelButtonList.get(index); + } + + /** + * 给所有的Button添加Tips + * + * @param tips + */ + public void setAllToolTips(String[] tips) { + for (int i = 0; i < labelButtonList.size(); i++) { + labelButtonList.get(i).setToolTipText(tips[i]); + } + } + + + /** + * 注册全局属性名字监听器 + * + * @param listener 观察者监听事件 + */ + public void registerNameListener(GlobalNameListener listener) { + globalNameListener = listener; + } + + /** + * 是否响应名字监听事件 + * + * @return + */ + public boolean shouldResponseNameListener() { + return true; + } + + + /** + * @param l + */ + public void addChangeListener(ChangeListener l) { + for (int i = 0; i < labelButtonList.size(); i++) { + labelButtonList.get(i).addChangeListener(l); + listenerList.add(ChangeListener.class, l); + } + } + + /** + * @param l + */ + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + + /** + * @param l + */ + public void addActionListener(ActionListener l) { + for (int i = 0; i < labelButtonList.size(); i++) { + labelButtonList.get(i).addActionListener(l); + } + } + + + /** + * @param l + */ + public void removeActionListener(ActionListener l) { + for (int i = 0; i < labelButtonList.size(); i++) { + labelButtonList.get(i).removeActionListener(l); + } + } + + /** + * populate + */ + public void populateBean() { + fireStateChanged(); + } + + /** + * 重载Border画法 + * + * @param g + */ + @Override + protected void paintBorder(Graphics g) { + if (isToolBarComponent) { + return; + } + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(UIConstants.SHADOW_GREY); + + int width = 0; + for (int i = 0; i < labelButtonList.size() - 1; i++) { + width += labelButtonList.get(i).getWidth() + 1; + int height = labelButtonList.get(i).getHeight(); + g.drawLine(width, 0, width, height); + } + + width += labelButtonList.get(labelButtonList.size() - 1).getWidth() + 1; + + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.drawRoundRect(0, 0, width, getHeight() - 1, UIConstants.BUTTON_GROUP_ARC, UIConstants.BUTTON_GROUP_ARC); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + + } + + /** + * main + * + * @param args + */ + public static void main(String... args) { +// JFrame jf = new JFrame("test"); +// jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); +// JPanel content = (JPanel) jf.getContentPane(); +// content.setLayout(new BorderLayout()); +// Icon[] a1 = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), +// BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png")}; +// Integer[] a2 = new Integer[]{Constants.LEFT, Constants.CENTER, Constants.RIGHT}; +// UIButtonGroup bb = new UIButtonGroup(a1, a2); +// bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); +// bb.setSelectedIndex(0); +// bb.setEnabled(false); +// content.add(bb); +// GUICoreUtils.centerWindow(jf); +// jf.setSize(400, 400); +// jf.setVisible(true); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIButtonUI.java b/designer-base/src/com/fr/design/gui/ibutton/UIButtonUI.java new file mode 100644 index 0000000000..851ac8b513 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIButtonUI.java @@ -0,0 +1,171 @@ +package com.fr.design.gui.ibutton; + +import com.fr.design.constants.UIConstants; +import com.fr.design.roleAuthority.ReportAndFSManagePane; +import com.fr.design.utils.gui.GUIPaintUtils; +import com.fr.stable.StringUtils; +import sun.swing.SwingUtilities2; + +import javax.swing.*; +import javax.swing.plaf.basic.BasicButtonUI; +import javax.swing.plaf.basic.BasicHTML; +import javax.swing.text.View; +import java.awt.*; + +public class UIButtonUI extends BasicButtonUI { + + private Rectangle viewRec = new Rectangle(); + private Rectangle textRec = new Rectangle(); + private Rectangle iconRec = new Rectangle(); + + @Override + public void paint(Graphics g, JComponent c) { + UIButton b = (UIButton) c; + Graphics2D g2d = (Graphics2D) g; + int w = b.getWidth(); + int h = b.getHeight(); + + String text = initRecAndGetText(b, SwingUtilities2.getFontMetrics(b, g), b.getWidth(), b.getHeight()); + String selectedRoles = ReportAndFSManagePane.getInstance().getRoleTree().getSelectedRoleName(); + clearTextShiftOffset(); + + ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + if (b.isExtraPainted()) { + doExtraPainting(b, g2d, w, h, selectedRoles); + } + ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + + paintContent(g, b, text); + } + + protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { + if (isPressed(b) && b.isPressedPainted()) { + GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles)); + } else if (isRollOver(b)) { + GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); + } else if (b.isNormalPainted()) { + GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); + } + } + + protected boolean isRollOver(AbstractButton b) { + ButtonModel model = b.getModel(); + return model.isRollover() && !b.isSelected(); + } + + protected boolean isPressed(AbstractButton b) { + ButtonModel model = b.getModel(); + return (model.isArmed() && model.isPressed()) || b.isSelected(); + } + + private void paintContent(Graphics g, AbstractButton b, String text) { + if (b.getIcon() != null) { + paintIcon(g, b); + } + if (!StringUtils.isEmpty(text)) { + paintText(g, b, text); + } + } + + private void paintText(Graphics g, AbstractButton b, String text) { + paintText(g, b, text ,textRec); + } + + protected void paintText(Graphics g, AbstractButton b, String text, Rectangle textRec) { + View v = (View) b.getClientProperty(BasicHTML.propertyKey); + if (v != null) { + v.paint(g, textRec); + return; + } + FontMetrics fm = SwingUtilities2.getFontMetrics(b, g); + int mnemonicIndex = b.getDisplayedMnemonicIndex(); + if (b.isEnabled()) { + g.setColor(b.getForeground()); + } else { + g.setColor(UIConstants.LINE_COLOR); + } + + SwingUtilities2.drawStringUnderlineCharAt(b, g, text, mnemonicIndex, textRec.x + getTextShiftOffset(), textRec.y + fm.getAscent() + getTextShiftOffset()); + } + + private String initRecAndGetText(AbstractButton b, FontMetrics fm, int width, int height) { + Insets i = b.getInsets(); + viewRec.x = i.left; + viewRec.y = i.top; + viewRec.width = width - (i.right + viewRec.x); + viewRec.height = height - (i.bottom + viewRec.y); + textRec.x = textRec.y = textRec.width = textRec.height = 0; + iconRec.x = iconRec.y = iconRec.width = iconRec.height = 0; + // layout the text and icon + return SwingUtilities.layoutCompoundLabel( + b, fm, b.getText(), b.getIcon(), + b.getVerticalAlignment(), b.getHorizontalAlignment(), + b.getVerticalTextPosition(), b.getHorizontalTextPosition(), + viewRec, iconRec, textRec, + b.getText() == null ? 0 : b.getIconTextGap()); + } + + protected void paintBorder(Graphics g, UIButton b) { + String selectedRoles = ReportAndFSManagePane.getInstance().getRoleTree().getSelectedRoleName(); + GUIPaintUtils.drawBorder((Graphics2D) g, 0, 0, b.getWidth(), b.getHeight(), b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles)); + + } + + protected void paintIcon(Graphics g, JComponent c) { + AbstractButton b = (AbstractButton) c; + ButtonModel model = b.getModel(); + Icon icon = b.getIcon(); + Icon tmpIcon = null; + if (icon == null) { + return; + } + Icon selectedIcon = null; + /* the fallback icon should be based on the selected state */ + if (model.isSelected()) { + selectedIcon = (Icon) b.getSelectedIcon(); + if (selectedIcon != null) { + icon = selectedIcon; + } + } + if (!model.isEnabled()) { + if (model.isSelected()) { + tmpIcon = (Icon) b.getDisabledSelectedIcon(); + if (tmpIcon == null) { + tmpIcon = selectedIcon; + } + } + if (tmpIcon == null) { + tmpIcon = (Icon) b.getDisabledIcon(); + } + } else if (model.isPressed() && model.isArmed()) { + tmpIcon = (Icon) b.getPressedIcon(); + if (tmpIcon != null) { + // revert back to 0 offset + clearTextShiftOffset(); + } + } else if (b.isRolloverEnabled() && model.isRollover()) { + if (model.isSelected()) { + tmpIcon = (Icon) b.getRolloverSelectedIcon(); + if (tmpIcon == null) { + tmpIcon = selectedIcon; + } + } + if (tmpIcon == null) { + tmpIcon = (Icon) b.getRolloverIcon(); + } + } + if (tmpIcon != null) { + icon = tmpIcon; + } + paintModelIcon(model, icon, g, c); + } + + protected void paintModelIcon(ButtonModel model, Icon icon, Graphics g, JComponent c) { + if (model.isPressed() && model.isArmed()) { + icon.paintIcon(c, g, iconRec.x + getTextShiftOffset(), + iconRec.y + getTextShiftOffset()); + } else { + icon.paintIcon(c, g, iconRec.x, iconRec.y); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIColorButton.java b/designer-base/src/com/fr/design/gui/ibutton/UIColorButton.java new file mode 100644 index 0000000000..c1dc9b0581 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIColorButton.java @@ -0,0 +1,251 @@ +package com.fr.design.gui.ibutton; + +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.AbstractButton; +import javax.swing.ButtonModel; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.EventListenerList; + +import com.fr.base.Utils; +import com.fr.design.constants.UIConstants; +import com.fr.design.event.GlobalNameListener; +import com.fr.design.event.GlobalNameObserver; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.design.gui.ipoppane.PopupHider; +import com.fr.general.ComparatorUtils; +import com.fr.design.style.color.ColorControlWindow; +import com.fr.design.utils.gui.GUICoreUtils; + +public class UIColorButton extends UIButton implements PopupHider, UIObserver, GlobalNameObserver { + private static final int SIZE = 16; + private static final int SIZE_2 = 2; + private static final int SIZE_4 = 4; + private static final int SIZE_6 = 6; + private static final int POPUP_MENU_SHIFT = -70; + private Color color = Color.BLACK; + private ColorControlWindow popupWin; + private EventListenerList colorChangeListenerList = new EventListenerList(); + private boolean isEventBanned = false; + private String colorButtonName = ""; + private UIObserverListener uiObserverListener; + private GlobalNameListener globalNameListener = null; + + public UIColorButton() { + this(UIConstants.FONT_ICON); + } + + public UIColorButton(Icon icon) { + super(icon); + setUI(getButtonUI()); + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + showPopupMenu(); + } + }); + iniListener(); + } + + private void iniListener() { + if (shouldResponseChangeListener()) { + this.addColorChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (uiObserverListener == null) { + return; + } + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(colorButtonName); + } + uiObserverListener.doChange(); + } + }); + } + } + + private UIButtonUI getButtonUI() { + return new UIButtonUI() { + @Override + protected void paintIcon(Graphics g, JComponent c) { + super.paintIcon(g, c); + AbstractButton b = (AbstractButton) c; + ButtonModel model = b.getModel(); + if (model.isEnabled()) { + g.setColor(UIColorButton.this.getColor()); + } else { + g.setColor(new Color(Utils.filterRGB(UIColorButton.this.getColor().getRGB(), 50))); + } + g.fillRect((b.getWidth() - SIZE) / SIZE_2, b.getHeight() - SIZE_6, SIZE, SIZE_4); + } + }; + } + + public void setEventBanned(boolean isEventBanned) { + this.isEventBanned = isEventBanned; + } + + public void setGlobalName(String name) { + colorButtonName = name; + } + + public Color getColor() { + return color; + } + + public void setColor(Color color) { + if (ComparatorUtils.equals(this.color, color)) { + return; + } + + this.color = color; + hidePopupMenu(); + fireColorStateChanged(); + } + + private void showPopupMenu() { + if (isEventBanned) { + return; + } + + if (popupWin != null && popupWin.isVisible()) { + hidePopupMenu(); + return; + } + + if (!this.isEnabled()) { + return; + } + + popupWin = this.getColorControlWindow(); + + GUICoreUtils.showPopupMenu(popupWin, this, POPUP_MENU_SHIFT, this.getSize().height); + } + + /** + * 隐藏popupmenu + */ + public void hidePopupMenu() { + if (popupWin != null) { + popupWin.setVisible(false); + repaint(); + } + + popupWin = null; + } + + private ColorControlWindow getColorControlWindow() { + //find parant. + if (this.popupWin == null) { + this.popupWin = new ColorControlWindow(UIColorButton.this) { + @Override + protected void colorChanged() { + UIColorButton.this.setColor(this.getColor()); + } + + }; + } + + return popupWin; + } + + /** + * 添加监听 + * + * @param changeListener 监听列表 + */ + public void addColorChangeListener(ChangeListener changeListener) { + colorChangeListenerList.add(ChangeListener.class, changeListener); + } + + /** + * 移除监听 + * Removes an old ColorChangeListener. + * @param changeListener 监听列表 + */ + public void removeColorChangeListener(ChangeListener changeListener) { + colorChangeListenerList.remove(ChangeListener.class, changeListener); + } + + /** + * 颜色状态改变 + */ + public void fireColorStateChanged() { + Object[] listeners = colorChangeListenerList.getListenerList(); + ChangeEvent e = null; + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + if (e == null) { + e = new ChangeEvent(this); + } + ((ChangeListener) listeners[i + 1]).stateChanged(e); + } + } + } + + + /** + * 注册状态改变监听 + * + * @param listener 观察者监听事件 + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } + + /** + * 是否需要响应监听 + * + * @return 是否响应 + */ + public boolean shouldResponseChangeListener() { + return true; + } + + /** + * 注册监听 + * + * @param listener 观察者监听事件 + */ + public void registerNameListener(GlobalNameListener listener) { + globalNameListener = listener; + } + + /** + * 是否需要相应 + * + * @return 是否响应 + */ + public boolean shouldResponseNameListener() { + return true; + } + + /** + * 主函数 + * + * @param args 参数 + */ + public static void main(String... args) { + LayoutManager layoutManager = null; + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(layoutManager); + + UIColorButton bb = new UIColorButton(UIConstants.FONT_ICON); + bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); + content.add(bb); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UICombinationButton.java b/designer-base/src/com/fr/design/gui/ibutton/UICombinationButton.java new file mode 100644 index 0000000000..4efd505890 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UICombinationButton.java @@ -0,0 +1,143 @@ +package com.fr.design.gui.ibutton; + +import java.awt.BorderLayout; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.Icon; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; + +import com.fr.design.constants.UIConstants; +import com.fr.stable.Constants; +import com.fr.design.utils.gui.GUICoreUtils; + +public class UICombinationButton extends JPanel{ + protected UIButton leftButton; + protected UIButton rightButton; + + protected void leftButtonClickEvent() { + + } + + protected void rightButtonClickEvent() { + + } + + public UICombinationButton() { + this(new UIButton(), new UIButton()); + } + + public UICombinationButton(UIButton left, UIButton right) { + leftButton = left; + rightButton = right; + + leftButton.setRoundBorder(true, Constants.RIGHT); + rightButton.setRoundBorder(true, Constants.LEFT); + + leftButton.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + rightButton.getModel().setPressed(true); + rightButton.getModel().setSelected(true); + rightButton.repaint(); + } + + @Override + public void mouseReleased(MouseEvent e) { + rightButton.getModel().setPressed(false); + rightButton.getModel().setSelected(false); + rightButton.repaint(); + } + @Override + public void mouseClicked(MouseEvent e) { + leftButtonClickEvent(); + } + }); + rightButton.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + leftButton.getModel().setPressed(true); + leftButton.getModel().setSelected(true); + leftButton.repaint(); + } + + @Override + public void mouseReleased(MouseEvent e) { + leftButton.getModel().setPressed(false); + leftButton.getModel().setSelected(false); + leftButton.repaint(); + } + + @Override + public void mouseClicked(MouseEvent e) { + rightButtonClickEvent(); + } + }); + + this.setLayout(new BorderLayout()); + this.add(leftButton, BorderLayout.CENTER); + this.add(rightButton, BorderLayout.EAST); + } + + public UICombinationButton(String left, Icon right) { + this(); + leftButton.setText(left); + rightButton.setIcon(right); + } + + public UICombinationButton(String left, String right) { + this(); + leftButton.setText(left); + rightButton.setText(right); + } + + public UICombinationButton(Icon left, Icon right) { + this(); + leftButton.setIcon(left); + rightButton.setIcon(right); + } + + public UIButton getLeftButton() { + return leftButton; + } + + public void setExtraPainted(boolean isExtraPainted) { + if(!isExtraPainted) { + leftButton.setBackground(null); + rightButton.setBackground(null); + leftButton.setOpaque(false); + rightButton.setOpaque(false); + } + } + + public UIButton getRightButton() { + return rightButton; + } + + public void set4Toolbar() { + leftButton.setNormalPainted(false); + rightButton.setNormalPainted(false); + leftButton.setBorderPaintedOnlyWhenPressed(true); + rightButton.setBorderPaintedOnlyWhenPressed(true); + } + + protected void showPopWindow(JPopupMenu menu) { + GUICoreUtils.showPopupMenu(menu, this, 0, getY() + getHeight() - 3); + } + + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel)jf.getContentPane(); + content.setLayout(null); + + UICombinationButton bb = new UICombinationButton("123455", UIConstants.ARROW_DOWN_ICON); + bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); + content.add(bb); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIHeadGroup.java b/designer-base/src/com/fr/design/gui/ibutton/UIHeadGroup.java new file mode 100644 index 0000000000..c1f5ed24e5 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIHeadGroup.java @@ -0,0 +1,182 @@ +package com.fr.design.gui.ibutton; + +import com.fr.base.BaseUtils; +import com.fr.design.constants.UIConstants; +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.ArrayList; +import java.util.List; + +public class UIHeadGroup extends JPanel { + protected List labelButtonList; + private boolean isNeedLeftRightOutLine = true; + protected int selectedIndex = -1; + + protected void tabChanged(int newSelectedIndex) { + + } + + public UIHeadGroup(String[] textArray) { + labelButtonList = new ArrayList(textArray.length); + this.setBackground(UIConstants.TREE_BACKGROUND); + this.setLayout(new GridLayout(0, textArray.length, 0, 0)); +// this.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); + for (int i = 0; i < textArray.length; i++) { + final int index = i; + String text = textArray[i]; + final UIToggleButton labelButton = new UIToggleButton(text) { + @Override + protected MouseListener getMouseListener() { + return new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + setSelectedIndex(index); + UIHeadGroup.this.repaint(); + } + }; + } + }; + initButton(labelButton); + } + setSelectedIndex(0); + } + + public UIHeadGroup(Icon[] iconArray) { + labelButtonList = new ArrayList(iconArray.length); + this.setBackground(UIConstants.NORMAL_BACKGROUND); + this.setLayout(new GridLayout(0, iconArray.length, 1, 0)); +// this.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); + for (int i = 0; i < iconArray.length; i++) { + final int index = i; + Icon icon = iconArray[i]; + final UIToggleButton labelButton = new UIToggleButton(icon) { + @Override + protected MouseListener getMouseListener() { + return new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + setSelectedIndex(index); + UIHeadGroup.this.repaint(); + } + }; + } + }; + initButton(labelButton); + } + setSelectedIndex(0); + } + + public UIHeadGroup(Icon[] iconArray, String[] textArray) { + labelButtonList = new ArrayList(Math.min(textArray.length, iconArray.length)); + this.setBackground(UIConstants.NORMAL_BACKGROUND); + this.setLayout(new GridLayout(0, textArray.length, 1, 0)); + for (int i = 0; i < textArray.length; i++) { + final int index = i; + String text = textArray[i]; + Icon icon = iconArray[i]; + final UIToggleButton labelButton = new UIToggleButton(text, icon) { + @Override + protected MouseListener getMouseListener() { + return new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + setSelectedIndex(index); + UIHeadGroup.this.repaint(); + } + }; + } + }; + initButton(labelButton); + } + setSelectedIndex(0); + } + + @Override + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height = 25; + return dim; + } + + @Override + protected void paintBorder(Graphics g) { +// Graphics2D g2d = (Graphics2D)g; +// g2d.setColor(UIConstants.LINE_COLOR); +// +// int width = 0; +// for(int i = 0; i < labelButtonList.size() - 1; i++) { +// int height = labelButtonList.get(i).getHeight(); +// width += labelButtonList.get(i).getWidth() + 1; +// g.drawLine(width, 0, width, height); +// } +// +// width += labelButtonList.get(labelButtonList.size() - 1).getWidth() + 1; +// if(isNeedLeftRightOutLine) { +// g2d.drawRect(0, 0, width, getHeight() - 1); +// } else { +// g2d.drawLine(1, 0, width - 1, 0); +// g2d.drawLine(1, getHeight() - 1, width - 1, getHeight() - 1); +// } +// +// +// g2d.setColor(UIConstants.NORMAL_BACKGROUND); +// UIToggleButton headButton = labelButtonList.get(selectedIndex); +// g2d.drawLine(headButton.getX(), headButton.getHeight() + 1, headButton.getX() + headButton.getWidth() - 1, headButton.getHeight() + 1); + } + + private void initButton(UIToggleButton labelButton) { + labelButton.setRoundBorder(false); + labelButton.setBorderPainted(false); + labelButton.setPressedPainted(false); + labelButtonList.add(labelButton); + this.add(labelButton); + } + + public void setSelectedIndex(int newSelectedIndex) { + selectedIndex = newSelectedIndex; + for (int i = 0; i < labelButtonList.size(); i++) { + UIToggleButton button = labelButtonList.get(i); + if (i == selectedIndex) { + button.setNormalPainted(false); + button.setBackground(new Color(240, 240, 243)); + button.setOpaque(true); + button.setSelected(true); + } else { + button.setOpaque(false); + button.setNormalPainted(true); + button.setSelected(false); + } + } + + tabChanged(newSelectedIndex); + } + + public void setNeedLeftRightOutLine(boolean isNeedLeftRightOutLine) { + this.isNeedLeftRightOutLine = isNeedLeftRightOutLine; + } + + public int getSelectedIndex() { + return selectedIndex; + } + + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(null); + Icon[] a1 = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), + BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png")}; + UIHeadGroup bb = new UIHeadGroup(a1); + bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); + bb.setSelectedIndex(0); + content.add(bb); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/ibutton/UIPasswordField.java b/designer-base/src/com/fr/design/gui/ibutton/UIPasswordField.java similarity index 100% rename from designer_base/src/com/fr/design/gui/ibutton/UIPasswordField.java rename to designer-base/src/com/fr/design/gui/ibutton/UIPasswordField.java diff --git a/designer_base/src/com/fr/design/gui/ibutton/UIPreviewButton.java b/designer-base/src/com/fr/design/gui/ibutton/UIPreviewButton.java similarity index 100% rename from designer_base/src/com/fr/design/gui/ibutton/UIPreviewButton.java rename to designer-base/src/com/fr/design/gui/ibutton/UIPreviewButton.java diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIRadioButton.java b/designer-base/src/com/fr/design/gui/ibutton/UIRadioButton.java new file mode 100644 index 0000000000..d8e36296fd --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIRadioButton.java @@ -0,0 +1,46 @@ +package com.fr.design.gui.ibutton; + +import javax.swing.*; + +/** + * Created by IntelliJ IDEA. + * Author : Richer + * Version: 6.5.6 + * Date: 13-3-27 + * Time: 下午5:04 + */ +public class UIRadioButton extends JRadioButton { + + public UIRadioButton() { + super(); + } + + public UIRadioButton(Icon icon) { + super(icon); + } + + public UIRadioButton(Action a) { + super(a); + } + + public UIRadioButton(Icon icon, boolean selected) { + super(icon, selected); + } + + public UIRadioButton(String text) { + super(text); + } + + public UIRadioButton(String text, boolean selected) { + super(text, selected); + } + + public UIRadioButton(String text, Icon icon) { + super(text, icon); + } + + + public UIRadioButton(String text, Icon icon, boolean selected) { + super(text, icon, selected); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonIcon.java b/designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonIcon.java new file mode 100644 index 0000000000..484087b8fa --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonIcon.java @@ -0,0 +1,328 @@ +package com.fr.design.gui.ibutton; + +import com.fr.design.gui.icheckbox.UICheckBoxIcon; +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.ThemeUtils; +import com.fr.design.utils.ColorRoutines; +import com.fr.design.utils.DrawRoutines; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.HashMap; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-13 + * Time: 下午2:52 + */ +public class UIRadioButtonIcon extends UICheckBoxIcon { + private static HashMap cache = new HashMap(); + + private static final int[][] A = { + {255, 255, 255, 242, 228, 209, 187, 165, 142, 255, 255}, + {255, 255, 242, 228, 209, 187, 165, 142, 120, 104, 255}, + {255, 242, 228, 209, 187, 165, 142, 120, 104, 86, 72}, + {242, 228, 209, 187, 165, 142, 120, 104, 86, 72, 56}, + {228, 209, 187, 165, 142, 120, 104, 86, 72, 56, 42}, + {209, 187, 165, 142, 120, 104, 86, 72, 56, 42, 28}, + {187, 165, 142, 120, 104, 86, 72, 56, 42, 28, 17}, + {165, 142, 120, 104, 86, 72, 56, 42, 28, 17, 9}, + {142, 120, 104, 86, 72, 56, 42, 28, 17, 9, 0}, + {255, 104, 86, 72, 56, 42, 28, 17, 9, 0, 255}, + {255, 255, 72, 56, 42, 28, 17, 9, 0, 255, 255} + }; + + /** + * Draws the check box icon at the specified location. + * + * @param c The component to draw on. + * @param g The graphics context. + * @param x The x coordinate of the top left corner. + * @param y The y coordinate of the top left corner. + */ + public void paintIcon(Component c, Graphics g, int x, int y) { + AbstractButton button = (AbstractButton) c; + + // inner space + Color col = null; + + if (!button.isEnabled()) { + col = ThemeUtils.BUTTON_DISABLE_COLOR; + } else if (button.getModel().isPressed()) { + if (button.getModel().isRollover() || button.getModel().isArmed()) { + col = ThemeUtils.BUTTON_PRESS_COLOR; + } else { + col = ThemeUtils.BUTTON_NORMAL_COLOR; + } + } else if (button.getModel().isRollover() && ThemeUtils.BUTTON_ROLLOVER) { + col = ThemeUtils.BUTTON_ROLLOVER_BG_COLOR; + } else { + col = ThemeUtils.BUTTON_NORMAL_COLOR; + } + + g.setColor(col); + drawXpRadio(g, button, col, x, y, getIconWidth(), getIconHeight()); + + // checkmark + if (!button.isSelected()) { + return; + } + + if (!button.isEnabled()) { + col = ThemeUtils.BUTTON_CHECK_DISABLE_COLOR; + } else { + col = ThemeUtils.RADIO_CHECK_ROLLOVER_COLOR; + } + g.setColor(col); + drawXpCheckMark(g, col, x, y); + } + + + private void drawXpRadio(Graphics g, AbstractButton b, Color c, + int x, int y, int w, int h) { + boolean pressed = b.getModel().isPressed(); + boolean armed = b.getModel().isArmed(); + boolean enabled = b.isEnabled(); + boolean rollover = b.getModel().isRollover(); + boolean focused = (ThemeUtils.BUTTON_FOCUS_BORDER && !rollover && b.isFocusOwner()); + + Color bg = b.getBackground(); + + if (!b.isOpaque()) { + Container parent = b.getParent(); + bg = parent.getBackground(); + + while (parent != null && !parent.isOpaque()) { + parent = parent.getParent(); + bg = parent.getBackground(); + } + } + + RadioKey key = new RadioKey(c, bg, pressed, enabled, (rollover || armed), focused); + Object value = cache.get(key); + + if (value != null) { + // image already cached - paint image and return + g.drawImage((Image) value, x, y, b); + return; + } + + Image img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); + + drawcalculate(img,bg,w,h,enabled, pressed ,armed,rollover,c,focused); + // draw the image + g.drawImage(img, x, y, b); + + // add the image to the cache + cache.put(key, img); + } + + private void drawcalculate(Image img, Color bg, int w, int h, boolean enabled, + boolean pressed, boolean armed, boolean rollover, Color c,boolean focused ) { + Graphics imgGraphics = img.getGraphics(); + imgGraphics.setColor(bg); + imgGraphics.fillRect(0, 0, w, h); + // spread light is between 0 and 20 + int spread1 = ThemeUtils.BUTTON_SPREAD_LIGHT; + int spread2 = ThemeUtils.BUTTON_SPREAD_DARK; + if (!enabled) { + spread1 = ThemeUtils.BUTTON_SPREAD_LIGHT_DISABLE; + spread2 = ThemeUtils.BUTTON_SPREAD_DARK_DISABLE; + } + int spreadStep1 = spread1 * 5; // 20 -> 100 + int spreadStep2 = spread2 * 4; // 20 -> 80 + boolean isRollverOrArmed = rollover||armed; + if (pressed && isRollverOrArmed) { + spreadStep2 *= 2; + } + c = ColorRoutines.lighten(c, spreadStep1); + imgGraphics.setColor(ColorRoutines.darken(c, spreadStep2)); + imgGraphics.fillRect(2, 2, w - 4, h - 4); + imgGraphics.fillRect(1, 5, 1, 3); + imgGraphics.fillRect(11, 5, 1, 3); + imgGraphics.fillRect(5, 1, 3, 1); + imgGraphics.fillRect(5, 11, 3, 1); + Color color; + for (int row = 0; row < 11; row++) { + for (int col = 0; col < 11; col++) { + color = new Color(c.getRed(), c.getGreen(), c.getBlue(), 255 - A[col][row]); + imgGraphics.setColor(color); + imgGraphics.drawLine(col + 1, row + 1, col + 1, row + 1); + } + } + if (!enabled) { + DrawRoutines.drawXpRadioBorder(imgGraphics, + ThemeUtils.BUTTON_BORDER_DISABLE_COLOR, 0, 0, w, h); + } else { + if (rollover && ThemeUtils.BUTTON_ROLLOVER && !pressed) { + DrawRoutines.drawXpRadioBorder(imgGraphics, + ThemeUtils.RADIO_CHECK_ROLLOVER_COLOR, 0, 0, w, h); + } else if (focused && !pressed) { + DrawRoutines.drawXpRadioBorder(imgGraphics, + ThemeUtils.RADIO_BORDER_NORMAL_COLOR, 0, 0, w, h); + } + + DrawRoutines.drawXpRadioBorder(imgGraphics, + ThemeUtils.RADIO_BORDER_NORMAL_COLOR, 0, 0, w, h); + } + // dispose of image graphics + imgGraphics.dispose(); + } + + + private void drawXpCheckMark(Graphics g, Color c, int x, int y) { + g.translate(x, y); + + g.setColor(new Color(c.getRed(), c.getGreen(), c.getBlue(), 224)); + g.fillRect(5, 5, 3, 3); + + g.setColor(c); + g.drawLine(6, 6, 6, 6); + + g.setColor(new Color(c.getRed(), c.getGreen(), c.getBlue(), 192)); + g.drawLine(6, 4, 6, 4); + g.drawLine(4, 6, 4, 6); + g.drawLine(8, 6, 8, 6); + g.drawLine(6, 8, 6, 8); + + g.setColor(new Color(c.getRed(), c.getGreen(), c.getBlue(), 128)); + g.drawLine(5, 4, 5, 4); + g.drawLine(7, 4, 7, 4); + g.drawLine(4, 5, 4, 5); + g.drawLine(8, 5, 8, 5); + g.drawLine(4, 7, 4, 7); + g.drawLine(8, 7, 8, 7); + g.drawLine(5, 8, 5, 8); + g.drawLine(7, 8, 7, 8); + + g.translate(-x, -y); + } + + /* + * EnabledRadioKey is used as key in the cache HashMap. + * Overrides equals() and hashCode(). + * Used only if we are run from ControlPanel. + */ + static class EnabledRadioKey { + int spread1; + int spread2; + Color c, back; + + EnabledRadioKey(Color c, Color back) { + spread1 = ThemeUtils.BUTTON_SPREAD_LIGHT; + spread2 = ThemeUtils.BUTTON_SPREAD_DARK; + this.c = c; + this.back = back; + } + + public boolean equals(Object o) { + if (o == null){ + return false; + } + if (!(o instanceof UICheckBoxIcon.EnabledCheckKey)) { + return false; + } + + UICheckBoxIcon.EnabledCheckKey other = (UICheckBoxIcon.EnabledCheckKey) o; + + return ComparatorUtils.equals(c,other.c) && + ComparatorUtils.equals(back,other.back) && + ComparatorUtils.equals(spread1,other.spread1) && + ComparatorUtils.equals(spread2,other.spread2); + } + + public int hashCode() { + return c.hashCode() * back.hashCode() * spread1 * spread2; + } + } + + /* + * DisabledRadioKey is used as key in the cache HashMap. + * Overrides equals() and hashCode(). + * Used only if we are run from ControlPanel. + */ + static class DisabledRadioKey { + int spread1; + int spread2; + Color c, back; + + DisabledRadioKey(Color c, Color back) { + spread1 = ThemeUtils.BUTTON_SPREAD_LIGHT_DISABLE; + spread2 = ThemeUtils.BUTTON_SPREAD_DARK_DISABLE; + this.c = c; + this.back = back; + } + + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof UICheckBoxIcon.DisabledCheckKey)) { + return false; + } + + UICheckBoxIcon.DisabledCheckKey other = (UICheckBoxIcon.DisabledCheckKey) o; + + return ComparatorUtils.equals(c,other.c) && + ComparatorUtils.equals(back,other.back) && + ComparatorUtils.equals(spread1,other.spread1) && + ComparatorUtils.equals(spread2,other.spread2); + } + + public int hashCode() { + return c.hashCode() * back.hashCode() * spread1 * spread2; + } + } + + /* + * RadioKey is used as key in the cache HashMap. + * Overrides equals() and hashCode(). + */ + static class RadioKey { + + private Color c, background; + private boolean pressed; + private boolean enabled; + private boolean rollover; + private boolean focused; + + RadioKey(Color c, Color background, + boolean pressed, boolean enabled, boolean rollover, boolean focused) { + this.c = c; + this.background = background; + this.pressed = pressed; + this.enabled = enabled; + this.rollover = rollover; + this.focused = focused; + } + + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof RadioKey)){ + return false; + } + + RadioKey other = (RadioKey) o; + + return ComparatorUtils.equals(c,other.c) && + ComparatorUtils.equals(pressed,other.pressed) && + ComparatorUtils.equals(enabled,other.enabled) && + ComparatorUtils.equals(rollover,other.rollover)&& + ComparatorUtils.equals(focused,other.focused)&& + ComparatorUtils.equals(background,other.background); + } + + public int hashCode() { + return c.hashCode() * + background.hashCode() * + (pressed ? 1 : 2) * + (enabled ? 4 : 8) * + (rollover ? 16 : 32); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonMenuItemUI.java b/designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonMenuItemUI.java new file mode 100644 index 0000000000..c45fb23f0c --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonMenuItemUI.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.ibutton; + +import com.fr.design.gui.imenu.UIBasicMenuItemUI; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import java.awt.*; +import java.awt.event.MouseEvent; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-6 + * Time: 下午4:12 + */ +public class UIRadioButtonMenuItemUI extends UIBasicMenuItemUI { + + /** + * 创建UI + * + * @param b 组件 + * @return 组件UI + */ + public static ComponentUI createUI(JComponent b) { + return new UIRadioButtonMenuItemUI(); + } + + protected String getPropertyPrefix() { + return "RadioButtonMenuItem"; + } + + /** + * 鼠标点击事件 + * + * @param item 菜单项 + * @param e 鼠标事件 + * @param path 菜单元素路径 + * @param manager 鼠标选择manager + */ + public void processMouseEvent(JMenuItem item, MouseEvent e, + MenuElement path[], MenuSelectionManager manager) { + Point p = e.getPoint(); + boolean isContainsX = p.x >= 0 && p.x < item.getWidth(); + boolean isContainsY = p.y >= 0 && p.y < item.getHeight(); + if (isContainsX && isContainsY) { + if (e.getID() == MouseEvent.MOUSE_RELEASED) { + manager.clearSelectedPath(); + item.doClick(0); + item.setArmed(false); + } else + manager.setSelectedPath(path); + } else if (item.getModel().isArmed()) { + MenuElement[] newPath = new MenuElement[path.length - 1]; + int i, c; + for (i = 0, c = path.length - 1; i < c; i++){ + newPath[i] = path[i]; + } + manager.setSelectedPath(newPath); + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonUI.java b/designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonUI.java new file mode 100644 index 0000000000..0e054b6938 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIRadioButtonUI.java @@ -0,0 +1,112 @@ +package com.fr.design.gui.ibutton; + + +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.metal.MetalRadioButtonUI; +import java.awt.*; +import java.awt.event.KeyEvent; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-13 + * Time: 下午2:50 + */ +public class UIRadioButtonUI extends MetalRadioButtonUI { + + Component c; + + /** + * the only instance of the radiobuttonUI + */ + private static final UIRadioButtonUI RADIO_BUTTON_UI = new UIRadioButtonUI(); + + /* the only instance of the stroke for the focus */ + private static BasicStroke focusStroke = + new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, + 1.0f, new float[]{1.0f, 1.0f}, 0.0f); + + /* the only instance of the radiobutton icon*/ + private static UIRadioButtonIcon radioButton; + + /** + * 创建UI + * @param c 组件 + * @return 返回本类对象 + */ + public static ComponentUI createUI(JComponent c) { + if (c instanceof JRadioButton) { + JRadioButton jb = (JRadioButton) c; + jb.setRolloverEnabled(true); + } + + return RADIO_BUTTON_UI; + } + + /** + * 为该组件加载图标 + * @param c 组件对象 + */ + public void installUI(JComponent c) { + super.installUI(c); + + icon = getRadioButton(); + + if (!ThemeUtils.BUTTON_ENTER) { + return; + } + if (!c.isFocusable()){ + return; + } + + InputMap km = (InputMap) UIManager.get(getPropertyPrefix() + "focusInputMap"); + + if (km != null) { + km.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false), "pressed"); + km.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), "released"); + } + } + + /** + * Returns the skinned Icon + * + * @return TinyRadioButtonIcon + */ + protected UIRadioButtonIcon getRadioButton() { + if (radioButton == null) { + radioButton = new UIRadioButtonIcon(); + } + + return radioButton; + } + + + /** + * Paints the focus for the radiobutton + * + * @see javax.swing.plaf.metal.MetalRadioButtonUI#paintFocus(java.awt.Graphics, java.awt.Rectangle, java.awt.Dimension) + */ + protected void paintFocus(Graphics g, Rectangle t, Dimension arg2) { + if (!ThemeUtils.BUTTON_FOCUS){ + return; + } + + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(Color.black); + g2d.setStroke(focusStroke); + + int x1 = t.x - 1; + int y1 = t.y - 1; + int x2 = x1 + t.width + 1; + int y2 = y1 + t.height + 1; + + g2d.drawLine(x1, y1, x2, y1); + g2d.drawLine(x1, y1, x1, y2); + g2d.drawLine(x1, y2, x2, y2); + g2d.drawLine(x2, y1, x2, y2); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/ibutton/UISliderButton.java b/designer-base/src/com/fr/design/gui/ibutton/UISliderButton.java similarity index 100% rename from designer_base/src/com/fr/design/gui/ibutton/UISliderButton.java rename to designer-base/src/com/fr/design/gui/ibutton/UISliderButton.java diff --git a/designer_base/src/com/fr/design/gui/ibutton/UISliderButtonUI.java b/designer-base/src/com/fr/design/gui/ibutton/UISliderButtonUI.java similarity index 100% rename from designer_base/src/com/fr/design/gui/ibutton/UISliderButtonUI.java rename to designer-base/src/com/fr/design/gui/ibutton/UISliderButtonUI.java diff --git a/designer-base/src/com/fr/design/gui/ibutton/UITabButton.java b/designer-base/src/com/fr/design/gui/ibutton/UITabButton.java new file mode 100644 index 0000000000..4e50dd9942 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UITabButton.java @@ -0,0 +1,181 @@ +package com.fr.design.gui.ibutton; + +import java.awt.Color; +import java.awt.GradientPaint; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +import javax.swing.Icon; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.SwingConstants; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import com.fr.design.gui.core.UISelectedComponent; + +/** + * SelectedAble button label + * + * @author zhou + * @since 2012-5-11下午4:28:24 + */ +public class UITabButton extends UILabel implements UISelectedComponent { + /** + * + */ + private static final long serialVersionUID = 1L; + public static final Color TOP = new Color(200, 200, 200); + public static final Color DOWN = new Color(242, 242, 242); + + protected boolean isSelected = false; + + protected boolean isRollover; + + public UITabButton(Icon image) { + super(image); + this.setHorizontalAlignment(SwingConstants.CENTER); + this.setVerticalAlignment(SwingConstants.CENTER); + this.addMouseListener(getMouseListener()); + this.setFocusable(true); + } + + public UITabButton(String text) { + super(text); + this.setHorizontalAlignment(SwingConstants.CENTER); + this.setVerticalAlignment(SwingConstants.CENTER); + this.addMouseListener(getMouseListener()); + } + + @Override + public boolean isSelected() { + return isSelected; + } + + /** + * 能触发事件 + * + * @param isSelected + */ + + @Override + public void setSelected(boolean isSelected) { + if (this.isSelected != isSelected) { + this.isSelected = isSelected; + fireSelectedChanged(); + this.repaint(); + } + } + + /** + * 不触发事件 + * + * @param isSelected + */ + public void setSelectedDoNotFireListener(boolean isSelected) { + if (this.isSelected != isSelected) { + this.isSelected = isSelected; + this.repaint(); + } + } + + /** + * Adds a ChangeListener to the listener list. + */ + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + } + + /** + * removes a ChangeListener from the listener list. + */ + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + // august: Process the listeners last to first + protected void fireSelectedChanged() { + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener)listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + + /** + * + * @return + */ + protected MouseListener getMouseListener() { + return new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + if (!isSelected()) { + isRollover = true; + repaint(); + } + } + + @Override + public void mouseExited(MouseEvent e) { + isRollover = false; + repaint(); + } + + @Override + public void mousePressed(MouseEvent e) { + UITabButton.this.requestFocus(); + mousePressedTrigger(); + } + }; + } + + protected void mousePressedTrigger() { + setSelected(true); + } + + @Override + public void paint(Graphics g) { + int w = this.getWidth(); + int h = this.getHeight(); + Graphics2D g2d = (Graphics2D)g; + paintRolloverAndSelected(g2d, w, h); + paintOther(g2d, w, h); + super.paint(g); + } + + protected void paintRolloverAndSelected(Graphics2D g2d, int w, int h) { + if (isSelected()) { + Color darkColor = UIConstants.GRDIENT_DARK_GRAY; + Color lightColor = UIConstants.PRESSED_DARK_GRAY; + GradientPaint gp = new GradientPaint(1, 1, darkColor, 1, 5, lightColor); + g2d.setPaint(gp); + g2d.fillRect(0, 0, w - 1, h); + this.setForeground(Color.WHITE); + } else if (!isSelected() && isRollover) { + Color blue = UIConstants.LIGHT_BLUE; + g2d.setColor(blue); + g2d.fillRect(0, 1, w - 1, h / 2); + GradientPaint gp = new GradientPaint(1, 1, UIConstants.OCEAN_BLUE, 1, h - 1, blue); + g2d.setPaint(gp); + g2d.fillRect(0, h / 2, w - 1, h / 2); + this.setForeground(UIConstants.FONT_COLOR); + } else if (!isSelected() && !isRollover) { + GradientPaint gp = new GradientPaint(1, 1, TOP, 1, h - 1, DOWN); + g2d.setPaint(gp); + g2d.fillRect(0, h / 2, w - 1, h / 2); + this.setForeground(UIConstants.FONT_COLOR); + } + } + + protected void paintOther(Graphics2D g2d, int w, int h) { + + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UITabGroup.java b/designer-base/src/com/fr/design/gui/ibutton/UITabGroup.java new file mode 100644 index 0000000000..69f5845f1d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UITabGroup.java @@ -0,0 +1,75 @@ +package com.fr.design.gui.ibutton; + +import javax.swing.*; +import javax.swing.border.Border; +import java.awt.*; + +public class UITabGroup extends UIButtonGroup { + private boolean isOneLineTab = false; + private boolean isDrawLine = true; + private static final int BUTTON_NUMBER = 5; + private static final int SEVEN_NUMBER = 7; + private static final int ORIGINAL_WIDTH = 10; + private static final int GAP = 11; + + /** + * 标签页改变 + * + * @param index 序号 + */ + public void tabChanged(int index) { + return; + } + + public UITabGroup(Icon[] iconArray) { + super(iconArray, new Integer[iconArray.length]); + setSelectedIndex(0); + tabChanged(0); + } + + public UITabGroup(String[] textArray) { + super(textArray); + } + + @Override + protected LayoutManager getGridLayout(int number) { + if (number < BUTTON_NUMBER || isOneLineTab) { + return super.getGridLayout(number); + } else if (number == BUTTON_NUMBER || number == SEVEN_NUMBER) { + return new FiveButtonLayout(2); + } else { + return new GridLayout(2, 3, 1, 1); + } + } + + public void setOneLineTab(boolean isOneLineTab) { + this.isOneLineTab = isOneLineTab; + } + + protected boolean isDrawLine() { + return isDrawLine; + } + + public void setDrawLine(boolean isDrawLine) { + this.isDrawLine = isDrawLine; + } + + @Override + protected Border getGroupBorder() { + if (!isDrawLine) { + return BorderFactory.createEmptyBorder(0, 0, 0, 0); + } + return BorderFactory.createEmptyBorder(1, GAP, 1, GAP); + } + + @Override + protected void setSelectedWithFireChanged(int newSelectedIndex) { + if (selectedIndex != newSelectedIndex) { + selectedIndex = newSelectedIndex; + for (int i = 0; i < labelButtonList.size(); i++) { + labelButtonList.get(i).setSelected(i == selectedIndex); + } + } + tabChanged(newSelectedIndex); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIToggleButton.java b/designer-base/src/com/fr/design/gui/ibutton/UIToggleButton.java new file mode 100644 index 0000000000..4b89752356 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIToggleButton.java @@ -0,0 +1,223 @@ +package com.fr.design.gui.ibutton; + +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Shape; +import java.awt.event.ActionEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.geom.RoundRectangle2D; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import com.fr.design.constants.UIConstants; +import com.fr.design.event.GlobalNameListener; +import com.fr.design.event.GlobalNameObserver; +import com.fr.stable.StringUtils; + +/** + * SelectedAble button label + * + * @author zhou + * @since 2012-5-11下午4:28:24 + */ +public class UIToggleButton extends UIButton implements GlobalNameObserver{ + private boolean isSelected; + private boolean isEventBannded = false; + private String toggleButtonName = ""; + private GlobalNameListener globalNameListener = null; + + public UIToggleButton() { + this(StringUtils.EMPTY); + } + + public UIToggleButton(Icon image) { + this(StringUtils.EMPTY, image); + } + + public UIToggleButton(String text) { + this(text, null); + } + + public UIToggleButton(String text, Icon image) { + super(text, image); + addMouseListener(getMouseListener()); + } + + /** + * 需要反白的按钮接口(组合按钮情况-UIButtonGroup) + * support icons[normalIcon, selectedIcon] + * @param icons + */ + public UIToggleButton(Icon[] icons) { + super(icons[0], null, icons[1]); + setSelectedIcon(icons[1]); + setExtraPainted(true); + addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + if (!UIToggleButton.super.isSelected()) { + UIToggleButton.super.setSelected(!UIToggleButton.super.isSelected()); + } + } + }); + addMouseListener(getMouseListener()); + } + + /** + * 需要反白的按钮接口(单个按钮情况)-再次点击取消选中状态 + * support icons[normalIcon, selectedIcon] + * @param icons + */ + public UIToggleButton(Icon[] icons, boolean needRelease) { + super(icons[0], null, icons[1]); + setBorderPainted(true); + setSelectedIcon(icons[1]); + setExtraPainted(true); + if (!needRelease) { + addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + if (UIToggleButton.super.isSelected()) { + UIToggleButton.super.setSelected(false); + } else { + UIToggleButton.super.setSelected(true); + } + } + }); + } + addMouseListener(getMouseListener()); + } + + public void setGlobalName(String name){ + toggleButtonName = name ; + } + + /** + * + * @return + */ + public boolean isSelected() { + return isSelected; + } + + /** + * 能触发事件 + * + * @param isSelected + */ + + @Override + public void setSelected(boolean isSelected) { + super.setSelected(isSelected); + if (this.isSelected != isSelected) { + this.isSelected = isSelected; + repaint(); + } + } + protected void initListener(){ + if(shouldResponseChangeListener()){ + this.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + if (uiObserverListener == null) { + return; + } + if(globalNameListener!=null && shouldResponseNameListener()){ + globalNameListener.setGlobalName(toggleButtonName); + } + uiObserverListener.doChange(); + } + }); + } + } + + public void setSelectedWithFireListener(boolean isSelected) { + if (this.isSelected != isSelected) { + this.isSelected = isSelected; + fireSelectedChanged(); + repaint(); + } + } + + protected MouseListener getMouseListener() { + return new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (isEnabled() && !isEventBannded) { + setSelectedWithFireListener(!isSelected()); + } + } + }; + } + + public void setEventBannded(boolean ban) { + this.isEventBannded = ban; + } + + protected void fireStateChanged() { + + } + + + protected void fireSelectedChanged() { + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + + @Override + protected void paintBorder(Graphics g) { + if (!isBorderPainted()) { + return; + } + boolean isBorderPainted = isBorderPaintedOnlyWhenPressed && (getModel().isPressed() || isSelected); + if (isBorderPainted || !isBorderPaintedOnlyWhenPressed) { + if (ui instanceof UIButtonUI) { + ((UIButtonUI) ui).paintBorder(g, this); + } else { + super.paintBorder(g); + } + } + } + + protected void paintOtherBorder(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + g2d.setStroke(UIConstants.BS); + Shape shape = new RoundRectangle2D.Float(0.5f, 0.5f, getWidth() - 1, getHeight() - 1, UIConstants.ARC, UIConstants.ARC); + g2d.setColor(UIConstants.LINE_COLOR); + g2d.draw(shape); + } + + /** + * 组件是否需要响应添加的观察者事件 + * + * @return 如果需要响应观察者事件则返回true,否则返回false + */ + public boolean shouldResponseChangeListener() { + return true; + } + + /** + * + * @param listener 观察者监听事件 + */ + public void registerNameListener(GlobalNameListener listener) { + globalNameListener = listener; + } + + /** + * + * @return + */ + public boolean shouldResponseNameListener() { + return true; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ibutton/UIToolButtonBorder.java b/designer-base/src/com/fr/design/gui/ibutton/UIToolButtonBorder.java new file mode 100644 index 0000000000..83479fd547 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ibutton/UIToolButtonBorder.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.ibutton; + +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.DrawRoutines; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.UIResource; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-19 + * Time: 下午4:39 + */ +public class UIToolButtonBorder extends AbstractBorder { + protected final Insets insets = new Insets(1, 1, 1, 1); + + /** + * Draws the button border for the given component. + * + * @param c The component to draw its border. + * @param g The graphics context. + * @param x The x coordinate of the top left corner. + * @param y The y coordinate of the top left corner. + * @param w The width. + * @param h The height. + */ + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + AbstractButton b = (AbstractButton) c; + Color col = null; + + boolean isFileChooserButton =ComparatorUtils.equals(Boolean.TRUE, b.getClientProperty("JFileChooser.isFileChooserButton")); + + // New in 1.3.7 (previously only b.getModel().isRollover() evaluated) + boolean isRollover = b.getModel().isRollover() || b.getModel().isArmed(); + + if (b.getModel().isPressed()) { + if (isRollover) { + col = ThemeUtils.TOOL_BORDER_PRESSED_COLOR; + } else { + if (b.isSelected()) { + col = ThemeUtils.TOOL_BORDER_SELECTED_COLOR; + } else { + if (isFileChooserButton) { + return; // no border painted + } + + col = ThemeUtils.TOOL_BORDER_COLOR; + return; + } + } + } else if (isRollover) { + if (b.isSelected()) { + col = ThemeUtils.TOOL_BORDER_SELECTED_COLOR; + } else { + col = ThemeUtils.TOOL_BORDER_ROLLOVER_COLOR; + } + } else if (b.isSelected()) { + col = ThemeUtils.TOOL_BORDER_SELECTED_COLOR; + } else { + if (isFileChooserButton) { + return; // no border painted + } + + col = ThemeUtils.TOOL_BORDER_COLOR; + return; + } + DrawRoutines.drawRoundedBorder(g, col, x, y, w, h); + } + + /** + * Gets the border insets for a given component. + * + * @return some insets... + */ + public Insets getBorderInsets(Component c) { + if (!(c instanceof AbstractButton)){ + return insets; + } + + AbstractButton b = (AbstractButton) c; + + if (b.getMargin() == null || (b.getMargin() instanceof UIResource)) { + return new Insets(ThemeUtils.TOOL_MARGIN_TOP, ThemeUtils.TOOL_MARGIN_LEFT, + ThemeUtils.TOOL_MARGIN_BOTTOM, ThemeUtils.TOOL_MARGIN_RIGHT); + } else { + Insets margin = b.getMargin(); + + return new Insets( + margin.top + 1, + margin.left + 1, + margin.bottom + 1, + margin.right + 1); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icheckbox/UICheckBox.java b/designer-base/src/com/fr/design/gui/icheckbox/UICheckBox.java new file mode 100644 index 0000000000..6e2c93f520 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icheckbox/UICheckBox.java @@ -0,0 +1,201 @@ +package com.fr.design.gui.icheckbox; + +import com.fr.design.constants.UIConstants; +import com.fr.design.event.GlobalNameListener; +import com.fr.design.event.GlobalNameObserver; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.design.utils.gui.GUIPaintUtils; +import com.fr.stable.Constants; +import sun.swing.SwingUtilities2; + +import javax.swing.*; +import javax.swing.plaf.basic.BasicHTML; +import javax.swing.plaf.metal.MetalCheckBoxUI; +import javax.swing.text.View; +import java.awt.*; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +public class UICheckBox extends JCheckBox implements UIObserver, GlobalNameObserver { + private UIObserverListener uiObserverListener; + private GlobalNameListener globalNameListener = null; + private String checkboxName = ""; + + public UICheckBox(String string) { + super(string); + setUI(new UICheckBoxUI()); + initListener(); + } + + public UICheckBox() { + super(); + setUI(new UICheckBoxUI()); + initListener(); + } + + public UICheckBox(String locText, boolean b) { + super(locText, b); + setUI(new UICheckBoxUI()); + initListener(); + } + + public UICheckBox(String text, Icon icon) { + super(text, icon); + setUI(new UICheckBoxUI()); + initListener(); + } + + private void initListener() { + if (shouldResponseChangeListener()) { + this.addItemListener(new ItemListener() { + + @Override + public void itemStateChanged(ItemEvent e) { + if (uiObserverListener == null) { + return; + } + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(checkboxName); + } + uiObserverListener.doChange(); + } + }); + } + } + + /** + * 给组件登记一个观察者监听事件 + * + * @param listener 观察者监听事件 + */ + public void registerChangeListener(UIObserverListener listener) { + this.uiObserverListener = listener; + } + + + public void setGlobalName(String name) { + checkboxName = name; + } + + /** + * 组件是否需要响应添加的观察者事件 + * + * @return 如果需要响应观察者事件则返回true,否则返回false + */ + public boolean shouldResponseChangeListener() { + return true; + } + + /** + * 注册观察者监听事件 + * @param listener 观察者监听事件 + */ + public void registerNameListener(GlobalNameListener listener) { + globalNameListener = listener; + } + + /** + * 组件是否需要响应观察者事件 + * @return 如果需要响应观察者事件则返回true,否则返回false + */ + public boolean shouldResponseNameListener() { + return true; + } + + private class UICheckBoxUI extends MetalCheckBoxUI { + public void paint(Graphics g, JComponent c) { + synchronized (this) { + AbstractButton b = (AbstractButton) c; + ButtonModel model = b.getModel(); + Dimension size = c.getSize(); + Font f = c.getFont(); + g.setFont(f); + FontMetrics fm = SwingUtilities2.getFontMetrics(c, g, f); + + Rectangle viewRect = new Rectangle(size); + Rectangle iconRect = new Rectangle(); + Rectangle textRect = new Rectangle(); + + Insets i = c.getInsets(); + viewRect.x += i.left; + viewRect.y += i.top; + viewRect.width -= (i.right + viewRect.x); + viewRect.height -= (i.bottom + viewRect.y); + + Icon altIcon = b.getIcon(); + + String text = SwingUtilities.layoutCompoundLabel( + c, fm, b.getText(), altIcon != null ? altIcon : getDefaultIcon(), + b.getVerticalAlignment(), b.getHorizontalAlignment(), + b.getVerticalTextPosition(), b.getHorizontalTextPosition(), + viewRect, iconRect, textRect, b.getIconTextGap()); + + // fill background + if (c.isOpaque()) { + g.setColor(b.getBackground()); + g.fillRect(0, 0, size.width, size.height); + } + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + if ( model.isSelected()) { + GUIPaintUtils.fillPaint(g2d, iconRect.x, iconRect.y, iconRect.width, iconRect.height,false, Constants.NULL,UIConstants.CHECKBOX_HOVER_SELECTED, 0); + } else if (model.isRollover() && ! model.isSelected()) { + g.setColor(UIConstants.CHECKBOX_HOVER_SELECTED); + g2d.drawRoundRect(iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1, UIConstants.ARC, UIConstants.ARC); + }else{ + g.setColor(UIConstants.LINE_COLOR); + g2d.drawRoundRect(iconRect.x, iconRect.y, iconRect.width - 1, iconRect.height - 1, UIConstants.ARC, UIConstants.ARC); + } + + if (model.isSelected()) { + UIConstants.YES_ICON.paintIcon(c, g, iconRect.x + 2, iconRect.y + 2); + } + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + + // Draw the Text + drawLine(text, g, b, c, textRect, fm); + } + } + + private void drawLine(String text, Graphics g, AbstractButton b, JComponent c, Rectangle textRect, FontMetrics fm) { + if (text != null) { + View v = (View) c.getClientProperty(BasicHTML.propertyKey); + if (v != null) { + v.paint(g, textRect); + } else { + int mnemIndex = b.getDisplayedMnemonicIndex(); + if (model.isEnabled()) { + g.setColor(b.getForeground()); + } else { + g.setColor(getDisabledTextColor()); + } + SwingUtilities2.drawStringUnderlineCharAt(c, g, text, + mnemIndex, textRect.x, textRect.y + fm.getAscent()); + } + } + } + + } + + /** + * 测试 + * @param args 参数 + */ + public static void main(String... args) { + LayoutManager layoutManager = null; + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(layoutManager); + + UICheckBox bb = new UICheckBox("sdf"); + bb.setEnabled(false); + bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); + content.add(bb); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icheckbox/UICheckBoxIcon.java b/designer-base/src/com/fr/design/gui/icheckbox/UICheckBoxIcon.java new file mode 100644 index 0000000000..2f669fb599 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icheckbox/UICheckBoxIcon.java @@ -0,0 +1,314 @@ +package com.fr.design.gui.icheckbox; + +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.ThemeUtils; +import com.fr.design.utils.ColorRoutines; +import com.fr.design.utils.DrawRoutines; + +import javax.swing.*; +import javax.swing.plaf.metal.MetalCheckBoxIcon; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.HashMap; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-13 + * Time: 下午2:53 + */ +public class UICheckBoxIcon extends MetalCheckBoxIcon { + + // cache for already drawn icons - speeds up drawing by A factor + // of up to 100 if there are several check boxes or one check box + // is painted several times + + + private static HashMap cache = new HashMap(); + + private static final int[][] A = { + {255, 255, 255, 242, 228, 209, 187, 165, 142, 120, 104}, + {255, 255, 242, 228, 209, 187, 165, 142, 120, 104, 86}, + {255, 242, 228, 209, 187, 165, 142, 120, 104, 86, 72}, + {242, 228, 209, 187, 165, 142, 120, 104, 86, 72, 56}, + {228, 209, 187, 165, 142, 120, 104, 86, 72, 56, 42}, + {209, 187, 165, 142, 120, 104, 86, 72, 56, 42, 28}, + {187, 165, 142, 120, 104, 86, 72, 56, 42, 28, 17}, + {165, 142, 120, 104, 86, 72, 56, 42, 28, 17, 9}, + {142, 120, 104, 86, 72, 56, 42, 28, 17, 9, 0}, + {120, 104, 86, 72, 56, 42, 28, 17, 9, 0, 0}, + {104, 86, 72, 56, 42, 28, 17, 9, 0, 0, 0} + }; + + protected int getControlSize() { + return getIconWidth(); + } + + /** + * Draws the check box icon at the specified location. + * + * @param c The component to draw on. + * @param g The graphics context. + * @param x The x coordinate of the top left corner. + * @param y The y coordinate of the top left corner. + */ + public void paintIcon(Component c, Graphics g, int x, int y) { + AbstractButton button = (AbstractButton) c; + Color col = null; + + if (!button.isEnabled()) { + col = ThemeUtils.BUTTON_DISABLE_COLOR; + } else if (button.getModel().isPressed()) { + if (button.getModel().isRollover()) { + col = ThemeUtils.BUTTON_PRESS_COLOR; + } else { + col = ThemeUtils.BUTTON_NORMAL_COLOR; + } + } else if (button.getModel().isRollover()) { + col = ThemeUtils.BUTTON_ROLLOVER_BG_COLOR; + } else { + col = ThemeUtils.BUTTON_NORMAL_COLOR; + } + + g.setColor(col); + + drawXpCheck(g, button, col, x, y, getIconWidth(), getIconHeight()); + + + // checkmark + if (!button.isSelected()) { + return; + } + if (!button.isEnabled()) { + g.setColor(ThemeUtils.BUTTON_CHECK_DISABLE_COLOR); + } else { + g.setColor(ThemeUtils.BUTTON_CHECK_COLOR); + } + + drawXpCheckMark(g, x, y); + + } + + private void drawXpCheck(Graphics g, AbstractButton b, Color c, + int x, int y, int w, int h) { + boolean pressed = b.getModel().isPressed(); + boolean armed = b.getModel().isArmed(); + boolean enabled = b.isEnabled(); + boolean rollover = b.getModel().isRollover(); + boolean focused = ThemeUtils.BUTTON_FOCUS_BORDER && !rollover && b.isFocusOwner(); + + // In 1.3.5 key was build with argument rollover instead of (rollover || armed) + // Fixed in 1.3.6 + CheckKey key = new CheckKey(c, pressed, enabled, (rollover || armed), focused); + Object value = cache.get(key); + + if (value != null) { + // image already cached - paint image and return + g.drawImage((Image) value, x, y, b); + return; + } + + Image img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); + + + // spread light is between 0 and 20 + int spread1 = ThemeUtils.BUTTON_SPREAD_LIGHT; + int spread2 = ThemeUtils.BUTTON_SPREAD_DARK; + + if (!b.isEnabled()) { + spread1 = ThemeUtils.BUTTON_SPREAD_LIGHT_DISABLE; + spread2 = ThemeUtils.BUTTON_SPREAD_DARK_DISABLE; + } + + int spreadStep1 = spread1 * 5; // 20 -> 100 + // this means, we can never fully darken background, + // but we also want it bright enough + int spreadStep2 = spread2 * 4; // 20 -> 80 + boolean isRolloverOrArmed = rollover || armed; + if (pressed && isRolloverOrArmed) { + spreadStep2 *= 2; + } + c = ColorRoutines.lighten(c, spreadStep1); + drawImage(c, spreadStep2, img, b, w, h, rollover, pressed, focused); + + // draw the image + g.drawImage(img, x, y, b); + + // add the image to the cache + cache.put(key, img); + } + + private void drawImage(Color c, int spreadStep2, Image img, AbstractButton b, int w, int h, + boolean rollover, boolean pressed, boolean focused) { + Graphics imgGraphics = img.getGraphics(); + + imgGraphics.setColor(ColorRoutines.darken(c, spreadStep2)); + imgGraphics.fillRect(1, 1, w - 2, h - 2); + Color color; + + for (int row = 0; row < 11; row++) { + for (int col = 0; col < 11; col++) { + color = new Color(c.getRed(), c.getGreen(), c.getBlue(), 255 - A[col][row]); + imgGraphics.setColor(color); + imgGraphics.drawLine(col + 1, row + 1, col + 1, row + 1); + } + } + + // border + if (!b.isEnabled()) { + imgGraphics.setColor(ThemeUtils.BUTTON_BORDER_DISABLE_COLOR); + imgGraphics.drawRect(0, 0, w - 1, h - 1); + } else { + imgGraphics.setColor(ThemeUtils.BUTTON_BORDER_COLOR); + imgGraphics.drawRect(0, 0, w - 1, h - 1); + + if (rollover && ThemeUtils.BUTTON_ROLLOVER && !pressed) { + DrawRoutines.drawRolloverCheckBorder(imgGraphics, + ThemeUtils.BUTTON_ROLLOVER_COLOR, 0, 0, w, h); + } else if (focused && !pressed) { + DrawRoutines.drawRolloverCheckBorder(imgGraphics, + ThemeUtils.BUTTON_DEFAULT_COLOR, 0, 0, w, h); + } + } + + // dispose of image graphics + imgGraphics.dispose(); + } + + private void drawXpCheckMark(Graphics g, int x, int y) { + g.drawLine(x + 3, y + 5, x + 3, y + 7); + g.drawLine(x + 4, y + 6, x + 4, y + 8); + g.drawLine(x + 5, y + 7, x + 5, y + 9); + g.drawLine(x + 6, y + 6, x + 6, y + 8); + g.drawLine(x + 7, y + 5, x + 7, y + 7); + g.drawLine(x + 8, y + 4, x + 8, y + 6); + g.drawLine(x + 9, y + 3, x + 9, y + 5); + } + + public int getIconWidth() { + return ThemeUtils.CHECK_SIZE.width; + } + + public int getIconHeight() { + return ThemeUtils.CHECK_SIZE.height; + } + + /* + * EnabledCheckKey is used as key in the cache HashMap. + * Overrides equals() and hashCode(). + * Used only if we are run from ControlPanel. + */ + protected static class EnabledCheckKey { + public int spread1; + public int spread2; + public Color c, back; + + EnabledCheckKey(Color c, Color back) { + spread1 = ThemeUtils.BUTTON_SPREAD_LIGHT; + spread2 = ThemeUtils.BUTTON_SPREAD_DARK; + this.c = c; + this.back = back; + } + + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof EnabledCheckKey)) { + return false; + } + + EnabledCheckKey other = (EnabledCheckKey) o; + return ComparatorUtils.equals(c, other.c) && + ComparatorUtils.equals(back, other.back) && + ComparatorUtils.equals(spread1, other.spread1) && + ComparatorUtils.equals(spread2, other.spread2); + } + + public int hashCode() { + return c.hashCode() * back.hashCode() * spread1 * spread2; + } + } + + /* + * DisabledCheckKey is used as key in the cache HashMap. + * Overrides equals() and hashCode(). + * Used only if we are run from ControlPanel. + */ + protected static class DisabledCheckKey { + public int spread1; + public int spread2; + public Color c, back; + + DisabledCheckKey(Color c, Color back) { + spread1 = ThemeUtils.BUTTON_SPREAD_LIGHT_DISABLE; + spread2 = ThemeUtils.BUTTON_SPREAD_DARK_DISABLE; + this.c = c; + this.back = back; + } + + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof DisabledCheckKey)) { + return false; + } + + DisabledCheckKey other = (DisabledCheckKey) o; + return ComparatorUtils.equals(c, other.c) && + ComparatorUtils.equals(back, other.back) && + ComparatorUtils.equals(spread1, other.spread1) && + ComparatorUtils.equals(spread2, other.spread2); + } + + public int hashCode() { + return c.hashCode() * back.hashCode() * spread1 * spread2; + } + } + + /* + * CheckKey is used as key in the cache HashMap. + * Overrides equals() and hashCode(). + */ + protected static class CheckKey { + + private Color c; + private boolean pressed; + private boolean enabled; + private boolean rollover; + private boolean focused; + + CheckKey(Color c, boolean pressed, boolean enabled, boolean rollover, boolean focused) { + this.c = c; + this.pressed = pressed; + this.enabled = enabled; + this.rollover = rollover; + this.focused = focused; + } + + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof CheckKey)) { + return false; + } + + CheckKey other = (CheckKey) o; + return ComparatorUtils.equals(c,other.c) && + ComparatorUtils.equals(pressed,other.pressed) && + ComparatorUtils.equals(enabled,other.enabled) && + ComparatorUtils.equals(rollover,other.rollover)&& + ComparatorUtils.equals(focused,other.focused); + } + + public int hashCode() { + return c.hashCode() * + (pressed ? 1 : 2) * + (enabled ? 4 : 8) * + (rollover ? 16 : 32); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icheckbox/UICheckBoxUI.java b/designer-base/src/com/fr/design/gui/icheckbox/UICheckBoxUI.java new file mode 100644 index 0000000000..1a7bbb661f --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icheckbox/UICheckBoxUI.java @@ -0,0 +1,88 @@ +package com.fr.design.gui.icheckbox; + + +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.metal.MetalCheckBoxUI; +import java.awt.*; +import java.awt.event.KeyEvent; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-13 + * Time: 下午5:12 + */ +public class UICheckBoxUI extends MetalCheckBoxUI { + + /** + * The Cached UI delegate. + */ + private final static UICheckBoxUI CHECK_BOX_UI = new UICheckBoxUI(); + + /** + * 创建UI + * @param c 组件 + * @return 返回组件UI + */ + public static ComponentUI createUI(JComponent c) { + return CHECK_BOX_UI; + } + + /** + * Installs some default values for the given button. + * + * @param button The reference of the button to install its default values. + */ + + static UICheckBoxIcon checkIcon = new UICheckBoxIcon(); + + /** + * 为组件加载图标 + * @param button 按钮 + */ + public void installDefaults(AbstractButton button) { + super.installDefaults(button); + icon = checkIcon; + button.setRolloverEnabled(true); + + if (!ThemeUtils.BUTTON_ENTER){ + return; + } + if (!button.isFocusable()){ + return; + } + + InputMap km = (InputMap) UIManager.get(getPropertyPrefix() + "focusInputMap"); + + if (km != null) { + km.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false), "pressed"); + km.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), "released"); + } + } + + static BasicStroke focusStroke = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 1.0f, new float[]{1.0f / 1.0f}, 1.0f); + + protected void paintFocus(Graphics g, Rectangle t, Dimension arg2) { + if (!ThemeUtils.BUTTON_FOCUS) { + return; + } + + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(Color.black); + g2d.setStroke(focusStroke); + + int x1 = t.x - 1; + int y1 = t.y - 1; + int x2 = x1 + t.width + 1; + int y2 = y1 + t.height + 1; + + g2d.drawLine(x1, y1, x2, y1); + g2d.drawLine(x1, y1, x1, y2); + g2d.drawLine(x1, y2, x2, y2); + g2d.drawLine(x2, y1, x2, y2); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/AlignmentComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/AlignmentComboBox.java new file mode 100644 index 0000000000..9d867168bf --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/AlignmentComboBox.java @@ -0,0 +1,83 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.icombobox; + +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.icombobox.UIComboBoxRenderer; +import com.fr.general.Inter; +import com.fr.stable.Constants; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; + +/** + * Alignment ComboBox + */ +public class AlignmentComboBox extends UIComboBox { + + /** + * Constructor. + * + * @param alignmentArray the array of alignment. + */ + public AlignmentComboBox(int[] alignmentArray) { + //copy lineStyle. + Integer[] alignmentIntegerArray = new Integer[alignmentArray.length]; + + for (int i = 0; i < alignmentArray.length; i++) { + alignmentIntegerArray[i] = new Integer(alignmentArray[i]); + } + + this.setModel(new DefaultComboBoxModel(alignmentIntegerArray)); + this.setRenderer(new AligmentCellRenderer()); + } + + /** + * Get selected alignment. + */ + public int getSelectedAlignment() { + return ((Integer) getSelectedItem()).intValue(); + } + + /** + * Set the selected alignment. + */ + public void setSelectedAlignment(int alignment) { + this.setSelectedItem(new Integer(alignment)); + } + + public static String getAlignDescription(int alignment) { + if (alignment == Constants.CENTER) {//0 + return Inter.getLocText("Center"); + } else if (alignment == Constants.TOP) {//1 + return Inter.getLocText("StyleAlignment-Top"); + } else if (alignment == Constants.LEFT) {//2 + return Inter.getLocText("StyleAlignment-Left"); + } else if (alignment == Constants.BOTTOM) {//3 + return Inter.getLocText("StyleAlignment-Bottom"); + } else if (alignment == Constants.RIGHT) { //4 + return Inter.getLocText("StyleAlignment-Right"); + } else if (alignment == Constants.DISTRIBUTED) { //added by Kevin Wang 6 + return Inter.getLocText("StyleAlignment-Distibuted"); + } else { + return StringUtils.EMPTY; + } + } + + /** + * CellRenderer. + */ + class AligmentCellRenderer extends UIComboBoxRenderer { + + public Component getListCellRendererComponent(JList list, + Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + int alignment = ((Integer) value).intValue(); + this.setText(getAlignDescription(alignment)); + return this; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/ComboCheckBox.java b/designer-base/src/com/fr/design/gui/icombobox/ComboCheckBox.java new file mode 100644 index 0000000000..31290d6b05 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/ComboCheckBox.java @@ -0,0 +1,195 @@ +package com.fr.design.gui.icombobox; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.IllegalComponentStateException; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionAdapter; +import java.awt.event.MouseMotionListener; + +import javax.swing.BorderFactory; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.ListModel; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.plaf.ComboBoxUI; +import javax.swing.plaf.basic.ComboPopup; + +import com.fr.design.gui.ilist.CheckBoxList; +import com.fr.design.gui.ilist.CheckBoxList.CheckBoxListSelectionChangeListener; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.stable.ArrayUtils; + + +/** + * richer:下拉复选框 + */ +public class ComboCheckBox extends UIComboBox { + + private static final int VALUE120 = 120; + + private CheckBoxList checkBoxList; + + public ComboCheckBox() { + this(new Object[0]); + } + + public ComboCheckBox(Object[] data) { + this.setData(data); + } + + public void setData(Object[] data) { + checkBoxList = new CheckBoxList(data); + this.updateUI(); + } + + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.width = dim.width < VALUE120 ? VALUE120 : dim.width; + return dim; + } + + /** + * 更新UI + */ + public void updateUI() { + ComboBoxUI cui = (ComboBoxUI) UIManager.getUI(this); + cui = new ComboBoxCheckBoxUI(); + setUI(cui); + } + + private class ComboBoxCheckBoxUI extends UIBasicComboBoxUI { + protected ComboPopup createPopup() { + return new CheckListPopup(comboBox); + } + } + + private class CheckListPopup extends JPopupMenu implements ComboPopup { + protected ComboCheckBox comboBox; + protected JScrollPane scrollPane; + + protected MouseListener mouseListener; + protected MouseMotionListener mouseMotionListener; + + public CheckListPopup(JComboBox comboBox) { + this.comboBox = (ComboCheckBox) comboBox; + this.setBorder(BorderFactory.createLineBorder(Color.black)); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setLightWeightPopupEnabled(comboBox.isLightWeightPopupEnabled()); + if (checkBoxList != null) { + this.scrollPane = new JScrollPane(checkBoxList); + this.scrollPane.setBorder(null); + this.add(this.scrollPane, BorderLayout.CENTER); + checkBoxList.addCheckBoxListSelectionChangeListener(new CheckBoxListSelectionChangeListener() { + + @Override + public void selectionChanged(CheckBoxList target) { + Object[] values = checkBoxList.getSelectedValues(); + CheckListPopup.this.comboBox.getModel().setSelectedItem(values); + } + }); + } + } + + private int getFittingLocaltion2Show() { + Dimension size = this.getPreferredSize(); + Component com = comboBox.getParent(); + if (com != null) { + if (comboBox.getLocation().y + comboBox.getHeight() + size.height > com.getSize().height && comboBox.getLocation().y - size.height > 0) { + return -size.height; + } + } + + return comboBox.getHeight(); + } + + public void show() { + this.updatePopup(); + try { + this.show(comboBox, 0, getFittingLocaltion2Show()); + } catch (IllegalComponentStateException e) { + // richer:这里有可能会抛出一个异常,可以不用处理 + } + checkBoxList.requestFocus(); + } + + public void hide() { + this.setVisible(false); + } + + protected void togglePopup() { + if (this.isVisible()) { + this.hide(); + } else { + this.show(); + } + } + + protected void updatePopup() { + this.setPreferredSize(new Dimension(this.comboBox.getSize().width, checkBoxList.getPreferredSize().height > VALUE120 ? VALUE120 : checkBoxList.getPreferredSize().height + 2)); + Object obj = this.comboBox.getSelectedItem(); + if (obj instanceof Object[]) { + ListModel model = this.comboBox.checkBoxList.getModel(); + for (int i = 0; i < model.getSize(); i++) { + if (ArrayUtils.indexOf((Object[]) obj, model.getElementAt(i)) != -1) { + this.comboBox.checkBoxList.setSelected(i, true); + } + } + } + } + + public KeyListener getKeyListener() { + return null; + } + + public JList getList() { + return new JList(); + } + + @Override + public MouseListener getMouseListener() { + if (mouseListener == null) { + mouseListener = new InvocationMouseHandler(); + } + return mouseListener; + } + + public MouseMotionListener getMouseMotionListener() { + if (mouseMotionListener == null) { + mouseMotionListener = new MouseMotionAdapter() { + }; + } + return mouseMotionListener; + } + + public void uninstallingUI() { + + } + + protected class InvocationMouseHandler extends MouseAdapter { + public void mousePressed(MouseEvent e) { + if (!SwingUtilities.isLeftMouseButton(e) || !comboBox.isEnabled()) { + return; + } + if (comboBox.isEditable()) { + Component comp = comboBox.getEditor().getEditorComponent(); + if ((!(comp instanceof JComponent)) || ((JComponent) comp).isRequestFocusEnabled()) { + comp.requestFocus(); + } + } else if (comboBox.isRequestFocusEnabled()) { + comboBox.requestFocus(); + } + togglePopup(); + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/DictionaryComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/DictionaryComboBox.java new file mode 100644 index 0000000000..10b1817e59 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/DictionaryComboBox.java @@ -0,0 +1,61 @@ +package com.fr.design.gui.icombobox; + +import java.awt.Component; +import java.awt.Dimension; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.JList; + +/* + * 显示和选择的项不同的下拉框 + */ +public class DictionaryComboBox extends UIComboBox { + /** + * + */ + private static final long serialVersionUID = -19512646054322609L; + private Object[] keys; + private String[] values; + + + public DictionaryComboBox(T[] keys, String[] displays) { + this(keys, displays, true); + } + + public DictionaryComboBox(Object[] keys, String[] displays, boolean editable) { + this.initComboBox(keys, displays, editable); + } + + private void initComboBox(Object[] keys, String[] displays, boolean editable){ + this.setPreferredSize(new Dimension(60, 20)); + this.keys = keys; + this.values = displays; + this.setModel(new DefaultComboBoxModel(keys)); + this.setRenderer(new UIComboBoxRenderer() { + /** + * + */ + private static final long serialVersionUID = -6497147896537056134L; + + public Component getListCellRendererComponent(JList list, + Object value, int index, boolean isSelected, + boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, + isSelected, cellHasFocus); + + for (int i = 0, len = DictionaryComboBox.this.keys.length; i < len; i++) { + if (DictionaryComboBox.this.keys[i].equals(value)) { + this.setText(DictionaryComboBox.this.values[i]); + break; + } + } + return this; + } + }); + } + + @SuppressWarnings("unchecked") + public T getSelectedItem() { + return (T)super.getSelectedItem(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/DictionaryConstants.java b/designer-base/src/com/fr/design/gui/icombobox/DictionaryConstants.java new file mode 100644 index 0000000000..2664e24cf5 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/DictionaryConstants.java @@ -0,0 +1,86 @@ +package com.fr.design.gui.icombobox; + +import com.fr.base.SeparationConstants; +import com.fr.general.Inter; + +public class DictionaryConstants { + // richer:正则表达式 + public final static String[] regexps = new String[] { + "", + "^.+$", + "^\\w{0,13}$", + "^\\d+(\\.\\d+)?$", + "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$", + "^\\d{3,4}-\\d{7,8}$", + "^\\d{11}$", + "(^\\d{15}$)|(^\\d{17}([0-9]|[Xx])$)", + "^\\d{6}$" }; + + public final static String[] regexpsDisplays = new String[] { + Inter.getLocText("None"), + Inter.getLocText("Required"), + Inter.getLocText("Length"), + Inter.getLocText("Float"), + Inter.getLocText("Email"), + Inter.getLocText("Phone"), + Inter.getLocText("MobilePhone"), + Inter.getLocText("IDCard"), + Inter.getLocText("PostCode"), + Inter.getLocText("Custom")}; + + public final static int REG_NONE = 0; + public final static int REG_REQUIRED = 1; + public final static int REG_LENGTH = 2; + public final static int REG_FLOAT = 3; + public final static int REG_EMAIL = 4; + public final static int REG_PHONE = 5; + public final static int REG_MOBILEPHONE = 6; + public final static int REG_IDCARD = 7; + public final static int REG_POSTCODE = 8; + public final static int REG_CUSTOM = 9; + + // richer:分隔符 + public static final String[] delimiters = new String[]{ + SeparationConstants.COMMA, SeparationConstants.SEMICOLON, SeparationConstants.COLON + }; + + public static final String[] delimiterDisplays = new String[]{ + Inter.getLocText("Form-Comma"), + Inter.getLocText("Form-Semicolon"), + Inter.getLocText("Form-Colon") + }; + + public static final String[] symbols = new String[]{ + "", SeparationConstants.SINGLE_QUOTE, SeparationConstants.DOUBLE_QUOTES + }; + + public static final String[] symbolDisplays = new String[]{ + Inter.getLocText("None"), + Inter.getLocText("Form-Single_quote"), + Inter.getLocText("Form-Double_quotes") + }; + // richer:文件类型选择器 + public static final String[] fileTypes = new String[]{ + "", + "txt", + "pdf", + "jpg,png,gif", + "doc,xls,ppt" + }; + + public static final String[] acceptTypes = new String[]{ + "", + "txt", + "pdf", + "jpg|png|gif", + "doc|xls|ppt" + }; + + public static final String[] fileTypeDisplays = new String[]{ + Inter.getLocText("Form-All_Files"), + "txt", + "pdf", + "jpg,png,gif", + "doc,xls,ppt" + }; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/ExtendedComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/ExtendedComboBox.java new file mode 100644 index 0000000000..70fa9dccdf --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/ExtendedComboBox.java @@ -0,0 +1,118 @@ +package com.fr.design.gui.icombobox; + +import com.fr.common.inputevent.InputEventBaseOnOS; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.InputEvent; +import java.awt.event.MouseEvent; +import java.util.Vector; + +import javax.swing.ComboBoxModel; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.ListCellRenderer; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicComboPopup; +import javax.swing.plaf.basic.ComboPopup; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + + +public class ExtendedComboBox extends UIComboBox { + private static final int VALUE120 = 120; + + public ExtendedComboBox() { + } + + public ExtendedComboBox(ComboBoxModel aModel) { + super(aModel); + } + + public ExtendedComboBox(Object[] items) { + super(items); + } + + public ExtendedComboBox(Vector items) { + super(items); + } + + /** + * 更新UI + */ + public void updateUI() { + setUI(new ExtendedComboBoxUI()); + } + + @Override + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.width = VALUE120; + return dim; + } + + static class ExtendedComboBoxUI extends UIBasicComboBoxUI { + public static ComponentUI createUI(JComponent c) { + return new ExtendedComboBoxUI(); + } + + protected ComboPopup createPopup() { + ExtendedComboPopup popup = new ExtendedComboPopup(comboBox); + popup.getAccessibleContext().setAccessibleParent(comboBox); + return popup; + } + + public ComboPopup getPopup() { + return popup; + } + } + + static class ExtendedComboPopup extends BasicComboPopup { + + public ExtendedComboPopup(JComboBox combo) { + super(combo); + } + protected JList createList() { + return new JList(comboBox.getModel()) { + public void processMouseEvent(MouseEvent e) { + if (InputEventBaseOnOS.isControlDown(e)) { + // Fix for 4234053. Filter out the Control + // Key from the list. + // ie., don't allow CTRL key deselection. + e = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), e.getModifiers() + ^ DEFAULT_MODIFIER, e.getX(), e.getY(), e.getClickCount(), e.isPopupTrigger()); + } + super.processMouseEvent(e); + } + + public String getToolTipText(MouseEvent event) { + int index = locationToIndex(event.getPoint()); + if (index != -1) { + Object value = getModel().getElementAt(index); + ListCellRenderer renderer = getCellRenderer(); + Component rendererComp = renderer.getListCellRendererComponent(this, value, index, true, false); + if (rendererComp.getPreferredSize().width > getVisibleRect().width) { + return value == null ? null : value.toString(); + } else { + return null; + } + } + return null; + } + + public Point getToolTipLocation(MouseEvent event) { + int index = locationToIndex(event.getPoint()); + if (index != -1) { + Rectangle cellBounds = getCellBounds(index, index); + return new Point(cellBounds.x, cellBounds.y); + } + return null; + } + }; + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/ExtendedComboBoxTest.java b/designer-base/src/com/fr/design/gui/icombobox/ExtendedComboBoxTest.java new file mode 100644 index 0000000000..8fdb3dafe3 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/ExtendedComboBoxTest.java @@ -0,0 +1,34 @@ +package com.fr.design.gui.icombobox; + +import java.awt.BorderLayout; + +import javax.swing.JFrame; +import javax.swing.UIManager; + +import com.fr.base.FRContext; + +public class ExtendedComboBoxTest { + public static void main(String[] args) { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + + final ExtendedComboBox cb = new ExtendedComboBox( + new String[] { + "Hello world, alksdfjlaskdjflaskjdflaksdf", + "Hello world, alksdfjlaskdjflaskjdflaksdfasdfklajsdflkasjdflkasdf", + "Hello world, alksdfjlaskdjflaskjdflaksdfasdfklajsdflkasjdflkasdfaaaaaaaaaaaaaaaaaadfsdf", + "Hello world, alksdfjlaskdjflaskjdflaksdfasdfklajsdflkasjdflkasdfsdfgklsdjfgklsdfjgklsjdfgkljsdflkgjsdlfk" }); + + + JFrame f = new JFrame(); + f.getContentPane().add(cb, BorderLayout.CENTER); + f.pack(); + f.setSize(300, f.getHeight()); + f.setLocationRelativeTo(null); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + f.setVisible(true); + } +} \ 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 new file mode 100644 index 0000000000..2a4ef73f6c --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/FRTreeComboBox.java @@ -0,0 +1,621 @@ +package com.fr.design.gui.icombobox; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.IllegalComponentStateException; +import java.awt.RenderingHints; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionAdapter; +import java.awt.event.MouseMotionListener; +import java.util.Enumeration; + +import javax.swing.BorderFactory; +import javax.swing.DefaultListCellRenderer; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTree; +import javax.swing.MenuSelectionManager; +import javax.swing.SwingUtilities; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.event.PopupMenuListener; +import javax.swing.plaf.basic.BasicComboBoxUI; +import javax.swing.plaf.basic.ComboPopup; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.ComparatorUtils; +import com.fr.general.NameObject; +import com.fr.stable.Constants; +import com.fr.stable.StringUtils; + +public class FRTreeComboBox extends UIComboBox { + + private static final int PAGE_DIFF = 5; + private static final int DEFAULT_HEIGHT = 120; + + // richer:下拉展示用的tree + protected JTree tree; + private boolean onlyLeafSelectable = true; + + public FRTreeComboBox() { + this(new JTree()); + } + + public FRTreeComboBox(JTree tree) { + this(tree, null); + } + + public FRTreeComboBox(JTree tree, TreeCellRenderer renderer) { + this(tree, renderer, false); + } + + public FRTreeComboBox(JTree tree, TreeCellRenderer renderer, boolean editable) { + this(tree, renderer, false, editable); + } + + public FRTreeComboBox(JTree tree, TreeCellRenderer renderer, + boolean showRoot, boolean editable) { + this.setTree(tree); + this.tree.setCellRenderer(renderer); + this.setEditor(new FrTreeSearchComboBoxEditor(this)); + if (!showRoot) { + tree.expandPath(new TreePath(tree.getModel().getRoot())); + tree.setRootVisible(false); + } + this.setEditable(editable); + setUI(new FRTreeComboBoxUI()); + } + + public JTree getTree() { + return this.tree; + } + + /** + * 自定义那些那些node可以选中,默认情况下所有node节点都可以选中 + * @param node + * @return + */ + protected boolean customSelectable(DefaultMutableTreeNode node){ + return true; + } + + public void setTree(JTree tree) { + this.tree = tree; + if (tree != null) { + this.setSelectedItem(tree.getSelectionPath()); + this.setRenderer(new TreeComboBoxRenderer()); + } + } + + public void setOnlyLeafSelectable(boolean onlyLeafSelectable) { + this.onlyLeafSelectable = onlyLeafSelectable; + } + + /** + * 获得FRTreeComboBox的返回值 + * + * @return Object + */ + public Object getSelectedObject() { + if (!(this.getSelectedItem() instanceof TreePath)) { + return this.getSelectedItem(); + } + TreePath treePath = (TreePath) this.getSelectedItem(); + if (treePath == null) { + return null; + } + DefaultMutableTreeNode node = (DefaultMutableTreeNode) treePath.getLastPathComponent(); + return node.getUserObject(); + } + + public String getProcedureSelectName() { + DefaultMutableTreeNode node = (DefaultMutableTreeNode) ((TreePath) this.getSelectedItem()).getLastPathComponent(); + NameObject no = (NameObject) node.getUserObject(); + String ds2 = no.getName(); + node = (DefaultMutableTreeNode) node.getParent(); + no = (NameObject) node.getUserObject(); + String ds1 = no.getName(); + return ds1 + "." + ds2; + } + + protected void dealSamePath(TreePath parent,TreeNode node,UITextField textField){ + boolean isBreak = false; + for (Enumeration e = node.children(); e.hasMoreElements(); ) { + TreeNode n = (TreeNode) e.nextElement(); + TreePath path = parent.pathByAddingChild(n); + TreeNode pathnode = (TreeNode) path.getLastPathComponent(); + for (Enumeration e2 = pathnode.children(); e2.hasMoreElements(); ) { + TreeNode n2 = (TreeNode) e2.nextElement(); + TreePath path2 = path.pathByAddingChild(n2); + if (pathToString(path2).toUpperCase().startsWith(textField.getText().toUpperCase())) { + tree.scrollPathToVisible(path2); + tree.setSelectionPath(path2); + isBreak = true; + break; + } + } + if (isBreak) { + break; + } + } + } + + public void setSelectedItem(Object o) { + if (o instanceof String) { + this.setSelectedItemString((String) o); + return; + } + this.tree.setSelectionPath((TreePath) o); + if (this.isEditable && o != null) { + this.setSelectedItemString(pathToString((TreePath) o)); + } else { + this.getModel().setSelectedItem(o); + } + } + + private boolean validTreePath(String treePath){ + return StringUtils.isNotEmpty(treePath) && treePath.charAt(0) == '[' && treePath.endsWith("]"); + } + + protected String pathToString(TreePath path) { + String temp = path.toString(); + if (validTreePath(temp)) { + temp = temp.substring(2, temp.length() - 1); + String[] selectedtable = temp.split(","); + String table = selectedtable[selectedtable.length - 1].trim(); + if (table.contains(".")) { + String[] temp2 = table.split("\\."); + table = temp2[temp2.length - 1].trim(); + } + return table; + } + return ""; + } + + /* + * richer:根据NameObject的名字来选取 + */ + public void setSelectedItemString(String _name) { + if (StringUtils.isBlank(_name)) { + this.setSelectedIndex(-1); + return; + } + DefaultTreeModel model = (DefaultTreeModel) this.tree.getModel(); + DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot(); + DefaultMutableTreeNode leaf = root.getFirstLeaf(); + do { + Object userObj = leaf.getUserObject(); + if (userObj instanceof NameObject) { + if (ComparatorUtils.equals(_name, ((NameObject) userObj).getName())) { + TreePath path = new TreePath(model.getPathToRoot(leaf)); + this.tree.setSelectionPath(path); + this.setSelectedItem(path); + break; + } + } + } while ((leaf = leaf.getNextLeaf()) != null); + if (leaf == null) { + this.getModel().setSelectedItem(_name); + } + } + + public void setSelectedFirst() { + DefaultTreeModel model = (DefaultTreeModel) this.tree.getModel(); + DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot(); + if (root == null) { + return; + } + DefaultMutableTreeNode leaf = root.getFirstLeaf(); + if (leaf == null) { + return; + } + if (leaf.getUserObject() instanceof NameObject) { + TreePath path = new TreePath(model.getPathToRoot(leaf)); + this.tree.setSelectionPath(path); + this.setSelectedItem(path); + } + } + + public void setPopSize(int width, int height) { + treePopup.setPopSize(width, height); + } + + + private static TreePopup treePopup; + + private static class FRTreeComboBoxUI extends BasicComboBoxUI implements MouseListener{ + private boolean isRollover = false; + + public FRTreeComboBoxUI() { + super(); + } + protected ComboPopup createPopup() { + treePopup = new TreePopup(comboBox); + return treePopup; + } + @Override + protected UIButton createArrowButton() { + 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); + return (UIButton) arrowButton; + } + + public void paint(Graphics g, JComponent c) { + super.paint(g, c); + Graphics2D g2d = (Graphics2D)g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + Color linecolor = null; + if (comboBox.isPopupVisible()) { + linecolor = UIConstants.LINE_COLOR; + arrowButton.setSelected(true); + } else if (isRollover) { + linecolor = UIConstants.LIGHT_BLUE; + } else { + linecolor = UIConstants.LINE_COLOR; + arrowButton.setSelected(false); + } + g2d.setColor(linecolor); + if (!comboBox.isPopupVisible()) { + g2d.drawRoundRect(0, 0, c.getWidth() - arrowButton.getWidth() + 3, c.getHeight() - 1, UIConstants.LARGEARC, UIConstants.LARGEARC); + } else { + g2d.drawRoundRect(0, 0, c.getWidth() , c.getHeight() + 3, UIConstants.LARGEARC, UIConstants.LARGEARC ); + g2d.drawLine(0, c.getHeight()-1, c.getWidth(), c.getHeight()-1); + } + } + + + + private void setRollover(boolean isRollover) { + if (this.isRollover != isRollover) { + this.isRollover = isRollover; + comboBox.repaint(); + } + } + + @Override + public void mouseEntered(MouseEvent e) { + setRollover(true); + } + + @Override + public void mouseExited(MouseEvent e) { + setRollover(false); + } + + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + } + + /** + * 添加弹出菜单监听 + * + * @param l 监听事件 + * + * @date 2015-1-22-下午5:04:00 + * + */ + public void addPopupMenuListener(PopupMenuListener l) { + treePopup.addPopupMenuListener(l); + } + + private class TreeComboBoxRenderer extends DefaultListCellRenderer { + public Component getListCellRendererComponent(JList list, Object value, + int index, boolean isSelected, boolean cellHasFocus) { + if (value != null) { + TreePath path = (TreePath) value; + TreeNode node = (TreeNode) path.getLastPathComponent(); + value = node; + TreeCellRenderer treeCellRenderer = tree.getCellRenderer(); + UILabel lb = (UILabel) treeCellRenderer.getTreeCellRendererComponent(tree, value, isSelected, + false, node.isLeaf(), index, cellHasFocus); + return lb; + } + return super.getListCellRendererComponent(list, value, index, + isSelected, cellHasFocus); + } + } + + /* + * richer:弹出部分 + */ + private static class TreePopup extends JPopupMenu implements ComboPopup { + /** + * + */ + private static final long serialVersionUID = 1L; + private int defaultWidth = 0; + private int defaultHeight = 0; + protected FRTreeComboBox comboBox; + protected JScrollPane scrollPane; + protected JTree tree; + + protected MouseMotionListener mouseMotionListener; + protected MouseListener mouseListener; + private MouseListener treeSelectListener = new MouseAdapter() { + public void mousePressed(MouseEvent e) { + JTree tree = (JTree) e.getSource(); + TreePath treePath = tree.getPathForLocation(e.getPoint().x, e + .getPoint().y); + if (treePath == null) { + return; + } + DefaultMutableTreeNode node = (DefaultMutableTreeNode) treePath + .getLastPathComponent(); + selectTreeItem(node, treePath); + } + }; + + //samuel:相应首字母导航的键盘确定 + private KeyListener treeKeyListener = new KeyAdapter() { + public void keyReleased(KeyEvent e) { + int key = e.getKeyCode(); + if (key == KeyEvent.VK_ENTER) { + TreePath treePath = tree.getSelectionPath(); + if (treePath == null) { + return; + } + DefaultMutableTreeNode node = (DefaultMutableTreeNode) treePath + .getLastPathComponent(); + selectTreeItem(node, treePath); + } + } + }; + + private void selectTreeItem(DefaultMutableTreeNode node, TreePath treePath) { + if (node.isRoot()) { + return; + } + if (comboBox.onlyLeafSelectable && !node.isLeaf()) { + return; + } + + //自定义node是否可选择 + if (!comboBox.customSelectable(node)){ + return; + } + + comboBox.setSelectedItem(treePath); + togglePopup(); + MenuSelectionManager.defaultManager().clearSelectedPath(); + } + + public TreePopup(JComboBox comboBox) { + this.comboBox = (FRTreeComboBox) comboBox; + this.setBorder(BorderFactory.createLineBorder(Color.black)); + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setLightWeightPopupEnabled(comboBox + .isLightWeightPopupEnabled()); + tree = this.comboBox.getTree(); + if (tree != null) { + this.scrollPane = new JScrollPane(tree); + this.scrollPane.setBorder(null); + this.add(this.scrollPane, BorderLayout.CENTER); + tree.addMouseListener(this.treeSelectListener); + tree.addKeyListener(this.treeKeyListener); + } + } + + public void show() { + this.updatePopup(); + try { + /* + * 这里有个问题,可能是哪里的listenerr有冲突将这个JPopMenu show的X设置为70时 + * 正好可以脱离DBManipulationPane,此时可以正确相应鼠标点击事件,否则由于焦点不在JPopmenu + * 上点击,树时将导致窗口销毁,无法正确相应点击事件 + */ + this.show(comboBox, 0, comboBox.getHeight()); + } catch (IllegalComponentStateException e) { + // richer:这里有可能会抛出一个异常,可以不用处理 + } + } + + public void hide() { + this.setVisible(false); + } + + public JList getList() { + return new JList(); + } + + public MouseMotionListener getMouseMotionListener() { + if (mouseMotionListener == null) { + mouseMotionListener = new MouseMotionAdapter() { + }; + } + return mouseMotionListener; + } + + public KeyListener getKeyListener() { + return null; + } + + public void uninstallingUI() { + } + + public MouseListener getMouseListener() { + if (mouseListener == null) { + mouseListener = new InvocationMouseHandler(); + } + return mouseListener; + } + + protected void togglePopup() { + if (this.isVisible()) { + this.hide(); + } else { + this.show(); + } + } + + protected void updatePopup() { + int width = defaultWidth == 0 ? this.comboBox.getSize().width : defaultWidth; + int height = defaultHeight == 0 ? DEFAULT_HEIGHT : defaultHeight; + this.setPreferredSize(new Dimension(width, height)); + Object selectedObj = this.comboBox.getSelectedItem(); + if (selectedObj instanceof TreePath) { + TreePath tp = (TreePath) selectedObj; + (this.comboBox).getTree().setSelectionPath(tp); + } + } + + public void setPopSize(int width, int height) { + this.defaultWidth = width; + this.defaultHeight = height; + } + + protected class InvocationMouseHandler extends MouseAdapter { + public void mousePressed(MouseEvent e) { + if (!SwingUtilities.isLeftMouseButton(e) + || !comboBox.isEnabled()) { + return; + } + if (comboBox.isEditable()) { + Component comp = comboBox.getEditor().getEditorComponent(); + if ((!(comp instanceof JComponent)) + || ((JComponent) comp).isRequestFocusEnabled()) { + comp.requestFocus(); + } + } else if (comboBox.isRequestFocusEnabled()) { + comboBox.requestFocus(); + } + togglePopup(); + } + } + } + + class FrTreeSearchComboBoxEditor extends UIComboBoxEditor implements DocumentListener { + private volatile boolean setting = false; + private FRTreeComboBox comboBox; + private Object item; + + public FrTreeSearchComboBoxEditor(FRTreeComboBox comboBox) { + super(); + this.comboBox = comboBox; + textField.getDocument().addDocumentListener(this); + textField.addKeyListener(this.treeKeyListener); + } + + private KeyListener treeKeyListener = new KeyAdapter() { + public void keyPressed(KeyEvent e) { + int key = e.getKeyCode(); + if (key == KeyEvent.VK_DOWN) { + int row = tree.getRowForPath(tree.getSelectionPath()) + 1; + tree.setSelectionRow(row); + tree.scrollRowToVisible(row); + } else if (key == KeyEvent.VK_UP) { + int row = tree.getRowForPath(tree.getSelectionPath()) - 1; + tree.setSelectionRow(row); + tree.scrollRowToVisible(row); + } else if (key == KeyEvent.VK_PAGE_DOWN) { + int row = tree.getRowForPath(tree.getSelectionPath()) + PAGE_DIFF; + tree.setSelectionRow(row); + tree.scrollRowToVisible(row); + } else if (key == KeyEvent.VK_PAGE_UP) { + int row = tree.getRowForPath(tree.getSelectionPath()) - PAGE_DIFF; + tree.setSelectionRow(row); + tree.scrollRowToVisible(row); + } + } + + public void keyReleased(KeyEvent e) { + int key = e.getKeyCode(); + if (key == KeyEvent.VK_ENTER) { + TreePath treePath = tree.getSelectionPath(); + if (treePath == null) { + return; + } + DefaultMutableTreeNode node = (DefaultMutableTreeNode) treePath + .getLastPathComponent(); + if (node.isLeaf()) { + comboBox.setSelectedItem(treePath); + textField.setText(pathToString(treePath)); + MenuSelectionManager.defaultManager().clearSelectedPath(); + } + } + + } + }; + + + public void setItem(Object item) { + this.item = item; + this.setting = true; + textField.setText((item == null) ? "" : item.toString()); + this.setting = false; + } + + public Object getItem() { + return this.item; + } + + public void insertUpdate(DocumentEvent e) { + changeHandler(); + } + + public void removeUpdate(DocumentEvent e) { + changeHandler(); + } + + public void changedUpdate(DocumentEvent e) { + changeHandler(); + } + + protected void changeHandler() { + if (setting) { + return; + } + setPopupVisible(true); + this.item = textField.getText(); + TreeNode root = (TreeNode) tree.getModel().getRoot(); + TreePath parent = new TreePath(root); + TreeNode node = (TreeNode) parent.getLastPathComponent(); + dealSamePath(parent,node,textField); + this.getEditorComponent().requestFocus(); + } + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/FilterComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/FilterComboBox.java new file mode 100644 index 0000000000..5019fde2ea --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/FilterComboBox.java @@ -0,0 +1,128 @@ +package com.fr.design.gui.icombobox; + +import java.awt.Component; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.ComboBoxEditor; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +import com.fr.design.gui.icombobox.filter.Filter; +import com.fr.design.gui.icombobox.filter.StartsWithFilter; +import com.fr.design.gui.itextfield.UITextField; + +/** + * peter:这个类的大部分代码都是抄的,细节我也没有极度关注. + * 使用的时候,只需要做一个Filter类,就可以了. + * 数据以List的形式放到报表里面去 + */ +public class FilterComboBox extends ExtendedComboBox { + private Filter filter; + + public FilterComboBox() { + this(new ArrayList()); + this.setEditable(true); + } + + public FilterComboBox(List itemList) { + this(new StartsWithFilter(), itemList); + } + + public FilterComboBox(Filter filter, List itemList) { + this.filter = filter; + + setModel(new FilterableComboBoxModel(itemList)); + setEditor(new FilterComboBoxEditor()); + setEditable(true); + } + + public void setItemArray(T[] objectArray) { + List itemList = new ArrayList(); + if(objectArray != null) { + for(int i = 0; i < objectArray.length; i++) { + itemList.add(objectArray[i]); + } + } + + this.setItemList(itemList); + } + + public void setItemList(List itemList) { + ((FilterableComboBoxModel)this.getModel()).setPrefix(""); + ((FilterableComboBoxModel)this.getModel()).setItemList(itemList); + } + + class FilterComboBoxEditor implements ComboBoxEditor, DocumentListener { + private Object item; + + public UITextField textField; + private volatile boolean filtering = false; + private volatile boolean setting = false; + + public FilterComboBoxEditor() { + textField = new UITextField(15); + textField.getDocument().addDocumentListener(this); + } + + public Component getEditorComponent() { + return textField; + } + + public void setItem(Object item) { + if (filtering) { + return; + } + this.item = item; + + this.setting = true; + String newText = (item == null) ? "" : item.toString(); + textField.setText(newText); + this.setting = false; + } + + public Object getItem() { + return this.item; + } + + public void selectAll() { + textField.selectAll(); + } + + public void addActionListener(ActionListener l) { + textField.addActionListener(l); + } + + public void removeActionListener(ActionListener l) { + textField.removeActionListener(l); + } + + public void insertUpdate(DocumentEvent e) { + handleChange(); + } + + public void removeUpdate(DocumentEvent e) { + handleChange(); + } + + public void changedUpdate(DocumentEvent e) { + handleChange(); + } + + protected void handleChange() { + if (setting) { + return; + } + + filtering = true; + + ((FilterableComboBoxModel) getModel()).setSelectedItem(textField.getText()); + ((FilterableComboBoxModel) getModel()).setPrefix(textField.getText()); + this.item = textField.getText(); + + setPopupVisible(true); + filtering = false; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/FilterableComboBoxModel.java b/designer-base/src/com/fr/design/gui/icombobox/FilterableComboBoxModel.java new file mode 100644 index 0000000000..4ea293121b --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/FilterableComboBoxModel.java @@ -0,0 +1,103 @@ +package com.fr.design.gui.icombobox; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import javax.swing.AbstractListModel; +import javax.swing.MutableComboBoxModel; + +import com.fr.design.gui.icombobox.filter.Filter; +import com.fr.design.gui.icombobox.filter.StartsWithFilter; + +public class FilterableComboBoxModel extends AbstractListModel implements MutableComboBoxModel { + private List itemList; + private Filter filter = new StartsWithFilter(); + private String prefix = ""; + private List filteredItems; + private Object selectedItem; + + public FilterableComboBoxModel(List items) { + this.itemList = new ArrayList(items); + filteredItems = new ArrayList(items.size()); + updateFilteredItems(); + } + + public void addElement(Object obj) { + itemList.add(obj); + updateFilteredItems(); + } + + public void removeElement(Object obj) { + itemList.remove(obj); + updateFilteredItems(); + } + + public void removeElementAt(int index) { + itemList.remove(index); + updateFilteredItems(); + } + + public void setItemList(List itemList) { + this.itemList = itemList; + updateFilteredItems(); + } + + public void insertElementAt(Object obj, int index) { + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + updateFilteredItems(); + } + + protected void updateFilteredItems() { + fireIntervalRemoved(this, 0, filteredItems.size()); + filteredItems.clear(); + + if (filter == null) { + filteredItems.addAll(itemList); + } else { + // alex:先加一个NPE判断 + if (itemList != null) { + for (Iterator iterator = itemList.iterator(); iterator.hasNext();) { + Object item = iterator.next(); + if (filter.accept(prefix, item)) { + filteredItems.add(item); + } + } + } + } + + fireIntervalAdded(this, 0, filteredItems.size()); + } + + public int getSize() { + return filteredItems.size(); + } + + public Object getElementAt(int index) { + return filteredItems.get(index); + } + + public Object getSelectedItem() { + return selectedItem; + } + + public void setSelectedItem(Object val) { + if ((selectedItem == null) && (val == null)) { + return; + } + + if ((selectedItem != null) && selectedItem.equals(val)) { + return; + } + + if ((val != null) && val.equals(selectedItem)) { + return; + } + + selectedItem = val; + fireContentsChanged(this, -1, -1); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/FixedHeightComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/FixedHeightComboBox.java new file mode 100644 index 0000000000..d8eebc3b57 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/FixedHeightComboBox.java @@ -0,0 +1,103 @@ +package com.fr.design.gui.icombobox; + +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Rectangle; + +import javax.swing.JComboBox; +import javax.swing.plaf.ComboBoxUI; +import javax.swing.plaf.basic.ComboPopup; + + +/* + * 下拉框高度固定 + */ +public class FixedHeightComboBox extends FilterComboBox { + private static final long serialVersionUID = 1L; + private static final int VALUE120 = 120; + + public FixedHeightComboBox() { + super(); + } + + public void setUI(ComboBoxUI ui) { + ui = new UI(); + super.setUI(ui); + } + + /** + * 更新UI + */ + public void updateUI() { + setUI(new UI()); + } + + @SuppressWarnings("unchecked") + @Override + public T getSelectedItem() { + return (T) dataModel.getSelectedItem(); + } + + @Override + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.width = VALUE120; + return dim; + } + + class UI extends UIBasicComboBoxUI { + protected ComboPopup createPopup() { + Popup popup = new Popup(comboBox); + popup.getAccessibleContext().setAccessibleParent(comboBox); + return popup; + } + + public javax.swing.plaf.basic.ComboPopup getPopup() { + return popup; + } + } + + class Popup extends ExtendedComboPopup { + private static final long serialVersionUID = 1L; + + public Popup(JComboBox combo) { + super(combo); + } + + public void show() { + setListSelection(comboBox.getSelectedIndex()); + Point location = getPopupLocation(); + show(comboBox, location.x, location.y); + } + + private void setListSelection(int selectedIndex) { + if (selectedIndex == -1) { + list.clearSelection(); + } else { + list.setSelectedIndex(selectedIndex); + list.ensureIndexIsVisible(selectedIndex); + } + } + + private Point getPopupLocation() { + Dimension popupSize = comboBox.getSize(); + + // reduce the width of the scrollpane by the insets so that + // the popup + // is the same width as the combo box. + popupSize.setSize(popupSize.width, 120); + Rectangle popupBounds = computePopupBounds(0, comboBox.getBounds().height, popupSize.width, popupSize.height); + Dimension scrollSize = popupBounds.getSize(); + Point popupLocation = popupBounds.getLocation(); + + scroller.setMaximumSize(scrollSize); + scroller.setPreferredSize(scrollSize); + scroller.setMinimumSize(scrollSize); + + list.revalidate(); + + return popupLocation; + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/FunctionComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/FunctionComboBox.java new file mode 100644 index 0000000000..a5da615b0c --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/FunctionComboBox.java @@ -0,0 +1,69 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.icombobox; + +import java.awt.Component; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.JList; + +import com.fr.data.core.DataCoreUtils; +import com.fr.data.util.function.DataFunction; + +/** + * DataFunction combobox. + */ +public class FunctionComboBox extends UIComboBox { + + /** + * Constructor. + */ + public FunctionComboBox(DataFunction[] functionArray) { + this.setModel(new DefaultComboBoxModel(functionArray)); + this.setRenderer(functionCellRenderer); + } + + /** + * Return function. + */ + public DataFunction getFunction() { + return (DataFunction) this.getSelectedItem(); + } + + /** + * Set function. + */ + public void setFunction(DataFunction function) { + if (function == null) { + return; + } + + DefaultComboBoxModel model = (DefaultComboBoxModel) this.getModel(); + for (int i = 0; i < model.getSize(); i++) { + DataFunction tmpFunction = (DataFunction) model.getElementAt(i); + if (tmpFunction == null) { + continue; + } + + if (function.getClass().equals(tmpFunction.getClass())) { + this.setSelectedIndex(i); + break; + } + } + } + + UIComboBoxRenderer functionCellRenderer = new UIComboBoxRenderer() { + public Component getListCellRendererComponent(JList list, + Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value instanceof DataFunction) { + DataFunction function = (DataFunction) value; + this.setText(" " + DataCoreUtils.getFunctionDisplayName(function)); + } + + return this; + } + }; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/IntComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/IntComboBox.java new file mode 100644 index 0000000000..b2c75766e7 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/IntComboBox.java @@ -0,0 +1,51 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.icombobox; + +import java.awt.Component; + +import javax.swing.JList; + +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.icombobox.UIComboBoxRenderer; + +/** + * Int combobox. + * @author zhou + * @since 2012-6-1下午2:00:14 + */ +public class IntComboBox extends UIComboBox { + public IntComboBox() { + this.setRenderer(new UIComboBoxRenderer() { + public Component getListCellRendererComponent(JList list, + Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value instanceof Integer) { + this.setText(" "+value + " "); + } + + return this; + } + }); + } + + public int getSelectedInt() { + if (this.getSelectedItem() == null) { + return -1; + } + return ((Integer)this.getSelectedItem()).intValue(); + } + + public void setSelectedInt(int selectedInt) { + int index = -1; + for (int i = 0; i < this.getItemCount(); i++) { + if (((Integer) this.getItemAt(i)).intValue() == selectedInt) { + index = i; + break; + } + } + this.setSelectedIndex(index); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/LazyComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/LazyComboBox.java new file mode 100644 index 0000000000..fa4464cfc3 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/LazyComboBox.java @@ -0,0 +1,214 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.icombobox; + +import java.awt.Dimension; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import javax.swing.plaf.basic.BasicComboPopup; + +import com.fr.general.Inter; + +/** + * @author richer + * @since 6.5.5 创建于2011-6-15 延迟加载的下拉框 + */ +public abstract class LazyComboBox extends UIComboBox implements PopupMenuListener { + protected boolean loaded = false; + private List ls = new ArrayList(); + private Object initialSelected = null; + private static final int NUM=80; + + public static final Object PENDING = new Object() { + + @Override + public String toString() { + return Inter.getLocText("Loading") + "..."; + } + }; + + public LazyComboBox() { + super(); + this.setEditor(new FilterComboBoxEditor()); + addPopupMenuListener(this); +// updateUI(); + } + + public void setLoaded(boolean loaded) { + this.loaded = loaded; + } + + public abstract Object[] load(); + + public void setSelectedItem(Object anObject) { + initialSelected = anObject; + if (loaded) { + super.setSelectedItem(anObject); + } else { + + setModel(new DefaultComboBoxModel(new Object[] { anObject })); + super.setSelectedItem(anObject); + } + } + + /** + * 通过调用该方法,在点击下拉框按钮之前就加载好数据 + */ + public void loadInstant() { + if (loaded) { + return; + } + setModel(new DefaultComboBoxModel(load())); + loaded = true; + } + + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + if (loaded) { + return; + } + DefaultComboBoxModel loadingModel = new DefaultComboBoxModel(new String[]{"", Inter.getLocText("Loading") + "..."}); + LazyComboBox.this.setModel(loadingModel); + new SwingWorker() { + + @Override + protected Void doInBackground() throws Exception { + final Object selectedObj = getSelectedItem(); + loadList(); + return null; + } + + @Override + public void done() { + LazyComboBox.this.updateUI(); + LazyComboBox.this.fireEvent(); + LazyComboBox.this.showPopup(); + } + + }.execute(); + + + } + + /** + * 计算加载下拉列表 + */ + public void loadList() { + DefaultComboBoxModel model = new DefaultComboBoxModel(load()); + model.setSelectedItem(initialSelected); + LazyComboBox.this.setModel(model); + LazyComboBox.this.selectedItemReminder = initialSelected ; + loaded = true; + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + + } + + @Override + public void popupMenuCanceled(PopupMenuEvent e) { + + } + + public void addClickListener(EventListener l) { + if (ls == null) { + ls = new ArrayList(); + } + ls.add(l); + } + + public void fireEvent() { + for (int i = 0, n = ls.size(); i < n; i++) { + ls.get(i).fireEvent(); + } + } + + @Override + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.width = NUM; + return dim; + } + + private static class LazyPopMenu extends BasicComboPopup { + + public LazyPopMenu(final JComboBox combo) { + super(combo); + LazyComboBox comboc = (LazyComboBox) combo; + comboc.addClickListener(new EventListener() { + + @Override + public void fireEvent() { + LazyPopMenu.this.show(); + combo.showPopup(); + } + }); + } + } + + private interface EventListener { + void fireEvent(); + } + + class FilterComboBoxEditor extends UIComboBoxEditor implements DocumentListener { + private Object item; + private volatile boolean filtering = false; + private volatile boolean setting = false; + + public FilterComboBoxEditor() { + super(); + textField.getDocument().addDocumentListener(this); + } + + public void setItem(Object item) { + if (filtering) { + return; + } + this.item = item; + + this.setting = true; + textField.setSetting(true); + String newText = (item == null) ? "" : item.toString(); + textField.setText(newText); + textField.setSetting(false); + this.setting = false; + } + + public Object getItem() { + return this.item; + } + + public void insertUpdate(DocumentEvent e) { + handleChange(); + } + + public void removeUpdate(DocumentEvent e) { + handleChange(); + } + + public void changedUpdate(DocumentEvent e) { + handleChange(); + } + + protected void handleChange() { + if (setting) { + return; + } + filtering = true; + String xx = textField.getText(); + LazyComboBox.this.setSelectedItem(xx); + this.item = textField.getText(); + + setPopupVisible(true); + filtering = false; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/LazyComboBoxTest.java b/designer-base/src/com/fr/design/gui/icombobox/LazyComboBoxTest.java new file mode 100644 index 0000000000..157a6e8933 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/LazyComboBoxTest.java @@ -0,0 +1,62 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.icombobox; + +import java.awt.BorderLayout; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import com.fr.base.FRContext; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.FRGUIPaneFactory; +import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; + +/** + * @author richer + * @since 6.5.5 创建于2011-6-15 + */ +public class LazyComboBoxTest { + public static void main(String[] args) { + try { + UIManager.setLookAndFeel(new WindowsLookAndFeel()); + } catch (UnsupportedLookAndFeelException e1) { + FRContext.getLogger().error(e1.getMessage(), e1); + } + JFrame f = new JFrame(); + JPanel p = (JPanel) f.getContentPane(); + p.setLayout(FRGUIPaneFactory.createBorderLayout()); + + LazyComboBox lc = new LazyComboBox() { + + @Override + public Object[] load() { + Object[] m = new String[] { "aa", "bb", "cc" }; + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + FRContext.getLogger().error(e.getMessage(), e); + } + return m; + } + }; + lc.setEditable(true); + final UITextField jT = new UITextField(); + p.add(jT, BorderLayout.SOUTH); + lc.addItemListener(new ItemListener() { + + @Override + public void itemStateChanged(ItemEvent e) { + jT.setText(e.getItem().toString()); + } + }); + p.add(lc, BorderLayout.NORTH); + f.setSize(300, 400); + f.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/LineComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/LineComboBox.java new file mode 100644 index 0000000000..b600390d78 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/LineComboBox.java @@ -0,0 +1,148 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.icombobox; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.geom.GeneralPath; +import java.awt.geom.Line2D; +import java.awt.geom.Point2D; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.JLabel; +import javax.swing.JList; + +import com.fr.base.FRContext; +import com.fr.base.GraphHelper; +import com.fr.base.ScreenResolution; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.icombobox.UIComboBoxRenderer; +import com.fr.general.FRFont; +import com.fr.general.Inter; +import com.fr.stable.Constants; + + +/** + * Combobox for selecting line styles. + */ +public class LineComboBox extends UIComboBox { + /** + * Constructor. + * + * @param lineStyleArray the array of lineStyle. + */ + public LineComboBox(int[] lineStyleArray) { + //copy lineStyle. + Integer[] lineStyleIntegerArray = new Integer[lineStyleArray.length]; + + for (int i = 0; i < lineStyleArray.length; i++) { + lineStyleIntegerArray[i] = new Integer(lineStyleArray[i]); + } + + this.setModel(new DefaultComboBoxModel(lineStyleIntegerArray)); + + this.setRenderer(new LineCellRenderer()); + } + + /** + * Get selected line style. + */ + public int getSelectedLineStyle() { + int style = ((Integer) getSelectedItem()).intValue(); + + return (style < 0) ? Constants.LINE_NONE : style; + } + + /** + * Set the selected line style. + */ + public void setSelectedLineStyle(int style) { + this.setSelectedItem(new Integer(style)); + } + + /** + * CellRenderer. + */ + class LineCellRenderer extends UIComboBoxRenderer { + public Component getListCellRendererComponent( + JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + JLabel comp= (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + this.style = ((Integer) value).intValue(); + comp.setText(null); + return comp; + } + + public void paint(Graphics g) { + super.paint(g); + Graphics2D g2d = (Graphics2D) g; + + Dimension d = getSize(); + g2d.setColor(getForeground()); + + FRFont font = FRContext.getDefaultValues().getFRFont(); + int resolution = ScreenResolution.getScreenResolution(); + Font rfont = font.applyResolutionNP(resolution); + g2d.setFont(rfont); + FontMetrics fm = GraphHelper.getFontMetrics(rfont); + if (style == Constants.LINE_NONE) { + //draw "none" string + GraphHelper.drawString(g2d, Inter.getLocText("None"), 4, (d.height - fm.getHeight()) / 2 + fm.getAscent()); + } else { + GraphHelper.drawLine(g2d, 4, d.height / 2, d.width - 8, d.height / 2, style); + } + + if(isShowAxisWithLineStyle()) { // 带有坐标轴箭头的样式. + drawArrow(g2d, new Point2D.Double(4, d.height / 2), new Point2D.Double(d.width - 8, d.height/2)); + } + } + + private void drawArrow(Graphics2D g2d, Point2D p0, Point2D p1) { + Point2D s = new Point2D.Double(p1.getX() - p0.getX(), p1.getY() - p0.getY()); + Point2D t = new Point2D.Double(); + double d1 = p0.distance(p1); + //d2-d5设定箭头的大小,p1-p2为坐标轴的延长线,p2-p5-p3-p6为箭头4个点的具体位置 + double d2 = 9; + double d3 = 15; + double d4 = 7; + double d5 = 3; + t.setLocation(d2 * s.getX() / d1, d2 * s.getY() / d1); + Point2D p2 = new Point2D.Double(p1.getX() + t.getX(), p1.getY() + t.getY()); + t.setLocation(d3 * s.getX() / d1, d3 * s.getY() / d1); + Point2D p3 = new Point2D.Double(p1.getX() + t.getX(), p1.getY() + t.getY()); + t.setLocation(d4 * s.getX() / d1, d4 * s.getY() / d1); + Point2D p4 = new Point2D.Double(p1.getX() + t.getX(), p1.getY() + t.getY()); + Point2D p5 = new Point2D.Double(p4.getX() + s.getY() / d1 * d5, p4.getY() - s.getX() / d1 * d5); + Point2D p6 = new Point2D.Double(p4.getX() - s.getY() / d1 * d5, p4.getY() + s.getX() / d1 * d5); + + GeneralPath arrow = new GeneralPath(); + arrow.moveTo((float) p2.getX() - 10, (float) p2.getY()); + arrow.lineTo((float) p5.getX() - 10, (float) p5.getY()); + arrow.lineTo((float) p3.getX() - 10, (float) p3.getY()); + arrow.lineTo((float) p6.getX() - 10, (float) p6.getY()); + arrow.closePath(); + + g2d.draw(arrow); + g2d.fill(arrow); + } + + private boolean isShowAxisWithLineStyle() { + return style == Constants.LINE_CHART_MED_ARROW + || style == Constants.LINE_CHART_THICK_ARROW || style == Constants.LINE_CHART_THIN_ARROW; + } + + public Dimension getPreferredSize() { + return new Dimension(60, 16); + } + + public Dimension getMinimumSize() { + return getPreferredSize(); + } + + private int style = Constants.LINE_NONE; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/ParameterComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/ParameterComboBox.java new file mode 100644 index 0000000000..854b54a747 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/ParameterComboBox.java @@ -0,0 +1,87 @@ +package com.fr.design.gui.icombobox; + +import java.awt.Component; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.JList; + +import com.fr.base.Parameter; +import com.fr.design.DesignModelAdapter; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.general.ComparatorUtils; + +public class ParameterComboBox extends UIComboBox { + + public ParameterComboBox() { + this.initComponents(); + } + + private void initComponents() { + //render + this.setRenderer(new DefaultListCellRenderer() { + public Component getListCellRendererComponent(JList list, + Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value instanceof com.fr.base.Parameter) { + this.setText(((Parameter) value).toString()); + } + + return this; + } + }); + + //update parameter items + updateParaItems(); + } + + /** + * Update the parameter items of the comboBox + */ + public void updateParaItems() { + //model + DesignModelAdapter designModel = DesignModelAdapter.getCurrentModelAdapter(); + + this.removeAllItems(); + if (designModel != null) { + Parameter[] paras = designModel.getParameters(); + List paraNameList = new ArrayList(); + for (int i = 0; i < paras.length; i++) { + String paraName = paras[i].getName(); + if (!paraNameList.contains(paraName)) { + paraNameList.add(paraName); + this.addItem(paras[i]); + } + + } + } + } + + + @Override + public Parameter getSelectedItem() { + if (super.getSelectedItem() instanceof Parameter) { + return (Parameter) super.getSelectedItem(); + } else if (super.getSelectedItem() instanceof String && ((String) super.getSelectedItem()).startsWith("$")) { + return new Parameter(((String) super.getSelectedItem()).substring(1)); + } + return new Parameter(); + } + + public void setSelectedParameter(Parameter parameter) { + if (parameter == null) { + return; + } + for (int i = 0; i < this.getItemCount(); i++) { + if (ComparatorUtils.equals(((Parameter) this.getItemAt(i)).getName(), parameter.getName())) { + this.setSelectedIndex(i); + return; + } + } + //august:加入itemlist里面没有,应该加进去,不然就不显示了 + this.addItem(parameter); + this.setSelectedItem(parameter); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/SortOrderComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/SortOrderComboBox.java new file mode 100644 index 0000000000..55b09e7751 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/SortOrderComboBox.java @@ -0,0 +1,73 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.icombobox; + +import java.awt.Component; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.JList; + +import com.fr.data.util.SortOrder; +import com.fr.general.Inter; + +/** + * Sort order combo box. + */ +public class SortOrderComboBox extends UIComboBox { + /** + * Constructor. + */ + public SortOrderComboBox() { + this(SortOrderComboBox.SortOrderArray); + } + + /** + * Constructor. + */ + public SortOrderComboBox(SortOrder[] sortOrderArray) { + this.setModel(new DefaultComboBoxModel(sortOrderArray)); + this.setRenderer(sortOrderCellRenderer); + } + + /** + * Return selected SortOrder. + */ + public SortOrder getSortOrder() { + return (SortOrder) this.getSelectedItem(); + } + + /** + * Set selected SortOrder. + */ + public void setSortOrder(SortOrder sortOrder) { + this.setSelectedItem(sortOrder); + } + + UIComboBoxRenderer sortOrderCellRenderer = new UIComboBoxRenderer() { + public Component getListCellRendererComponent(JList list, + Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value instanceof SortOrder) { + SortOrder sortOrder = (SortOrder) value; + + if (sortOrder.getOrder() == SortOrder.ASC) { + this.setText(Inter.getLocText("Sort-Ascending")); + } else if (sortOrder.getOrder() == SortOrder.DESC) { + this.setText(Inter.getLocText("Sort-Descending")); + } else if (sortOrder.getOrder() == SortOrder.ORIGINAL) { + this.setText(Inter.getLocText("Sort-Original")); + } + } + + return this; + } + }; + + private static SortOrder[] SortOrderArray = new SortOrder[]{ + new SortOrder(SortOrder.ASC), + new SortOrder(SortOrder.DESC), + new SortOrder(SortOrder.ORIGINAL) + }; +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/icombobox/TextFontComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/TextFontComboBox.java similarity index 100% rename from designer_base/src/com/fr/design/gui/icombobox/TextFontComboBox.java rename to designer-base/src/com/fr/design/gui/icombobox/TextFontComboBox.java diff --git a/designer-base/src/com/fr/design/gui/icombobox/TreeComboBoxUI.java b/designer-base/src/com/fr/design/gui/icombobox/TreeComboBoxUI.java new file mode 100644 index 0000000000..d4c03a9b72 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/TreeComboBoxUI.java @@ -0,0 +1,95 @@ +package com.fr.design.gui.icombobox; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +import javax.swing.JComponent; +import javax.swing.plaf.basic.BasicComboBoxUI; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.stable.Constants; + +/** + * + * @author zhou + * @since 2012-5-9下午4:33:07 + */ +public class TreeComboBoxUI extends BasicComboBoxUI implements MouseListener { + + private boolean isRollover = false; + + public TreeComboBoxUI() { + super(); + } + + @Override + protected UIButton createArrowButton() { + arrowButton = new UIButton(UIConstants.ARROW_DOWN_ICON); + ((UIButton) arrowButton).setRoundBorder(true, Constants.LEFT); + arrowButton.addMouseListener(this); + comboBox.addMouseListener(this); + return (UIButton) arrowButton; + } + + public void paint(Graphics g, JComponent c) { + super.paint(g, c); + Graphics2D g2d = (Graphics2D)g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + Color linecolor = null; + if (comboBox.isPopupVisible()) { + linecolor = UIConstants.LINE_COLOR; + arrowButton.setSelected(true); + } else if (isRollover) { + linecolor = UIConstants.LIGHT_BLUE; + } else { + linecolor = UIConstants.LINE_COLOR; + arrowButton.setSelected(false); + } + g2d.setColor(linecolor); + if (!comboBox.isPopupVisible()) { + g2d.drawRoundRect(0, 0, c.getWidth() - arrowButton.getWidth() + 3, c.getHeight() - 1, UIConstants.LARGEARC, UIConstants.LARGEARC); + } else { + g2d.drawRoundRect(0, 0, c.getWidth() , c.getHeight() + 3, UIConstants.LARGEARC, UIConstants.LARGEARC ); + g2d.drawLine(0, c.getHeight()-1, c.getWidth(), c.getHeight()-1); + } + } + + + + private void setRollover(boolean isRollover) { + if (this.isRollover != isRollover) { + this.isRollover = isRollover; + comboBox.repaint(); + } + } + + @Override + public void mouseEntered(MouseEvent e) { + setRollover(true); + } + + @Override + public void mouseExited(MouseEvent e) { + setRollover(false); + } + + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/UIBasicComboBoxEditor.java b/designer-base/src/com/fr/design/gui/icombobox/UIBasicComboBoxEditor.java new file mode 100644 index 0000000000..cbeacbf4e7 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/UIBasicComboBoxEditor.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.icombobox; + +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.DrawRoutines; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.metal.MetalComboBoxEditor; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-18 + * Time: 上午11:04 + */ +public class UIBasicComboBoxEditor extends MetalComboBoxEditor { + + public UIBasicComboBoxEditor() { + super(); + + editor = new JTextField("", 9) { + // workaround for 4530952 + public void setText(String s) { + if (ComparatorUtils.equals(getText(),s)) { + return; + } + + super.setText(s); + } + }; + + editor.setBorder(new EditorBorder()); + } + + class EditorBorder extends AbstractBorder { + + /** + * @see javax.swing.border.Border#getBorderInsets(java.awt.Component) + */ + public Insets getBorderInsets(Component c) { + // Note: I just adjusted insets until + // editable and non-editable combo boxes look equal + return new Insets( + 1, + ThemeUtils.COMBO_INSETS.left + 1, + 1, + 0); + } + + /** + * @see javax.swing.border.Border#paintBorder(java.awt.Component, java.awt.Graphics, int, int, int, int) + */ + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + JComponent combo = (JComponent) editor.getParent(); + + if (combo.getBorder() == null) { + return; + } + drawXpBorder(c, g, x, y, w, h); + + } + } + + private void drawXpBorder(Component c, Graphics g, int x, int y, int w, int h) { + // paint border background - next parent is combo box + Color bg = c.getParent().getParent().getBackground(); + g.setColor(bg); + g.drawLine(x, y, x + w - 1, y); // top + g.drawLine(x, y, x, y + h - 1); // left + g.drawLine(x, y + h - 1, x + w - 1, y + h - 1); // bottom + + if (!c.isEnabled()) { + DrawRoutines.drawEditableComboBorder( + g, ThemeUtils.COMBO_BORDER_DISABLED_COLOR, 0, 0, w, h); + } else { + DrawRoutines.drawEditableComboBorder( + g, ThemeUtils.COMBO_BORDER_COLOR, 0, 0, w, h); + } + } + + + /** + * A subclass of BasicComboBoxEditor that implements UIResource. + * BasicComboBoxEditor doesn't implement UIResource + * directly so that applications can safely override the + * cellRenderer property with BasicListCellRenderer subclasses. + *

+ * Warning: + * Serialized objects of this class will not be compatible with + * future Swing releases. The current serialization support is + * appropriate for short term storage or RMI between applications running + * the same version of Swing. As of 1.4, support for long term storage + * of all JavaBeansTM + * has been added to the java.beans package. + * Please see {@link java.beans.XMLEncoder}. + */ + public static class UIResource extends UIBasicComboBoxEditor + implements javax.swing.plaf.UIResource { + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/UIBasicComboBoxUI.java b/designer-base/src/com/fr/design/gui/icombobox/UIBasicComboBoxUI.java new file mode 100644 index 0000000000..e661e71979 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/UIBasicComboBoxUI.java @@ -0,0 +1,347 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.icombobox; + +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicComboBoxUI; +import javax.swing.plaf.basic.BasicComboPopup; +import javax.swing.plaf.basic.ComboPopup; +import javax.swing.plaf.metal.MetalComboBoxIcon; +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-18 + * Time: 上午10:57 + */ +public class UIBasicComboBoxUI extends BasicComboBoxUI { + private static final int VALUE100=100; + + // Flag for calculating the display size + protected boolean isDisplaySizeDirty = true; + + // Cached the size that the display needs to render the largest item + protected Dimension cachedDisplaySize = new Dimension(0, 0); + + /** + * 创建UI + * + * @param c 组件 + * @return 组件UI + */ + public static ComponentUI createUI(JComponent c) { + return new UIBasicComboBoxUI(); + } + + public void paint(Graphics g, JComponent c) { + } + + protected ComboBoxEditor createEditor() { + return new UIBasicComboBoxEditor.UIResource(); + } + + protected ComboPopup createPopup() { + return new MetalComboPopup(comboBox); + } + + protected JButton createArrowButton() { + JButton button = new UIComboBoxButton(comboBox, + new MetalComboBoxIcon(), + comboBox.isEditable(), + currentValuePane, + listBox); + + button.setMargin(new Insets(0, 0, 0, 0)); + button.putClientProperty("isComboBoxButton", Boolean.TRUE); + + return button; + } + + protected void installComponents() { + super.installComponents(); + + if (arrowButton != null) { + arrowButton.setFocusable(false); + } + } + + /** + * 创建监听 + * + * @return 返回创建的监听 + */ + public PropertyChangeListener createPropertyChangeListener() { + return new TinyPropertyChangeListener(); + } + + /** + * This inner class is marked "public" due to a compiler bug. + * This class should be treated as a "protected" inner class. + * Instantiate it only within subclasses of . + */ + public class TinyPropertyChangeListener extends BasicComboBoxUI.PropertyChangeHandler { + /** + * 属性改变 + * + * @param e 属性改变事件 + */ + public void propertyChange(PropertyChangeEvent e) { + super.propertyChange(e); + String propertyName = e.getPropertyName(); + if (ComparatorUtils.equals(propertyName, "editable")) { + UIComboBoxButton button = (UIComboBoxButton) arrowButton; + button.setIconOnly(comboBox.isEditable()); + isMinimumSizeDirty = true; + isDisplaySizeDirty = true; + comboBox.revalidate(); + } else if (ComparatorUtils.equals(propertyName, "background")) { + Color color = (Color) e.getNewValue(); + listBox.setBackground(color); + } else if (ComparatorUtils.equals(propertyName, "foreground")) { + Color color = (Color) e.getNewValue(); + listBox.setForeground(color); + } + } + } + + /** + * As of Java 2 platform v1.4 this method is no longer used. Do not call or + * override. All the functionality of this method is in the + * MetalPropertyChangeListener. + * + * @deprecated As of Java 2 platform v1.4. + */ + protected void editablePropertyChanged(PropertyChangeEvent e) { + } + + protected LayoutManager createLayoutManager() { + return new TinyComboBoxLayoutManager(); + } + + /** + * This inner class is marked "public" due to a compiler bug. + * This class should be treated as a "protected" inner class. + * Instantiate it only within subclasses of . + */ + public class TinyComboBoxLayoutManager implements LayoutManager { + /** + * 增加布局组件 + * @param name 名字 + * @param comp 组件 + */ + public void addLayoutComponent(String name, Component comp) { + } + + /** + * 去除布局组件 + * @param comp 组件 + */ + public void removeLayoutComponent(Component comp) { + } + + /** + * 最佳布局大小 + * @param parent 容器 + * @return 大小 + */ + public Dimension preferredLayoutSize(Container parent) { + JComboBox cb = (JComboBox) parent; + return parent.getPreferredSize(); + } + + /** + * 最小布局大小 + * @param parent 容器 + * @return 大小 + */ + public Dimension minimumLayoutSize(Container parent) { + JComboBox cb = (JComboBox) parent; + return parent.getMinimumSize(); + } + + /** + * 布局容器 + * @param parent 容器 + */ + public void layoutContainer(Container parent) { + JComboBox cb = (JComboBox) parent; + int width = cb.getWidth(); + int height = cb.getHeight(); + + Rectangle cvb; + + if (comboBox.isEditable()) { + if (arrowButton != null) { + arrowButton.setBounds(width - + ThemeUtils.COMBOBUTTTON_WIDTH, 0, + ThemeUtils.COMBOBUTTTON_WIDTH, height); + } + if (editor != null) { + cvb = rectangleForCurrentValue2(); + editor.setBounds(cvb); + } + } else { + arrowButton.setBounds(0, 0, width, height); + } + } + } + + protected Rectangle rectangleForCurrentValue2() { + int width = comboBox.getWidth(); + int height = comboBox.getHeight(); + Insets insets = getInsets(); + int buttonSize = height - (insets.top + insets.bottom); + + if (arrowButton != null) { + buttonSize = ThemeUtils.COMBOBUTTTON_WIDTH; + } + if (comboBox.getComponentOrientation().isLeftToRight()) { + return new Rectangle(insets.left, + insets.top, + width - (insets.left + insets.right + buttonSize), + height - (insets.top + insets.bottom)); + } else { + return new Rectangle( + insets.left + buttonSize, + insets.top, + width - (insets.left + insets.right + buttonSize), + height - (insets.top + insets.bottom)); + } + } + + /** + * As of Java 2 platform v1.4 this method is no + * longer used. + * + * @deprecated As of Java 2 platform v1.4. + */ + protected void removeListeners() { + if (propertyChangeListener != null) { + comboBox.removePropertyChangeListener(propertyChangeListener); + } + } + + + /** + * @param c the combo box + */ + public Dimension getMinimumSize(JComponent c) { + if (!isMinimumSizeDirty) { + isDisplaySizeDirty = true; // 1.3 + return new Dimension(cachedMinimumSize); + } + + // changed in 1.3 + Insets insets = ThemeUtils.COMBO_INSETS; + Dimension size = getDisplaySize(); + size.width += ThemeUtils.COMBOBUTTTON_WIDTH; + size.width += insets.left + insets.right; + size.height += insets.top + insets.bottom; + + cachedMinimumSize.setSize(size.width, size.height); + isMinimumSizeDirty = false; + + return new Dimension(cachedMinimumSize); + } + + /** + * Copied from BasicComboBoxUI, because isDisplaySizeDirty was declared private!? + * Returns the calculated size of the display area. The display area is the + * portion of the combo box in which the selected item is displayed. This + * method will use the prototype display value if it has been set. + *

+ * For combo boxes with a non trivial number of items, it is recommended to + * use a prototype display value to significantly speed up the display + * size calculation. + * + * @return the size of the display area calculated from the combo box items + * @see javax.swing.JComboBox#setPrototypeDisplayValue + */ + protected Dimension getDisplaySize() { + if (!isDisplaySizeDirty) { + return new Dimension(cachedDisplaySize); + } + Dimension result = new Dimension(); + ListCellRenderer renderer = comboBox.getRenderer(); + if (renderer == null) { + renderer = new DefaultListCellRenderer(); + } + Object prototypeValue = comboBox.getPrototypeDisplayValue(); + if (prototypeValue != null) { + // Calculates the dimension based on the prototype value + result = getSizeForComponent(renderer.getListCellRendererComponent( + listBox, prototypeValue, -1, false, false)); + } else { + // Calculate the dimension by iterating over all the elements in the combo + // box list. + ComboBoxModel model = comboBox.getModel(); + int modelSize = model.getSize(); + Dimension d; + Component cpn; + if (modelSize > 0) { + for (int i = 0; i < modelSize; i++) { + // Calculates the maximum height and width based on the largest + // element + d = getSizeForComponent(renderer.getListCellRendererComponent( + listBox, model.getElementAt(i), -1, false, false)); + result.width = Math.max(result.width, d.width); + result.height = Math.max(result.height, d.height); + } + } else { + result = getDefaultSize(); + + if (comboBox.isEditable()) { + result.width = VALUE100; + } + } + } + if (comboBox.isEditable()) { + Dimension d = editor.getPreferredSize(); + result.width = Math.max(result.width, d.width); + result.height = Math.max(result.height, d.height); + } + // Set the cached value + cachedDisplaySize.setSize(result.width, result.height); + isDisplaySizeDirty = false; + return result; + } + + /* + * Copied from BasicComboBoxUI. + */ + public Dimension getSizeForComponent(Component comp) { + currentValuePane.add(comp); + comp.setFont(comboBox.getFont()); + Dimension d = comp.getPreferredSize(); + currentValuePane.remove(comp); + return d; + } + + /** + * This inner class is marked "public" due to a compiler bug. + * This class should be treated as a "protected" inner class. + * Instantiate it only within subclasses of . + *

+ * This class is now obsolete and doesn't do anything and + * is only included for backwards API compatibility. Do not call or + * override. + * + * @deprecated As of Java 2 platform v1.4. + */ + public class MetalComboPopup extends BasicComboPopup { + + public MetalComboPopup(JComboBox cBox) { + super(cBox); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/UIComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/UIComboBox.java new file mode 100644 index 0000000000..f9ce6b78fb --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/UIComboBox.java @@ -0,0 +1,214 @@ +package com.fr.design.gui.icombobox; + +import com.fr.design.event.GlobalNameListener; +import com.fr.design.event.GlobalNameObserver; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.*; +import javax.swing.plaf.ComboBoxUI; +import javax.swing.plaf.basic.ComboPopup; +import java.awt.*; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.Vector; + +/** + * august:非常beautiful的ComboBox,不支持编辑状态. 内容过长时,鼠标移动过去会有ToolTips,不会有横向滚动条 + * 假如支持编辑,因为UIComboBox的TextField 的绘制 并不是靠Renderer来控制 , + * 它会通过paintCurrentValueBackground()来绘制背景, + * 然后通过paintCurrentValue(),去绘制UIComboBox里显示的值。所考虑情况比现在复杂多多多多多了,所以暂时不支持 + * 另外,项的内容最好不要有图标 + * + * @author zhou + * @since 2012-5-9下午3:18:58 + */ +public class UIComboBox extends JComboBox implements UIObserver, GlobalNameObserver { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private static final int SIZE = 20; + + private static final int SIZE5 = 5; + + protected UIObserverListener uiObserverListener; + + private String comboBoxName = ""; + + private GlobalNameListener globalNameListener = null; + + public UIComboBox() { + super(); + init(); + } + + public UIComboBox(ComboBoxModel model) { + super(model); + init(); + } + + public UIComboBox(Object[] items) { + super(items); + init(); + } + + public UIComboBox(Vector items) { + super(items); + init(); + } + + private void init() { + setOpaque(false); + setUI(getUIComboBoxUI()); + setRenderer(new UIComboBoxRenderer()); + setEditor(new UIComboBoxEditor()); + initListener(); + } + + 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) { + uiObserverListener.doChange(); + } + } + }); + } + } + + protected void fireSetGlobalName() { + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(comboBoxName); + } + } + + + protected ComboBoxUI getUIComboBoxUI() { + return new UIComboBoxUI(); + } + + /** + * 只允许设置为UIComboBoxRenderer,所以要继承UIComboBoxRenderer + */ + @Override + public void setRenderer(ListCellRenderer aRenderer) { + if (aRenderer instanceof UIComboBoxRenderer) { + super.setRenderer(aRenderer); + } else { + //throw new IllegalArgumentException("Must be UIComboBoxRenderer"); + } + } + + protected ComboPopup createPopup() { + return null; + } + + public void setGlobalName(String name) { + comboBoxName = name; + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width + SIZE5, SIZE);//加5的原因在于:render里,每一个项前面了空了一格,要多几像素 + } + + /** + * 鼠标进入事件 + */ + public void mouseEnterEvent() { + + } + + /** + * 鼠标离开事件 + */ + public void mouseExitEvent() { + + } + + /** + * + */ + public void updateUI() { + setUI(getUIComboBoxUI()); + } + + + /** + * + * @param listener 观察者监听事件 + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } + + public void removeChangeListener(){ + uiObserverListener = null; + } + + public UIObserverListener getUiObserverListener(){ + return uiObserverListener; + } + + /** + * @return + */ + public boolean shouldResponseChangeListener() { + return true; + } + + /** + * + * @param listener 观察者监听事件 + */ + public void registerNameListener(GlobalNameListener listener) { + globalNameListener = listener; + } + + /** + * + * @return + */ + public boolean shouldResponseNameListener() { + return true; + } + + + /** + * @param args + */ + public static void main(String... args) { + LayoutManager layoutManager = null; + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(layoutManager); + UIComboBox bb = new UIComboBox(new String[]{"", "jerry", "kunsnat", "richer"}); + bb.setEditable(true); + bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); + content.add(bb); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxButton.java b/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxButton.java new file mode 100644 index 0000000000..a5ebf7b56b --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxButton.java @@ -0,0 +1,278 @@ +package com.fr.design.gui.icombobox; + +import com.fr.design.gui.UILookAndFeel; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-13 + * Time: 上午11:23 + */ +public class UIComboBoxButton extends JButton { + + protected JComboBox comboBox; + protected JList listBox; + protected CellRendererPane rendererPane; + protected Icon comboIcon; + protected boolean iconOnly = false; + private static BufferedImage focusImg; + + public final JComboBox getComboBox() { + return comboBox; + } + + public final void setComboBox(JComboBox cb) { + comboBox = cb; + } + + public final Icon getComboIcon() { + return comboIcon; + } + + public final void setComboIcon(Icon i) { + comboIcon = i; + } + + + public final void setIconOnly(boolean isIconOnly) { + iconOnly = isIconOnly; + } + + UIComboBoxButton() { + super(""); + + DefaultButtonModel model = new DefaultButtonModel() { + public void setArmed(boolean armed) { + armed = isPressed() ? true : armed; + super.setArmed(armed); + } + }; + + setModel(model); + + // Set the background and foreground to the combobox colors. + setBackground(UIManager.getColor("ComboBox.background")); + setForeground(UIManager.getColor("ComboBox.foreground")); + + if (focusImg == null) { + ImageIcon icon = UILookAndFeel.loadIcon("ComboBoxFocus.png", this); + + if (icon != null) { + focusImg = new BufferedImage(2, 2, BufferedImage.TYPE_INT_RGB); + Graphics g = focusImg.getGraphics(); + icon.paintIcon(this, g, 0, 0); + } + } + } + + public UIComboBoxButton(JComboBox cb, Icon i, + boolean onlyIcon, CellRendererPane pane, JList list) { + this(); + comboBox = cb; + comboIcon = i; + rendererPane = pane; + listBox = list; + setEnabled(comboBox.isEnabled()); + } + + /** + * Mostly taken from the swing sources + * + * @see javax.swing.JComponent#paintComponent(Graphics) + */ + public void paintComponent(Graphics g) { + // Note: border was already painted in TinyButtonBorder + boolean leftToRight = getComponentOrientation().isLeftToRight(); + if (comboBox.isEnabled()) { + if (comboBox.isEditable()) { + g.setColor(ThemeUtils.TEXT_BG_COLOR); + } else { + g.setColor(comboBox.getBackground()); + } + } else { + g.setColor(ThemeUtils.TEXT_DISABLED_BG_COLOR); + } + + g.fillRect(1, 1, getWidth() - 2, getHeight() - 2); + if (getParent() != null && getParent().getParent() != null) { + // paint border background - next parent is combo box + Color bg = getParent().getParent().getBackground(); + g.setColor(bg); + } + g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); + drawArrow(g); + Insets insets = new Insets(ThemeUtils.COMBO_INSETS.top, ThemeUtils.COMBO_INSETS.left, + ThemeUtils.COMBO_INSETS.bottom, 0); + int width = getWidth() - (insets.left + insets.right); + int widthFocus = width; + int height = getHeight() - (insets.top + insets.bottom); + if (height <= 0 || width <= 0) { + return; + } + int left = insets.left; + int top = insets.top; + int right = left + (width - 1); + int bottom = top + (height - 1); + int iconWidth = ThemeUtils.COMBOBUTTTON_WIDTH; + int iconLeft = (leftToRight) ? right : left; + // Let the renderer paint + Component c = null; + boolean mustResetOpaque = false; + boolean savedOpaque = false; + + paintRender(g, c, mustResetOpaque, savedOpaque, leftToRight, width, insets, iconWidth, left, top, height); + if (mustResetOpaque) { + JComponent jc = (JComponent) c; + jc.setOpaque(savedOpaque); + } + } + + private void paintRender(Graphics g, Component c, boolean mustResetOpaque, boolean savedOpaque, boolean leftToRight, + int width, Insets insets, int iconWidth, int left, int top, int height) { + boolean paintFocus = false; + if (!iconOnly && comboBox != null) { + ListCellRenderer renderer = comboBox.getRenderer(); + boolean renderPressed = getModel().isPressed(); + c = renderer.getListCellRendererComponent(listBox, comboBox.getSelectedItem(), -1, renderPressed, false); + c.setFont(rendererPane.getFont()); + calculateColor(c, mustResetOpaque, savedOpaque, paintFocus); + int cWidth = width - (insets.right + iconWidth); + boolean shouldValidate = false; + if (c instanceof JPanel) { + shouldValidate = true; + } + if (leftToRight) { + rendererPane.paintComponent(g, c, this, left, top, cWidth, height, shouldValidate); + } else { + rendererPane.paintComponent(g, c, this, left + iconWidth, top, cWidth, height, shouldValidate); + } + if (paintFocus && ThemeUtils.COMBO_FOCUS) { + g.setColor(Color.black); + Graphics2D g2d = (Graphics2D) g; + Rectangle r = new Rectangle(left, top, 2, 2); + TexturePaint tp = new TexturePaint(focusImg, r); + g2d.setPaint(tp); + g2d.draw(new Rectangle(left, top, cWidth, height)); + } + } + } + + private void calculateColor(Component c, boolean mustResetOpaque, boolean savedOpaque, boolean paintFocus) { + if (model.isArmed() && model.isPressed()) { + if (isOpaque()) { + c.setBackground(UIManager.getColor("Button.select")); + } + c.setForeground(comboBox.getForeground()); + } else if (!comboBox.isEnabled()) { + if (isOpaque()) { + c.setBackground(ThemeUtils.TEXT_DISABLED_BG_COLOR); + } else { + comboBox.setBackground(ThemeUtils.TEXT_DISABLED_BG_COLOR); + } + c.setForeground(UIManager.getColor("ComboBox.disabledForeground")); + } else if (comboBox.hasFocus() && !comboBox.isPopupVisible()) { + if (comboBox.isEditable()) { + c.setForeground(ThemeUtils.MAIN_COLOR); + } else { + c.setForeground(UIManager.getColor("ComboBox.selectionForeground")); + } + c.setBackground(UIManager.getColor("ComboBox.focusBackground")); + if (c instanceof JComponent) { + mustResetOpaque = true; + JComponent jc = (JComponent) c; + savedOpaque = jc.isOpaque(); + jc.setOpaque(true); + paintFocus = true; + } + } else { + c.setForeground(comboBox.getForeground()); + c.setBackground(comboBox.getBackground()); + } + } + + private void drawArrow(Graphics g) { + + Color col = null; + + if (!isEnabled()) { + col = ThemeUtils.COMBOBUTT_DISABLED_COLOR; + } else if (model.isPressed()) { + col = ThemeUtils.COMBOBUTT_PRESSED_COLOR; + } else if (model.isRollover()) { + col = ThemeUtils.COMBOBUTT_ROLLOVER_COLOR; + } else { + col = ThemeUtils.COMBOBUTT_COLOR; + } + + g.setColor(col); + + Rectangle buttonRect = new Rectangle( + getWidth() - ThemeUtils.COMBOBUTTTON_WIDTH, + 1, ThemeUtils.COMBOBUTTTON_WIDTH, getHeight() - 2); + drawXpButton(g, buttonRect, col); + + // draw arrow + if (isEnabled()) { + g.setColor(ThemeUtils.COMBO_ARROW_COLOR); + } else { + g.setColor(ThemeUtils.COMBO_ARROW_DISABLED_COLOR); + } + + drawXpArrow(g, buttonRect); + } + + + private void drawXpButton(Graphics g, Rectangle r, Color c) { + int xs = r.x; + int ys = r.y; + int y2 = r.y + r.height; + + Color a = ThemeUtils.COMBO_BORDER_COLOR; + + Color pressedLightColor = ThemeUtils.PRESSED_LIGHT_COLOR; + Color pressedDarkColor = ThemeUtils.PRESSED_DARK_COLOR; + Color rolloverLightColor = ThemeUtils.ROLLOVER_LIGHT_COLOR; + Color rolloverDarkColor = ThemeUtils.ROLLOVER_DARK_COLOR; + Color normalLightColor = ThemeUtils.NORMAL_LIGHT_COLOR; + Color normalDarkColor = ThemeUtils.NORMAL_DARK_COLOR; + Color lightBorderColor = ThemeUtils.WHITE_BORDER_COLOR; + + Graphics2D g2 = (Graphics2D) g; + GradientPaint scrollBarBg = null; + if (!isEnabled()) { + scrollBarBg = new GradientPaint(xs, ys, normalLightColor, xs, y2, normalDarkColor); + } else if (model.isPressed()) { + scrollBarBg = new GradientPaint(xs, ys, pressedLightColor, xs, y2, pressedDarkColor); + } else if (model.isRollover()) { + scrollBarBg = new GradientPaint(xs, ys, rolloverLightColor, xs, y2, rolloverDarkColor); + } else { + scrollBarBg = new GradientPaint(xs, ys, normalLightColor, xs, y2, normalDarkColor); + } + + GradientPaint scrollBarHight = new GradientPaint(0, 0, new Color(1.0f, 1.0f, 1.0f, 0.5f), 0, 7, new Color(1.0f, 1.0f, 1.0f, 0.2f)); + g2.setPaint(scrollBarBg); + g2.fillRoundRect(xs, ys, r.width, r.height, 3, 3);//画渐变的背景 + g2.setPaint(scrollBarHight); + g2.fillRoundRect(xs, ys, r.width, r.height / 2, 3, 3);//画高光 + g2.setColor(a); + g2.drawLine(xs, ys, xs, y2); + g2.setColor(lightBorderColor); + g2.drawRoundRect(xs + 1, ys, r.width - 3, r.height - 1, 1, 1);//画高光线(内发光,0%阻塞) + + } + + private void drawXpArrow(Graphics g, Rectangle r) { + int x = r.x + (r.width - 8) / 2 - 1; + int y = r.y + (r.height - 6) / 2 + 1; + g.drawLine(x + 1, y + 1, x + 7, y + 1); + g.drawLine(x + 2, y + 2, x + 6, y + 2); + g.drawLine(x + 3, y + 3, x + 5, y + 3); + g.drawLine(x + 4, y + 4, x + 4, y + 4); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxEditor.java b/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxEditor.java new file mode 100644 index 0000000000..e6fef0c27c --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxEditor.java @@ -0,0 +1,88 @@ +package com.fr.design.gui.icombobox; + +import java.awt.Component; +import java.awt.event.ActionListener; +import java.lang.reflect.Method; + +import javax.swing.plaf.basic.BasicComboBoxEditor; + +import com.fr.design.gui.itextfield.UITextField; +import com.fr.general.ComparatorUtils; +import com.fr.stable.Constants; +import com.fr.stable.StringUtils; + +public class UIComboBoxEditor extends BasicComboBoxEditor { + protected UITextField textField; + private Object oldValue; + + public UIComboBoxEditor() { + textField = new UITextField(); + textField.setRectDirection(Constants.RIGHT); + } + + @Override + public Component getEditorComponent() { + return textField; + } + + @Override + public void setItem(Object anObject) { + if (anObject != null) { + + textField.setText(anObject.toString()); + oldValue = anObject; + } else { + textField.setText(StringUtils.EMPTY); + } + + } + + @Override + public Object getItem() { + Object newValue = textField.getText(); + if (oldValue != null && !(oldValue instanceof String)) { + // The original value is not a string. Should return the value in it's + // original type. + if(ComparatorUtils.equals(newValue,oldValue.toString())) { + return oldValue; + } else { + // Must take the value from the textField and get the value and cast it to the new type. + Class cls = oldValue.getClass(); + try { + Method method = cls.getMethod("valueOf", new Class[]{String.class}); + newValue = method.invoke(oldValue, new Object[]{textField.getText()}); + } catch (Exception ex) { + // Fail silently and return the newValue (a String object) + } + } + } + return newValue; + + } + + @Override + /** + * + */ + public void selectAll() { + textField.selectAll(); + textField.requestFocus(); + } + + @Override + /** + * + */ + public void addActionListener(ActionListener l) { + textField.addActionListener(l); + } + + @Override + /** + * + */ + public void removeActionListener(ActionListener l) { + textField.removeActionListener(l); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxRenderer.java b/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxRenderer.java new file mode 100644 index 0000000000..0903070dc0 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxRenderer.java @@ -0,0 +1,42 @@ +package com.fr.design.gui.icombobox; + +import java.awt.Color; +import java.awt.Component; + +import javax.swing.DefaultListCellRenderer; + +import com.fr.design.constants.UIConstants; + +import javax.swing.JList; +import javax.swing.JLabel; + +/** + * + * @author zhou + * @since 2012-5-18上午11:18:30 + */ +public class UIComboBoxRenderer extends DefaultListCellRenderer { + + private static final long serialVersionUID = 1L; + + public UIComboBoxRenderer() { + super(); + } + + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + cellHasFocus = cellHasFocus && !this.isEnabled(); + JLabel renderer =(JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + renderer.setOpaque(true); + list.setSelectionBackground(UIConstants.NORMAL_BLUE); + list.setSelectionForeground(Color.WHITE); + if (isSelected) { + renderer.setForeground(list.getSelectionForeground()); + renderer.setBackground(list.getSelectionBackground()); + } else { + renderer.setForeground(list.getForeground()); + renderer.setBackground(list.getBackground()); + } + renderer.setText(" " + renderer.getText()); + return renderer; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxUI.java b/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxUI.java new file mode 100644 index 0000000000..f15bbc52a0 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/UIComboBoxUI.java @@ -0,0 +1,273 @@ +package com.fr.design.gui.icombobox; + +import com.fr.common.inputevent.InputEventBaseOnOS; +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UIButtonUI; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.utils.gui.GUIPaintUtils; +import com.fr.stable.Constants; +import com.fr.stable.StringUtils; +import sun.swing.DefaultLookup; + +import javax.swing.*; +import javax.swing.plaf.ButtonUI; +import javax.swing.plaf.basic.BasicComboBoxUI; +import javax.swing.plaf.basic.BasicComboPopup; +import javax.swing.plaf.basic.ComboPopup; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + +/** + * @author zhou F + * @since 2012-5-9下午4:33:07 + */ +public class UIComboBoxUI extends BasicComboBoxUI implements MouseListener { + + protected boolean isRollover = false; + + public UIComboBoxUI() { + super(); + } + + + @Override + protected UIButton createArrowButton() { + arrowButton = new UIButton(UIConstants.ARROW_DOWN_ICON) { + public boolean shouldResponseChangeListener() { + return false; + } + + @Override + public ButtonUI getUI() { + return new UIButtonUI() { + @Override + protected boolean isPressed(AbstractButton b) { + return model.isArmed() && model.isPressed(); + } + + @Override + protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { + if (isPressed(b) && b.isPressedPainted()) { + GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), UIConstants.COMBOBOX_BTN_PRESS); + } else if (isRollOver(b)) { + GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.COMBOBOX_BTN_ROLLOVER); + } else if (b.isNormalPainted()) { + GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), UIConstants.COMBOBOX_BTN_NORMAL); + } + } + }; + } + }; + ((UIButton) arrowButton).setRoundBorder(true, Constants.LEFT); + arrowButton.addMouseListener(this); + comboBox.addMouseListener(this); + return (UIButton) arrowButton; + } + + public void paint(Graphics g, JComponent c) { + super.paint(g, c); + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + Color linecolor = UIConstants.POP_DIALOG_BORDER; + + if (comboBox.isPopupVisible()) { + arrowButton.setSelected(true); + } else { + linecolor = UIConstants.POP_DIALOG_BORDER; + arrowButton.setSelected(false); + } + g2d.setColor(linecolor); + if (!comboBox.isPopupVisible()) { + g2d.drawRoundRect(0, 0, c.getWidth() - arrowButton.getWidth() + 3, c.getHeight() - 1, UIConstants.ARC, UIConstants.ARC); + } else { + g2d.drawRoundRect(0, 0, c.getWidth(), c.getHeight() + 3, UIConstants.ARC, UIConstants.ARC); + g2d.drawLine(0, c.getHeight() - 1, c.getWidth(), c.getHeight() - 1); + } + } + + /** + * 覆盖之 + */ + @Override + public void paintCurrentValue(Graphics g, Rectangle bounds, boolean hasFocus) { + paintCurrentValue(g, bounds, hasFocus, 0); + } + + public void paintCurrentValue(Graphics g, Rectangle bounds, boolean hasFocus, int paddingLeft) { + ListCellRenderer renderer = comboBox.getRenderer(); + Component c; + + if (hasFocus && !isPopupVisible(comboBox)) { + c = renderer.getListCellRendererComponent(listBox, + comboBox.getSelectedItem(), + -1, + true, + false); + } else { + c = renderer.getListCellRendererComponent(listBox, + comboBox.getSelectedItem(), + -1, + false, + false); + c.setBackground(UIManager.getColor("ComboBox.background")); + } + c.setFont(comboBox.getFont()); + if (hasFocus && !isPopupVisible(comboBox)) { + if (comboBox.isEnabled()) { + c.setForeground(Color.black); + c.setBackground(Color.WHITE); + } else { + c.setForeground(DefaultLookup.getColor( + comboBox, this, "ComboBox.disabledForeground", comboBox.getForeground())); + c.setBackground(DefaultLookup.getColor( + comboBox, this, "ComboBox.disabledBackground", comboBox.getBackground())); + } + } else { + if (comboBox.isEnabled()) { + c.setForeground(comboBox.getForeground()); + c.setBackground(comboBox.getBackground()); + } else { + c.setForeground(DefaultLookup.getColor( + comboBox, this, "ComboBox.disabledForeground", comboBox.getForeground())); + c.setBackground(DefaultLookup.getColor( + comboBox, this, "ComboBox.disabledBackground", comboBox.getBackground())); + + } + } + + boolean shouldValidate = false; + if (c instanceof JPanel) { + shouldValidate = true; + } + + int x = bounds.x, y = bounds.y, w = bounds.width, h = bounds.height; + + currentValuePane.paintComponent(g, c, comboBox, x + paddingLeft, y, w, h, shouldValidate); + } + + @Override + protected ComboPopup createPopup() { + if (comboBox instanceof UIComboBox) { + if (((UIComboBox) comboBox).createPopup() != null) { + return ((UIComboBox) comboBox).createPopup(); + } + } + return new UIComboPopup(comboBox); + } + + private void setRollover(boolean isRollover) { + if (this.isRollover != isRollover) { + this.isRollover = isRollover; + comboBox.repaint(); + } + } + + @Override + public void mouseEntered(MouseEvent e) { + if (comboBox != null) { + ((UIComboBox) comboBox).mouseEnterEvent(); + arrowButton.getModel().setRollover(true); + setRollover(true); + } + } + + @Override + public void mouseExited(MouseEvent e) { + if (comboBox != null) { + ((UIComboBox) comboBox).mouseExitEvent(); + arrowButton.getModel().setRollover(false); + setRollover(false); + } + } + + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + private class UIComboPopup extends BasicComboPopup { + public UIComboPopup(JComboBox comboBox) { + super(comboBox); + } + + @Override + protected JScrollPane createScroller() { + return new UIScrollPane(list); + } + + // august:重载paintBorder方法 来画出我们想要的边框.. + @Override + public void paintBorder(Graphics g) { + Graphics2D g2 = (Graphics2D) g; + g2.setColor(UIConstants.TITLED_BORDER_COLOR); + g2.drawRoundRect(0, -arrowButton.getHeight(), getWidth() - 1, getHeight() + arrowButton.getHeight() - 1, UIConstants.ARC, UIConstants.ARC); + } + + @Override + public void setVisible(boolean b) { + super.setVisible(b); + if (!b) { + comboBox.repaint(); + } + } + + @Override + protected JList createList() { + return new JList(comboBox.getModel()) { + + @Override + public void processMouseEvent(MouseEvent e) { + if (InputEventBaseOnOS.isControlDown(e)) { + e = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), e.getModifiers() ^ DEFAULT_MODIFIER, e.getX(), e.getY(), e.getClickCount(), + e.isPopupTrigger()); + } + super.processMouseEvent(e); + } + + @Override + public String getToolTipText(MouseEvent event) { + int index = locationToIndex(event.getPoint()); + if (index != -1) { + Object value = getModel().getElementAt(index); + ListCellRenderer renderer = getCellRenderer(); + Component rendererComp = renderer.getListCellRendererComponent(this, value, index, true, false); + if (rendererComp.getPreferredSize().width > getVisibleRect().width) { + String tips = (rendererComp instanceof JComponent) ? ((JComponent) rendererComp).getToolTipText() : null; + if (tips == null && value instanceof String) { + tips = (String) value; + } + return tips; + } else { + return null; + } + } + return null; + } + + @Override + public Point getToolTipLocation(MouseEvent event) { + int index = locationToIndex(event.getPoint()); + if (index != -1 && StringUtils.isNotEmpty(getToolTipText(event))) { + Rectangle cellBounds = getCellBounds(index, index); + return new Point(event.getX(), cellBounds.y + cellBounds.height); + } + return null; + } + }; + } + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/UIDictionaryComboBox.java b/designer-base/src/com/fr/design/gui/icombobox/UIDictionaryComboBox.java new file mode 100644 index 0000000000..688f863e05 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/UIDictionaryComboBox.java @@ -0,0 +1,44 @@ +package com.fr.design.gui.icombobox; + +import javax.swing.*; +import java.awt.*; + +public class UIDictionaryComboBox extends UIComboBox { + private static final long serialVersionUID = -19512646054322609L; + private T[] keys; + private String[] values; + + public UIDictionaryComboBox(T[] keys, String[] displays) { + super(); + this.initComboBox(keys, displays); + } + + private void initComboBox(T[] keys, String[] displays) { + this.keys = keys; + this.values = displays; + this.setModel(new DefaultComboBoxModel(keys)); + this.setRenderer(new UIComboBoxRenderer() { + /** + * + */ + private static final long serialVersionUID = -6497147896537056134L; + + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + for (int i = 0, len = UIDictionaryComboBox.this.keys.length; i < len; i++) { + if (UIDictionaryComboBox.this.keys[i].equals(value)) { + this.setText(" " + UIDictionaryComboBox.this.values[i]); + break; + } + } + return this; + } + }); + } + + @SuppressWarnings("unchecked") + public T getSelectedItem() { + return (T)super.getSelectedItem(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/filter/Filter.java b/designer-base/src/com/fr/design/gui/icombobox/filter/Filter.java new file mode 100644 index 0000000000..1f71980ad8 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/filter/Filter.java @@ -0,0 +1,8 @@ +package com.fr.design.gui.icombobox.filter; + +/** + * Filter used in ComboBox. + */ +public interface Filter { + public boolean accept(String prefix, Object object); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/filter/LastStartWithFilter.java b/designer-base/src/com/fr/design/gui/icombobox/filter/LastStartWithFilter.java new file mode 100644 index 0000000000..08276f9e85 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/filter/LastStartWithFilter.java @@ -0,0 +1,18 @@ +package com.fr.design.gui.icombobox.filter; + + +public class LastStartWithFilter implements Filter { + public boolean accept(String prefix, Object object) { + boolean result = false; + if(prefix == null ){ + result = true; + }else if(object != null ){ + String tempString = object.toString().toLowerCase(); + tempString =tempString.substring(tempString.lastIndexOf("/")+1); + result=tempString.startsWith(prefix.toLowerCase()); + }else { + result = false ; + } + return result; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/filter/StartsWithFilter.java b/designer-base/src/com/fr/design/gui/icombobox/filter/StartsWithFilter.java new file mode 100644 index 0000000000..92df200548 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/filter/StartsWithFilter.java @@ -0,0 +1,11 @@ +package com.fr.design.gui.icombobox.filter; + +/** + * Filter used in ComboBox. + */ +public class StartsWithFilter implements Filter { + public boolean accept(String prefix, Object object) { + return prefix == null || (object != null && object.toString() != null && + object.toString().toLowerCase().startsWith(prefix.toLowerCase())); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeCellRenderer.java b/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeCellRenderer.java new file mode 100644 index 0000000000..1b24c57e7d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeCellRenderer.java @@ -0,0 +1,86 @@ +package com.fr.design.gui.icombobox.icombotree; + +import javax.swing.*; +import javax.swing.plaf.ColorUIResource; +import javax.swing.tree.TreeCellRenderer; +import java.awt.*; + +public class CheckBoxTreeCellRenderer extends JPanel implements TreeCellRenderer +{ + protected JCheckBox check; + protected CheckBoxTreeLabel label; + + public CheckBoxTreeCellRenderer() + { + this.setLayout(null); + this.add(check = new JCheckBox()); + this.add(label = new CheckBoxTreeLabel()); + check.setBackground(UIManager.getColor("Tree.textBackground")); + label.setForeground(UIManager.getColor("Tree.textForeground")); + this.setBackground(UIManager.getColor("Tree.textBackground")); + } + + /** + * 返回的是一个JPanel对象,该对象中包含一个JCheckBox对象 + * 和一个JLabel对象。并且根据每个结点是否被选中来决定JCheckBox + * 是否被选中。 + */ + public Component getTreeCellRendererComponent(JTree tree, Object value, + boolean selected, boolean expanded, boolean leaf, int row, + boolean hasFocus) + { + String stringValue = tree.convertValueToText(value, selected, expanded, leaf, row, hasFocus); + setEnabled(tree.isEnabled()); + check.setSelected(((CheckBoxTreeNode)value).isSelected()); + label.setFont(tree.getFont()); + label.setText(stringValue); + label.setSelected(selected); + label.setFocus(hasFocus); +// if(leaf) +// label.setIcon(UIManager.getIcon("Tree.leafIcon")); +// else if(expanded) +// label.setIcon(UIManager.getIcon("Tree.openIcon")); +// else +// label.setIcon(UIManager.getIcon("Tree.closedIcon")); + + return this; + } + + @Override + public Dimension getPreferredSize() + { + Dimension dCheck = check.getPreferredSize(); + Dimension dLabel = label.getPreferredSize(); + return new Dimension(dCheck.width + dLabel.width, dCheck.height < dLabel.height ? dLabel.height: dCheck.height); + } + + /** + * 重新计算check和label位置 + */ + @Override + public void doLayout() + { + Dimension dCheck = check.getPreferredSize(); + Dimension dLabel = label.getPreferredSize(); + int yCheck = 0; + int yLabel = 0; + int height = dCheck.height < dLabel.height ? dCheck.height:dLabel.height; +// if(dCheck.height < dLabel.height) +// yCheck = (dLabel.height - dCheck.height) / 2; +// else +// yLabel = (dCheck.height - dLabel.height) / 2; + check.setLocation(0, yCheck); + check.setBounds(0, yCheck, dCheck.width, height); + label.setLocation(dCheck.width, yLabel); + label.setBounds(dCheck.width, yLabel, dLabel.width, height); + } + + @Override + public void setBackground(Color color) + { + if(color instanceof ColorUIResource){ + color = null; + } + super.setBackground(color); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeLabel.java b/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeLabel.java new file mode 100644 index 0000000000..b7ec813087 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeLabel.java @@ -0,0 +1,73 @@ +package com.fr.design.gui.icombobox.icombotree; + +import javax.swing.*; +import javax.swing.plaf.ColorUIResource; +import java.awt.*; + +public class CheckBoxTreeLabel extends JLabel +{ + private boolean isSelected; + private boolean hasFocus; + + public CheckBoxTreeLabel() + { + } + + @Override + public void setBackground(Color color) + { + if(color instanceof ColorUIResource){ + color = null; + } + super.setBackground(color); + } + + @Override + public void paint(Graphics g) + { + String str; + if((str = getText()) != null) + { + if(0 < str.length()) + { +// if(isSelected) +// g.setColor(UIManager.getColor("Tree.selectionBackground")); +// else + g.setColor(UIManager.getColor("Tree.textBackground")); + Dimension d = getPreferredSize(); + int imageOffset = 0; + Icon currentIcon = getIcon(); + if(currentIcon != null){ + imageOffset = currentIcon.getIconWidth() + Math.max(0, getIconTextGap() - 1); + } + g.fillRect(imageOffset, 0, d.width - 1 - imageOffset, d.height); + if(hasFocus) + { + g.setColor(UIManager.getColor("Tree.selectionBorderColor")); + g.drawRect(imageOffset, 0, d.width - 1 - imageOffset, d.height - 1); + } + } + } + super.paint(g); + } + + @Override + public Dimension getPreferredSize() + { + Dimension retDimension = super.getPreferredSize(); + if(retDimension != null){ + retDimension = new Dimension(retDimension.width + 3, retDimension.height); + } + return retDimension; + } + + public void setSelected(boolean isSelected) + { + this.isSelected = isSelected; + } + + public void setFocus(boolean hasFocus) + { + this.hasFocus = hasFocus; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNode.java b/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNode.java new file mode 100644 index 0000000000..0061937ca0 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNode.java @@ -0,0 +1,88 @@ +package com.fr.design.gui.icombobox.icombotree; + +import javax.swing.tree.DefaultMutableTreeNode; + +public class CheckBoxTreeNode extends DefaultMutableTreeNode +{ + protected boolean isSelected; + + public CheckBoxTreeNode() + { + this(null); + } + + public CheckBoxTreeNode(Object userObject) + { + this(userObject, true, false); + } + + public CheckBoxTreeNode(Object userObject, boolean allowsChildren, boolean isSelected) + { + super(userObject, allowsChildren); + this.isSelected = isSelected; + } + + /** + * 节点是否被选中 + * @return 节点是否被选中 + */ + public boolean isSelected() + { + return isSelected; + } + + /** + * 选择节点 + * @param _isSelected 节点是否被选中 + */ + public void setSelected(boolean _isSelected){ + this.isSelected = _isSelected; + if(_isSelected){ // 如果选中,则将其所有的子结点都选中 + if(children != null){ + for(Object obj : children){ + CheckBoxTreeNode node = (CheckBoxTreeNode)obj; + if(_isSelected != node.isSelected()){ + node.setSelected(_isSelected); + } + } + } + CheckBoxTreeNode pNode = (CheckBoxTreeNode)parent; // 向上检查,如果父结点的所有子结点都被选中,那么将父结点也选中 + if(pNode != null){ // 开始检查pNode的所有子节点是否都被选中 + int index = 0; + for(; index < pNode.children.size(); ++ index){ + CheckBoxTreeNode pChildNode = (CheckBoxTreeNode)pNode.children.get(index); + if(!pChildNode.isSelected()){ + break; + } + } + if(index == pNode.children.size()){ // 表明pNode所有子结点都已经选中,则选中父结点,该方法是一个递归方法,因此在此不需要进行迭代,因为当选中父结点后,父结点本身会向上检查的。 + if(pNode.isSelected() != _isSelected){ + pNode.setSelected(_isSelected); + } + } + } + }else{ //如果是取消父结点导致子结点取消,那么此时所有的子结点都应该是选择上的; 否则就是子结点取消导致父结点取消,然后父结点取消导致需要取消子结点,但是这时候是不需要取消子结点的。 + if(children != null){ + int index = 0; + for(; index < children.size(); ++ index){ + CheckBoxTreeNode childNode = (CheckBoxTreeNode)children.get(index); + if(!childNode.isSelected()){ + break; + } + } + if(index == children.size()){ // 从上向下取消的时候 + for(int i = 0; i < children.size(); ++ i){ + CheckBoxTreeNode node = (CheckBoxTreeNode)children.get(i); + if(node.isSelected() != _isSelected){ + node.setSelected(_isSelected); + } + } + } + } + CheckBoxTreeNode pNode = (CheckBoxTreeNode)parent; // 向上取消,只要存在一个子节点不是选上的,那么父节点就不应该被选上。 + if(pNode != null && pNode.isSelected() != _isSelected){ + pNode.setSelected(_isSelected); + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNodeSelectionListener.java b/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNodeSelectionListener.java new file mode 100644 index 0000000000..2908630b75 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icombobox/icombotree/CheckBoxTreeNodeSelectionListener.java @@ -0,0 +1,65 @@ +package com.fr.design.gui.icombobox.icombotree; + +import javax.swing.*; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; + +public class CheckBoxTreeNodeSelectionListener extends MouseAdapter +{ + private ArrayList treePathList = new ArrayList(); + + /** + * 鼠标点击事件 + * @param event 事件 + */ + @Override + public void mouseClicked(MouseEvent event) + { + JTree tree = (JTree)event.getSource(); + int x = event.getX(); + int y = event.getY(); + int row = tree.getRowForLocation(x, y); + TreePath treePath = tree.getPathForRow(row); + if(treePath != null) + { + tree.setExpandsSelectedPaths(true); + CheckBoxTreeNode node = (CheckBoxTreeNode)treePath.getLastPathComponent(); + if(node != null) + { + boolean isSelected = !node.isSelected(); + node.setSelected(isSelected); + ((DefaultTreeModel)tree.getModel()).nodeStructureChanged(node); + } + }else{ + tree.setExpandsSelectedPaths(false); + } + CheckBoxTreeNode root = (CheckBoxTreeNode) tree.getModel().getRoot(); + treePathList.clear(); + addPathList(tree,root); + selectTreeItem(tree,treePathList); + } + + private void addPathList(JTree tree,CheckBoxTreeNode root){ + for(int i = 0;i< root.getChildCount();i++){ + CheckBoxTreeNode treeNode = (CheckBoxTreeNode) root.getChildAt(i); + if(treeNode.isLeaf() && treeNode.isSelected()){ + DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); + treePathList.add(new TreePath(model.getPathToRoot(treeNode))); + }else{ + addPathList(tree,treeNode); + } + } + } + + private void selectTreeItem(JTree tree,ArrayList treePath) { + TreePath[] treePaths = new TreePath[treePath.size()]; + for(int i = 0;i < treePath.size();i++){ + treePaths[i] = treePath.get(i); + } + tree.setSelectionPaths(treePaths); + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/com/fr/design/gui/icontainer/UIEastResizableContainer.java similarity index 100% rename from designer_base/src/com/fr/design/gui/icontainer/UIEastResizableContainer.java rename to designer-base/src/com/fr/design/gui/icontainer/UIEastResizableContainer.java diff --git a/designer-base/src/com/fr/design/gui/icontainer/UIModeControlContainer.java b/designer-base/src/com/fr/design/gui/icontainer/UIModeControlContainer.java new file mode 100644 index 0000000000..4cd9ec11cf --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icontainer/UIModeControlContainer.java @@ -0,0 +1,458 @@ +package com.fr.design.gui.icontainer; + +import com.fr.base.BaseUtils; +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.DesignerContext; +import com.fr.general.Inter; +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionListener; + +public class UIModeControlContainer extends JLayeredPane { + private static int DIM_HEIGHT = 30; + private static final int NUM32 = 32; + private static final int NUM5 = 5; + private JComponent upPane; + private JComponent downPane; + private JPanel horizontToolPane; + + private CoverPane coverPane; + private HidePane hidePane; + private AuthoritySheetInvisibleCoverPane sheetInvisibleCoverPane; + + private int toolPaneY = 300; + private int sheetCorverGap = 33; + private int toolPaneHeight = 10; + private boolean upEditMode = false; + private boolean isHideMode = false; + private boolean isSheeetCovered = false; + + private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 30 / 100.0F); + + public UIModeControlContainer() { + this(new JPanel(), new JPanel()); + } + + public UIModeControlContainer(JComponent up, JComponent down) { + upPane = up; + downPane = down; + setLayout(containerLayout); + initToolbar(); + sheetInvisibleCoverPane = new AuthoritySheetInvisibleCoverPane(); + + if (upPane == null) { + toolPaneY = 0; + } else { + toolPaneY = upPane.getPreferredSize().height; + add(upPane); + add(horizontToolPane); + } + add(downPane); + add(coverPane = new CoverPane()); + add(hidePane = new HidePane()); + if (upPane != null) { + setLayer(upPane, 1); + setLayer(horizontToolPane, 2); + } + setLayer(downPane, 1); + setLayer(coverPane, 3); + setLayer(hidePane, 2); + } + + + public void setSheeetCovered(boolean isSheetCovered) { + this.isSheeetCovered = isSheetCovered; + } + + + public void needToShowCoverAndHidPane() { + if (BaseUtils.isAuthorityEditing()) { + this.remove(coverPane); + this.remove(hidePane); + } else { + this.remove(sheetInvisibleCoverPane); + this.add(coverPane); + this.add(hidePane); + setLayer(coverPane, 3); + setLayer(hidePane, 2); + } + } + + + public void setDownPane(JComponent downPane) { + this.downPane = downPane; + } + + protected void onResize(int distance) { + + } + + private void initToolbar() { + horizontToolPane = new JPanel() { + @Override + public void paint(Graphics g) { + g.drawImage(UIConstants.DRAG_BAR, 0, 0, getWidth(), getHeight(), null); + if (upEditMode) { + g.drawImage(UIConstants.DRAG_DOT, (getWidth() - toolPaneHeight) / 2, 3, toolPaneHeight, 5, null); + } + } + }; + + horizontToolPane.addMouseListener(mouseAdapter); + + horizontToolPane.addMouseMotionListener(mouseMotionListener); + } + + MouseAdapter mouseAdapter = new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + if (isHideMode || !upEditMode) { + return; + } + if (BaseUtils.isAuthorityEditing()) { + return; + } + setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); + } + + @Override + public void mouseExited(MouseEvent e) { + if (isHideMode || !upEditMode) { + return; + } + setCursor(Cursor.getDefaultCursor()); + } + + @Override + public void mouseReleased(MouseEvent e) { + refreshContainer(); + } + }; + + MouseMotionListener mouseMotionListener = new MouseMotionListener() { + @Override + public void mouseMoved(MouseEvent e) { + } + + @Override + public void mouseDragged(MouseEvent e) { + if (BaseUtils.isAuthorityEditing()) { + return; + } + boolean notUpEditMode = isHideMode || !upEditMode; + if (notUpEditMode) { + return; + } + // 拖动的距离,为正值表示往下拖动,为负值表示往上拖动 + int deltaY = e.getY(); + toolPaneY += deltaY; + onResize(toolPaneY); + refreshContainer(); + } + }; + + private LayoutManager containerLayout = new LayoutManager() { + + @Override + public void removeLayoutComponent(Component comp) { + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + synchronized (parent.getTreeLock()) { + return parent.getSize(); + } + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + @Override + public void layoutContainer(Container parent) { + if (toolPaneY < 0) { + toolPaneY = 0; + setUpPaneHeight(0); + } + + if (BaseUtils.isAuthorityEditing() && isSheeetCovered) { + sheetInvisibleCoverPane.setBounds(0, toolPaneY + toolPaneHeight + UIConstants.SIZE, getWidth(), getHeight() - toolPaneY - toolPaneHeight - sheetCorverGap); + UIModeControlContainer.this.add(sheetInvisibleCoverPane); + UIModeControlContainer.this.setLayer(sheetInvisibleCoverPane, 2); + sheetInvisibleCoverPane.setVisible(true); + } else { + sheetInvisibleCoverPane.setVisible(false); + UIModeControlContainer.this.remove(sheetInvisibleCoverPane); + } + + if (isHideMode) { + hidePane.setVisible(true); + coverPane.setVisible(false); + hidePane.setBounds(0, 0, parent.getWidth(), hidePane.getPreferredSize().height); + if (upPane != null) { + upPane.setVisible(false); + horizontToolPane.setBounds(0, hidePane.getPreferredSize().height, parent.getWidth(), toolPaneHeight); + } + downPane.setBounds(0, hidePane.getPreferredSize().height + toolPaneHeight, parent.getWidth(), parent.getHeight() - hidePane.getPreferredSize().height - toolPaneHeight); + } else { + hidePane.setVisible(false); + coverPane.setVisible(true); + if (upPane != null) { + upPane.setVisible(true); + upPane.setBounds(0, 0, parent.getWidth(), toolPaneY + UIConstants.SIZE); + horizontToolPane.setBounds(0, toolPaneY + UIConstants.SIZE, parent.getWidth(), toolPaneHeight); + } + downPane.setBounds(0, toolPaneY + toolPaneHeight + UIConstants.SIZE, parent.getWidth(), parent.getHeight() - toolPaneY - toolPaneHeight - UIConstants.SIZE); + if (upEditMode) { + coverPane.setBounds(0, toolPaneY + toolPaneHeight + UIConstants.SIZE, getWidth(), getHeight() - toolPaneY - toolPaneHeight); + } else { + coverPane.setBounds(0, 0, getWidth(), toolPaneY + UIConstants.SIZE); + } + } + } + + @Override + public void addLayoutComponent(String name, Component comp) { + } + }; + + protected void onModeChanged() { + + } + + /** + * @return + */ + public boolean isUpEditMode() { + return upEditMode; + } + + private void setEditMode() { + this.upEditMode = !upEditMode; + onModeChanged(); + } + + public void setAuthorityMode(boolean isUpMode) { + this.upEditMode = isUpMode; + } + + public void setUpPaneHeight(int height) { + this.toolPaneY = height; + refreshContainer(); + } + + /** + * + */ + public void refreshContainer() { + validate(); + repaint(); + revalidate(); + } + + private class HidePane extends JPanel { + public HidePane() { + setLayout(new FlowLayout(FlowLayout.CENTER, 10, -3)); + setBackground(UIConstants.NORMAL_BACKGROUND); + add(new UILabel("" + Inter.getLocText(new String[]{"Parameter", "Panel"}) + "")); + UIButton viewButton = new UIButton(UIConstants.VIEW_NORMAL_ICON, UIConstants.VIEW_PRESSED_ICON, UIConstants.VIEW_PRESSED_ICON) { + @Override + public Dimension getPreferredSize() { + return new Dimension(32, 32); + } + }; + viewButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + isHideMode = false; + refreshContainer(); + } + }); + add(viewButton); + } + + @Override + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height = DIM_HEIGHT; + return dim; + } + } + + + private class AuthoritySheetInvisibleCoverPane extends JPanel { + public AuthoritySheetInvisibleCoverPane() { + setLayout(invisibleCoverLayout); + setBackground(null); + setOpaque(false); + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + + } + }); + } + + + private LayoutManager invisibleCoverLayout = 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) { + } + + @Override + public void addLayoutComponent(String name, Component comp) { + } + }; + + @Override + public void paint(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + Composite oldComposite = g2d.getComposite(); + g2d.setComposite(composite); + g2d.setColor(Color.BLACK); + g2d.fillRect(0, 0, getWidth(), getHeight()); + g2d.setComposite(oldComposite); + super.paint(g); + } + + + } + + private class CoverPane extends JPanel { + UIButton editButton; + UIButton hideButton; + + public CoverPane() { + setLayout(coverLayout); + setBackground(null); + setOpaque(false); + + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + + } + }); + + editButton = new UIButton(UIConstants.EDIT_NORMAL_ICON, UIConstants.EDIT_PRESSED_ICON, UIConstants.EDIT_PRESSED_ICON) { + @Override + public Dimension getPreferredSize() { + return new Dimension(40, 40); + } + }; + hideButton = new UIButton(UIConstants.HIDE_NORMAL_ICON, UIConstants.HIDE_PRESSED_ICON, UIConstants.HIDE_PRESSED_ICON) { + @Override + public Dimension getPreferredSize() { + return new Dimension(40, 40); + } + }; + editButton.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + setEditMode(); + refreshContainer(); + DesignerContext.getDesignerFrame().getContentFrame().repaint(); + } + }); + + hideButton.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + isHideMode = true; + refreshContainer(); + } + }); + + add(editButton); + add(hideButton); + } + + private LayoutManager coverLayout = 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.getWidth(); + int height = parent.getHeight() + NUM32; + int preferWidth = editButton.getPreferredSize().width; + int preferHeight = editButton.getPreferredSize().height; + if (upEditMode) { + hideButton.setVisible(false); + editButton.setBounds((width - preferWidth) / 2, 84, preferWidth, preferHeight); + } else { + hideButton.setVisible(true); + hideButton.setBounds(width / 2 - preferWidth - NUM5, height / 2 - preferHeight + 3, preferWidth, preferWidth); + editButton.setBounds(width / 2 + NUM5, height / 2 - preferHeight + 3, preferWidth, preferWidth); + } + } + + @Override + public void addLayoutComponent(String name, Component comp) { + } + }; + + @Override + public void paint(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + Composite oldComposite = g2d.getComposite(); + g2d.setComposite(composite); + g2d.setColor(Color.BLACK); + g2d.fillRect(0, 0, getWidth(), getHeight()); + g2d.setComposite(oldComposite); + super.paint(g); + } + } + + /** + * @param args + */ + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(new BorderLayout()); + UIModeControlContainer bb = new UIModeControlContainer(); + content.add(bb, BorderLayout.CENTER); + GUICoreUtils.centerWindow(jf); + jf.setSize(500, 500); + jf.setVisible(true); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icontainer/UIResizableContainer.java b/designer-base/src/com/fr/design/gui/icontainer/UIResizableContainer.java new file mode 100644 index 0000000000..09d95f8434 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icontainer/UIResizableContainer.java @@ -0,0 +1,547 @@ +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.stable.Constants; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.stable.collections.utils.MathUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionListener; + +public class UIResizableContainer extends JPanel { + private static final long serialVersionUID = 1854340560790476907L; + private static final int MAX_PARA_HEIGHT = 240; + private int containerWidth = 240; + private int preferredWidth = 240; + private int toolPaneY = 300; + private int toolPaneHeight = 10; + private int bottomHeight = 30; + + 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; + + private static final int ARROW_MARGIN = 15; + private static final int ARROW_MARGIN_VERTICAL = 7; + private static final int ARROW_RANGE = 35; + private static final int ARROW_RANGE_VERTICAL = 25; + + private boolean isLeftRightDragEnabled = true; + private boolean isDownPaneVisible = true ; + private int paraHeight; + + public UIResizableContainer(int direction) { + this(new JPanel(), new JPanel(), direction); + } + + /** + * 设置是否允许拖拽 + * + * @param isEnabled + */ + public void setVerticalDragEnabled(boolean isEnabled) { + isLeftRightDragEnabled = isEnabled; + } + + /** + * 设置面板宽度 + * + * @param width + */ + public void setContainerWidth(int width) { + this.containerWidth = width; + this.preferredWidth = width; + } + + + public void setDownPaneVisible(boolean isVisible){ + this.isDownPaneVisible = isVisible; + } + + private void setPreferredWidth(int width) { + this.preferredWidth = width; + } + + public UIResizableContainer(JComponent upPane, JComponent downPane, int direction) { + setBackground(UIConstants.NORMAL_BACKGROUND); + + this.upPane = upPane; + this.direction = direction; + this.downPane = downPane; + + this.horizontToolPane = new HorizotalToolPane(); + this.verticalToolPane = new VerticalToolPane(); + + setLayout(containerLayout); + add(upPane); + add(horizontToolPane); + add(downPane); + add(verticalToolPane); + } + + public UIResizableContainer(JComponent upPane, int direction) { + setBackground(UIConstants.NORMAL_BACKGROUND); + + this.upPane = upPane; + this.direction = direction; + + this.horizontToolPane = new HorizotalToolPane(); + setLayout(containerLayout); + add(upPane); + add(horizontToolPane); + + } + + public void setDownPane(JComponent downPane) { + if (this.downPane != null){ + return; + } + this.verticalToolPane = new VerticalToolPane(); + this.downPane = downPane; + add(downPane); + add(verticalToolPane); + } + + /** + * 将面板设置成最佳的宽度 + */ + public void setWindow2PreferWidth() { + if (containerWidth == toolPaneHeight) { + containerWidth = preferredWidth; + refreshContainer(); + } + } + + /** + * 获取参数面板高度 + */ + public int getParameterPaneHeight() { + + return paraHeight; + + } + + /** + * 设置参数面板高度 + * + * @param height + */ + public void setParameterHeight(int height) { + paraHeight = hasParameterPane? Math.min(height, MAX_PARA_HEIGHT) : 0; + refreshContainer(); + + } + + /** + * 得到上下子面板的高度 + * + * @return + */ + public int getToolPaneY() { + return this.toolPaneY; + } + + /** + * 设置关闭设计器前最后一次上下子面板的高度 + * + * @param toolPaneY + */ + public void setLastToolPaneY(int toolPaneY) { + this.toolPaneY = toolPaneY; + } + + /** + * 得到容器的宽度 + * + * @return + */ + public int getContainerWidth() { + return this.containerWidth; + } + + /** + * 设置关闭设计器前最后一次面板的宽度 + * + * @param containerWidth + */ + public void setLastContainerWidth(int containerWidth) { + this.containerWidth = containerWidth; + } + + private LayoutManager containerLayout = new LayoutManager() { + + @Override + public void removeLayoutComponent(Component comp) { + // TODO Auto-generated method stub + + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + return parent.getPreferredSize(); + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return null; + } + + @Override + public void layoutContainer(Container parent) { + if (verticalToolPane == null || downPane == null) { + return; + } + + if (direction == Constants.RIGHT) { + 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 - bottomHeight); + verticalToolPane.setBounds(containerWidth - toolPaneHeight, 0, toolPaneHeight, getHeight()); + }else{ + upPane.setBounds(0, 0, containerWidth - toolPaneHeight, getHeight()); + verticalToolPane.setBounds(containerWidth - toolPaneHeight, 0, toolPaneHeight, getHeight()); + } + } else if (direction == Constants.LEFT) { + if(isDownPaneVisible){ + if (toolPaneY > getHeight() - toolPaneHeight - getParameterPaneHeight()) { + toolPaneY = getHeight() - toolPaneHeight - getParameterPaneHeight(); + } + 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 { + parameterPane.setBounds(20, 0, 230, getParameterPaneHeight()); + upPane.setBounds(toolPaneHeight, getParameterPaneHeight(), containerWidth - toolPaneHeight, getHeight() - getParameterPaneHeight()); + verticalToolPane.setBounds(0, 0, toolPaneHeight, getHeight()); + } + } + } + + @Override + public void addLayoutComponent(String name, Component comp) { + } + }; + + @Override + /** + * 得到最佳大小 + */ + public Dimension getPreferredSize() { + return new Dimension(containerWidth, 400); + } + + /** + * 替换上子面板 + * + * @param pane 面板 + */ + public void replaceUpPane(JComponent pane) { + remove(pane); + remove(this.upPane); + add(this.upPane = pane); + refreshContainer(); + } + + + /** + * 替换下子面板 + * + * @param pane 面板 + */ + public void replaceDownPane(JComponent pane) { + remove(pane); + remove(this.downPane); + add(this.downPane = pane); + refreshContainer(); + } + + public void addParameterPane(JComponent pane) { + add(this.parameterPane = pane); + hasParameterPane = true; + refreshContainer(); + } + + public void removeParameterPane() { + remove(this.parameterPane); + setParameterHeight(0); + hasParameterPane = false; + refreshContainer(); + + } + + /** + * 得到上子面板 + * + * @return + */ + public JComponent getUpPane() { + return this.upPane; + } + + /** + * 得到下子面板 + * + * @return + */ + public JComponent getDownPane() { + return this.downPane; + } + + /** + * 得到参数面板 + * + * @return + */ + public JComponent getParameterPane() { + return this.parameterPane; + } + + /** + * 刷新下面板 + */ + public void refreshDownPane() { + + } + + private void refreshContainer() { + validate(); + repaint(); + revalidate(); + } + + + private class HorizotalToolPane extends JPanel { + private int upModel = UIConstants.MODEL_NORMAL; + private int downModel = UIConstants.MODEL_NORMAL; + + public HorizotalToolPane() { + super(); + addMouseMotionListener(new MouseMotionListener() { + + @Override + public void mouseMoved(MouseEvent e) { + if (e.getX() <= ARROW_RANGE) { + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + upModel = UIConstants.MODEL_PRESS; + } else if (e.getX() >= getWidth() - ARROW_RANGE) { + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + downModel = UIConstants.MODEL_PRESS; + } else { + resetModel(); + setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); + } + repaint(); + } + + @Override + 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 - getParameterPaneHeight() : toolPaneY - getParameterPaneHeight(); + refreshContainer(); + } + }); + + addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR)); + } + + @Override + public void mouseExited(MouseEvent e) { + setCursor(Cursor.getDefaultCursor()); + resetModel(); + repaint(); + } + + @Override + public void mouseClicked(MouseEvent e) { + if (e.getX() <= ARROW_RANGE) { + toolPaneY = 0; + } else if (e.getX() >= getWidth() - ARROW_RANGE) { + toolPaneY = UIResizableContainer.this.getHeight() - toolPaneHeight - getParameterPaneHeight(); + } else { + return; + } + refreshContainer(); + } + }); + } + + private void resetModel() { + upModel = UIConstants.MODEL_NORMAL; + downModel = UIConstants.MODEL_NORMAL; + } + + @Override + public void paint(Graphics g) { + Image upButton = (upModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_UP_NORMAL : UIConstants.DRAG_UP_PRESS); + Image downButton = (downModel == UIConstants.MODEL_NORMAL ? UIConstants.DRAG_DOWN_NORMAL : UIConstants.DRAG_DOWN_PRESS); + + g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, getWidth(), getHeight(), null); + g.drawImage(UIConstants.DRAG_LINE, (getWidth() - toolPaneHeight) / 2, 3, toolPaneHeight, 5, null); + g.drawImage(upButton, ARROW_MARGIN, 3, toolPaneHeight, 5, null); + g.drawImage(downButton, getWidth() - toolPaneHeight - ARROW_MARGIN, 3, toolPaneHeight, 5, null); + } + } + + private class VerticalToolPane extends JPanel { + private int model = UIConstants.MODEL_NORMAL; + + public VerticalToolPane() { + super(); + addMouseMotionListener(new MouseMotionListener() { + + @Override + public void mouseMoved(MouseEvent e) { + if (e.getY() <= ARROW_RANGE_VERTICAL) { + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + model = UIConstants.MODEL_PRESS; + } else if (isLeftRightDragEnabled) { + setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); + } + repaint(); + } + + @Override + public void mouseDragged(MouseEvent e) { + if (!isLeftRightDragEnabled) { + return; + } + upPane.setVisible(true); + downPane.setVisible(true); + if (direction == Constants.RIGHT) { + containerWidth = e.getXOnScreen() - UIResizableContainer.this.getLocationOnScreen().x; + } else if (direction == Constants.LEFT) { + containerWidth = UIResizableContainer.this.getWidth() + (UIResizableContainer.this.getLocationOnScreen().x - e.getXOnScreen()); + } + + containerWidth = containerWidth > MAX_WIDTH ? MAX_WIDTH : containerWidth; + containerWidth = containerWidth < MIN_WIDTH ? MIN_WIDTH : containerWidth; + if (containerWidth < MIN_WIDTH) { + upPane.setVisible(false); + downPane.setVisible(false); + containerWidth = toolPaneHeight; + } + refreshContainer(); + if (BaseUtils.isAuthorityEditing()) { + DesignerContext.getDesignerFrame().doResize(); + } + + + } + }); + addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + if (!isLeftRightDragEnabled) { + return; + } + setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); + } + + @Override + public void mouseExited(MouseEvent e) { + setCursor(Cursor.getDefaultCursor()); + model = UIConstants.MODEL_NORMAL; + repaint(); + } + + @Override + public void mouseClicked(MouseEvent e) { + if (e.getY() <= ARROW_RANGE_VERTICAL) { + if (containerWidth == toolPaneHeight) { + containerWidth = preferredWidth; + } else { + setPreferredWidth(containerWidth); + containerWidth = toolPaneHeight; + } + refreshContainer(); + if (BaseUtils.isAuthorityEditing()) { + DesignerContext.getDesignerFrame().doResize(); + } + } + } + }); + } + + @Override + public void paint(Graphics g) { + Image button; + if (direction == Constants.RIGHT) { + g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); + if (containerWidth == toolPaneHeight) { + if (model == UIConstants.MODEL_NORMAL) { + button = UIConstants.DRAG_RIGHT_NORMAL; + } else { + button = UIConstants.DRAG_RIGHT_PRESS; + } + } else { + if (model == UIConstants.MODEL_NORMAL) { + button = UIConstants.DRAG_LEFT_NORMAL; + } else { + button = UIConstants.DRAG_LEFT_PRESS; + } + } + g.drawImage(button, 3, ARROW_MARGIN_VERTICAL, 5, toolPaneHeight, null); + } else { + g.drawImage(UIConstants.DRAG_BAR_LIGHT, 0, 0, toolPaneHeight, getHeight(), null); + if (containerWidth == toolPaneHeight) { + if (model == UIConstants.MODEL_NORMAL) { + button = UIConstants.DRAG_LEFT_NORMAL; + } else { + button = UIConstants.DRAG_LEFT_PRESS; + } + } else { + if (model == UIConstants.MODEL_NORMAL) { + button = UIConstants.DRAG_RIGHT_NORMAL; + } else { + button = UIConstants.DRAG_RIGHT_PRESS; + } + } + g.drawImage(button, 2, ARROW_MARGIN_VERTICAL, 5, toolPaneHeight, null); + } + if (isLeftRightDragEnabled) { + g.drawImage(UIConstants.DRAG_DOT_VERTICAL, 2, getHeight() / 2, 5, toolPaneHeight, null); + } + } + } + + /** + * 主函数 + * @param args 参数 + */ + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(new BorderLayout()); + UIResizableContainer bb = new UIResizableContainer(Constants.RIGHT); + JPanel cc = new JPanel(); + cc.setBackground(Color.blue); + content.add(bb, BorderLayout.EAST); + content.add(cc, BorderLayout.CENTER); + GUICoreUtils.centerWindow(jf); + jf.setSize(500, 500); + jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icontainer/UIScrollPane.java b/designer-base/src/com/fr/design/gui/icontainer/UIScrollPane.java new file mode 100644 index 0000000000..a14c10f3c4 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icontainer/UIScrollPane.java @@ -0,0 +1,49 @@ +package com.fr.design.gui.icontainer; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.iscrollbar.UIScrollBar; + +import javax.swing.*; +import java.awt.*; + +/** + * @author zhou + * @since 2012-5-9下午4:39:33 + */ +public class UIScrollPane extends JScrollPane { + + private static final long serialVersionUID = 1L; + private static final int INCREAMENT = 30; + + public UIScrollPane(Component c) { + super(c, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + this.setHorizontalScrollBar(createHorizontalScrollBar()); + this.getVerticalScrollBar().setUnitIncrement(INCREAMENT); + this.getVerticalScrollBar().setBlockIncrement(INCREAMENT); + this.getHorizontalScrollBar().setOpaque(true); + this.getHorizontalScrollBar().setBackground(Color.WHITE); + this.getVerticalScrollBar().setOpaque(true); + this.getVerticalScrollBar().setBackground(Color.WHITE); + } + + @Override + /** + * 生成水平滚动条 + */ + public UIScrollBar createHorizontalScrollBar() { + UIScrollBar sbr = new UIScrollBar(JScrollBar.HORIZONTAL); + sbr.setBackground(UIConstants.NORMAL_BACKGROUND); + return sbr; + } + + @Override + /** + * 生成垂直滚动条 + */ + public UIScrollBar createVerticalScrollBar() { + UIScrollBar sbr = new UIScrollBar(JScrollBar.VERTICAL); + sbr.setBackground(UIConstants.NORMAL_BACKGROUND); + return sbr; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icontainer/UIScrollPaneBorder.java b/designer-base/src/com/fr/design/gui/icontainer/UIScrollPaneBorder.java new file mode 100644 index 0000000000..37dd608870 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icontainer/UIScrollPaneBorder.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.icontainer; + +import com.fr.design.utils.ThemeUtils; + +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.UIResource; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-5 + * Time: 下午2:25 + */ +public class UIScrollPaneBorder extends AbstractBorder implements UIResource { + + private static final Insets DEFAULT_INSETS = new Insets(1, 1, 1, 1); + + public Insets getBorderInsets(Component c) { + return DEFAULT_INSETS; + } + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + g.setColor(ThemeUtils.SCROLL_PANE_BORDER_COLOR); + g.drawRect(x, y, w - 1, h - 1); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icontainer/UIScrollPaneUI.java b/designer-base/src/com/fr/design/gui/icontainer/UIScrollPaneUI.java new file mode 100644 index 0000000000..a7e72629ec --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icontainer/UIScrollPaneUI.java @@ -0,0 +1,58 @@ +package com.fr.design.gui.icontainer; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.metal.MetalScrollBarUI; +import javax.swing.plaf.metal.MetalScrollPaneUI; +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-13 + * Time: 上午10:07 + */ +public class UIScrollPaneUI extends MetalScrollPaneUI implements PropertyChangeListener { + + /** + * 创建UI + * @param c 组件 + * @return 组件UI + */ + public static ComponentUI createUI(JComponent c) { + return new UIScrollPaneUI(); + } + + /** + * 为组件初始化UI + * @param c 组件 + */ + public void installUI(JComponent c) { + super.installUI(c); + + // Note: It never happened before Java 1.5 that scrollbar is null + JScrollBar sb = scrollpane.getHorizontalScrollBar(); + if (sb != null) { + sb.putClientProperty(MetalScrollBarUI.FREE_STANDING_PROP, Boolean.FALSE); + } + + sb = scrollpane.getVerticalScrollBar(); + if (sb != null) { + sb.putClientProperty(MetalScrollBarUI.FREE_STANDING_PROP, Boolean.FALSE); + } + } + + protected PropertyChangeListener createScrollBarSwapListener() { + return this; + } + + /** + * 属性改变的方法 + * @param e 事件 + */ + public void propertyChange(PropertyChangeEvent e) { + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/icontainer/UITableScrollPaneBorder.java b/designer-base/src/com/fr/design/gui/icontainer/UITableScrollPaneBorder.java new file mode 100644 index 0000000000..ebbeb58333 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/icontainer/UITableScrollPaneBorder.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.icontainer; + +import com.fr.design.utils.ThemeUtils; + +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.UIResource; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-6 + * Time: 上午11:28 + */ +public class UITableScrollPaneBorder extends AbstractBorder implements UIResource { + + private static final Insets INSETS = new Insets(1, 1, 1, 1); + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + g.setColor(ThemeUtils.TABLE_BORDER_LIGHT_COLOR); + g.drawLine(x + w - 1, y, x + w - 1, y + h - 1); // right + g.drawLine(x, y + h - 1, x + w - 1, y + h - 1); // bottom + + g.setColor(ThemeUtils.TABLE_BORDER_DARK_COLOR); + g.drawLine(x, y, x, y + h - 1); // left + g.drawLine(x, y, x + w - 1, y); // top + } + + public Insets getBorderInsets(Component c) { + return INSETS; + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/icontainer/UIVerticalScrollPane.java b/designer-base/src/com/fr/design/gui/icontainer/UIVerticalScrollPane.java similarity index 100% rename from designer_base/src/com/fr/design/gui/icontainer/UIVerticalScrollPane.java rename to designer-base/src/com/fr/design/gui/icontainer/UIVerticalScrollPane.java diff --git a/designer-base/src/com/fr/design/gui/ilable/ActionLabel.java b/designer-base/src/com/fr/design/gui/ilable/ActionLabel.java new file mode 100644 index 0000000000..432628f0fa --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilable/ActionLabel.java @@ -0,0 +1,87 @@ +package com.fr.design.gui.ilable; + +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Graphics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; + +import com.fr.design.gui.ilable.UILabel; +import javax.swing.event.MouseInputAdapter; + +/** + * Action label + */ +public class ActionLabel extends UILabel { + private ActionListener actionListener; + + public ActionLabel(String text) { + super(text); + + this.setForeground(Color.blue); + this.addMouseListener(mouseInputAdapter); + this.addMouseMotionListener(mouseInputAdapter); + } + + public void addActionListener(ActionListener actionListener) { + this.actionListener = actionListener; + } + + /** + * Repaints the text. + */ + public void paintComponent(Graphics _gfx) { + super.paintComponent(_gfx); + + _gfx.setColor(Color.blue); + _gfx.drawLine(0, this.getHeight() - 1, this.getWidth(), this.getHeight() - 1); + } + + private MouseInputAdapter mouseInputAdapter = new MouseInputAdapter() { + public void mouseClicked(MouseEvent e) { + } + + public void mousePressed(MouseEvent e) { + } + + public void mouseReleased(MouseEvent evt) { + Object source = evt.getSource(); + + if (source instanceof UILabel) { + //Action. + if (actionListener != null) { + ActionEvent actionEvent = new ActionEvent(source, 99, ""); + actionListener.actionPerformed(actionEvent); + } + } + } + + public void mouseEntered(MouseEvent evt) { + Object source = evt.getSource(); + + if (source instanceof UILabel) { + ((UILabel) source).setCursor(new Cursor(Cursor.HAND_CURSOR)); + } + } + + public void mouseExited(MouseEvent evt) { + Object source = evt.getSource(); + + if (source instanceof UILabel) { + ((UILabel) source).setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); + } + } + + public void mouseDragged(MouseEvent e) { + } + + public void mouseMoved(MouseEvent evt) { + Object source = evt.getSource(); + + if (source instanceof UILabel) { + ((UILabel) source).setCursor(new Cursor(Cursor.HAND_CURSOR)); + } + } + }; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilable/BoldFontTextLabel.java b/designer-base/src/com/fr/design/gui/ilable/BoldFontTextLabel.java new file mode 100644 index 0000000000..2b17f7156f --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilable/BoldFontTextLabel.java @@ -0,0 +1,36 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.ilable; + +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; + +import com.fr.design.gui.ilable.UILabel; + +public class BoldFontTextLabel extends UILabel { + public BoldFontTextLabel() { + this(""); + } + + public BoldFontTextLabel(String text) { + super(text); + } + + public BoldFontTextLabel(String text,int horizontalAlignment) { + super(text,horizontalAlignment); + } + + public Dimension getPreferredSize() { + Font font = this.getFont(); + FontMetrics fm = this.getFontMetrics(font); + + if (font.isBold()) { + return new Dimension(fm.stringWidth(this.getText()), + super.getPreferredSize().height); + } else { + return super.getPreferredSize(); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilable/FRExplainLabel.java b/designer-base/src/com/fr/design/gui/ilable/FRExplainLabel.java new file mode 100644 index 0000000000..d0c5f4a496 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilable/FRExplainLabel.java @@ -0,0 +1,24 @@ +package com.fr.design.gui.ilable; + +import java.awt.Color; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import com.fr.design.gui.ilable.UILabel; + +public class FRExplainLabel extends UILabel { + + private static final long serialVersionUID = 1L; + + private Icon icon = new ImageIcon("/com/fr/design/images/warnings/warning3.png"); + + public FRExplainLabel(String string){ + super(string, UILabel.CENTER); + init(); + } + + private void init(){ + setIcon(icon); + setForeground(new Color(255, 0, 0)); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilable/MultilineLabel.java b/designer-base/src/com/fr/design/gui/ilable/MultilineLabel.java new file mode 100644 index 0000000000..bb890447fa --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilable/MultilineLabel.java @@ -0,0 +1,75 @@ +/* + * @(#)MultilineLabel.java + * + * Copyright 2002 JIDE Software. All rights reserved. + */ +package com.fr.design.gui.ilable; + +import java.awt.Dimension; +import java.awt.Rectangle; + +import javax.swing.LookAndFeel; +import javax.swing.text.DefaultCaret; + +import com.fr.design.gui.itextarea.UITextArea; + +/** + * Normal UILabel cannot have multiple lines. If you want to multiple + * label, you can use this class. + */ +public class MultilineLabel extends UITextArea { + public MultilineLabel() { + initComponents(); + } + + public MultilineLabel(String s) { + super(s); + initComponents(); + } + + private void initComponents() { + adjustUI(); + } + + /** + * Reloads the pluggable UI. The key used to fetch the + * new interface is getUIClassID(). The type of + * the UI is TextUI. invalidate + * is called after setting the UI. + */ + + public void updateUI() { + super.updateUI(); + adjustUI(); + } + + /** + * Adjusts UI to make sure it looks like a label instead of a text area. + */ + protected void adjustUI() { + setLineWrap(true); + setWrapStyleWord(true); + setEditable(false); + setRequestFocusEnabled(false); + setFocusable(false); + setOpaque(false); + setCaret(new DefaultCaret() { + protected void adjustVisibility(Rectangle nloc) { + } + }); + + LookAndFeel.installBorder(this, "Label.border"); + LookAndFeel.installColorsAndFont(this, "Label.background", "Label.foreground", "Label.font"); + } + + /** + * Overrides getMinimumSize to return getPreferredSize() instead. + * We did this because of a bug at http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4824261. + * + * @return the preferred size as minimum size. + */ + + public Dimension getMinimumSize() { + return getPreferredSize(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilable/UILabel.java b/designer-base/src/com/fr/design/gui/ilable/UILabel.java new file mode 100644 index 0000000000..f90dbea0d7 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilable/UILabel.java @@ -0,0 +1,66 @@ +package com.fr.design.gui.ilable; + +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.*; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : Richer + * Version: 6.5.6 + * Date: 13-1-23 + * Time: 下午3:15 + */ +public class UILabel extends JLabel { + + public UILabel(String text, Icon image, int horizontalAlignment) { + super(text, image, horizontalAlignment); + if (image != null && text != null) { + setIconTextGap(4); + } + } + + public UILabel(String text, int horizontalAlignment) { + super(text, horizontalAlignment); + } + + public UILabel(String text) { + super(text); + } + + public UILabel(String text, boolean enable) { + super(text); + this.setEnabled(enable); + } + + public UILabel(Icon image, int horizontalAlignment) { + super(image, horizontalAlignment); + } + + public UILabel(Icon image) { + super(image); + } + + public UILabel() { + super(); + } + + + public static void main(String[] args) { +// UILabel label = new UILabel("shishi",SwingConstants.LEFT); + JFrame frame = new JFrame("Test"); + UILabel label = new UILabel("HELLO"); + frame.setSize(new Dimension(300, 400)); + JPanel panel = (JPanel) frame.getContentPane(); + panel.setLayout(new BorderLayout()); + label.setBackground(Color.GREEN); + panel.add(label, BorderLayout.CENTER); + GUICoreUtils.centerWindow(frame); + frame.setVisible(true); + + + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilist/ArrayListModel.java b/designer-base/src/com/fr/design/gui/ilist/ArrayListModel.java new file mode 100644 index 0000000000..5c4a5eaeae --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilist/ArrayListModel.java @@ -0,0 +1,24 @@ +package com.fr.design.gui.ilist; + +import javax.swing.AbstractListModel; + +public class ArrayListModel extends AbstractListModel { + private Object[] array; + + public ArrayListModel() { + + } + + public ArrayListModel(Object[] array) { + this.array = array; + } + + public Object getElementAt(int index) { + return array != null ? array[index] : null; + } + + public int getSize() { + return array == null ? 0 : array.length; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilist/CheckBoxList.java b/designer-base/src/com/fr/design/gui/ilist/CheckBoxList.java new file mode 100644 index 0000000000..66c697bd89 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilist/CheckBoxList.java @@ -0,0 +1,300 @@ +package com.fr.design.gui.ilist; + +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.awt.event.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EventListener; +import java.util.List; + +/** + * CheckBoxs + JList. + */ +public class CheckBoxList extends JComponent { + private final static int X_COORDINATE = 20; + + /** + * 选择状态----全选和全不选 + * + * @editor zhou + * @since 2012-4-1下午2:39:10 + */ + public static enum SelectedState { + ALL, NONE + } + + private boolean[] selects; + private JList jlist; + private UICheckBox chooseAll; + + public CheckBoxList(Object[] items) { + this(items, SelectedState.NONE, StringUtils.EMPTY); + } + + public CheckBoxList(Object[] items, String name) { + this(items, SelectedState.NONE, name); + } + + /** + * Class constructor. + * + * @param items Items with which to populate the list. + * @param state default state, true or false + */ + public CheckBoxList(Object[] items, SelectedState state, String name) { + jlist = new BOXLIST(items); + jlist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + this.selects = new boolean[items.length]; + boolean default_state = (state == SelectedState.ALL); + Arrays.fill(this.selects, default_state); + + jlist.setCellRenderer(new CheckListCellRenderer()); + jlist.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + doCheck(); + } + + public void mouseReleased(MouseEvent e) { + doCheck(); + } + }); + jlist.addKeyListener(new KeyAdapter() { + + @Override + public void keyTyped(KeyEvent e) { + if (e.getKeyChar() == ' ') { + doCheck(); + } + } + + }); + this.setLayout(new BorderLayout()); + chooseAll = new UICheckBox(name, default_state); + chooseAll.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + if (chooseAll.isSelected()) { + setSelected(true); + } else { + setSelected(false); + } + } + }); + this.add(chooseAll, BorderLayout.NORTH); + this.add(jlist, BorderLayout.CENTER); + } + + /* + * 用于CellRenderer显示value为text + */ + protected String value2Text(Object value) { + return value != null ? value.toString() : StringUtils.EMPTY; + } + + public void setItems(Object[] os) { + if (os == null) { + this.setSelected(false); + } else { + for (int i = 0, len = os.length; i < len; i++) { + Object o = os[i]; + for (int j = 0, jen = jlist.getModel().getSize(); j < jen; j++) { + if (o.equals(jlist.getModel().getElementAt(j))) { + this.setSelected(j, true); + } + } + } + } + this.repaint(); + } + + /** + * Is selected + */ + public boolean isSelected(int index) { + if (selects == null || index >= selects.length) { + return false; + } + + return selects[index]; + } + + public void setSelected(int index, boolean isSelected) { + if (selects == null || index >= selects.length) { + return; + } + + selects[index] = isSelected; + this.repaint(this.getBounds()); + + this.fireCheckBoxListSelectionChangeListener(); + } + + private void setSelected(boolean isSelected) { + if (selects == null) { + return; + } + for (int i = 0; i < selects.length; i++) { + selects[i] = isSelected; + } + this.repaint(this.getBounds()); + + this.fireCheckBoxListSelectionChangeListener(); + } + + /** + * Returns an array of the objects that have been selected. Overrides the + * JList method. + */ + public Object[] getSelectedValues() { + return this.jlist.getSelectedValues(); + } + + private class BOXLIST extends JList { + public BOXLIST(Object[] items) { + super(items); + } + + @Override + protected void processMouseEvent(MouseEvent e) { + if (e.getX() < X_COORDINATE) { + boolean anyMaskDown = e.isControlDown() || e.isAltDown() || e.isShiftDown() || e.isMetaDown(); + if (anyMaskDown) { + int[] indices = getSelectedIndices(); + if (indices.length == 0) { + super.processMouseEvent(e); + } + } else { + super.processMouseEvent(e); + } + } else { + super.processMouseEvent(e); + } + int id = e.getID(); + switch (id) { + case MouseEvent.MOUSE_PRESSED: + break; + case MouseEvent.MOUSE_RELEASED: + break; + case MouseEvent.MOUSE_CLICKED: + doCheck(); + break; + case MouseEvent.MOUSE_EXITED: + break; + case MouseEvent.MOUSE_ENTERED: + break; + } + } + + @Override + protected void processMouseMotionEvent(MouseEvent e) { + if (e.getX() < X_COORDINATE) { + return; + } + + super.processMouseEvent(e); + } + + @Override + public Object[] getSelectedValues() { + List list = new ArrayList(selects.length); + for (int i = 0; i < selects.length; i++) { + if (selects[i]) { + list.add(this.getModel().getElementAt(i)); + } + } + + return list.toArray(); + } + + } + + private void doCheck() { + // p:这里必须改变所有选择checkbox. + int index = jlist.getSelectedIndex(); + boolean sValue = !selects[index]; + + // p:开始设置所有选择的checkbox. + int[] indices = jlist.getSelectedIndices(); + for (int i = 0; i < indices.length; i++) { + setSelected(indices[i], sValue); + } + for (boolean selected : selects) { + if (!selected) { + chooseAll.setSelected(false); + return; + } + } + chooseAll.setSelected(true); + repaint(); + } + + private static final Border NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1); + + private class CheckListCellRenderer extends UICheckBox implements ListCellRenderer { + + public CheckListCellRenderer() { + this.setOpaque(true); + this.setBorder(NO_FOCUS_BORDER); + } + + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + this.setText(value2Text(value)); + this.setSelected(selects[index]); + this.setFont(list.getFont()); + + if (isSelected) { + this.setBackground(list.getSelectionBackground()); + this.setForeground(list.getSelectionForeground()); + } else { + this.setBackground(list.getBackground()); + this.setForeground(list.getForeground()); + } + + if (cellHasFocus) { + this.setBorder(UIManager.getBorder("List.focusCellHighlightBorder")); + } else { + this.setBorder(NO_FOCUS_BORDER); + } + + return this; + } + } + + public void addCheckBoxListSelectionChangeListener(CheckBoxListSelectionChangeListener l) { + this.listenerList.add(CheckBoxListSelectionChangeListener.class, l); + } + + public void removeCheckBoxListSelectionChangeListener(CheckBoxListSelectionChangeListener l) { + this.listenerList.remove(CheckBoxListSelectionChangeListener.class, l); + } + + public void fireCheckBoxListSelectionChangeListener() { + // Guaranteed to return a non-null array + Object[] listeners = listenerList.getListenerList(); + + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == CheckBoxListSelectionChangeListener.class) { + ((CheckBoxListSelectionChangeListener) listeners[i + 1]).selectionChanged(this); + } + } + + } + + public static interface CheckBoxListSelectionChangeListener extends EventListener { + public void selectionChanged(CheckBoxList target); + } + + public ListModel getModel() { + return jlist.getModel(); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilist/DefaultListCellEditor.java b/designer-base/src/com/fr/design/gui/ilist/DefaultListCellEditor.java new file mode 100644 index 0000000000..330aab7783 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilist/DefaultListCellEditor.java @@ -0,0 +1,50 @@ +package com.fr.design.gui.ilist; + +import java.awt.Component; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; + +import javax.swing.DefaultCellEditor; +import javax.swing.JList; + +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.itextfield.UITextField; + + + +public class DefaultListCellEditor extends DefaultCellEditor implements ListCellEditor { + private UITextField textField; + + public DefaultListCellEditor(final UITextField textField) { + super(textField); + this.textField = textField; + } + + public DefaultListCellEditor(final UICheckBox checkBox) { + super(checkBox); + } + + public DefaultListCellEditor(final UIComboBox comboBox) { + super(comboBox); + } + + public Component getListCellEditorComponent(JList list, Object value, boolean isSelected, int index) { + delegate.setValue(value); + + if (textField != null) { + textField.addFocusListener(new FocusAdapter() { + + public void focusLost(FocusEvent e) { + + stopCellEditing(); + + } + + }); + } + + + return editorComponent; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilist/JNameEdList.java b/designer-base/src/com/fr/design/gui/ilist/JNameEdList.java new file mode 100644 index 0000000000..1d272c513f --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilist/JNameEdList.java @@ -0,0 +1,395 @@ +package com.fr.design.gui.ilist; + +import com.fr.general.NameObject; +import com.fr.base.Utils; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.general.Inter; +import com.fr.stable.Nameable; +import com.fr.stable.StringUtils; +import com.fr.stable.core.PropertyChangeAdapter; + +import javax.swing.*; +import javax.swing.event.CellEditorListener; +import javax.swing.event.ChangeEvent; +import java.awt.*; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.Vector; + +public class JNameEdList extends UIList implements CellEditorListener { + private static final int TEST_LIST_LENTH = 20; + private static final int ICON_WIDTH = 20; + private boolean editable = true; + + // kunsnat: 是否强制ListName是数字 (int型) + private boolean isNameShouldNumber = false; + + transient protected ListCellEditor cellEditor; + transient protected Component editorComp; + transient protected int editingIndex; + private PropertyChangeAdapter editingListner; + private java.util.List ll = new ArrayList(); + + public JNameEdList(ListModel dataModel) { + super(dataModel); + } + + public JNameEdList(final Object[] listData) { + super(listData); + } + + public JNameEdList(final Vector listData) { + super(listData); + } + + public JNameEdList() { + super(); + } + + /* + * Sets是否可编辑 + */ + public void setEditable(boolean editable) { + this.editable = editable; + } + + /** + * 是否可编辑 + * + * @return 是则返回true + */ + public boolean isEditable() { + return this.editable; + } + + public void setNameShouldNumber(boolean isNameShouldNumber) { + this.isNameShouldNumber = isNameShouldNumber; + } + + /** + * 是否强制ListName是数字 (int型) + * + * @return 是则返回true + */ + public boolean isNameShouldNumber() { + return isNameShouldNumber; + } + + /** + * 添加名字改变时的listener + * + * @param l 监听器 + */ + public void addModNameActionListener(ModNameActionListener l) { + ll.add(l); + } + + /** + * 编辑时的监听器 + * + * @param l 监听器 + */ + public void addEditingListner(PropertyChangeAdapter l) { + this.editingListner = l; + } + + /** + * 移除某名字改变时的listener + * + * @param l 监听器 + */ + public void removeModNameActionListener(ModNameActionListener l) { + ll.remove(l); + } + + public ListCellEditor getCellEditor() { + if (cellEditor == null) { + UITextField editField = new UITextField(); + if (editingListner != null) { + editField.addFocusListener(new FocusListener() { + + @Override + public void focusLost(FocusEvent e) { + editingListner.propertyChange(); + + } + + @Override + public void focusGained(FocusEvent e) { + // TODO Auto-generated method stub + + } + }); + } + cellEditor = new DefaultListCellEditor(editField) { + public boolean stopCellEditing() { + boolean isTrue = super.stopCellEditing(); + stopEditing(); + + return isTrue; + } + }; + cellEditor.addCellEditorListener(this); + } + + return cellEditor; + } + + protected void doAfterLostFocus() { + + } + + public void setCellEditor(ListCellEditor editor) { + this.cellEditor = editor; + } + + /* + * 取得index节点的名字 + */ + public String getNameAt(int index) { + Nameable nameable = ((ListModelElement) getModel().getElementAt(index)).wrapper; + if (nameable != null) { + return nameable.getName(); + } + + return null; + } + + public Object getType(int index) { + Nameable nameable = ((ListModelElement) getModel().getElementAt(index)).wrapper; + if (nameable != null && nameable instanceof NameObject) { + return ((NameObject) nameable).getObject(); + } + return null; + } + + + public void setWarnigText() { + setWarnigText(this.getSelectedIndex()); + } + + public void setWarnigText(int index) { + setNameAt(Inter.getLocText("Please_Rename") + "!", index); + this.repaint(); + } + + /* + * 设置index节点的名字 + */ + // b:edit改变name的时候怎么办? + public void setNameAt(String name, int index) { + Nameable nameable = ((ListModelElement) getModel().getElementAt(index)).wrapper; + if (nameable != null) { + String oldName = nameable.getName(); + + if (isNameShouldNumber()) { + // kunsnat: 限制只能是数字(int型) + Number number = Utils.string2Number(name); + if (number == null) { + nameable.setName(oldName); + } else { + int newName = number.intValue(); + nameable.setName(String.valueOf(newName)); + } + } else { + nameable.setName(name); + } + + for (int i = 0, len = ll.size(); i < len; i++) { + ll.get(i).nameModed(index, oldName, name); + } + } + } + + /* + * 编辑第index个item + */ + private String oldName; + + /** + * 编辑第index项 + * + * @param index 序号 + * @return 成功返回true + */ + public boolean editItemAt(int index) { + // 如果不可编辑,返回 + if (!this.editable) { + return false; + } + + if (cellEditor != null && !cellEditor.stopCellEditing()) { + return false; + } + if (index < 0 || index >= this.getModel().getSize()) { + return false; + } + + ListCellEditor editor = getCellEditor(); + Object value = editor.getCellEditorValue(); + if (!StringUtils.isBlank(value.toString())) { + oldName = value.toString(); + } + editorComp = prepareEditor(editor, index); + if (editorComp == null) { + return false; + } + Rectangle rect = this.getCellBounds(index, index); + // alex:所有的JNameEdList都有Icon,空出前面20 * 20的位置就是放的Icon + rect.setRect(createRect(rect, ICON_WIDTH)); + + editorComp.setBounds(rect); + add(editorComp); + editorComp.validate(); + editorComp.requestFocus(); + if (editorComp instanceof UITextField) { + ((UITextField) editorComp).selectAll(); + } + + setEditingIndex(index); + + return true; + } + + public Rectangle createRect(Rectangle rect, int iconWidth) { + return new Rectangle(rect.x + iconWidth, rect.y, rect.width - iconWidth, rect.height); + } + + public String getEditingName() { + return (String) getCellEditor().getCellEditorValue(); + } + + /* + * 根据ListCellEditor取得编辑器的Component + */ + private Component prepareEditor(ListCellEditor cellEditor, int index) { + String name = getNameAt(index); + boolean isSelected = this.isSelectedIndex(index); + Component comp = cellEditor.getListCellEditorComponent(this, name, isSelected, index); + + return comp; + } + + /* + * 记录正在编辑的index + */ + private void setEditingIndex(int idx) { + editingIndex = idx; + } + + /** + * 编辑取消 + * + * @param e 事件 + */ + public void editingCanceled(ChangeEvent e) { + removeComp(); + } + + /** + * 编辑结束 + * + * @param e 事件 + */ + public void editingStopped(ChangeEvent e) { + doAfterLostFocus(); + stopEditing(); + } + + /** + * 停止编辑事件 + */ + public void stopEditing() { + ListCellEditor editor = getCellEditor(); + if (editor != null && editorComp != null) { + Object value = editor.getCellEditorValue(); + String name = StringUtils.isBlank(value.toString()) ? oldName : value.toString(); + setNameAt(name, editingIndex); + removeComp(); + } + } + + public String[] getAllNames() { + int length = this.getModel().getSize(); + String[] names = new String[length]; + for (int i = 0; i < length; i++) { + names[i] = getNameAt(i); + } + return names; + } + + public Object[] getAllTypes() { + int length = this.getModel().getSize(); + Object[] types = new Object[length]; + for (int i = 0; i < length; i++) { + types[i] = getType(i); + } + return types; + } + + + /* + * 移除编辑器的Component + */ + private void removeComp() { + if (editorComp != null) { + remove(editorComp); + } + Rectangle cellRect = this.getCellBounds(editingIndex, editingIndex); + setEditingIndex(-1); + editorComp = null; + repaint(cellRect); + } + + /** + * 主函数 + * + * @param args 参数 + */ + public static void main(String... args) { + JFrame f = new JFrame(); + JPanel c = (JPanel) f.getContentPane(); + c.setLayout(new BorderLayout()); + ListModelElement[] data = new ListModelElement[TEST_LIST_LENTH]; + for (int i = 0; i < TEST_LIST_LENTH; i++) { + data[i] = new ListModelElement(new NameObject(i + 1 + "", i)); + } + final JNameEdList list = new JNameEdList(data); + list.setEditable(true); + list.addMouseListener(new MouseAdapter() { + public void mouseReleased(MouseEvent evt) { + list.stopEditing(); + if (evt.getClickCount() >= 2 + && SwingUtilities.isLeftMouseButton(evt)) { + list.editItemAt(list.getSelectedIndex()); + } + } + }) + ; + + list.setCellEditor(new DefaultListCellEditor(new UITextField())); + list.setCellRenderer(new NameableListCellRenderer()); + c.add(list, BorderLayout.CENTER); + f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + f.setSize(400, 600); + f.setVisible(true); + } + + private static class NameableListCellRenderer extends DefaultListCellRenderer { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, + boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value instanceof Nameable) { + Nameable wrappee = (Nameable) value; + this.setText(wrappee.getName()); + } + return this; + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilist/ListCellEditor.java b/designer-base/src/com/fr/design/gui/ilist/ListCellEditor.java new file mode 100644 index 0000000000..42659baa08 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilist/ListCellEditor.java @@ -0,0 +1,8 @@ +package com.fr.design.gui.ilist; + +import javax.swing.CellEditor; + +public interface ListCellEditor extends CellEditor { + public java.awt.Component getListCellEditorComponent( + javax.swing.JList list, java.lang.Object value, boolean isSelected, int index); +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/ilist/ListModelElement.java b/designer-base/src/com/fr/design/gui/ilist/ListModelElement.java similarity index 100% rename from designer_base/src/com/fr/design/gui/ilist/ListModelElement.java rename to designer-base/src/com/fr/design/gui/ilist/ListModelElement.java diff --git a/designer-base/src/com/fr/design/gui/ilist/ModNameActionListener.java b/designer-base/src/com/fr/design/gui/ilist/ModNameActionListener.java new file mode 100644 index 0000000000..9e746e8dd8 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilist/ModNameActionListener.java @@ -0,0 +1,11 @@ +package com.fr.design.gui.ilist; + +/* + * 专门给JNameEdList用的,当名字改变时的执行的Action + */ +public interface ModNameActionListener { + /* + * 第index个item的名字由oldName改为newName了 + */ + public void nameModed(int index, String oldName, String newName); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilist/QuickList.java b/designer-base/src/com/fr/design/gui/ilist/QuickList.java new file mode 100644 index 0000000000..cc43bf2aa3 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilist/QuickList.java @@ -0,0 +1,41 @@ +package com.fr.design.gui.ilist; + +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; + +import javax.swing.JList; +import javax.swing.ListModel; + +import com.fr.general.ComparatorUtils; + +/** + * 支持键盘输入快速查找项的JList + * + * @editor zhou + * @since 2012-3-28下午3:10:58 + */ +public class QuickList extends JList { + private ListModel listModel; + + public QuickList(ListModel model) { + super(model); + this.listModel = model; + initList(); + } + + private void initList() { + this.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + String key = e.getKeyChar() + ""; + for (int i = 0; i < listModel.getSize(); i++) { + String first = listModel.getElementAt(i).toString(); + if (ComparatorUtils.equals(first, key) && !ComparatorUtils.equals(i, QuickList.this.getSelectedIndex())) { + QuickList.this.setSelectedIndex(i); + break; + } + } + } + }); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilist/TableViewList.java b/designer-base/src/com/fr/design/gui/ilist/TableViewList.java new file mode 100644 index 0000000000..9f6014e331 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilist/TableViewList.java @@ -0,0 +1,276 @@ +package com.fr.design.gui.ilist; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.data.core.DataCoreUtils; +import com.fr.data.core.db.TableProcedure; +import com.fr.data.core.db.dialect.DialectFactory; +import com.fr.data.core.db.dialect.OracleDialect; +import com.fr.data.impl.Connection; +import com.fr.design.DesignerEnvManager; +import com.fr.design.constants.UIConstants; +import com.fr.design.mainframe.dnd.SerializableTransferable; +import com.fr.file.ConnectionConfig; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.dnd.*; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.List; +import java.util.concurrent.CancellationException; + +/** + * 表或者视图或者存储过程组成的一个下拉列表 + * + * @author zhou + * @since 2012-3-28下午10:07:34 + */ +public class TableViewList extends UIList { + + /** + * + */ + private static final long serialVersionUID = 2297780743855004708L; + private SwingWorker refreshList; + private Object object = null; + + + public TableViewList() { + super(); + this.setBackground(UIConstants.NORMAL_BACKGROUND); + this.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); + this.setCellRenderer(new TableListCellRenderer()); + new TableProcessorTreeDragSource(this, DnDConstants.ACTION_COPY); + this.addFocusListener(new FocusAdapter() { + + @Override + public void focusLost(FocusEvent e) { + TableViewList.this.clearSelection(); + } + }); + this.addMouseListener(new MouseAdapter() { + + public void mousePressed(MouseEvent e) { + object = getSelectedValue(); + } + + }); + + } + + /** + * august:databaseName是数据库名字,searchFilter是输入的过滤条件,typesFilter是视图、表、 + * 存储过程中的一者或者几者 + * + * @param databaseName + * @param searchFilter + * @param typesFilter + */ + public void populate(final String databaseName, final String searchFilter, final String... typesFilter) { + DefaultListModel defaultListModel = new DefaultListModel(); + defaultListModel.addElement(UIConstants.PENDING); + final DefaultListModel failed = new DefaultListModel(); + failed.addElement(UIConstants.CONNECTION_FAILED); + this.setModel(defaultListModel); + if (refreshList != null) { + refreshList.cancel(true); + } + refreshList = new SwingWorker() { + + @Override + protected Void doInBackground() throws Exception { + Connection datasource = ConnectionConfig.getInstance().getConnection(databaseName); + boolean status = false; + int count = 3; + //总共给3次连接的机会 + while (!status && count > 0) { + status = FRContext.getCurrentEnv().testConnection(datasource); + count--; + } + if (!status) { + throw new Exception(Inter.getLocText("Datasource-Connection_failed")); + } + TableViewList.this.setModel(processDataInAnotherThread(databaseName, searchFilter, typesFilter)); + return null; + } + + public void done() { + try { + get(); + } catch (Exception e) { + if (!(e instanceof InterruptedException) && !(e instanceof CancellationException)) { + TableViewList.this.setModel(failed); + FRContext.getLogger().error(e.getMessage(), e); + } + } + } + }; + if (databaseName != null) { + refreshList.execute(); + } + } + + /** + * august:databaseName是数据库名字,searchFilter是输入的过滤条件,typesFilter是视图、表、 + * 存储过程中的一者或者几者 + * + * @param databaseName + * @param searchFilter + * @param typesFilter + */ + private DefaultListModel processDataInAnotherThread(String databaseName, String searchFilter, String... typesFilter) throws Exception { + DefaultListModel defaultListModel = new DefaultListModel(); + Connection datasource = ConnectionConfig.getInstance().getConnection(databaseName); + if (datasource == null) { + return defaultListModel; + } + String[] schemas = DataCoreUtils.getDatabaseSchema(datasource); + + searchFilter = searchFilter.toLowerCase(); + + + boolean isOracle = FRContext.getCurrentEnv().isOracle(datasource); + boolean isOracleSystemSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); + // oracleb不勾选显示所有表,则只显示用户下的(包括存储过程和table表) + if (isOracle && !isOracleSystemSpace) { + java.sql.Connection connection = datasource.createConnection(); + OracleDialect orcDialect = (OracleDialect)DialectFactory.generateDialect(connection); + schemas = new String[]{orcDialect.getOracleCurrentUserSchema(connection)}; + } + + if (typesFilter.length == 1 && ComparatorUtils.equals(typesFilter[0], TableProcedure.PROCEDURE)) { + return processStoreProcedure(defaultListModel, schemas, datasource, isOracle, searchFilter); + } else { + return processTableAndView(defaultListModel, schemas, datasource, searchFilter, isOracle, typesFilter); + } + } + + private DefaultListModel processStoreProcedure(DefaultListModel defaultListModel, String[] schemas, Connection datasource, boolean isOracle, String searchFilter) throws Exception { + boolean isBlank = StringUtils.isBlank(searchFilter); + @SuppressWarnings("unchecked") + boolean isOracleSysSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); + List sqlTablees = DataCoreUtils.getProcedures(datasource, schemas, isOracle, isOracleSysSpace); + for (TableProcedure[] sqlTables : sqlTablees) { + if (sqlTables == null) { + continue; + } + for (TableProcedure sqlTable : sqlTables) { + String name = sqlTable.toString().toLowerCase(); + if (isBlank || name.indexOf(searchFilter) != -1) { + defaultListModel.addElement(sqlTable); + } + } + } + return defaultListModel; + } + + private DefaultListModel processTableAndView(DefaultListModel defaultListModel, String[] schemas, Connection datasource, String searchFilter, boolean isOracle, String... typesFilter) + throws Exception { + boolean isBlank = StringUtils.isBlank(searchFilter); + boolean isOracleSystemSpace = DesignerEnvManager.getEnvManager().isOracleSystemSpace(); + if (!isOracle) { + String schema = null; + for (String type : typesFilter) { + //非oracle数据库,默认都是显示所有表的,参数为true + TableProcedure[] sqlTables = DataCoreUtils.getTables(datasource, type, schema, true); + for (int i = 0; i < sqlTables.length; i++) { + if (isBlank || sqlTables[i].getName().toLowerCase().indexOf(searchFilter) != -1) { + defaultListModel.addElement(sqlTables[i]); + } + } + } + } else { + for (String type : typesFilter) { + for (String schema : schemas) { + TableProcedure[] sqlTables = DataCoreUtils.getTables(datasource, type, schema, isOracleSystemSpace); + // oracle的表名加上模式 + for (int i = 0; i < sqlTables.length; i++) { + TableProcedure ta = sqlTables[i]; + String name = ta.getSchema() + '.' + ta.getName(); + if (isBlank || name.toLowerCase().indexOf(searchFilter) != -1) { + defaultListModel.addElement(sqlTables[i]); + } + } + } + } + } + return defaultListModel; + } + + /** + * 显示器 + * + * @editor zhou + * @since 2012-3-28下午10:11:58 + */ + private class TableListCellRenderer extends DefaultListCellRenderer { + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + TableProcedure tableProcedure = null; + if (value instanceof TableProcedure) { + tableProcedure = (TableProcedure) value; + this.setText(tableProcedure.toString()); + } else if (value == UIConstants.PENDING) { + this.setText(UIConstants.PENDING.toString()); + } else { + return this; + } + String type = tableProcedure == null ? null : tableProcedure.getType(); + Icon icon = null; + if (ComparatorUtils.equals(type, TableProcedure.TABLE)) { + icon = BaseUtils.readIcon("/com/fr/design/images/data/tables.png"); + } else if (ComparatorUtils.equals(type, TableProcedure.VIEW)) { + icon = BaseUtils.readIcon("/com/fr/design/images/data/views.png"); + } else { + icon = BaseUtils.readIcon("/com/fr/design/images/data/store_procedure.png"); + } + this.setIcon(icon); + + return this; + } + } + + /** + * 拖拽 + * + * @editor zhou + * @since 2012-3-28下午10:11:36 + */ + private class TableProcessorTreeDragSource extends DragSourceAdapter implements DragGestureListener { + private DragSource source; + + public TableProcessorTreeDragSource(JList jList, int actions) { + source = new DragSource(); + source.createDefaultDragGestureRecognizer(jList, actions, this); + } + + + /** + * Drag Gesture Handler + */ + public void dragGestureRecognized(DragGestureEvent dge) { + setSelectedValue(object, false); + Component comp = dge.getComponent(); + if (!(comp instanceof TableViewList)) { + return; + } + + TableViewList list = (TableViewList) comp; + TableProcedure tableProcedure = null; + Object obj = list.getSelectedValue(); + if (obj instanceof TableProcedure) { + tableProcedure = (TableProcedure) obj; + } + if (tableProcedure != null) { + source.startDrag(dge, DragSource.DefaultLinkDrop, new SerializableTransferable(tableProcedure), this); + } + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ilist/UIList.java b/designer-base/src/com/fr/design/gui/ilist/UIList.java new file mode 100644 index 0000000000..6970ed6767 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ilist/UIList.java @@ -0,0 +1,86 @@ +package com.fr.design.gui.ilist; + +import com.fr.data.core.db.TableProcedure; +import com.fr.design.gui.controlpane.UINameableListCellRenderer; +import com.fr.design.gui.itooltip.UIToolTip; +import com.fr.design.mainframe.JTemplate; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.util.Vector; + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-5-22 + * Time: 上午11:07 + * To change this template use File | Settings | File Templates. + */ +public class UIList extends JList { + private Icon icon; + + public UIList() { + super(); + } + + public UIList(ListModel dataModel) { + super(dataModel); + } + + public UIList(Object[] listData) { + super(listData); + } + + public UIList(Vector listData) { + super(listData); + } + + public String getToolTipText(MouseEvent event) { + int index = locationToIndex(event.getPoint()); + icon = new ImageIcon(); + if (index != -1) { + Object value = getModel().getElementAt(index); + ListCellRenderer renderer = getCellRenderer(); + Component rendererComp = renderer.getListCellRendererComponent(this, value, index, true, false); + // UINameableListCellRenderer 继承自JPanel,无法强转为JLabel,直接返回即可 + if (rendererComp instanceof UINameableListCellRenderer) { + return null; + } + if (rendererComp.getPreferredSize().width > getVisibleRect().width) { + String tips = (rendererComp instanceof JComponent) ? ((JComponent) rendererComp).getToolTipText() : null; + if (tips == null) { + if (value instanceof JTemplate) { + tips = ((JTemplate) value).getEditingFILE().getName(); + icon = ((JTemplate) value).getEditingFILE().getIcon(); + } else if (value instanceof ListModelElement || value instanceof TableProcedure) { + tips = ((JLabel) rendererComp).getText(); + icon = ((JLabel) rendererComp).getIcon(); + } + } + return tips; + } else { + return null; + } + } + return null; + } + + @Override + public Point getToolTipLocation(MouseEvent event) { + int index = locationToIndex(event.getPoint()); + if (index != -1 && StringUtils.isNotEmpty(getToolTipText(event))) { + Rectangle cellBounds = getCellBounds(index, index); + return new Point(cellBounds.x - 2, cellBounds.y - 1); + } + return null; + } + + public JToolTip createToolTip() { + UIToolTip tip = new UIToolTip(icon); + tip.setComponent(this); + tip.setOpaque(false); + return tip; + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/ilist/UINameEdList.java b/designer-base/src/com/fr/design/gui/ilist/UINameEdList.java similarity index 100% rename from designer_base/src/com/fr/design/gui/ilist/UINameEdList.java rename to designer-base/src/com/fr/design/gui/ilist/UINameEdList.java diff --git a/designer-base/src/com/fr/design/gui/imenu/UIBasicMenuItemUI.java b/designer-base/src/com/fr/design/gui/imenu/UIBasicMenuItemUI.java new file mode 100644 index 0000000000..d8cce02344 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UIBasicMenuItemUI.java @@ -0,0 +1,1095 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.imenu; + +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.ColorRoutines; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.event.MenuDragMouseEvent; +import javax.swing.event.MenuDragMouseListener; +import javax.swing.event.MenuKeyListener; +import javax.swing.event.MouseInputListener; +import javax.swing.plaf.*; +import javax.swing.plaf.basic.BasicGraphicsUtils; +import javax.swing.plaf.basic.BasicHTML; +import javax.swing.text.View; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-4 + * Time: 下午3:11 + */ +public class UIBasicMenuItemUI extends MenuItemUI { + /* diagnostic aids -- should be false for production builds. */ + private static final boolean TRACE = false; // trace creates and disposes + private static final boolean VERBOSE = false; // show reuse hits/misses + private static final boolean DEBUG = true; // show bad params, misc. + private static final int DEFAULT_TEXT_ICON_GAP = 8; // Should be from table + private static final int DEFAULT_ICON_GAP = 4; // Should be from table + + protected JMenuItem menuItem = null; + protected Color selectionBackground; + protected Color selectionForeground; + protected Color disabledForeground; + protected Color acceleratorForeground; + protected Color acceleratorSelectionForeground; + private String acceleratorDelimiter; + + protected static int defaultTextIconGap, defaultIconGap; + protected Font acceleratorFont; + + protected MouseInputListener mouseInputListener; + protected MenuDragMouseListener menuDragMouseListener; + protected MenuKeyListener menuKeyListener; + private PropertyChangeListener propertyChangeListener; + + protected Icon arrowIcon = null; + protected Icon checkIcon = null; + + protected boolean oldBorderPainted; + + /** + * Used for accelerator binding, lazily created. + */ + InputMap windowInputMap; + + /* Client Property keys for text and accelerator text widths */ + static final String MAX_TEXT_WIDTH = "maxTextWidth"; + static final String MAX_ACC_WIDTH = "maxAccWidth"; + static final String MAX_ICON_WIDTH = "maxIconWidth"; + + /** + * 加载UI + * + * @param c 组件 + */ + public void installUI(JComponent c) { + menuItem = (JMenuItem) c; + installDefaults(); + installComponents(menuItem); + installListeners(); + installKeyboardActions(); + } + + /** + * @since 1.3 + */ + protected void installComponents(JMenuItem menuItem) { + BasicHTML.updateRenderer(menuItem, menuItem.getText()); + } + + protected String getPropertyPrefix() { + return "MenuItem"; + } + + protected void installListeners() { + if ((mouseInputListener = createMouseInputListener(menuItem)) != null) { + menuItem.addMouseListener(mouseInputListener); + menuItem.addMouseMotionListener(mouseInputListener); + } + + if ((menuDragMouseListener = createMenuDragMouseListener(menuItem)) != null) { + menuItem.addMenuDragMouseListener(menuDragMouseListener); + } + + // removed in 1.3.06 because installing additional listeners + // is unnecessary and caused malfunctions with sub menus +// if((menuKeyListener = createMenuKeyListener(menuItem)) != null) { +// menuItem.addMenuKeyListener(menuKeyListener); +// } + + if ((propertyChangeListener = createPropertyChangeListener(menuItem)) != null) { + menuItem.addPropertyChangeListener(propertyChangeListener); + } + } + + protected void installKeyboardActions() { + ActionMap actionMap = getActionMap(); + + SwingUtilities.replaceUIActionMap(menuItem, actionMap); + updateAcceleratorBinding(); + } + + /** + * 去除UI + * + * @param c 组件 + */ + public void uninstallUI(JComponent c) { + menuItem = (JMenuItem) c; + uninstallDefaults(); + uninstallComponents(menuItem); + uninstallListeners(); + uninstallKeyboardActions(); + + //Remove the textWidth and accWidth values from the parent's Client Properties. + Container parent = menuItem.getParent(); + if ((parent != null && parent instanceof JComponent) && !(menuItem instanceof JMenu && ((JMenu) menuItem).isTopLevelMenu())) { + JComponent p = (JComponent) parent; + p.putClientProperty(MAX_ACC_WIDTH, null); + p.putClientProperty(MAX_TEXT_WIDTH, null); + } + + menuItem = null; + } + + protected void uninstallDefaults() { + LookAndFeel.uninstallBorder(menuItem); + menuItem.setBorderPainted(oldBorderPainted); + if (menuItem.getMargin() instanceof UIResource) { + menuItem.setMargin(null); + } + if (arrowIcon instanceof UIResource) { + arrowIcon = null; + } + if (checkIcon instanceof UIResource) { + checkIcon = null; + } + } + + /** + * @since 1.3 + */ + protected void uninstallComponents(JMenuItem menuItem) { + BasicHTML.updateRenderer(menuItem, ""); + } + + protected void uninstallListeners() { + if (mouseInputListener != null) { + menuItem.removeMouseListener(mouseInputListener); + menuItem.removeMouseMotionListener(mouseInputListener); + } + if (menuDragMouseListener != null) { + menuItem.removeMenuDragMouseListener(menuDragMouseListener); + } +// if(menuKeyListener != null) { +// menuItem.removeMenuKeyListener(menuKeyListener); +// } + if (propertyChangeListener != null) { + menuItem.removePropertyChangeListener(propertyChangeListener); + } + + mouseInputListener = null; + menuDragMouseListener = null; + menuKeyListener = null; + propertyChangeListener = null; + } + + protected void uninstallKeyboardActions() { + SwingUtilities.replaceUIActionMap(menuItem, null); + if (windowInputMap != null) { + SwingUtilities.replaceUIInputMap(menuItem, JComponent.WHEN_IN_FOCUSED_WINDOW, null); + windowInputMap = null; + } + } + + protected MouseInputListener createMouseInputListener(JComponent c) { + return new MouseInputHandler(); + } + + protected MenuDragMouseListener createMenuDragMouseListener(JComponent c) { + return new MenuDragMouseHandler(); + } + + private PropertyChangeListener createPropertyChangeListener(JComponent c) { + return new PropertyChangeHandler(); + } + + ActionMap getActionMap() { + String propertyPrefix = getPropertyPrefix(); + String uiKey = propertyPrefix + ".actionMap"; + ActionMap am = (ActionMap) UIManager.get(uiKey); + + if (am == null) { + am = createActionMap(); + UIManager.getLookAndFeelDefaults().put(uiKey, am); + } + + return am; + } + + ActionMap createActionMap() { + ActionMap map = new ActionMapUIResource(); + map.put("doClick", new ClickAction()); + + return map; + } + + InputMap createInputMap(int condition) { + if (condition == JComponent.WHEN_IN_FOCUSED_WINDOW) { + return new ComponentInputMapUIResource(menuItem); + } + return null; + } + + void updateAcceleratorBinding() { + KeyStroke accelerator = menuItem.getAccelerator(); + + if (windowInputMap != null) { + windowInputMap.clear(); + } + + if (accelerator != null) { + if (windowInputMap == null) { + windowInputMap = createInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); + SwingUtilities.replaceUIInputMap(menuItem, + JComponent.WHEN_IN_FOCUSED_WINDOW, windowInputMap); + } + windowInputMap.put(accelerator, "doClick"); + } + } + + public Dimension getMinimumSize(JComponent c) { + Dimension d = null; + View v = (View) c.getClientProperty(BasicHTML.propertyKey); + if (v != null) { + d = getPreferredSize(c); + d.width -= v.getPreferredSpan(View.X_AXIS) - v.getMinimumSpan(View.X_AXIS); + } + return d; + } + + public Dimension getPreferredSize(JComponent c) { + return getPreferredMenuItemSize(c, checkIcon, arrowIcon, DEFAULT_TEXT_ICON_GAP); + } + + /** + * Renders the text of the current menu item. + *

+ * + * @param g graphics context + * @param menuItem menu item to render + * @param textRect bounding rectangle for rendering the text + * @param text string to render + * @since 1.4 + */ + protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) { + ButtonModel model = menuItem.getModel(); + FontMetrics fm = g.getFontMetrics(); + int mnemIndex = menuItem.getDisplayedMnemonicIndex(); + + if (!model.isEnabled()) { + // *** paint the text disabled + g.setColor(ThemeUtils.MENU_DISABLED_FG_COLOR); + BasicGraphicsUtils.drawStringUnderlineCharAt(g, text, mnemIndex, textRect.x, textRect.y + fm.getAscent()); + } else { + boolean isSelected = menuItem instanceof JMenu && model.isSelected(); + // *** paint the text normally + if (isTopLevelMenu()) { + if (menuItem.getClientProperty("rollover") == Boolean.TRUE && + ThemeUtils.MENU_ROLLOVER && !model.isSelected()) { + g.setColor(ThemeUtils.MENU_ROLLOVER_FG_COLOR); + } else { + if (!(menuItem.getForeground() instanceof ColorUIResource)) { + g.setColor(menuItem.getForeground()); + } else { + g.setColor(ThemeUtils.MENU_FONT_COLOR); + } + } + } else if (model.isArmed() || isSelected) { + g.setColor(ThemeUtils.MENU_SELECTED_TEXT_COLOR); + } else { + // normal + g.setColor(menuItem.getForeground()); + } + + BasicGraphicsUtils.drawStringUnderlineCharAt(g, text, mnemIndex, textRect.x, textRect.y + fm.getAscent()); + } + } + + public Dimension getMaximumSize(JComponent c) { + Dimension d = null; + View v = (View) c.getClientProperty(BasicHTML.propertyKey); + if (v != null) { + d = getPreferredSize(c); + d.width += v.getMaximumSpan(View.X_AXIS) - v.getPreferredSpan(View.X_AXIS); + } + return d; + } + + // these rects are used for painting and preferredsize calculations. + // they used to be regenerated constantly. Now they are reused. + static Rectangle zeroRect = new Rectangle(0, 0, 0, 0); + static Rectangle iconRect = new Rectangle(); + static Rectangle textRect = new Rectangle(); + static Rectangle acceleratorRect = new Rectangle(); + static Rectangle checkIconRect = new Rectangle(); + static Rectangle arrowIconRect = new Rectangle(); + static Rectangle viewRect = new Rectangle(Short.MAX_VALUE, Short.MAX_VALUE); + static Rectangle r = new Rectangle(); + + private void resetRects() { + iconRect.setBounds(zeroRect); + textRect.setBounds(zeroRect); + acceleratorRect.setBounds(zeroRect); + checkIconRect.setBounds(zeroRect); + arrowIconRect.setBounds(zeroRect); + viewRect.setBounds(0, 0, Short.MAX_VALUE, Short.MAX_VALUE); + r.setBounds(zeroRect); + } + + /** + * We draw the background in paintMenuItem() + * so override update (which fills the background of opaque + * components by default) to just call paint(). + */ + public void update(Graphics g, JComponent c) { + paint(g, c); + } + + public void paint(Graphics g, JComponent c) { + paintMenuItem(g, c, checkIcon, arrowIcon, + selectionBackground, selectionForeground, DEFAULT_TEXT_ICON_GAP); + } + + /* + * Returns true if the component is a JMenu and it is a top + * level menu (on the menubar). + */ + private boolean isTopLevelMenu() { + if ((menuItem instanceof JMenu) && (((JMenu) menuItem).isTopLevelMenu())) { + return true; + } + + return false; + } + + public MenuElement[] getPath() { + MenuSelectionManager m = MenuSelectionManager.defaultManager(); + MenuElement[] oldPath = m.getSelectedPath(); + MenuElement[] newPath; + int i = oldPath.length; + if (i == 0) { + return new MenuElement[0]; + } + Component parent = menuItem.getParent(); + if (oldPath[i - 1].getComponent() == parent) { + // The parent popup menu is the last so far + newPath = new MenuElement[i + 1]; + System.arraycopy(oldPath, 0, newPath, 0, i); + newPath[i] = menuItem; + } else { + // A sibling menuitem is the current selection + // + // This probably needs to handle 'exit submenu into + // a menu item. Search backwards along the current + // selection until you find the parent popup menu, + // then copy up to that and add yourself... + int j; + for (j = oldPath.length - 1; j >= 0; j--) { + if (oldPath[j].getComponent() == parent) { + break; + } + } + newPath = new MenuElement[j + 2]; + System.arraycopy(oldPath, 0, newPath, 0, j + 1); + newPath[j + 1] = menuItem; + + } + return newPath; + } + + protected class MouseInputHandler implements MouseInputListener { + public void mouseClicked(MouseEvent e) { + } + + public void mousePressed(MouseEvent e) { + } + + public void mouseReleased(MouseEvent e) { + MenuSelectionManager manager = MenuSelectionManager.defaultManager(); + Point p = e.getPoint(); + boolean isxContains = p.x >= 0 && p.x < menuItem.getWidth(); + boolean isyContains = p.y >= 0 && p.y < menuItem.getHeight(); + if (isxContains && isyContains) { + doClick(manager); + } else { + manager.processMouseEvent(e); + } + } + + public void mouseEntered(MouseEvent e) { + MenuSelectionManager manager = MenuSelectionManager.defaultManager(); + int modifiers = e.getModifiers(); + // 4188027: drag enter/exit added in JDK 1.1.7A, JDK1.2 + if ((modifiers & (InputEvent.BUTTON1_MASK | InputEvent.BUTTON2_MASK | InputEvent.BUTTON3_MASK)) != 0) { + MenuSelectionManager.defaultManager().processMouseEvent(e); + } else { + manager.setSelectedPath(getPath()); + } + } + + public void mouseExited(MouseEvent e) { + MenuSelectionManager manager = MenuSelectionManager.defaultManager(); + + int modifiers = e.getModifiers(); + // 4188027: drag enter/exit added in JDK 1.1.7A, JDK1.2 + if ((modifiers & (InputEvent.BUTTON1_MASK | InputEvent.BUTTON2_MASK | InputEvent.BUTTON3_MASK)) != 0) { + MenuSelectionManager.defaultManager().processMouseEvent(e); + } else { + + MenuElement[] path = manager.getSelectedPath(); + if (path.length > 1) { + MenuElement[] newPath = new MenuElement[path.length - 1]; + int i, c; + for (i = 0, c = path.length - 1; i < c; i++) { + newPath[i] = path[i]; + } + manager.setSelectedPath(newPath); + } + } + } + + public void mouseDragged(MouseEvent e) { + MenuSelectionManager.defaultManager().processMouseEvent(e); + } + + public void mouseMoved(MouseEvent e) { + } + } + + private class MenuDragMouseHandler implements MenuDragMouseListener { + public void menuDragMouseEntered(MenuDragMouseEvent e) { + } + + public void menuDragMouseDragged(MenuDragMouseEvent e) { + MenuSelectionManager manager = e.getMenuSelectionManager(); + MenuElement[] path = e.getPath(); + manager.setSelectedPath(path); + } + + public void menuDragMouseExited(MenuDragMouseEvent e) { + } + + public void menuDragMouseReleased(MenuDragMouseEvent e) { + MenuSelectionManager manager = e.getMenuSelectionManager(); + Point p = e.getPoint(); + boolean isxContains = p.x >= 0 && p.x < menuItem.getWidth(); + boolean isyContains = p.y >= 0 && p.y < menuItem.getHeight(); + if (isxContains && isyContains) { + doClick(manager); + } else { + manager.clearSelectedPath(); + } + } + } + + private class PropertyChangeHandler implements PropertyChangeListener { + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + boolean isquick = ComparatorUtils.equals(name, "displayedMnemonic") || ComparatorUtils.equals(name, "accelerator"); + boolean istextRelate = ComparatorUtils.equals(name, "text") || ComparatorUtils.equals(name, "font"); + if (ComparatorUtils.equals(name, "labelFor") || isquick) { + updateAcceleratorBinding(); + } else if (istextRelate || ComparatorUtils.equals(name, "foreground")) { + // remove the old html view client property if one + // existed, and install a new one if the text installed + // into the JLabel is html source. + JMenuItem lbl = ((JMenuItem) e.getSource()); + String text = lbl.getText(); + BasicHTML.updateRenderer(lbl, text); + } + } + } + + private static class ClickAction extends AbstractAction { + public void actionPerformed(ActionEvent e) { + JMenuItem mi = (JMenuItem) e.getSource(); + MenuSelectionManager.defaultManager().clearSelectedPath(); + mi.doClick(); + } + } + + /** + * Call this method when a menu item is to be activated. + * This method handles some of the details of menu item activation + * such as clearing the selected path and messaging the + * JMenuItem's doClick() method. + * + * @param msm A MenuSelectionManager. The visual feedback and + * internal bookkeeping tasks are delegated to + * this MenuSelectionManager. If null is + * passed as this argument, the + * MenuSelectionManager.defaultManager is + * used. + * @see MenuSelectionManager + * @see JMenuItem#doClick(int) + * @since 1.4 + */ + protected void doClick(MenuSelectionManager msm) { + // Visual feedback + if (msm == null) { + msm = MenuSelectionManager.defaultManager(); + } + msm.clearSelectedPath(); + menuItem.doClick(0); + } + + /** + * This is to see if the menu item in question is part of the + * system menu on an internal frame. + * The Strings that are being checked can be found in + * MetalInternalFrameTitlePaneUI.java, + * WindowsInternalFrameTitlePaneUI.java, and + * MotifInternalFrameTitlePaneUI.java. + * + * @since 1.4 + */ + private boolean isInternalFrameSystemMenu() { + String actionCommand = menuItem.getActionCommand(); + return (actionCommand == "Close") || (actionCommand == "Minimize") || (actionCommand == "Restore") || (actionCommand == "Maximize"); + } + + ////////////////////////////////////////////////////////// + + public static class EmptyIcon implements Icon { + int width; + int height; + + public EmptyIcon(int width, int height) { + this.height = height; + this.width = width; + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + return; + } + + public int getIconWidth() { + return width; + } + + public int getIconHeight() { + return height; + } + } + + /** + * 创建UI + * + * @param c 组件 + * @return 组件UI + */ + public static ComponentUI createUI(JComponent c) { + return new UIBasicMenuItemUI(); + } + + protected void installDefaults() { + String prefix = getPropertyPrefix(); + + acceleratorFont = UIManager.getFont("MenuItem.acceleratorFont"); + + menuItem.setOpaque(true); + if (menuItem.getMargin() == null || (menuItem.getMargin() instanceof UIResource)) { + menuItem.setMargin(UIManager.getInsets(prefix + ".margin")); + } + + LookAndFeel.installBorder(menuItem, prefix + ".border"); + oldBorderPainted = menuItem.isBorderPainted(); + menuItem.setBorderPainted(((Boolean) (UIManager.get(prefix + ".borderPainted"))).booleanValue()); + LookAndFeel.installColorsAndFont(menuItem, prefix + ".background", prefix + ".foreground", prefix + ".font"); + + // MenuItem specific defaults + if (selectionBackground == null || selectionBackground instanceof UIResource) { + selectionBackground = UIManager.getColor(prefix + ".selectionBackground"); + } + if (selectionForeground == null || selectionForeground instanceof UIResource) { + selectionForeground = UIManager.getColor(prefix + ".selectionForeground"); + } + if (disabledForeground == null || disabledForeground instanceof UIResource) { + disabledForeground = UIManager.getColor(prefix + ".disabledForeground"); + } + if (acceleratorForeground == null || acceleratorForeground instanceof UIResource) { + acceleratorForeground = UIManager.getColor(prefix + ".acceleratorForeground"); + } + if (acceleratorSelectionForeground == null || acceleratorSelectionForeground instanceof UIResource) { + acceleratorSelectionForeground = UIManager.getColor(prefix + ".acceleratorSelectionForeground"); + } + + // Get accelerator delimiter + acceleratorDelimiter = UIManager.getString("MenuItem.acceleratorDelimiter"); + if (acceleratorDelimiter == null) { + acceleratorDelimiter = "+"; + } + + // Icons + if (arrowIcon == null || arrowIcon instanceof UIResource) { + arrowIcon = UIManager.getIcon(prefix + ".arrowIcon"); + } + if (checkIcon == null || checkIcon instanceof UIResource) { + checkIcon = UIManager.getIcon(prefix + ".checkIcon"); + } + + defaultTextIconGap = DEFAULT_TEXT_ICON_GAP; // Should be from table + defaultIconGap = DEFAULT_ICON_GAP; // Should be from table + } + + protected Dimension getPreferredMenuItemSize(JComponent c, Icon checkIcon, + Icon arrowIcon, int defaultTextIconGap) { + JMenuItem b = (JMenuItem) c; + Icon icon = b.getIcon(); + String text = b.getText(); + KeyStroke accelerator = b.getAccelerator(); + String acceleratorText = ""; + if (accelerator != null) { + int modifiers = accelerator.getModifiers(); + if (modifiers > 0) { + acceleratorText = KeyEvent.getKeyModifiersText(modifiers); + //acceleratorText += "-"; + acceleratorText += acceleratorDelimiter; + } + int keyCode = accelerator.getKeyCode(); + if (keyCode != 0) { + acceleratorText += KeyEvent.getKeyText(keyCode); + } else { + acceleratorText += accelerator.getKeyChar(); + } + } + caulateFont(b, icon, text, acceleratorText); + Container parent = menuItem.getParent(); + doWithTopMenu(parent, icon); + if (!isTopLevelMenu()) { + // Add in the checkIcon + r.width += checkIconRect.width; + r.width += defaultTextIconGap; + // Add in the arrowIcon + r.width += defaultTextIconGap; + r.width += arrowIconRect.width; + } + r.width += 2 * defaultTextIconGap; + Insets insets = b.getInsets(); + if (insets != null) { + r.width += insets.left + insets.right; + r.height += insets.top + insets.bottom; + } + // if the width is even, bump it up one. This is critical + // for the focus dash line to draw properly + if (r.width % 2 == 0) { + r.width++; + } + if (r.height % 2 == 0) { + r.height++; + } + return r.getSize(); + } + + private void doWithTopMenu(Container parent, Icon icon) { + if (parent != null && parent instanceof JComponent && + !(menuItem instanceof JMenu && ((JMenu) menuItem).isTopLevelMenu())) { + JComponent p = (JComponent) parent; + + //Get widest text so far from parent, if no one exists null is returned. + Integer maxTextWidth = (Integer) p.getClientProperty(MAX_TEXT_WIDTH); + Integer maxAccWidth = (Integer) p.getClientProperty(MAX_ACC_WIDTH); + Integer maxIconWidth = (Integer) p.getClientProperty(MAX_ICON_WIDTH); // WAS ME + + int maxTextValue = maxTextWidth != null ? maxTextWidth.intValue() : 0; + int maxAccValue = maxAccWidth != null ? maxAccWidth.intValue() : 0; + int maxIconValue = maxIconWidth != null ? maxIconWidth.intValue() : 0; + + //Compare the text widths, and adjust the r.width to the widest. + if (r.width < maxTextValue) { + r.width = maxTextValue; + } else { + p.putClientProperty(UIBasicMenuItemUI.MAX_TEXT_WIDTH, new Integer(r.width)); + } + + //Compare the accelarator widths. + if (acceleratorRect.width > maxAccValue) { + maxAccValue = acceleratorRect.width; + p.putClientProperty(UIBasicMenuItemUI.MAX_ACC_WIDTH, new Integer(acceleratorRect.width)); + } + + //Compare the accelarator widths. + if (icon != null && icon.getIconWidth() > maxIconValue) { + maxIconValue = icon.getIconWidth(); + p.putClientProperty(UIBasicMenuItemUI.MAX_ICON_WIDTH, new Integer(maxIconValue)); + } + + //Add on the widest accelerator + // If-clause added in 1.3.03 + if (maxAccValue > 0) { + r.width += maxAccValue; + r.width += defaultTextIconGap; + } + } + } + + private void caulateFont(JMenuItem b, Icon icon, String text, String acceleratorText) { + Font font = b.getFont(); + FontMetrics fm = b.getFontMetrics(font); + FontMetrics fmAccel = b.getFontMetrics(acceleratorFont); + + resetRects(); + + layoutMenuItem(fm, text, fmAccel, acceleratorText, icon, checkIcon, arrowIcon, + b.getVerticalAlignment(), b.getHorizontalAlignment(), b.getVerticalTextPosition(), + b.getHorizontalTextPosition(), viewRect, iconRect, textRect, acceleratorRect, + checkIconRect, arrowIconRect, text == null ? 0 : defaultTextIconGap, DEFAULT_ICON_GAP); + // find the union of the icon and text rects + r.setBounds(textRect); + r = SwingUtilities.computeUnion(iconRect.x, iconRect.y, iconRect.width, iconRect.height, r); + + // Added in 1.3.03 for compensation + if (icon != null || checkIcon != null) { + r.width -= 3 * UIBasicMenuItemUI.DEFAULT_TEXT_ICON_GAP; + } + } + + protected void paintMenuItem(Graphics g, JComponent c, Icon checkIcon, Icon arrowIcon, + Color background, Color foreground, int defaultTextIconGap) { + JMenuItem b = (JMenuItem) c; + ButtonModel model = b.getModel(); + JComponent p = (JComponent) b.getParent(); + Integer maxValueInt = (Integer) p.getClientProperty(UIBasicMenuItemUI.MAX_ICON_WIDTH); + int maxValue = maxValueInt == null ? 16 : maxValueInt.intValue(); + int menuWidth = b.getWidth(); + int menuHeight = b.getHeight(); + Insets i = c.getInsets(); + resetRects(); + viewRect.setBounds(0, 0, menuWidth, menuHeight); + viewRect.x += 0; + viewRect.y += i.top; + viewRect.width -= (i.right + viewRect.x); + viewRect.height -= (i.bottom + viewRect.y); + Font holdf = g.getFont(); + Font f = c.getFont(); + g.setFont(f); + FontMetrics fm = g.getFontMetrics(f); + FontMetrics fmAccel = g.getFontMetrics(acceleratorFont); + int offset = 0; + // layout the text and icon + Icon ic = b.getIcon(); + Icon iCheck = checkIcon; + Icon paintIcon = ic; + // get Accelerator text + KeyStroke accelerator = b.getAccelerator(); + String acceleratorText = ""; + drawMenu(acceleratorText, accelerator, c, ic, maxValue, offset, paintIcon, b); + String text = layoutMenuItem(fm, b.getText(), fmAccel, acceleratorText, ic, null, + arrowIcon, b.getVerticalAlignment(), b.getHorizontalAlignment(), + b.getVerticalTextPosition(), b.getHorizontalTextPosition(), viewRect, + iconRect, textRect, acceleratorRect, checkIconRect, arrowIconRect, + b.getText() == null ? 0 : defaultTextIconGap, DEFAULT_ICON_GAP); + // Paint background + paintBackground(g, b, background); + Color holdc = g.getColor(); + paintCheck(g, c, model, offset, foreground, holdc); + paintIcon(b, g, c, paintIcon, model, offset); + paintText(text, b, g, c); + drawAccText(acceleratorText, g, p, model, fmAccel, c); + paintArrow(g, model, c, foreground); + g.setColor(holdc); + g.setFont(holdf); + } + + private void drawMenu(String acceleratorText, KeyStroke accelerator, JComponent c, + Icon ic, int maxValue, int offset, Icon paintIcon, JMenuItem b) { + if (accelerator != null) { + int modifiers = accelerator.getModifiers(); + if (modifiers > 0) { + acceleratorText = KeyEvent.getKeyModifiersText(modifiers); + //acceleratorText += "-"; + acceleratorText += acceleratorDelimiter; + } + + int keyCode = accelerator.getKeyCode(); + if (keyCode != 0) { + acceleratorText += KeyEvent.getKeyText(keyCode); + } else { + acceleratorText += accelerator.getKeyChar(); + } + } + if (!isTopLevelMenu()) { + if (c instanceof JCheckBoxMenuItem || c instanceof JRadioButtonMenuItem) { + ic = checkIcon; + if (checkIcon.getIconWidth() < maxValue) { + ic = new EmptyIcon(maxValue, checkIcon.getIconHeight()); + offset = (maxValue - checkIcon.getIconWidth()) / 2; + } + paintIcon = null; + } else if (c instanceof JMenuItem) { + if (ic == null || ic.getIconWidth() < maxValue) { + int height = (ic == null) ? 2 : b.getIcon().getIconHeight(); + int width = (ic == null) ? 2 : b.getIcon().getIconWidth(); + offset = (maxValue - width) / 2; + ic = new EmptyIcon(maxValue, height); + } + } + } + } + + + private void drawAccText(String acceleratorText, Graphics g, JComponent p, ButtonModel model, FontMetrics fmAccel, JComponent c) { + if (acceleratorText != null && !ComparatorUtils.equals(acceleratorText, "")) { + //Get the maxAccWidth from the parent to calculate the offset. + int accOffset = 0; + Container parent = menuItem.getParent(); + if (parent != null && parent instanceof JComponent) { + Integer amaxValueInt = (Integer) p.getClientProperty(UIBasicMenuItemUI.MAX_ACC_WIDTH); + int amaxValue = amaxValueInt != null ? amaxValueInt.intValue() : acceleratorRect.width; + + //Calculate the offset, with which the accelerator texts will be drawn with. + accOffset = amaxValue - acceleratorRect.width; + } + + g.setFont(acceleratorFont); + if (!model.isEnabled()) { + g.setColor(ThemeUtils.MENU_ICON_SHADOW_COLOR); + BasicGraphicsUtils.drawString(g, acceleratorText, 0, acceleratorRect.x - accOffset, acceleratorRect.y + fmAccel.getAscent()); + g.setColor(ThemeUtils.MENU_ICON_DISABLED_COLOR); + BasicGraphicsUtils.drawString(g, acceleratorText, 0, acceleratorRect.x - accOffset - 1, acceleratorRect.y + fmAccel.getAscent() - 1); + //} + } else { + boolean isMenuSelected = c instanceof JMenu && model.isSelected(); + if (model.isArmed() || isMenuSelected) { + //g.setColor(acceleratorSelectionForeground); + g.setColor(ThemeUtils.MENU_SELECTED_TEXT_COLOR); + } else { + g.setColor(ThemeUtils.MENU_ITEM_FONT_COLOR); + } + + BasicGraphicsUtils.drawString(g, acceleratorText, 0, acceleratorRect.x - accOffset, acceleratorRect.y + fmAccel.getAscent()); + } + } + } + + private void paintArrow(Graphics g, ButtonModel model, JComponent c, Color foreground) { + if (arrowIcon != null) { + boolean isMenuSelected = c instanceof JMenu && model.isSelected(); + if (model.isArmed() || isMenuSelected) { + g.setColor(foreground); + } + if (!isTopLevelMenu()) { + arrowIcon.paintIcon(c, g, arrowIconRect.x, arrowIconRect.y); + } + } + } + + private void paintText(String text, JMenuItem b, Graphics g, JComponent c) { + if (text != null) { + View v = (View) c.getClientProperty(BasicHTML.propertyKey); + g.setColor(ThemeUtils.MENU_ITEM_FONT_COLOR); + + if (v != null) { + v.paint(g, textRect); + } else { + paintText(g, b, textRect, text); + } + } + } + + private void paintIcon(JMenuItem b, Graphics g, JComponent c, Icon paintIcon, ButtonModel model, int offset) { + if (paintIcon != null) { + Icon icon; + if (!model.isEnabled()) { + icon = (Icon) b.getDisabledIcon(); + if (icon != null) { + icon.paintIcon(c, g, iconRect.x + offset, iconRect.y); + } + } else if (model.isPressed() && model.isArmed()) { + icon = (Icon) b.getPressedIcon(); + if (icon == null) { + // Use default icon + icon = (Icon) b.getIcon(); + } + if (icon != null) { + icon.paintIcon(c, g, iconRect.x + offset, iconRect.y); + } + } else if (model.isArmed() || model.isSelected()) { + icon = (Icon) b.getIcon(); + if (icon != null) { + icon.paintIcon(c, g, iconRect.x + offset, iconRect.y); + } + } else { + icon = (Icon) b.getIcon(); + if (icon != null) { + icon.paintIcon(c, g, iconRect.x + offset, iconRect.y); + } + } + + } + } + + private void paintCheck(Graphics g, JComponent c, ButtonModel model, int offset, Color foreground, Color holdc) { + if (checkIcon != null) { + boolean isMenuSelected = c instanceof JMenu && model.isSelected(); + if (model.isArmed() || isMenuSelected) { + g.setColor(foreground); + } else { + g.setColor(holdc); + } + if (!isTopLevelMenu()) { + checkIcon.paintIcon(c, g, iconRect.x + offset, iconRect.y); + } + g.setColor(holdc); + } + + } + + /** + * Draws the background of one menu item. + * + * @param g the paint graphics + * @param menuItem menu item to be painted + * @param bgColor unused + * @since 1.4 + */ + protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { + if (!menuItem.isOpaque()) { + return; + } + ButtonModel model = menuItem.getModel(); + Color oldColor = g.getColor(); + int menuWidth = menuItem.getWidth(); + int menuHeight = menuItem.getHeight(); + boolean armed = + (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())); + + if ((menuItem instanceof JMenu) && ((JMenu) menuItem).isTopLevelMenu()) { + // TopLevelMenu + if (model.isSelected()) { + g.setColor(ThemeUtils.MENU_BAR_COLOR); + g.fillRect(0, 0, menuWidth, menuHeight); + drawXpTopMenuBorder(g, 0, 0, menuWidth, menuHeight, true); + } else if (menuItem.getClientProperty("rollover") == Boolean.TRUE && ThemeUtils.MENU_ROLLOVER) { + g.setColor(ThemeUtils.MENU_ROLLOVER_BG_COLOR); + g.fillRect(0, 0, menuWidth - 8, menuHeight); + g.setColor(ThemeUtils.MENU_BAR_COLOR); + g.fillRect(menuWidth - 8, 0, 8, menuHeight); + drawXpTopMenuBorder(g, 0, 0, menuWidth, menuHeight, false); + } else { + if (menuItem.getBackground() instanceof ColorUIResource) { + g.setColor(ThemeUtils.MENU_BAR_COLOR); + } else { + g.setColor(menuItem.getBackground()); + } + + g.fillRect(0, 0, menuWidth, menuHeight); + } + } else if (armed) { + // Item rollover + g.setColor(ThemeUtils.MENU_ITEM_ROLLOVER_COLOR); + g.fillRect(0, 0, menuWidth, menuHeight); + } else { + // Item normal + if (menuItem.getBackground() instanceof ColorUIResource) { + g.setColor(ThemeUtils.MENU_POPUP_COLOR); + } else { + g.setColor(menuItem.getBackground()); + } + + g.fillRect(0, 0, menuWidth, menuHeight); + } + + g.setColor(oldColor); + } + + + private void drawXpTopMenuBorder( + Graphics g, int x, int y, int w, int h, boolean selected) { + g.setColor(ThemeUtils.MENU_BORDER_COLOR); + if (selected) { + g.drawLine(x, y, x + w - 8, y); + g.drawLine(x, y, x, y + h - 1); + g.drawLine(x + w - 8, y, x + w - 8, y + h - 1); + + // shadow + drawXpShadow(g, + ColorRoutines.darken(ThemeUtils.MENU_BORDER_COLOR, 15), + ThemeUtils.MENU_BAR_COLOR, + x + w - 7, y + 6, 6, h - 6); + } else { + g.drawRect(x, y, w - 8, h - 1); + } + } + + + private void drawXpShadow(Graphics g, Color c1, Color c2, + int x1, int y1, int w, int h) { + Color c; + for (int x = 0; x < w; x++) { + c = ColorRoutines.getGradient(c1, c2, w, x); + g.setColor(c); + g.drawLine(x1 + x, y1, x1 + x, y1 + h); + + int index = 0; + for (int y = y1 - 1; y >= y1 - 6; y--) { + g.setColor(ColorRoutines.getGradient(c, c2, 5, index++)); + g.drawLine(x1 + x, y, x1 + x, y); + } + } + } + + /** + * Compute and return the location of the icons origin, the + * location of origin of the text baseline, and a possibly clipped + * version of the compound labels string. Locations are computed + * relative to the viewRect rectangle. + */ + + private String layoutMenuItem(FontMetrics fm, String text, FontMetrics fmAccel, + String acceleratorText, Icon icon, Icon checkIcon, Icon arrowIcon, + int verticalAlignment, int horizontalAlignment, int verticalTextPosition, + int horizontalTextPosition, Rectangle viewRect, Rectangle iconRect, + Rectangle textRect, Rectangle acceleratorRect, Rectangle checkIconRect, + Rectangle arrowIconRect, int textIconGap, int menuItemGap) { + SwingUtilities.layoutCompoundLabel(menuItem, fm, text, icon, verticalAlignment, + horizontalAlignment, verticalTextPosition, horizontalTextPosition, viewRect, + iconRect, textRect, textIconGap); + if ((acceleratorText == null) ||ComparatorUtils.equals(acceleratorText,"")) { + acceleratorRect.width = acceleratorRect.height = 0; + acceleratorText = ""; + } else { + acceleratorRect.width = SwingUtilities.computeStringWidth(fmAccel, acceleratorText); + acceleratorRect.height = fmAccel.getHeight(); + } + if (!isTopLevelMenu()) { + if (checkIcon != null) { + checkIconRect.height = checkIcon.getIconHeight(); + checkIconRect.width = checkIcon.getIconWidth(); + } else { + checkIconRect.width = checkIconRect.height = 0; + } + if (arrowIcon != null) { + arrowIconRect.width = arrowIcon.getIconWidth(); + arrowIconRect.height = arrowIcon.getIconHeight(); + } else { + arrowIconRect.width = arrowIconRect.height = 0; + } + } else { + checkIconRect.width = checkIconRect.height = 0; + arrowIconRect.width = arrowIconRect.height = 0; + } + Rectangle labelRect = iconRect.union(textRect); + if (checkIcon != null) { + checkIconRect.x += menuItemGap; + } else { + textRect.x += menuItemGap; + iconRect.x += menuItemGap; + } + acceleratorRect.x = viewRect.x + viewRect.width - arrowIconRect.width - menuItemGap - acceleratorRect.width; + acceleratorRect.y = labelRect.y + (labelRect.height / 2) - (acceleratorRect.height / 2); + if (!isTopLevelMenu()) { + arrowIconRect.y = labelRect.y + (labelRect.height / 2) - (arrowIconRect.height / 2); + checkIconRect.y = labelRect.y + (labelRect.height / 2) - (checkIconRect.height / 2); + arrowIconRect.x = viewRect.x + viewRect.width - menuItemGap + - arrowIconRect.width; + } + return text; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/imenu/UIBasicMenuUI.java b/designer-base/src/com/fr/design/gui/imenu/UIBasicMenuUI.java new file mode 100644 index 0000000000..9279ba8683 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UIBasicMenuUI.java @@ -0,0 +1,689 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.imenu; + + +import com.fr.general.ComparatorUtils; +import com.fr.general.FRLogger; + +import javax.swing.*; +import javax.swing.event.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.ComboPopup; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-11 + * Time: 上午11:21 + */ +public class UIBasicMenuUI extends UIBasicMenuItemUI { + private static final boolean DEBUG = false; // show bad params, misc. + private static final int MENU_POSITION4 = 4; + private static final int MENU_POSITION3 = 3; + + protected ChangeListener changeListener; + protected PropertyChangeListener propertyChangeListener; + + private int lastMnemonic = 0; + private static boolean crossMenuMnemonic = true; + + /** + * 创建UI + * + * @param x 组件 + * @return 组件UI + */ + public static ComponentUI createUI(JComponent x) { + return new UIBasicMenuUI(); + } + + protected void installDefaults() { + super.installDefaults(); + ((JMenu) menuItem).setDelay(200); + crossMenuMnemonic = UIManager.getBoolean("Menu.crossMenuMnemonic"); + } + + /** + * The ActionMap for BasicMenUI can not be shared, this is subclassed + * to create a new one for each invocation. + */ + ActionMap getActionMap() { + return createActionMap(); + } + + /** + * Invoked to create the ActionMap. + */ + ActionMap createActionMap() { + ActionMap am = super.createActionMap(); + if (am != null) { + am.put("selectMenu", new PostAction((JMenu) menuItem, true)); + } + return am; + } + + protected String getPropertyPrefix() { + return "Menu"; + } + + protected void installListeners() { + super.installListeners(); + + if (changeListener == null) { + changeListener = createChangeListener(menuItem); + } + + if (changeListener != null) { + menuItem.addChangeListener(changeListener); + } + + if (propertyChangeListener == null) { + propertyChangeListener = createPropertyChangeListener(menuItem); + } + + if (propertyChangeListener != null) { + menuItem.addPropertyChangeListener(propertyChangeListener); + } + + } + + protected void installKeyboardActions() { + super.installKeyboardActions(); // installs only ActionMap + updateMnemonicBinding(); + } + + void updateMnemonicBinding() { + int mnemonic = menuItem.getModel().getMnemonic(); + int[] shortcutKeys = (int[]) UIManager.get("Menu.shortcutKeys"); + + if (mnemonic == lastMnemonic || shortcutKeys == null) { + return; + } + + if (lastMnemonic != 0 && windowInputMap != null) { + for (int i = 0; i < shortcutKeys.length; i++) { + windowInputMap.remove(KeyStroke.getKeyStroke(lastMnemonic, shortcutKeys[i], false)); + } + } + + if (mnemonic != 0) { + if (windowInputMap == null) { + windowInputMap = createInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); + SwingUtilities.replaceUIInputMap(menuItem, JComponent.WHEN_IN_FOCUSED_WINDOW, windowInputMap); + } + + for (int i = 0; i < shortcutKeys.length; i++) { + windowInputMap.put(KeyStroke.getKeyStroke(mnemonic, shortcutKeys[i], false), "selectMenu"); + } + } + + lastMnemonic = mnemonic; + } + + protected MouseInputListener createMouseInputListener(JComponent c) { + return new MouseInputHandler(); + } + + protected ChangeListener createChangeListener(JComponent c) { + return null; + } + + protected PropertyChangeListener createPropertyChangeListener(JComponent c) { + return new PropertyChangeHandler(); + } + + protected void uninstallDefaults() { + menuItem.setArmed(false); + menuItem.setSelected(false); + menuItem.resetKeyboardActions(); + super.uninstallDefaults(); + } + + protected void uninstallListeners() { + super.uninstallListeners(); + + if (changeListener != null) { + menuItem.removeChangeListener(changeListener); + changeListener = null; + } + + if (propertyChangeListener != null) { + menuItem.removePropertyChangeListener(propertyChangeListener); + propertyChangeListener = null; + } + + if (menuKeyListener != null) { + menuItem.removeMenuKeyListener(menuKeyListener); + menuKeyListener = null; + } + } + + protected MenuDragMouseListener createMenuDragMouseListener(JComponent c) { + return new MenuDragMouseHandler(); + } + + protected MenuKeyListener createMenuKeyListener(JComponent c) { + return new MenuKeyHandler(); + } + + + public Dimension getMaximumSize(JComponent c) { + if (((JMenu) menuItem).isTopLevelMenu() == true) { + Dimension d = c.getPreferredSize(); + return new Dimension(d.width, Short.MAX_VALUE); + } + return null; + } + + protected void setupPostTimer(JMenu menu) { + Timer timer = new Timer(menu.getDelay(), new PostAction(menu, false)); + timer.setRepeats(false); + timer.start(); + } + + private static void appendPath(MenuElement[] path, MenuElement elem) { + MenuElement[] newPath = new MenuElement[path.length + 1]; + System.arraycopy(path, 0, newPath, 0, path.length); + newPath[path.length] = elem; + MenuSelectionManager.defaultManager().setSelectedPath(newPath); + } + + private static class PostAction extends AbstractAction { + JMenu menu; + boolean force = false; + + PostAction(JMenu menu, boolean shouldForce) { + this.menu = menu; + this.force = shouldForce; + } + + public void actionPerformed(ActionEvent e) { + if (!crossMenuMnemonic) { + JPopupMenu pm = getActivePopupMenu(); + + if (pm != null && pm != menu.getParent()) { + return; + } + } + + final MenuSelectionManager defaultManager = MenuSelectionManager.defaultManager(); + if (force) { + Container cnt = menu.getParent(); + if (cnt != null && cnt instanceof JMenuBar) { + MenuElement[] me; + MenuElement[] subElements; + + subElements = menu.getPopupMenu().getSubElements(); + if (subElements.length > 0) { + me = new MenuElement[MENU_POSITION4]; + me[0] = (MenuElement) cnt; + me[1] = (MenuElement) menu; + me[2] = (MenuElement) menu.getPopupMenu(); + me[3] = subElements[0]; + } else { + me = new MenuElement[MENU_POSITION3]; + me[0] = (MenuElement) cnt; + me[1] = menu; + me[2] = (MenuElement) menu.getPopupMenu(); + } + defaultManager.setSelectedPath(me); + } + } else { + MenuElement[] path = defaultManager.getSelectedPath(); + if (path.length > 0 && path[path.length - 1] == menu) { + appendPath(path, menu.getPopupMenu()); + } + } + } + + public boolean isEnabled() { + return menu.getModel().isEnabled(); + } + } + + private class PropertyChangeHandler implements PropertyChangeListener { + public void propertyChange(PropertyChangeEvent e) { + if (ComparatorUtils.equals(e.getPropertyName(), AbstractButton.MNEMONIC_CHANGED_PROPERTY)) { + updateMnemonicBinding(); + } + } + } + + /** + * Instantiated and used by a menu item to handle the current menu selection + * from mouse events. A MouseInputHandler processes and forwards all mouse events + * to a shared instance of the MenuSelectionManager. + *

+ * This class is protected so that it can be subclassed by other look and + * feels to implement their own mouse handling behavior. All overridden + * methods should call the parent methods so that the menu selection + * is correct. + * + * @see javax.swing.MenuSelectionManager + * @since 1.4 + */ + protected class MouseInputHandler implements MouseInputListener { + public void mouseClicked(MouseEvent e) { + } + + /** + * Invoked when the mouse has been clicked on the menu. This + * method clears or sets the selection path of the + * MenuSelectionManager. + * + * @param e the mouse event + */ + public void mousePressed(MouseEvent e) { + JMenu menu = (JMenu) menuItem; + if (!menu.isEnabled()) { + return; + } + + MenuSelectionManager manager = MenuSelectionManager.defaultManager(); + if (menu.isTopLevelMenu()) { + if (menu.isSelected()) { + manager.clearSelectedPath(); + } else { + Container cnt = menu.getParent(); + if (cnt != null && cnt instanceof JMenuBar) { + MenuElement[] me = new MenuElement[2]; + me[0] = (MenuElement) cnt; + me[1] = menu; + manager.setSelectedPath(me); + } + } + } + + MenuElement[] selectedPath = manager.getSelectedPath(); + if (selectedPath.length > 0 && selectedPath[selectedPath.length - 1] != menu.getPopupMenu()) { + + if (menu.isTopLevelMenu() || menu.getDelay() == 0) { + appendPath(selectedPath, menu.getPopupMenu()); + } else { + setupPostTimer(menu); + } + } + } + + /** + * Invoked when the mouse has been released on the menu. Delegates the + * mouse event to the MenuSelectionManager. + * + * @param e the mouse event + */ + public void mouseReleased(MouseEvent e) { + JMenu menu = (JMenu) menuItem; + if (!menu.isEnabled()) { + return; + } + MenuSelectionManager manager = MenuSelectionManager.defaultManager(); + manager.processMouseEvent(e); + if (!e.isConsumed()) { + manager.clearSelectedPath(); + } + } + + /** + * Invoked when the cursor enters the menu. This method sets the selected + * path for the MenuSelectionManager and handles the case + * in which a menu item is used to pop up an additional menu, as in a + * hierarchical menu system. + * + * @param e the mouse event; not used + */ + public void mouseEntered(MouseEvent e) { + JMenu menu = (JMenu) menuItem; + + if (!menu.isEnabled() || menu.getClientProperty("isSystemMenu") == Boolean.TRUE) { + return; + } + + menu.putClientProperty("rollover", Boolean.TRUE); + + MenuSelectionManager manager = MenuSelectionManager.defaultManager(); + MenuElement[] selectedPath = manager.getSelectedPath(); + + if (!menu.isTopLevelMenu()) { + if (!(selectedPath.length > 0 && selectedPath[selectedPath.length - 1] == menu.getPopupMenu())) { + if (menu.getDelay() == 0) { + appendPath(getPath(), menu.getPopupMenu()); + } else { + manager.setSelectedPath(getPath()); + setupPostTimer(menu); + } + } + } else { + if (selectedPath.length > 0 && selectedPath[0] == menu.getParent()) { + MenuElement[] newPath = new MenuElement[3]; + // A top level menu's parent is by definition + // a JMenuBar + newPath[0] = (MenuElement) menu.getParent(); + newPath[1] = menu; + newPath[2] = menu.getPopupMenu(); + manager.setSelectedPath(newPath); + } + } + + if (menu.isTopLevelMenu()) { + menu.repaint(); + } + } + + public void mouseExited(MouseEvent e) { + JMenu menu = (JMenu) menuItem; + + if (!menu.isEnabled() || menu.getClientProperty("isSystemMenu") == Boolean.TRUE) { + return; + } + + menu.putClientProperty("rollover", Boolean.FALSE); + + if (menu.isTopLevelMenu()) { + menu.repaint(); + } + } + + /** + * Invoked when a mouse button is pressed on the menu and then dragged. + * Delegates the mouse event to the MenuSelectionManager. + * + * @param e the mouse event + * @see java.awt.event.MouseMotionListener#mouseDragged + */ + public void mouseDragged(MouseEvent e) { + JMenu menu = (JMenu) menuItem; + if (!menu.isEnabled()) { + return; + } + MenuSelectionManager.defaultManager().processMouseEvent(e); + } + + public void mouseMoved(MouseEvent e) { + } + } + + private class MenuDragMouseHandler implements MenuDragMouseListener { + public void menuDragMouseEntered(MenuDragMouseEvent e) { + } + + public void menuDragMouseDragged(MenuDragMouseEvent e) { + if (menuItem.isEnabled() == false) { + return; + } + + MenuSelectionManager manager = e.getMenuSelectionManager(); + MenuElement[] path = e.getPath(); + + Point p = e.getPoint(); + boolean isContainsX = p.x >= 0 && p.x < menuItem.getWidth(); + boolean isContainsY = p.y >= 0 && p.y < menuItem.getHeight(); + if (isContainsX && isContainsY) { + JMenu menu = (JMenu) menuItem; + MenuElement[] selectedPath = manager.getSelectedPath(); + if (!(selectedPath.length > 0 && selectedPath[selectedPath.length - 1] == menu.getPopupMenu())) { + boolean isMenuTop = menu.isTopLevelMenu() || menu.getDelay() == 0; + if (isMenuTop || e.getID() == MouseEvent.MOUSE_DRAGGED) { + appendPath(path, menu.getPopupMenu()); + } else { + manager.setSelectedPath(path); + setupPostTimer(menu); + } + } + } else if (e.getID() == MouseEvent.MOUSE_RELEASED) { + Component comp = manager.componentForPoint(e.getComponent(), e.getPoint()); + if (comp == null) { + manager.clearSelectedPath(); + } + } + + } + + public void menuDragMouseExited(MenuDragMouseEvent e) { + } + + public void menuDragMouseReleased(MenuDragMouseEvent e) { + } + } + + static JPopupMenu getActivePopupMenu() { + MenuElement[] path = MenuSelectionManager.defaultManager().getSelectedPath(); + for (int i = path.length - 1; i >= 0; i--) { + MenuElement elem = path[i]; + if (elem instanceof JPopupMenu) { + return (JPopupMenu) elem; + } + } + return null; + } + + // Currently not installed (1.3.6) + private static class MenuHandler implements MenuListener { + public void menuSelected(MenuEvent e) { + } + + public void menuDeselected(MenuEvent e) { + } + + public void menuCanceled(MenuEvent e) { + JMenu m = (JMenu) e.getSource(); + MenuSelectionManager manager = MenuSelectionManager.defaultManager(); + + if (manager.isComponentPartOfCurrentMenu(m)) { + MenuSelectionManager.defaultManager().clearSelectedPath(); + } + } + } + + /** + * Handles the mnemonic handling for the JMenu and JMenuItems. + */ + private class MenuKeyHandler implements MenuKeyListener { + + // fields for handling duplicate mnemonics. + private int indexes[]; + private char lastMnemonic; + private int lastIndex; + private int matches; + + /** + * Opens the SubMenu + */ + public void menuKeyTyped(MenuKeyEvent e) { + if (menuItem == null){ + return; + } + + if (DEBUG) { + FRLogger.getLogger().info("in TinyMenuUI.menuKeyTyped for " + menuItem.getText()); + } + + if (!crossMenuMnemonic) { + JPopupMenu pm = getActivePopupMenu(); + + if (pm != null && pm != menuItem.getParent()) { + return; + } + } + + int key = menuItem.getMnemonic(); + if (key == 0) { + return; + } + MenuElement[] path = e.getPath(); + if (lower((char) key) == lower(e.getKeyChar())) { + JPopupMenu popupMenu = ((JMenu) menuItem).getPopupMenu(); + MenuElement[] sub = popupMenu.getSubElements(); + if (sub.length > 0) { + MenuSelectionManager manager = e.getMenuSelectionManager(); + MenuElement[] newPath = new MenuElement[path.length + 2]; + System.arraycopy(path, 0, newPath, 0, path.length); + newPath[path.length] = popupMenu; + newPath[path.length + 1] = sub[0]; + manager.setSelectedPath(newPath); + } + e.consume(); + } + } + + /** + * Handles the mnemonics for the menu items. Will also handle duplicate mnemonics. + * Perhaps this should be moved into BasicPopupMenuUI. See 4670831 + */ + public void menuKeyPressed(MenuKeyEvent e) { + if (menuItem == null) { + return; + } + if (DEBUG) { + FRLogger.getLogger().info("in TinyMenuUI.menuKeyPressed for " + menuItem.getText()); + } + char keyChar = e.getKeyChar(); + if (!Character.isLetterOrDigit(keyChar)){ + return; } + MenuSelectionManager manager = e.getMenuSelectionManager(); + MenuElement[] path = e.getPath(); MenuElement[] selectedPath = manager.getSelectedPath(); + for (int i = selectedPath.length - 1; i >= 0; i--) { + if (selectedPath[i] == menuItem) { + JPopupMenu popupMenu = ((JMenu) menuItem).getPopupMenu(); + MenuElement[] items = popupMenu.getSubElements(); + if (indexes == null || lastMnemonic != keyChar) { + matches = 0; + lastIndex = 0; + indexes = new int[items.length]; + for (int j = 0; j < items.length; j++) { + int key = ((JMenuItem) items[j]).getMnemonic(); + if (lower((char) key) == lower(keyChar)) { + indexes[matches++] = j; + } + } + lastMnemonic = keyChar; + } + if (matches == 0) { + ; + } else if (matches == 1) { + JMenuItem item = (JMenuItem) items[indexes[0]]; + if (!(item instanceof JMenu)) { + manager.clearSelectedPath(); + item.doClick(); + } + } else { + if (lastIndex == matches) { + lastIndex = 0; + } + MenuElement menuItem = items[indexes[lastIndex++]]; + MenuElement[] newPath = new MenuElement[path.length + 2]; + System.arraycopy(path, 0, newPath, 0, path.length); + newPath[path.length] = popupMenu; + newPath[path.length + 1] = menuItem; + manager.setSelectedPath(newPath); + } + e.consume(); return; + } + } + } + + public void menuKeyReleased(MenuKeyEvent e) { + } + + private char lower(char keyChar) { + return Character.toLowerCase(keyChar); + } + } + + static class AltProcessor implements KeyEventPostProcessor { + static boolean altKeyPressed = false; + static boolean menuCanceledOnPress = false; + static JRootPane root = null; + static Window winAncestor = null; + + void altPressed(KeyEvent ev) { + MenuSelectionManager msm = + MenuSelectionManager.defaultManager(); + MenuElement[] path = msm.getSelectedPath(); + + if (path.length > 0 && !(path[0] instanceof ComboPopup)) { + msm.clearSelectedPath(); + menuCanceledOnPress = true; + ev.consume(); + } else if (path.length > 0) { // We are in ComboBox + menuCanceledOnPress = false; + ev.consume(); + } else { + menuCanceledOnPress = false; + JMenuBar mbar = root != null ? root.getJMenuBar() : null; + + if (mbar == null && winAncestor instanceof JFrame) { + mbar = ((JFrame) winAncestor).getJMenuBar(); + } + + JMenu menu = mbar != null ? mbar.getMenu(0) : null; + + if (menu != null) { + ev.consume(); + } + } + } + + void altReleased(KeyEvent ev) { + if (menuCanceledOnPress) { + return; + } + + MenuSelectionManager msm = MenuSelectionManager.defaultManager(); + + if (msm.getSelectedPath().length == 0) { + // if no menu is active, we try activating the menubar + JMenuBar mbar = root != null ? root.getJMenuBar() : null; + + if (mbar == null && winAncestor instanceof JFrame) { + mbar = ((JFrame) winAncestor).getJMenuBar(); + } + + JMenu menu = mbar != null ? mbar.getMenu(0) : null; + + if (menu != null) { + MenuElement[] path = new MenuElement[2]; + path[0] = mbar; + path[1] = menu; + msm.setSelectedPath(path); + } + } + } + + public boolean postProcessKeyEvent(KeyEvent ev) { + if (ev.getKeyCode() == KeyEvent.VK_ALT) { + root = SwingUtilities.getRootPane(ev.getComponent()); + winAncestor = SwingUtilities.getWindowAncestor(root); + + if (ev.getID() == KeyEvent.KEY_PRESSED) { + if (!altKeyPressed) { + altPressed(ev); + } + + altKeyPressed = true; + return true; + } else if (ev.getID() == KeyEvent.KEY_RELEASED) { + if (altKeyPressed) { + altReleased(ev); + } + + altKeyPressed = false; + } + } else { + altKeyPressed = false; + } + + return false; + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/imenu/UICheckBoxMenuItem.java b/designer-base/src/com/fr/design/gui/imenu/UICheckBoxMenuItem.java new file mode 100644 index 0000000000..fba8bfd7f4 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UICheckBoxMenuItem.java @@ -0,0 +1,29 @@ +package com.fr.design.gui.imenu; + +import com.fr.design.constants.UIConstants; + +public class UICheckBoxMenuItem extends UIMenuItem { + + public UICheckBoxMenuItem(String name) { + super(name); + } + + + public void setState(boolean b) { + synchronized (this) { + setSelected(b); + } + } + + @Override + public void setSelected(boolean b) { + super.setSelected(b); + if (this.isSelected()) { + setIcon(UIConstants.CHOOSEN_ICON); + } else { + setIcon(UIConstants.BLACK_ICON); + } + } + + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/imenu/UIHeadMenu.java b/designer-base/src/com/fr/design/gui/imenu/UIHeadMenu.java similarity index 100% rename from designer_base/src/com/fr/design/gui/imenu/UIHeadMenu.java rename to designer-base/src/com/fr/design/gui/imenu/UIHeadMenu.java diff --git a/designer_base/src/com/fr/design/gui/imenu/UIListPopup.java b/designer-base/src/com/fr/design/gui/imenu/UIListPopup.java similarity index 100% rename from designer_base/src/com/fr/design/gui/imenu/UIListPopup.java rename to designer-base/src/com/fr/design/gui/imenu/UIListPopup.java diff --git a/designer-base/src/com/fr/design/gui/imenu/UIMenu.java b/designer-base/src/com/fr/design/gui/imenu/UIMenu.java new file mode 100644 index 0000000000..98f60619b9 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UIMenu.java @@ -0,0 +1,343 @@ +package com.fr.design.gui.imenu; + +import com.fr.design.constants.UIConstants; +import com.fr.stable.StringUtils; + +import javax.swing.Action; +import javax.swing.JButton; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.MenuElement; +import javax.swing.border.Border; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.RenderingHints; +import java.awt.Shape; +import java.awt.geom.RoundRectangle2D; + +/** + * @author null + */ +public class UIMenu extends JMenu { + private static final float REC = 8f; + private JPopupMenu popupMenu; + + public UIMenu(String name) { + super(name); + setName(name); + setRolloverEnabled(true); + setBackground(UIConstants.NORMAL_BACKGROUND); + } + + @Override + public String getText() { + if (this.getParent() instanceof JPopupMenu) { + return StringUtils.BLANK + super.getText(); + } + return " " + super.getText(); + } + + @Override + public JPopupMenu getPopupMenu() { + ensurePopupMenuCreated(); + popupMenu.setOpaque(false); + popupMenu.setBorder(new Border() { + + @Override + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + Graphics2D g2d = (Graphics2D) g; + int rec = (int) REC; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); + g2d.setColor(UIConstants.UIPOPUPMENU_LINE_COLOR); + g2d.drawRoundRect(x, y, width - 1, height - 1, rec, rec); + if (!(UIMenu.this.getParent() instanceof JPopupMenu)) { + g.setColor(UIConstants.NORMAL_BACKGROUND); + g.drawLine(1, 0, UIMenu.this.getWidth() - 2, 0); + } + } + + @Override + public boolean isBorderOpaque() { + return false; + } + + @Override + public Insets getBorderInsets(Component c) { + return new Insets(5, 2, 10, 10); + } + }); + return popupMenu; + } + + protected void ensurePopupMenuCreated() { + if (popupMenu == null) { + this.popupMenu = new JPopupMenu() { + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + int rec = (int) REC; + Shape shape = new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), REC, REC); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setColor(UIConstants.NORMAL_BACKGROUND); + g2d.fillRoundRect(0, 0, getWidth(), getHeight(), rec, rec); + g2d.setClip(shape); + super.paintComponent(g2d); + } + + }; + popupMenu.setInvoker(this); + + popupListener = createWinListener(popupMenu); + } + } + + /** + * 画界面 + */ + @Override + public void updateUI() { + setUI(new UIMenuUI()); + } + + /** + * 判断popupmeu是否隐藏 + * + * @return 如果隐藏 返回true + */ + @Override + public boolean isPopupMenuVisible() { + ensurePopupMenuCreated(); + return popupMenu.isVisible(); + } + + + /** + * 设置popupmenu位置 + * + * @param x x + * @param y y + */ + @Override + public void setMenuLocation(int x, int y) { + super.setMenuLocation(x, y); + if (popupMenu != null) { + popupMenu.setLocation(x, y); + } + } + + /** + * 向popupmenu添加 JMenuItem + * + * @param menuItem 菜单项 + * @return 菜单项 + */ + @Override + public JMenuItem add(JMenuItem menuItem) { + ensurePopupMenuCreated(); + return popupMenu.add(menuItem); + } + + /** + * 添加组件 + * + * @param c 组件 + * @return 组件 + */ + @Override + public Component add(Component c) { + ensurePopupMenuCreated(); + popupMenu.add(c); + return c; + } + + /** + * 向指定位置添加组件 + * + * @param c 组件 + * @param index 位置 + * @return 组件 + */ + @Override + public Component add(Component c, int index) { + ensurePopupMenuCreated(); + popupMenu.add(c, index); + return c; + } + + + /** + * 添加分隔符 + */ + @Override + public void addSeparator() { + ensurePopupMenuCreated(); + popupMenu.addSeparator(); + } + + /** + * 添加menuitem到指定位置 + * + * @param s 字符 + * @param pos 位置 + */ + @Override + public void insert(String s, int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + + ensurePopupMenuCreated(); + popupMenu.insert(new JMenuItem(s), pos); + } + + /** + * 添加么会特么到指定位置 + * + * @param mi 菜单项 + * @param pos 位置 + * @return 菜单项 + */ + @Override + public JMenuItem insert(JMenuItem mi, int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + ensurePopupMenuCreated(); + popupMenu.insert(mi, pos); + return mi; + } + + /** + * 添加到指定位置 + * + * @param a 事件 + * @param pos 位置 + * @return 菜单项 + */ + @Override + public JMenuItem insert(Action a, int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + ensurePopupMenuCreated(); + JMenuItem mi = new JMenuItem(a); + mi.setHorizontalTextPosition(JButton.TRAILING); + mi.setVerticalTextPosition(JButton.CENTER); + popupMenu.insert(mi, pos); + return mi; + } + + /** + * 添加分隔符到指定位置 + * + * @param index 指定位置 + */ + @Override + public void insertSeparator(int index) { + if (index < 0) { + throw new IllegalArgumentException("index less than zero."); + } + + ensurePopupMenuCreated(); + popupMenu.insert(new JPopupMenu.Separator(), index); + } + + + /** + * 移除 + * + * @param item 菜单项 + */ + @Override + public void remove(JMenuItem item) { + if (popupMenu != null) { + popupMenu.remove(item); + } + } + + /** + * 移除指定位置菜单项 + * + * @param pos 指定位置 + */ + @Override + public void remove(int pos) { + if (pos < 0) { + throw new IllegalArgumentException("index less than zero."); + } + if (pos > getItemCount()) { + throw new IllegalArgumentException("index greater than the number of items."); + } + if (popupMenu != null) { + popupMenu.remove(pos); + } + } + + /** + * 移除组件 + * + * @param c 组件 + */ + @Override + public void remove(Component c) { + if (popupMenu != null) { + popupMenu.remove(c); + } + } + + /** + * 移除所有 + */ + @Override + public void removeAll() { + if (popupMenu != null) { + popupMenu.removeAll(); + } + } + + /** + * 组件总数 + * + * @return 组件总数 + */ + @Override + public int getMenuComponentCount() { + return (popupMenu == null) ? 0 : popupMenu.getComponentCount(); + } + + /** + * 指定位置组件 + * + * @param n 指定位置 + * @return 组件 + */ + @Override + public Component getMenuComponent(int n) { + return (popupMenu == null) ? null : popupMenu.getComponent(n); + } + + /** + * 所有组件 + * + * @return 所有组件 + */ + @Override + public Component[] getMenuComponents() { + return (popupMenu == null) ? new Component[0] : popupMenu.getComponents(); + } + + + @Override + public MenuElement[] getSubElements() { + if (popupMenu == null) { + return new MenuElement[0]; + } else { + MenuElement[] result = new MenuElement[1]; + result[0] = popupMenu; + return result; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/imenu/UIMenuBar.java b/designer-base/src/com/fr/design/gui/imenu/UIMenuBar.java new file mode 100644 index 0000000000..6f7a68c83c --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UIMenuBar.java @@ -0,0 +1,29 @@ +package com.fr.design.gui.imenu; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 13-12-30 + * Time: 上午10:30 + */ +public class UIMenuBar extends JMenuBar { + + private static final int LEFT_GAP = 5; + + public UIMenuBar() { + super(); + this.setBorder(new EmptyBorder(0, LEFT_GAP, 0, 0)); + + } + + /** + * 更新UI + */ + public void updateUI() { + setUI(new UIMenuBarUI()); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/imenu/UIMenuBarUI.java b/designer-base/src/com/fr/design/gui/imenu/UIMenuBarUI.java new file mode 100644 index 0000000000..a93b1d23db --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UIMenuBarUI.java @@ -0,0 +1,33 @@ +package com.fr.design.gui.imenu; + +import com.fr.design.constants.UIConstants; + +import javax.swing.plaf.basic.BasicMenuBarUI; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 13-12-30 + * Time: 上午10:36 + */ +public class UIMenuBarUI extends BasicMenuBarUI { + + public UIMenuBarUI() { + } + + public void paint(java.awt.Graphics g, javax.swing.JComponent c) { + //是否完全不透明 + super.paint(g, c); + if (!c.isOpaque()) { + return; + } + Color oldColor = g.getColor(); + g.setColor(UIConstants.UI_MENU_BACKGOURND); + g.fillRect(0, 0, c.getWidth(), c.getHeight()); + g.setColor(oldColor); + } + + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/imenu/UIMenuEastAttrItem.java b/designer-base/src/com/fr/design/gui/imenu/UIMenuEastAttrItem.java similarity index 100% rename from designer_base/src/com/fr/design/gui/imenu/UIMenuEastAttrItem.java rename to designer-base/src/com/fr/design/gui/imenu/UIMenuEastAttrItem.java diff --git a/designer-base/src/com/fr/design/gui/imenu/UIMenuHighLight.java b/designer-base/src/com/fr/design/gui/imenu/UIMenuHighLight.java new file mode 100644 index 0000000000..6fb127e5ca --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UIMenuHighLight.java @@ -0,0 +1,25 @@ +package com.fr.design.gui.imenu; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; + +import javax.swing.JPanel; + +import com.fr.design.constants.UIConstants; + +public class UIMenuHighLight extends JPanel{ + + @Override + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height = 0; + return dim; + } + public void paint(Graphics g) { + g.setColor(UIConstants.LINE_COLOR); + g.drawLine(0, 0, getWidth(), 0); + g.setColor(Color.WHITE); + g.drawLine(0, 1, getWidth(), 1); + }; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/imenu/UIMenuItem.java b/designer-base/src/com/fr/design/gui/imenu/UIMenuItem.java new file mode 100644 index 0000000000..37f1fe0528 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UIMenuItem.java @@ -0,0 +1,107 @@ +package com.fr.design.gui.imenu; + +import java.awt.*; + +import javax.swing.*; +import javax.swing.plaf.basic.BasicMenuItemUI; + +import com.fr.design.constants.UIConstants; +import com.fr.stable.Constants; +import com.fr.stable.StringUtils; +import com.fr.design.utils.gui.GUIPaintUtils; +import sun.swing.SwingUtilities2; + +public class UIMenuItem extends JMenuItem{ + public UIMenuItem() { + this(StringUtils.BLANK); + } + + public UIMenuItem(String string) { + this(string, null); + + } + + public UIMenuItem(String string, Icon pageSmallIcon) { + super(string, pageSmallIcon); + setBackground(UIConstants.NORMAL_BACKGROUND); + setUI(new UIMenuItemUI()); + } + + public UIMenuItem(String string, int key) { + super(string, key); + setBackground(UIConstants.NORMAL_BACKGROUND); + setUI(new UIMenuItemUI()); + } + + public UIMenuItem(Action action) { + this(); + setAction(action); + } + + @Override + public String getText() { + return StringUtils.BLANK + super.getText(); + } + + private class UIMenuItemUI 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); + if(menuItem.isOpaque()) { + if (model.isArmed()|| (menuItem instanceof JMenu && model.isSelected())) { + GUIPaintUtils.fillPaint((Graphics2D)g, 30, 0, menuWidth - 30, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 7); + } else { + GUIPaintUtils.fillPaint((Graphics2D)g, 30, 0, menuWidth - 30, menuHeight, true, Constants.NULL, menuItem.getBackground(), 7); + } + g.setColor(oldColor); + } + else if (model.isArmed() || (menuItem instanceof JMenu && + model.isSelected())) { + GUIPaintUtils.fillPaint((Graphics2D)g, 30, 0, menuWidth - 30, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 7); + g.setColor(oldColor); + } + } + + protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) { + ButtonModel model = menuItem.getModel(); + FontMetrics fm = SwingUtilities2.getFontMetrics(menuItem, g); + int mnemIndex = menuItem.getDisplayedMnemonicIndex(); + + if(!model.isEnabled()) { + // *** paint the text disabled + if ( UIManager.get("MenuItem.disabledForeground") instanceof Color ) { + g.setColor( UIManager.getColor("MenuItem.disabledForeground") ); + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g,text, + -1, textRect.x, textRect.y + fm.getAscent()); + } else { + g.setColor(menuItem.getBackground().brighter()); + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, + -1, textRect.x, textRect.y + fm.getAscent()); + g.setColor(menuItem.getBackground().darker()); + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g,text, + -1, textRect.x - 1, textRect.y + + fm.getAscent() - 1); + } + } else { + // *** paint the text normally + if (model.isArmed()|| (menuItem instanceof JMenu && model.isSelected())) { + g.setColor(Color.WHITE); // Uses protected field. + } + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g,text, + -1, textRect.x, textRect.y + fm.getAscent()); + } + } + + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/imenu/UIMenuUI.java b/designer-base/src/com/fr/design/gui/imenu/UIMenuUI.java new file mode 100644 index 0000000000..d9ed88ffee --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UIMenuUI.java @@ -0,0 +1,83 @@ +package com.fr.design.gui.imenu; + +import com.fr.design.constants.UIConstants; +import com.fr.stable.Constants; +import com.fr.design.utils.gui.GUIPaintUtils; +import sun.swing.SwingUtilities2; + +import javax.swing.*; +import javax.swing.plaf.basic.BasicMenuUI; +import java.awt.*; + +public class UIMenuUI extends BasicMenuUI { + @Override + protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) { + super.paintBackground(g, menuItem, bgColor); + ButtonModel model = menuItem.getModel(); + Color oldColor = g.getColor(); + int menuWidth = menuItem.getWidth(); + int menuHeight = menuItem.getHeight(); + if (menuItem.isOpaque()) { + if (menuItem.getParent() instanceof JPopupMenu && model.isSelected()) { + g.setColor(UIConstants.UI_MENU_BACKGOURND); + g.fillRect(0, 0, menuWidth, menuHeight); + GUIPaintUtils.fillPaint((Graphics2D) g, 30, 0, menuWidth - 30, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 7); + } else if (model.isSelected()) { + paintPressed(g, menuWidth, menuHeight); + } else { + paintRollOver(g, menuWidth, menuHeight); + } + g.setColor(oldColor); + } else if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) { + g.setColor(bgColor); + g.fillRect(0, 0, menuWidth, menuHeight); + g.setColor(oldColor); + } + } + + protected void paintPressed(Graphics g, int w, int h) { + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(UIConstants.UI_MENU_BACKGOURND); + g2d.fillRect(0, 0, w, h); + g2d.setColor(UIConstants.LINE_COLOR); + g2d.drawLine(0, 0, 0, h - 1); + g2d.drawLine(w - 1, 0, w - 1, h - 1); + } + + protected void paintRollOver(Graphics g, int w, int h) { + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(UIConstants.UI_MENU_BACKGOURND); + g2d.fillRect(0, 0, w, h); + } + + protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) { + ButtonModel model = menuItem.getModel(); + FontMetrics fm = SwingUtilities2.getFontMetrics(menuItem, g); + int mnemIndex = -1; + + if (!model.isEnabled()) { + // *** paint the text disabled + if (UIManager.get("MenuItem.disabledForeground") instanceof Color) { + g.setColor(UIManager.getColor("MenuItem.disabledForeground")); + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, + mnemIndex, textRect.x, textRect.y + fm.getAscent()); + } else { + g.setColor(menuItem.getBackground().brighter()); + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, + mnemIndex, textRect.x, textRect.y + fm.getAscent()); + g.setColor(menuItem.getBackground().darker()); + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, + mnemIndex, textRect.x - 1, textRect.y + + fm.getAscent() - 1); + } + } else { + // *** paint the text normally + if (model.isArmed() || (menuItem instanceof JMenu && menuItem.isSelected() && menuItem.getIcon() != null)) { + g.setColor(Color.WHITE); // Uses protected field. + } + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, + mnemIndex, textRect.x, textRect.y + fm.getAscent()); + } + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/imenu/UIPopupEastAttrMenu.java b/designer-base/src/com/fr/design/gui/imenu/UIPopupEastAttrMenu.java similarity index 100% rename from designer_base/src/com/fr/design/gui/imenu/UIPopupEastAttrMenu.java rename to designer-base/src/com/fr/design/gui/imenu/UIPopupEastAttrMenu.java diff --git a/designer-base/src/com/fr/design/gui/imenu/UIPopupMenu.java b/designer-base/src/com/fr/design/gui/imenu/UIPopupMenu.java new file mode 100644 index 0000000000..b97315827c --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UIPopupMenu.java @@ -0,0 +1,48 @@ +package com.fr.design.gui.imenu; + +import java.awt.*; +import java.awt.geom.RoundRectangle2D; + +import javax.swing.*; + +import com.fr.design.constants.UIConstants; + +public class UIPopupMenu extends JPopupMenu{ + private static final float REC = 8f; + private boolean onlyText = false; + public UIPopupMenu() { + super(); + setBackground(UIConstants.NORMAL_BACKGROUND); + } + + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + Shape shape = null; + shape = new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), REC, REC); + g2d.setClip(shape); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + super.paintComponent(g2d); + } + + @Override + protected void paintBorder(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + int rec = (int) REC; + g2d.setColor(UIConstants.UIPOPUPMENU_LINE_COLOR); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, rec, rec); + } + + @Override + public Insets getInsets() { + if(onlyText) { + return super.getInsets(); + } + return new Insets(10, 2, 10, 10); + } + + public void setOnlyText(boolean onlyText) { + this.onlyText = onlyText; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/imenu/UIPopupMenuBorder.java b/designer-base/src/com/fr/design/gui/imenu/UIPopupMenuBorder.java new file mode 100644 index 0000000000..6bb021fae1 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UIPopupMenuBorder.java @@ -0,0 +1,62 @@ +package com.fr.design.gui.imenu; + +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.UIResource; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-1-2 + * Time: 上午10:10 + */ +public class UIPopupMenuBorder extends AbstractBorder implements UIResource { + + /** + * Draws a simple 3d border for the given component. + * + * @param mainColor The component to draw its border. + * @param g The graphics context. + * @param x The x coordinate of the top left corner. + * @param y The y coordinate of the top left corner. + * @param w The width. + * @param h The height. + */ + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + + g.translate(x, y); + // Inner highlight: + g.setColor(new ColorUIResource(255, 255, 255)); + g.drawLine(1, 1, w - 3, 1); + g.drawLine(1, 1, 1, h - 3); + + // Inner shadow: + g.setColor(new ColorUIResource(213, 212, 207)); + g.drawLine(w - 2, 1, w - 2, h - 2); + g.drawLine(1, h - 2, w - 2, h - 2); + + // Outer highlight: + g.setColor(new ColorUIResource(173, 170, 153)); + g.drawLine(0, 0, w - 2, 0); + g.drawLine(0, 0, 0, h - 1); + + // Outer shadow: + g.setColor(new ColorUIResource(173, 170, 153)); + g.drawLine(w - 1, 0, w - 1, h - 1); + g.drawLine(0, h - 1, w - 1, h - 1); + g.translate(-x, -y); + + } + + /** + * Gets the border insets for a given component. + * + * @param mainColor The component to get its border insets. + * @return Always returns the same insets as defined in insets. + */ + public Insets getBorderInsets(Component c) { + return new Insets(2, 2, 2, 2); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/imenu/UIPopupMenuSeparatorUI.java b/designer-base/src/com/fr/design/gui/imenu/UIPopupMenuSeparatorUI.java new file mode 100644 index 0000000000..77e8ad7ddd --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenu/UIPopupMenuSeparatorUI.java @@ -0,0 +1,29 @@ +package com.fr.design.gui.imenu; + + +import com.fr.design.constants.UIConstants; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.metal.MetalSeparatorUI; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-1-2 + * Time: 上午10:00 + */ +public class UIPopupMenuSeparatorUI extends MetalSeparatorUI { + public static ComponentUI createUI(JComponent c) { + return new UIPopupMenuSeparatorUI(); + } + + + public void paint(Graphics g, JComponent c) { + Dimension s = c.getSize(); + g.setColor(UIConstants.UIPOPUPMENU_LINE_COLOR); + g.drawLine(2, 1, s.width - 3, 1); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/imenu/UIScrollMenu.java b/designer-base/src/com/fr/design/gui/imenu/UIScrollMenu.java similarity index 100% rename from designer_base/src/com/fr/design/gui/imenu/UIScrollMenu.java rename to designer-base/src/com/fr/design/gui/imenu/UIScrollMenu.java diff --git a/designer_base/src/com/fr/design/gui/imenu/UIScrollMenuDemo.java b/designer-base/src/com/fr/design/gui/imenu/UIScrollMenuDemo.java similarity index 100% rename from designer_base/src/com/fr/design/gui/imenu/UIScrollMenuDemo.java rename to designer-base/src/com/fr/design/gui/imenu/UIScrollMenuDemo.java diff --git a/designer_base/src/com/fr/design/gui/imenu/UIScrollPopUpMenu.java b/designer-base/src/com/fr/design/gui/imenu/UIScrollPopUpMenu.java similarity index 100% rename from designer_base/src/com/fr/design/gui/imenu/UIScrollPopUpMenu.java rename to designer-base/src/com/fr/design/gui/imenu/UIScrollPopUpMenu.java diff --git a/designer-base/src/com/fr/design/gui/imenutable/UIMenuNameableCreator.java b/designer-base/src/com/fr/design/gui/imenutable/UIMenuNameableCreator.java new file mode 100644 index 0000000000..bc593c00a1 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenutable/UIMenuNameableCreator.java @@ -0,0 +1,69 @@ +package com.fr.design.gui.imenutable; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.general.FRLogger; +import com.fr.stable.Nameable; + +public class UIMenuNameableCreator implements Nameable{ + + protected String name; + protected Object obj; + protected Class paneClazz; + + public UIMenuNameableCreator(String name, Object obj, Class paneClazz) { + this.name = name; + this.obj = obj; + this.paneClazz = paneClazz; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + public Object getObj() { + return obj; + } + + public void setObj(Object obj) { + this.obj = obj; + } + + public Class getPaneClazz() { + return paneClazz; + } + + /** + * 覆盖的clone方法 + */ + public UIMenuNameableCreator clone() { + Object cloneObj = null; + try { + cloneObj = obj.getClass().newInstance(); + } catch (InstantiationException e) { + FRLogger.getLogger().error("UIMenuNameableCreator InstantiationException"); + } catch (IllegalAccessException e) { + FRLogger.getLogger().error("UIMenuNameableCreator IllegalAccessException"); + } + return new UIMenuNameableCreator(name, cloneObj, this.paneClazz); + + } + + public BasicBeanPane getPane() { + try { + return this.paneClazz.newInstance(); + } catch (InstantiationException e) { + + } catch (IllegalAccessException e) { + + } + return null; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/imenutable/UIMenuTable.java b/designer-base/src/com/fr/design/gui/imenutable/UIMenuTable.java new file mode 100644 index 0000000000..b339307906 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenutable/UIMenuTable.java @@ -0,0 +1,232 @@ +package com.fr.design.gui.imenutable; + +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.UIConstants; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.dialog.UIDialog; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itable.UITable; +import com.fr.design.hyperlink.ReportletHyperlinkPane; +import com.fr.design.hyperlink.WebHyperlinkPane; +import com.fr.design.javascript.EmailPane; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.Inter; +import com.fr.js.EmailJavaScript; +import com.fr.js.ReportletHyperlink; +import com.fr.js.WebHyperlink; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.TableUI; +import javax.swing.table.TableCellRenderer; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +public class UIMenuTable extends JTable { + protected int selectedRowIndex = -1; + protected int rollOverRowIndex = -1; + protected int draggingIndex = -1; + + public UIMenuTable() { + super(new UIMenuTableDataModel()); + initComponents(); + } + + public void populateBean(List values) { + ((UIMenuTableDataModel)dataModel).populateBean(values); + } + + public List updateBean() { + return ((UIMenuTableDataModel)dataModel).updateBean(); + } + + public void editingEvent(int rowIndex, int mouseY) { + selectedRowIndex = rowIndex; + repaint(); + + final UIMenuNameableCreator nameObject = UIMenuTable.this.getLine(rowIndex); + + final BasicBeanPane baseShowPane = nameObject.getPane(); + + final Object showValue = nameObject.getObj(); + + baseShowPane.populateBean(showValue); + + UIDialog dialog = baseShowPane.showUnsizedWindow(SwingUtilities.getWindowAncestor(new JPanel()), new DialogActionAdapter() { + public void doOk() { + baseShowPane.updateBean(showValue); + fireTargetChanged(); + } + }); + + dialog.setSize(500, 600); + GUICoreUtils.centerWindow(dialog); + + dialog.setVisible(true); + } + + protected Color getRenderBackground(int row) { + if(selectedRowIndex == row ) { + return UIConstants.SKY_BLUE; + } else { + return (rollOverRowIndex == row) ? UIConstants.LIGHT_BLUE : UIConstants.NORMAL_BACKGROUND; + } + } + + /** + * + * @param value 该行列的值(字符串) + * @param row + * @param column + * @return 列表中默认显示的东西,如果有很多内容,可以装载一个JPanel里再嵌进来 + */ + protected JComponent getRenderCompoment(Object value, int row,int column) { + UILabel text = new UILabel(); + if(value != null) { + text.setText(value.toString()); + } + return text; + } + + /** + * @param line 该行的内容 + * 在table底部增加一行内容 + */ + public void addLine(UIMenuNameableCreator line) { + ((UIMenuTableDataModel)dataModel).addLine(line); + } + + /** + * @param rowIndex + * @return 某一行的内容 + */ + public UIMenuNameableCreator getLine(int rowIndex) { + return ((UIMenuTableDataModel)dataModel).getLine(rowIndex); + } + + /** + * 删除某行内容 + * @param rowIndex + */ + public void removeLine(int rowIndex) { + ((UIMenuTableDataModel)dataModel).removeLine(rowIndex); + } + + /** + * 清除所有的内容 + */ + public void clearAll() { + int rowCount = dataModel.getRowCount(); + for(int i = 0; i < rowCount; i++) { + removeLine(i); + } + } + + /** + * 对某一行拖动时进行排序 + * @param rowIndex + * @param positive 鼠标移动的距离 + */ + public void dragSort(int rowIndex, boolean positive) { + ((UIMenuTableDataModel)dataModel).dragSort(rowIndex, positive); + } + + @Override + public boolean isCellEditable(int row, int column) { + if(column == 0) { + return false; + } else { + return super.isCellEditable(row, column); + } + } + + @Override + public TableUI getUI() { + return new UIMenuTableUI(); + } + + private void initComponents() { + setShowGrid(false); + setRowHeight(20); + setDragEnabled(false); + setDefaultRenderer(UITable.class, new UITableRender()); + setUI(getUI()); + } + + @Override + public TableCellRenderer getDefaultRenderer(Class columnClass) { + columnClass = UITable.class; + return super.getDefaultRenderer(columnClass); + } + + private class UITableRender implements TableCellRenderer { + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, boolean isSelected, boolean hasFocus, int row, + int column) { + JPanel pane = new JPanel(new BorderLayout(4,0)); + Color back = getRenderBackground(row); + pane.setBackground(back); + + if(draggingIndex == row) { + return pane; + } + pane.add(getRenderCompoment(value, row, column), BorderLayout.CENTER); + return pane; + } + } + + protected void setRollOverRowIndex(int rowIndex) { + this.rollOverRowIndex = rowIndex; + } + + protected void setDraggingRowIndex(int rowIndex) { + this.draggingIndex = rowIndex; + } + + public void fireTargetChanged() { + repaint(); + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener)listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + } + + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel)jf.getContentPane(); + content.setLayout(new BorderLayout()); + List data = new ArrayList(); + UIMenuNameableCreator reportlet = new UIMenuNameableCreator(Inter.getLocText("Reportlet"), + new ReportletHyperlink(), ReportletHyperlinkPane.class); + + UIMenuNameableCreator email = new UIMenuNameableCreator(Inter.getLocText("Email"), + new EmailJavaScript(), EmailPane.class); + + UIMenuNameableCreator web = new UIMenuNameableCreator(Inter.getLocText("Hyperlink-Web_link"), + new WebHyperlink(), WebHyperlinkPane.class ); + data.add(reportlet); + data.add(email); + data.add(web); + UIMenuTable pane = new UIMenuTable(); + pane.populateBean(data); + content.add(pane, BorderLayout.CENTER); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/imenutable/UIMenuTableDataModel.java b/designer-base/src/com/fr/design/gui/imenutable/UIMenuTableDataModel.java new file mode 100644 index 0000000000..bffa3f8f0f --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenutable/UIMenuTableDataModel.java @@ -0,0 +1,119 @@ +package com.fr.design.gui.imenutable; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.event.TableModelListener; +import javax.swing.table.TableModel; + + +public class UIMenuTableDataModel implements TableModel{ + private List values; + + public UIMenuTableDataModel() { + values = new ArrayList(); + } + + + public void populateBean(List values) { + if(values == null) { + return; + } + this.values.clear(); + this.values = values; + } + + public List updateBean() { + return values; + } + + public void dragSort(int rowIndex, boolean positive) { + if(values == null || rowIndex == -1) { + return; + } + + if(positive && rowIndex < values.size() - 1) { + UIMenuNameableCreator tmp = values.get(rowIndex); + values.set(rowIndex, values.get(rowIndex + 1)); + values.set(rowIndex + 1, tmp); + tmp = null; + } else if(!positive && rowIndex > 1) { + UIMenuNameableCreator tmp = values.get(rowIndex); + values.set(rowIndex, values.get(rowIndex - 1)); + values.set(rowIndex - 1, tmp); + tmp = null; + } + } + + public UIMenuNameableCreator getLine(int rowIndex) { + if(rowIndex >= values.size() || rowIndex < 0) { + return null; + } + return values.get(rowIndex); + } + + public void removeLine(int rowIndex) { + if(rowIndex >= values.size() || rowIndex < 0) { + return; + } + values.remove(rowIndex); + } + + public void addLine(UIMenuNameableCreator line) { + values.add(line); + } + + @Override + public int getRowCount() { + return values.size(); + } + + @Override + public int getColumnCount() { + return 1; + } + + @Override + public String getColumnName(int columnIndex) { + return null; + } + + @Override + public Class getColumnClass(int columnIndex) { + return null; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return true; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + if(rowIndex >= values.size()) { + return null; + } + return values.get(rowIndex).getName(); + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + if(rowIndex >= values.size()) { + return; + } + values.get(rowIndex).setName(aValue.toString()); + } + + @Override + public void addTableModelListener(TableModelListener l) { + // TODO Auto-generated method stub + + } + + @Override + public void removeTableModelListener(TableModelListener l) { + // TODO Auto-generated method stub + + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/imenutable/UIMenuTableUI.java b/designer-base/src/com/fr/design/gui/imenutable/UIMenuTableUI.java new file mode 100644 index 0000000000..b2495f5d7e --- /dev/null +++ b/designer-base/src/com/fr/design/gui/imenutable/UIMenuTableUI.java @@ -0,0 +1,124 @@ +package com.fr.design.gui.imenutable; + +import java.awt.Graphics2D; +import java.awt.event.MouseEvent; + +import javax.swing.CellRendererPane; +import javax.swing.JComponent; +import javax.swing.JOptionPane; +import javax.swing.event.MouseInputListener; + +import com.fr.base.GraphHelper; +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.itable.UITableUI; +import com.fr.design.mainframe.DesignerContext; +import com.fr.general.Inter; +import com.fr.stable.StringUtils; + +public class UIMenuTableUI extends UITableUI{ + private UIMenuTable uiTable; + + protected void startDragTab(MouseEvent e) { + rollOverRowIndex = -1; + dragStartY = e.getY(); + dragStartRowIndex = table.rowAtPoint(e.getPoint()); + uiTable.setDraggingRowIndex(table.rowAtPoint(e.getPoint())); + uiTable.setRollOverRowIndex(-1); + } + + protected void resetDragTab() { + dragStartY = -1; + dragEndY = -1; + isReleased = true; + uiTable.setDraggingRowIndex(-1); + uiTable.setRollOverRowIndex(-1); + } + + protected void paintDragTab(Graphics2D g2d) { + if(dragEndY != -1 && dragEndY <= table.getHeight() + table.getRowHeight()) { + g2d.setColor(UIConstants.LIGHT_BLUE); + g2d.fillRect(0, dragEndY, table.getWidth(), table.getRowHeight()); + UIMenuNameableCreator values = uiTable.getLine(dragStartRowIndex); + if(values == null) { + return; + } + g2d.setColor(UIConstants.LINE_COLOR); + String text = values.getName(); + if(!StringUtils.isEmpty(text)) { + GraphHelper.drawString(g2d, text, 0, dragEndY + table.getRowHeight() - 5); + } + } + } + + public void installUI(JComponent c) { + table = (UIMenuTable)c; + uiTable = (UIMenuTable) table; + rendererPane = new CellRendererPane(); + table.add(rendererPane); + installDefaults(); + installListeners(); + installKeyboardActions(); + } + + protected MouseInputListener createMouseInputListener() { + return new MyMouseListener() { + public void mouseMoved(MouseEvent e) { + int tmp = table.rowAtPoint(e.getPoint()); + if(rollOverRowIndex != tmp && isReleased) { + rollOverRowIndex = tmp; + uiTable.setRollOverRowIndex(rollOverRowIndex); + table.repaint(); + } + } + + @Override + public void mousePressed(MouseEvent e) { + if (e.getX() >= table.getWidth() - 20) { + int val = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Utils-Are_you_sure_to_remove_the_selected_item") + "?", + Inter.getLocText("Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (val == JOptionPane.OK_OPTION) { + uiTable.removeLine(table.rowAtPoint(e.getPoint())); + uiTable.fireTargetChanged(); + uiTable.getParent().doLayout(); + } + } + } + + @Override + public void mouseReleased(MouseEvent e) { + if(!isReleased) { + resetDragTab(); + } + } + + @Override + public void mouseClicked(MouseEvent e) { + int rowIndex = table.rowAtPoint(e.getPoint()); + int columnIndex = table.columnAtPoint(e.getPoint()); + if ((rowIndex == -1) || (columnIndex == -1)) { + return; + } + uiTable.editingEvent(rowIndex, e.getLocationOnScreen().y); + } + + @Override + public void mouseDragged(MouseEvent e) { + + if(isReleased) { + startDragTab(e); + } + isReleased = false; + dragEndY = e.getY(); + int dierta = dragEndY - dragStartY; + if(Math.abs(dierta) >= table.getRowHeight()) { + uiTable.dragSort(dragStartRowIndex, dierta > 0); + uiTable.fireTargetChanged(); + startDragTab(e); + return; + } + + table.repaint(); + } + }; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ipasswordfield/UIPassWordField.java b/designer-base/src/com/fr/design/gui/ipasswordfield/UIPassWordField.java new file mode 100644 index 0000000000..0aad7ee918 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ipasswordfield/UIPassWordField.java @@ -0,0 +1,72 @@ +package com.fr.design.gui.ipasswordfield; + + +import com.fr.design.constants.UIConstants; + +import javax.swing.*; +import javax.swing.text.Document; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * Created with IntelliJ IDEA. + * User: 小灰灰 + * Date: 13-7-22 + * Time: 下午4:44 + * To change this template use File | Settings | File Templates. + */ +public class UIPassWordField extends JPasswordField { + private boolean isRollOver; + + public UIPassWordField() { + super(); + addRollOverListener(); + } + + public UIPassWordField(String text) { + super(text); + addRollOverListener(); + } + + public UIPassWordField(int columns) { + super(columns); + addRollOverListener(); + } + + public UIPassWordField(String text, int columns) { + super(text, columns); + addRollOverListener(); + } + + public UIPassWordField(Document doc, String txt, int columns) { + super(doc, txt, columns); + addRollOverListener(); + } + + private void addRollOverListener() { + this.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + isRollOver = true; + UIPassWordField.this.repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + isRollOver = false; + UIPassWordField.this.repaint(); + } + }); + } + + @Override + protected void paintBorder(Graphics g) { + if (isRollOver && this.isEnabled()) { + g.setColor(UIConstants.TEXT_FILED_BORDER_SELECTED); + g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); + } else { + super.paintBorder(g); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ipoppane/PopupHider.java b/designer-base/src/com/fr/design/gui/ipoppane/PopupHider.java new file mode 100644 index 0000000000..aee3f06ed5 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ipoppane/PopupHider.java @@ -0,0 +1,5 @@ +package com.fr.design.gui.ipoppane; + +public interface PopupHider { + public void hidePopupMenu(); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/iprogressbar/AutoProgressBar.java b/designer-base/src/com/fr/design/gui/iprogressbar/AutoProgressBar.java new file mode 100644 index 0000000000..06a09cd878 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/iprogressbar/AutoProgressBar.java @@ -0,0 +1,50 @@ +package com.fr.design.gui.iprogressbar; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-6-5 + * Time: 下午3:52 + * To change this template use File | Settings | File Templates. + */ +public abstract class AutoProgressBar implements MonitorCancelWork{ + private ProgressMonitor monitor; + private Timer timer; + private int i; + + public AutoProgressBar(Component parentComponent, Object message, String note, int min, int max) { + monitor = new ProgressMonitor(parentComponent, message, note, min, max); + monitor.setProgress(0); + monitor.setMillisToDecideToPopup(0); + timer = new Timer(50, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + i = i > 99 ? 0 : i; + monitor.setProgress(i); + i++; + if (monitor.isCanceled()) { + doMonitorCanceled(); + timer.stop(); + } + } + }); + } + + public void start() { + i = 0; + timer.start(); + } + + public void close() { + timer.stop(); + monitor.setProgress(100); + monitor.close(); + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/iprogressbar/FRProgressBar.java b/designer-base/src/com/fr/design/gui/iprogressbar/FRProgressBar.java new file mode 100644 index 0000000000..3bb35f24c5 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/iprogressbar/FRProgressBar.java @@ -0,0 +1,43 @@ +package com.fr.design.gui.iprogressbar; + +import javax.swing.*; +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +public class FRProgressBar { + private ProgressMonitor monitor; + private SwingWorker worker; + + public FRProgressBar(SwingWorker worker, Component parentComponent, Object message, String note, int min, int max) { + monitor = new ProgressMonitor(parentComponent, message, note, min, max); + monitor.setProgress(0); + monitor.setMillisToDecideToPopup(0); + this.worker = worker; + + this.worker.addPropertyChangeListener(new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + int progress = FRProgressBar.this.worker.getProgress(); + monitor.setProgress(progress); + + if (ismonitorCanceled()) { + FRProgressBar.this.worker.cancel(true); + } + } + }); + } + + public void start() { + this.worker.execute(); + } + + public void close() { + monitor.close(); + } + + public boolean ismonitorCanceled() { + return monitor.isCanceled(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/iprogressbar/MonitorCancelWork.java b/designer-base/src/com/fr/design/gui/iprogressbar/MonitorCancelWork.java new file mode 100644 index 0000000000..9e6f593d3f --- /dev/null +++ b/designer-base/src/com/fr/design/gui/iprogressbar/MonitorCancelWork.java @@ -0,0 +1,12 @@ +package com.fr.design.gui.iprogressbar; + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-6-5 + * Time: 下午7:24 + * To change this template use File | Settings | File Templates. + */ +public interface MonitorCancelWork { + public void doMonitorCanceled(); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/iprogressbar/UIProgressBarBorder.java b/designer-base/src/com/fr/design/gui/iprogressbar/UIProgressBarBorder.java new file mode 100644 index 0000000000..070d53bc07 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/iprogressbar/UIProgressBarBorder.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.iprogressbar; + +import com.fr.design.utils.DrawRoutines; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.border.AbstractBorder; +import javax.swing.plaf.UIResource; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-4 + * Time: 上午11:03 + */ +public class UIProgressBarBorder extends AbstractBorder implements UIResource { + protected static final Insets INSETS_YQ = new Insets(3, 3, 3, 3); + + /** + * Draws the button border for the given component. + * + * @param c The component to draw its border. + * @param g The graphics context. + * @param x The x coordinate of the top left corner. + * @param y The y coordinate of the top left corner. + * @param w The width. + * @param h The height. + */ + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + DrawRoutines.drawProgressBarBorder(g, + ThemeUtils.PROCESS_BORDER_COLOR, x, y, w, h); + + DrawRoutines.drawProgressBarBorder(g, + ThemeUtils.PROCESS_DARK_COLOR, x + 1, y + 1, w - 2, h - 2); + + + w -= 4; + h -= 4; + x += 2; + y += 2; + g.setColor(ThemeUtils.PROCESS_LIGHT_COLOR); + // rect + g.drawLine(x + 1, y, x + w - 2, y); + g.drawLine(x, y + 1, x, y + h - 2); + + // track + g.setColor(ThemeUtils.PROCESS_TRACK_COLOR); + g.drawLine(x + 1, y + h - 1, x + w - 2, y + h - 1); + g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 2); + + } + + /** + * Gets the border insets for a given component. + * + * @param c The component to get its border insets. + * @return Always returns the same insets as defined in insets. + */ + public Insets getBorderInsets(Component c) { + return INSETS_YQ; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/iprogressbar/UIProgressBarUI.java b/designer-base/src/com/fr/design/gui/iprogressbar/UIProgressBarUI.java new file mode 100644 index 0000000000..4d9d34ba05 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/iprogressbar/UIProgressBarUI.java @@ -0,0 +1,409 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.iprogressbar; + +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.ColorRoutines; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicProgressBarUI; +import java.awt.*; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.util.HashMap; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-4 + * Time: 上午10:41 + */ +public class UIProgressBarUI extends BasicProgressBarUI { + + static HashMap cache = new HashMap(); + + /* "Override" the dimensions from BasicProgressBarUI */ + private static final Dimension PREFERRED_YQ_HORIZONTAL = new Dimension(146, 7); + private static final Dimension PREFERRED_YQ_VERTICAL = new Dimension(7, 146); + + protected Dimension getPreferredInnerHorizontal() { + return PREFERRED_YQ_HORIZONTAL; + } + + protected Dimension getPreferredInnerVertical() { + return PREFERRED_YQ_VERTICAL; + } + + /** + * 创建UI + * + * @param c 组件 + * @return 组件UI + */ + public static ComponentUI createUI(JComponent c) { + return new UIProgressBarUI(); + } + + protected void paintDeterminate(Graphics g, JComponent c) { + Insets b = progressBar.getInsets(); // area for border + int barRectWidth = progressBar.getWidth() - (b.right + b.left); + int barRectHeight = progressBar.getHeight() - (b.top + b.bottom); + + if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) { + int amountFull = getAmountFull(b, barRectWidth, barRectHeight); + drawXpHorzProgress(g, b.left, b.top, barRectWidth, barRectHeight, amountFull); + // Deal with possible text painting + if (progressBar.isStringPainted()) { + g.setFont(c.getFont()); + paintString(g, b.left, b.top, barRectWidth, barRectHeight, amountFull, b); + } + } else { // VERTICAL + int amountFull = getAmountFull(b, barRectWidth, barRectHeight); + drawXpVertProgress(g, b.left, b.top, barRectWidth, barRectHeight, amountFull); + // Deal with possible text painting + if (progressBar.isStringPainted()) { + g.setFont(c.getFont()); + paintString(g, b.left, b.top, barRectWidth, barRectHeight, amountFull, b); + } + } + } + + // draw determinate + private void drawXpHorzProgress(Graphics g, int x, int y, + int w, int h, int amountFull) { + g.translate(x, y); + if (!progressBar.isOpaque()) { + g.setColor(progressBar.getBackground()); + g.fillRect(0, 0, w, h); + } + ProgressKey key = new ProgressKey( + progressBar.getForeground(), true, h); + Object value = cache.get(key); + if (value == null) { + // create new image + Image img = new BufferedImage(6, h, BufferedImage.TYPE_INT_ARGB); + Graphics imgGraphics = img.getGraphics(); + // draw into image graphics + Color c = progressBar.getForeground(); + Color c2 = ColorRoutines.lighten(c, 15); + Color c3 = ColorRoutines.lighten(c, 35); + Color c4 = ColorRoutines.lighten(c, 60); + imgGraphics.setColor(c4); + imgGraphics.drawLine(0, 0, 5, 0); + imgGraphics.drawLine(0, h - 1, 5, h - 1); + imgGraphics.setColor(c3); + imgGraphics.drawLine(0, 1, 5, 1); + imgGraphics.drawLine(0, h - 2, 5, h - 2); + imgGraphics.setColor(c2); + imgGraphics.drawLine(0, 2, 5, 2); + imgGraphics.drawLine(0, h - 3, 5, h - 3); + imgGraphics.setColor(c); + imgGraphics.fillRect(0, 3, 6, h - 6); + // dispose of image graphics + imgGraphics.dispose(); + cache.put(key, img); + value = img; + } + int mx = 0; + while (mx < amountFull) { + if (mx + 6 > w) { + // paint partially + g.drawImage((Image) value, mx, 0, w - mx, h, progressBar); + } else { + g.drawImage((Image) value, mx, 0, progressBar); + } + mx += 8; + } + g.translate(-x, -y); + } + + + // draw determinate + private void drawXpVertProgress(Graphics g, int x, int y, + int w, int h, int amountFull) { + g.translate(x, y); + // paint the track + if (!progressBar.isOpaque()) { + g.setColor(progressBar.getBackground()); + g.fillRect(0, 0, w, h); + } + ProgressKey key = new ProgressKey( + progressBar.getForeground(), false, w); + Object value = cache.get(key); + if (value == null) { + // create new image + Image img = new BufferedImage(w, 6, BufferedImage.TYPE_INT_ARGB); + Graphics imgGraphics = img.getGraphics(); + Color c = progressBar.getForeground(); + Color c2 = ColorRoutines.lighten(c, 15); + Color c3 = ColorRoutines.lighten(c, 35); + Color c4 = ColorRoutines.lighten(c, 60); + imgGraphics.setColor(c4); + imgGraphics.drawLine(0, 0, 0, 5); + imgGraphics.drawLine(w - 1, 0, w - 1, 5); + imgGraphics.setColor(c3); + imgGraphics.drawLine(1, 0, 1, 5); + imgGraphics.drawLine(w - 2, 0, w - 2, 5); + imgGraphics.setColor(c2); + imgGraphics.drawLine(2, 0, 2, 5); + imgGraphics.drawLine(w - 3, 0, w - 3, 5); + imgGraphics.setColor(c); + imgGraphics.fillRect(3, 0, w - 6, 6); + imgGraphics.dispose(); + cache.put(key, img); + value = img; + } + // paints bottom to top... + int my = 0; + while (my < amountFull) { + if (my + 6 > h) { + // paint partially + g.drawImage((Image) value, 0, + 0, w, h - my, progressBar); + } else { + g.drawImage((Image) value, 0, h - my - 6, progressBar); + } + + my += 8; + } + g.translate(-x, -y); + } + + protected void paintIndeterminate(Graphics g, JComponent c) { + Insets b = progressBar.getInsets(); // area for border + int barRectWidth = progressBar.getWidth() - (b.right + b.left); + int barRectHeight = progressBar.getHeight() - (b.top + b.bottom); + + Rectangle boxRect = new Rectangle(); + + try { + boxRect = getBox(boxRect); + } catch (NullPointerException ignore) { + } + + if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) { + drawXpHorzProgress(g, b.left, b.top, barRectWidth, barRectHeight, boxRect); + } else { + drawXpVertProgress(g, b.left, b.top, barRectWidth, barRectHeight, boxRect); + + } + + // Deal with possible text painting + if (progressBar.isStringPainted()) { + if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) { + paintString(g, b.left, b.top, barRectWidth, barRectHeight, boxRect.x, boxRect.width, b); + } else { + paintString(g, b.left, b.top, barRectWidth, barRectHeight, boxRect.y, boxRect.height, b); + } + } + } + + private void paintString(Graphics g, int x, int y, int width, int height, int fillStart, int amountFull, Insets b) { + if (!(g instanceof Graphics2D)) { + return; + } + + Graphics2D g2 = (Graphics2D) g; + String progressString = progressBar.getString(); + g2.setFont(progressBar.getFont()); + Point renderLocation = getStringPlacement(g2, progressString, x, y, width, height); + Rectangle oldClip = g2.getClipBounds(); + + if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) { + g2.setColor(getSelectionBackground()); + g2.drawString(progressString, renderLocation.x, renderLocation.y); + g2.setColor(getSelectionForeground()); + g2.clipRect(fillStart, y, amountFull, height); + g.drawString(progressString, renderLocation.x, renderLocation.y); + } else { // VERTICAL + g2.setColor(getSelectionBackground()); + AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2); + g2.setFont(progressBar.getFont().deriveFont(rotate)); + renderLocation = getStringPlacement(g2, progressString, x, y, width, height); + g2.drawString(progressString, renderLocation.x, renderLocation.y); + g2.setColor(getSelectionForeground()); + g2.clipRect(x, fillStart, width, amountFull); + g2.drawString(progressString, renderLocation.x, renderLocation.y); + } + g2.setClip(oldClip); + } + + /* + * Inserted this to fix a bug that came with 1.4.2_02 and caused NPE at + * javax.swing.plaf.basic.BasicProgressBarUI.updateSizes(BasicProgressBarUI.java:439). + * + * @see javax.swing.plaf.basic.BasicProgressBarUI#paintString(java.awt.Graphics, int, int, int, int, int, java.awt.Insets) + */ + protected void paintString(Graphics g, int x, int y, int width, + int height, int amountFull, Insets b) { + Rectangle boxRect = new Rectangle(); // * + try { // * The Fix + boxRect = getBox(boxRect); // * + } catch (NullPointerException ignore) { + } // * + + if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) { + if (progressBar.getComponentOrientation().isLeftToRight()) { + if (progressBar.isIndeterminate()) { + paintString(g, x, y, width, height, boxRect.x, boxRect.width, b); + } else { + paintString(g, x, y, width, height, x, amountFull, b); + } + } else { + paintString(g, x, y, width, height, x + width - amountFull, amountFull, b); + } + } else { + if (progressBar.isIndeterminate()) { + paintString(g, x, y, width, height, boxRect.y, boxRect.height, b); + } else { + paintString(g, x, y, width, height, y + height - amountFull, amountFull, b); + } + } + } + + + // draw indeterminate + private void drawXpHorzProgress(Graphics g, int x, int y, + int w, int h, Rectangle boxRect) { + // paint the track + if (!progressBar.isOpaque()) { + g.setColor(progressBar.getBackground()); + g.fillRect(x, y, w, h); + } + g.translate(boxRect.x, boxRect.y); + ProgressKey key = new ProgressKey( + progressBar.getForeground(), true, h); + Object value = cache.get(key); + if (value == null) { + // create new image + Image img = new BufferedImage(6, h, BufferedImage.TYPE_INT_ARGB); + Graphics imgGraphics = img.getGraphics(); + // draw into image graphics + Color c = progressBar.getForeground(); + Color c2 = ColorRoutines.lighten(c, 15); + Color c3 = ColorRoutines.lighten(c, 35); + Color c4 = ColorRoutines.lighten(c, 60); + imgGraphics.setColor(c4); + imgGraphics.drawLine(0, 0, 5, 0); + imgGraphics.drawLine(0, h - 1, 5, h - 1); + imgGraphics.setColor(c3); + imgGraphics.drawLine(0, 1, 5, 1); + imgGraphics.drawLine(0, h - 2, 5, h - 2); + imgGraphics.setColor(c2); + imgGraphics.drawLine(0, 2, 5, 2); + imgGraphics.drawLine(0, h - 3, 5, h - 3); + imgGraphics.setColor(c); + imgGraphics.fillRect(0, 3, 6, h - 6); + // dispose of image graphics + imgGraphics.dispose(); + cache.put(key, img); + value = img; + } + int mx = 0; + while (mx + 6 < boxRect.width) { + g.drawImage((Image) value, mx, 0, progressBar); + + mx += 8; + } + g.translate(-boxRect.x, -boxRect.y); + } + + // draw indeterminate + private void drawXpVertProgress(Graphics g, int x, int y, + int w, int h, Rectangle boxRect) { + // paint the track + if (!progressBar.isOpaque()) { + g.setColor(progressBar.getBackground()); + g.fillRect(x, y, w, h); + } + g.translate(boxRect.x, boxRect.y); + ProgressKey key = new ProgressKey( + progressBar.getForeground(), false, w); + Object value = cache.get(key); + if (value == null) { + // create new image + Image img = new BufferedImage(w, 6, BufferedImage.TYPE_INT_ARGB); + Graphics imgGraphics = img.getGraphics(); + // draw into image graphics + Color c = progressBar.getForeground(); + Color c2 = ColorRoutines.lighten(c, 15); + Color c3 = ColorRoutines.lighten(c, 35); + Color c4 = ColorRoutines.lighten(c, 60); + imgGraphics.setColor(c4); + imgGraphics.drawLine(0, 0, 0, 5); + imgGraphics.drawLine(w - 1, 0, w - 1, 5); + imgGraphics.setColor(c3); + imgGraphics.drawLine(1, 0, 1, 5); + imgGraphics.drawLine(w - 2, 0, w - 2, 5); + imgGraphics.setColor(c2); + imgGraphics.drawLine(2, 0, 2, 5); + imgGraphics.drawLine(w - 3, 0, w - 3, 5); + imgGraphics.setColor(c); + imgGraphics.fillRect(3, 0, w - 6, 6); + // dispose of image graphics + imgGraphics.dispose(); + cache.put(key, img); + value = img; + } + int my = 0; + while (my + 6 < boxRect.height) { + g.drawImage((Image) value, 0, my, progressBar); + + my += 8; + } + g.translate(-boxRect.x, -boxRect.y); + } + + protected Color getSelectionForeground() { + return ThemeUtils.PROCESS_SELECTED_FORECOLOR; + } + + protected Color getSelectionBackground() { + return ThemeUtils.PROCESS_SELECTED_BACKCOLOR; + } + + protected void installDefaults() { + LookAndFeel.installBorder(progressBar, "ProgressBar.border"); + LookAndFeel.installColorsAndFont(progressBar, + "ProgressBar.background", "ProgressBar.foreground", "ProgressBar.font"); + } + + /* + * ProgressKey is used as key in the cache HashMap. + * Overrides equals() and hashCode(). + */ + static class ProgressKey { + + private Color c; + private boolean horizontal; + private int size; + + ProgressKey(Color c, boolean horizontal, int size) { + this.c = c; + this.horizontal = horizontal; + this.size = size; + } + + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof ProgressKey)) { + return false; + } + ProgressKey other = (ProgressKey) o; + return ComparatorUtils.equals(size, other.size) && + ComparatorUtils.equals(horizontal, other.horizontal) && + ComparatorUtils.equals(c, other.c); + } + + public int hashCode() { + return c.hashCode() * (horizontal ? 1 : 2) * size; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/iscrollbar/UIBasicScrollBarUI.java b/designer-base/src/com/fr/design/gui/iscrollbar/UIBasicScrollBarUI.java new file mode 100644 index 0000000000..851f907977 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/iscrollbar/UIBasicScrollBarUI.java @@ -0,0 +1,348 @@ +package com.fr.design.gui.iscrollbar; + +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicScrollBarUI; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-17 + * Time: 上午9:58 + */ +public class UIBasicScrollBarUI extends BasicScrollBarUI { + + static final int ALPHA = 92; // 255 is full opaque + + private static final int WIDTH_GAP = 10; + + /** + * true if thumb is in rollover state + */ + protected boolean isRollover = false; + /** + * true if thumb was in rollover state + */ + protected boolean wasRollover = false; + + /** + * The free standing property of this scrollbar UI delegate. + */ + private boolean freeStanding = false; + + private int scrollBarWidth; + + public UIBasicScrollBarUI() { + } + + /** + * Installs some default values. + */ + protected void installDefaults() { + scrollBarWidth = UIScrollButton.size.width; + super.installDefaults(); + scrollbar.setBorder(null); + minimumThumbSize = new Dimension(17, 17); + } + + protected Dimension getMaximumThumbSize() { + return maximumThumbSize; + } + + /** + * 创建组件UI + * + * @param c 组件 + * @return 返回组件UI + */ + public static ComponentUI createUI(JComponent c) { + return new UIBasicScrollBarUI(); + } + + /** + * Creates the decrease button of the scrollbar. + * + * @param orientation The button's orientation. + * @return The created button. + */ + protected JButton createDecreaseButton(int orientation) { + return new UIScrollButton(orientation, this); + } + + /** + * Creates the increase button of the scrollbar. + * + * @param orientation The button's orientation. + * @return The created button. + */ + protected JButton createIncreaseButton(int orientation) { + return new UIScrollButton(orientation, this); + } + + /// From MetalUI + public Dimension getPreferredSize(JComponent c) { + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + return new Dimension(scrollBarWidth, scrollBarWidth * 3 + WIDTH_GAP); + } else // Horizontal + { + return new Dimension(scrollBarWidth * 3 + WIDTH_GAP, scrollBarWidth); + } + + } + + public void paintTrack(Graphics g, JComponent c, Rectangle t) { + // borders depend on the scrollbar's style + if (isThumbVisible()) { + g.setColor(ThemeUtils.SCROLL_TRACK_COLOR); + } else { + g.setColor(ThemeUtils.SCROLL_TRACK_DISABLED_COLOR); + } + + g.fillRect(t.x, t.y, t.width, t.height); + + if (isThumbVisible()) { + g.setColor(ThemeUtils.SCROLL_TRACK_BORDER_COLOR); + } else { + g.setColor(ThemeUtils.SCROLL_TRACK_BORDER_DISABLED_COLOR); + } + + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + g.drawLine(t.x, t.y, t.x, t.y + t.height - 1); + g.drawLine(t.x + t.width - 1, t.y, t.x + t.width - 1, t.y + t.height - 1); + } else { + g.drawLine(t.x, t.y, t.x + t.width - 1, t.y); + g.drawLine(t.x, t.y + t.height - 1, t.x + t.width - 1, t.y + t.height - 1); + } + } + + + public void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) { + drawXpThumb(g, thumbBounds); + } + + private void drawXpThumb(Graphics g, Rectangle t) { + Color color = null; + if (isDragging && isRollover) { + color = ThemeUtils.SCROLL_THUMB_PRESSED_COLOR; + } else if (isRollover && ThemeUtils.SCROLL_ROLLOVER) { + color = ThemeUtils.SCROLL_THUMB_ROLLOVER_COLOR; + } else { + color = ThemeUtils.SCROLL_THUMB_COLOR; + } + + g.setColor(color); + + int xs = t.x + 1; + int ys = t.y + 1; + int x2 = t.x + t.width - 1; + int y2 = t.y + t.height - 1; + + Color pressedColor = ThemeUtils.ROLLOVER_PRESSED_COLOR_8; + Color rolloverColor = ThemeUtils.ROLLOVER_PRESSED_COLOR_8; + Color normalColor = ThemeUtils.NORMAL__COLOR_8; + + switch (scrollbar.getOrientation()) { + //harry: 垂直滚动条和水平滚动条的画法分开。 + case JScrollBar.VERTICAL: + drawVertical(g, t, xs, ys, x2, pressedColor, rolloverColor, normalColor); + break; + case JScrollBar.HORIZONTAL: + drawHorizontal(g, t, xs, ys, x2, pressedColor, rolloverColor, normalColor); + break; + } + + // draw Grip +// if (t.height < 11) { +// return; +// } +// drawColorAndLength(g, t, x2, y2, color); + } + + private void drawColorAndLength(Graphics g, Rectangle t, int x2, int y2, Color color) { + + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + int y1 = t.y + (t.height) / 2 - 4; + y2 = Math.min(y1 + 8, t.y + t.height - 5); + + int y = y1; + // we take only saturation & brightness and apply them + // to the background color (normal/rollover/pressed) + g.setColor(UISBChooser.getAdjustedColor(color, 0, 71)); + while (y < y2) { + g.drawLine(5, y, 11, y); + y += 2; + } + + y = y1 + 1; + g.setColor(UISBChooser.getAdjustedColor(color, 0, -13)); + while (y < y2) { + g.drawLine(6, y, 12, y); + y += 2; + } + } else { + int x1 = t.x + (t.width) / 2 - 4; + x2 = Math.min(x1 + 8, t.x + t.width - 5); + + int x = x1 + 1; + // we take only saturation & brightness and apply them + // to the background color (normal/rollover/pressed) + g.setColor(UISBChooser.getAdjustedColor(color, 0, 71)); + while (x < x2) { + g.drawLine(x, 5, x, 11); + x += 2; + } + + x = x1; + g.setColor(UISBChooser.getAdjustedColor(color, 0, -13)); + while (x < x2) { + g.drawLine(x, 6, x, 12); + x += 2; + } + } + } + + + private void drawVertical(Graphics g, Rectangle t, int xs, int ys, int x2, + Color pressedColor, Color rolloverColor, + Color normalColor) { + Color a = ThemeUtils.SCROLL_BORDER_COLOR; + Graphics2D g2 = (Graphics2D) g; + GradientPaint scrollBarBg = null; + if (isDragging && isRollover) { + scrollBarBg = new GradientPaint(xs, ys, pressedColor, x2, ys, pressedColor); + } else if (isRollover && ThemeUtils.SCROLL_ROLLOVER) { + scrollBarBg = new GradientPaint(xs, ys, rolloverColor, x2, ys, rolloverColor); + } else { + scrollBarBg = new GradientPaint(xs, ys, normalColor, x2, ys, normalColor); + } + + g2.setPaint(scrollBarBg); + g2.fillRoundRect(xs, ys, t.width - 2, t.height - 2, 0, 0); + } + + private void drawHorizontal(Graphics g, Rectangle t, int xs, int ys, int y2, + Color pressedColor, Color rolloverColor, + Color normalColor) { + GradientPaint scrollBarBg = null; + Graphics2D g2H = (Graphics2D) g; + if (isDragging && isRollover) { + scrollBarBg = new GradientPaint(xs, ys, pressedColor, xs, y2, pressedColor); + } else if (isRollover && ThemeUtils.SCROLL_ROLLOVER) { + scrollBarBg = new GradientPaint(xs, ys, rolloverColor, xs, y2, rolloverColor); + } else { + scrollBarBg = new GradientPaint(xs, ys, normalColor, xs, y2, normalColor); + } + + g2H.setPaint(scrollBarBg); + g2H.fillRoundRect(xs, ys, t.width - 2, t.height - 2, 0, 0); + } + + /** + * 是否可见 + * + * @return 可见返回true + */ + public boolean isThumbVisible() { + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + return getThumbBounds().height > 0; + } else { + return getThumbBounds().width > 0; + } + } + + // From BasicUI + protected TrackListener createTrackListener() { + return new MyTrackListener(); + } + + /** + * Basically does BasicScrollBarUI.TrackListener the right job, it just needs + * an additional repaint and rollover management + */ + protected class MyTrackListener extends BasicScrollBarUI.TrackListener { + public void mouseReleased(MouseEvent e) { + super.mouseReleased(e); + scrollbar.repaint(); + } + + public void mousePressed(MouseEvent e) { + super.mousePressed(e); + scrollbar.repaint(); + } + + public void mouseEntered(MouseEvent e) { + isRollover = false; + wasRollover = false; + if (getThumbBounds().contains(e.getPoint())) { + isRollover = true; + wasRollover = isRollover; + scrollbar.repaint(); + } + } + + public void mouseExited(MouseEvent e) { + isRollover = false; + if (isRollover != wasRollover) { + wasRollover = isRollover; + scrollbar.repaint(); + } + } + + public void mouseDragged(MouseEvent e) { + if (getThumbBounds().contains(e.getPoint())) { + isDragging = true; + } + super.mouseDragged(e); + } + + public void mouseMoved(MouseEvent e) { + if (getThumbBounds().contains(e.getPoint())) { + isRollover = true; + if (isRollover != wasRollover) { + scrollbar.repaint(); + wasRollover = isRollover; + } + } else { + isRollover = false; + if (isRollover != wasRollover) { + scrollbar.repaint(); + wasRollover = isRollover; + } + } + } + } + + protected class OrientationChangeListener implements PropertyChangeListener { + + public void propertyChange(PropertyChangeEvent e) { + Integer orient = (Integer) e.getNewValue(); + + if (scrollbar.getComponentOrientation().isLeftToRight()) { + if (incrButton instanceof UIScrollButton) { + ((UIScrollButton) incrButton).setDirection(orient.intValue() == HORIZONTAL ? + EAST : SOUTH); + } + if (decrButton instanceof UIScrollButton) { + ((UIScrollButton) decrButton).setDirection(orient.intValue() == HORIZONTAL ? + WEST : NORTH); + } + } else { + if (incrButton instanceof UIScrollButton) { + ((UIScrollButton) incrButton).setDirection(orient.intValue() == HORIZONTAL ? + WEST : SOUTH); + } + if (decrButton instanceof UIScrollButton) { + ((UIScrollButton) decrButton).setDirection(orient.intValue() == HORIZONTAL ? + EAST : NORTH); + } + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/iscrollbar/UISBChooser.java b/designer-base/src/com/fr/design/gui/iscrollbar/UISBChooser.java new file mode 100644 index 0000000000..a6ba742830 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/iscrollbar/UISBChooser.java @@ -0,0 +1,452 @@ +package com.fr.design.gui.iscrollbar; + +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.ColorRoutines; + +import javax.swing.*; +import javax.swing.border.EtchedBorder; +import javax.swing.border.LineBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-17 + * Time: 上午10:16 + */ +public class UISBChooser extends JDialog { + private static final int VALUE = 100; + private static final int STEP_GAP = 10; + private static final int DECREASE = 38; + private static final int INCREASE = 40; + private static UISBChooser myInstance; + private static int sat, bri; + private Color reference, outColor; + private JSlider satSlider, briSlider; + private JTextField satField, briField; + private JTextField redField, greenField, blueField; + private TwoColorField twoColorField; + private ColorField referenceField; + private boolean keyInput = false; + private boolean valueIsAdjusting = false; + + public UISBChooser(Frame frame) { + super(frame, "Saturation/Lightness", true); + setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); + + setupUI(frame); + } + + private void setupUI(Frame frame) { + ChangeListener sliderAction = new SliderAction(); + JPanel p1 = new JPanel(new BorderLayout(12, 0)); + JPanel p2 = new JPanel(new GridLayout(2, 1, 0, 8)); + JPanel p3 = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 4)); + JPanel p4 = new JPanel(new BorderLayout(4, 0)); + // sliders + JPanel p5 = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); + initOther(sliderAction); + p4.add(new JLabel("Saturation"), BorderLayout.NORTH); + p4.add(satSlider, BorderLayout.CENTER); + p5.add(satField); + p4.add(p5, BorderLayout.EAST); + p2.add(p4); + p5 = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); + p4 = new JPanel(new BorderLayout(4, 0)); + p4.add(new JLabel("Lightness"), BorderLayout.NORTH); + p4.add(briSlider, BorderLayout.CENTER); + p5.add(briField); + p4.add(p5, BorderLayout.EAST); + p2.add(p4); + p3.add(p2); + p1.add(p3, BorderLayout.CENTER); + // color panel + p2 = new JPanel(new BorderLayout(0, 6)); + p3 = new JPanel(new FlowLayout(FlowLayout.LEFT, 4, 4)); + twoColorField = new TwoColorField(reference); + p2.add(twoColorField, BorderLayout.NORTH); + referenceField = new ColorField(reference); + p2.add(referenceField, BorderLayout.CENTER); + p3.add(p2); + p1.add(p3, BorderLayout.EAST); + // RGB fields + initP3(p3, p1); + pack(); + Dimension size = getSize(); + setLocation(frame.getLocationOnScreen().x + + (frame.getWidth() - getSize().width) / 2, + frame.getLocationOnScreen().y + + (frame.getHeight() - getSize().height) / 2); + } + + private void initP3(JPanel p3, JPanel p1) { + p3 = new JPanel(new FlowLayout(FlowLayout.LEFT, 3, 8)); + p3.add(new JLabel("R:")); + p3.add(redField); + p3.add(new JLabel(" G:")); + p3.add(greenField); + p3.add(new JLabel(" B:")); + p3.add(blueField); + p1.add(p3, BorderLayout.SOUTH); + getContentPane().add(p1, BorderLayout.CENTER); + // buttons + p3 = new JPanel(new FlowLayout(FlowLayout.RIGHT, 12, 4)); + p3.setBorder(new EtchedBorder()); + JButton b = new JButton("Cancel"); + b.addActionListener(new CancelAction()); + p3.add(b); + b = new JButton("OK"); + getRootPane().setDefaultButton(b); + b.addActionListener(new OKAction()); + p3.add(b); + getContentPane().add(p3, BorderLayout.SOUTH); + + } + + private void initOther(ChangeListener sliderAction) { + satSlider = new JSlider(-VALUE, VALUE, sat); + satSlider.addChangeListener(sliderAction); + satSlider.setMajorTickSpacing(VALUE); + satSlider.setPaintTicks(true); + satField = new JTextField("" + satSlider.getValue(), 4); + satField.getDocument().addDocumentListener(new SatInputListener()); + satField.addKeyListener(new ArrowKeyAction(satField, -VALUE, VALUE)); + satField.setHorizontalAlignment(JTextField.CENTER); + briSlider = new JSlider(-VALUE, VALUE, bri); + briSlider.addChangeListener(sliderAction); + briSlider.setMajorTickSpacing(VALUE); + briSlider.setPaintTicks(true); + briField = new JTextField("" + briSlider.getValue(), 4); + briField.getDocument().addDocumentListener(new BriInputListener()); + briField.addKeyListener(new ArrowKeyAction(briField, -VALUE, VALUE)); + briField.setHorizontalAlignment(JTextField.CENTER); + redField = new JTextField(4); + redField.setHorizontalAlignment(JTextField.CENTER); + redField.setEditable(false); + greenField = new JTextField(4); + greenField.setHorizontalAlignment(JTextField.CENTER); + greenField.setEditable(false); + blueField = new JTextField(4); + blueField.setHorizontalAlignment(JTextField.CENTER); + blueField.setEditable(false); + } + + /** + * 显示这个Chooser + * + * @param frame 框架 + * @param ref 颜色 + * @param inColor 颜色 + * @param s int值S + * @param b 亮度 + * @return 返回颜色 + */ + public static Color showSBChooser(Frame frame, Color ref, Color inColor, int s, int b) { + if (myInstance == null) { + myInstance = new UISBChooser(frame); + } + + myInstance.setColor(ref, inColor, s, b); + myInstance.setVisible(true); + + return myInstance.outColor; + } + + /** + * 删除实例 + */ + public static void deleteInstance() { + myInstance = null; + } + + public void setColor(Color ref, Color inColor, int s, int b) { + reference = ref; + outColor = inColor; + sat = s; + bri = b; + + valueIsAdjusting = true; + satSlider.setValue(sat); + briSlider.setValue(bri); + valueIsAdjusting = false; + + referenceField.setBackground(reference); + twoColorField.setLowerColor(inColor); + adjustColor(); + } + + private void showColor(int s, int b) { + sat = s; + bri = b; + adjustColor(); + } + + private void adjustColor() { + outColor = getAdjustedColor(reference, sat, bri); + + twoColorField.setUpperColor(outColor); + } + + public static Color getAdjustedColor(Color inColor, int sat, int bri) { + Color briColor = inColor; + + // first do brightening + if (bri < 0) { + briColor = ColorRoutines.darken(inColor, -bri); + } else if (bri > 0) { + briColor = ColorRoutines.lighten(inColor, bri); + } + + // then do saturation + Color satColor = ColorRoutines.getMaxSaturation( + briColor, + ColorRoutines.getHue(inColor)); + int r, g, b; + + if (sat >= 0) { + int dr = briColor.getRed() - satColor.getRed(); + int dg = briColor.getGreen() - satColor.getGreen(); + int db = briColor.getBlue() - satColor.getBlue(); + + r = briColor.getRed() - (int) Math.round(dr * sat / VALUE * 1.0); + g = briColor.getGreen() - (int) Math.round(dg * sat / VALUE * 1.0); + b = briColor.getBlue() - (int) Math.round(db * sat / VALUE * 1.0); + } else { + float d = ColorRoutines.getGreyValue(briColor); + float dr = briColor.getRed() - d; + float dg = briColor.getGreen() - d; + float db = briColor.getBlue() - d; + + r = (int) Math.round(briColor.getRed() + dr * sat / VALUE * 1.0); + g = (int) Math.round(briColor.getGreen() + dg * sat / VALUE * 1.0); + b = (int) Math.round(briColor.getBlue() + db * sat / VALUE * 1.0); + } + + return new Color(r, g, b); + } + + public static int getSat() { + return sat; + } + + public static int getBri() { + return bri; + } + + class TwoColorField extends JPanel { + + private Dimension size = new Dimension(60, 68); + private Color upperColor, lowerColor; + + TwoColorField(Color c) { + setBorder(new LineBorder(Color.BLACK, 1)); + + upperColor = outColor; + lowerColor = c; + } + + public Dimension getPreferredSize() { + return size; + } + + void setUpperColor(Color c) { + upperColor = c; + redField.setText("" + c.getRed()); + greenField.setText("" + c.getGreen()); + blueField.setText("" + c.getBlue()); + repaint(0); + } + + void setLowerColor(Color c) { + lowerColor = c; + repaint(0); + } + + public void paint(Graphics g) { + super.paintBorder(g); + + g.setColor(upperColor); + g.fillRect(1, 1, 58, 33); + + g.setColor(lowerColor); + g.fillRect(1, 34, 58, 33); + } + } + + class ColorField extends JPanel { + + private Dimension size = new Dimension(60, 38); + + ColorField(Color c) { + setBorder(new LineBorder(Color.GRAY, 1)); + setBackground(c); + } + + public Dimension getPreferredSize() { + return size; + } + } + + class SliderAction implements ChangeListener { + + public void stateChanged(ChangeEvent e) { + if (!keyInput) { + if (ComparatorUtils.equals(e.getSource(), satSlider)) { + satField.setText("" + satSlider.getValue()); + } else { + briField.setText("" + briSlider.getValue()); + } + } + + if (valueIsAdjusting) { + return; + } + + showColor(satSlider.getValue(), briSlider.getValue()); + } + } + + class SatInputListener implements DocumentListener { + public void changedUpdate(DocumentEvent e) { + } + + public void insertUpdate(DocumentEvent e) { + update(e); + } + + public void removeUpdate(DocumentEvent e) { + update(e); + } + + private void update(DocumentEvent e) { + Document doc = e.getDocument(); + + try { + String text = doc.getText(0, doc.getLength()); + + try { + int val = Integer.parseInt(text); + + keyInput = true; + satSlider.setValue(val); + keyInput = false; + } catch (NumberFormatException ignore) { + } + } catch (BadLocationException ignore) { + } + } + } + + class BriInputListener implements DocumentListener { + public void changedUpdate(DocumentEvent e) { + } + + public void insertUpdate(DocumentEvent e) { + update(e); + } + + public void removeUpdate(DocumentEvent e) { + update(e); + } + + private void update(DocumentEvent e) { + Document doc = e.getDocument(); + + try { + String text = doc.getText(0, doc.getLength()); + + try { + int val = Integer.parseInt(text); + + keyInput = true; + briSlider.setValue(val); + keyInput = false; + } catch (NumberFormatException ignore) { + } + } catch (BadLocationException ignore) { + } + } + } + + class ArrowKeyAction extends KeyAdapter implements ActionListener { + + private JTextField theField; + private javax.swing.Timer keyTimer; + private int step, min, max; + + ArrowKeyAction(JTextField field, int min, int max) { + theField = field; + this.min = min; + this.max = max; + keyTimer = new javax.swing.Timer(20, this); + } + + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == DECREASE) { // up => decrease + step = 1; + if (e.getModifiers() == KeyEvent.SHIFT_MASK) { + step = STEP_GAP; + } + + changeVal(); + keyTimer.setInitialDelay(3 * VALUE); + keyTimer.start(); + } else if (e.getKeyCode() == INCREASE) { // up => increase + step = -1; + if (e.getModifiers() == KeyEvent.SHIFT_MASK) { + step = -STEP_GAP; + } + + changeVal(); + keyTimer.setInitialDelay(3 * VALUE); + keyTimer.start(); + } + } + + public void keyReleased(KeyEvent e) { + keyTimer.stop(); + } + + public void actionPerformed(ActionEvent e) { + changeVal(); + } + + private void changeVal() { + int val = Integer.parseInt(theField.getText()) + step; + + if (val > max) { + val = max; + } else if (val < min) { + val = min; + } + + theField.setText("" + val); + } + } + + class OKAction implements ActionListener { + + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + } + + class CancelAction implements ActionListener { + + public void actionPerformed(ActionEvent e) { + outColor = null; + setVisible(false); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/iscrollbar/UIScrollBar.java b/designer-base/src/com/fr/design/gui/iscrollbar/UIScrollBar.java new file mode 100644 index 0000000000..5cdd9cacd3 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/iscrollbar/UIScrollBar.java @@ -0,0 +1,50 @@ +package com.fr.design.gui.iscrollbar; + +import javax.swing.*; +import java.awt.*; + +/** + * UIScrollBar是没有下上的按钮的,宽为8像素 + * + * @author zhou + * @since 2012-5-9下午4:32:59 + */ +public class UIScrollBar extends JScrollBar { + + /** + * + */ + private static final long serialVersionUID = 1L; + private int temp = 10; + + public UIScrollBar(){ + } + + public UIScrollBar(int orientation) { + super(orientation); + setUI(new UIScrollBarUI()); + } + + @Override + public Dimension getPreferredSize() { + return getOrientation() == UIScrollBar.VERTICAL ? + new Dimension(10, super.getPreferredSize().height) + : new Dimension(super.getPreferredSize().width, 10); + } + + @Override + /** + * 取得宽度 + */ + public int getWidth() { + return getOrientation() == UIScrollBar.VERTICAL ? temp : super.getWidth(); + } + + @Override + /** + * 取得高度 + */ + public int getHeight() { + return getOrientation() == UIScrollBar.HORIZONTAL ? temp : super.getHeight(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/iscrollbar/UIScrollBarUI.java b/designer-base/src/com/fr/design/gui/iscrollbar/UIScrollBarUI.java new file mode 100644 index 0000000000..da9aec9817 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/iscrollbar/UIScrollBarUI.java @@ -0,0 +1,1332 @@ +package com.fr.design.gui.iscrollbar; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.LayoutManager; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import javax.swing.BoundedRangeModel; +import javax.swing.InputMap; +import javax.swing.JComponent; +import javax.swing.JList; +import javax.swing.JScrollBar; +import javax.swing.JScrollPane; +import javax.swing.JViewport; +import javax.swing.LookAndFeel; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.UIManager; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.ScrollBarUI; +import javax.swing.plaf.UIResource; + +import com.fr.design.constants.UIConstants; +import sun.swing.DefaultLookup; + +/** + * Like BasicScrollBarUI,but without two buttons + * + * @author zhou + * @since 2012-5-18下午12:51:55 + */ +public class UIScrollBarUI extends ScrollBarUI implements LayoutManager, SwingConstants { + protected Dimension minimumThumbSize; + protected Dimension maximumThumbSize; + + protected Color thumbHighlightColor; + protected Color thumbLightShadowColor; + protected Color thumbDarkShadowColor; + protected Color thumbColor; + protected Color trackColor; + protected Color trackHighlightColor; + + protected JScrollBar scrollbar; + // protected UIButton incrButton; + // protected UIButton decrButton; + protected boolean isDragging; + protected boolean isPressing; + protected TrackListener trackListener; + protected ModelListener modelListener; + + protected Rectangle thumbRect; + protected Rectangle trackRect; + + protected int trackHighlight; + + protected static final int NO_HIGHLIGHT = 0; + protected static final int DECREASE_HIGHLIGHT = 1; + protected static final int INCREASE_HIGHLIGHT = 2; + + protected ScrollListener scrollListener; + protected PropertyChangeListener propertyChangeListener; + protected Timer scrollTimer; + + private final static int SCROLL_SPEED_THROTTLE = 60; // delay in milli seconds + + /** + * True indicates a middle click will absolutely position the scrollbar. + */ + private boolean supportsAbsolutePositioning; + + /** + * Hint as to what width (when vertical) or height (when horizontal) should + * be. + */ + private int scrollBarWidth; + + private Handler handler; + + private boolean thumbActive; + + /** + * Determine whether scrollbar layout should use cached value or adjusted + * value returned by scrollbar's getValue. + */ + private boolean useCachedValue = false; + /** + * The scrollbar value is cached to save real value if the view is adjusted. + */ + private int scrollBarValue; + + /** + * Distance between the increment button and the track. This may be a + * negative number. If negative, then an overlap between the button and + * track will occur, which is useful for shaped buttons. + *

+ * TODO This should be made protected in a feature release + */ + private int incrGap; + + /** + * Distance between the decrement button and the track. This may be a + * negative number. If negative, then an overlap between the button and + * track will occur, which is useful for shaped buttons. + *

+ * TODO This should be made protected in a feature release + */ + private int decrGap; + + /** + * @param c + * @return + */ + public static ComponentUI createUI(JComponent c) { + return new UIScrollBarUI(); + } + + protected void configureScrollBarColors() { + LookAndFeel.installColors(scrollbar, "ScrollBar.background", "ScrollBar.foreground"); + thumbHighlightColor = UIManager.getColor("ScrollBar.thumbHighlight"); + thumbLightShadowColor = UIManager.getColor("ScrollBar.thumbShadow"); + thumbDarkShadowColor = UIManager.getColor("ScrollBar.thumbDarkShadow"); + thumbColor = UIManager.getColor("ScrollBar.thumb"); + trackColor = UIManager.getColor("ScrollBar.track"); + trackHighlightColor = UIManager.getColor("ScrollBar.trackHighlight"); + } + + /** + * 设置UI + * + * @param c + */ + public void installUI(JComponent c) { + scrollbar = (JScrollBar) c; + thumbRect = new Rectangle(0, 0, 0, 0); + trackRect = new Rectangle(0, 0, 0, 0); + installDefaults(); + installComponents(); + installListeners(); + installKeyboardActions(); + } + + /** + * 重新设置UI + * + * @param c + */ + public void uninstallUI(JComponent c) { + scrollbar = (JScrollBar) c; + uninstallListeners(); + uninstallDefaults(); + uninstallComponents(); + uninstallKeyboardActions(); + thumbRect = null; + scrollbar = null; + } + + protected void installDefaults() { + scrollBarWidth = UIManager.getInt("ScrollBar.width"); + if (scrollBarWidth <= 0) { + scrollBarWidth = 16; + } +// minimumThumbSize = (Dimension)UIManager.get("ScrollBar.minimumThumbSize"); + //滚动条的滑块的高度最小为30像素 + minimumThumbSize = new Dimension(10, 30); + maximumThumbSize = (Dimension) UIManager.get("ScrollBar.maximumThumbSize"); + + Boolean absB = (Boolean) UIManager.get("ScrollBar.allowsAbsolutePositioning"); + supportsAbsolutePositioning = (absB != null) ? absB.booleanValue() : false; + + trackHighlight = NO_HIGHLIGHT; + if (scrollbar.getLayout() == null || (scrollbar.getLayout() instanceof UIResource)) { + scrollbar.setLayout(this); + } + configureScrollBarColors(); + LookAndFeel.installBorder(scrollbar, "ScrollBar.border"); + LookAndFeel.installProperty(scrollbar, "opaque", Boolean.TRUE); + + scrollBarValue = scrollbar.getValue(); + + incrGap = UIManager.getInt("ScrollBar.incrementButtonGap"); + decrGap = UIManager.getInt("ScrollBar.decrementButtonGap"); + + // TODO this can be removed when incrGap/decrGap become protected + // handle scaling for sizeVarients for special case components. The + // key "JComponent.sizeVariant" scales for large/small/mini + // components are based on Apples LAF + String scaleKey = (String) scrollbar.getClientProperty("JComponent.sizeVariant"); + if (scaleKey != null) { + if ("large".equals(scaleKey)) { + scrollBarWidth *= 1.15; + incrGap *= 1.15; + decrGap *= 1.15; + } else if ("small".equals(scaleKey)) { + scrollBarWidth *= 0.857; + incrGap *= 0.857; + decrGap *= 0.714; + } else if ("mini".equals(scaleKey)) { + scrollBarWidth *= 0.714; + incrGap *= 0.714; + decrGap *= 0.714; + } + } + } + + protected void installComponents() { + scrollbar.setEnabled(scrollbar.isEnabled()); + } + + protected void uninstallComponents() { + } + + protected void installListeners() { + trackListener = createTrackListener(); + modelListener = createModelListener(); + propertyChangeListener = createPropertyChangeListener(); + + scrollbar.addMouseListener(trackListener); + scrollbar.addMouseMotionListener(trackListener); + scrollbar.getModel().addChangeListener(modelListener); + scrollbar.addPropertyChangeListener(propertyChangeListener); + scrollbar.addFocusListener(getHandler()); + + scrollListener = createScrollListener(); + scrollTimer = new Timer(SCROLL_SPEED_THROTTLE, scrollListener); + scrollTimer.setInitialDelay(300); // default InitialDelay? + } + + protected void installKeyboardActions() { + + InputMap inputMap = getInputMap(JComponent.WHEN_FOCUSED); + SwingUtilities.replaceUIInputMap(scrollbar, JComponent.WHEN_FOCUSED, inputMap); + inputMap = getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + SwingUtilities.replaceUIInputMap(scrollbar, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, inputMap); + } + + protected void uninstallKeyboardActions() { + SwingUtilities.replaceUIInputMap(scrollbar, JComponent.WHEN_FOCUSED, null); + SwingUtilities.replaceUIActionMap(scrollbar, null); + } + + private InputMap getInputMap(int condition) { + if (condition == JComponent.WHEN_FOCUSED) { + InputMap keyMap = (InputMap) DefaultLookup.get(scrollbar, this, "ScrollBar.focusInputMap"); + InputMap rtlKeyMap; + + if (scrollbar.getComponentOrientation().isLeftToRight() || ((rtlKeyMap = (InputMap) DefaultLookup.get(scrollbar, this, "ScrollBar.focusInputMap.RightToLeft")) == null)) { + return keyMap; + } else { + rtlKeyMap.setParent(keyMap); + return rtlKeyMap; + } + } else if (condition == JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) { + InputMap keyMap = (InputMap) DefaultLookup.get(scrollbar, this, "ScrollBar.ancestorInputMap"); + InputMap rtlKeyMap; + + if (scrollbar.getComponentOrientation().isLeftToRight() + || ((rtlKeyMap = (InputMap) DefaultLookup.get(scrollbar, this, "ScrollBar.ancestorInputMap.RightToLeft")) == null)) { + return keyMap; + } else { + rtlKeyMap.setParent(keyMap); + return rtlKeyMap; + } + } + return null; + } + + protected void uninstallListeners() { + scrollTimer.stop(); + scrollTimer = null; + + scrollbar.getModel().removeChangeListener(modelListener); + scrollbar.removeMouseListener(trackListener); + scrollbar.removeMouseMotionListener(trackListener); + scrollbar.removePropertyChangeListener(propertyChangeListener); + scrollbar.removeFocusListener(getHandler()); + handler = null; + } + + protected void uninstallDefaults() { + LookAndFeel.uninstallBorder(scrollbar); + if (scrollbar.getLayout() == this) { + scrollbar.setLayout(null); + } + } + + private Handler getHandler() { + if (handler == null) { + handler = new Handler(); + } + return handler; + } + + protected TrackListener createTrackListener() { + return new TrackListener(); + } + + protected ModelListener createModelListener() { + return new ModelListener(); + } + + protected ScrollListener createScrollListener() { + return new ScrollListener(); + } + + protected PropertyChangeListener createPropertyChangeListener() { + return getHandler(); + } + + private void updateThumbState(int x, int y) { + Rectangle rect = getThumbBounds(); + + setThumbRollover(rect.contains(x, y)); + } + + /** + * Sets whether or not the mouse is currently over the thumb. + * + * @param active True indicates the thumb is currently active. + * @since 1.5 + */ + protected void setThumbRollover(boolean active) { + if (thumbActive != active) { + thumbActive = active; + scrollbar.repaint(getThumbBounds()); + } + } + + /** + * Returns true if the mouse is currently over the thumb. + * + * @return true if the thumb is currently active + * @since 1.5 + */ + public boolean isThumbRollover() { + return thumbActive; + } + + /** + * 只画Thumb + */ + public void paint(Graphics g, JComponent c) { + Rectangle thumbBounds = getThumbBounds(); + if (thumbBounds.intersects(g.getClipBounds())) { + paintThumb(g, c, thumbBounds); + } + } + + /** + * A vertical scrollbar's preferred width is the maximum of preferred widths + * of the (non null) increment/decrement buttons, and the + * minimum width of the thumb. The preferred height is the sum of the + * preferred heights of the same parts. The basis for the preferred size of + * a horizontal scrollbar is similar. + *

+ * The preferredSize is only computed once, subsequent calls to + * this method just return a cached size. + * + * @param c the JScrollBar that's delegating this method to + * us + * @return the preferred size of a Basic JScrollBar + * @see #getMaximumSize + * @see #getMinimumSize + */ + public Dimension getPreferredSize(JComponent c) { + return (scrollbar.getOrientation() == JScrollBar.VERTICAL) ? new Dimension(scrollBarWidth, 48) : new Dimension(48, scrollBarWidth); + } + + /** + * @param c The JScrollBar that's delegating this method to us. + * @return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); + * @see #getMinimumSize + * @see #getPreferredSize + */ + public Dimension getMaximumSize(JComponent c) { + return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); + } + + protected void paintDecreaseHighlight(Graphics g) { + Insets insets = scrollbar.getInsets(); + Rectangle thumbR = getThumbBounds(); + g.setColor(trackHighlightColor); + + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + // paint the distance between the start of the track and top of the + // thumb + int x = insets.left; + int y = trackRect.y; + int w = scrollbar.getWidth() - (insets.left + insets.right); + int h = thumbR.y - y; + g.fillRect(x, y, w, h); + } else { + // if left-to-right, fill the area between the start of the track + // and + // the left edge of the thumb. If right-to-left, fill the area + // between + // the end of the thumb and end of the track. + int x, w; + if (scrollbar.getComponentOrientation().isLeftToRight()) { + x = trackRect.x; + w = thumbR.x - x; + } else { + x = thumbR.x + thumbR.width; + w = trackRect.x + trackRect.width - x; + } + int y = insets.top; + int h = scrollbar.getHeight() - (insets.top + insets.bottom); + g.fillRect(x, y, w, h); + } + } + + protected void paintIncreaseHighlight(Graphics g) { + Insets insets = scrollbar.getInsets(); + Rectangle thumbR = getThumbBounds(); + g.setColor(trackHighlightColor); + + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + // fill the area between the bottom of the thumb and the end of the + // track. + int x = insets.left; + int y = thumbR.y + thumbR.height; + int w = scrollbar.getWidth() - (insets.left + insets.right); + int h = trackRect.y + trackRect.height - y; + g.fillRect(x, y, w, h); + } else { + // if left-to-right, fill the area between the right of the thumb + // and the + // end of the track. If right-to-left, then fill the area to the + // left of + // the thumb and the start of the track. + int x, w; + if (scrollbar.getComponentOrientation().isLeftToRight()) { + x = thumbR.x + thumbR.width; + w = trackRect.x + trackRect.width - x; + } else { + x = trackRect.x; + w = thumbR.x - x; + } + int y = insets.top; + int h = scrollbar.getHeight() - (insets.top + insets.bottom); + g.fillRect(x, y, w, h); + } + } + + protected void paintThumb(Graphics g, JComponent cc, Rectangle thumbBounds) { + int width = thumbBounds.width; + int height = thumbBounds.height; + Graphics2D g2 = (Graphics2D) g; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + g2.translate(thumbBounds.x, thumbBounds.y); + Color color = isPressing ? UIConstants.LINE_COLOR : UIConstants.BARNOMAL; + g2.setColor(color); + g2.fillRoundRect(1, 1, width - 2, height - 2, UIConstants.LARGEARC, UIConstants.LARGEARC); + + } + + + /** + * Return the smallest acceptable size for the thumb. If the scrollbar + * becomes so small that this size isn't available, the thumb will be + * hidden. + *

+ * Warning : the value returned by this method should not be be + * modified, it's a shared static constant. + * + * @return The smallest acceptable size for the thumb. + * @see #getMaximumThumbSize + */ + protected Dimension getMinimumThumbSize() { + return minimumThumbSize; + } + + /** + * Return the largest acceptable size for the thumb. To create a fixed size + * thumb one make this method and getMinimumThumbSize return + * the same value. + *

+ * Warning : the value returned by this method should not be be + * modified, it's a shared static constant. + * + * @return The largest acceptable size for the thumb. + * @see #getMinimumThumbSize + */ + protected Dimension getMaximumThumbSize() { + return maximumThumbSize; + } + + /* + * LayoutManager Implementation + */ + + + /** + * @param name + * @param child + */ + public void addLayoutComponent(String name, Component child) { + } + + /** + * @param child + */ + public void removeLayoutComponent(Component child) { + } + + /** + * 得到最好的布局大小 + * + * @param scrollbarContainer + * @return + */ + public Dimension preferredLayoutSize(Container scrollbarContainer) { + return getPreferredSize((JComponent) scrollbarContainer); + } + + /** + * 最小的布局大小 + * + * @param scrollbarContainer + * @return + */ + public Dimension minimumLayoutSize(Container scrollbarContainer) { + return getMinimumSize((JComponent) scrollbarContainer); + } + + private int getValue(JScrollBar sb) { + return (useCachedValue) ? scrollBarValue : sb.getValue(); + } + + + + + + /* + * Width and left edge of the buttons and thumb. + */ + + /* + * Nominal locations of the buttons, assuming their preferred size will + * fit. + */ + + /* + * The thumb must fit within the height left over after we subtract the + * preferredSize of the buttons and the insets and the gaps + */ + + /* + * Compute the height and origin of the thumb. The case where the thumb + * is at the bottom edge is handled specially to avoid numerical + * problems in computing thumbY. Enforce the thumbs min/max dimensions. + * If the thumb doesn't fit in the track (trackH) we'll hide it later. + */ + + /* + * If the buttons don't fit, allocate half of the available space to + * each and move the lower one (incrButton) down. + */ + + /* + * Update the trackRect field. + */ + + /* + * If the thumb isn't going to fit, zero it's bounds. Otherwise make + * sure it fits between the buttons. Note that setting the thumbs bounds + * will cause a repaint. + */ + + protected void layoutVScrollbar(JScrollBar sb) { + Dimension sbSize = sb.getSize(); + Insets sbInsets = sb.getInsets(); + int itemW = sbSize.width - (sbInsets.left + sbInsets.right); + int itemX = sbInsets.left; + boolean squareButtons = DefaultLookup.getBoolean(scrollbar, this, "ScrollBar.squareButtons", false); + int decrButtonH = squareButtons ? itemW : 0; + int decrButtonY = sbInsets.top; + int incrButtonH = squareButtons ? itemW : 0; + int incrButtonY = sbSize.height - (sbInsets.bottom + incrButtonH); + int sbInsetsH = sbInsets.top + sbInsets.bottom; + int sbButtonsH = decrButtonH + incrButtonH; + int gaps = decrGap + incrGap; + float trackH = sbSize.height - (sbInsetsH + sbButtonsH) - gaps; + float min = sb.getMinimum(); + float extent = sb.getVisibleAmount(); + float range = sb.getMaximum() - min; + float value = getValue(sb); + int thumbH = (range <= 0) ? getMaximumThumbSize().height : (int) (trackH * (extent / range)); + thumbH = Math.max(thumbH, getMinimumThumbSize().height); + thumbH = Math.min(thumbH, getMaximumThumbSize().height); + int thumbY = incrButtonY - incrGap - thumbH; + if (value < (sb.getMaximum() - sb.getVisibleAmount())) { + float thumbRange = trackH - thumbH; + thumbY = (int) (0.5f + (thumbRange * ((value - min) / (range - extent)))); + thumbY += decrButtonY + decrButtonH + decrGap; + } + int sbAvailButtonH = (sbSize.height - sbInsetsH); + if (sbAvailButtonH < sbButtonsH) { + incrButtonH = decrButtonH = sbAvailButtonH / 2; + incrButtonY = sbSize.height - (sbInsets.bottom + incrButtonH); + } + int itrackY = decrButtonY + decrButtonH + decrGap; + int itrackH = incrButtonY - incrGap - itrackY; + trackRect.setBounds(itemX, itrackY, itemW, itrackH); + if (thumbH >= (int) trackH) { + setThumbBounds(0, 0, 0, 0); + } else { + if ((thumbY + thumbH) > incrButtonY - incrGap) { + thumbY = incrButtonY - incrGap - thumbH; + } + if (thumbY < (decrButtonY + decrButtonH + decrGap)) { + thumbY = decrButtonY + decrButtonH + decrGap + 1; + } + setThumbBounds(itemX, thumbY, itemW, thumbH); + } + } + + + + /* + * Height and top edge of the buttons and thumb. + */ + + /* + * Nominal locations of the buttons, assuming their preferred size will + * fit. + */ + + /* + * The thumb must fit within the width left over after we subtract the + * preferredSize of the buttons and the insets and the gaps + */ + + /* + * Compute the width and origin of the thumb. Enforce the thumbs min/max + * dimensions. The case where the thumb is at the right edge is handled + * specially to avoid numerical problems in computing thumbX. If the + * thumb doesn't fit in the track (trackH) we'll hide it later. + */ + /* + * If the buttons don't fit, allocate half of the available space to + * each and move the right one over. + */ + + /* + * Update the trackRect field. + */ + /* + * Make sure the thumb fits between the buttons. Note that setting the + * thumbs bounds causes a repaint. + */ + protected void layoutHScrollbar(JScrollBar sb) { + Dimension sbSize = sb.getSize(); + Insets sbInsets = sb.getInsets(); + int itemH = sbSize.height - (sbInsets.top + sbInsets.bottom); + int itemY = sbInsets.top; + boolean ltr = sb.getComponentOrientation().isLeftToRight(); + boolean squareButtons = DefaultLookup.getBoolean(scrollbar, this, "ScrollBar.squareButtons", false); + int leftButtonW = squareButtons ? itemH : 0; + int rightButtonW = squareButtons ? itemH : 0; + if (!ltr) { + int temp = leftButtonW; + leftButtonW = rightButtonW; + rightButtonW = temp; + } + int leftButtonX = sbInsets.left; + int rightButtonX = sbSize.width - (sbInsets.right + rightButtonW); + int leftGap = ltr ? decrGap : incrGap; + int rightGap = ltr ? incrGap : decrGap; + int sbInsetsW = sbInsets.left + sbInsets.right; + int sbButtonsW = leftButtonW + rightButtonW; + float trackW = sbSize.width - (sbInsetsW + sbButtonsW) - (leftGap + rightGap); + float min = sb.getMinimum(); + float max = sb.getMaximum(); + float extent = sb.getVisibleAmount(); + float range = max - min; + float value = getValue(sb); + int thumbW = (range <= 0) ? getMaximumThumbSize().width : (int) (trackW * (extent / range)); + thumbW = Math.max(thumbW, getMinimumThumbSize().width); + thumbW = Math.min(thumbW, getMaximumThumbSize().width); + int thumbX = ltr ? rightButtonX - rightGap - thumbW : leftButtonX + leftButtonW + leftGap; + if (value < (max - sb.getVisibleAmount())) { + float thumbRange = trackW - thumbW; + if (ltr) { + thumbX = (int) (0.5f + (thumbRange * ((value - min) / (range - extent)))); + } else { + thumbX = (int) (0.5f + (thumbRange * ((max - extent - value) / (range - extent)))); + } + thumbX += leftButtonX + leftButtonW + leftGap; + } + int sbAvailButtonW = (sbSize.width - sbInsetsW); + if (sbAvailButtonW < sbButtonsW) { + rightButtonW = leftButtonW = sbAvailButtonW / 2; + rightButtonX = sbSize.width - (sbInsets.right + rightButtonW + rightGap); + } + int itrackX = leftButtonX + leftButtonW + leftGap; + int itrackW = rightButtonX - rightGap - itrackX; + trackRect.setBounds(itrackX, itemY, itrackW, itemH); + set(thumbW, thumbX, trackW, rightButtonX, rightGap, leftButtonX, leftButtonW, leftGap, itemY, itemH); + } + + private void set(int thumbW, int thumbX, float trackW, int rightButtonX, int rightGap, int leftButtonX, int leftButtonW, int leftGap, int itemY, int itemH) { + if (thumbW >= (int) trackW) { + setThumbBounds(0, 0, 0, 0); + } else { + if (thumbX + thumbW > rightButtonX - rightGap) { + thumbX = rightButtonX - rightGap - thumbW; + } + if (thumbX < leftButtonX + leftButtonW + leftGap) { + thumbX = leftButtonX + leftButtonW + leftGap + 1; + } + setThumbBounds(thumbX, itemY, thumbW, itemH); + } + } + + /** + * @param scrollbarContainer + */ + public void layoutContainer(Container scrollbarContainer) { + /* + * If the user is dragging the value, we'll assume that the scrollbars + * layout is OK modulo the thumb which is being handled by the dragging + * code. + */ + if (isDragging) { + return; + } + + JScrollBar scrollbar = (JScrollBar) scrollbarContainer; + switch (scrollbar.getOrientation()) { + case JScrollBar.VERTICAL: + layoutVScrollbar(scrollbar); + break; + + case JScrollBar.HORIZONTAL: + layoutHScrollbar(scrollbar); + break; + } + } + + /** + * Set the bounds of the thumb and force a repaint that includes the old + * thumbBounds and the new one. + * + * @see #getThumbBounds + */ + protected void setThumbBounds(int x, int y, int width, int height) { + /* + * If the thumbs bounds haven't changed, we're done. + */ + boolean isX = thumbRect.x == x; + boolean isWidth = thumbRect.width == width; + boolean isY = thumbRect.y == y; + boolean isHeight = thumbRect.height == height; + boolean istrue1 = isX && isWidth; + boolean istrue2 = isY && isHeight; + if (istrue1 && istrue2) { + return; + } + + /* + * Update thumbRect, and repaint the union of x,y,w,h and the old + * thumbRect. + */ + int minX = Math.min(x, thumbRect.x); + int minY = Math.min(y, thumbRect.y); + int maxX = Math.max(x + width, thumbRect.x + thumbRect.width); + int maxY = Math.max(y + height, thumbRect.y + thumbRect.height); + + thumbRect.setBounds(x, y, width, height); + scrollbar.repaint(minX, minY, maxX - minX, maxY - minY); + + // Once there is API to determine the mouse location this will need + // to be changed. + setThumbRollover(false); + } + + /** + * Return the current size/location of the thumb. + *

+ * Warning : the value returned by this method should not be be + * modified, it's a reference to the actual rectangle, not a copy. + * + * @return The current size/location of the thumb. + * @see #setThumbBounds + */ + protected Rectangle getThumbBounds() { + return thumbRect; + } + + /** + * Returns the current bounds of the track, i.e. the space in between the + * increment and decrement buttons, less the insets. The value returned by + * this method is updated each time the scrollbar is laid out (validated). + *

+ * Warning : the value returned by this method should not be be + * modified, it's a reference to the actual rectangle, not a copy. + * + * @return the current bounds of the scrollbar track + * @see #layoutContainer + */ + protected Rectangle getTrackBounds() { + return trackRect; + } + + /* + * Method for scrolling by a block increment. Added for mouse wheel + * scrolling support, RFE 4202656. + */ + static void scrollByBlock(JScrollBar scrollbar, int direction) { + // This method is called from BasicScrollPaneUI to implement wheel + // scrolling, and also from scrollByBlock(). + int oldValue = scrollbar.getValue(); + int blockIncrement = scrollbar.getBlockIncrement(direction); + int delta = blockIncrement * ((direction > 0) ? +1 : -1); + int newValue = oldValue + delta; + + // Check for overflow. + if (delta > 0 && newValue < oldValue) { + newValue = scrollbar.getMaximum(); + } else if (delta < 0 && newValue > oldValue) { + newValue = scrollbar.getMinimum(); + } + + scrollbar.setValue(newValue); + } + + protected void scrollByBlock(int direction) { + scrollByBlock(scrollbar, direction); + trackHighlight = direction > 0 ? INCREASE_HIGHLIGHT : DECREASE_HIGHLIGHT; + Rectangle dirtyRect = getTrackBounds(); + scrollbar.repaint(dirtyRect.x, dirtyRect.y, dirtyRect.width, dirtyRect.height); + } + + /* + * Method for scrolling by a unit increment. Added for mouse wheel scrolling + * support, RFE 4202656. + * + * If limitByBlock is set to true, the scrollbar will scroll at least 1 unit + * increment, but will not scroll farther than the block increment. See + * BasicScrollPaneUI.Handler.mouseWheelMoved(). + */ + static void scrollByUnits(JScrollBar scrollbar, int direction, int units, boolean limitToBlock) { + // This method is called from BasicScrollPaneUI to implement wheel + // scrolling, as well as from scrollByUnit(). + int delta; + int limit = -1; + if (limitToBlock) { + if (direction < 0) { + limit = scrollbar.getValue() - scrollbar.getBlockIncrement(direction); + } else { + limit = scrollbar.getValue() + scrollbar.getBlockIncrement(direction); + } + } + for (int i = 0; i < units; i++) { + if (direction > 0) { + delta = scrollbar.getUnitIncrement(direction); + } else { + delta = -scrollbar.getUnitIncrement(direction); + } + int oldValue = scrollbar.getValue(); + int newValue = oldValue + delta; + // Check for overflow. + if (delta > 0 && newValue < oldValue) { + newValue = scrollbar.getMaximum(); + } else if (delta < 0 && newValue > oldValue) { + newValue = scrollbar.getMinimum(); + } + if (oldValue == newValue) { + break; + } + if (limitToBlock && i > 0) { + assert limit != -1; + boolean islow = direction < 0 && newValue < limit; + boolean isHigh = direction > 0 && newValue > limit; + if (islow && isHigh) { + break; + } + } + scrollbar.setValue(newValue); + } + } + + protected void scrollByUnit(int direction) { + scrollByUnits(scrollbar, direction, 1, false); + } + + /** + * Indicates whether the user can absolutely position the thumb with a mouse + * gesture (usually the middle mouse button). + * + * @return true if a mouse gesture can absolutely position the thumb + * @since 1.5 + */ + public boolean isSupportsAbsolutePositioning() { + return supportsAbsolutePositioning; + } + + /** + * A listener to listen for model changes. + */ + protected class ModelListener implements ChangeListener { + public void stateChanged(ChangeEvent e) { + if (!useCachedValue) { + scrollBarValue = scrollbar.getValue(); + } + layoutContainer(scrollbar); + useCachedValue = false; + } + } + + /** + * Track mouse drags. + */ + protected class TrackListener extends MouseAdapter implements MouseMotionListener { + protected transient int offset; + protected transient int currentMouseX, currentMouseY; + private transient int direction = +1; + + + public void mouseReleased(MouseEvent e) { + isPressing = false; + if (isDragging) { + updateThumbState(e.getX(), e.getY()); + } + boolean isMiddle = !isSupportsAbsolutePositioning() && SwingUtilities.isMiddleMouseButton(e); + if (SwingUtilities.isRightMouseButton(e) || isMiddle) { + return; + } + if (!scrollbar.isEnabled()) { + return; + } + Rectangle r = getTrackBounds(); + scrollbar.repaint(r.x, r.y, r.width, r.height); + + trackHighlight = NO_HIGHLIGHT; + isDragging = false; + offset = 0; + scrollTimer.stop(); + useCachedValue = true; + scrollbar.setValueIsAdjusting(false); + scrollbar.repaint(); + + } + + /** + * If the mouse is pressed above the "thumb" component then reduce the + * scrollbars value by one page ("page up"), otherwise increase it by + * one page. If there is no thumb then page up if the mouse is in the + * upper half of the track. + */ + public void mousePressed(MouseEvent e) { + boolean isMiddle = !isSupportsAbsolutePositioning() && SwingUtilities.isMiddleMouseButton(e); + if (SwingUtilities.isRightMouseButton(e) || isMiddle) { + return; + } + + if (!scrollbar.isEnabled()) { + return; + } + + isPressing = true; + if (!scrollbar.hasFocus() && scrollbar.isRequestFocusEnabled()) { + scrollbar.requestFocus(); + } + useCachedValue = true; + scrollbar.setValueIsAdjusting(true); + currentMouseX = e.getX(); + currentMouseY = e.getY(); + // Clicked in the Thumb area? + if (getThumbBounds().contains(currentMouseX, currentMouseY)) { + switch (scrollbar.getOrientation()) { + case JScrollBar.VERTICAL: + offset = currentMouseY - getThumbBounds().y; + break; + case JScrollBar.HORIZONTAL: + offset = currentMouseX - getThumbBounds().x; + break; + } + isDragging = true; + scrollbar.repaint(); + return; + } else if (isSupportsAbsolutePositioning() && SwingUtilities.isMiddleMouseButton(e)) { + switch (scrollbar.getOrientation()) { + case JScrollBar.VERTICAL: + offset = getThumbBounds().height / 2; + break; + case JScrollBar.HORIZONTAL: + offset = getThumbBounds().width / 2; + break; + } + isDragging = true; + setValueFrom(e); + scrollbar.repaint(); + return; + } + isDragging = false; + sCrollBar(); + } + + private void sCrollBar() { + Dimension sbSize = scrollbar.getSize(); + direction = +1; + switch (scrollbar.getOrientation()) { + case JScrollBar.VERTICAL: + if (getThumbBounds().isEmpty()) { + int scrollbarCenter = sbSize.height / 2; + direction = (currentMouseY < scrollbarCenter) ? -1 : +1; + } else { + int thumbY = getThumbBounds().y; + direction = (currentMouseY < thumbY) ? -1 : +1; + } + break; + case JScrollBar.HORIZONTAL: + if (getThumbBounds().isEmpty()) { + int scrollbarCenter = sbSize.width / 2; + direction = (currentMouseX < scrollbarCenter) ? -1 : +1; + } else { + int thumbX = getThumbBounds().x; + direction = (currentMouseX < thumbX) ? -1 : +1; + } + if (!scrollbar.getComponentOrientation().isLeftToRight()) { + direction = -direction; + } + break; + } + scrollByBlock(direction); + scrollTimer.stop(); + scrollListener.setDirection(direction); + scrollListener.setScrollByBlock(true); + startScrollTimerIfNecessary(); + scrollbar.repaint(); + } + + + public void mouseDragged(MouseEvent e) { + if (getThumbBounds().contains(e.getPoint())) { + isDragging = true; + } + boolean isMiddle = !isSupportsAbsolutePositioning() && SwingUtilities.isMiddleMouseButton(e); + if (SwingUtilities.isRightMouseButton(e) || isMiddle) { + return; + } + if (!scrollbar.isEnabled() || getThumbBounds().isEmpty()) { + return; + } + if (isDragging) { + setValueFrom(e); + } else { + currentMouseX = e.getX(); + currentMouseY = e.getY(); + updateThumbState(currentMouseX, currentMouseY); + startScrollTimerIfNecessary(); + } + + scrollbar.repaint(); + } + + private void setValueFrom(MouseEvent e) { + boolean active = isThumbRollover(); + BoundedRangeModel model = scrollbar.getModel(); + Rectangle thumbR = getThumbBounds(); + int thumbMin, thumbMax, thumbPos; + + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + thumbMin = trackRect.y; + thumbMax = trackRect.y + trackRect.height - thumbR.height; + thumbPos = Math.min(thumbMax, Math.max(thumbMin, (e.getY() - offset))); + setThumbBounds(thumbR.x, thumbPos, thumbR.width, thumbR.height); + } else { + thumbMin = trackRect.x; + thumbMax = trackRect.x + trackRect.width - thumbR.width; + thumbPos = Math.min(thumbMax, Math.max(thumbMin, (e.getX() - offset))); + setThumbBounds(thumbPos, thumbR.y, thumbR.width, thumbR.height); + } + + /* + * Set the scrollbars value. If the thumb has reached the end of the + * scrollbar, then just set the value to its maximum. Otherwise + * compute the value as accurately as possible. + */ + if (thumbPos == thumbMax) { + if (scrollbar.getOrientation() == JScrollBar.VERTICAL || scrollbar.getComponentOrientation().isLeftToRight()) { + scrollbar.setValue(model.getMaximum() - model.getExtent()); + } else { + scrollbar.setValue(model.getMinimum()); + } + } else { + float valueMax = model.getMaximum() - model.getExtent(); + float valueRange = valueMax - model.getMinimum(); + float thumbValue = thumbPos - thumbMin; + float thumbRange = thumbMax - thumbMin; + int value; + if (scrollbar.getOrientation() == JScrollBar.VERTICAL || scrollbar.getComponentOrientation().isLeftToRight()) { + value = (int) (0.5 + ((thumbValue / thumbRange) * valueRange)); + } else { + value = (int) (0.5 + (((thumbMax - thumbPos) / thumbRange) * valueRange)); + } + + useCachedValue = true; + scrollBarValue = value + model.getMinimum(); + scrollbar.setValue(adjustValueIfNecessary(scrollBarValue)); + } + setThumbRollover(active); + } + + private int adjustValueIfNecessary(int value) { + if (scrollbar.getParent() instanceof JScrollPane) { + JScrollPane scrollpane = (JScrollPane) scrollbar.getParent(); + JViewport viewport = scrollpane.getViewport(); + Component view = viewport.getView(); + if (view instanceof JList) { + JList list = (JList) view; + if (DefaultLookup.getBoolean(list, list.getUI(), "List.lockToPositionOnScroll", false)) { + int adjustedValue = value; + int mode = list.getLayoutOrientation(); + int orientation = scrollbar.getOrientation(); + if (orientation == JScrollBar.VERTICAL && mode == JList.VERTICAL) { + int index = list.locationToIndex(new Point(0, value)); + Rectangle rect = list.getCellBounds(index, index); + if (rect != null) { + adjustedValue = rect.y; + } + } + if (orientation == JScrollBar.HORIZONTAL && (mode == JList.VERTICAL_WRAP || mode == JList.HORIZONTAL_WRAP)) { + if (scrollpane.getComponentOrientation().isLeftToRight()) { + int index = list.locationToIndex(new Point(value, 0)); + Rectangle rect = list.getCellBounds(index, index); + if (rect != null) { + adjustedValue = rect.x; + } + } else { + Point loc = new Point(value, 0); + int extent = viewport.getExtentSize().width; + loc.x += extent - 1; + int index = list.locationToIndex(loc); + Rectangle rect = list.getCellBounds(index, index); + if (rect != null) { + adjustedValue = rect.x + rect.width - extent; + } + } + } + value = adjustedValue; + + } + } + } + return value; + } + + private void startScrollTimerIfNecessary() { + if (scrollTimer.isRunning()) { + return; + } + + Rectangle tb = getThumbBounds(); + + switch (scrollbar.getOrientation()) { + case JScrollBar.VERTICAL: + if (direction > 0) { + if (tb.y + tb.height < trackListener.currentMouseY) { + scrollTimer.start(); + } + } else if (tb.y > trackListener.currentMouseY) { + scrollTimer.start(); + } + break; + case JScrollBar.HORIZONTAL: + boolean isAfterThumb = direction > 0 && isMouseAfterThumb(); + boolean isBeforeThumb = direction < 0 && isMouseBeforeThumb(); + if (isAfterThumb || isBeforeThumb) { + scrollTimer.start(); + } + break; + } + } + + } + + /** + * Listener for scrolling events initiated in the ScrollPane. + */ + protected class ScrollListener implements ActionListener { + int direction = +1; + boolean useBlockIncrement; + + public ScrollListener() { + direction = +1; + useBlockIncrement = false; + } + + public ScrollListener(int dir, boolean block) { + direction = dir; + useBlockIncrement = block; + } + + public void setDirection(int direction) { + this.direction = direction; + } + + public void setScrollByBlock(boolean block) { + this.useBlockIncrement = block; + } + + public void actionPerformed(ActionEvent e) { + if (useBlockIncrement) { + scrollByBlock(direction); + // Stop scrolling if the thumb catches up with the mouse + if (scrollbar.getOrientation() == JScrollBar.VERTICAL) { + if (direction > 0) { + if (getThumbBounds().y + getThumbBounds().height >= trackListener.currentMouseY) { + ((Timer) e.getSource()).stop(); + } + } else if (getThumbBounds().y <= trackListener.currentMouseY) { + ((Timer) e.getSource()).stop(); + } + } else { + boolean isAfterThumb = direction > 0 && !isMouseAfterThumb(); + boolean isBeforeThumb = direction < 0 && !isMouseBeforeThumb(); + if (isAfterThumb || isBeforeThumb) { + ((Timer) e.getSource()).stop(); + } + } + } else { + scrollByUnit(direction); + } + if (direction > 0 && scrollbar.getValue() + scrollbar.getVisibleAmount() >= scrollbar.getMaximum()) { + ((Timer) e.getSource()).stop(); + } else if (direction < 0 && scrollbar.getValue() <= scrollbar.getMinimum()) { + ((Timer) e.getSource()).stop(); + } + } + } + + private boolean isMouseLeftOfThumb() { + return trackListener.currentMouseX < getThumbBounds().x; + } + + private boolean isMouseRightOfThumb() { + Rectangle tb = getThumbBounds(); + return trackListener.currentMouseX > tb.x + tb.width; + } + + private boolean isMouseBeforeThumb() { + return scrollbar.getComponentOrientation().isLeftToRight() ? isMouseLeftOfThumb() : isMouseRightOfThumb(); + } + + private boolean isMouseAfterThumb() { + return scrollbar.getComponentOrientation().isLeftToRight() ? isMouseRightOfThumb() : isMouseLeftOfThumb(); + } + + private void updateButtonDirections() { + } + + /** + * PropertyChangeHandler + */ + public class PropertyChangeHandler implements PropertyChangeListener { + // NOTE: This class exists only for backward compatability. All + // its functionality has been moved into Handler. If you need to add + // new functionality add it to the Handler, but make sure this + // class calls into the Handler. + + /** + * @param e + */ + public void propertyChange(PropertyChangeEvent e) { + getHandler().propertyChange(e); + } + } + + // + // EventHandler + // + private class Handler implements FocusListener, PropertyChangeListener { + // + // FocusListener + // + public void focusGained(FocusEvent e) { + scrollbar.repaint(); + } + + public void focusLost(FocusEvent e) { + scrollbar.repaint(); + } + + // + // PropertyChangeAdapter + // + + /** + * @param e + */ + public void propertyChange(PropertyChangeEvent e) { + String propertyName = e.getPropertyName(); + + if ("model" == propertyName) { + BoundedRangeModel oldModel = (BoundedRangeModel) e.getOldValue(); + BoundedRangeModel newModel = (BoundedRangeModel) e.getNewValue(); + oldModel.removeChangeListener(modelListener); + newModel.addChangeListener(modelListener); + scrollbar.repaint(); + scrollbar.revalidate(); + } else if ("orientation" == propertyName) { + updateButtonDirections(); + } else if ("componentOrientation" == propertyName) { + updateButtonDirections(); + InputMap inputMap = getInputMap(JComponent.WHEN_FOCUSED); + SwingUtilities.replaceUIInputMap(scrollbar, JComponent.WHEN_FOCUSED, inputMap); + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/iscrollbar/UIScrollButton.java b/designer-base/src/com/fr/design/gui/iscrollbar/UIScrollButton.java new file mode 100644 index 0000000000..2c120f4513 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/iscrollbar/UIScrollButton.java @@ -0,0 +1,229 @@ +package com.fr.design.gui.iscrollbar; + +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.plaf.basic.BasicArrowButton; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.HashMap; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-17 + * Time: 上午10:00 + */ +public class UIScrollButton extends BasicArrowButton { + + // cache for already drawn icons - speeds up drawing by a factor + // of 2.2 if there are several scroll buttons or one scroll button + // is painted several times + static HashMap cache = new HashMap(); + + private boolean isRollover; + + private UIBasicScrollBarUI scrollbarUI; + + protected static Dimension size = new Dimension(17, 17); + + + /** + * Create a new ScrollButton. + * + * @see javax.swing.plaf.metal.MetalScrollButton#MetalScrollButton(int, int, boolean) + */ + public UIScrollButton(int direction, UIBasicScrollBarUI scrollbarUI) { + super(direction); + + this.scrollbarUI = scrollbarUI; + setBorder(null); + setRolloverEnabled(true); + setMargin(new Insets(0, 0, 0, 0)); + setSize(size); + } + + /** + * Paints the button + * + * @see java.awt.Component#paint(Graphics) + */ + public void paint(Graphics g) { + isRollover = false; + Color c = null; + + if (!scrollbarUI.isThumbVisible()) { + c = ThemeUtils.SCROLL_BUTTON_DISABLED_COLOR; + } else if (getModel().isPressed()) { + c = ThemeUtils.SCROLL_BUTTON_PRESSED_COLOR; + } else if (getModel().isRollover() && ThemeUtils.SCROLL_ROLLOVER) { + c = ThemeUtils.SCROLL_BUTTON_ROLLOVER_COLOR; + isRollover = true; + } else { + c = ThemeUtils.SCROLL_BUTTON_COLOR; + } + + g.setColor(c); + + drawXpButton(g, getSize(), c); + + // arrows depend on scrollbar's style + if (!scrollbarUI.isThumbVisible()) { + g.setColor(ThemeUtils.SCROLL_ARROW_DISABLED_COLOR); + } else { + g.setColor(ThemeUtils.SCROLL_ARROW_COLOR); + } + drawXpArrow(g, getSize()); + } + + private void drawXpButton(Graphics g, Dimension size, Color c) { + boolean enabled = scrollbarUI.isThumbVisible(); + boolean pressed = getModel().isPressed(); + boolean rollover = getModel().isRollover() && ThemeUtils.SCROLL_ROLLOVER; + ScrollButtonKey key = new ScrollButtonKey( + (direction == NORTH || direction == SOUTH), + c, pressed, enabled, rollover); + Object value = cache.get(key); + if (value != null) { + // image was cached - paint image and return + g.drawImage((Image) value, 0, 0, this); + return; + } + Image img = new BufferedImage(17, 17, BufferedImage.TYPE_INT_ARGB); + Graphics imgGraphics = img.getGraphics(); + switch (direction) { + case EAST: + case WEST: + case NORTH: + case SOUTH: + Color a = ThemeUtils.SCROLL_BORDER_COLOR; + Graphics2D g2 = (Graphics2D) imgGraphics; + GradientPaint scrollBarBg = null; + if (!scrollbarUI.isThumbVisible()) { + scrollBarBg = new GradientPaint(1, 1, new Color(236, 236, 236), 1, 16, c); + } else if (getModel().isPressed()) { + scrollBarBg = new GradientPaint(1, 1, new Color(0xd2d2d2), 1, 16, new Color(0xd2d2d2)); + } else if (getModel().isRollover() && ThemeUtils.SCROLL_ROLLOVER) { + scrollBarBg = new GradientPaint(1, 1, new Color(0xd2d2d2), 1, 16, new Color(0xd2d2d2)); + } else { + scrollBarBg = new GradientPaint(1, 1, new Color(0xffffff), 1, 16, new Color(0xffffff)); + } + g2.setPaint(scrollBarBg); + g2.fillRoundRect(1, 1, 16, 16, 0, 0); + break; + } + // dispose of image graphics + imgGraphics.dispose(); + // draw the image + g.drawImage(img, 0, 0, this); + // add the image to the cache + cache.put(key, img); + } + + + private void drawXpArrow(Graphics g, Dimension size) { + switch (direction) { + case SwingConstants.NORTH: + g.drawLine(8, 5, 8, 5); + g.drawLine(7, 6, 9, 6); + g.drawLine(6, 7, 10, 7); + g.drawLine(5, 8, 7, 8); + g.drawLine(9, 8, 11, 8); + g.drawLine(4, 9, 6, 9); + g.drawLine(10, 9, 12, 9); + g.drawLine(5, 10, 5, 10); + g.drawLine(11, 10, 11, 10); + break; + case SwingConstants.SOUTH: + g.drawLine(5, 6, 5, 6); + g.drawLine(11, 6, 11, 6); + g.drawLine(4, 7, 6, 7); + g.drawLine(10, 7, 12, 7); + g.drawLine(5, 8, 7, 8); + g.drawLine(9, 8, 11, 8); + g.drawLine(6, 9, 10, 9); + g.drawLine(7, 10, 9, 10); + g.drawLine(8, 11, 8, 11); + break; + case SwingConstants.EAST: + g.drawLine(6, 5, 6, 5); + g.drawLine(6, 11, 6, 11); + g.drawLine(7, 4, 7, 6); + g.drawLine(7, 10, 7, 12); + g.drawLine(8, 5, 8, 7); + g.drawLine(8, 9, 8, 11); + g.drawLine(9, 6, 9, 10); + g.drawLine(10, 7, 10, 9); + g.drawLine(11, 8, 11, 8); + break; + case SwingConstants.WEST: + g.drawLine(4, 8, 4, 8); + g.drawLine(5, 7, 5, 9); + g.drawLine(6, 6, 6, 10); + g.drawLine(7, 5, 7, 7); + g.drawLine(7, 9, 7, 11); + g.drawLine(8, 4, 8, 6); + g.drawLine(8, 10, 8, 12); + g.drawLine(9, 5, 9, 5); + g.drawLine(9, 11, 9, 11); + break; + } + } + + /** + * Returns the preferred size of the component wich is the size of the skin + * + * @see java.awt.Component#getPreferredSize() + */ + public Dimension getPreferredSize() { + return size; + } + + /* + * ScrollButtonKey is used as key in the cache HashMap. + * Overrides equals() and hashCode(). + */ + static class ScrollButtonKey { + + private boolean vertical; + private Color c; + private boolean pressed; + private boolean enabled; + private boolean rollover; + + ScrollButtonKey(boolean vertical, Color c, + boolean pressed, boolean enabled, boolean rollover) { + this.vertical = vertical; + this.c = c; + this.pressed = pressed; + this.enabled = enabled; + this.rollover = rollover; + } + + public boolean equals(Object o) { + if (o == null) { + return false; + } + if (!(o instanceof ScrollButtonKey)) { + return false; + } + + ScrollButtonKey other = (ScrollButtonKey) o; + return ComparatorUtils.equals(vertical, other.vertical) && + ComparatorUtils.equals(pressed, other.pressed) && + ComparatorUtils.equals(enabled, other.enabled) && + ComparatorUtils.equals(rollover, other.rollover) && + ComparatorUtils.equals(c, other.c); + } + + public int hashCode() { + return c.hashCode() * + (pressed ? 1 : 2) * + (enabled ? 4 : 8) * + (rollover ? 16 : 32) * + (vertical ? 64 : 128); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/islider/UISlider.java b/designer-base/src/com/fr/design/gui/islider/UISlider.java new file mode 100644 index 0000000000..71dc30d1d4 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/islider/UISlider.java @@ -0,0 +1,37 @@ +package com.fr.design.gui.islider; + +import javax.swing.*; + +/** + * Created by IntelliJ IDEA. + * Author : Richer + * Version: 6.5.6 + * Date: 13-3-28 + * Time: 下午1:30 + */ +public class UISlider extends JSlider { + + public UISlider(){ + super(); + } + + public UISlider(int orientation){ + super(orientation); + } + + public UISlider(int min, int max){ + super(min,max); + } + + public UISlider(int min, int max, int value){ + super(min,max,value); + } + + public UISlider(int orientation, int min, int max, int value){ + super(orientation,min,max,value); + } + + public UISlider(BoundedRangeModel brm) { + super(brm); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/ispinner/ColumnRowSpinner.java b/designer-base/src/com/fr/design/gui/ispinner/ColumnRowSpinner.java similarity index 100% rename from designer_base/src/com/fr/design/gui/ispinner/ColumnRowSpinner.java rename to designer-base/src/com/fr/design/gui/ispinner/ColumnRowSpinner.java diff --git a/designer-base/src/com/fr/design/gui/ispinner/UIBasicSpinner.java b/designer-base/src/com/fr/design/gui/ispinner/UIBasicSpinner.java new file mode 100644 index 0000000000..4b71a2c752 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ispinner/UIBasicSpinner.java @@ -0,0 +1,86 @@ +package com.fr.design.gui.ispinner; + +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : Richer + * Version: 6.5.6 + * Date: 13-3-27 + * Time: 下午2:17 + */ +public class UIBasicSpinner extends JSpinner implements UIObserver { + + private UIObserverListener uiObserverListener; + + /** + * + * @param model + */ + public UIBasicSpinner(SpinnerModel model) { + super(model); + iniListener(); + } + + /** + * + */ + public UIBasicSpinner() { + super(); + iniListener(); + } + + + private void iniListener() { + if (shouldResponseChangeListener()) { + ((DefaultEditor) this.getEditor()).getTextField().getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + attributeChanged(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + attributeChanged(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + attributeChanged(); + } + }); + } + + } + + + private void attributeChanged() { + if (uiObserverListener == null) { + return; + } + uiObserverListener.doChange(); + + } + + @Override + /** + * + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } + + @Override + /** + * + */ + public boolean shouldResponseChangeListener() { + return true; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ispinner/UISpinner.java b/designer-base/src/com/fr/design/gui/ispinner/UISpinner.java new file mode 100644 index 0000000000..c9c3988293 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ispinner/UISpinner.java @@ -0,0 +1,361 @@ +package com.fr.design.gui.ispinner; + +import com.fr.design.constants.UIConstants; +import com.fr.design.event.GlobalNameListener; +import com.fr.design.event.GlobalNameObserver; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UIButtonUI; +import com.fr.design.gui.itextfield.UINumberField; +import com.fr.design.utils.gui.GUIPaintUtils; +import com.fr.stable.Constants; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.plaf.ButtonUI; +import java.awt.*; +import java.awt.event.*; + +public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver { + + protected double value; + private static final int SIZE = 20; + private static final int LEN = 13; + private static final int WIDTH = 13; + private static final int HEIGHT = 10; + private UINumberField textField; + private UIButton preButton; + private UIButton nextButton; + private double minValue; + private double maxValue; + private double dierta; + private String spinnerName = StringUtils.EMPTY; + private UIObserverListener uiObserverListener; + private GlobalNameListener globalNameListener = null; + + + public UISpinner(double minValue, double maxValue, double dierta) { + this.minValue = minValue; + this.maxValue = maxValue; + this.dierta = dierta; + initComponents(); + iniListener(); + } + + public UISpinner(double minValue, double maxValue, double dierta, double defaultValue) { + this(minValue, maxValue, dierta); + textField.setValue(defaultValue); + } + + private void iniListener() { + if (shouldResponseChangeListener()) { + this.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if (uiObserverListener == null) { + return; + } + uiObserverListener.doChange(); + } + }); + } + } + + /** + * 给组件分别加上FocusListener + * + * @param focusListener 监听事件 + */ + public void addUISpinnerFocusListenner(FocusListener focusListener) { + this.addFocusListener(focusListener); + this.textField.addFocusListener(focusListener); + this.preButton.addFocusListener(focusListener); + this.nextButton.addFocusListener(focusListener); + + } + + public double getValue() { + return value; + } + + public void setGlobalName(String name) { + spinnerName = name; + } + + public UINumberField getTextField() { + return textField; + } + + public void setValue(double value) { + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(spinnerName); + } + value = value < minValue ? minValue : value; + value = value > maxValue ? maxValue : value; + if (value == this.value) { + return; + } + this.value = value; + setTextField(value); + + fireStateChanged(); + } + + protected void setTextField(double value){ + textField.getDocument().removeDocumentListener(docListener); + textField.setValue(value); + textField.getDocument().addDocumentListener(docListener); + } + + public void setTextFieldValue(double value) { + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(spinnerName); + } + value = value < minValue ? minValue : value; + value = value > maxValue ? maxValue : value; + + if (value == this.value) { + return; + } + this.value = value; + fireStateChanged(); + } + + + public void setEnabled(boolean flag) { + super.setEnabled(flag); + this.textField.setEnabled(flag); + this.preButton.setEnabled(flag); + this.nextButton.setEnabled(flag); + } + + @Override + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height = SIZE; + return dim; + } + + /** + * 增加 a ChangeListener to the listener list. + * + * @param l 监听事件 + */ + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + } + + /** + * 移除 a ChangeListener from the listener list. + * + * @param l 监听事件 + */ + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + // august: Process the listeners last to first + protected void fireStateChanged() { + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + + private class ButtionUI extends UIButtonUI { + private boolean isNormalPaint = true; + + @Override + protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) { + if (isPressed(b) && b.isPressedPainted()) { + isNormalPaint = false; + Color pressColor = UIConstants.COMBOBOX_BTN_PRESS; + GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), pressColor); + } else if (isRollOver(b)) { + isNormalPaint = false; + Color hoverColor = UIConstants.COMBOBOX_BTN_ROLLOVER; + GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted(), hoverColor); + } else if (b.isNormalPainted()) { + isNormalPaint = true; + GUIPaintUtils.fillNormal(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted()); + } + } + + @Override + protected void paintModelIcon(ButtonModel model, Icon icon, Graphics g, JComponent c) { + if (isNormalPaint) { + g.setColor(UIConstants.COMBOBOX_BTN_NORMAL); + g.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + super.paintModelIcon(model, icon, g, c); + } + } + + private void initComponents() { + textField = initNumberField(); + textField.setMaxValue(maxValue); + textField.setMinValue(minValue); + setValue(value); + preButton = new UIButton(UIConstants.ARROW_UP_ICON) { + public boolean shouldResponseChangeListener() { + return false; + } + + @Override + public ButtonUI getUI() { + return new ButtionUI(); + } + }; + preButton.setRoundBorder(true, Constants.LEFT); + nextButton = new UIButton(UIConstants.ARROW_DOWN_ICON) { + public boolean shouldResponseChangeListener() { + return false; + } + + @Override + public ButtonUI getUI() { + return new ButtionUI(); + } + }; + nextButton.setRoundBorder(true, Constants.LEFT); + setLayout(new BorderLayout()); + add(textField, BorderLayout.CENTER); + JPanel arrowPane = new JPanel(); + arrowPane.setPreferredSize(new Dimension(LEN, SIZE)); + arrowPane.setLayout(new GridLayout(2, 1)); + preButton.setBounds(0, 1, WIDTH, HEIGHT); + nextButton.setBounds(0, HEIGHT, WIDTH, HEIGHT); + arrowPane.add(preButton); + arrowPane.add(nextButton); + add(arrowPane, BorderLayout.EAST); + componentInitListeners(); + } + + private void componentInitListeners() { + preButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + setValue(value + dierta); + } + }); + nextButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + setValue(value - dierta); + } + }); + addMouseWheelListener(new MouseWheelListener() { + + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + if (isEnabled() && e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) { + setValue(value - e.getWheelRotation()); + } + } + }); + initTextFiledListeners(); + } + + protected void initTextFiledListeners(){ + textField.getDocument().removeDocumentListener(docListener); + textField.getDocument().addDocumentListener(docListener); + textField.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + textField.getDocument().removeDocumentListener(docListener); + textField.setValue(value); + textField.getDocument().addDocumentListener(docListener); + } + }); + } + + protected UINumberField initNumberField() { + return new UINumberField(2) { + public boolean shouldResponseChangeListener() { + return false; + } + }; + } + + private DocumentListener docListener = new DocumentListener() { + @Override + public void removeUpdate(DocumentEvent e) { + setTextFieldValue(textField.getValue()); + } + + @Override + public void insertUpdate(DocumentEvent e) { + setTextFieldValue(textField.getValue()); + } + + @Override + public void changedUpdate(DocumentEvent e) { + setTextFieldValue(textField.getValue()); + } + }; + + /** + * 给组件登记一个观察者监听事件 + * + * @param listener 观察者监听事件 + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } + + /** + * 组件是否需要响应添加的观察者事件 + * + * @return 如果需要响应观察者事件则返回true,否则返回false + */ + public boolean shouldResponseChangeListener() { + return true; + } + + /** + * 给组件登记一个全局名字观察者监听事件 + * + * @param listener 观察者监听事件 + */ + public void registerNameListener(GlobalNameListener listener) { + globalNameListener = listener; + } + + /** + * 组件是否需要响应添加的观察者事件 + * + * @return 如果需要响应观察者事件则返回true,否则返回false + */ + public boolean shouldResponseNameListener() { + return true; + } + + /** + * 程序入口 测试 + * + * @param args 参数 + */ + public static void main(String... args) { +// LayoutManager layoutManager = null; +// JFrame jf = new JFrame("test"); +// jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); +// JPanel content = (JPanel) jf.getContentPane(); +// content.setLayout(layoutManager); +// +// UISpinner bb = new UISpinner(0, 9, 1); +// bb.setValue(4); +// bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); +// content.add(bb); +// GUICoreUtils.centerWindow(jf); +// jf.setSize(400, 400); +// jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ispinner/UISpinnerButtonUI.java b/designer-base/src/com/fr/design/gui/ispinner/UISpinnerButtonUI.java new file mode 100644 index 0000000000..606c7c1280 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ispinner/UISpinnerButtonUI.java @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.ispinner; + +import com.fr.design.gui.ibutton.UIBasicButtonUI; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-5 + * Time: 下午4:05 + */ +public class UISpinnerButtonUI extends UIBasicButtonUI { + private int orientation; + + protected static Dimension xpSize = new Dimension(15, 8); + + /** + * 创建UI + * @param c 组件 + * @return 组件UI + */ + public static ComponentUI createUI(JComponent c) { + throw new IllegalStateException("Must not be used this way."); + } + + /** + * Creates a new Spinner Button. Use either SwingConstants.SOUTH or SwingConstants.NORTH + * for a SpinnerButton of Type up or a down. + * + * @param type + */ + UISpinnerButtonUI(int type) { + orientation = type; + } + + public void paint(Graphics g, JComponent c) { + AbstractButton button = (AbstractButton) c; + + if (!button.isEnabled()) { + g.setColor(ThemeUtils.SPINNER_BUTT_DISABLED_COLOR); + } else if (button.getModel().isPressed()) { + g.setColor(ThemeUtils.SPINNER_BUTT_PRESSED_COLOR); + } else if (button.getModel().isRollover()) { + g.setColor(ThemeUtils.SPINNER_BUTT_ROLLOVER_COLOR); + } else { + g.setColor(ThemeUtils.SPINNER_BUTT_COLOR); + } + + drawXpButton(g, button); + + + if (!button.isEnabled()) { + g.setColor(ThemeUtils.SPINNER_ARROW_DISABLED_COLOR); + } else { + g.setColor(ThemeUtils.SPINNER_ARROW_COLOR); + } + + drawXpArrow(g, button); + + } + + private void drawXpButton(Graphics g, AbstractButton b) { + // g.setColor(Color.RED); + // g.fillRect(0, 0, b.getWidth(), b.getHeight()); + // if(true) return; + Color borderColor = ThemeUtils.BORDER_COLOR; + Color innerColor = ThemeUtils.WHITE_BORDER_COLOR; + int h = b.getSize().height; + int w = b.getSize().width; + + boolean isEnabled = b.isEnabled(); + boolean isRollover = b.getModel().isRollover(); + boolean isPressed = b.getModel().isPressed(); + Color pressedLightColor = ThemeUtils.PRESSED_LIGHT_COLOR; + Color pressedDarkColor = ThemeUtils.PRESSED_DARK_COLOR; + Color rolloverLightColor = ThemeUtils.ROLLOVER_LIGHT_COLOR; + Color rolloverDarkColor = ThemeUtils.ROLLOVER_DARK_COLOR; + Color normalLightColor = ThemeUtils.NORMAL_LIGHT_COLOR; + Color normalDarkColor = ThemeUtils.NORMAL_DARK_COLOR; + + Graphics2D g2 = (Graphics2D) g; + GradientPaint spinnerBg = new GradientPaint(0, 0, normalLightColor, 0, h, normalDarkColor); + GradientPaint HighLight = new GradientPaint(2, 2, new Color(1.0f, 1.0f, 1.0f, 0.6f), 0, h / 2, new Color(1.0f, 1.0f, 1.0f, 0.2f)); + GradientPaint spinnerCover = new GradientPaint(0, 0, rolloverLightColor, 0, h, rolloverDarkColor); + GradientPaint spinnerPressed = new GradientPaint(0, 0, pressedLightColor, 0, h, pressedDarkColor); + g2.setPaint(spinnerBg); + g2.fillRoundRect(2, 2, w - 4, h - 4, 3, 3); + g2.setPaint(HighLight); + g2.fillRect(2, 2, w - 4, (h - 4) / 2); + g2.setColor(borderColor); + g2.drawRoundRect(0, 0, w - 1, h - 1, 3, 3); + g2.setColor(innerColor); + g2.drawRoundRect(1, 1, w - 3, h - 3, 3, 3); + + if (isRollover) { + g2.setPaint(spinnerCover); + g2.fillRoundRect(2, 2, w - 4, h - 4, 3, 3); + } else if (isPressed) { + g2.setPaint(spinnerPressed); + g2.fillRoundRect(2, 2, w - 4, h - 4, 3, 3); + } else if (!isEnabled) { + g2.setColor(ThemeUtils.SPINNER_BUTT_DISABLED_COLOR); + g2.fillRoundRect(2, 2, w - 4, h - 4, 3, 3); + } + } + + + private void drawXpArrow(Graphics g, AbstractButton b) { + int y = (b.getSize().height - 6) / 2; + + switch (orientation) { + case SwingConstants.NORTH: + y--; + g.drawLine(7, y + 2, 7, y + 2); + g.drawLine(6, y + 3, 8, y + 3); + g.drawLine(5, y + 4, 9, y + 4); + g.drawLine(4, y + 5, 6, y + 5); + g.drawLine(8, y + 5, 10, y + 5); + break; + case SwingConstants.SOUTH: + g.drawLine(4, y + 2, 6, y + 2); + g.drawLine(8, y + 2, 10, y + 2); + g.drawLine(5, y + 3, 9, y + 3); + g.drawLine(6, y + 4, 8, y + 4); + g.drawLine(7, y + 5, 7, y + 5); + break; + } + } + + /** + * @see javax.swing.plaf.basic.BasicButtonUI#getPreferredSize(javax.swing.JComponent) + */ + public Dimension getPreferredSize(JComponent c) { + return xpSize; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ispinner/UISpinnerUI.java b/designer-base/src/com/fr/design/gui/ispinner/UISpinnerUI.java new file mode 100644 index 0000000000..d6d91e991d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ispinner/UISpinnerUI.java @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.ispinner; + + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.SpecialUIButton; +import com.fr.design.gui.ibutton.UIButton; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicSpinnerUI; +import javax.swing.text.InternationalFormatter; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.text.*; +import java.util.Calendar; +import java.util.Map; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-5 + * Time: 下午4:03 + */ +public class UISpinnerUI extends BasicSpinnerUI { + private static final ArrowButtonHandler NEXT_BUTTON_HANDLER = + new ArrowButtonHandler("increment", true); + private static final ArrowButtonHandler PREVIOUS_BUTTON_HANDLER = + new ArrowButtonHandler("decrement", false); + + /** + * 创建UI + * @param c 组件 + * @return 组件UI + */ + public static ComponentUI createUI(JComponent c) { + return new UISpinnerUI(); + } + + protected Component createPreviousButton() { +// JButton b = new SpecialUIButton(new UISpinnerButtonUI(SwingConstants.SOUTH)); + JButton b = new UIButton(UIConstants.ARROW_DOWN_ICON); + b.putClientProperty("isSpinnerButton", Boolean.TRUE); + b.setFocusable(false); + b.addActionListener(PREVIOUS_BUTTON_HANDLER); + b.addMouseListener(PREVIOUS_BUTTON_HANDLER); + + return b; + } + + protected Component createNextButton() { +// JButton b = new SpecialUIButton(new UISpinnerButtonUI(SwingConstants.NORTH)); + JButton b = new UIButton(UIConstants.ARROW_UP_ICON); + b.putClientProperty("isSpinnerButton", Boolean.TRUE); + b.setFocusable(false); + b.addActionListener(NEXT_BUTTON_HANDLER); + b.addMouseListener(NEXT_BUTTON_HANDLER); + + return b; + } + + /** + * Copy and paste from BasicSpinnerUI - sigh ! + *

+ *

+ * A handler for spinner arrow button mouse and action events. When + * a left mouse pressed event occurs we look up the (enabled) spinner + * that's the source of the event and start the autorepeat timer. The + * timer fires action events until any button is released at which + * point the timer is stopped and the reference to the spinner cleared. + * The timer doesn't start until after a 300ms delay, so often the + * source of the initial (and final) action event is just the button + * logic for mouse released - which means that we're relying on the fact + * that our mouse listener runs after the buttons mouse listener. + *

+ * Note that one instance of this handler is shared by all slider previous + * arrow buttons and likewise for all of the next buttons, + * so it doesn't have any state that persists beyond the limits + * of a single button pressed/released gesture. + */ + private static class ArrowButtonHandler extends AbstractAction implements MouseListener { + final javax.swing.Timer autoRepeatTimer; + final boolean isNext; + JSpinner spinner = null; + + ArrowButtonHandler(String name, boolean isNext) { + super(name); + this.isNext = isNext; + autoRepeatTimer = new javax.swing.Timer(20, this); + autoRepeatTimer.setInitialDelay(300); + } + + private JSpinner eventToSpinner(AWTEvent e) { + Object src = e.getSource(); + + while ((src instanceof Component) && !(src instanceof JSpinner)) { + src = ((Component) src).getParent(); + } + return (src instanceof JSpinner) ? (JSpinner) src : null; + } + + public void actionPerformed(ActionEvent e) { + JSpinner spinner = this.spinner; + + if (!(e.getSource() instanceof javax.swing.Timer)) { + // Most likely resulting from being in ActionMap. + spinner = eventToSpinner(e); + } + + if (spinner != null) { + try { + int calendarField = getCalendarField(spinner); + spinner.commitEdit(); + + if (calendarField != -1) { + ((SpinnerDateModel) spinner.getModel()).setCalendarField(calendarField); + } + + Object value = isNext ? spinner.getNextValue() : + spinner.getPreviousValue(); + if (value != null) { + spinner.setValue(value); + select(spinner); + } + } catch (IllegalArgumentException iae) { + UIManager.getLookAndFeel().provideErrorFeedback(spinner); + } catch (ParseException pe) { + UIManager.getLookAndFeel().provideErrorFeedback(spinner); + } + } + } + + /** + * If the spinner's editor is a DateEditor, this selects the field + * associated with the value that is being incremented. + */ + private void select(JSpinner spinner) { + JComponent editor = spinner.getEditor(); + + if (editor instanceof JSpinner.DateEditor) { + JSpinner.DateEditor dateEditor = (JSpinner.DateEditor) editor; + JFormattedTextField ftf = dateEditor.getTextField(); + Format format = dateEditor.getFormat(); + Object value; + + if (format != null && (value = spinner.getValue()) != null) { + SpinnerDateModel model = dateEditor.getModel(); + DateFormat.Field field = DateFormat.Field.ofCalendarField(model.getCalendarField()); + + if (field != null) { + try { + AttributedCharacterIterator iterator = format.formatToCharacterIterator(value); + if (!select(ftf, iterator, field) && field == DateFormat.Field.HOUR0) { + select(ftf, iterator, DateFormat.Field.HOUR1); + } + } catch (IllegalArgumentException iae) { + } + } + } + } + } + + /** + * Selects the passed in field, returning true if it is found, + * false otherwise. + */ + private boolean select(JFormattedTextField ftf, + AttributedCharacterIterator iterator, DateFormat.Field field) { + int max = ftf.getDocument().getLength(); + + iterator.first(); + do { + Map attrs = iterator.getAttributes(); + + if (attrs != null && attrs.containsKey(field)) { + int start = iterator.getRunStart(field); + int end = iterator.getRunLimit(field); + + if (start != -1 && end != -1 && start <= max && end <= max) { + ftf.select(start, end); + } + return true; + } + } while (iterator.next() != CharacterIterator.DONE); + return false; + } + + /** + * Returns the calendarField under the start of the selection, or + * -1 if there is no valid calendar field under the selection (or + * the spinner isn't editing dates. + */ + private int getCalendarField(JSpinner spinner) { + JComponent editor = spinner.getEditor(); + + if (editor instanceof JSpinner.DateEditor) { + JSpinner.DateEditor dateEditor = (JSpinner.DateEditor) editor; + JFormattedTextField ftf = dateEditor.getTextField(); + int start = ftf.getSelectionStart(); + JFormattedTextField.AbstractFormatter formatter = ftf.getFormatter(); + + if (formatter instanceof InternationalFormatter) { + Format.Field[] fields = ((InternationalFormatter) formatter).getFields(start); + + for (int counter = 0; counter < fields.length; counter++) { + if (fields[counter] instanceof DateFormat.Field) { + int calendarField; + + if (fields[counter] == DateFormat.Field.HOUR1) { + calendarField = Calendar.HOUR; + } else { + calendarField = ((DateFormat.Field) fields[counter]).getCalendarField(); + } + if (calendarField != -1) { + return calendarField; + } + } + } + } + } + + return -1; + } + + public void mousePressed(MouseEvent e) { + if (SwingUtilities.isLeftMouseButton(e) && e.getComponent().isEnabled()) { + spinner = eventToSpinner(e); + autoRepeatTimer.start(); + + focusSpinnerIfNecessary(); + } + } + + public void mouseReleased(MouseEvent e) { + autoRepeatTimer.stop(); + spinner = null; + } + + public void mouseClicked(MouseEvent e) { + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } + + /** + * Requests focus on a child of the spinner if the spinner doesn't + * have focus. + */ + private void focusSpinnerIfNecessary() { + Component fo = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); + if (spinner.isRequestFocusEnabled() && (fo == null || !SwingUtilities.isDescendingFrom(fo, spinner))) { + Container root = spinner; + + if (!root.isFocusCycleRoot()) { + root = root.getFocusCycleRootAncestor(); + } + if (root != null) { + FocusTraversalPolicy ftp = root.getFocusTraversalPolicy(); + Component child = ftp.getComponentAfter(root, spinner); + + if (child != null && SwingUtilities.isDescendingFrom(child, spinner)) { + child.requestFocus(); + } + } + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/ispinner/UpperCaseSpinner.java b/designer-base/src/com/fr/design/gui/ispinner/UpperCaseSpinner.java new file mode 100644 index 0000000000..add7264a42 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/ispinner/UpperCaseSpinner.java @@ -0,0 +1,132 @@ +package com.fr.design.gui.ispinner; + +import java.text.ParseException; +import java.util.List; + +import javax.swing.JComponent; +import javax.swing.JFormattedTextField; +import javax.swing.JSpinner; +import javax.swing.SpinnerDateModel; +import javax.swing.SpinnerListModel; +import javax.swing.SpinnerModel; +import javax.swing.SpinnerNumberModel; +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.DefaultFormatterFactory; +import javax.swing.text.DocumentFilter; + +import com.fr.stable.StableUtils; + +//_denny: 实在是没有办法处理让Spinner,小写转大写。这个UpperCaseSpinner在其他地方最好不要用 +public class UpperCaseSpinner extends UIBasicSpinner { + public UpperCaseSpinner(SpinnerModel model) { + super(model); + } + + protected JComponent createEditor(SpinnerModel model) { + if (model instanceof SpinnerDateModel) { + return new DateEditor(this); + } else if (model instanceof SpinnerListModel) { + return new UpperCaseEditor(this); + } else if (model instanceof SpinnerNumberModel) { + return new NumberEditor(this); + } else { + return new DefaultEditor(this); + } + } + + private class UpperCaseEditor extends DefaultEditor { + public UpperCaseEditor(JSpinner spinner) { + super(spinner); + if (!(spinner.getModel() instanceof SpinnerListModel)) { + throw new IllegalArgumentException( + "model not a SpinnerListModel"); + } + getTextField().setEditable(true); + getTextField().setFormatterFactory( + new DefaultFormatterFactory(new ListFormatter())); + } + + public SpinnerListModel getModel() { + return (SpinnerListModel) (getSpinner().getModel()); + } + + private class ListFormatter extends + JFormattedTextField.AbstractFormatter { + private DocumentFilter filter; + + public String valueToString(Object value) throws ParseException { + if (value == null) { + return ""; + } + return value.toString(); + } + + public Object stringToValue(String string) + throws ParseException { + //add将行数转换成ABC + try { + int num = Integer.parseInt(string); + if (num > 0) { + string = StableUtils.convertIntToABC(num); + } + } catch (Exception e) { + //do nothing string is string again + } + return string; + } + + protected DocumentFilter getDocumentFilter() { + if (filter == null) { + filter = new Filter(); + } + return filter; + } + + private class Filter extends DocumentFilter { + public void replace(FilterBypass fb, int offset, + int length, String string, AttributeSet attrs) + throws BadLocationException { + string = string.toUpperCase(); + if (string != null + && (offset + length) == fb.getDocument() + .getLength()) { + List list = getModel().getList(); + Object next = null; + for (int counter = 0; counter < list.size(); counter++) { + Object value = list.get(counter); + String str = value.toString(); + + if (str != null + && str.startsWith(fb.getDocument() + .getText(0, offset) + + string)) { + next = value; + break; + } + } + + String value = (next != null) ? next.toString() + : null; + + if (value != null) { + fb.remove(0, offset + length); + fb.insertString(0, value, null); + getFormattedTextField().select( + offset + string.length(), + value.length()); + return; + } + } + super.replace(fb, offset, length, string, attrs); + } + + public void insertString(FilterBypass fb, int offset, + String string, AttributeSet attr) + throws BadLocationException { + replace(fb, offset, 0, string, attr); + } + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneDivider.java b/designer-base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneDivider.java new file mode 100644 index 0000000000..b8af71a528 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneDivider.java @@ -0,0 +1,275 @@ +package com.fr.design.gui.isplitpanedivider; + +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.plaf.basic.BasicSplitPaneDivider; +import javax.swing.plaf.basic.BasicSplitPaneUI; +import javax.swing.plaf.metal.MetalLookAndFeel; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-12 + * Time: 下午4:50 + */ +public class UISplitPaneDivider extends BasicSplitPaneDivider { + + private static final int BOUND5 = 5; + + private int inset = 2; + private Color controlColor = MetalLookAndFeel.getControl(); + private Color primaryControlColor = MetalLookAndFeel.getPrimaryControl(); + + public UISplitPaneDivider(BasicSplitPaneUI ui) { + super(ui); + setLayout(new MetalDividerLayout()); + } + + public void paint(Graphics g) { + g.setColor(controlColor); + + Rectangle clip = g.getClipBounds(); + Insets insets = getInsets(); + g.fillRect(clip.x, clip.y, clip.width, clip.height); + Dimension size = getSize(); + size.width -= inset * 2; + size.height -= inset * 2; + int drawX = inset; + int drawY = inset; + + if (insets != null) { + size.width -= (insets.left + insets.right); + size.height -= (insets.top + insets.bottom); + drawX += insets.left; + drawY += insets.top; + } + + super.paint(g); + } + + /** + * Creates and return an instance of JButton that can be used to + * collapse the left component in the metal split pane. + */ + protected JButton createLeftOneTouchButton() { + JButton b = new JButton() { + public void setBorder(Border b) { + } + + public void paint(Graphics g) { + JSplitPane splitPane = getSplitPaneFromSuper(); + + // changed this in 1.3 + if (splitPane != null) { + int oneTouchSize = getOneTouchSizeFromSuper(); + int orientation = getOrientationFromSuper(); + + // Fill the background first ... + g.setColor(ThemeUtils.BACK_COLOR); + g.fillRect(0, 0, this.getWidth(), this.getHeight()); + + // use scrollArrowColor as button color + g.setColor(ThemeUtils.SCROLL_ARROW_COLOR); + + if (orientation == JSplitPane.VERTICAL_SPLIT) { + g.drawLine(2, 1, 3, 1); + g.drawLine(1, 2, 4, 2); + g.drawLine(0, 3, 5, 3); + } else { + // HORIZONTAL_SPLIT + g.drawLine(1, 2, 1, 3); + g.drawLine(2, 1, 2, 4); + g.drawLine(3, 0, 3, 5); + } + } + } + + // Don't want the button to participate in focus traversable. + public boolean isFocusTraversable() { + return false; + } + }; + b.setRequestFocusEnabled(false); + b.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + b.setFocusPainted(false); + b.setBorderPainted(false); + return b; + } + + /** + * Creates and return an instance of JButton that can be used to + * collapse the right component in the metal split pane. + */ + protected JButton createRightOneTouchButton() { + JButton b = new JButton() { + public void setBorder(Border border) { + } + + public void paint(Graphics g) { + JSplitPane splitPane = getSplitPaneFromSuper(); + + // changed this in 1.3 + if (splitPane != null) { + int oneTouchSize = getOneTouchSizeFromSuper(); + int orientation = getOrientationFromSuper(); + + // Fill the background first ... + g.setColor(ThemeUtils.BACK_COLOR); + g.fillRect(0, 0, this.getWidth(), this.getHeight()); + + // use scrollArrowColor as button color + g.setColor(ThemeUtils.SCROLL_ARROW_COLOR); + + if (orientation == JSplitPane.VERTICAL_SPLIT) { + g.drawLine(2, 3, 3, 3); + g.drawLine(1, 2, 4, 2); + g.drawLine(0, 1, 5, 1); + } else { + // HORIZONTAL_SPLIT + g.drawLine(3, 2, 3, 3); + g.drawLine(2, 1, 2, 4); + g.drawLine(1, 0, 1, 5); + } + } + } + + // Don't want the button to participate in focus traversable. + public boolean isFocusTraversable() { + return false; + } + }; + + b.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + b.setFocusPainted(false); + b.setBorderPainted(false); + b.setRequestFocusEnabled(false); + return b; + } + + /** + * Used to layout a TinySplitPaneDivider. Layout for the divider + * involves appropriately moving the left/right buttons around. + *

+ * This inner class is marked "public" due to a compiler bug. + * This class should be treated as a "protected" inner class. + * Instantiate it only within subclasses of TinySplitPaneDivider. + */ + public class MetalDividerLayout implements LayoutManager { + /** + * 布局 + * + * @param c 容器 + */ + public void layoutContainer(Container c) { + JButton leftButton = getLeftButtonFromSuper(); + JButton rightButton = getRightButtonFromSuper(); + JSplitPane splitPane = getSplitPaneFromSuper(); + int orientation = getOrientationFromSuper(); + int oneTouchSize = getOneTouchSizeFromSuper(); + int oneTouchOffset = getOneTouchOffsetFromSuper(); + Insets insets = getInsets(); + + // This layout differs from the one used in BasicSplitPaneDivider. + // It does not center justify the oneTouchExpadable buttons. + // This was necessary in order to meet the spec of the Metal + // splitpane divider. + if (leftButton != null && rightButton != null && c == UISplitPaneDivider.this) { + if (splitPane.isOneTouchExpandable()) { + if (orientation == JSplitPane.VERTICAL_SPLIT) { + int extraY = (insets != null) ? insets.top : 0; + int blockSize = getDividerSize(); + + if (insets != null) { + blockSize -= (insets.top + insets.bottom); + } + blockSize = Math.min(blockSize, oneTouchSize); + leftButton.setBounds(oneTouchOffset, extraY, blockSize * 2, blockSize); + rightButton.setBounds(oneTouchOffset + oneTouchSize * 2, extraY, blockSize * 2, blockSize); + } else { + int blockSize = getDividerSize(); + int extraX = (insets != null) ? insets.left : 0; + + if (insets != null) { + blockSize -= (insets.left + insets.right); + } + blockSize = Math.min(blockSize, oneTouchSize); + leftButton.setBounds(extraX, oneTouchOffset, blockSize, blockSize * 2); + rightButton.setBounds(extraX, oneTouchOffset + oneTouchSize * 2, blockSize, blockSize * 2); + } + } else { + leftButton.setBounds(-BOUND5, -BOUND5, 1, 1); + rightButton.setBounds(-BOUND5, -BOUND5, 1, 1); + } + } + } + + /** + * 最小布局 + * + * @param c 容器 + * @return 最小 + */ + public Dimension minimumLayoutSize(Container c) { + return new Dimension(0, 0); + } + + /** + *合适的布局大小 + * @param c 容器 + * @return 大小 + */ + public Dimension preferredLayoutSize(Container c) { + return new Dimension(0, 0); + } + + /** + * 去掉布局组件 + * @param c 组件 + */ + public void removeLayoutComponent(Component c) { + } + + /** + * 增加布局组件 + * @param string 名字 + * @param c 组件 + */ + public void addLayoutComponent(String string, Component c) { + } + } + + /* + * The following methods only exist in order to be able to access protected + * members in the superclass, because these are otherwise not available + * in any inner class. + */ + + int getOneTouchSizeFromSuper() { + return super.ONE_TOUCH_SIZE; + } + + int getOneTouchOffsetFromSuper() { + return super.ONE_TOUCH_OFFSET; + } + + int getOrientationFromSuper() { + return super.orientation; + } + + JSplitPane getSplitPaneFromSuper() { + return super.splitPane; + } + + JButton getLeftButtonFromSuper() { + return super.leftButton; + } + + JButton getRightButtonFromSuper() { + return super.rightButton; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneUI.java b/designer-base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneUI.java new file mode 100644 index 0000000000..1ae9e8451c --- /dev/null +++ b/designer-base/src/com/fr/design/gui/isplitpanedivider/UISplitPaneUI.java @@ -0,0 +1,33 @@ +package com.fr.design.gui.isplitpanedivider; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicSplitPaneDivider; +import javax.swing.plaf.metal.MetalSplitPaneUI; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-12 + * Time: 下午4:59 + */ +public class UISplitPaneUI extends MetalSplitPaneUI { + + /** + * 创建UI + * @param x 组件 + * @return 返回组件UI + */ + public static ComponentUI createUI(JComponent x) { + return new UISplitPaneUI(); + } + + /** + * 创建Divider + * @return 返回默认的divider + */ + public BasicSplitPaneDivider createDefaultDivider() { + return new UISplitPaneDivider(this); + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/itable/AbstractPropertyTable.java b/designer-base/src/com/fr/design/gui/itable/AbstractPropertyTable.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itable/AbstractPropertyTable.java rename to designer-base/src/com/fr/design/gui/itable/AbstractPropertyTable.java diff --git a/designer_base/src/com/fr/design/gui/itable/GroupRenderer.java b/designer-base/src/com/fr/design/gui/itable/GroupRenderer.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itable/GroupRenderer.java rename to designer-base/src/com/fr/design/gui/itable/GroupRenderer.java diff --git a/designer_base/src/com/fr/design/gui/itable/HeaderRenderer.java b/designer-base/src/com/fr/design/gui/itable/HeaderRenderer.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itable/HeaderRenderer.java rename to designer-base/src/com/fr/design/gui/itable/HeaderRenderer.java diff --git a/designer_base/src/com/fr/design/gui/itable/PropertyGroup.java b/designer-base/src/com/fr/design/gui/itable/PropertyGroup.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itable/PropertyGroup.java rename to designer-base/src/com/fr/design/gui/itable/PropertyGroup.java diff --git a/designer-base/src/com/fr/design/gui/itable/SortableJTable.java b/designer-base/src/com/fr/design/gui/itable/SortableJTable.java new file mode 100644 index 0000000000..71ffa8832e --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itable/SortableJTable.java @@ -0,0 +1,10 @@ +package com.fr.design.gui.itable; + +import javax.swing.JTable; + +public class SortableJTable extends JTable{ + public SortableJTable(TableSorter tableModel){ + super(tableModel); + tableModel.setTableHeader(getTableHeader()); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itable/TableSorter.java b/designer-base/src/com/fr/design/gui/itable/TableSorter.java new file mode 100644 index 0000000000..3a11edfbf6 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itable/TableSorter.java @@ -0,0 +1,496 @@ +package com.fr.design.gui.itable; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.swing.Icon; + +import com.fr.common.inputevent.InputEventBaseOnOS; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JTable; +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumnModel; +import javax.swing.table.TableModel; + +/** + * TableSorter is a decorator for TableModels; adding sorting + * functionality to a supplied TableModel. TableSorter does + * not store or copy the data in its TableModel; instead it maintains + * a map from the row indexes of the view to the row indexes of the + * model. As requests are made of the sorter (like getValueAt(row, col)) + * they are passed to the underlying model after the row numbers + * have been translated via the internal mapping array. This way, + * the TableSorter appears to hold another copy of the table + * with the rows in a different order. + *

+ * TableSorter registers itself as a listener to the underlying model, + * just as the JTable itself would. Events recieved from the model + * are examined, sometimes manipulated (typically widened), and then + * passed on to the TableSorter's listeners (typically the JTable). + * If a change to the model has invalidated the order of TableSorter's + * rows, a note of this is made and the sorter will resort the + * rows the next time a value is requested. + *

+ * When the tableHeader property is set, either by using the + * setTableHeader() method or the two argument constructor, the + * table header may be used as a complete UI for TableSorter. + * The default renderer of the tableHeader is decorated with a renderer + * that indicates the sorting status of each column. In addition, + * a mouse listener is installed with the following behavior: + *

    + *
  • + * Mouse-click: Clears the sorting status of all other columns + * and advances the sorting status of that column through three + * values: {NOT_SORTED, ASCENDING, DESCENDING} (then back to + * NOT_SORTED again). + *
  • + * SHIFT-mouse-click: Clears the sorting status of all other columns + * and cycles the sorting status of the column through the same + * three values, in the opposite order: {NOT_SORTED, DESCENDING, ASCENDING}. + *
  • + * CONTROL-mouse-click and CONTROL-SHIFT-mouse-click: as above except + * that the changes to the column do not cancel the statuses of columns + * that are already sorting - giving a way to initiate a compound + * sort. + *
+ *

+ * This is a long overdue rewrite of a class of the same name that + * first appeared in the swing table demos in 1997. + * + * @author Philip Milne + * @author Brendon McLean + * @author Dan van Enckevort + * @author Parwinder Sekhon + * @version 2.0 02/27/04 + */ + +public class TableSorter extends AbstractTableModel { + protected TableModel tableModel; + private static final int ADD = 4; + public static final int DESCENDING = -1; + public static final int NOT_SORTED = 0; + public static final int ASCENDING = 1; + + private static Directive EMPTY_DIRECTIVE = new Directive(-1, NOT_SORTED); + + public static final Comparator COMPARABLE_COMAPRATOR = new Comparator() { + public int compare(Object o1, Object o2) { + return ((Comparable) o1).compareTo(o2); + } + }; + public static final Comparator LEXICAL_COMPARATOR = new Comparator() { + public int compare(Object o1, Object o2) { + return o1.toString().compareTo(o2.toString()); + } + }; + + private Row[] viewToModel; + private int[] modelToView; + + private JTableHeader tableHeader; + private MouseListener mouseListener; + private TableModelListener tableModelListener; + private Map columnComparators = new HashMap(); + private List sortingColumns = new ArrayList(); + + public TableSorter() { + this.mouseListener = new MouseHandler(); + this.tableModelListener = new TableModelHandler(); + } + + public TableSorter(TableModel tableModel) { + this(); + setTableModel(tableModel); + } + + public TableSorter(TableModel tableModel, JTableHeader tableHeader) { + this(); + setTableHeader(tableHeader); + setTableModel(tableModel); + } + + private void clearSortingState() { + viewToModel = null; + modelToView = null; + } + + public TableModel getTableModel() { + return tableModel; + } + + public void setTableModel(TableModel tableModel) { + if (this.tableModel != null) { + this.tableModel.removeTableModelListener(tableModelListener); + } + + this.tableModel = tableModel; + if (this.tableModel != null) { + this.tableModel.addTableModelListener(tableModelListener); + } + + clearSortingState(); + fireTableStructureChanged(); + } + + public JTableHeader getTableHeader() { + return tableHeader; + } + + public void setTableHeader(JTableHeader tableHeader) { + if (this.tableHeader != null) { + this.tableHeader.removeMouseListener(mouseListener); + TableCellRenderer defaultRenderer = this.tableHeader.getDefaultRenderer(); + if (defaultRenderer instanceof SortableHeaderRenderer) { + this.tableHeader.setDefaultRenderer(((SortableHeaderRenderer) defaultRenderer).tableCellRenderer); + } + } + this.tableHeader = tableHeader; + if (this.tableHeader != null) { + this.tableHeader.addMouseListener(mouseListener); + this.tableHeader.setDefaultRenderer( + new SortableHeaderRenderer(this.tableHeader.getDefaultRenderer())); + } + } + + public boolean isSorting() { + return sortingColumns.size() != 0; + } + + private Directive getDirective(int column) { + for (int i = 0; i < sortingColumns.size(); i++) { + Directive directive = (Directive)sortingColumns.get(i); + if (directive.column == column) { + return directive; + } + } + return EMPTY_DIRECTIVE; + } + + public int getSortingStatus(int column) { + return getDirective(column).direction; + } + + private void sortingStatusChanged() { + clearSortingState(); + fireTableDataChanged(); + if (tableHeader != null) { + tableHeader.repaint(); + } + } + + public void setSortingStatus(int column, int status) { + Directive directive = getDirective(column); + if (directive != EMPTY_DIRECTIVE) { + sortingColumns.remove(directive); + } + if (status != NOT_SORTED) { + sortingColumns.add(new Directive(column, status)); + } + sortingStatusChanged(); + } + + protected Icon getHeaderRendererIcon(int column, int size) { + Directive directive = getDirective(column); + if (directive == EMPTY_DIRECTIVE) { + return null; + } + return new Arrow(directive.direction == DESCENDING, size, sortingColumns.indexOf(directive)); + } + + private void cancelSorting() { + sortingColumns.clear(); + sortingStatusChanged(); + } + + public void setColumnComparator(Class type, Comparator comparator) { + if (comparator == null) { + columnComparators.remove(type); + } else { + columnComparators.put(type, comparator); + } + } + + protected Comparator getComparator(int column) { + Class columnType = tableModel.getColumnClass(column); + Comparator comparator = (Comparator) columnComparators.get(columnType); + if (comparator != null) { + return comparator; + } + if (Comparable.class.isAssignableFrom(columnType)) { + return COMPARABLE_COMAPRATOR; + } + return LEXICAL_COMPARATOR; + } + + private Row[] getViewToModel() { + if (viewToModel == null) { + int tableModelRowCount = tableModel.getRowCount(); + viewToModel = new Row[tableModelRowCount]; + for (int row = 0; row < tableModelRowCount; row++) { + viewToModel[row] = new Row(row); + } + + if (isSorting()) { + Arrays.sort(viewToModel); + } + } + return viewToModel; + } + + public int modelIndex(int viewIndex) { + return getViewToModel()[viewIndex].modelIndex; + } + + private int[] getModelToView() { + if (modelToView == null) { + int n = getViewToModel().length; + modelToView = new int[n]; + for (int i = 0; i < n; i++) { + modelToView[modelIndex(i)] = i; + } + } + return modelToView; + } + + // TableModel interface methods + + public int getRowCount() { + return (tableModel == null) ? 0 : tableModel.getRowCount(); + } + + public int getColumnCount() { + return (tableModel == null) ? 0 : tableModel.getColumnCount(); + } + + public String getColumnName(int column) { + return tableModel.getColumnName(column); + } + + public Class getColumnClass(int column) { + return tableModel.getColumnClass(column); + } + + public boolean isCellEditable(int row, int column) { + return tableModel.isCellEditable(modelIndex(row), column); + } + + public Object getValueAt(int row, int column) { + return tableModel.getValueAt(modelIndex(row), column); + } + + public void setValueAt(Object aValue, int row, int column) { + tableModel.setValueAt(aValue, modelIndex(row), column); + } + + // Helper classes + + private class Row implements Comparable { + private int modelIndex; + + public Row(int index) { + this.modelIndex = index; + } + + public int compareTo(Object o) { + int row1 = modelIndex; + int row2 = ((Row) o).modelIndex; + + for (Iterator it = sortingColumns.iterator(); it.hasNext();) { + Directive directive = (Directive) it.next(); + int column = directive.column; + Object o1 = tableModel.getValueAt(row1, column); + Object o2 = tableModel.getValueAt(row2, column); + + int comparison = 0; + // Define null less than everything, except null. + if (o1 == null && o2 == null) { + comparison = 0; + } else if (o1 == null) { + comparison = -1; + } else if (o2 == null) { + comparison = 1; + } else { + comparison = getComparator(column).compare(o1, o2); + } + if (comparison != 0) { + return directive.direction == DESCENDING ? -comparison : comparison; + } + } + return 0; + } + } + + private class TableModelHandler implements TableModelListener { + public void tableChanged(TableModelEvent e) { + // If we're not sorting by anything, just pass the event along. + if (!isSorting()) { + clearSortingState(); + fireTableChanged(e); + return; + } + // If the table structure has changed, cancel the sorting; the + // sorting columns may have been either moved or deleted from the model. + if (e.getFirstRow() == TableModelEvent.HEADER_ROW) { + cancelSorting(); + fireTableChanged(e); + return; + } + // We can map a cell event through to the view without widening + // when the following conditions apply: + // + // a) all the changes are on one row (e.getFirstRow() == e.getLastRow()) and, + // b) all the changes are in one column (column != TableModelEvent.ALL_COLUMNS) and, + // c) we are not sorting on that column (getSortingStatus(column) == NOT_SORTED) and, + // d) a reverse lookup will not trigger a sort (modelToView != null) + // + // Note: INSERT and DELETE events fail this test as they have column == ALL_COLUMNS. + // + // The last check, for (modelToView != null) is to see if modelToView + // is already allocated. If we don't do this check; sorting can become + // a performance bottleneck for applications where cells + // change rapidly in different parts of the table. If cells + // change alternately in the sorting column and then outside of + // it this class can end up re-sorting on alternate cell updates - + // which can be a performance problem for large tables. The last + // clause avoids this problem. + int column = e.getColumn(); + if (e.getFirstRow() == e.getLastRow() + && column != TableModelEvent.ALL_COLUMNS + && getSortingStatus(column) == NOT_SORTED + && modelToView != null) { + int viewIndex = getModelToView()[e.getFirstRow()]; + fireTableChanged(new TableModelEvent(TableSorter.this, + viewIndex, viewIndex, + column, e.getType())); + return; + } + // Something has happened to the data that may have invalidated the row order. + clearSortingState(); + fireTableDataChanged(); + return; + } + } + + private class MouseHandler extends MouseAdapter { + public void mouseClicked(MouseEvent e) { + JTableHeader h = (JTableHeader) e.getSource(); + TableColumnModel columnModel = h.getColumnModel(); + int viewColumn = columnModel.getColumnIndexAtX(e.getX()); + int column = columnModel.getColumn(viewColumn).getModelIndex(); + if (column != -1) { + int status = getSortingStatus(column); + if (!InputEventBaseOnOS.isControlDown(e)) { + cancelSorting(); + } + // Cycle the sorting states through {NOT_SORTED, ASCENDING, DESCENDING} or + // {NOT_SORTED, DESCENDING, ASCENDING} depending on whether shift is pressed. + status = status + (e.isShiftDown() ? -1 : 1); + status = (status + ADD) % 3 - 1; // signed mod, returning {-1, 0, 1} + setSortingStatus(column, status); + } + } + } + + private static class Arrow implements Icon { + private boolean descending; + private int size; + private int priority; + + public Arrow(boolean descending, int size, int priority) { + this.descending = descending; + this.size = size; + this.priority = priority; + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + Color color = c == null ? Color.GRAY : c.getBackground(); + // In a compound sort, make each succesive triangle 20% + // smaller than the previous one. + int dx = (int)(size/2*Math.pow(0.8, priority)); + int dy = descending ? dx : -dx; + // Align icon (roughly) with font baseline. + y = y + 5*size/6 + (descending ? -dy : 0); + int shift = descending ? 1 : -1; + g.translate(x, y); + + // Right diagonal. + g.setColor(color.darker()); + g.drawLine(dx / 2, dy, 0, 0); + g.drawLine(dx / 2, dy + shift, 0, shift); + + // Left diagonal. + g.setColor(color.brighter()); + g.drawLine(dx / 2, dy, dx, 0); + g.drawLine(dx / 2, dy + shift, dx, shift); + + // Horizontal line. + if (descending) { + g.setColor(color.darker().darker()); + } else { + g.setColor(color.brighter().brighter()); + } + g.drawLine(dx, 0, 0, 0); + + g.setColor(color); + g.translate(-x, -y); + } + + public int getIconWidth() { + return size; + } + + public int getIconHeight() { + return size; + } + } + + private class SortableHeaderRenderer implements TableCellRenderer { + private TableCellRenderer tableCellRenderer; + + public SortableHeaderRenderer(TableCellRenderer tableCellRenderer) { + this.tableCellRenderer = tableCellRenderer; + } + + public Component getTableCellRendererComponent(JTable table, + Object value, + boolean isSelected, + boolean hasFocus, + int row, + int column) { + Component c = tableCellRenderer.getTableCellRendererComponent(table, + value, isSelected, hasFocus, row, column); + if (c instanceof UILabel) { + UILabel l = (UILabel) c; + l.setHorizontalTextPosition(UILabel.LEFT); + int modelColumn = table.convertColumnIndexToModel(column); + l.setIcon(getHeaderRendererIcon(modelColumn, l.getFont().getSize())); + } + return c; + } + } + + private static class Directive { + private int column; + private int direction; + + public Directive(int column, int direction) { + this.column = column; + this.direction = direction; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itable/UIBasicTableUI.java b/designer-base/src/com/fr/design/gui/itable/UIBasicTableUI.java new file mode 100644 index 0000000000..122381cfc9 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itable/UIBasicTableUI.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.itable; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicTableUI; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-4-24 + * Time: 上午10:03 + */ +public class UIBasicTableUI extends BasicTableUI { + + JTable table; + + public UIBasicTableUI() { + super(); + } + + public UIBasicTableUI(JComponent table) { + super(); + this.table = (JTable) table; + this.table.setRowHeight(20); + } + + /** + * 创建UI界面 + * @param table 表 + * @return 组件UI + */ + public static ComponentUI createUI(JComponent table) { + return new UIBasicTableUI(table); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itable/UIComponentTable.java b/designer-base/src/com/fr/design/gui/itable/UIComponentTable.java new file mode 100644 index 0000000000..aca32e73e6 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itable/UIComponentTable.java @@ -0,0 +1,35 @@ +package com.fr.design.gui.itable; + +import javax.swing.JComponent; +import com.fr.design.gui.ilable.UILabel; + +/** + * 保持 编辑控件 存在 不toString + * @author kunsnat E-mail:kunsnat@gmail.com + * @version 创建时间:2013-1-6 下午03:37:18 + */ +public class UIComponentTable extends UITable { + + public UIComponentTable(int columnSize) { + this.setModel(new UITableComponentModel(columnSize)); + initComponents(); + } + + /** + * @param value 该行列的值(字符串) + * @param row + * @param column + * @return 列表中默认显示的东西,如果有很多内容,可以装载一个JPanel里再嵌进来 + */ + protected JComponent getRenderCompoment(Object value, int row, int column) { + UILabel text = new UILabel(); + if (value != null) { + text.setText(value.toString()); + } + if(value instanceof JComponent) { + return (JComponent)value; + } + return text; + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/itable/UIDefaultTableCellEditor.java b/designer-base/src/com/fr/design/gui/itable/UIDefaultTableCellEditor.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itable/UIDefaultTableCellEditor.java rename to designer-base/src/com/fr/design/gui/itable/UIDefaultTableCellEditor.java diff --git a/designer-base/src/com/fr/design/gui/itable/UISelectTable.java b/designer-base/src/com/fr/design/gui/itable/UISelectTable.java new file mode 100644 index 0000000000..89e1a40a43 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itable/UISelectTable.java @@ -0,0 +1,108 @@ +package com.fr.design.gui.itable; + +import java.awt.BorderLayout; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JFrame; +import javax.swing.JPanel; + +import com.fr.design.event.ChangeEvent; +import com.fr.design.event.ChangeListener; +import com.fr.design.utils.gui.GUICoreUtils; + +public class UISelectTable extends UITable implements MouseListener { + + protected int selectedRowIndex = -1; + private List selectionListeners = new ArrayList(); + + public UISelectTable(int columnSize) { + super(columnSize); + addMouseListener(this); + } + + /** + * 给表添加选择事件 + * + * @param listener 选择表数据时触发的事件 + */ + public void addSelectionChangeListener(ChangeListener listener) { + selectionListeners.add(listener); + } + + private void fireSelectionChangeListener(ChangeEvent e) { + for (int i = selectionListeners.size(); i > 0; i--) { + selectionListeners.get(i - 1).fireChanged(e); + } + } + + @Override + public boolean isCellEditable(int row, int column) { + return column != 0 && super.isCellEditable(row, column); + } + + /** + * 鼠标点击事件,以触发表的选择事件 + * + * @param e 鼠标事件对象 + */ + @Override + public final void mouseClicked(MouseEvent e) { + selectedRowIndex = rowAtPoint(e.getPoint()); + Object selectItem = getModel().getValueAt(selectedRowIndex, columnAtPoint(e.getPoint())); + fireSelectionChangeListener(new ChangeEvent(selectItem)); + } + + /** + * Invoked when a mouse button has been pressed on a component. + */ + @Override + public void mousePressed(MouseEvent e) { + } + + /** + * Invoked when a mouse button has been released on a component. + */ + @Override + public void mouseReleased(MouseEvent e) { + } + + /** + * Invoked when the mouse enters a component. + */ + @Override + public void mouseEntered(MouseEvent e) { + } + + /** + * Invoked when the mouse exits a component. + */ + @Override + public void mouseExited(MouseEvent e) { + } + + + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(new BorderLayout()); + List data = new ArrayList(); + String[] a = {"1", "11"}; + String[] b = {"2", "22"}; + String[] c = {"3", "33"}; + String[] d = {"4", "44"}; + data.add(a); + data.add(b); + data.add(c); + data.add(d); + UISelectTable pane = new UISelectTable(1); + pane.populateBean(data); + content.add(pane, BorderLayout.CENTER); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itable/UITable.java b/designer-base/src/com/fr/design/gui/itable/UITable.java new file mode 100644 index 0000000000..ca214c4241 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itable/UITable.java @@ -0,0 +1,388 @@ +package com.fr.design.gui.itable; + +import java.awt.*; +import java.awt.event.AWTEventListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.BorderFactory; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTable; +import javax.swing.event.CellEditorListener; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.TableUI; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; + +import com.fr.design.constants.UIConstants; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.utils.gui.GUICoreUtils; + +public class UITable extends JTable implements UIObserver { + + + private static final int OFF_LEFT = 10; + private static final int DEFAULT_ROW_HEIGHT =20; + private UIObserverListener uiObserverListener; + UITableEditor editor ; + private boolean shouldResponseAwt; + private boolean isEditingStopped; + + + /** + * 在没有任何数据的时候,使用此构造函数,然后通过populate更新数据 + * + * @param columnSize 列表的列数 + */ + public UITable(int columnSize) { + + super(new UITableDataModel(columnSize)); + initComponents(); + iniListener(); + shouldResponseAwt = false; + // kunsnat: 屏蔽: 对于下拉框, 无法等待选择结果之后在stop.. +// Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); + } + + public UITable (int columnSize, boolean needAWTEventListener) { + this(columnSize); + shouldResponseAwt = needAWTEventListener; + isEditingStopped = true; + if (needAWTEventListener) { + Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); + this.addFocusListener(new FocusAdapter() { + public void focusGained(FocusEvent e) { + isEditingStopped = false; + } + }); + } + } + + /** + * values不允许为空! + * + * @param values 一个列表,里面装有字符串数组,每个数组代表一行内容 + */ + public UITable(List values) { + super(new UITableDataModel(values)); + initComponents(); + iniListener(); + } + + public UITable() { + + } + + public void populateBean(List values) { + getTableDataModel().populateBean(values); + } + + + + private AWTEventListener awt = new AWTEventListener() { + public void eventDispatched(AWTEvent event) { + if(!UITable.this.isShowing()){ + return; + } + doSomeInAll(event); + } + }; + + private void doSomeInAll(AWTEvent event) { + Rectangle bounds = new Rectangle(getLocationOnScreen().x, getLocationOnScreen().y, getWidth(), getHeight()); + if (event instanceof MouseEvent) { + MouseEvent mv = (MouseEvent) event; + if (mv.getClickCount() > 0) { + Point point = new Point((int) (mv.getLocationOnScreen().getX()) - 2 * OFF_LEFT, (int) mv.getLocationOnScreen().getY()); + // 判断鼠标点击是否在边界内 + if (!bounds.contains(point) && shouldResponseAwt) { + if (!isEditingStopped) { + this.editor.stopCellEditing(); + isEditingStopped = true; + } + } + } + } + } + + public List updateBean() { + return getTableDataModel().updateBean(); + } + + /** + * 在table底部增加一空行 + */ + public void addBlankLine() { + getTableDataModel().addBlankLine(); + } + + /** + * 在table底部增加一行内容 + * @param line 该行的内容 + */ + public void addLine(Object[] line) { + getTableDataModel().addLine(line); + } + + /** + * @param rowIndex + * @return 某一行的内容 + */ + public Object[] getLine(int rowIndex) { + return getTableDataModel().getLine(rowIndex); + } + + /** + * 删除某行内容 + * + * @param rowIndex 行号 + */ + public void removeLine(int rowIndex) { + getTableDataModel().removeLine(rowIndex); + } + + /** + * 对某一行拖动时进行排序 + * + * @param rowIndex 行号 + * @param positive 鼠标移动的距离 + */ + public void dragSort(int rowIndex, boolean positive) { + ((UITableDataModel) dataModel).dragSort(rowIndex, positive); + } + + + /** + *格子是否可编辑,可置顶某一列column不可编辑 + * @param row 行号 + * @param column 列号 + * @return 是否可编辑 + */ + public boolean isCellEditable(int row, int column) { + return true; + } + + /** + * 清空数据 + */ + public void clear() { + getTableDataModel().clear(); + } + + private UITableDataModel getTableDataModel() { + return (UITableDataModel) dataModel; + } + + /** + * @param value 该行列的值(字符串) + * @param row + * @param column + * @return 列表中默认显示的东西,如果有很多内容,可以装载一个JPanel里再嵌进来 + */ + protected JComponent getRenderCompoment(Object value, int row, int column) { + UILabel text = new UILabel(); + if (value != null) { + text.setText(value.toString()); + } + return text; + } + + protected void initComponents() { + setShowGrid(false); + setRowHeight(getRowHeight4Table()); + setDragEnabled(false); + editor = createTableEditor(); + editor.addCellEditorListener(new CellEditorListener() { + @Override + public void editingStopped(ChangeEvent e) { + tableCellEditingStopped(e); + } + + @Override + public void editingCanceled(ChangeEvent e) { + tableCellEditingCanceled(e); + } + + }); + + setBackground(UIConstants.NORMAL_BACKGROUND); + setDefaultEditor(UITable.class, editor); + setDefaultRenderer(UITable.class, new UITableRender()); + setUI(getUI()); + + TableColumn deleteTableColumn = new TableColumn(getTableDataModel().getColumnCount()); + deleteTableColumn.setCellEditor(null); + deleteTableColumn.setCellRenderer(null); + deleteTableColumn.setMaxWidth(20); + getColumnModel().addColumn(deleteTableColumn); + } + + /** + * 鼠标悬浮再某一行时触发的事件 + * @param index 行号 + */ + public void dealWithRollOver(int index){ + + } + + private void iniListener(){ + if(shouldResponseChangeListener()){ + this.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + if(uiObserverListener == null){ + return ; + } + uiObserverListener.doChange(); + } + }); + } + } + + protected int getRowHeight4Table() { + return DEFAULT_ROW_HEIGHT; + } + + + /** + *停止编辑事件 + * @param e 事件 + */ + public void tableCellEditingStopped(ChangeEvent e) { + + } + + /** + *取消编辑事件 + * @param e 事件 + */ + public void tableCellEditingCanceled(ChangeEvent e) { + + } + + /** + * 编辑器 + * @return 编辑器 + */ + public UITableEditor createTableEditor() { + return new UIDefaultTableCellEditor(new UITextField()); + } + + @Override + /** + * + */ + public TableUI getUI() { + return new UITableUI(); + } + + @Override + /** + * + */ + public TableCellEditor getDefaultEditor(Class columnClass) { + columnClass = UITable.class; + return super.getDefaultEditor(columnClass); + } + + @Override + /** + * + */ + public TableCellRenderer getDefaultRenderer(Class columnClass) { + columnClass = UITable.class; + return super.getDefaultRenderer(columnClass); + } + + /** + * 给组件登记一个观察者监听事件 + * + * @param listener 观察者监听事件 + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } + + /** + * 组件是否需要响应添加的观察者事件 + * + * @return 如果需要响应观察者事件则返回true,否则返回false + */ + public boolean shouldResponseChangeListener() { + return true; + } + + protected class UITableRender implements TableCellRenderer { + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, boolean isSelected, boolean hasFocus, int row, + int column) { + JComponent comp = getRenderCompoment(value, row, column); + comp.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); + return comp; + } + } + + protected void fireTargetChanged() { + repaint(); + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener) listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + + /** + * 增加监听 + * @param l 监听 + */ + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + } + + /** + *移除监听 + * @param l 监听 + */ + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + /** + *测试主函数 + * @param args 参数 + */ + public static void main(String... args) { + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(new BorderLayout()); + List data = new ArrayList(); + String[] a = {"1", "11"}; + String[] b = {"2", "22"}; + String[] c = {"3", "33"}; + String[] d = {"4", "44"}; + data.add(a); + data.add(b); + data.add(c); + data.add(d); + UITable pane = new UITable(2); + pane.populateBean(data); + content.add(pane, BorderLayout.CENTER); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itable/UITableComponentModel.java b/designer-base/src/com/fr/design/gui/itable/UITableComponentModel.java new file mode 100644 index 0000000000..e7b39a0320 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itable/UITableComponentModel.java @@ -0,0 +1,23 @@ +package com.fr.design.gui.itable; + + +/** + * 预想的 只比UITableDataModel 差别一件事: setValue 不做toString 保持编辑component存在. + * + * @author kunsnat E-mail:kunsnat@gmail.com + * @version 创建时间:2013-1-6 下午03:32:22 + */ +public class UITableComponentModel extends UITableDataModel { + + public UITableComponentModel(int columnSize) { + super(columnSize); + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + if(rowIndex >= values.size() || columnIndex >= columnSize || aValue == null) { + return; + } + values.get(rowIndex)[columnIndex] = aValue; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itable/UITableDataModel.java b/designer-base/src/com/fr/design/gui/itable/UITableDataModel.java new file mode 100644 index 0000000000..d56be407ab --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itable/UITableDataModel.java @@ -0,0 +1,146 @@ +package com.fr.design.gui.itable; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.event.TableModelListener; +import javax.swing.table.TableModel; + +public class UITableDataModel implements TableModel { + protected List values; + protected int columnSize; + + public UITableDataModel(int columnSize) { + this.columnSize = columnSize; + this.values = new ArrayList(); + } + + public UITableDataModel(List values) { + if (values == null) { + return; + } + this.values = values; + this.columnSize = values.get(0).length; + } + + public void populateBean(List values) { + if (values == null) { + return; + } + this.values.clear(); + this.values = values; + } + + public void clear() { + values.clear(); + } + + public List updateBean() { + return values; + } + + public void dragSort(int rowIndex, boolean positive) { + if (values == null || rowIndex == -1) { + return; + } + + if (positive && rowIndex < values.size() - 1) { + Object[] tmp = values.get(rowIndex); + values.set(rowIndex, values.get(rowIndex + 1)); + values.set(rowIndex + 1, tmp); + tmp = null; + } else if (!positive && rowIndex > 1) { + Object[] tmp = values.get(rowIndex); + values.set(rowIndex, values.get(rowIndex - 1)); + values.set(rowIndex - 1, tmp); + tmp = null; + } + } + + public Object[] getLine(int rowIndex) { + if (rowIndex >= values.size() || rowIndex < 0) { + return null; + } + return values.get(rowIndex); + } + + public void removeLine(int rowIndex) { + if (rowIndex >= values.size() || rowIndex < 0) { + return; + } + values.remove(rowIndex); + } + + public void addLine(Object[] line) { + if (line.length != columnSize) { + return; + } + values.add(line); + } + + public void addBlankLine() { + Object[] newLine = new Object[columnSize]; + values.add(newLine); + } + + @Override + public int getRowCount() { + return values.size(); + } + + @Override + public int getColumnCount() { + return columnSize; + } + + @Override + public String getColumnName(int columnIndex) { + return null; + } + + @Override + public Class getColumnClass(int columnIndex) { + return null; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return true; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + if (rowIndex >= values.size() || columnIndex >= columnSize) { + return null; + } + Object[] rowValue = values.get(rowIndex); + if (columnIndex > -1 && columnIndex < rowValue.length) { + return values.get(rowIndex)[columnIndex]; + } + return null; + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + if (rowIndex >= values.size() || columnIndex >= columnSize) { + return; + } + if (aValue == null) { + values.get(rowIndex)[columnIndex] = null; + return; + } + values.get(rowIndex)[columnIndex] = aValue.toString(); + } + + @Override + public void addTableModelListener(TableModelListener l) { + // TODO Auto-generated method stub + + } + + @Override + public void removeTableModelListener(TableModelListener l) { + // TODO Auto-generated method stub + + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/itable/UITableEditor.java b/designer-base/src/com/fr/design/gui/itable/UITableEditor.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itable/UITableEditor.java rename to designer-base/src/com/fr/design/gui/itable/UITableEditor.java diff --git a/designer-base/src/com/fr/design/gui/itable/UITableNoOptionUI.java b/designer-base/src/com/fr/design/gui/itable/UITableNoOptionUI.java new file mode 100644 index 0000000000..6cb9d37b96 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itable/UITableNoOptionUI.java @@ -0,0 +1,25 @@ +package com.fr.design.gui.itable; + +import java.awt.event.MouseEvent; + +import javax.swing.event.MouseInputListener; + +/** + * 删除按钮 无提示框 + * @author kunsnat E-mail:kunsnat@gmail.com + * @version 创建时间:2012-11-14 下午12:57:53 + */ +public class UITableNoOptionUI extends UITableUI { + + protected MouseInputListener createMouseInputListener() { + return new MyMouseListener() { + public void mousePressed(MouseEvent e) { + if (e.getX() >= table.getWidth() - 20) { + ((UITable)table).removeLine(table.rowAtPoint(e.getPoint())); + ((UITable)table).fireTargetChanged(); + ((UITable)table).getParent().doLayout(); + } + } + }; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itable/UITableUI.java b/designer-base/src/com/fr/design/gui/itable/UITableUI.java new file mode 100644 index 0000000000..e4310aca2a --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itable/UITableUI.java @@ -0,0 +1,225 @@ +package com.fr.design.gui.itable; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.Stroke; +import java.awt.event.MouseEvent; +import java.awt.image.BufferedImage; + +import javax.swing.CellRendererPane; +import javax.swing.JComponent; +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.event.MouseInputListener; +import javax.swing.plaf.basic.BasicTableUI; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableModel; + +import com.fr.base.BaseUtils; +import com.fr.design.constants.UIConstants; +import com.fr.design.mainframe.DesignerContext; +import com.fr.general.Inter; +import com.fr.stable.Constants; +import com.fr.design.utils.gui.GUIPaintUtils; + +public class UITableUI extends BasicTableUI { + private static BufferedImage closeIcon = BaseUtils.readImageWithCache("com/fr/design/images/toolbarbtn/close.png"); + protected boolean isReleased = true; + protected int rollOverRowIndex = -1; + protected int dragStartRowIndex = -1; + protected int dragStartY = -1; + protected int dragEndY = -1; + private int startColumn; + private int startRow; + private boolean draggingRow = false; + private static final int WIDTH_GAP = 20; + private int startDragPoint; + + private int dyOffset; + + + public UITableUI() { + super(); + } + + public UITableUI(JComponent table) { + super(); + this.table = (JTable) table; + this.table.setRowHeight(20); + } + + @Override + public void paint(Graphics g, JComponent c) { + Graphics2D g2d = (Graphics2D) g; + Color oldColor = g2d.getColor(); + Stroke oldStroke = g2d.getStroke(); + //鼠标悬停时,画一层蓝色背景色 + paintRolloverBackground(g2d); + super.paint(g, c); + //画虚线,不重写原来的paintGrid因为paintGrid为private +// paintDotLine(g2d); + //画X号 + paintDeleteButton(g2d); + //画拖拽 + paintDragTab(g2d); + + + g2d.setStroke(oldStroke); + g2d.setColor(oldColor); + } + + protected void paintDragTab(Graphics2D g) { + if (draggingRow) { + g.setColor(table.getParent().getBackground()); + Rectangle cellRect = table.getCellRect(table.getSelectedRow(), 0, false); + g.copyArea(cellRect.x, cellRect.y, table.getWidth(), table.getRowHeight(), cellRect.x, dyOffset); + if (dyOffset < 0) { + g.fillRect(cellRect.x, cellRect.y + (table.getRowHeight() + dyOffset), table.getWidth(), (dyOffset * -1)); + } else { + g.fillRect(cellRect.x, cellRect.y, table.getWidth(), dyOffset); + } + } + } + + protected boolean isDeletable(){ + return true; + } + + private void paintDeleteButton(Graphics2D g2d) { + if (!isReleased || rollOverRowIndex == -1) { + return; + } + if(!isDeletable()){ + return; + } + g2d.drawImage(closeIcon, table.getWidth() - 20, rollOverRowIndex * table.getRowHeight() + 1, closeIcon.getWidth(), closeIcon.getHeight(), table); + } + + private void paintRolloverBackground(Graphics2D g2d) { + if (rollOverRowIndex != -1) { + g2d.setColor(UIConstants.FLESH_BLUE); + GUIPaintUtils.fillPaint(g2d, 1, rollOverRowIndex * table.getRowHeight(), table.getWidth() - 2, table.getRowHeight(), true, Constants.NULL, UIConstants.FLESH_BLUE, UIConstants.LARGEARC); + } + } + + protected MouseInputListener createMouseInputListener() { + return new MyMouseListener(); + } + + protected class MyMouseListener extends BasicTableUI.MouseInputHandler { + + public void mouseMoved(MouseEvent e) { + super.mouseMoved(e); + int tmp = table.rowAtPoint(e.getPoint()); + if (rollOverRowIndex != tmp && isReleased) { + rollOverRowIndex = tmp; + ((UITable)table).dealWithRollOver(rollOverRowIndex); + table.repaint(); + } + } + + @Override + public void mousePressed(MouseEvent e) { + super.mousePressed(e); + if (e.getX() >= table.getWidth() - WIDTH_GAP) { + if (table.isEditing()) { + table.getCellEditor(startRow, startColumn).stopCellEditing(); + } + + if(!isDeletable()){ + return; + } + if (!table.isEditing()) { + int val = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("Utils-Are_you_sure_to_remove_the_selected_item") + "?", + Inter.getLocText("Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (val == JOptionPane.OK_OPTION) { + ((UITable) table).removeLine(table.rowAtPoint(e.getPoint())); + ((UITable) table).fireTargetChanged(); + ((UITable) table).getParent().doLayout(); + return; + } + } + } + startColumn = table.columnAtPoint(e.getPoint()); + startRow = table.rowAtPoint(e.getPoint()); + startDragPoint = (int) e.getPoint().getY(); + } + + @Override + public void mouseReleased(MouseEvent e) { + super.mouseReleased(e); + draggingRow = false; + isReleased = true; + table.repaint(); + } + + @Override + public void mouseDragged(MouseEvent e) { + int fromRow = table.getSelectedRow(); + TableCellEditor tableCellEditor = table.getCellEditor(startRow, startColumn); + tableCellEditor.stopCellEditing(); + + if (fromRow >= 0) { + draggingRow = true; + int rowHeight = table.getRowHeight(); + int middleOfSelectedRow = (rowHeight * fromRow) + (rowHeight / 2); + int toRow = -1; + int yMousePoint = (int) e.getPoint().getY(); + + if (yMousePoint < (middleOfSelectedRow - rowHeight)) { + toRow = fromRow - 1; + } else if (yMousePoint > (middleOfSelectedRow + rowHeight)) { + toRow = fromRow + 1; + } + + if (toRow >= 0 && toRow < table.getRowCount()) { + TableModel model = table.getModel(); + + for (int i = 0; i < model.getColumnCount(); i++) { + Object fromValue = model.getValueAt(fromRow, i); + Object toValue = model.getValueAt(toRow, i); + + model.setValueAt(toValue, fromRow, i); + model.setValueAt(fromValue, toRow, i); + } + table.setRowSelectionInterval(toRow, toRow); + startDragPoint = yMousePoint; + rollOverRowIndex = toRow; + } + dyOffset = (startDragPoint - yMousePoint) * -1; + table.repaint(); + } + } + + + } + + protected void startDragTab(MouseEvent e) { + rollOverRowIndex = -1; + dragStartY = e.getY(); + dragStartRowIndex = table.rowAtPoint(e.getPoint()); + } + + protected void resetDragTab() { + dragStartY = -1; + dragEndY = -1; + isReleased = true; + } + + /** + * 初始化UI + * + * @param c 组件 + */ + public void installUI(JComponent c) { + table = (JTable) c; + rendererPane = new CellRendererPane(); + table.add(rendererPane); + installDefaults(); + installListeners(); + installKeyboardActions(); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itableeditorpane/ActionStyle.java b/designer-base/src/com/fr/design/gui/itableeditorpane/ActionStyle.java new file mode 100644 index 0000000000..f39819879a --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itableeditorpane/ActionStyle.java @@ -0,0 +1,16 @@ +package com.fr.design.gui.itableeditorpane; + +public interface ActionStyle { + + public int ADDSTYLE = 1; + + public int DELETESTYLE = 2; + + public int MOVEUPSTYLE = 3; + + public int MOVEDOWNSTYLE = 4; + + public int ADDJSFILE = 6; + + public int ADDCSSFILE = 7; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itableeditorpane/ParameterTableModel.java b/designer-base/src/com/fr/design/gui/itableeditorpane/ParameterTableModel.java new file mode 100644 index 0000000000..d68ab32b60 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itableeditorpane/ParameterTableModel.java @@ -0,0 +1,263 @@ +package com.fr.design.gui.itableeditorpane; + +import com.fr.base.Parameter; +import com.fr.design.editor.ValueEditorPane; +import com.fr.design.editor.ValueEditorPaneFactory; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.general.Inter; +import com.fr.stable.ParameterProvider; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.event.CellEditorListener; +import javax.swing.event.ChangeEvent; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableCellEditor; +import java.awt.*; +import java.awt.event.ActionEvent; + +/** + * 参数列表 下拉参数模式. +* @author kunsnat E-mail:kunsnat@gmail.com +* @version 创建时间:2013-1-11 上午10:07:49 + */ +public class ParameterTableModel extends UITableModelAdapter { + + public static final int NO_CHART_USE = 0; + public static final int CHART_NORMAL_USE = 1; + public static final int FORM_NORMAL_USE = -1; + + private static final long serialVersionUID = 1L; + protected Component component = null; //指定确认对话框的父窗口,bug40340 + public ParameterTableModel() { + this(NO_CHART_USE); + } + + public ParameterTableModel(int paraUseType) { + super(new String[] { Inter.getLocText("Parameter"), Inter.getLocText("Value") }); + this.setColumnClass(new Class[] { ParameterEditor.class, ParameterValueEditor.class }); + this.setDefaultEditor(ParameterValueEditor.class, new ParameterValueEditor(paraUseType)); + this.setDefaultEditor(ParameterEditor.class, new ParameterEditor()); + this.setDefaultRenderer(ParameterValueEditor.class, new ParameterValueRenderer(paraUseType)); + } + + public ParameterTableModel(int paraUseType, Component component) { + super(new String[] { Inter.getLocText("Parameter"), Inter.getLocText("Value") }); + this.setColumnClass(new Class[] { ParameterEditor.class, ParameterValueEditor.class }); + this.setDefaultEditor(ParameterValueEditor.class, new ParameterValueEditor(paraUseType)); + this.setDefaultEditor(ParameterEditor.class, new ParameterEditor()); + this.setDefaultRenderer(ParameterValueEditor.class, new ParameterValueRenderer(paraUseType)); + this.component = component; + } + + public ParameterTableModel(ValueEditorPane valueEditorPane, ValueEditorPane valueRenderPane, Component component) { + super(new String[] { Inter.getLocText("Parameter"), Inter.getLocText("Value") }); + this.setColumnClass(new Class[] { ParameterEditor.class, ParameterValueEditor.class }); + this.setDefaultEditor(ParameterValueEditor.class, new ParameterValueEditor(valueEditorPane)); + this.setDefaultEditor(ParameterEditor.class, new ParameterEditor()); + this.setDefaultRenderer(ParameterValueEditor.class, new ParameterValueRenderer(valueRenderPane)); + this.component = component; + } + + /** + * 单元格是否可编辑 + * @param row 行 + * @param col 列 + * @return 是否可以编辑 + */ + public boolean isCellEditable(int row, int col) { + if(col == 1) { + return this.getList().get(row) != null && StringUtils.isNotEmpty(this.getList().get(row).getName()); + } + return true; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + ParameterProvider para = this.getList().get(rowIndex); + switch (columnIndex) { + case 0: + return para.getName(); + case 1: + return para.getValue(); + } + return null; + } + + /** + * 生成工具栏上的一系列动作按钮 + * @return 返回table上的action数组. + */ + @Override + public UITableEditAction[] createAction() { + return new UITableEditAction[] { new AddParameterAction(), new DeleteAction(), new MoveUpAction(), new MoveDownAction() }; + } + + + /** + * 生成上移下移按钮 + * @return UItableEdit数组. + */ + public UITableEditAction[] createDBTableAction() { + return new UITableEditAction[] { new MoveUpAction(), new MoveDownAction() }; + } + + private class AddParameterAction extends AddTableRowAction { + + public AddParameterAction() { + + } + + @Override + public void actionPerformed(ActionEvent e) { + super.actionPerformed(e); + addParameter(); + } + } + + private void addParameter() { + Parameter para = new Parameter(); + addRow(para); + fireTableDataChanged(); + table.getSelectionModel().setSelectionInterval(table.getRowCount() - 1, table.getRowCount() - 1); + } + + protected class AddChartParameterAction extends AddTableRowAction { + public AddChartParameterAction() { + super(); + } + + @Override + public void actionPerformed(ActionEvent e) { + super.actionPerformed(e); + addParameter(); + // kunsnat: 屏蔽以下部分弹出框 直接添加行针对bug 10061 +// final ChartHotParameterEditPane pane = new ChartHotParameterEditPane(); +// pane.populate(para); +// BasicDialog dialog = pane.showSmallWindow(SwingUtilities.getWindowAncestor(DesignerContext.getDesignerFrame()),new DialogActionAdapter() { +// +// @Override +// public void doOk() { +// addRow(pane.update()); +// fireTableDataChanged(); +// } +// }); +// dialog.setVisible(true); + } + } + + public class ParameterEditor extends AbstractCellEditor implements TableCellEditor { + + private UITextField textField; + + public ParameterEditor() { + textField = new UITextField(); + this.addCellEditorListener(new CellEditorListener() { + + @Override + public void editingCanceled(ChangeEvent e) { + + } + + @Override + public void editingStopped(ChangeEvent e) { + if (table.getSelectedRow() == -1){ + return; + } + ParameterProvider para = getList().get(table.getSelectedRow()); + String value = StringUtils.trimToNull(textField.getText()); + para.setName(value); + fireTableDataChanged(); + } + }); + } + + @Override + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { + textField.setText((String) value); + return textField; + } + + @Override + public Object getCellEditorValue() { + return textField.getText(); + } + } + + private class ParameterValueEditor extends AbstractCellEditor implements TableCellEditor { + private static final long serialVersionUID = 1L; + private ValueEditorPane editor; + + public ParameterValueEditor(int paraUseType) { + this(ValueEditorPaneFactory.createVallueEditorPaneWithUseType(paraUseType)); + } + + public ParameterValueEditor(ValueEditorPane valueEditorPane) { + + editor = valueEditorPane; + + this.addCellEditorListener(new CellEditorListener() { + + @Override + public void editingCanceled(ChangeEvent e) { + + } + + @Override + public void editingStopped(ChangeEvent e) { + if (table.getSelectedRow() == -1) { + return; + } + ParameterProvider para = getList().get(table.getSelectedRow()); + para.setValue(getCellEditorValue()); + fireTableDataChanged(); + } + }); + } + + @Override + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { + editor.populate(value == null ? "" : value); + return editor; + } + + @Override + public Object getCellEditorValue() { + return editor.update(); + } + + } + + private class ParameterValueRenderer extends DefaultTableCellRenderer { + private static final long serialVersionUID = 1L; + private ValueEditorPane editor; + private UILabel disableLable; + + public ParameterValueRenderer(int paraUseType) { + this(ValueEditorPaneFactory.createVallueEditorPaneWithUseType(paraUseType)); + } + + public ParameterValueRenderer(ValueEditorPane valueEditorPane) { + disableLable = new UILabel(Inter.getLocText("Set-Parameter-Name")); + disableLable.setForeground(Color.pink); + disableLable.setHorizontalAlignment(SwingConstants.CENTER); + + editor = valueEditorPane; + } + + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + if (table.isCellEditable(row, column)) { + if (value == null) { + editor.populate(""); + } else { + editor.populate(value); + } + return editor; + } else { + return disableLable; + } + } + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/itableeditorpane/UIArrayFormulaTableModel.java b/designer-base/src/com/fr/design/gui/itableeditorpane/UIArrayFormulaTableModel.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itableeditorpane/UIArrayFormulaTableModel.java rename to designer-base/src/com/fr/design/gui/itableeditorpane/UIArrayFormulaTableModel.java diff --git a/designer-base/src/com/fr/design/gui/itableeditorpane/UIArrayTableModel.java b/designer-base/src/com/fr/design/gui/itableeditorpane/UIArrayTableModel.java new file mode 100644 index 0000000000..b42358dfbc --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itableeditorpane/UIArrayTableModel.java @@ -0,0 +1,74 @@ +package com.fr.design.gui.itableeditorpane; + + +import java.awt.event.ActionEvent; +import java.util.ArrayList; +import java.util.List; + +public class UIArrayTableModel extends UITableModelAdapter implements ActionStyle { + /** + * + */ + private static final long serialVersionUID = 1L; + private int[] array; + + public UIArrayTableModel(String[] s, int[] array) { + super(s); + this.array = array; + } + + public Object getValueAt(int row, int column) { + Object[] os = this.getList().get(row); + if(os != null && column < os.length) { + return os[column]; + } + return null; + } + + public void setValueAt(Object value, int row, int column) { + Object[] os = this.getList().get(row); + os[column] = value; + fireTableCellUpdated(row, column); + } + + public boolean isCellEditable(int row, int col) { + return true; + } + + @Override + public UITableEditAction[] createAction() { + List list = new ArrayList(); + UITableEditAction[] tableEditAction = new UITableEditAction[array.length]; + for (int i : array) { + switch (i) { + case UIArrayTableModel.ADDSTYLE: + list.add(new AddRow()); + break; + case UIArrayTableModel.ADDJSFILE: + break; + case UIArrayTableModel.ADDCSSFILE: + break; + case UIArrayTableModel.DELETESTYLE: + list.add(new DeleteAction()); + break; + case UIArrayTableModel.MOVEUPSTYLE: + list.add(new MoveUpAction()); + break; + case UIArrayTableModel.MOVEDOWNSTYLE: + list.add(new MoveDownAction()); + break; + + } + } + return list.toArray(tableEditAction); + } + + public class AddRow extends AddTableRowAction { + @Override + public void actionPerformed(ActionEvent e) { + super.actionPerformed(e); + addRow(new Object[getColumnCount()]); + fireTableDataChanged(); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditAction.java b/designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditAction.java new file mode 100644 index 0000000000..0ac48b91fb --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditAction.java @@ -0,0 +1,8 @@ +package com.fr.design.gui.itableeditorpane; + +import com.fr.design.actions.UpdateAction; + +public abstract class UITableEditAction extends UpdateAction { + + public abstract void checkEnabled(); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditorLoader.java b/designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditorLoader.java new file mode 100644 index 0000000000..82c19aff64 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditorLoader.java @@ -0,0 +1,12 @@ +package com.fr.design.gui.itableeditorpane; + + + +public interface UITableEditorLoader { + + // august:生成工具栏上的一系列动作按钮 + UITableEditAction[] createAction(); + + void stopCellEditing(); + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditorPane.java b/designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditorPane.java new file mode 100644 index 0000000000..1b5a2e9de2 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itableeditorpane/UITableEditorPane.java @@ -0,0 +1,156 @@ +package com.fr.design.gui.itableeditorpane; + +import com.fr.design.border.UIRoundedBorder; +import com.fr.design.constants.UIConstants; +import com.fr.design.dialog.BasicPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.general.Inter; + +import javax.swing.*; +import javax.swing.event.TableModelListener; +import java.awt.*; +import java.util.List; + +/** + * 表格编辑面板,一般是两列.键-值 用泛型实现,用的时候请定义T.model里面的T要一样 + * + * @editor zhou + * @since 2012-3-28下午3:06:30 + */ +public class UITableEditorPane extends BasicPane { + /** + * + */ + private static final long serialVersionUID = 6855793816972735815L; + private JTable editTable; + // 放置action 的按钮. + private UITableModelAdapter tableModel; + private String leftLabelName; + private JPanel buttonPane; + + public UITableEditorPane(UITableModelAdapter model) { + this.tableModel = model; + this.initComponent(model.createAction()); + } + + public UITableEditorPane(UITableModelAdapter model, String s) { + leftLabelName = s; + this.tableModel = model; + this.initComponent(model.createAction()); + } + + private void initComponent(UITableEditAction[] action) { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + JPanel pane = new JPanel(new BorderLayout(4, 4)); + this.add(pane, BorderLayout.CENTER); + + UILabel l = new UILabel(leftLabelName); + editTable = tableModel.createTable(); + editTable.getTableHeader().setBackground(UIConstants.DEFAULT_BG_RULER); + + UIScrollPane scrollPane = new UIScrollPane(editTable); + scrollPane.setBorder(new UIRoundedBorder(UIConstants.TITLED_BORDER_COLOR, 1, UIConstants.ARC)); + pane.add(scrollPane, BorderLayout.CENTER); + initbuttonPane(action); + JPanel controlPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + controlPane.add(buttonPane, BorderLayout.EAST); + controlPane.add(l, BorderLayout.WEST); + pane.add(controlPane, BorderLayout.NORTH); + + } + + public UITableModelAdapter getTableModel(){ + return tableModel; + } + + private void initbuttonPane(UITableEditAction[] action) { + buttonPane = new JPanel(); + + if (action != null) { + buttonPane.setLayout(new GridLayout(1, action.length, 3, 3)); + for (int i = 0; i < action.length; i++) { + final UIButton newButton = new UIButton(action[i]); + newButton.set4ToolbarButton(); + newButton.setMargin(new Insets(0, 0, 0, 0)); + newButton.setText(""); + newButton.setName(action[i].getName()); + newButton.setToolTipText(action[i].getName()); + newButton.setBorder(null); + newButton.setMargin(null); + newButton.setOpaque(false); + buttonPane.add(newButton); + } + } + } + + /** + * 增加事件监听 + * + * @param l 加的东东 + */ + public void addTableListener(TableModelListener l) { + tableModel.addTableModelListener(l); + } + + /** + * 移除事件监听 + * + * @param l 去的东东 + */ + public void removeTableListener(TableModelListener l) { + tableModel.removeTableModelListener(l); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("TableData_Dynamic_Parameter_Setting"); + } + + public void populate(T[] objs) { + tableModel.clear(); + if (objs == null) { + return; + } + for (T obj : objs) { + tableModel.addRow(obj); + } + this.tableModel.fireTableDataChanged(); + if (objs.length > 0) { + this.editTable.getSelectionModel().setSelectionInterval(0, 0); + } + } + + // TODO:august这个最好还是返回数组 + public List update() { + tableModel.stopCellEditing(); + return tableModel.getList(); + } + + public void update(List list) { + tableModel.stopCellEditing(); + tableModel.setList(list); + } + + public int getSelectedRow() { + return this.editTable.getSelectedRow(); + } + + public int getSelectedColumn() { + return this.editTable.getSelectedColumn(); + } + + public JPanel getbuttonPane() { + return buttonPane; + } + + /** + * 停止编辑 + */ + public void stopEditing() { + tableModel.stopCellEditing(); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java b/designer-base/src/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java new file mode 100644 index 0000000000..31196c7250 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itableeditorpane/UITableModelAdapter.java @@ -0,0 +1,330 @@ +package com.fr.design.gui.itableeditorpane; + +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.design.mainframe.DesignerContext; +import com.fr.general.Inter; + +/** + * 用来处理TableEditorPane的model + * @editor zhou + * @since 2012-3-28下午3:07:44 + */ +public abstract class UITableModelAdapter extends AbstractTableModel implements UITableEditorLoader { + + /** + * + */ + private static final long serialVersionUID = 3633792011995186187L; + protected JTable table; + + private Class[] classes; + private String[] columnNames; + + // list里放的是一行数据 + private List list = new ArrayList(); + + @SuppressWarnings({ "unchecked", "rawtypes" }) + protected UITableModelAdapter(String[] columnNames) { + this.columnNames = columnNames; + table = new JTable(this); + table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); +// TableRowSorter rowSorter = new TableRowSorter(this); +// table.setRowSorter(rowSorter); + } + + /** + * 创建表 + * @return 表 + */ + public JTable createTable() { + return table; + } + + public String getColumnName(int col) { + return columnNames[col]; + } + + public T getSelectedValue() { + if (table.getSelectedRow() >= 0) { + return list.get(table.getSelectedRow()); + } + return null; + } + + public void setColumnClass(Class[] classes) { + this.classes = classes; + } + + public void setDefaultEditor(Class columnClass, TableCellEditor editor) { + table.setDefaultEditor(columnClass, editor); + } + + public void setDefaultRenderer(Class columnClass, TableCellRenderer renderer) { + table.setDefaultRenderer(columnClass, renderer); + } + + + public void setList(List list) { + this.list = list; + } + + public List getList() { + return this.list; + } + + /** + * 增加行 + * @param obj 行 + */ + public void addRow(T obj) { + this.list.add(obj); + } + + public void setSelectedValue(T value) { + int selectedIndex = table.getSelectedRow(); + if (selectedIndex >= 0) { + setRowAt(value, selectedIndex); + } + } + + public void setRowAt(T value, int rowIndwx) { + this.list.set(rowIndwx, value); + } + + /** + * 去掉行 + * @param rowIndex 行号 + */ + public void removeRow(int rowIndex) { + if (this.list != null) { + this.list.remove(rowIndex); + + this.fireTableDataChanged(); + } + } + + /** + * 去除所有 + */ + public void clear() { + this.list.clear(); + } + + /** + * 通知所有linstener,Table每一行的值可能改变,并检查 + */ + @Override + public void fireTableDataChanged() { + super.fireTableDataChanged(); + table.getParent().validate(); + table.repaint(); + for (UITableEditAction action : this.createAction()) { + action.checkEnabled(); + } + } + + @Override + public Class getColumnClass(int columnIndex) { + if (classes != null) { + return classes[columnIndex]; + } + return super.getColumnClass(columnIndex); + } + + @Override + public int getRowCount() { + return this.list.size(); + } + + @Override + public int getColumnCount() { + return columnNames == null ? 0 : columnNames.length; + } + + @Override + public abstract Object getValueAt(int rowIndex, int columnIndex); + + /** + * 停止编辑 + */ + @Override + public void stopCellEditing() { + if (table.getCellEditor() != null) { + try { + table.getCellEditor().stopCellEditing(); + } catch (Exception ee) { + FRContext.getLogger().error(ee.getMessage(), ee); + } + } + } + + /** + * 单元格是否可编辑 + * @param row 行 + * @param col 列 + * @return 是则返回true + */ + @Override + public abstract boolean isCellEditable(int row, int col); + + protected abstract class AddTableRowAction extends UITableEditAction { + public AddTableRowAction() { + this.setName(Inter.getLocText("Insert")); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png")); + } + + @Override + public void actionPerformed(ActionEvent e) { + stopCellEditing(); + } + + public void checkEnabled() { + } + + } + + protected abstract class EditAction extends UITableEditAction { + + public EditAction() { + this.setName(Inter.getLocText("Edit")); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/edit.png")); + } + + @Override + public void actionPerformed(ActionEvent e) { + final int selectedRow = table.getSelectedRow(); + if (selectedRow > table.getRowCount() - 1 || selectedRow < 0) { + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("no-alternatives")); + return; + } + stopCellEditing(); + + } + + } + + protected class DeleteAction extends UITableEditAction { + + private Component component = null; + public DeleteAction() { + this.setName(Inter.getLocText("Delete")); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + } + + public DeleteAction(Component component){ + this.setName(Inter.getLocText("Delete")); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/remove.png")); + this.component = component; + } + + @Override + public void actionPerformed(ActionEvent e) { + int[] selectedRow = table.getSelectedRows(); + if (ismultiSelected()) { + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(),Inter.getLocText(new String[]{"The_current_list_is_empty", "Or-you", "Privilege-Selected_None_Of_Any_Items"})); + return; + } + if (table.getCellEditor() != null) { + try { + table.getCellEditor().stopCellEditing(); + } catch (Exception ee) { + FRContext.getLogger().error(ee.getMessage(), ee); + } + } + if (getRowCount() < 1 || selectedRow.length < 0) { + return; + } + + if(component == null){ + component = DesignerContext.getDesignerFrame(); + } + int val = JOptionPane.showConfirmDialog(component, + Inter.getLocText("Utils-Are_you_sure_to_remove_the_selected_item") + "?", Inter.getLocText("Remove"), + JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); + if (val != JOptionPane.OK_OPTION) { + return; + } + for (int i = 0; i < selectedRow.length; i++) { + if (selectedRow[i] - i < 0) { + continue; + } + removeRow(selectedRow[i] - i); + } + fireTableDataChanged(); + int selection = selectedRow[0] > table.getRowCount() ? table.getRowCount() - 1 + : (selectedRow[0] > 1 ? selectedRow[0] - 1 : 0); + table.getSelectionModel().setSelectionInterval(selection, selection); + } + + private boolean ismultiSelected(){ + int[] selectedRow = table.getSelectedRows(); + return (selectedRow.length == 1 && (selectedRow[0] > table.getRowCount() - 1 || selectedRow[0] < 0)) || selectedRow.length == 0; + } + @Override + public void checkEnabled() { + setEnabled(!ismultiSelected()); + } + } + + protected class MoveUpAction extends UITableEditAction { + public MoveUpAction() { + this.setName(Inter.getLocText("Utils-Move_Up")); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/up.png")); + } + + @Override + public void actionPerformed(ActionEvent e) { + int selectedRow = table.getSelectedRow(); + stopCellEditing(); + if (getList().size() < 2 || selectedRow == 0) { + return; + } + Collections.swap(getList(), selectedRow, selectedRow - 1); + fireTableDataChanged(); + table.getSelectionModel().setSelectionInterval(selectedRow - 1, selectedRow - 1); + } + + @Override + public void checkEnabled() { + } + } + + protected class MoveDownAction extends UITableEditAction { + + public MoveDownAction() { + this.setName(Inter.getLocText("Utils-Move_Down")); + this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/control/down.png")); + } + + @Override + public void actionPerformed(ActionEvent e) { + int selectedRow = table.getSelectedRow(); + stopCellEditing(); + if (getList().size() < 2 || selectedRow == getRowCount() - 1) { + return; + } + Collections.swap(getList(), selectedRow, selectedRow + 1); + fireTableDataChanged(); + table.getSelectionModel().setSelectionInterval(selectedRow + 1, selectedRow + 1); + } + + @Override + public void checkEnabled() { + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itabpane/TitleChangeListener.java b/designer-base/src/com/fr/design/gui/itabpane/TitleChangeListener.java new file mode 100644 index 0000000000..578dc8937a --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itabpane/TitleChangeListener.java @@ -0,0 +1,6 @@ +package com.fr.design.gui.itabpane; + +public interface TitleChangeListener { + + public void fireTitleChange(String addName); +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itabpane/UITabPaneCreator.java b/designer-base/src/com/fr/design/gui/itabpane/UITabPaneCreator.java new file mode 100644 index 0000000000..2ba5b220da --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itabpane/UITabPaneCreator.java @@ -0,0 +1,44 @@ +package com.fr.design.gui.itabpane; + +import javax.swing.JPanel; + +public class UITabPaneCreator { + /** + * 父类Component里面有个name成员变量,最好不要用那个 + */ + private String tabName; + + private String iconPath; + + // private String tooltips; + + private JPanel pane; + + public UITabPaneCreator(String tabName, String iconPath, JPanel pane) { + this.tabName = tabName; + this.setIconPath(iconPath); + this.pane = pane; + } + + public void setTabName(String name) { + this.tabName = name; + } + + public String getTabName() { + return this.tabName; + } + + public String getIconPath() { + return iconPath; + } + + public void setIconPath(String iconPath) { + this.iconPath = iconPath; + } + + public JPanel getPane() { + return pane; + } + + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itabpane/UITabsHeaderIconPane.java b/designer-base/src/com/fr/design/gui/itabpane/UITabsHeaderIconPane.java new file mode 100644 index 0000000000..1c3f004f91 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itabpane/UITabsHeaderIconPane.java @@ -0,0 +1,249 @@ +package com.fr.design.gui.itabpane; + +import com.fr.base.BaseUtils; +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.core.UITabComponent; +import com.fr.design.gui.ibutton.UITabButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; + +/** + * 本来想弄个延迟加载的,发现在单元格属性表那边没有意义,就算了.这个面板是纯粹的,没有与模板的任何交互操作(比如说populate() update()) + * + * @author zhou + * @since 2012-5-11下午3:30:18 + */ +public class UITabsHeaderIconPane extends JPanel implements UITabComponent { + private static final long serialVersionUID = 1L; + private static final int DIS = 30; + + private UILabel nameLabel; + + private UITabPaneCreator[] creators; + private ArrayList labels; + + private JPanel centerPane; + + private int selectedIndex = -1; + + public UITabsHeaderIconPane(final String name, UITabPaneCreator[] tabcreators) { + this.creators = tabcreators; + this.setLayout(new BorderLayout()); + this.setBorder(BorderFactory.createMatteBorder(1, 1, 0, 1, UIConstants.LINE_COLOR)); + + JPanel northTabsPane = new JPanel(new BorderLayout()) { + private static final long serialVersionUID = 1L; + + @Override + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, 42); + } + }; + this.add(northTabsPane, BorderLayout.NORTH); + + northTabsPane.setBorder(null); + nameLabel = new UILabel() { + private static final long serialVersionUID = 1L; + + @Override + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, 18); + } + }; + nameLabel.setHorizontalAlignment(SwingConstants.CENTER); + northTabsPane.add(nameLabel, BorderLayout.NORTH); + nameLabel.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.LINE_COLOR)); + JPanel tabsPane = new JPanel(); + tabsPane.setLayout(new GridLayout(1, creators.length)); + northTabsPane.add(tabsPane, BorderLayout.CENTER); + labels = new ArrayList(creators.length); + for (int i = 0; i < creators.length; i++) { + String iconpath = creators[i].getIconPath();// august:如果图标路径为空,就说明要用文本了 + final UITabButton label = StringUtils.isEmpty(iconpath) ? new UITabButton(creators[i].getTabName()) : new IconTabLabel(BaseUtils.readIcon(creators[i] + .getIconPath())); + tabsPane.add(label); + labels.add(label); + label.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + int newselectedIndex = labels.indexOf(label); + if (selectedIndex != newselectedIndex) { + setSelectedIndex(newselectedIndex); + } + } + }); + } + + centerPane = new JPanel(new BorderLayout()); + centerPane.setBorder(null); + this.add(centerPane, BorderLayout.CENTER); + + this.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + nameLabel.setText(name + '-' + creators[selectedIndex].getTabName()); + show(creators[selectedIndex].getPane()); + } + }); + + setSelectedIndex(0); + + initKeyListener(); + } + + private void initKeyListener() { + setFocusable(true); + setFocusTraversalKeysEnabled(false); + InputMap inputMapAncestor = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); + ActionMap actionMap = this.getActionMap(); + inputMapAncestor.clear(); + actionMap.clear(); + + inputMapAncestor.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, DEFAULT_MODIFIER), "switch"); + actionMap.put("switch", new AbstractAction() { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public void actionPerformed(ActionEvent evt) { + setSelectedIndex(selectedIndex + 1 == creators.length ? 0 : selectedIndex + 1); + } + }); + } + + // august: 滑动效果方法 + private void show(final JPanel panel) { + int count = centerPane.getComponentCount();// 获取centerPanel中控件数 + List list = new ArrayList();// + list.addAll(Arrays.asList(centerPane.getComponents())); + if (count > 0) {// 如果centerPanel中控件数大于0就执行效果 + for (int i = 0; i < count; i++) { + Component comp = centerPane.getComponent(i);// 获得该位置的控件 + + if (comp instanceof JPanel) { + final JPanel currentPanel = (JPanel)comp;// 获得当前panel + + // augsut:必须用多线程,因为swing是单线程的,不用就实现不了动态效果 + new Thread() { + public void run() { + int height = centerPane.getHeight(); + int width = centerPane.getWidth(); + int y = -height; + for (int i = 0; i <= height; i += DIS) { + // 设置面板位置 + currentPanel.setBounds(0, i, width, height); + panel.setBounds(0, y, width, height); + y += DIS; + try { + Thread.sleep(3); + } catch (InterruptedException e) { + } + } + if (currentPanel != panel) { + centerPane.remove(currentPanel);// 移除当前面板 + } + panel.setBounds(0, 0, width, height); + } + }.start(); + break; + } + } + } else { + panel.setBounds(0, 0, centerPane.getWidth(), centerPane.getHeight());// 设置滑动初始位置 + } + + if (!list.contains(panel)) { + centerPane.add(panel);// 添加要切换的面板 + } + + centerPane.validate();// 重构内容面板 + centerPane.repaint();// 重绘内容面板 + } + + /** + * Adds a ChangeListener to the listener list. + */ + public void addChangeListener(ChangeListener l) { + this.listenerList.add(ChangeListener.class, l); + } + + /** + * removes a ChangeListener from the listener list. + */ + public void removeChangeListener(ChangeListener l) { + this.listenerList.remove(ChangeListener.class, l); + } + + // august: Process the listeners last to first + private void fireSelectedChanged() { + Object[] listeners = listenerList.getListenerList(); + + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == ChangeListener.class) { + ((ChangeListener)listeners[i + 1]).stateChanged(new ChangeEvent(this)); + } + } + } + + @Override + public int getSelectedIndex() { + return selectedIndex; + } + + @Override + public synchronized void setSelectedIndex(int newselectedIndex) { + selectedIndex = newselectedIndex; + fireSelectedChanged(); + for (int i = 0; i < labels.size(); i++) { + labels.get(i).setSelectedDoNotFireListener(i == selectedIndex); + } + } + + private class IconTabLabel extends UITabButton { + + /** + * + */ + private static final long serialVersionUID = 1L; + + public IconTabLabel(Icon readIcon) { + super(readIcon); + this.setLayout(new BorderLayout()); + this.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 1, UIConstants.LINE_COLOR)); + } + + @Override + protected void paintRolloverAndSelected(Graphics2D g2d, int w, int h) { + if (!isSelected()) { + GradientPaint gp = new GradientPaint(1, 1, TOP, 1, h - 1, DOWN); + g2d.setPaint(gp); + g2d.fillRect(0, h / 2, w, h / 2); + } else { + Color blue = UIConstants.LIGHT_BLUE; + g2d.setColor(blue); + g2d.fillRect(0, 0, w, h / 2); + GradientPaint gp = new GradientPaint(1, 1, blue, 1, h - 1, blue); + g2d.setPaint(gp); + g2d.fillRect(0, h / 2, w, h / 2); + } + } + + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itextarea/DescriptionTextArea.java b/designer-base/src/com/fr/design/gui/itextarea/DescriptionTextArea.java new file mode 100644 index 0000000000..1866433c50 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itextarea/DescriptionTextArea.java @@ -0,0 +1,27 @@ +/* + * Copyright(c) 2001-2010, FineReport Inc, All Rights Reserved. + */ +package com.fr.design.gui.itextarea; + + +/** + * peter:这个控件主要是用来在界面显示帮助信息的. + */ +public class DescriptionTextArea extends UITextArea { + public DescriptionTextArea() { + this(3); + } + + public DescriptionTextArea(int row) { + this(row, 8); + } + + public DescriptionTextArea(int rows, int columns) { + super(rows, columns); + this.setBackground(null); + this.setLineWrap(true); + + this.setWrapStyleWord(true); + this.setEditable(false); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itextarea/FRExplainTextArea.java b/designer-base/src/com/fr/design/gui/itextarea/FRExplainTextArea.java new file mode 100644 index 0000000000..64f5f01183 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itextarea/FRExplainTextArea.java @@ -0,0 +1,66 @@ +package com.fr.design.gui.itextarea; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.FlowLayout; +import java.awt.Insets; + +import javax.swing.*; + +import com.fr.design.gui.ilable.UILabel; + +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.layout.FRGUIPaneFactory; + +public class FRExplainTextArea extends JPanel{ + + private static final long serialVersionUID = 1L; + private Icon icon; + private String string; + private int column; + + public FRExplainTextArea(String string,int column){ + this.setString(string); + this.column = column; + init(); + } + + private void init(){ + this.setLayout(new /**/FlowLayout(FlowLayout.LEFT, 0, 0)); + JPanel pane =FRGUIPaneFactory.createX_AXISBoxInnerContainer_S_Pane(); +// pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS)); + + JPanel pane_icon =FRGUIPaneFactory.createBorderLayout_S_Pane(); + pane.add(pane_icon); +// pane_icon.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setIcon(new ImageIcon("/com/fr/design/images/warnings/warning3.png")); + UILabel UILabel = new UILabel(this.icon, SwingConstants.LEFT); + pane_icon.add(UILabel, BorderLayout.NORTH); + UITextArea jta = new UITextArea(this.string); + jta.setMargin(new Insets(0, 3, 0, 0)); + jta.setForeground(new Color(255, 0, 0)); + jta.setColumns(column); + jta.setLineWrap(true); + jta.setEditable(false); + pane.add(jta); + this.add(pane); + + + } + + public void setIcon(Icon icon) { + this.icon = icon; + } + + public Icon getIcon() { + return icon; + } + + public void setString(String string) { + this.string = string; + } + + public String getString() { + return string; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itextarea/UITextArea.java b/designer-base/src/com/fr/design/gui/itextarea/UITextArea.java new file mode 100644 index 0000000000..5f788e0621 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itextarea/UITextArea.java @@ -0,0 +1,137 @@ +package com.fr.design.gui.itextarea; + +import com.fr.common.inputevent.InputEventBaseOnOS; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.stable.Constants; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.*; + +public class UITextArea extends JTextArea implements UIObserver { + private UIObserverListener uiObserverListener; + + public UITextArea(int i, int j) { + super(i, j); + InputEventBaseOnOS.addBasicEditInputMap(this); + initComponents(); + } + + @Override + public Insets getInsets() { + return new Insets(5, 5, 5, 5); + } + + public UITextArea() { + super(); + InputEventBaseOnOS.addBasicEditInputMap(this); + initComponents(); + } + + public UITextArea(String s) { + super(s); + InputEventBaseOnOS.addBasicEditInputMap(this); + initComponents(); + } + + private void initComponents() { + setLineWrap(true); + setWrapStyleWord(true); + initListener(); + } + + private void initListener() { + if (shouldResponseChangeListener()) { + getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + EventQueue.invokeLater(new Runnable() { + public void run() { + attributeChange(); + } + }); + } + + @Override + public void removeUpdate(DocumentEvent e) { + EventQueue.invokeLater(new Runnable() { + public void run() { + attributeChange(); + } + }); + } + + @Override + public void changedUpdate(DocumentEvent e) { + EventQueue.invokeLater(new Runnable() { + public void run() { + attributeChange(); + } + }); + } + }); + } + } + + private void attributeChange() { + if (uiObserverListener != null) { + uiObserverListener.doChange(); + } + } + + @Override + /** + * + */ + public UITextAreaUI getUI() { + return (UITextAreaUI) ui; + } + + @Override + /** + * + */ + public void updateUI() { + this.setUI(new UITextAreaUI(this)); + } + + @Override + protected void paintBorder(Graphics g) { + if (getBorder() != null) { + getUI().paintBorder((Graphics2D) g, getWidth(), getHeight(), true, Constants.NULL); + } + } + + @Override + /** + * + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } + + /** + * @return + */ + public boolean shouldResponseChangeListener() { + return true; + } + + /** + * @param args + */ + public static void main(String... args) { +// JFrame jf = new JFrame("test"); +// jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); +// JPanel content = (JPanel) jf.getContentPane(); +// content.setLayout(new BorderLayout()); +// UITextArea bb = new UITextArea("123455weoijweio reiwj kewl jfejkfljds kl jfldk jfk jdskfjkdsfklj dkl jfsdjf"); +// content.add(bb, BorderLayout.CENTER); +// GUICoreUtils.centerWindow(jf); +// jf.setSize(400, 400); +// jf.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itextarea/UITextAreaUI.java b/designer-base/src/com/fr/design/gui/itextarea/UITextAreaUI.java new file mode 100644 index 0000000000..b0896c7da2 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itextarea/UITextAreaUI.java @@ -0,0 +1,43 @@ +package com.fr.design.gui.itextarea; + +import com.fr.design.constants.UIConstants; +import com.fr.design.utils.gui.GUIPaintUtils; + +import javax.swing.*; +import javax.swing.plaf.basic.BasicTextAreaUI; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +public class UITextAreaUI extends BasicTextAreaUI { + protected boolean isRollOver; + private JComponent textField; + + public UITextAreaUI(final JComponent textField) { + super(); + this.textField = textField; + this.textField.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + isRollOver = true; + textField.repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + isRollOver = false; + textField.repaint(); + } + }); + } + + public void paintBorder(Graphics2D g2d, int width, int height, boolean isRound, int rectDirection) { + if (isRollOver && textField.isEnabled() && ((UITextArea)textField).isEditable()) { + g2d.setColor(UIConstants.TEXT_FILED_BORDER_SELECTED); + g2d.drawRect(0, 0, width - 1, height - 1); + } else { + GUIPaintUtils.drawBorder(g2d, 0, 0, width, height, isRound, rectDirection); + } + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/itextfield/AutoCompletionDemo.java b/designer-base/src/com/fr/design/gui/itextfield/AutoCompletionDemo.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itextfield/AutoCompletionDemo.java rename to designer-base/src/com/fr/design/gui/itextfield/AutoCompletionDemo.java diff --git a/designer_base/src/com/fr/design/gui/itextfield/CompletionFilter.java b/designer-base/src/com/fr/design/gui/itextfield/CompletionFilter.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itextfield/CompletionFilter.java rename to designer-base/src/com/fr/design/gui/itextfield/CompletionFilter.java diff --git a/designer_base/src/com/fr/design/gui/itextfield/DefaultCompletionFilter.java b/designer-base/src/com/fr/design/gui/itextfield/DefaultCompletionFilter.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itextfield/DefaultCompletionFilter.java rename to designer-base/src/com/fr/design/gui/itextfield/DefaultCompletionFilter.java diff --git a/designer-base/src/com/fr/design/gui/itextfield/EditTextField.java b/designer-base/src/com/fr/design/gui/itextfield/EditTextField.java new file mode 100644 index 0000000000..694c3e507e --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itextfield/EditTextField.java @@ -0,0 +1,55 @@ +package com.fr.design.gui.itextfield; + +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Toolkit; + +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.PlainDocument; + + +/** + * Number Field. + */ +public class EditTextField extends UIGridTextField { + private int maxLength = 24; + + public EditTextField() { + this(10000); + } + + public EditTextField(int maxLength) { + this.maxLength = maxLength; + setDocument(new TextDocument()); + } + + public int getMaxLength() { + return maxLength; + } + + public void setMaxLength(int maxLength) { + this.maxLength = maxLength; + } + + @Override + public void paint(Graphics g) { + FRGraphics2D FRg2d = new FRGraphics2D((Graphics2D)g); + super.paint(FRg2d); + } + + class TextDocument extends PlainDocument { + public TextDocument() { + } + + @Override + public void insertString(int offset, String s, AttributeSet a) throws BadLocationException { + String str = getText(0, getLength()); + if (str != null && str.length() > getMaxLength()) { + Toolkit.getDefaultToolkit().beep(); + return; + } + super.insertString(offset, s, a); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itextfield/FRGraphics2D.java b/designer-base/src/com/fr/design/gui/itextfield/FRGraphics2D.java new file mode 100644 index 0000000000..96b3046eec --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itextfield/FRGraphics2D.java @@ -0,0 +1,397 @@ +package com.fr.design.gui.itextfield; + +import java.awt.Color; +import java.awt.Composite; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.Image; +import java.awt.Paint; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.RenderingHints.Key; +import java.awt.Shape; +import java.awt.Stroke; +import java.awt.font.FontRenderContext; +import java.awt.font.GlyphVector; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.awt.image.BufferedImageOp; +import java.awt.image.ImageObserver; +import java.awt.image.RenderedImage; +import java.awt.image.renderable.RenderableImage; +import java.text.AttributedCharacterIterator; +import java.util.Map; + +import com.fr.base.GraphHelper; + +public class FRGraphics2D extends Graphics2D { + Graphics2D g2d; + + public FRGraphics2D (Graphics2D sg2d) { + this.g2d = sg2d; + } + @Override + public void draw(Shape s) { + g2d.draw(s); + } + + @Override + public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) { + return g2d.drawImage(img, xform, obs); + } + + @Override + public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) { + g2d.drawImage(img, op, x, y); + } + + @Override + public void drawRenderedImage(RenderedImage img, AffineTransform xform) { + g2d.drawRenderedImage(img, xform); + } + + @Override + public void drawRenderableImage(RenderableImage img, AffineTransform xform) { + g2d.drawRenderableImage(img, xform); + } + + @Override + public void drawString(String str, int x, int y) { + GraphHelper.drawString(g2d, str, x, y); + } + + @Override + public void drawString(String str, float x, float y) { + GraphHelper.drawString(g2d, str, x, y); + } + + @Override + public void drawString(AttributedCharacterIterator iterator, int x, int y) { + g2d.drawString(iterator, x, y); + } + + @Override + public void drawString(AttributedCharacterIterator iterator, float x, + float y) { + g2d.drawString(iterator, x, y); + } + + @Override + public void drawGlyphVector(GlyphVector g, float x, float y) { + g2d.drawGlyphVector(g, x, y); + } + + @Override + public void fill(Shape s) { + g2d.fill(s); + } + + @Override + public boolean hit(Rectangle rect, Shape s, boolean onStroke) { + return g2d.hit(rect, s, onStroke); + } + + @Override + public GraphicsConfiguration getDeviceConfiguration() { + return g2d.getDeviceConfiguration(); + } + + @Override + public void setComposite(Composite comp) { + g2d.setComposite(comp); + } + + @Override + public void setPaint(Paint paint) { + g2d.setPaint(paint); + } + + @Override + public void setStroke(Stroke s) { + g2d.setStroke(s); + } + + @Override + public void setRenderingHint(Key hintKey, Object hintValue) { + g2d.setRenderingHint(hintKey, hintValue); + } + + @Override + public Object getRenderingHint(Key hintKey) { + return g2d.getRenderingHint(hintKey); + } + + @Override + public void setRenderingHints(Map hints) { + g2d.setRenderingHints(hints); + } + + @Override + public void addRenderingHints(Map hints) { + g2d.addRenderingHints(hints); + } + + @Override + public RenderingHints getRenderingHints() { + return g2d.getRenderingHints(); + } + + @Override + public void translate(int x, int y) { + g2d.translate(x, y); + } + + @Override + public void translate(double tx, double ty) { + g2d.translate(tx, ty); + } + + @Override + public void rotate(double theta) { + g2d.rotate(theta); + } + + @Override + public void rotate(double theta, double x, double y) { + g2d.rotate(theta, x, y); + } + + @Override + public void scale(double sx, double sy) { + g2d.scale(sx, sy); + } + + @Override + public void shear(double shx, double shy) { + g2d.shear(shx, shy); + } + + @Override + public void transform(AffineTransform Tx) { + g2d.transform(Tx); + } + + @Override + public void setTransform(AffineTransform Tx) { + g2d.setTransform(Tx); + } + + @Override + public AffineTransform getTransform() { + return g2d.getTransform(); + } + + @Override + public Paint getPaint() { + return g2d.getPaint(); + } + + @Override + public Composite getComposite() { + return g2d.getComposite(); + } + + @Override + public void setBackground(Color color) { + g2d.setBackground(color); + } + + @Override + public Color getBackground() { + return g2d.getBackground(); + } + + @Override + public Stroke getStroke() { + return g2d.getStroke(); + } + + @Override + public void clip(Shape s) { + g2d.clip(s); + } + + @Override + public FontRenderContext getFontRenderContext() { + return g2d.getFontRenderContext(); + } + + @Override + public Graphics create() { + return new FRGraphics2D((Graphics2D) g2d.create()); + } + + @Override + public Color getColor() { + return g2d.getColor(); + } + + @Override + public void setColor(Color c) { + g2d.setColor(c); + } + + @Override + public void setPaintMode() { + g2d.setPaintMode(); + } + + @Override + public void setXORMode(Color c1) { + g2d.setXORMode(c1); + } + + @Override + public Font getFont() { + return g2d.getFont(); + } + + @Override + public void setFont(Font font) { + g2d.setFont(font); + } + + @Override + public FontMetrics getFontMetrics(Font f) { + return g2d.getFontMetrics(f); + } + + @Override + public Rectangle getClipBounds() { + return g2d.getClipBounds(); + } + + @Override + public void clipRect(int x, int y, int width, int height) { + g2d.clipRect(x, y, width, height); + } + + @Override + public void setClip(int x, int y, int width, int height) { + g2d.setClip(x, y, width, height); + } + + @Override + public Shape getClip() { + return g2d.getClip(); + } + + @Override + public void setClip(Shape clip) { + g2d.setClip(clip); + } + + @Override + public void copyArea(int x, int y, int width, int height, int dx, int dy) { + g2d.copyArea(x, y, width, height, dx, dy); + } + + @Override + public void drawLine(int x1, int y1, int x2, int y2) { + g2d.drawLine(x1, y1, x2, y2); + } + + @Override + public void fillRect(int x, int y, int width, int height) { + g2d.fillRect(x, y, width, height); + } + + @Override + public void clearRect(int x, int y, int width, int height) { + g2d.clearRect(x, y, width, height); + } + + @Override + public void drawRoundRect(int x, int y, int width, int height, + int arcWidth, int arcHeight) { + g2d.drawRoundRect(x, y, width, height, arcWidth, arcHeight); + } + + @Override + public void fillRoundRect(int x, int y, int width, int height, + int arcWidth, int arcHeight) { + g2d.fillRoundRect(x, y, width, height, arcWidth, arcHeight); + } + + @Override + public void drawOval(int x, int y, int width, int height) { + g2d.drawOval(x, y, width, height); + } + + @Override + public void fillOval(int x, int y, int width, int height) { + g2d.fillOval(x, y, width, height); + } + + @Override + public void drawArc(int x, int y, int width, int height, int startAngle, + int arcAngle) { + g2d.drawArc(x, y, width, height, startAngle, arcAngle); + } + + @Override + public void fillArc(int x, int y, int width, int height, int startAngle, + int arcAngle) { + g2d.fillArc(x, y, width, height, startAngle, arcAngle); + } + + @Override + public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) { + g2d.drawPolyline(xPoints, yPoints, nPoints); + } + + @Override + public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) { + g2d.drawPolygon(xPoints, yPoints, nPoints); + } + + @Override + public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) { + g2d.fillPolygon(xPoints, yPoints, nPoints); + } + + @Override + public boolean drawImage(Image img, int x, int y, ImageObserver observer) { + return g2d.drawImage(img, x, y, observer); + } + + @Override + public boolean drawImage(Image img, int x, int y, int width, int height, + ImageObserver observer) { + return g2d.drawImage(img, x, y, width, height, observer); + } + + @Override + public boolean drawImage(Image img, int x, int y, Color bgcolor, + ImageObserver observer) { + return g2d.drawImage(img, x, y, bgcolor, observer); + } + + @Override + public boolean drawImage(Image img, int x, int y, int width, int height, + Color bgcolor, ImageObserver observer) { + return g2d.drawImage(img, x, y, width, height, bgcolor, observer); + } + + @Override + public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, + int sx1, int sy1, int sx2, int sy2, ImageObserver observer) { + return g2d.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer); + } + + @Override + public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, + int sx1, int sy1, int sx2, int sy2, Color bgcolor, + ImageObserver observer) { + return g2d.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, bgcolor, observer); + } + + @Override + public void dispose() { + g2d.dispose(); + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/itextfield/PlaceholderTextField.java b/designer-base/src/com/fr/design/gui/itextfield/PlaceholderTextField.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itextfield/PlaceholderTextField.java rename to designer-base/src/com/fr/design/gui/itextfield/PlaceholderTextField.java diff --git a/designer-base/src/com/fr/design/gui/itextfield/TextFieldUI.java b/designer-base/src/com/fr/design/gui/itextfield/TextFieldUI.java new file mode 100644 index 0000000000..2d0891181e --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itextfield/TextFieldUI.java @@ -0,0 +1,53 @@ +package com.fr.design.gui.itextfield; + +import java.awt.Graphics; + +import javax.swing.plaf.metal.MetalTextFieldUI; +import javax.swing.text.JTextComponent; + +import de.muntjak.tinylookandfeel.Theme; + +public class TextFieldUI extends MetalTextFieldUI { + + + protected void paintBackground(Graphics g) { + JTextComponent editor = getComponent(); + // We will only be here if editor is opaque, so we don't have to test + + if(editor.isEnabled()) { + if(editor.isEditable()) { + g.setColor(editor.getBackground()); + } + else { + // not editable + if(editor.getBackground().equals(Theme.textBgColor[Theme.style].getColor())) { + // set default panel background + g.setColor(Theme.backColor[Theme.style].getColor()); + } + else { + // color changed by user - set textfield background + g.setColor(editor.getBackground()); + } + } + + g.fillRect(0, 0, editor.getWidth(), editor.getHeight()); + } + else { + if(editor.getBackground().equals(Theme.textBgColor[Theme.style].getColor())) { + g.setColor(Theme.textDisabledBgColor[Theme.style].getColor()); + } + else { + // color changed by user - set textfield background + g.setColor(editor.getBackground()); + } + + g.fillRect(0, 0, editor.getWidth(), editor.getHeight()); + + if(Theme.style != Theme.YQ_STYLE) return; + + g.setColor(Theme.backColor[Theme.style].getColor()); + g.drawRect(1, 1, editor.getWidth() - 3, editor.getHeight() - 3); + g.drawRect(2, 2, editor.getWidth() - 5, editor.getHeight() - 5); + } + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/itextfield/UIAutoCompletionField.java b/designer-base/src/com/fr/design/gui/itextfield/UIAutoCompletionField.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itextfield/UIAutoCompletionField.java rename to designer-base/src/com/fr/design/gui/itextfield/UIAutoCompletionField.java diff --git a/designer_base/src/com/fr/design/gui/itextfield/UIGridTextField.java b/designer-base/src/com/fr/design/gui/itextfield/UIGridTextField.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itextfield/UIGridTextField.java rename to designer-base/src/com/fr/design/gui/itextfield/UIGridTextField.java diff --git a/designer-base/src/com/fr/design/gui/itextfield/UINumberField.java b/designer-base/src/com/fr/design/gui/itextfield/UINumberField.java new file mode 100644 index 0000000000..42114acbc0 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itextfield/UINumberField.java @@ -0,0 +1,247 @@ +package com.fr.design.gui.itextfield; + +import com.fr.base.Utils; +import com.fr.design.gui.ilable.UILabel; +import com.fr.general.ComparatorUtils; +import com.fr.stable.CoreConstants; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.PlainDocument; +import java.awt.*; + +/** + * Number Field. + */ +public class UINumberField extends UITextField { + public static final double ERROR_VALUE = Double.MAX_VALUE + 4.44; // peter:错误的值. + public static final int MAX_INTEGERLENGTH = 24; + public static final int MAX_INTEGERLENGTH_32 = 32; + public static final int MAX_DECIMALLENGTH = 16; + /** + * 整数部分的长度 + */ + private int maxIntegerLength = MAX_INTEGERLENGTH; + /** + * 小数部分的长度 + */ + private static final int DEFAULTMAXDECIMALLENTH = 16; + private static final int TESTMAXVALUE = 100; + private static final int TESTMINVALUE = -10; + private int maxDecimalLength = MAX_DECIMALLENGTH; + private double minValue = -Double.MAX_VALUE; + private double maxValue = Double.MAX_VALUE; + + private boolean isContentChanged = false; + + public UINumberField() { + this(MAX_INTEGERLENGTH_32, MAX_DECIMALLENGTH); + } + + public UINumberField(int columns) { + this(); + setColumns(columns); + } + + public UINumberField(int maxIntegerLength, int maxDecimalLength) { + this(maxIntegerLength, maxDecimalLength, -Double.MAX_VALUE, Double.MAX_VALUE); + } + + public UINumberField(int maxIntegerLength, int maxDecimalLength, double minValue, double maxValue) { + this.maxIntegerLength = maxIntegerLength; + this.maxDecimalLength = maxDecimalLength; + this.minValue = minValue; + this.maxValue = maxValue; + setFieldDocument(); + } + + public void setFieldDocument() { + setDocument(new NumberDocument()); + initListener(); + } + + public int getMaxIntegerLength() { + return maxIntegerLength; + } + + public void setMaxIntegerLength(int maxIntegerLength) { + this.maxIntegerLength = maxIntegerLength; + } + + public int getMaxDecimalLength() { + return maxDecimalLength; + } + + public void setMaxDecimalLength(int maxDecimalLength) { + this.maxDecimalLength = maxDecimalLength; + } + + public double getMinValue() { + return minValue; + } + + public void setMinValue(double minValue) { + this.minValue = minValue; + } + + public double getMaxValue() { + return maxValue; + } + + public void setMaxValue(double maxValue) { + this.maxValue = maxValue; + } + + /** + * Set the value. + */ + public void setValue(double value) { + this.setText(Utils.doubleToString(value)); + } + + /** + * Return the value. + */ + public double getValue() throws NumberFormatException { + try { + if (this.getText().length() == 0) { + return 0; + } + + return Double.parseDouble(this.getText()); + } catch (NumberFormatException numberFormatException) { + return UINumberField.ERROR_VALUE; + } + } + + /** + * Retusn text value. + */ + public String getTextValue() { + return this.getText(); + } + + /** + * Set property integer. + * + * @param integer New value of property integer. + */ + public void setInteger(boolean integer) { + if (integer) { + this.maxDecimalLength = 0; + } else { + this.maxDecimalLength = DEFAULTMAXDECIMALLENTH; + } + } + + /** + * Check whether the content changed. + */ + public boolean isContentChanged() { + return isContentChanged; + } + + public void setisContentChanged(boolean isContentChanged) { + this.isContentChanged = isContentChanged; + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, 20); + } + + class NumberDocument extends PlainDocument { + + public boolean checkString(int offset, String s, String str) { + return (ComparatorUtils.equals(s, "F") + || ComparatorUtils.equals(s, "f") + || ComparatorUtils.equals(s, "D") + || ComparatorUtils.equals(s, "d") + || (ComparatorUtils.equals(str.trim(), "0") && !ComparatorUtils.equals(s.substring(0, 1), ".") && offset != 0)// 第一位是0时,第二位只能为小数点 + || (ComparatorUtils.equals(s, ".") && maxDecimalLength == 0)); + + } + + public void insertString(int offset, String s, AttributeSet a) throws BadLocationException { + String str = getText(0, getLength()); + + // 不能为f,F,d,D + if (checkString(offset, s, str)) { + Toolkit.getDefaultToolkit().beep(); + return; + } + + String strNew = str.substring(0, offset) + s + str.substring(offset, getLength()); + if (notChange(strNew)) { + return; + } + setisContentChanged(true); + super.insertString(offset, s, a); + } + + // kunsnat: 这种限制输入 有个不好的地方, 比如删除时: 10.1 最大值限定100, 那么就删除中间的小数点之后变为101, 超出了100. + // 但是直接限制不能删除中间类似小数点, 那么也可能遇到: 最小值10 , 从100变化到其中的19, 就很难.. + private boolean notChange(String strNew) { + boolean noChange = false; + boolean isMinus = strNew.startsWith("-"); + strNew = strNew.replaceFirst("-", StringUtils.EMPTY); // 控制能输入负数 + String strIntPart; + String strDecPart = StringUtils.EMPTY; + int decPos = strNew.indexOf(CoreConstants.DOT); + if (decPos > -1) { + strIntPart = strNew.substring(0, decPos); + strDecPart = strNew.substring(decPos + 1); + } else { + strIntPart = strNew; + } + if (isOverMaxOrMinValue(strIntPart, strDecPart, strNew)) { + Toolkit.getDefaultToolkit().beep(); + noChange = true; + } + + try { + if (!ComparatorUtils.equals(strNew, StringUtils.EMPTY) && !ComparatorUtils.equals(strNew, "-")) {// 控制能输入负数 + double d = Double.parseDouble(strNew) * (isMinus ? -1 : 1); + if (d < minValue || d > maxValue) { + throw new Exception(); + } + } + } catch (Exception e) { + Toolkit.getDefaultToolkit().beep(); + noChange = true; + } + + return noChange; + } + + private boolean isOverMaxOrMinValue(String strIntPart, String strDecPart, String strNew) { + boolean checkLength = strIntPart.length() > maxIntegerLength + || strDecPart.length() > maxDecimalLength; + return checkLength || (strNew.length() > 1 && ComparatorUtils.equals(strNew.substring(0, 1), "0") && !ComparatorUtils.equals(strNew.substring(1, 2), ".")); + } + } + + /** + * 测试程序 + */ + public static void main(String[] args) { +// JFrame frame = new JFrame(""); +// frame.setSize(400, 320); +// Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); +// frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2); +// UINumberField tt = new UINumberField(); +// tt.setMinValue(0.0); +// tt.setMaxValue(100.0); +// frame.getContentPane().setLayout(new GridLayout(10, 2)); +// frame.getContentPane().add(new UILabel("New JNumberField()")); +// frame.getContentPane().add(tt); +// frame.getContentPane().add(new UILabel("New JNumberField(2)")); +// frame.getContentPane().add(new UILabel("New JNumberField(8,2)")); +// frame.getContentPane().add(new UINumberField(8, 2)); +// frame.getContentPane().add(new UILabel("New JNumberField(5,2,-10,100)")); +// frame.getContentPane().add(new UINumberField(5, 2, TESTMINVALUE, TESTMAXVALUE)); +// frame.setVisible(true); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itextfield/UISearchTextField.java b/designer-base/src/com/fr/design/gui/itextfield/UISearchTextField.java new file mode 100644 index 0000000000..c0d7967e85 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itextfield/UISearchTextField.java @@ -0,0 +1,296 @@ +package com.fr.design.gui.itextfield; + + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ilable.UILabel; +import com.fr.general.Inter; + +import javax.swing.*; +import javax.swing.text.Document; +import java.awt.*; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionListener; +import java.awt.geom.RoundRectangle2D; + +/** + * Created by IntelliJ IDEA. + * Author : Richer + * Version: 7.0.3 + * Date: 13-1-4 + * Time: 上午11:07 + * 带图标的文本框,可以用作搜索等用途 + */ +public class UISearchTextField extends UITextField { + + private UILabel iconLabel = new UILabel(UIConstants.BLACK_SEARCH_ICON); + private UILabel clearLabel = new UILabel(UIConstants.CLEAR_ICON); + private UILabel infoLabel = new UILabel(Inter.getLocText("Search")); + private Dimension iconSize; + private Dimension infoSize; + + private int iconPosition = SwingConstants.LEFT; + private boolean showClearIcon = true; + + private CellRendererPane cellRendererPane = new CellRendererPane(); + + public UISearchTextField() { + initTextField(); + } + + public UISearchTextField(String text) { + super(text); + initTextField(); + } + + public UISearchTextField(int columns) { + super(columns); + initTextField(); + } + + public UISearchTextField(String text, int columns) { + super(text, columns); + initTextField(); + } + + public UISearchTextField(Document doc, String text, int columns) { + super(doc, text, columns); + initTextField(); + } + + private void initTextField() { + iconLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + iconLabel.setToolTipText(Inter.getLocText("Search")); + clearLabel.setToolTipText(Inter.getLocText("Clear")); + clearLabel.setOpaque(false); + iconSize = iconLabel.getPreferredSize(); + infoSize = infoLabel.getPreferredSize(); + infoLabel.setEnabled(false); + this.addMouseListener(new MouseAdapter() { + public void mouseExited(MouseEvent e) { + setMouseComponent(null); + } + + public void mouseClicked(MouseEvent e) { + if (mouseCom == clearLabel) { + setText(""); + } else if (mouseCom == iconLabel) { + handleIconClick(); + } + } + }); + this.addMouseMotionListener(new MouseMotionListener() { + public void mouseMoved(MouseEvent e) { + JComponent com = getComponentAtPoint(e.getPoint()); + setMouseComponent(com); + } + + public void mouseDragged(MouseEvent e) { + } + }); + this.addFocusListener(new FocusListener() { + + public void focusLost(FocusEvent e) { + repaint(); + } + + public void focusGained(FocusEvent e) { + repaint(); + } + }); + } + + private void handleIconClick() { + + } + + public String getToolTipText(MouseEvent event) { + event.getPoint(); + if (mouseCom == null) { + return null; + } + if (mouseCom == this) { + return super.getToolTipText(event); + } + return mouseCom.getToolTipText(event); + } + + private int iconGap = 3; + + public Insets getInsets() { + Insets insets = super.getInsets(); + if (iconPosition == SwingConstants.LEFT) { + insets.left += iconSize.width + iconGap + 2; + if (this.getText() != null && this.getText().length() != 0 && showClearIcon) { + insets.right += iconSize.width + iconGap + 2; + } else { + insets.right += iconGap; + } + } else { + insets.left += iconGap; + if (this.getText() != null && this.getText().length() != 0 && showClearIcon) { + insets.right += iconSize.width + iconGap + 2; + } else { + insets.right += iconGap; + } + } + return insets; + } + + private JComponent getComponentAtPoint(Point point) { + int x = (int) point.getX(); + int y = (int) point.getY(); + if (!contains(x, y)) { + return null; + } + + if (iconPosition == SwingConstants.LEFT) { + if (x < iconSize.width + iconGap + 2) { + return iconLabel; + } + if (getText() != null && getText().length() != 0 && showClearIcon) { + if (x > getWidth() - iconSize.width - iconGap) { + return clearLabel; + } + } + } else { + if (this.getText() == null || this.getText().length() == 0) { + if (x > getWidth() - iconSize.width - iconGap - 2) { + return iconLabel; + } + } + if (getText() != null && getText().length() != 0 && showClearIcon) { + if (x > getWidth() - iconSize.width - iconGap - 2) { + return clearLabel; + } + } + + } + return this; + } + + private JComponent mouseCom; + + private void setMouseComponent(JComponent com) { + if (mouseCom == com) { + return; + } + if (mouseCom != null && mouseCom instanceof UILabel) { + mouseCom.setBorder(null); + } + mouseCom = com; + if (mouseCom != null && mouseCom instanceof UILabel) { + mouseCom.setBorder(BorderFactory.createLineBorder(Color.ORANGE, 1)); + } + this.repaint(); + if (mouseCom == null || mouseCom == clearLabel) { + setCursor(Cursor.getDefaultCursor()); + return; + } + if (mouseCom == this) { + setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR)); + return; + } + if (mouseCom == iconLabel) { + setCursor(iconLabel.getCursor()); + } + } + + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2d = (Graphics2D) g; + int y = (int) (this.getHeight() / 2.0 - iconSize.getHeight() / 2); + if (iconPosition == SwingConstants.LEFT) { + cellRendererPane.paintComponent(g2d, iconLabel, this, iconGap, y, iconSize.width, iconSize.height); + if (this.getText() != null && this.getText().length() != 0 && showClearIcon) { + cellRendererPane.paintComponent(g2d, clearLabel, this, this.getWidth() - iconSize.width - iconGap, y, iconSize.width, iconSize.height); + } + } else { + if (this.getText() == null || this.getText().length() == 0) { + cellRendererPane.paintComponent(g2d, iconLabel, this, this.getWidth() - iconSize.width - iconGap, y, iconSize.width, iconSize.height); + } else { + if (showClearIcon) { + cellRendererPane.paintComponent(g2d, clearLabel, this, this.getWidth() - iconSize.width - iconGap, y, iconSize.width, iconSize.height); + } + } + } + + if (!this.isFocusOwner()) { + if (this.getText() == null || this.getText().length() == 0) { + int x = iconGap + 2; + if (iconPosition == SwingConstants.LEFT) { + x = iconSize.width + iconGap + 2; + } + y = (int) (this.getHeight() / 2.0 - infoSize.getHeight() / 2); + cellRendererPane.paintComponent(g2d, infoLabel, this, x, y, infoSize.width, infoSize.height); + } + } + } + + public Dimension getPreferredSize() { + Insets s = super.getInsets(); + Insets t = this.getInsets(); + Dimension preferredSize = super.getPreferredSize(); + preferredSize.setSize(preferredSize.width - (t.left + t.right - s.left - s.right), preferredSize.height + 2); + return preferredSize; + } + + protected void paintBorder(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + if (this.isFocusOwner()) { + g2d.setStroke(new BasicStroke(1.5f)); + } else { + g2d.setStroke(new BasicStroke(1f)); + } + RoundRectangle2D.Double rect = new RoundRectangle2D.Double(0, 0, this.getWidth() - 2, this.getHeight() - 2, 4, 4); + g2d.setColor(UIConstants.SHADOW_GREY); + g2d.draw(rect); + } + + public int getIconPosition() { + return iconPosition; + } + + public void setIconPosition(int iconPosition) { + this.iconPosition = iconPosition; + this.invalidate(); + this.repaint(); + } + + public boolean isShowClearIcon() { + return showClearIcon; + } + + public void setShowClearIcon(boolean showClearIcon) { + this.showClearIcon = showClearIcon; + this.repaint(); + } + + public static void main(String[] args) { + JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT)); + UISearchTextField comp = new UISearchTextField(20); + p.add(comp); + comp = new UISearchTextField(20); + comp.setShowClearIcon(false); + p.add(comp); + comp = new UISearchTextField(20); + comp.setIconPosition(SwingConstants.RIGHT); + p.add(comp); + comp = new UISearchTextField(20); + comp.setShowClearIcon(false); + comp.setIconPosition(SwingConstants.RIGHT); + p.add(comp); + p.add(new JTextField(20)); + JFrame frame = new JFrame(); + frame.setTitle("UITextField"); + frame.setContentPane(p); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(300, 200); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itextfield/UITextField.java b/designer-base/src/com/fr/design/gui/itextfield/UITextField.java new file mode 100644 index 0000000000..e4f5b9d875 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itextfield/UITextField.java @@ -0,0 +1,228 @@ +package com.fr.design.gui.itextfield; + +import com.fr.common.inputevent.InputEventBaseOnOS; +import com.fr.design.event.GlobalNameListener; +import com.fr.design.event.GlobalNameObserver; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.stable.Constants; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.Document; +import java.awt.*; + +/** + * @author Jerry + */ +public class UITextField extends JTextField implements UIObserver, GlobalNameObserver { + private boolean isBorderPainted = true; + private boolean isRoundBorder = true; + private int rectDirection = Constants.NULL; + private UIObserverListener uiObserverListener; + private String textFeildName = ""; + private GlobalNameListener globalNameListener = null; + private Dimension preferredSize = null; + + //有些情况下setText的时候不希望触发attributeChange,添加一个属性标识 + private boolean isSetting = false; + + public UITextField() { + super(); + InputEventBaseOnOS.addBasicEditInputMap(this); + initListener(); + } + + public UITextField(int columns) { + super(columns); + InputEventBaseOnOS.addBasicEditInputMap(this); + initListener(); + } + + public UITextField(String text, int columns) { + super(text, columns); + InputEventBaseOnOS.addBasicEditInputMap(this); + initListener(); + } + + public UITextField(String text) { + super(text); + InputEventBaseOnOS.addBasicEditInputMap(this); + + initListener(); + } + + public UITextField(Document doc, String text, int columns) { + super(doc, text, columns); + InputEventBaseOnOS.addBasicEditInputMap(this); + initListener(); + } + + protected void initListener() { + if (shouldResponseChangeListener()) { + getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + attributeChange(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + attributeChange(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + attributeChange(); + } + }); + } + } + + public boolean isSetting() { + return isSetting; + } + + public void setSetting(boolean setting) { + isSetting = setting; + } + + public void setPreferredSize(Dimension preferredSize) { + this.preferredSize = preferredSize; + } + + public void setGlobalName(String name) { + textFeildName = name; + } + + protected void attributeChange() { + if(isSetting){ + return; + } + if (globalNameListener != null && shouldResponseNameListener()) { + globalNameListener.setGlobalName(textFeildName); + } + if (uiObserverListener != null) { + uiObserverListener.doChange(); + } + } + + @Override + public Insets getInsets() { + return new Insets(0, 4, 0, 4); + } + + @Override + public Dimension getPreferredSize() { + if (preferredSize == null) { + return new Dimension(super.getPreferredSize().width, 20); + } + return preferredSize; + } + + @Override + public UITextFieldUI getUI() { + return (UITextFieldUI) ui; + } + + /** + * 设置变化的背景颜色 + */ + public void setBackgroundUIColor(Color color) { + ((UITextFieldUI) this.ui).setBackgroundColor4NoGiveNumber(color); + } + + /** + * 更新UI + */ + public void updateUI() { + this.setUI(new UITextFieldUI(this)); + } + + @Override + protected void paintBorder(Graphics g) { + if (!isBorderPainted) { + return; + } + getUI().paintBorder((Graphics2D) g, getWidth(), getHeight(), isRoundBorder, rectDirection); + } + + /** + * @param isRoundBorder + */ + public void setRoundBorder(boolean isRoundBorder) { + this.isRoundBorder = isRoundBorder; + } + + + /** + * @param rectDirection + */ + public void setRectDirection(int rectDirection) { + this.rectDirection = rectDirection; + } + + /** + * 注册监听 + * + * @param listener 观察者监听事件 + */ + public void registerNameListener(GlobalNameListener listener) { + globalNameListener = listener; + } + + /** + * 是否需要回应监听器响应 + * + * @return 是则返回true + */ + public boolean shouldResponseNameListener() { + return true; + } + + + /** + * 注册监听器 + * + * @param listener 观察者监听事件 + */ + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } + + /** + * 是否需要回应监听器响应 + * + * @return 是则返回true + */ + public boolean shouldResponseChangeListener() { + return true; + } + + /** + * 主函数 + * + * @param args 参数 + */ + public static void main(String... args) { + LayoutManager layoutManager = null; + JFrame jf = new JFrame("test"); + jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + JPanel content = (JPanel) jf.getContentPane(); + content.setLayout(layoutManager); + + UITextField bb = new UITextField(5); + bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); + content.add(bb); + GUICoreUtils.centerWindow(jf); + jf.setSize(400, 400); + jf.setVisible(true); + } + + public void setBorderPainted(boolean isBorderPainted) { + this.isBorderPainted = isBorderPainted; + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itextfield/UITextFieldUI.java b/designer-base/src/com/fr/design/gui/itextfield/UITextFieldUI.java new file mode 100644 index 0000000000..58e2d04e0d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itextfield/UITextFieldUI.java @@ -0,0 +1,74 @@ +package com.fr.design.gui.itextfield; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.Shape; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.geom.RoundRectangle2D; + +import javax.swing.JComponent; +import javax.swing.plaf.basic.BasicTextFieldUI; +import javax.swing.text.JTextComponent; + +import com.fr.design.constants.UIConstants; +import com.fr.design.utils.gui.GUIPaintUtils; + +public class UITextFieldUI extends BasicTextFieldUI { + protected boolean isRollOver; + private JComponent textField; + + private Color backgroundColor = Color.WHITE; + + public UITextFieldUI(final JComponent textField) { + super(); + this.textField = textField; + this.textField.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + isRollOver = true; + textField.repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + isRollOver = false; + textField.repaint(); + } + }); + } + + @Override + protected void paintBackground(Graphics g) { + JTextComponent editor = getComponent(); + int width = editor.getWidth(); + int height = editor.getHeight(); + Shape roundShape = new RoundRectangle2D.Double(0, 0, width, height, 0, 0); + Graphics2D g2d = (Graphics2D)g; + g2d.clearRect(0, 0, width, height); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); + g2d.clip(roundShape); + g2d.setColor(backgroundColor); + g2d.fillRoundRect(1, 1, width - 2, height - 2, 0, 0); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF); + } + + /** + * 在出现不允许的数字时, 变换背景. + */ + public void setBackgroundColor4NoGiveNumber(Color color) { + this.backgroundColor = color; + } + + public void paintBorder(Graphics2D g2d, int width, int height, boolean isRound, int rectDirection) { + if(isRollOver && textField.isEnabled()) { + g2d.setColor(UIConstants.TEXT_FILED_BORDER_SELECTED); + g2d.drawRect(0, 0, width - 1, height - 1); + } else { + GUIPaintUtils.drawBorder(g2d, 0, 0, width, height, isRound, rectDirection); + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itoolbar/UILargeToolbar.java b/designer-base/src/com/fr/design/gui/itoolbar/UILargeToolbar.java new file mode 100644 index 0000000000..0054421197 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itoolbar/UILargeToolbar.java @@ -0,0 +1,18 @@ +package com.fr.design.gui.itoolbar; + +import java.awt.*; + +public class UILargeToolbar extends UIToolbar { + + private static final int HEIGHT = 53; + private static final int WIDTH = 60; + + public UILargeToolbar(int align) { + super(align); + } + + @Override + public Dimension getPreferredSize() { + return new Dimension(WIDTH ,HEIGHT); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itoolbar/UIToolBarBorder.java b/designer-base/src/com/fr/design/gui/itoolbar/UIToolBarBorder.java new file mode 100644 index 0000000000..9790198d70 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itoolbar/UIToolBarBorder.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. + */ + +package com.fr.design.gui.itoolbar; + +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.plaf.metal.MetalBorders; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-3-6 + * Time: 上午9:57 + */ +public class UIToolBarBorder extends MetalBorders.ToolBarBorder { + + public Insets getBorderInsets(Component c) { + return getBorderInsets(c, new Insets(0, 0, 0, 0)); + } + + public Insets getBorderInsets(Component c, Insets newInsets) { + newInsets.top = newInsets.left = newInsets.bottom = newInsets.right = 2; + + // we cannot assume that c is a JToolBar + if (!(c instanceof JToolBar)){ + return newInsets; + } + + if (((JToolBar) c).isFloatable()) { + if (((JToolBar) c).getOrientation() == HORIZONTAL) { + if (c.getComponentOrientation().isLeftToRight()) { + newInsets.left = UIToolBarUI.FLOATABLE_GRIP_SIZE + 2; + } else { + newInsets.right = UIToolBarUI.FLOATABLE_GRIP_SIZE + 2; + } + } else { // vertical + newInsets.top = UIToolBarUI.FLOATABLE_GRIP_SIZE + 2; + } + } + + Insets margin = ((JToolBar) c).getMargin(); + + if (margin != null) { + newInsets.left += margin.left; + newInsets.top += margin.top; + newInsets.right += margin.right; + newInsets.bottom += margin.bottom; + } + + return newInsets; + } + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + if (!(c instanceof JToolBar)){ + return; + } + drawWinBorder(c, g, x, y, w, h); + if (((JToolBar) c).getOrientation() == HORIZONTAL) { + g.setColor(ThemeUtils.TOOL_BAR_LIGHT_COLOR); + g.drawLine(x, y, w - 1, y); // top + g.setColor(ThemeUtils.TOOL_BAR_DARK_COLOR); + g.drawLine(x, h - 1, w - 1, h - 1); // bottom + } else { + g.setColor(ThemeUtils.TOOL_BAR_LIGHT_COLOR); + g.drawLine(x, y, x, h - 1); // left + g.setColor(ThemeUtils.TOOL_BAR_DARK_COLOR); + g.drawLine(w - 1, y, w - 1, h - 1); // right + } + } + + protected void drawWinBorder(Component c, Graphics g, int x, int y, int w, int h) { + g.translate(x, y); + + if (((JToolBar) c).isFloatable()) { + // paint grip + if (((JToolBar) c).getOrientation() == HORIZONTAL) { + int xoff = 3; + if (!c.getComponentOrientation().isLeftToRight()) { + xoff = c.getBounds().width - UIToolBarUI.FLOATABLE_GRIP_SIZE + 3; + } + + g.setColor(ThemeUtils.TOOL_GRIP_LIGHT_COLOR); + g.drawLine(xoff, 3, xoff + 1, 3); + g.drawLine(xoff, 3, xoff, h - 5); + g.setColor(ThemeUtils.TOOL_GRIP_DARK_COLOR); + g.drawLine(xoff, h - 4, xoff + 1, h - 4); + g.drawLine(xoff + 2, 3, xoff + 2, h - 4); + } else { // vertical + g.setColor(ThemeUtils.TOOL_GRIP_LIGHT_COLOR); + g.drawLine(3, 3, 3, 4); + g.drawLine(3, 3, w - 4, 3); + g.setColor(ThemeUtils.TOOL_GRIP_DARK_COLOR); + g.drawLine(w - 4, 4, w - 4, 5); + g.drawLine(3, 5, w - 4, 5); + } + } + + g.translate(-x, -y); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itoolbar/UIToolBarSeparatorUI.java b/designer-base/src/com/fr/design/gui/itoolbar/UIToolBarSeparatorUI.java new file mode 100644 index 0000000000..d4e6d186ac --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itoolbar/UIToolBarSeparatorUI.java @@ -0,0 +1,98 @@ +package com.fr.design.gui.itoolbar; + +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicToolBarSeparatorUI; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 14-2-14 + * Time: 下午5:25 + */ +public class UIToolBarSeparatorUI extends BasicToolBarSeparatorUI { + + private static final int YQ_SIZE = 7; + private int defaultSize = YQ_SIZE; + + /** + * 创建组件UI + * + * @param c 组件 + * @return 组件UI + */ + public static ComponentUI createUI(JComponent c) { + return new UIToolBarSeparatorUI(); + } + + /** + * Overridden to do nothing + */ + protected void installDefaults(JSeparator s) { + } + + public Dimension getMinimumSize(JComponent c) { + JToolBar.Separator sep = (JToolBar.Separator) c; + + if (sep.getOrientation() == JSeparator.HORIZONTAL) { + return new Dimension(0, 1); + } else { + return new Dimension(1, 0); + } + } + + public Dimension getMaximumSize(JComponent c) { + JToolBar.Separator sep = (JToolBar.Separator) c; + Dimension size = sep.getSeparatorSize(); + + if (sep.getOrientation() == JSeparator.HORIZONTAL) { + if (size != null) { + return new Dimension(32767, size.height); + } + return new Dimension(32767, defaultSize); + } else { + if (size != null) { + return new Dimension(32767, size.width); + } + + return new Dimension(defaultSize, 32767); + } + } + + public Dimension getPreferredSize(JComponent c) { + JToolBar.Separator sep = (JToolBar.Separator) c; + + Dimension size = sep.getSeparatorSize(); + + if (size != null) { + return size.getSize(); + } + + if (sep.getOrientation() == JSeparator.HORIZONTAL) { + return new Dimension(0, defaultSize); + } else { + return new Dimension(defaultSize, 0); + } + } + + public void paint(Graphics g, JComponent c) { + JToolBar.Separator sep = (JToolBar.Separator) c; + + if (sep.getOrientation() == JSeparator.HORIZONTAL) { + int y = sep.getHeight() / 2; // centered if height is odd + + g.setColor(ThemeUtils.TOOL_SEP_DARK_COLOR); + g.drawLine(0, y, sep.getWidth(), y); + } else { + int x = sep.getWidth() / 2; // centered if width is odd + + g.setColor(ThemeUtils.TOOL_SEP_DARK_COLOR); + g.drawLine(x, 0, x, sep.getHeight()); + } + + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itoolbar/UIToolBarUI.java b/designer-base/src/com/fr/design/gui/itoolbar/UIToolBarUI.java new file mode 100644 index 0000000000..915e324500 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itoolbar/UIToolBarUI.java @@ -0,0 +1,112 @@ +package com.fr.design.gui.itoolbar; + + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ibutton.UIToolButtonBorder; +import com.fr.design.gui.icheckbox.UICheckBox; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.UIResource; +import javax.swing.plaf.metal.MetalToolBarUI; +import java.awt.*; +import java.awt.event.WindowListener; + +public class UIToolBarUI extends MetalToolBarUI { + public static final String IS_TOOL_BAR_BUTTON_KEY = "JToolBar.isToolbarButton"; + public static final int FLOATABLE_GRIP_SIZE = 8; + + /** + * The Border used for buttons in a toolbar + */ + private static Border toolButtonBorder = new UIToolButtonBorder(); + + /** + * 创建组件UI + * + * @param c 组件 + * @return 组件UI + */ + public static ComponentUI createUI(JComponent c) { + return new UIToolBarUI(); + } + + /** + * 加载组件ui + * + * @param c 组件 + */ + public void installUI(JComponent c) { + super.installUI(c); + c.putClientProperty("JToolBar.isRollover", Boolean.TRUE); + } + + /** + * Overrides BasicToolBarUI.createFloatingWindow() to return a simple dialog + * (which works with TinyLaF). Creates a window which contains the toolbar + * after it has been dragged out from its container + * + * @return a RootPaneContainer object, containing the toolbar. + */ + protected RootPaneContainer createFloatingWindow(JToolBar toolbar) { + JDialog dialog; + Window window = SwingUtilities.getWindowAncestor(toolbar); + + if (window instanceof Frame) { + dialog = new JDialog((Frame) window, toolbar.getName(), false); + } else if (window instanceof Dialog) { + dialog = new JDialog((Dialog) window, toolbar.getName(), false); + } else { + dialog = new JDialog((Frame) null, toolbar.getName(), false); + } + + dialog.setTitle(toolbar.getName()); + dialog.setResizable(false); + WindowListener wl = createFrameListener(); + dialog.addWindowListener(wl); + + return dialog; + } + + /** + * Paints the given component. + * + * @param g The graphics context to use. + * @param c The component to paint. + */ + public void paint(Graphics g, JComponent c) { + Graphics2D g2 = (Graphics2D) g; + g2.setColor(UIConstants.UI_TOOLBAR_COLOR); + g2.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + + /** + * Rewritten in 1.3. Now the border is defined through button margin. + */ + protected void setBorderToRollover(Component c) { + setBorderToNormal(c); + } + + protected void setBorderToNormal(Component c) { + if (!(c instanceof AbstractButton)) { + return; + } + if (c instanceof UICheckBox) { + return; + } + if (c instanceof JRadioButton) { + return; + } + AbstractButton b = (AbstractButton) c; + b.setRolloverEnabled(true); + b.putClientProperty(IS_TOOL_BAR_BUTTON_KEY, Boolean.TRUE); + + if (!(b.getBorder() instanceof UIResource) && !(b.getBorder() instanceof UIToolButtonBorder)) { + // user has installed her own border + return; + } + + b.setBorder(toolButtonBorder); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itoolbar/UIToolbar.java b/designer-base/src/com/fr/design/gui/itoolbar/UIToolbar.java new file mode 100644 index 0000000000..d2cca4b482 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itoolbar/UIToolbar.java @@ -0,0 +1,34 @@ +package com.fr.design.gui.itoolbar; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; + +public class UIToolbar extends JToolBar { + + public UIToolbar() { + this(FlowLayout.LEFT); + } + + public UIToolbar(int align, UIToolBarUI uiToolBarUI) { + super(); + setFloatable(false); + setRollover(true); + setLayout(new FlowLayout(align, 4, 0)); + setUI(uiToolBarUI); + setBorderPainted(false); + } + + public UIToolbar(int align) { + this(align, new UIToolBarUI()); + } + + public void checkComponentsByNames(boolean flag, ArrayList names) { + for (int i = 0; i < getComponentCount(); i++) { + Component component = getComponents()[i]; + if (names.contains(component.getName())) { + component.setEnabled(flag); + } + } + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/itooltip/MultiLineToolTip.java b/designer-base/src/com/fr/design/gui/itooltip/MultiLineToolTip.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itooltip/MultiLineToolTip.java rename to designer-base/src/com/fr/design/gui/itooltip/MultiLineToolTip.java diff --git a/designer_base/src/com/fr/design/gui/itooltip/MultiLineToolTipUI.java b/designer-base/src/com/fr/design/gui/itooltip/MultiLineToolTipUI.java similarity index 100% rename from designer_base/src/com/fr/design/gui/itooltip/MultiLineToolTipUI.java rename to designer-base/src/com/fr/design/gui/itooltip/MultiLineToolTipUI.java diff --git a/designer-base/src/com/fr/design/gui/itooltip/UIToolTip.java b/designer-base/src/com/fr/design/gui/itooltip/UIToolTip.java new file mode 100644 index 0000000000..2918975558 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itooltip/UIToolTip.java @@ -0,0 +1,88 @@ +package com.fr.design.gui.itooltip; + +import com.fr.base.FRContext; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.general.ComparatorUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-5-16 + * Time: 下午2:40 + * To change this template use File | Settings | File Templates. + */ +public class UIToolTip extends JToolTip{ + private Icon icon; + public UIToolTip() { + this(new ImageIcon()); + } + + public UIToolTip(Icon icon) { + this.icon = icon; + setUI(new UIToolTipUI()); + try { + this.addMouseListener(new MouseAdapter() { + Robot robot = new Robot(); + public void mousePressed(MouseEvent e) { + setVisible(false); + robot.mousePress(MouseEvent.BUTTON3_MASK); + robot.mouseRelease(MouseEvent.BUTTON3_MASK); + robot.mousePress(MouseEvent.BUTTON1_MASK); + } + + public void mouseReleased(MouseEvent e) { + robot.mouseRelease(MouseEvent.BUTTON1_MASK); + } + }); + } catch (AWTException e) { + FRContext.getLogger().error(e.getMessage(),e); + } + + this.addMouseWheelListener(new MouseWheelListener() { + public void mouseWheelMoved(MouseWheelEvent e) { + setVisible(false); + } + }); + + this.addMouseListener(new MouseAdapter() { + public void mouseExited(MouseEvent e) { + ToolTipManager.sharedInstance().setEnabled(false); + ToolTipManager.sharedInstance().setEnabled(true); + } + }); + this.addMouseMotionListener(new MouseMotionAdapter() { + public void mouseMoved(MouseEvent e) { + Container container = getComponent(); + while (!ComparatorUtils.equals(container.getClass(), UIScrollPane.class)) { + if (container.getParent() == null) { + break; + } + container = container.getParent(); + } + Point mouse = e.getLocationOnScreen(); + Point parent = container.getLocationOnScreen(); + if (!isInParent(mouse, parent, container.getWidth(), container.getHeight())) { + ToolTipManager.sharedInstance().setEnabled(false); + ToolTipManager.sharedInstance().setEnabled(true); + } + + } + }); + + } + + private boolean isInParent(Point mouse, Point parent, int width, int height) { + int deltaX = (int) (mouse.getX() - parent.getX()); + int deltaY = (int) (mouse.getY() - parent.getY()); + return deltaX > 1 && deltaX < width - 10 && deltaY > 1 && deltaY < height - 1; + } + + + public Icon getIcon() { + return icon; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itooltip/UIToolTipBorder.java b/designer-base/src/com/fr/design/gui/itooltip/UIToolTipBorder.java new file mode 100644 index 0000000000..9093f9eb1d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itooltip/UIToolTipBorder.java @@ -0,0 +1,44 @@ +package com.fr.design.gui.itooltip; + +import javax.swing.border.Border; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.InsetsUIResource; +import java.awt.*; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 13-12-31 + * Time: 上午10:38 + */ +public class UIToolTipBorder implements Border { + + private static final ColorUIResource TIP_BORDER_COLOR = new ColorUIResource(0, 0, 0); + private static final ColorUIResource TIP_BORDER_DIS = new ColorUIResource(143, 141, 139); + + private static final InsetsUIResource INSETS = new InsetsUIResource(3, 3, 3, 3); + private boolean active; + + public UIToolTipBorder(boolean b) { + active = b; + } + + public boolean isBorderOpaque() { + return false; + } + + public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) { + if (active) { + g.setColor(TIP_BORDER_COLOR); + } else { + g.setColor(TIP_BORDER_DIS); + } + + g.drawRect(x, y, w - 1, h - 1); + } + + public Insets getBorderInsets(Component c) { + return INSETS; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itooltip/UIToolTipUI.java b/designer-base/src/com/fr/design/gui/itooltip/UIToolTipUI.java new file mode 100644 index 0000000000..dc6d2a6bc2 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itooltip/UIToolTipUI.java @@ -0,0 +1,118 @@ +package com.fr.design.gui.itooltip; + +import com.fr.base.FRContext; +import com.fr.base.GraphHelper; + +import javax.swing.*; +import javax.swing.plaf.ToolTipUI; +import java.awt.*; +import java.awt.geom.GeneralPath; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.util.Enumeration; +import java.util.Vector; + +/** + * Created with IntelliJ IDEA. + * User: pony + * Date: 13-5-16 + * Time: 下午2:42 + * To change this template use File | Settings | File Templates. + */ +public class UIToolTipUI extends ToolTipUI { + private String[] strs; + private Icon icon; + private boolean needPaint; + public void paint(Graphics g, JComponent c) { + if (!needPaint) { + return; + } + FontMetrics metrics = GraphHelper.getFontMetrics(c.getFont()); + Dimension size = c.getSize(); + int width = size.width; + int height = size.height; + Graphics2D g2 = (Graphics2D) g; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + GradientPaint paint = new GradientPaint(0, 0, new Color(212, 212, 216), 0, height ,new Color(171, 183, 203)); + g2.setPaint(paint); + g2.fillRoundRect(0, 0, width - 3, height - 3, 6, 6); + g2.setColor(new Color(100, 100, 100)); + g2.drawRoundRect(0, 0, width - 3, height - 3, 6, 6); + + GradientPaint cornerPaint = new GradientPaint(width-3, height-3, new Color(100, 100, 100, 191), width - 1, height - 1, new Color(212, 212, 216)); + g2.setPaint(cornerPaint); + g2.fillArc(width - 6, height - 6, 6, 6, 270, 90 ); + + GeneralPath shadowDown = new GeneralPath(GeneralPath.WIND_EVEN_ODD, 4); + shadowDown.moveTo(0, height - 3); + shadowDown.lineTo(3, height); + shadowDown.lineTo(width - 3, height); + shadowDown.lineTo(width - 3, height - 3); + GradientPaint downPaint = new GradientPaint(0, height-3, new Color(100, 100, 100, 191), 0, height, new Color(212, 212, 216)); + g2.setPaint(downPaint); + GraphHelper.fill(g2, shadowDown); + + GeneralPath shadowRight = new GeneralPath(GeneralPath.WIND_EVEN_ODD, 4); + shadowRight.moveTo(width - 3, height - 3); + shadowRight.lineTo(width, height - 3); + shadowRight.lineTo(width, 3); + shadowRight.lineTo(width - 3, 0); + GradientPaint rightPaint = new GradientPaint(width - 3, 0, new Color(100, 100, 100, 191), width, 0, new Color(212, 212, 216)); + g2.setPaint(rightPaint); + GraphHelper.fill(g2, shadowRight); + + g2.setColor(c.getForeground()); + if (icon instanceof ImageIcon) { + ImageIcon imageIcon = (ImageIcon)icon; + g2.drawImage(imageIcon.getImage(), 2 , 2, imageIcon.getImageObserver()); + } + if (strs != null) { + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_DEFAULT); + for (int i = 0; i < strs.length; i++) { + g2.drawString(strs[i], icon.getIconWidth() + 6, (metrics.getHeight()) * (i + 1)); + } + } + } + + @Override + public Dimension getPreferredSize(JComponent c) { + FontMetrics metrics = GraphHelper.getFontMetrics(c.getFont()); + String tipText = ((JToolTip) c).getTipText(); + icon = ((UIToolTip)c).getIcon(); + needPaint = true; + if (tipText == null) { + if(icon.getIconWidth() == -1) { + needPaint = false; + } + tipText = " "; + } + BufferedReader br = new BufferedReader(new StringReader(tipText)); + String line; + int maxWidth = 0; + Vector v = new Vector(); + try { + while ((line = br.readLine()) != null) { + int width = SwingUtilities.computeStringWidth(metrics, line); + maxWidth = (maxWidth < width) ? width : maxWidth; + v.addElement(line); + } + } catch (IOException ex) { + FRContext.getLogger().error(ex.getMessage(), ex); + } + int lines = v.size(); + if (lines < 1) { + strs = null; + lines = 1; + } else { + strs = new String[lines]; + int i = 0; + for (Enumeration e = v.elements(); e.hasMoreElements(); i++) { + strs[i] = e.nextElement(); + } + } + int height = metrics.getHeight() * lines; + return new Dimension(maxWidth + icon.getIconWidth() + 10, Math.max(height, icon.getIconHeight()) + 6); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/UITreeUI.java b/designer-base/src/com/fr/design/gui/itree/UITreeUI.java new file mode 100644 index 0000000000..fde3bf6461 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/UITreeUI.java @@ -0,0 +1,40 @@ +package com.fr.design.gui.itree; + +import com.fr.base.BaseUtils; +import com.fr.design.utils.ThemeUtils; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.metal.MetalTreeUI; +import javax.swing.tree.DefaultTreeCellRenderer; + +/** + * Created by IntelliJ IDEA. + * Author : daisy + * Version: 6.5.6 + * Date: 13-12-31 + * Time: 下午4:58 + */ +public class UITreeUI extends MetalTreeUI { + /** + * 创建组件UI + * @param x 组件 + * @return 返回组件UI + */ + public static ComponentUI createUI(JComponent x) { + return new UITreeUI(); + } + + protected void installDefaults() { + super.installDefaults(); + setExpandedIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/minus.png")); + setCollapsedIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/plus.png")); + if (tree.getCellRenderer() instanceof DefaultTreeCellRenderer) { + DefaultTreeCellRenderer r = (DefaultTreeCellRenderer) tree.getCellRenderer(); + r.setBackgroundNonSelectionColor(ThemeUtils.TEXT_BG_COLOR); + r.setBackgroundSelectionColor(ThemeUtils.TEXT_SELECTED_BG_COLOR); + r.setTextNonSelectionColor(ThemeUtils.NORMAL_FOREGROUND); + r.setTextSelectionColor(ThemeUtils.TEXT_BG_COLOR); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java b/designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java new file mode 100644 index 0000000000..e06ac43033 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTree.java @@ -0,0 +1,453 @@ +/* + * @(#)CheckBoxTree.java 8/11/2005 + * modified by FineReport + * Copyright 2002 - 2005 JIDE Software Inc. All rights reserved. + */ +package com.fr.design.gui.itree.checkboxtree; + +import com.fr.design.gui.icheckbox.UICheckBox; + +import javax.swing.*; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.text.Position; +import javax.swing.tree.*; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Hashtable; +import java.util.Vector; + +/** + * CheckBoxTree is a special JTree which uses UICheckBox as the tree renderer. + * In addition to regular JTree's features, it also allows you select any number + * of tree nodes in the tree by selecting the check boxes. + *

To select an element, user can mouse click on the check box, or + * select one or several tree nodes and press SPACE key to toggle the + * check box selection for all selected tree nodes. + *

+ * In order to retrieve which tree paths are selected, you need to call + * {@link #getCheckBoxTreeSelectionModel()}. + * It will return the selection model that keeps track of which tree + * paths have been checked. For example + * {@link CheckBoxTreeSelectionModel#getSelectionPaths()} + * will give the list of paths which have + * been checked. + */ +public class CheckBoxTree extends JTree { + public final static String PROPERTY_CHECKBOX_ENABLED = "checkBoxEnabled"; + public final static String PROPERTY_DIG_IN = "digIn"; + + protected CheckBoxTreeCellRenderer _treeCellRenderer; + + private CheckBoxTreeSelectionModel _checkBoxTreeSelectionModel; + + private boolean _checkBoxEnabled = true; + private PropertyChangeListener _modelChangeListener; + + public CheckBoxTree() { + init(); + } + + public CheckBoxTree(Object[] value) { + super(value); + init(); + } + + public CheckBoxTree(Vector value) { + super(value); + init(); + } + + public CheckBoxTree(Hashtable value) { + super(value); + init(); + } + + public CheckBoxTree(TreeNode root) { + super(root); + init(); + } + + public CheckBoxTree(TreeNode root, boolean asksAllowsChildren) { + super(root, asksAllowsChildren); + init(); + } + + public CheckBoxTree(TreeModel newModel) { + super(newModel); + init(); + } + + /** + * Initialize the CheckBoxTree. + */ + protected void init() { + _checkBoxTreeSelectionModel = createCheckBoxTreeSelectionModel(getModel()); + _checkBoxTreeSelectionModel.setTree(this); + Handler handler = createHandler(); + this.insertMouseListener(this, handler, 0); + addKeyListener(handler); + _checkBoxTreeSelectionModel.addTreeSelectionListener(handler); + + if (_modelChangeListener == null) { + _modelChangeListener = new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + updateRowMapper(); + } + }; + } + addPropertyChangeListener(JTree.SELECTION_MODEL_PROPERTY, _modelChangeListener); + updateRowMapper(); + } + + /** + * Inserts the mouse listener at the particular index in the listeners' chain. + * + * @param component + * @param l + * @param index + */ + private void insertMouseListener(Component component, MouseListener l, int index) { + MouseListener[] listeners = component.getMouseListeners(); + for (int i = 0, length = listeners.length; i < length; i++) { + component.removeMouseListener(listeners[i]); + } +// for (MouseListener listener : listeners) { +// component.removeMouseListener(listener); +// } + for (int i = 0; i < listeners.length; i++) { + MouseListener listener = listeners[i]; + if (index == i) { + component.addMouseListener(l); + } + component.addMouseListener(listener); + } + // inex is too large, add to the end. + if (index > listeners.length - 1) { + component.addMouseListener(l); + } + } + + /** + * Creates the CheckBoxTreeSelectionModel. + * + * @param model the tree model. + * @return the CheckBoxTreeSelectionModel. + */ + protected CheckBoxTreeSelectionModel createCheckBoxTreeSelectionModel(TreeModel model) { + return new CheckBoxTreeSelectionModel(model); + } + + /** + * RowMapper is necessary for contiguous selection. + */ + private void updateRowMapper() { + _checkBoxTreeSelectionModel.setRowMapper(getSelectionModel().getRowMapper()); + } + + public void setModel(TreeModel newModel) { + super.setModel(newModel); + if (_checkBoxTreeSelectionModel != null) { + _checkBoxTreeSelectionModel.setModel(getModel()); + } + } + + /** + * Gets the cell renderer with check box. + * + * @return CheckBoxTree's own cell renderer which has the check box. The actual cell renderer + * you set by setCellRenderer() can be accessed by using {@link #getActualCellRenderer()}. + */ + public TreeCellRenderer getCellRenderer() { + TreeCellRenderer cellRenderer = super.getCellRenderer(); + if (cellRenderer == null) { + cellRenderer = new DefaultTreeCellRenderer(); + } + if (_treeCellRenderer == null) { + _treeCellRenderer = createCellRenderer(cellRenderer); + } else { + _treeCellRenderer.setActualTreeRenderer(cellRenderer); + } + return _treeCellRenderer; + } + + /** + * Gets the actual cell renderer. Since CheckBoxTree has its own check box cell renderer, this method + * will give you access to the actual cell renderer which is either the default tree cell renderer or + * the cell renderer you set using {@link #setCellRenderer(javax.swing.tree.TreeCellRenderer)}. + * + * @return the actual cell renderer + */ + public TreeCellRenderer getActualCellRenderer() { + if (_treeCellRenderer != null) { + return _treeCellRenderer.getActualTreeRenderer(); + } else { + return super.getCellRenderer(); + } + } + + /** + * Creates the cell renderer. + * + * @param renderer the actual renderer for the tree node. This method will + * return a cell renderer that use a check box and put the actual renderer inside it. + * @return the cell renderer. + */ + protected CheckBoxTreeCellRenderer createCellRenderer(TreeCellRenderer renderer) { + final CheckBoxTreeCellRenderer checkBoxTreeCellRenderer = new CheckBoxTreeCellRenderer(renderer); + addPropertyChangeListener(CELL_RENDERER_PROPERTY, new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + checkBoxTreeCellRenderer.setActualTreeRenderer((TreeCellRenderer) evt.getNewValue()); + } + }); + return checkBoxTreeCellRenderer; + } + + /** + * Creates the mouse listener and key listener used by CheckBoxTree. + * + * @return the Handler. + */ + protected Handler createHandler() { + return new Handler(this); + } + + protected static class Handler implements MouseListener, KeyListener, TreeSelectionListener { + protected CheckBoxTree _tree; + int _hotspot = new UICheckBox().getPreferredSize().width; + private int _toggleCount = -1; + + public Handler(CheckBoxTree tree) { + _tree = tree; + } + + protected TreePath getTreePathForMouseEvent(MouseEvent e) { + if (!SwingUtilities.isLeftMouseButton(e)) { + return null; + } + + if (!_tree.isCheckBoxEnabled()) { + return null; + } + + TreePath path = _tree.getPathForLocation(e.getX(), e.getY()); + if (path == null) { + return null; + } + + if (clicksInCheckBox(e, path)) { + return path; + } else { + return null; + } + } + + protected boolean clicksInCheckBox(MouseEvent e, TreePath path) { + if (!_tree.isCheckBoxVisible(path)) { + return false; + } else { + Rectangle bounds = _tree.getPathBounds(path); + if (_tree.getComponentOrientation().isLeftToRight()) { + return e.getX() < bounds.x + _hotspot; + } else { + return e.getX() > bounds.x + bounds.width - _hotspot; + } + } + } + + private TreePath preventToggleEvent(MouseEvent e) { + TreePath pathForMouseEvent = getTreePathForMouseEvent(e); + if (pathForMouseEvent != null) { + int toggleCount = _tree.getToggleClickCount(); + if (toggleCount != -1) { + _toggleCount = toggleCount; + _tree.setToggleClickCount(-1); + } + } + return pathForMouseEvent; + } + + public void mouseClicked(MouseEvent e) { + preventToggleEvent(e); + } + + public void mousePressed(MouseEvent e) { + TreePath path = preventToggleEvent(e); + if (path != null) { + toggleSelection(path); + e.consume(); + } + } + + public void mouseReleased(MouseEvent e) { + TreePath path = preventToggleEvent(e); + if (path != null) { + e.consume(); + } + if (_toggleCount != -1) { + _tree.setToggleClickCount(_toggleCount); + } + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } + + public void keyPressed(KeyEvent e) { + if (e.isConsumed()) { + return; + } + + if (!_tree.isCheckBoxEnabled()) { + return; + } + + if (e.getModifiers() == 0 && e.getKeyChar() == KeyEvent.VK_SPACE) { + toggleSelections(); + } + } + + public void keyTyped(KeyEvent e) { + } + + public void keyReleased(KeyEvent e) { + } + + public void valueChanged(TreeSelectionEvent e) { + _tree.treeDidChange(); + } + + private void toggleSelection(TreePath path) { + if (!_tree.isEnabled() || !_tree.isCheckBoxEnabled(path)) { + return; + } + CheckBoxTreeSelectionModel selectionModel = _tree.getCheckBoxTreeSelectionModel(); + boolean selected = selectionModel.isPathSelected(path, selectionModel.isDigIn()); + selectionModel.removeTreeSelectionListener(this); + try { + if (!selectionModel.isSingleEventMode()) { + selectionModel.setBatchMode(true); + } + if (selected) + selectionModel.removeSelectionPath(path); + else + selectionModel.addSelectionPath(path); + } finally { + if (!selectionModel.isSingleEventMode()) { + selectionModel.setBatchMode(false); + } + selectionModel.addTreeSelectionListener(this); + _tree.treeDidChange(); + } + } + + protected void toggleSelections() { + TreePath[] treePaths = _tree.getSelectionPaths(); + if (treePaths == null) { + return; + } + for (int i = 0, length = treePaths.length; i < length; i++) { + TreePath tmpTreePath = treePaths[i]; + toggleSelection(tmpTreePath); + } +// for (TreePath treePath : treePaths) { +// toggleSelection(treePath); +// } + } + } + + public TreePath getNextMatch(String prefix, int startingRow, Position.Bias bias) { + return null; + } + + /** + * Gets the selection model for the check boxes. To retrieve the state of check boxes, you should use this selection model. + * + * @return the selection model for the check boxes. + */ + public CheckBoxTreeSelectionModel getCheckBoxTreeSelectionModel() { + return _checkBoxTreeSelectionModel; + } + + /** + * Gets the value of property checkBoxEnabled. If true, user can + * click on check boxes on each tree node to select and unselect. + * If false, user can't click but you as developer can programatically + * call API to select/unselect it. + * + * @return the value of property checkBoxEnabled. + */ + public boolean isCheckBoxEnabled() { + return _checkBoxEnabled; + } + + /** + * Sets the value of property checkBoxEnabled. + * + * @param checkBoxEnabled true to allow to check the check box. False to disable it + * which means user can see whether a row is checked or not but they cannot change it. + */ + public void setCheckBoxEnabled(boolean checkBoxEnabled) { + if (checkBoxEnabled != _checkBoxEnabled) { + Boolean oldValue = _checkBoxEnabled ? Boolean.TRUE : Boolean.FALSE; + Boolean newValue = checkBoxEnabled ? Boolean.TRUE : Boolean.FALSE; + _checkBoxEnabled = checkBoxEnabled; + firePropertyChange(PROPERTY_CHECKBOX_ENABLED, oldValue, newValue); + repaint(); + } + } + + /** + * Checks if check box is enabled. There is no setter for it. The only way is to override + * this method to return true or false. + * + * @param path the tree path. + * @return true or false. If false, the check box on the particular tree path will be disabled. + */ + public boolean isCheckBoxEnabled(TreePath path) { + return true; + } + + /** + * Checks if check box is visible. There is no setter for it. The only way is to override + * this method to return true or false. + * + * @param path the tree path. + * @return true or false. If false, the check box on the particular tree path will be disabled. + */ + public boolean isCheckBoxVisible(TreePath path) { + return true; + } + + /** + * Gets the dig-in mode. If the CheckBoxTree is in dig-in mode, checking the parent node + * will check all the children. Correspondingly, getSelectionPaths() will only return the + * parent tree path. If not in dig-in mode, each tree node can be checked or unchecked independently + * + * @return true or false. + */ + public boolean isDigIn() { + return getCheckBoxTreeSelectionModel().isDigIn(); + } + + /** + * Sets the dig-in mode. If the CheckBoxTree is in dig-in mode, checking the parent node + * will check all the children. Correspondingly, getSelectionPaths() will only return the + * parent tree path. If not in dig-in mode, each tree node can be checked or unchecked independently + * + * @param digIn the new digIn mode. + */ + public void setDigIn(boolean digIn) { + boolean old = isDigIn(); + if (old != digIn) { + getCheckBoxTreeSelectionModel().setDigIn(digIn); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeCellRenderer.java b/designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeCellRenderer.java new file mode 100644 index 0000000000..2c7b899ddb --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeCellRenderer.java @@ -0,0 +1,134 @@ +/* + * @(#)CheckBoxTreeCellRenderer.java 8/11/2005 + * Modified by FineReport + * Copyright 2002 - 2005 JIDE Software Inc. All rights reserved. + */ + +package com.fr.design.gui.itree.checkboxtree; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.event.MouseEvent; +import java.io.Serializable; + +import javax.swing.BorderFactory; +import javax.swing.JComponent; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JTree; +import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreePath; + +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.layout.FRGUIPaneFactory; + + +/** + * Renderers an item in a tree using UICheckBox. + */ +public class CheckBoxTreeCellRenderer extends NullPanel implements TreeCellRenderer, Serializable { + + protected static Border noFocusBorder; + + /** + * The checkbox that is used to paint the check box in cell renderer + */ + protected TristateCheckBox _checkBox = new NullTristateCheckBox(); + protected UICheckBox PROTOTYPE = new TristateCheckBox(); + protected UILabel _label = new NullLabel(); + + /** + * The label which appears after the check box. + */ + protected TreeCellRenderer _actualTreeRenderer; + + /** + * Constructs a default renderer object for an item + * in a list. + */ + public CheckBoxTreeCellRenderer() { + this(null); + } + + public CheckBoxTreeCellRenderer(TreeCellRenderer renderer) { + if (noFocusBorder == null) { + noFocusBorder = new EmptyBorder(1, 1, 1, 1); + } + _checkBox.setOpaque(false); + setBorder(noFocusBorder); + setLayout(FRGUIPaneFactory.createBorderLayout()); + add(_checkBox, BorderLayout.BEFORE_LINE_BEGINS); + _actualTreeRenderer = renderer; + } + + public TreeCellRenderer getActualTreeRenderer() { + return _actualTreeRenderer; + } + + public void setActualTreeRenderer(TreeCellRenderer actualTreeRenderer) { + _actualTreeRenderer = actualTreeRenderer; + } + + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + _checkBox.setPreferredSize(new Dimension(PROTOTYPE.getPreferredSize().width, 0)); + setComponentOrientation(tree.getComponentOrientation()); + + TreePath path = tree.getPathForRow(row); + if (path != null && tree instanceof CheckBoxTree) { + CheckBoxTreeSelectionModel selectionModel = ((CheckBoxTree) tree).getCheckBoxTreeSelectionModel(); + if (selectionModel != null) { + _checkBox.setEnabled(((CheckBoxTree) tree).isCheckBoxEnabled() && ((CheckBoxTree) tree).isCheckBoxEnabled(path)); + if (selectionModel.isPathSelected(path, selectionModel.isDigIn())) { + _checkBox.setState(TristateCheckBox.SELECTED); + _checkBox.setSelected(true); + } + else { + _checkBox.setState(selectionModel.isDigIn() && selectionModel.isPartiallySelected(path) ? null : TristateCheckBox.NOT_SELECTED); + _checkBox.setSelected(false); + } + } + } + + if (_actualTreeRenderer != null) { + JComponent treeCellRendererComponent = (JComponent) _actualTreeRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + if (path != null && tree instanceof CheckBoxTree) { + if (!((CheckBoxTree) tree).isCheckBoxVisible(path)) { + return treeCellRendererComponent; + } + } + Border border = treeCellRendererComponent.getBorder(); + setBorder(border); + treeCellRendererComponent.setBorder(BorderFactory.createEmptyBorder()); + if (getComponentCount() == 2) { + remove(1); + } + add(treeCellRendererComponent); + } + + return this; + } + + public String getToolTipText(MouseEvent event) { + if (_actualTreeRenderer instanceof JComponent) { + Point p = event.getPoint(); + p.translate(-_checkBox.getWidth(), 0); + MouseEvent newEvent = new MouseEvent(((JComponent) _actualTreeRenderer), event.getID(), + event.getWhen(), + event.getModifiers(), + p.x, p.y, event.getClickCount(), + event.isPopupTrigger()); + + String tip = ((JComponent) _actualTreeRenderer).getToolTipText( + newEvent); + + if (tip != null) { + return tip; + } + } + return super.getToolTipText(event); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeSelectionModel.java b/designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeSelectionModel.java new file mode 100644 index 0000000000..562a83dda0 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/checkboxtree/CheckBoxTreeSelectionModel.java @@ -0,0 +1,483 @@ +package com.fr.design.gui.itree.checkboxtree; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; +import java.util.Vector; + +import javax.swing.event.TreeSelectionEvent; +import javax.swing.tree.DefaultTreeSelectionModel; +import javax.swing.tree.TreeModel; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; + +/** + * CheckBoxTreeSelectionModel is a selection _model based on {@link DefaultTreeSelectionModel} and use + * in {@link CheckBoxTree} to keep track of the checked tree paths. + * + * @author Santhosh Kumar T + */ +public class CheckBoxTreeSelectionModel extends DefaultTreeSelectionModel { + private TreeModel _model; + private boolean _digIn = false;//james:把这个默认值改掉了,方便使用 + private CheckBoxTree _tree; + + private boolean _singleEventMode = false; + + public CheckBoxTreeSelectionModel(TreeModel model) { + _model = model; + setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); + } + + void setTree(CheckBoxTree tree) { + _tree = tree; + } + + public CheckBoxTreeSelectionModel(TreeModel model, boolean digIn) { + _model = model; + _digIn = digIn; + } + + public TreeModel getModel() { + return _model; + } + + public void setModel(TreeModel model) { + _model = model; + } + + /** + * Gets the dig-in mode. If the CheckBoxTree is in dig-in mode, checking the parent node + * will check all the children. Correspondingly, getSelectionPaths() will only return the + * parent tree path. If not in dig-in mode, each tree node can be checked or unchecked independently + * + * @return true or false. + */ + public boolean isDigIn() { + return _digIn; + } + + /** + * Sets the dig-in mode. If the CheckBoxTree is in dig-in mode, checking the parent node + * will check all the children. Correspondingly, getSelectionPaths() will only return the + * parent tree path. If not in dig-in mode, each tree node can be checked or unchecked independently + * + * @param digIn true to enable dig-in mode. False to disable it. + */ + public void setDigIn(boolean digIn) { + _digIn = digIn; + } + + /** + * Tests whether there is any unselected node in the subtree of given path. + * + * @param path check if the path is partially selected. + * @return true i fpartially. Otherwise false. + */ + public boolean isPartiallySelected(TreePath path) { + if (isPathSelected(path, true)) + return false; + TreePath[] selectionPaths = getSelectionPaths(); + if (selectionPaths == null) + return false; + for (int i = 0, length = selectionPaths.length; i < length; i++) { + TreePath selectionPath = selectionPaths[i]; + if (isDescendant(selectionPath, path)) + return true; + } +// for (TreePath selectionPath : selectionPaths) { +// if (isDescendant(selectionPath, path)) +// return true; +// } + return false; + } + + /** + * Tells whether given path is selected. if dig is true, + * then a path is assumed to be selected, if one of its ancestor is selected. + * + * @param path check if the path is selected. + * @param digIn whether we will check its descendants. + * @return true if the path is selected. + */ + public boolean isPathSelected(TreePath path, boolean digIn) { + if (!digIn) + return super.isPathSelected(path); + + while (path != null && !super.isPathSelected(path)) { + path = path.getParentPath(); + } + return path != null; + } + + /** + * is path1 descendant of path2. + * + * @param path1 the first path + * @param path2 the second path + * @return true if the first path is the descendant of the second path. + */ + private boolean isDescendant(TreePath path1, TreePath path2) { + Object obj1[] = path1.getPath(); + Object obj2[] = path2.getPath(); + if (obj1.length < obj2.length) + return false; + for (int i = 0; i < obj2.length; i++) { + if (obj1[i] != obj2[i]) + return false; + } + return true; + } + + private boolean _fireEvent = true; + +// @SuppressWarnings({"RawUseOfParameterizedType"}) +// @Override + protected void notifyPathChange(Vector changedPaths, TreePath oldLeadSelection) { + if (_fireEvent) { + super.notifyPathChange(changedPaths, oldLeadSelection); + } + } + + /** + * Overrides the method in DefaultTreeSelectionModel to consider digIn mode. + * + * @param pPaths the tree paths to be selected. + */ +// @Override + public void setSelectionPaths(TreePath[] pPaths) { + if (!isDigIn() || selectionMode == TreeSelectionModel.SINGLE_TREE_SELECTION) { + super.setSelectionPaths(pPaths); + } + else { + clearSelection(); + addSelectionPaths(pPaths); + } + } + + /** + * Overrides the method in DefaultTreeSelectionModel to consider digIn mode. + * + * @param paths the tree paths to be added to selection paths. + */ + public void addSelectionPaths(TreePath[] paths) { + if (!isDigIn()) { + super.addSelectionPaths(paths); + return; + } + + boolean fireEventAtTheEnd = false; + if (isSingleEventMode() && _fireEvent) { + _fireEvent = false; + fireEventAtTheEnd = true; + } + + try { + // unselect all descendants of paths[] + List toBeRemoved = new ArrayList(); + for (int i = 0, plength = paths.length; i < plength; i++) { + TreePath path = paths[i]; + TreePath[] selectionPaths = getSelectionPaths(); + if (selectionPaths == null) + break; + for (int j = 0, splength = selectionPaths.length; j < splength; j++) { + TreePath selectionPath = selectionPaths[j]; + if (isDescendant(selectionPath, path)) + toBeRemoved.add(selectionPath); + } + } +// for (TreePath path : paths) { +// TreePath[] selectionPaths = getSelectionPaths(); +// if (selectionPaths == null) +// break; +// for (TreePath selectionPath : selectionPaths) { +// if (isDescendant(selectionPath, path)) +// toBeRemoved.add(selectionPath); +// } +// } + if (toBeRemoved.size() > 0) { + delegateRemoveSelectionPaths((TreePath[]) toBeRemoved.toArray(new TreePath[toBeRemoved.size()])); + } + + // if all siblings are selected then unselect them and select parent recursively + // otherwize just select that path. +// for (TreePath path : paths) { + for (int i = 0, length = paths.length; i < length; i++) { + TreePath path = paths[i]; + TreePath temp = null; + while (areSiblingsSelected(path)) { + temp = path; + if (path.getParentPath() == null) + break; + path = path.getParentPath(); + } + if (temp != null) { + if (temp.getParentPath() != null) { + addSelectionPath(temp.getParentPath()); + } + else { + if (!isSelectionEmpty()) { + removeSelectionPaths(getSelectionPaths()); + } + delegateAddSelectionPaths(new TreePath[]{temp}); + } + } + else { + delegateAddSelectionPaths(new TreePath[]{path}); + } + } + } + finally { + _fireEvent = true; + if (isSingleEventMode() && fireEventAtTheEnd) { + notifyPathChange(paths, true, paths[0]); + } + } + } + + /** + * tells whether all siblings of given path are selected. + * + * @param path the tree path + * @return true if the siblings are all selected. + */ + private boolean areSiblingsSelected(TreePath path) { + TreePath parent = path.getParentPath(); + if (parent == null) + return true; + Object node = path.getLastPathComponent(); + Object parentNode = parent.getLastPathComponent(); + + int childCount = _model.getChildCount(parentNode); + for (int i = 0; i < childCount; i++) { + Object childNode = _model.getChild(parentNode, i); + if (childNode == node) + continue; + TreePath childPath = parent.pathByAddingChild(childNode); + if (_tree != null && !_tree.isCheckBoxVisible(childPath)) + continue; + if (!isPathSelected(childPath)) { + return false; + } + } + return true; + } + +// @Override + public void removeSelectionPaths(TreePath[] paths) { + if (!isDigIn()) { + super.removeSelectionPaths(paths); + return; + } + + List toBeRemoved = new ArrayList(); +// for (TreePath path : paths) { + for (int i = 0, length = paths.length; i < length; i++) { + TreePath path = paths[i]; + if (path.getPathCount() == 1) { + toBeRemoved.add(path); + } + else { + toggleRemoveSelection(path); + } + } + if (toBeRemoved.size() > 0) { + delegateRemoveSelectionPaths((TreePath[]) toBeRemoved.toArray(new TreePath[toBeRemoved.size()])); + } + } + + /** + * If any ancestor node of given path is selected then unselect + * it and selection all its descendants except given path and descendants. + * Otherwise just unselect the given path + * + * @param path the tree path + */ + private void toggleRemoveSelection(TreePath path) { + boolean fireEventAtTheEnd = false; + if (isSingleEventMode() && _fireEvent) { + _fireEvent = false; + fireEventAtTheEnd = true; + } + + try { + Stack stack = new Stack(); + TreePath parent = path.getParentPath(); + while (parent != null && !isPathSelected(parent)) { + stack.push(parent); + parent = parent.getParentPath(); + } + if (parent != null) + stack.push(parent); + else { + delegateRemoveSelectionPaths(new TreePath[]{path}); + return; + } + + List toBeAdded = new ArrayList(); + while (!stack.isEmpty()) { + TreePath temp = (TreePath) stack.pop(); + TreePath peekPath = (TreePath) (stack.isEmpty() ? path : stack.peek()); + Object node = temp.getLastPathComponent(); + Object peekNode = peekPath.getLastPathComponent(); + int childCount = _model.getChildCount(node); + for (int i = 0; i < childCount; i++) { + Object childNode = _model.getChild(node, i); + if (childNode != peekNode) { + TreePath treePath = temp.pathByAddingChild(childNode); + if (_tree.isCheckBoxVisible(treePath) && _tree.isCheckBoxEnabled(treePath)) { + toBeAdded.add(treePath); + } + } + } + } + if (toBeAdded.size() > 0) { + delegateAddSelectionPaths((TreePath[]) toBeAdded.toArray(new TreePath[toBeAdded.size()])); + } + delegateRemoveSelectionPaths(new TreePath[]{parent}); + } + finally { + _fireEvent = true; + if (isSingleEventMode() && fireEventAtTheEnd) { + notifyPathChange(new TreePath[]{path}, false, path); + } + } + } + + public boolean isSingleEventMode() { + return _singleEventMode; + } + + /** + * Single event mode is a mode that always fires only one event when you select or unselect a tree node. + *

+ * Taking this tree as an example, + *

+ *

+     * A -- a
+     *    |- b
+     *    |- c
+     * 
+ * Case 1: Assuming b and c are selected at this point, you click on a. + *
+ *
    + *
  • In non-single event mode, you will get select-A, deselect-b and deselect-c three events + *
  • In single event mode, you will only get select-a. + *
+ *

+ * Case 2: Assuming none of the nodes are selected, you click on A. In this case, both modes result in the same behavior. + *

    + *
  • In non-single event mode, you will get only select-A event. + *
  • In single event mode, you will only get select-A too. + *
+ * Case 3: Assuming b and c are selected and now you click on A. + *
    + *
  • In non-single event mode, you will get select-A event as well as deselect-b and deselect-c event. + *
  • In single event mode, you will only get select-A. + *
+ * As you can see, single event mode will always fire the event on the nodes you select. However it doesn't reflect + * what really happened inside the selection model. So if you want to get + * a complete picture of the selection state inside selection model, you should use {@link #getSelectionPaths()} to find out. + * In non-single event mode, the events reflect what happened inside the selection model. So you can get a complete picture + * of the exact state without asking the selection model. The downside is it will generate too many events. With this option, you + * can decide which mode you want to use that is the best for your case. + *

+ * By default, singleEventMode is set to false to be compatible with the older versions that don't have this option. + * + * @param singleEventMode true or false. + */ + public void setSingleEventMode(boolean singleEventMode) { + _singleEventMode = singleEventMode; + } + + /** + * Notifies listeners of a change in path. changePaths should contain + * instances of PathPlaceHolder. + * + * @param changedPaths the paths that are changed. + * @param isNew is it a new path. + * @param oldLeadSelection the old selection. + */ + protected void notifyPathChange(TreePath[] changedPaths, boolean isNew, TreePath oldLeadSelection) { + int cPathCount = changedPaths.length; + boolean[] newness = new boolean[cPathCount]; + + for (int counter = 0; counter < cPathCount; counter++) { + newness[counter] = isNew; + } + + TreeSelectionEvent event = new TreeSelectionEvent + (this, changedPaths, newness, oldLeadSelection, leadPath); + + fireValueChanged(event); + } + + // do not use it for now + private boolean _batchMode = false; + + private boolean isBatchMode() { + return _batchMode; + } + + public void setBatchMode(boolean batchMode) { + _batchMode = batchMode; + if (!_batchMode) { + super.addSelectionPaths((TreePath[]) _toBeAdded.toArray(new TreePath[_toBeAdded.size()])); + _toBeAdded.clear(); + super.removeSelectionPaths((TreePath[]) _toBeRemoved.toArray(new TreePath[_toBeRemoved.size()])); + _toBeRemoved.clear(); + } + } + + private List _toBeAdded = new ArrayList(); + private List _toBeRemoved = new ArrayList(); + + private void delegateRemoveSelectionPaths(TreePath[] paths) { + if (!isBatchMode()) { + super.removeSelectionPaths(paths); + } + else { +// for (TreePath path : paths) { + for (int i = 0, length = paths.length; i < length; i++) { + TreePath path = paths[i]; + _toBeRemoved.add(path); + _toBeAdded.remove(path); + } + } + } + + private void delegateRemoveSelectionPath(TreePath path) { + if (!isBatchMode()) { + super.removeSelectionPath(path); + } + else { + _toBeRemoved.add(path); + _toBeAdded.remove(path); + } + + } + + private void delegateAddSelectionPaths(TreePath[] paths) { + if (!isBatchMode()) { + super.addSelectionPaths(paths); + } + else { +// for (TreePath path : paths) { + for (int i = 0, length = paths.length; i < length; i++) { + TreePath path = paths[i]; + _toBeAdded.add(path); + _toBeRemoved.remove(path); + } + } + } + + private void delegateAddSelectionPath(TreePath path) { + if (!isBatchMode()) { + super.addSelectionPath(path); + } + else { + _toBeAdded.add(path); + _toBeRemoved.remove(path); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/checkboxtree/NullLabel.java b/designer-base/src/com/fr/design/gui/itree/checkboxtree/NullLabel.java new file mode 100644 index 0000000000..0f6a3f0a5d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/checkboxtree/NullLabel.java @@ -0,0 +1,86 @@ +/* + * @(#)HollowLabel.java 7/12/2005 + * Modified by FineReport + * Copyright 2002 - 2005 JIDE Software Inc. All rights reserved. + */ +package com.fr.design.gui.itree.checkboxtree; + +import javax.swing.Icon; +import com.fr.design.gui.ilable.UILabel; + +/** + * This is part of the null-components. A null component doesn't have + * foreground, background or font value set. In the other words, the + * foreground, background and font value of null-component are null. + * But this doesn't mean getBackground(), getForeground() or getFont() + * will return null. According to {@link java.awt.Component#getBackground()}, + * {@link java.awt.Component#getForeground()} and {@link java.awt.Component#getFont()}, + * if the value is null, it will get the value from its parent. + * In the other words, if you add a null-component to JPanel, you can use + * JPanel to control the background, foreground and font of this null-component. + * The feature is very helpful if you want to make sure all components in a JPanel + * has the same background, foreground or font. + *

+ * We creates a few null-components. It doesn't cover all components. You can always + * create your own. All you need to do is this + *


+ * public class NullXxxComponent extends XxxComponent {
+ *     // all the constructors
+ * 

+ * public void updateUI() { + * super.updateUI(); + * clearAttribute(); + * } + *

+ * private void clearAttribute() { + * setFont(null); + * setBackground(null); + * // do not do this for UIButton since UIButton always paints button + * // content background. So it'd better to leave the foreground alone + * setForeground(null); + * } + * } + *

+ * + * @see NullPanel + * @see NullCheckBox + * @see NullJideButton + * @see NullButton + * @see NullRadioButton + */ +public class NullLabel extends UILabel { + public NullLabel() { + } + + public NullLabel(String text, Icon icon, int horizontalAlignment) { + super(text, icon, horizontalAlignment); + } + + public NullLabel(String text, int horizontalAlignment) { + super(text, horizontalAlignment); + } + + public NullLabel(String text) { + super(text); + } + + public NullLabel(Icon image, int horizontalAlignment) { + super(image, horizontalAlignment); + } + + public NullLabel(Icon image) { + super(image); + } + +// @Override + public void updateUI() { + super.updateUI(); + clearAttribute(); + } + + private void clearAttribute() { + setFont(null); + setBackground(null); + setForeground(null); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/checkboxtree/NullPanel.java b/designer-base/src/com/fr/design/gui/itree/checkboxtree/NullPanel.java new file mode 100644 index 0000000000..98555f50d8 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/checkboxtree/NullPanel.java @@ -0,0 +1,79 @@ +/* + * @(#)HollowPanel.java 7/12/2005 + * Modified by FineReport + * Copyright 2002 - 2005 JIDE Software Inc. All rights reserved. + */ +package com.fr.design.gui.itree.checkboxtree; + +import java.awt.LayoutManager; + +import javax.swing.JPanel; + +/** + * This is part of the null-components. A null component doesn't have + * foreground, background or font value set. In the other words, the + * foreground, background and font value of null-component are null. + * But this doesn't mean getBackground(), getForeground() or getFont() + * will return null. According to {@link java.awt.Component#getBackground()}, + * {@link java.awt.Component#getForeground()} and {@link java.awt.Component#getFont()}, + * if the value is null, it will get the value from its parent. + * In the other words, if you add a null-component to JPanel, you can use + * JPanel to control the background, foreground and font of this null-component. + * The feature is very helpful if you want to make sure all components in a JPanel + * has the same background, foreground or font. + *

+ * We creates a few null-components. It doesn't cover all components. You can always + * create your own. All you need to do is this + *


+ * public class NullXxxComponent extends XxxComponent {
+ *     // all the constructors
+ * 

+ * public void updateUI() { + * super.updateUI(); + * clearAttribute(); + * } + *

+ * private void clearAttribute() { + * setFont(null); + * setBackground(null); + * // do not do this for UIButton since UIButton always paints button + * // content background. So it'd better to leave the foreground alone + * setForeground(null); + * } + * } + *

+ * + * @see NullButton + * @see NullCheckBox + * @see NullJideButton + * @see NullLabel + * @see NullRadioButton + */ +public class NullPanel extends JPanel { + public NullPanel() { + } + + public NullPanel(boolean isDoubleBuffered) { + super(isDoubleBuffered); + } + + public NullPanel(LayoutManager layout) { + super(layout); + } + + public NullPanel(LayoutManager layout, boolean isDoubleBuffered) { + super(layout, isDoubleBuffered); + } + +// @Override + public void updateUI() { + super.updateUI(); + clearAttribute(); + } + + private void clearAttribute() { + setFont(null); + setBackground(null); + setForeground(null); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/checkboxtree/NullTristateCheckBox.java b/designer-base/src/com/fr/design/gui/itree/checkboxtree/NullTristateCheckBox.java new file mode 100644 index 0000000000..4e10b1a97f --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/checkboxtree/NullTristateCheckBox.java @@ -0,0 +1,76 @@ +/* + * @(#)NullTristateCheckBox.java 8/11/2005 + * Modified by FineReport + * Copyright 2002 - 2005 JIDE Software Inc. All rights reserved. + */ +package com.fr.design.gui.itree.checkboxtree; + +import javax.swing.Icon; + +/** + * This is part of the null-components. A null component doesn't have + * foreground, background or font value set. In the other words, the + * foreground, background and font value of null-component are null. + * But this doesn't mean getBackground(), getForeground() or getFont() + * will return null. According to {@link java.awt.Component#getBackground()}, + * {@link java.awt.Component#getForeground()} and {@link java.awt.Component#getFont()}, + * if the value is null, it will get the value from its parent. + * In the other words, if you add a null-component to JPanel, you can use + * JPanel to control the background, foreground and font of this null-component. + * The feature is very helpful if you want to make sure all components in a JPanel + * has the same background, foreground or font. + *

+ * We creates a few null-components. It doesn't cover all components. You can always + * create your own. All you need to do is this + *


+ * public class NullXxxComponent extends XxxComponent {
+ *     // all the constructors
+ * 

+ * public void updateUI() { + * super.updateUI(); + * clearAttribute(); + * } + *

+ * private void clearAttribute() { + * setFont(null); + * setBackground(null); + * // do not do this for UIButton since UIButton always paints button + * // content background. So it'd better to leave the foreground alone + * setForeground(null); + * } + * } + *

+ * + * @see NullPanel + * @see NullButton + * @see NullJideButton + * @see NullLabel + * @see NullRadioButton + */ +public class NullTristateCheckBox extends TristateCheckBox { + public NullTristateCheckBox() { + } + + public NullTristateCheckBox(String text) { + super(text); + } + + public NullTristateCheckBox(String text, State initial) { + super(text, initial); + } + + public NullTristateCheckBox(String text, Icon icon, State initial) { + super(text, icon, initial); + } + +// @Override + public void updateUI() { + clearAttribute(); + } + + private void clearAttribute() { + setFont(null); + setBackground(null); + setForeground(null); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/checkboxtree/TristateCheckBox.java b/designer-base/src/com/fr/design/gui/itree/checkboxtree/TristateCheckBox.java new file mode 100644 index 0000000000..1cdbd77efa --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/checkboxtree/TristateCheckBox.java @@ -0,0 +1,307 @@ +package com.fr.design.gui.itree.checkboxtree; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +import javax.swing.AbstractAction; +import javax.swing.ActionMap; +import javax.swing.ButtonGroup; +import javax.swing.ButtonModel; +import javax.swing.Icon; +import javax.swing.SwingUtilities; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.ActionMapUIResource; + +import com.fr.design.gui.icheckbox.UICheckBox; + +/** + * Maintenance tip - There were some tricks to getting this code + * working: + *

+ * 1. You have to overwite addMouseListener() to do nothing + * 2. You have to add a mouse event on mousePressed by calling + * super.addMouseListener() + * 3. You have to replace the UIActionMap for the keyboard event + * "pressed" with your own one. + * 4. You have to remove the UIActionMap for the keyboard event + * "released". + * 5. You have to grab focus when the next state is entered, + * otherwise clicking on the component won't get the focus. + * 6. You have to make a TristateDecorator as a button model that + * wraps the original button model and does state management. + * + * @author Dr. Heinz M. Kabutz + */ +public class TristateCheckBox extends UICheckBox { + /** + * This is a type-safe enumerated type + */ + public static class State { + private State() { + } + } + + public static final State NOT_SELECTED = new State(); + public static final State SELECTED = new State(); + public static final State DONT_CARE = new State(); + + private final TristateDecorator model; + + public TristateCheckBox(String text, Icon icon, State initial) { + super(text, icon); + // Add a listener for when the mouse is pressed + super.addMouseListener(new MouseAdapter() { +// @Override + public void mousePressed(MouseEvent e) { + grabFocus(); + model.setState(getNextState(model.getState())); + } + }); + // Reset the keyboard action map + ActionMap map = new ActionMapUIResource(); + map.put("pressed", new AbstractAction() { + public void actionPerformed(ActionEvent e) { + grabFocus(); + model.setState(getNextState(model.getState())); + } + }); + map.put("released", null); + SwingUtilities.replaceUIActionMap(this, map); + // set the model to the adapted model + model = new TristateDecorator(getModel()); + setModel(model); + setState(initial); + } + + public TristateCheckBox(String text, State initial) { + this(text, null, initial); + } + + public TristateCheckBox(String text) { + this(text, DONT_CARE); + } + + public TristateCheckBox() { + this(null); + } + + /** + * No one may add mouse listeners, not even Swing! + */ +// @Override + public void addMouseListener(MouseListener l) { + } + + /** + * Set the new state to either SELECTED, NOT_SELECTED or + * DONT_CARE. If state == null, it is treated as DONT_CARE. + */ + public void setState(State state) { + model.setState(state); + } + + /** + * Return the current state, which is determined by the + * selection status of the model. + */ + public State getState() { + return model.getState(); + } + +// @Override + public void setSelected(boolean b) { + if (b) { + setState(SELECTED); + } + else { + setState(NOT_SELECTED); + } + } + + /** + * Exactly which Design Pattern is this? Is it an Adapter, + * a Proxy or a Decorator? In this case, my vote lies with the + * Decorator, because we are extending functionality and + * "decorating" the original model with a more powerful model. + */ + private class TristateDecorator implements ButtonModel { + private final ButtonModel other; + + private TristateDecorator(ButtonModel other) { + this.other = other; + } + + private void setState(State state) { + if (state == NOT_SELECTED) { + other.setArmed(false); + setPressed(false); + setSelected(false); + } + else if (state == SELECTED) { + other.setArmed(false); + setPressed(false); + setSelected(true); + } + else { // either "null" or DONT_CARE + other.setArmed(true); + setPressed(true); + setSelected(true); + } + } + + /** + * The current state is embedded in the selection / armed + * state of the model. + *

+ * We return the SELECTED state when the checkbox is selected + * but not armed, DONT_CARE state when the checkbox is + * selected and armed (grey) and NOT_SELECTED when the + * checkbox is deselected. + */ + private State getState() { + if (isSelected() && !isArmed()) { + // normal black tick + return SELECTED; + } + else if (isSelected() && isArmed()) { + // don't care grey tick + return DONT_CARE; + } + else { + // normal deselected + return NOT_SELECTED; + } + } + + /** + * Filter: No one may change the armed status except us. + */ + public void setArmed(boolean b) { + } + + /** + * We disable focusing on the component when it is not + * enabled. + */ + public void setEnabled(boolean b) { + setFocusable(b); + other.setEnabled(b); + } + + /** + * All these methods simply delegate to the "other" model + * that is being decorated. + */ + public boolean isArmed() { + return other.isArmed(); + } + + public boolean isSelected() { + return other.isSelected(); + } + + public boolean isEnabled() { + return other.isEnabled(); + } + + public boolean isPressed() { + return other.isPressed(); + } + + public boolean isRollover() { + return other.isRollover(); + } + + public void setSelected(boolean b) { + other.setSelected(b); + } + + public void setPressed(boolean b) { + other.setPressed(b); + } + + public void setRollover(boolean b) { + other.setRollover(b); + } + + public void setMnemonic(int key) { + other.setMnemonic(key); + } + + public int getMnemonic() { + return other.getMnemonic(); + } + + public void setActionCommand(String s) { + other.setActionCommand(s); + } + + public String getActionCommand() { + return other.getActionCommand(); + } + + public void setGroup(ButtonGroup group) { + other.setGroup(group); + } + + public void addActionListener(ActionListener l) { + other.addActionListener(l); + } + + public void removeActionListener(ActionListener l) { + other.removeActionListener(l); + } + + public void addItemListener(ItemListener l) { + other.addItemListener(l); + } + + public void removeItemListener(ItemListener l) { + other.removeItemListener(l); + } + + public void addChangeListener(ChangeListener l) { + other.addChangeListener(l); + } + + public void removeChangeListener(ChangeListener l) { + other.removeChangeListener(l); + } + + public Object[] getSelectedObjects() { + return other.getSelectedObjects(); + } + } + + /** + * We rotate between NOT_SELECTED, SELECTED and DONT_CARE. Subclass can + * override this method to tell the check box what next state is. Here is + * the default implementation. + *

+     *   if (current == NOT_SELECTED) {
+     *       return SELECTED;
+     *   }
+     *   else if (current == SELECTED) {
+     *       return DONT_CARE;
+     *   }
+     *   else {
+     *       return NOT_SELECTED;
+     *   }
+     * 
+ */ + protected State getNextState(State current) { + if (current == NOT_SELECTED) { + return SELECTED; + } + else if (current == SELECTED) { + return DONT_CARE; + } + else /*if (current == DONT_CARE)*/ { + return NOT_SELECTED; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/filetree/AbstractFileTree.java b/designer-base/src/com/fr/design/gui/itree/filetree/AbstractFileTree.java new file mode 100644 index 0000000000..a56d8072b3 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/filetree/AbstractFileTree.java @@ -0,0 +1,105 @@ +package com.fr.design.gui.itree.filetree; + +import java.io.File; + +import javax.swing.JTree; +import javax.swing.event.TreeExpansionEvent; +import javax.swing.event.TreeExpansionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; + +import com.fr.general.ComparatorUtils; + +/** + * 文件结构树. + */ +public abstract class AbstractFileTree extends JTree implements TreeExpansionListener { + /** + * 列出所有的FileNode. + */ + public abstract FileDirectoryNode[] listFileNodes(DefaultMutableTreeNode currentTreeNode); + + /** + * 展开TreeNode. + */ + public boolean expandTreeNode(DefaultMutableTreeNode currentTreeNode) { + if (currentTreeNode.isLeaf()) { + return false; + } + + //判断第一个孩子节点. + DefaultMutableTreeNode flag = (DefaultMutableTreeNode) currentTreeNode.getFirstChild(); + if (flag == null) { // No flag + return false; + } + Object firstChildObj = flag.getUserObject(); + if (!(firstChildObj instanceof Boolean)) { + return false; // Already expanded + } + currentTreeNode.removeAllChildren(); //删除所有的节点. + + // 列出所有的子文件夹. + FileDirectoryNode[] fileNodes = listFileNodes(currentTreeNode); + // 如果所得为空,(此时 isDirectory是true 但是拿不到子文件 所以不应该展开文件夹) + // 或者文件夹中没有文件. + if ( fileNodes == null) { + return false; + } + for (int i = 0; i < fileNodes.length; i++) { + FileDirectoryNode tmpNameNode = fileNodes[i]; + + DefaultMutableTreeNode node = new DefaultMutableTreeNode(tmpNameNode); + currentTreeNode.add(node); + + // 如果是目录,需要添加子节点. + if (tmpNameNode.isDirectory()) { + // 如果有目录但是列不出子文件 就不添加子节点. + // 或者文件夹中没有子文件的 也不添加子节点.kt + FileDirectoryNode[] childFileNode = listFileNodes(node); + if (childFileNode != null ) { + node.add(new DefaultMutableTreeNode(Boolean.TRUE)); + } + } + } + + // 重新加载parentTreeNode. + ((DefaultTreeModel) this.getModel()).reload(currentTreeNode); +// this.expandPath(GUICoreUtils.getTreePath(currentTreeNode)); + + return true; + } + + protected DefaultMutableTreeNode getMutableTreeNode(TreePath path) { + return (DefaultMutableTreeNode) (path.getLastPathComponent()); + } + + public void treeExpanded(TreeExpansionEvent event) { + DefaultMutableTreeNode currentTreeNode = getMutableTreeNode(event.getPath()); + // 判断当前文件节点所得子文件为null时 不展开节点. + FileDirectoryNode[] fileNodes = listFileNodes(currentTreeNode); + if(fileNodes != null) { + this.expandTreeNode(currentTreeNode); + } + } + + public void treeCollapsed(TreeExpansionEvent event) { + } + + /** + * 是否是父子关系的文件. + */ + public static boolean isParentFile(File parentFile, File childFile) { + while (true) { + if (ComparatorUtils.equals(parentFile, childFile)) { + return true; + } + + childFile = childFile.getParentFile(); + if (childFile == null) { + break; + } + } + return false; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/filetree/ClassFileTree.java b/designer-base/src/com/fr/design/gui/itree/filetree/ClassFileTree.java new file mode 100644 index 0000000000..96523cdc9f --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/filetree/ClassFileTree.java @@ -0,0 +1,63 @@ +package com.fr.design.gui.itree.filetree; + +import java.io.File; + +import com.fr.file.filetree.FileNode; +import com.fr.file.filetree.IOFileNodeFilter; +import com.fr.stable.project.ProjectConstants; + +/* + * 显示Env下的classes目录下面的所有class文件 + */ +public class ClassFileTree extends EnvFileTree { + public ClassFileTree() { + super(ProjectConstants.CLASSES_NAME, null, new IOFileNodeFilter(new String[]{"class"})); + } + + /* + * 选中class + */ + public void setSelectedClassPath(String classPath) { + if(classPath == null || !classPath.endsWith(".class")) { + return; + } + + String[] dirs = classPath.split("\\."); + + StringBuffer sb = new StringBuffer(); + for(int i = 0; i < dirs.length; i++) { + if(i == dirs.length - 1) { + sb.append('.'); + } else if (i > 0) { + sb.append(File.separatorChar); + } + + sb.append(dirs[i]); + } + + this.selectPath(sb.toString()); + } + + /* + * 返回选中的Class的路径 + */ + public String getSelectedClassPath() { + FileNode fn = this.getSelectedFileNode(); + if(fn != null && !fn.isDirectory()) { + String envPath = fn.getEnvPath(); + + if(envPath.startsWith(ProjectConstants.CLASSES_NAME)) { + String resPath = envPath.substring(ProjectConstants.CLASSES_NAME.length() + 1); + + resPath = resPath.replaceAll("[/\\\\]", "."); + //marks:去掉.class后缀 + if (resPath.toLowerCase().endsWith(".class")) { + resPath = resPath.substring(0,resPath.length() - ".class".length()); + } + return resPath; + } + } + + return null; + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..9bbd53616b --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/filetree/EnvFileTree.java @@ -0,0 +1,362 @@ +package com.fr.design.gui.itree.filetree; + +import java.awt.*; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JTree; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; + +import com.fr.base.Env; +import com.fr.base.FRContext; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.gui.itree.refreshabletree.RefreshableJTree; +import com.fr.file.filetree.FileNode; +import com.fr.file.filetree.FileNodeFilter; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.stable.CoreConstants; +import com.fr.stable.StableUtils; + +/* + * 文件结构树. + */ +public class EnvFileTree extends RefreshableJTree { + + protected FileNodeFilter filter; + protected Env env; + protected String treeRootPath = ""; + protected String[] subPathes; + + public EnvFileTree() { + this(null, null); + } + + public EnvFileTree(String[] subPathes, FileNodeFilter filter) { + this("", subPathes, filter); + } + + public EnvFileTree(String treeRootPath, String[] subPathes, FileNodeFilter filter) { + super(new FileNode(treeRootPath, true)); + + this.setTreeRootPath(treeRootPath); + this.setFileNodeFilter(filter); + this.setSubPathes(subPathes); + + this.init(); + } + + private void setTreeRootPath(String path) { + if (path == null) { + path = ""; + } + + this.treeRootPath = path; + } + + public void setFileNodeFilter(FileNodeFilter filter) { + this.filter = filter; + } + + protected void init() { + this.putClientProperty("JTree.lineStyle", "Angled"); + + this.setCellRenderer(fileTreeCellRenderer); + + this.setRootVisible(false); + this.setShowsRootHandles(true); + this.setEditable(false); + } + + // CellRenderer + private DefaultTreeCellRenderer fileTreeCellRenderer = new DefaultTreeCellRenderer() { + + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, + boolean hasFocus) { + super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + ExpandMutableTreeNode treeNode = (ExpandMutableTreeNode) value; + Object userObj = treeNode.getUserObject(); + if (userObj instanceof FileNode) { + FileNode node = (FileNode) userObj; + String lock = node.getLock(); + String name = node.getName(); + if (lock != null && !node.getUserID().equals(lock)) { + name = name + Inter.getLocText("Locked"); + this.setIcon(FileTreeIcon.getIcon(node)); + }else { + this.setIcon(FileTreeIcon.getIcon(node, false)); + } + this.setText(name); + } else if (userObj == PENDING) { + this.setIcon(null); + this.setText(PENDING.toString()); + } + // 这里新建一个Label作为render是因为JTree在动态刷新的时候,节点上render画布的的宽度不会变,会使得一部分比较长的数据显示为"..." + UILabel label = new UILabel(); + label.setText(getText()); + label.setIcon(getIcon()); + this.setSize(label.getPreferredSize()); + Dimension dim = label.getPreferredSize(); + dim.height += 2; + this.setPreferredSize(dim); + this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); + this.setTextSelectionColor(Color.WHITE); + this.setBackgroundSelectionColor(UIConstants.FLESH_BLUE); + return this; + } + }; + + /* + * 在当前tree中选中currentPath + */ + public void selectPath(String currentPath) { + if (currentPath == null) { + return; + } + + DefaultTreeModel m_model = (DefaultTreeModel) this.getModel(); + ExpandMutableTreeNode treeNode = (ExpandMutableTreeNode) m_model.getRoot(); + for (int i = 0, len = treeNode.getChildCount(); i < len; i++) { + // 取出当前的childTreeNode,并append到searchingPath后面 + ExpandMutableTreeNode childTreeNode = (ExpandMutableTreeNode) treeNode.getChildAt(i); + + if (selectFilePath(childTreeNode, "", currentPath, m_model)) { + break; + } + } + + TreePath selectedTreePath = this.getSelectionPath(); + if (selectedTreePath != null) { + this.scrollPathToVisible(selectedTreePath); + } + } + + /* + * 在currentTreeNode下找寻filePath + * + * prefix + currentTreeNode.getName() = currentTreeNode所对应的Path + * + * 返回currentTreeNode下是否找到了filePath + */ + private boolean selectFilePath(ExpandMutableTreeNode currentTreeNode, String prefix, String filePath, DefaultTreeModel m_model) { + FileNode fileNode = (FileNode) currentTreeNode.getUserObject(); + String nodePath = fileNode.getName(); + String currentTreePath = prefix + nodePath; + + // 如果equals,说明找到了,不必再找下去了 + if (ComparatorUtils.equals(new File(currentTreePath), new File(filePath))) { + this.setSelectionPath(new TreePath(m_model.getPathToRoot(currentTreeNode))); + return true; + } // 如果当前路径是currentFilePath的ParnetFile,则expandTreeNode,并继续往下找 + else if (EnvFileTree.isParentFile(currentTreePath, filePath)) { + this.loadPendingChildTreeNode(currentTreeNode); + + prefix = currentTreePath + CoreConstants.SEPARATOR; + for (int i = 0, len = currentTreeNode.getChildCount(); i < len; i++) { + ExpandMutableTreeNode childTreeNode = (ExpandMutableTreeNode) currentTreeNode.getChildAt(i); + + if (selectFilePath(childTreeNode, prefix, filePath, m_model)) { + return true; + } + } + return false; + } + + return false; + } + + /* + * 求当前TreeNode下所有的FileNode. + */ + private FileNode[] listFileNodes(ExpandMutableTreeNode currentTreeNode) { + if (currentTreeNode == null) { + return new FileNode[0]; + } + + Object object = currentTreeNode.getUserObject(); + + if (object instanceof FileNode) { + return this.listFileNodes(((FileNode) object).getEnvPath()); + } + + return new FileNode[0]; + } + + /* + * 求filePath这个String,求其路径下面的所有的FileNode + */ + private FileNode[] listFileNodes(String filePath) { + FileNode[] res_fns = null; + + try { + res_fns = env == null ? new FileNode[0] : env.listFile(filePath); + } catch (Exception e) { + FRContext.getLogger().error(e.getMessage(), e); + } + + if (res_fns == null) { + res_fns = new FileNode[0]; + } + + // 用FileNodeFilter过滤一下 + if (filter != null) { + java.util.List t_list = new ArrayList(); + for (int i = 0; i < res_fns.length; i++) { + if (filter.accept(res_fns[i])) { + t_list.add(res_fns[i]); + } + } + + res_fns = t_list.toArray(new FileNode[t_list.size()]); + } + + Arrays.sort(res_fns, new FileNodeComparator()); + + return res_fns; + } + + /* + * 获取当前选中的FilePath的String,这个FilePath是需要拼起来的 + */ + public FileNode getSelectedFileNode() { + TreePath selectedTreePath = this.getSelectionPath(); + if (selectedTreePath == null) { + return null; + } + + ExpandMutableTreeNode currentTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + Object userObject = currentTreeNode.getUserObject(); + + if (userObject instanceof FileNode) { + return (FileNode) userObject; + } + + return null; + } + + /* + * 改变Env后,根据构造函数时设置的RootPathes,重新加载 + */ + public void refreshEnv(Env env) { + this.env = env; + + DefaultTreeModel m_model = (DefaultTreeModel) this.getModel(); + ExpandMutableTreeNode rootTreeNode = (ExpandMutableTreeNode) m_model.getRoot(); + rootTreeNode.removeAllChildren(); + + FileNode[] fns; + + // 如果rootPaths是null的话列出所有文件 + if (subPathes == null) { + fns = listFileNodes(this.treeRootPath); + } else { + // 重新加载新的FileDirectoryNode + fns = new FileNode[subPathes.length]; + for (int i = 0; i < subPathes.length; i++) { + fns[i] = new FileNode(StableUtils.pathJoin(new String[]{this.treeRootPath, subPathes[i]}), true); + } + } + + + ExpandMutableTreeNode[] sub_tree_node_array = fileNodeArray2TreeNodeArray(fns); + + for (int i = 0; i < sub_tree_node_array.length; i++) { + ExpandMutableTreeNode node = sub_tree_node_array[i]; + rootTreeNode.add(node); + } + + m_model.reload(rootTreeNode); + } + + /* + * 设置当前Tree的rootPathes + */ + private void setSubPathes(String[] subPathes) { + this.subPathes = subPathes; + } + + /** + * currentTreeNode下面如果是PENDING的节点,加载之... + */ + private void loadPendingChildTreeNode(ExpandMutableTreeNode currentTreeNode) { + if (currentTreeNode.isLeaf()) { + return; + } + + // 判断第一个孩子节点.UserObject是不是PENDING,如果是PENDING的话,需要重新加载这个TreeNode + ExpandMutableTreeNode flag = (ExpandMutableTreeNode) currentTreeNode.getFirstChild(); + if (flag == null || flag.getUserObject() != PENDING) { + return; + } + currentTreeNode.removeAllChildren(); // 删除所有的节点. + + ExpandMutableTreeNode[] children = loadChildTreeNodes(currentTreeNode); + for (ExpandMutableTreeNode c : children) { + currentTreeNode.add(c); + } + } + + /* + * 判断eTreeNode是否需要Refresh,可提前中止,返回true则表示提前中止,不需要Refresh + */ + protected boolean interceptRefresh(ExpandMutableTreeNode eTreeNode) { + Object userObject = eTreeNode.getUserObject(); + if (userObject instanceof FileNode && !((FileNode) userObject).isDirectory()) { + return true; + } + + return eTreeNode.getChildCount() == 1 && ((ExpandMutableTreeNode) eTreeNode.getFirstChild()).getUserObject() == PENDING; + } + + /* + * 得到treeNode的子节点ExpandMutableTreeNode的数组 + */ + protected ExpandMutableTreeNode[] loadChildTreeNodes(ExpandMutableTreeNode treeNode) { + FileNode[] fn_array = listFileNodes(treeNode); + + return fileNodeArray2TreeNodeArray(fn_array); + } + + /* + * 把FileNode[]转成ExpandMutableTreeNode[] + */ + private ExpandMutableTreeNode[] fileNodeArray2TreeNodeArray(FileNode[] fn_array) { + ExpandMutableTreeNode[] res = new ExpandMutableTreeNode[fn_array.length]; + for (int i = 0; i < res.length; i++) { + FileNode fn = fn_array[i]; + res[i] = new ExpandMutableTreeNode(fn); + if (fn.isDirectory()) { + res[i].add(new ExpandMutableTreeNode()); + } + } + + return res; + } + + /* + * 是否是父子关系的文件. + */ + private static boolean isParentFile(String parentFilePath, String childFilePath) { + File parentFile = new File(parentFilePath); + File childFile = new File(childFilePath); + + while (true) { + if (ComparatorUtils.equals(parentFile, childFile)) { + return true; + } + + childFile = childFile.getParentFile(); + if (childFile == null) { + break; + } + } + + return false; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/filetree/FileComparator.java b/designer-base/src/com/fr/design/gui/itree/filetree/FileComparator.java new file mode 100644 index 0000000000..f5ff0cc683 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/filetree/FileComparator.java @@ -0,0 +1,23 @@ +package com.fr.design.gui.itree.filetree; + +import java.util.Comparator; + +public class FileComparator implements Comparator { + + public int compare(java.io.File file1, java.io.File file2) { + if (file1.isDirectory()) { + if (file2.isDirectory()) { + return file1.getName().toLowerCase().compareTo(file2.getName().toLowerCase()); + } else { + return -1; + } + } else { + if (file2.isDirectory()) { + return 1; + } else { + return file1.getName().toLowerCase().compareTo(file2.getName().toLowerCase()); + } + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/filetree/FileDirectoryNode.java b/designer-base/src/com/fr/design/gui/itree/filetree/FileDirectoryNode.java new file mode 100644 index 0000000000..c43194ffa0 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/filetree/FileDirectoryNode.java @@ -0,0 +1,56 @@ +package com.fr.design.gui.itree.filetree; + +import java.io.File; + +/** + * 文件节点,用于存放文件的 name 和 isDirectory属性 + */ +public class FileDirectoryNode implements java.io.Serializable, Cloneable { + private String name; + private boolean isDirectory; + private boolean canRead; + + public FileDirectoryNode() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public void setCanRead(boolean canRead) { + this.canRead = canRead; + } + + public boolean isCanRead() { + return canRead; + } + + public boolean isDirectory() { + return isDirectory; + } + + public void setDirectory(boolean directory) { + isDirectory = directory; + } + + public String toString() { + return name; + } + + /** + * 从File产生 FileDirectoryNode. + */ + public static FileDirectoryNode createFileDirectoryNode(File file) { + FileDirectoryNode fileDirectoryNode = new FileDirectoryNode(); + + fileDirectoryNode.setName(file.getName()); + fileDirectoryNode.setDirectory(file.isDirectory()); + fileDirectoryNode.setCanRead(file.canRead()); + + return fileDirectoryNode; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/filetree/FileNodeComparator.java b/designer-base/src/com/fr/design/gui/itree/filetree/FileNodeComparator.java new file mode 100644 index 0000000000..a6608b6b54 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/filetree/FileNodeComparator.java @@ -0,0 +1,78 @@ +package com.fr.design.gui.itree.filetree; + +import java.util.Comparator; + +import com.fr.dav.LocalEnv; +import com.fr.file.filetree.FileNode; + +/** + * FileTreeNode compare... + * Directory is in the first. and normal file the in the last. + */ +public class FileNodeComparator implements Comparator { + // 正序还是倒序 + private boolean isReverse = false; + + public FileNodeComparator() { + this(false); + } + + public FileNodeComparator(boolean reverse) { + this.isReverse = reverse; + } + + /** + * This method should return > 0 if v1 is greater than v2, 0 if + * v1 is equal to v2, or < 0 if v1 is less than v2. + * It must handle null values for the comparison values. + * + * @param v1 comparison value. + * @param v2 comparison value. + * @return < 0, 0, or > 0 for v1v2. + */ + public int compare(FileNode nameNode1, FileNode nameNode2) { + int returnVal; + if (nameNode1.isDirectory()) { + if (nameNode2.isDirectory()) { + returnVal = nameNode1.getName().toLowerCase().compareTo(nameNode2.getName().toLowerCase()); + } else { + returnVal = -1; + } + } else { + if (nameNode2.isDirectory()) { + returnVal = 1; + } else { + returnVal=groupByFileType(nameNode1, nameNode2, 0); + } + } + if (isReverse) { + returnVal = 0 - returnVal; + } + return returnVal; + } + + /** + * 一个简单的递归判断算法 + * @param nameNode1 + * @param nameNode2 + * @param i + * @return + */ + private int groupByFileType(FileNode nameNode1, FileNode nameNode2, + int i) { + if(i< LocalEnv.FILE_TYPE.length){ + if(nameNode1.isFileType(LocalEnv.FILE_TYPE[i])) + if(nameNode2.isFileType(LocalEnv.FILE_TYPE[i])) + return nameNode1.getName().toLowerCase().compareTo(nameNode2.getName().toLowerCase()); + else + return-1; + else + if(nameNode2.isFileType(LocalEnv.FILE_TYPE[i])) + return 1; + else{ + return groupByFileType(nameNode1, nameNode2, i+1); + } + }else + return -1; + } + } \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/filetree/FileTreeIcon.java b/designer-base/src/com/fr/design/gui/itree/filetree/FileTreeIcon.java new file mode 100644 index 0000000000..83f31067fb --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/filetree/FileTreeIcon.java @@ -0,0 +1,274 @@ +package com.fr.design.gui.itree.filetree; + +import java.io.File; + +import javax.swing.Icon; +import javax.swing.UIManager; +import javax.swing.filechooser.FileSystemView; + +import com.fr.base.BaseUtils; +import com.fr.base.FRContext; +import com.fr.dav.LocalEnv; +import com.fr.design.icon.LockIcon; +import com.fr.file.filetree.FileNode; +import com.fr.stable.StableUtils; + +public class FileTreeIcon { + private FileTreeIcon() {} + + public static final Icon BLANK_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/blank.gif"); + + public static final Icon FOLDER_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/folder.png"); + public static final Icon FILE_IMAGE_ICON = UIManager.getIcon("FileView.fileIcon"); + + public static final Icon JAVA_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/javaFile.gif"); + public static final Icon CLASS_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/classFile.gif"); + public static final Icon JSP_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/jspFile.gif"); + public static final Icon JS_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/jsFile.gif"); + public static final Icon XML_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/xmlFile.gif"); + public static final Icon HTML_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/htmlFile.gif"); + public static final Icon JAR_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/jarFile.gif"); + public static final Icon GIF_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/gifFile.gif"); + public static final Icon JPG_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/jpgFile.gif"); + public static final Icon BMP_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/bmpFile.gif"); + public static final Icon CPT_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/cptFile.png"); + public static final Icon FRM_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/frm.png"); + public static final Icon CHT_FILE_IMAGE_ICON = BaseUtils.readIcon("/com/fr/design/images/gui/cht.png"); + + public static final LockIcon FOLDER_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/fold.png")); + public static final LockIcon FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/file.gif")); + + public static final LockIcon JAVA_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/javaFile.gif")); + public static final LockIcon CLASS_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/classFile.gif")); + public static final LockIcon JSP_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/jspFile.gif")); + public static final LockIcon ANT_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/antFile.gif")); + public static final LockIcon JS_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/jsFile.gif")); + public static final LockIcon XML_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/xmlFile.gif")); + public static final LockIcon HTML_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/htmlFile.gif")); + public static final LockIcon JAR_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/jarFile.gif")); + public static final LockIcon GIF_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/gifFile.gif")); + public static final LockIcon JPG_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/jpgFile.gif")); + public static final LockIcon BMP_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/bmpFile.gif")); + public static final LockIcon CPT_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/base/images/oem/cptlocked.png")); + public static final LockIcon FRM_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/frmlocked.png")); + public static final LockIcon CHT_FILE_LOCK_ICON = + new LockIcon(BaseUtils.readImage("/com/fr/design/images/gui/frmlocked.png")); + /** + * file types + */ + public static final String[] DEFAULT_ANT_FILE_TYPES = new String[]{"build.xml"}; + public static final String[] DEFAULT_JAVA_FILE_TYPES = new String[]{".java"}; + public static final String[] DEFAULT_CLASS_FILE_TYPES = new String[]{".class"}; + public static final String[] DEFAULT_JSP_FILE_TYPES = new String[]{".jsp", ".jspf", ".jsf"}; + public static final String[] DEFAULT_HTML_FILE_TYPES = new String[]{".html", ".htm"}; + public static final String[] DEFAULT_JS_FILE_TYPES = new String[]{".js"}; + public static final String[] DEFAULT_XML_FILE_TYPES = new String[]{".xml", ".xsl"}; + public static final String[] DEFAULT_TEXT_FILE_TYPES = new String[]{ + ".properties", ".txt", ".cmd", ".bat", ".sh"}; + //file types. + public final static int JAVA_FILE = 0; //.java + public final static int JSP_FILE = 1; //.jsp, .jspf, .jsf + public final static int HTML_FILE = 2; //.html, .htm + public final static int JS_FILE = 3; //.js + public final static int XML_FILE = 4; //.xml, .xsl, .dtd, .tld + public final static int TEXT_FILE = 5; //.properties, .txt, cmd, bat, sh + public final static int CLASS_FILE = 6; //.class + public final static int ZIP_FILE = 7; //.jar, .zip, .war, .ear + public final static int GIF_FILE = 8; //.gif + public final static int JPG_FILE = 9; //.jpg + public final static int BMP_FILE = 10; //.bmp + public final static int CPT_FILE = 11; //.cpt + public final static int FRM_FILE = 12; //.form .frm + public final static int CHT_FILE = 13; //.chart .cht + + public static Icon getIcon(File file) { + return FileTreeIcon.getIcon(file, false); + } + + public static Icon getIcon(File file, boolean isLocked) { + if (file.isDirectory()) { + if (isLocked) { + return FOLDER_LOCK_ICON; + } else { + return FOLDER_IMAGE_ICON; + } + } + + return FileTreeIcon.getIcon(FileTreeIcon.getFileType(file.getName()), isLocked); + } + + public static Icon getIcon(FileNode node) { + return getIcon(node, node.getLock() != null); + } + + public static Icon getIcon(FileNode node, boolean isShowLock) { + String path = StableUtils.pathJoin(new String[]{FRContext.getCurrentEnv().getPath(), node.getEnvPath()}); + if (FRContext.getCurrentEnv() instanceof LocalEnv) { + File ff = new File(path); + if (ff.exists()) { + if(node.isDirectory()){ + return FileTreeIcon.FOLDER_IMAGE_ICON; + } + return FileSystemView.getFileSystemView().getSystemIcon(new File(path)); + } + } + if(node.isDirectory()) { + return FileTreeIcon.FOLDER_IMAGE_ICON; + } else { + return FileTreeIcon.getIcon(FileTreeIcon.getFileType(node.getName()), isShowLock); + } + } + + private static Icon getIcon(int fileType, boolean isLocked) { + if (fileType == JAVA_FILE) { + if (isLocked) { + return FileTreeIcon.JAVA_FILE_LOCK_ICON; + } else { + return FileTreeIcon.JAVA_FILE_IMAGE_ICON; + } + } else if (fileType == CLASS_FILE) { + if (isLocked) { + return FileTreeIcon.CLASS_FILE_LOCK_ICON; + } else { + return FileTreeIcon.CLASS_FILE_IMAGE_ICON; + } + } else if (fileType == JSP_FILE) { + if (isLocked) { + return FileTreeIcon.JSP_FILE_LOCK_ICON; + } else { + return FileTreeIcon.JSP_FILE_IMAGE_ICON; + } + } else if (fileType == XML_FILE) { + if (isLocked) { + return FileTreeIcon.XML_FILE_LOCK_ICON; + } else { + return FileTreeIcon.XML_FILE_IMAGE_ICON; + } + } else if (fileType == HTML_FILE) { + if (isLocked) { + return FileTreeIcon.HTML_FILE_LOCK_ICON; + } else { + return FileTreeIcon.HTML_FILE_IMAGE_ICON; + } + } else if (fileType == JS_FILE) { + if (isLocked) { + return FileTreeIcon.JS_FILE_LOCK_ICON; + } else { + return FileTreeIcon.JS_FILE_IMAGE_ICON; + } + } else if (fileType == ZIP_FILE) { + if (isLocked) { + return FileTreeIcon.JAR_FILE_LOCK_ICON; + } else { + return FileTreeIcon.JAR_FILE_IMAGE_ICON; + } + } else if (fileType == GIF_FILE) { //gif + if (isLocked) { + return FileTreeIcon.GIF_FILE_LOCK_ICON; + } else { + return FileTreeIcon.GIF_FILE_IMAGE_ICON; + } + } else if (fileType == JPG_FILE) { //jpg + if (isLocked) { + return FileTreeIcon.JPG_FILE_LOCK_ICON; + } else { + return FileTreeIcon.JPG_FILE_IMAGE_ICON; + } + } else if (fileType == BMP_FILE) { //bmp + if (isLocked) { + return FileTreeIcon.BMP_FILE_LOCK_ICON; + } else { + return FileTreeIcon.BMP_FILE_IMAGE_ICON; + } + } else if (fileType == CPT_FILE) { //cpt + if (isLocked) { + return FileTreeIcon.CPT_FILE_LOCK_ICON; + } else { + return FileTreeIcon.CPT_FILE_IMAGE_ICON; + } + } else if (fileType == FRM_FILE) { //form frm + if (isLocked) { + return FileTreeIcon.FRM_FILE_LOCK_ICON; + } else { + return FileTreeIcon.FRM_FILE_IMAGE_ICON; + } + } else if (fileType == CHT_FILE) { //chart cht + if (isLocked) { + return FileTreeIcon.CHT_FILE_LOCK_ICON; + } else { + return FileTreeIcon.CHT_FILE_IMAGE_ICON; + } + } else { + if (isLocked) { + return FileTreeIcon.FILE_LOCK_ICON; + } else { + return FileTreeIcon.FILE_IMAGE_ICON; + } + } + } + + /** + * Gets file type according to file name. + */ + public static int getFileType(String fileName) { + fileName = fileName.toLowerCase(); //to lower case in the first. + for (int i = 0; i < DEFAULT_JAVA_FILE_TYPES.length; i++) { + if (fileName.endsWith(DEFAULT_JAVA_FILE_TYPES[i])) { + return JAVA_FILE; + } + } + for (int i = 0; i < DEFAULT_JSP_FILE_TYPES.length; i++) { + if (fileName.endsWith(DEFAULT_JSP_FILE_TYPES[i])) { + return JSP_FILE; + } + } + for (int i = 0; i < DEFAULT_HTML_FILE_TYPES.length; i++) { + if (fileName.endsWith(DEFAULT_HTML_FILE_TYPES[i])) { + return HTML_FILE; + } + } + for (int i = 0; i < DEFAULT_XML_FILE_TYPES.length; i++) { + if (fileName.endsWith(DEFAULT_XML_FILE_TYPES[i])) { + return XML_FILE; + } + } + if (fileName.endsWith(".class")) { + return CLASS_FILE; + } else if (fileName.endsWith(".jar") || fileName.endsWith(".zip")) { + return ZIP_FILE; + } else if( fileName.endsWith(".ear") || fileName.endsWith(".war")){ + return ZIP_FILE; + }else if (fileName.endsWith(".gif")) { + return GIF_FILE; + } else if (fileName.endsWith(".jpg") || fileName.endsWith(".jpe")) { + return JPG_FILE; + } else if( fileName.endsWith(".jpeg")){ + return JPG_FILE; + }else if (fileName.endsWith(".bmp")) { + return BMP_FILE; + } else if (fileName.endsWith(".cpt")) { + return CPT_FILE; + } else if (fileName.endsWith(".frm") || fileName.endsWith(".form")){ + return FRM_FILE; + } else if (fileName.endsWith(".cht") || fileName.endsWith(".chart")){ + return CHT_FILE; + } else { + return TEXT_FILE; + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/filetree/JFileTree.java b/designer-base/src/com/fr/design/gui/itree/filetree/JFileTree.java new file mode 100644 index 0000000000..266dbf1870 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/filetree/JFileTree.java @@ -0,0 +1,324 @@ +package com.fr.design.gui.itree.filetree; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Font; +import java.io.File; +import java.io.FileFilter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Stack; + +import javax.swing.Icon; +import javax.swing.JTree; +import javax.swing.filechooser.FileSystemView; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; + +import com.fr.base.BaseUtils; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.stable.ArrayUtils; +import com.fr.stable.project.ProjectConstants; + + +/** + * File Tree. + */ +public class JFileTree extends AbstractFileTree { + protected FileFilter fileFilter ; + + public JFileTree() { + this(null); + } + + public JFileTree(FileFilter filter) { + this.init(filter); + } + + private void init(FileFilter filter) { + this.fileFilter = filter; + + DefaultTreeModel m_model = new DefaultTreeModel(new DefaultMutableTreeNode(Inter.getLocText("My_Computer"))); + this.setModel(m_model); + + this.putClientProperty("JTree.lineStyle", "Angled"); + + this.addTreeExpansionListener(this); + this.setCellRenderer(fileTreeCellRenderer); + + this.setRootVisible(false); + this.setShowsRootHandles(true); + this.setEditable(false); + } + + public void setRootFile(File rootFile) { + setRootFiles(new File[] { rootFile }); + } + + public void setRootFiles(File[] rootFiles) { + if (ArrayUtils.getLength(rootFiles) == 0) { + return; + } + + DefaultTreeModel m_model = (DefaultTreeModel) this.getModel(); + DefaultMutableTreeNode rootTreeNode = (DefaultMutableTreeNode) m_model.getRoot(); + rootTreeNode.removeAllChildren(); + + for (int k = 0; k < rootFiles.length; k++) { + DefaultMutableTreeNode node = new DefaultMutableTreeNode(new RootFile(rootFiles[k])); + rootTreeNode.add(node); + + if (rootFiles[k].isDirectory()) { + node.add(new DefaultMutableTreeNode(Boolean.TRUE)); + } + } + // richer:不是LocalEnv根本就不会运行到这儿 + m_model.reload(rootTreeNode); + + if (rootFiles.length == 1) { + File expandFile = rootFiles[0]; + this.selectFile(expandFile); + } + } + + public FileFilter getFileFilter() { + return fileFilter; + } + + public void setFileFilter(FileFilter fileFilter) { + this.fileFilter = fileFilter; + } + + public File getSelectedFile() { + TreePath selectedTreePath = this.getSelectionPath(); + if(selectedTreePath == null) { + return null; + } + + DefaultMutableTreeNode currentTreeNode = this.getMutableTreeNode(selectedTreePath); + StringBuffer fBuf = new StringBuffer(); + while (true) { + // 如果已经到了根节点,直接退出. + if (currentTreeNode == null) { + break; + } + + Object object = currentTreeNode.getUserObject(); + if (object instanceof RootFile) { + // 当前文件. + RootFile rootFileNode = (RootFile) object; + return new File(rootFileNode.getFile() + fBuf.toString()); + } + + FileDirectoryNode nameNode = (FileDirectoryNode) object; + fBuf.insert(0, nameNode.getName()); + fBuf.insert(0, "/"); + + // 逐层返回 + currentTreeNode = (DefaultMutableTreeNode) currentTreeNode.getParent(); + } + + return null; + } + + /** + * 通过文件夹寻找展开路径 + * @param currentFile 当前文件 + */ + public void selectFile(File currentFile) { + if (currentFile == null) { + return; + } + DefaultTreeModel m_model = (DefaultTreeModel) this.getModel(); + DefaultMutableTreeNode rootTreeNode = (DefaultMutableTreeNode) m_model.getRoot(); + int rootChildCount = rootTreeNode.getChildCount(); + for (int i = 0; i < rootChildCount; i++) { + DefaultMutableTreeNode rootChildTreeNode = (DefaultMutableTreeNode) rootTreeNode.getChildAt(i); + RootFile rootLocalFile = (RootFile) rootChildTreeNode.getUserObject(); + File rootFile = rootLocalFile.getFile(); + // 是父子关系,开始找孩子. + if (AbstractFileTree.isParentFile(rootFile, currentFile)) { + Stack nameStack = new Stack(); // 将所有的名字加入Stack. + while (true) { + if (ComparatorUtils.equals(rootFile, currentFile)) { + break; + } + nameStack.push(currentFile.getName()); + currentFile = currentFile.getParentFile(); + if (currentFile == null) { + break; + } + } + DefaultMutableTreeNode curChildTreeNode = rootChildTreeNode; + while (!nameStack.isEmpty()) { + String name = (String) nameStack.pop(); + this.expandTreeNode(curChildTreeNode); + for (int j = 0; j < curChildTreeNode.getChildCount(); j++) { + DefaultMutableTreeNode tmpChildTreeNode = + (DefaultMutableTreeNode) curChildTreeNode.getChildAt(j); + FileDirectoryNode tmpNameNode = (FileDirectoryNode) tmpChildTreeNode.getUserObject(); + if (ComparatorUtils.equals(name, tmpNameNode.getName())) { + curChildTreeNode = tmpChildTreeNode; + // 选择当前的节点. + this.setSelectionPath(new TreePath(m_model.getPathToRoot(curChildTreeNode))); + break; + } + } + } + break; + } + } + TreePath selectedTreePath = this.getSelectionPath(); + if (selectedTreePath != null) { + this.scrollPathToVisible(selectedTreePath); + } + } + + /** + * 列出当前所有的File + * @param currentTreeNode 当前文件节点 + * @return 当前节点下的所有File + */ + public FileDirectoryNode[] listFileNodes(DefaultMutableTreeNode currentTreeNode) { + StringBuffer fBuf = new StringBuffer(); + while (true) { + // 如果已经到了根节点,直接退出. + if (currentTreeNode == null) { + break; + } + Object object = currentTreeNode.getUserObject(); + if (object instanceof RootFile) { + RootFile rootFileNode = (RootFile) object; + // 当前文件. (rootFileNode + fBuf.toString = Path  local地址) + File currentFile = new File(rootFileNode.getFile() + fBuf.toString()); + // 列出当前文件的所有子文件,要判断下是否是系统保护的文件 能否打开. 打不开的话显示为null + File[] files = currentFile.listFiles(); + // 如果文件列表为null 或者为File[0] = []返回null + if (files == null ) { + return new FileDirectoryNode[0]; + } + List fileNodeList = new ArrayList(); + for (int k = 0; k < files.length; k++) { + File tmpFile = files[k]; + // 文件属性为隐藏的话 不放入列表 + if (tmpFile.isHidden()) { + continue; + } + // 过滤只显示文件夹 并进行 名字简化 + if (fileFilter.accept(tmpFile)) { + // newNode 传递 isDirectory属性 并且只显示文件夹名字 + FileDirectoryNode newNode = FileDirectoryNode.createFileDirectoryNode(tmpFile); + fileNodeList.add(newNode); + } + } + // 节点加入列表 + FileDirectoryNode[] fileNodes = new FileDirectoryNode[fileNodeList.size()]; + fileNodeList.toArray(fileNodes); + // 对文件夹进行排序 + Arrays.sort(fileNodes, new FileNodeComparator()); + return fileNodes; + } + // 名字进行逐层反序的回加. 例: Doload ==> C:\java\Doload ,返回到文件夹的path,因为有可能是String. 所以加上instanceof + if (object instanceof FileDirectoryNode) { + FileDirectoryNode nameNode = (FileDirectoryNode)object; + fBuf.insert(0, nameNode.getName()); + fBuf.insert(0, "/"); + } + // 逐层返回 + currentTreeNode = (DefaultMutableTreeNode) currentTreeNode.getParent(); + } + return new FileDirectoryNode[0]; + } + + /** + * cellRenderer: tree中显示文件的类型图标 + */ + private DefaultTreeCellRenderer fileTreeCellRenderer = new DefaultTreeCellRenderer() { + + public Component getTreeCellRendererComponent(JTree tree, Object value, + boolean selected, boolean expanded, boolean leaf, int row, + boolean hasFocus) { + super.getTreeCellRendererComponent(tree, value, selected, expanded, + leaf, row, hasFocus); + + DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value; + StringBuffer fBuf = new StringBuffer(); + while(true) { + if (treeNode == null) { + break; + } + Object userObj = treeNode.getUserObject(); + if (userObj instanceof RootFile) { + RootFile rootFileNode = (RootFile) userObj; + // 当前文件的全部路径. (rootFileNode + fBuf.toString = Path  local地址) + File currentFile = new File(rootFileNode.getFile() + fBuf.toString()); + FileSystemView view = FileSystemView.getFileSystemView(); + // File的全部路径. + // 得到本地tree图标 + Icon tmpIcon = view.getSystemIcon(currentFile); + if (currentFile.isDirectory() && fBuf.length() > 0) { + tmpIcon=BaseUtils.readIcon("/com/fr/design/images/gui/folder.png"); + } + this.setIcon(tmpIcon); + this.setName(null); + Font oldFont = this.getFont(); + if(ComparatorUtils.equals(currentFile.getName(), ProjectConstants.WEBINF_NAME)){ + this.setForeground(Color.blue); + this.setFont(new Font(oldFont.getName(),1,oldFont.getSize())); + }else{ + this.setFont(new Font(oldFont.getName(),0,oldFont.getSize())); + } + } + // 名字进行逐层反序的回加. 例: Doload ==> C:\java\Doload + if (userObj instanceof FileDirectoryNode ) { + FileDirectoryNode nameNode = (FileDirectoryNode)userObj; + fBuf.insert(0, nameNode.getName()); + fBuf.insert(0, "/"); + } + // 逐层往上 倒退返回 + treeNode = (DefaultMutableTreeNode) treeNode.getParent(); + } + return this; + } + }; + + /** + * 对文件夹进行排序 先文件夹 然后各种类型文件 + * @author kunsnat + */ + public class FileNodeComparator implements Comparator { + /** + * This method should return > 0 if v1 is greater than v2, 0 if + * v1 is equal to v2, or < 0 if v1 is less than v2. + * It must handle null values for the comparison values. + * 如上所述 + * + * @param v1 comparison value.值1 + * @param v2 comparison value.值2 + * @return < 0, 0, or > 0 for v1v2 .值1大于值2返回大于0,相等返回0,小于和大于相反 + */ + public int compare(Object v1, Object v2) { + FileDirectoryNode nameNode1 = (FileDirectoryNode) v1; + FileDirectoryNode nameNode2 = (FileDirectoryNode) v2; + + if (nameNode1.isDirectory()) { + if (nameNode2.isDirectory()) { + return nameNode1.getName().toLowerCase().compareTo(nameNode2.getName().toLowerCase()); + } else { + return -1; + } + } else { + if (nameNode2.isDirectory()) { + return 1; + } else { + return nameNode1.getName().toLowerCase().compareTo(nameNode2.getName().toLowerCase()); + } + } + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/filetree/ReportletPane.java b/designer-base/src/com/fr/design/gui/itree/filetree/ReportletPane.java new file mode 100644 index 0000000000..b98b8e200b --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/filetree/ReportletPane.java @@ -0,0 +1,136 @@ +package com.fr.design.gui.itree.filetree; + +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Font; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +import com.fr.base.Env; +import com.fr.base.FRContext; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.dialog.BasicPane; +import com.fr.file.filetree.IOFileNodeFilter; +import com.fr.general.Inter; +import com.fr.design.utils.gui.GUICoreUtils; + +public class ReportletPane extends BasicPane { + private TemplateFileTree templateReportletTree; + private JScrollPane t_panel; + private ClassFileTree classReportletTree; + private JScrollPane c_panel; + + private UIButton switchButton; + private CardLayout card; + private JPanel cardPane; + + public ReportletPane() { + this.setLayout(FRGUIPaneFactory.createM_BorderLayout()); + // Description + UITextArea textPane = new UITextArea(); + this.add(textPane, BorderLayout.NORTH); + textPane.setEditable(false); + textPane.setLineWrap(true); + + textPane.setFont(FRContext.getDefaultValues().getFRFont().deriveFont(Font.BOLD, 12)); + textPane.setText(Inter.getLocText("Schedule-The_selected_file_must_be_end_with_filter")); + + JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); + this.add(centerPane, BorderLayout.CENTER); + + switchButton = new UIButton("switch"); + centerPane.add(GUICoreUtils.createBorderPane(switchButton, BorderLayout.WEST), BorderLayout.NORTH); + switchButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + switchCardPane(t_panel.isVisible()); + } + }); + + cardPane = FRGUIPaneFactory.createCardLayout_S_Pane(); + centerPane.add(cardPane, BorderLayout.CENTER); + cardPane.setLayout(card = new CardLayout()); + templateReportletTree = new TemplateFileTree(); + IOFileNodeFilter filter = new IOFileNodeFilter(new String[]{".cpt", ".class",".frm",".form"}); + templateReportletTree.setFileNodeFilter(filter); + cardPane.add(t_panel = new JScrollPane(templateReportletTree), "TEMPLATE"); + classReportletTree = new ClassFileTree(); + cardPane.add(c_panel = new JScrollPane(classReportletTree), "CLASS"); + + this.refreshEnv(FRContext.getCurrentEnv()); + } + + /* + * 切换CardPane + */ + private void switchCardPane(boolean switch2Class) { + if (switch2Class) { + card.show(cardPane, "CLASS"); + switchButton.setText(Inter.getLocText("Utils-Switch_To_Template_Reportlet")); + } else { + card.show(cardPane, "TEMPLATE"); + switchButton.setText(Inter.getLocText("Utils-Switch_To_Class_Reportlet")); + } + } + + /** + * 检查是否符合规范 + * + * @throws Exception 抛错 + */ + public void checkValid() throws Exception { + String path = this.getSelectedReportletPath(); + if (path == null) { + throw new Exception(Inter.getLocText("Function-The_selected_file_cannot_be_null")); + } + } + + + /** + * 刷新Env + * @param env 环境 + */ + public void refreshEnv(Env env) { + this.templateReportletTree.refreshEnv(env); + this.classReportletTree.refreshEnv(env); + } + + @Override + protected String title4PopupWindow() { + return Inter.getLocText("Reportlet"); + } + + /* + * 返回选中的Reportlet的路径 + */ + public String getSelectedReportletPath() { + if (t_panel.isVisible()) { + return templateReportletTree.getSelectedTemplatePath(); + } else if (c_panel.isVisible()) { + return classReportletTree.getSelectedClassPath(); + } + + return null; + } + + /* + * 选中某Reportlet + */ + public void setSelectedReportletPath(String reportletPath) { + if (reportletPath == null) { + return; + } + + if (reportletPath.endsWith(".class")) { + switchCardPane(true); + classReportletTree.setSelectedClassPath(reportletPath); + } else { + switchCardPane(false); + templateReportletTree.setSelectedTemplatePath(reportletPath); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/filetree/RootFile.java b/designer-base/src/com/fr/design/gui/itree/filetree/RootFile.java new file mode 100644 index 0000000000..bca5a8616b --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/filetree/RootFile.java @@ -0,0 +1,28 @@ +package com.fr.design.gui.itree.filetree; + +import java.io.File; +/** + * 用于判断是否为根目录 + * 例: C:\ + * @author kunsnat + * + */ +public class RootFile { + private File file; + + public RootFile(File file) { + this.file = file; + } + + public File getFile() { + return file; + } + + public void setFile(File file) { + this.file = file; + } + + public String toString() { + return file.getAbsolutePath(); + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/filetree/TemplateFileTree.java b/designer-base/src/com/fr/design/gui/itree/filetree/TemplateFileTree.java new file mode 100644 index 0000000000..a90f25e893 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/filetree/TemplateFileTree.java @@ -0,0 +1,99 @@ +package com.fr.design.gui.itree.filetree; + +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.file.filetree.FileNode; +import com.fr.stable.ArrayUtils; +import com.fr.stable.project.ProjectConstants; + +import javax.swing.text.Position; +import javax.swing.tree.TreePath; +import java.util.ArrayList; +import java.util.List; + +/* + * 显示Env下的reportlets目录下面的所有cpt文件 + */ +public class TemplateFileTree extends EnvFileTree { + + + public TemplateFileTree() { + super(ProjectConstants.REPORTLETS_NAME, null, null); + } + + /* + * 选中reportPath + */ + public void setSelectedTemplatePath(String templatePath) { + this.selectPath(templatePath); + } + + /** + * 返回选中的Template的路径 + */ + public String getSelectedTemplatePath() { + FileNode fn = this.getSelectedFileNode(); + if (fn != null && !fn.isDirectory()) { + String envPath = fn.getEnvPath(); + + if (envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { + return envPath.substring(ProjectConstants.REPORTLETS_NAME.length()); + } + } + + return null; + } + + public String[] getSelectedTemplatePaths(){ + TreePath[] selectedTreePaths = this.getSelectionPaths(); + if (ArrayUtils.isEmpty(selectedTreePaths)) { + return ArrayUtils.EMPTY_STRING_ARRAY; + } + List selectedPathList = new ArrayList(); + for(TreePath treepath : selectedTreePaths){ + ExpandMutableTreeNode currentTreeNode = (ExpandMutableTreeNode) treepath.getLastPathComponent(); + Object userObject = currentTreeNode.getUserObject(); + if (userObject instanceof FileNode) { + FileNode fn = (FileNode) userObject; + if (!fn.isDirectory()) { + String envPath = fn.getEnvPath(); + if (envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { + selectedPathList.add(envPath.substring(ProjectConstants.REPORTLETS_NAME.length())); + } + } + } + } + + + return selectedPathList.toArray(new String[0]); + } + + public TreePath getNextMatch(String prefix, int startingRow, + Position.Bias bias) { + + int max = getRowCount(); + if (prefix == null) { + throw new IllegalArgumentException(); + } + if (startingRow < 0 || startingRow >= max) { + throw new IllegalArgumentException(); + } + prefix = prefix.toUpperCase(); + + // start search from the next/previous element froom the + // selected element + int increment = (bias == Position.Bias.Forward) ? 1 : -1; + int row = startingRow; + do { + TreePath path = getPathForRow(row); + String text = convertValueToText( + path.getLastPathComponent(), isRowSelected(row), + isExpanded(row), true, row, false); + + if (text.toUpperCase().startsWith(prefix)) { + return path; + } + row = (row + increment + max) % max; + } while (row != startingRow); + return null; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/refreshabletree/ExpandMutableTreeNode.java b/designer-base/src/com/fr/design/gui/itree/refreshabletree/ExpandMutableTreeNode.java new file mode 100644 index 0000000000..bb7912517c --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/refreshabletree/ExpandMutableTreeNode.java @@ -0,0 +1,78 @@ +package com.fr.design.gui.itree.refreshabletree; + +import javax.swing.JTree; +import javax.swing.tree.DefaultMutableTreeNode; + +import com.fr.design.utils.gui.GUICoreUtils; + +/** + * Enhanced, expand state and get treepath from node. + */ +public class ExpandMutableTreeNode extends DefaultMutableTreeNode { + private boolean isExpanded = false; //the expend state + + //默认显示:“正在加载”,如需要显示tree,则传入相应userobject + public ExpandMutableTreeNode() { + this(RefreshableJTree.PENDING); + } + + public ExpandMutableTreeNode(Object userObject) { + this(userObject, false); + } + + public ExpandMutableTreeNode(Object userObject, boolean isExpanded) { + super(userObject); + this.setExpanded(isExpanded); + } + public boolean isExpanded() { + return this.isExpanded; + } + + public void setExpanded(boolean isExpanded) { + this.isExpanded = isExpanded; + } + + /** + * 展开所有Expanded为true的TreeNode + */ + public void expandCurrentTreeNode(JTree tree) { + if (this.isExpanded) { + tree.expandPath(GUICoreUtils.getTreePath(this)); + this.setExpanded(true); + + this.expandSubTreeNodes(tree); + } + } + + /** + * expand all children of TreeNode... + * the Tree, that node at. + */ + private void expandSubTreeNodes(JTree tree) { + if (!this.isExpanded()) { + return; + } + + //peter:扩展. + tree.expandPath(GUICoreUtils.getTreePath(this)); + this.setExpanded(true); + + int childCount = this.getChildCount(); + for (int i = 0; i < childCount; i++) { + ExpandMutableTreeNode childNode = (ExpandMutableTreeNode) this.getChildAt(i); + + if (childNode.isExpanded()) { + tree.expandPath(GUICoreUtils.getTreePath(childNode)); + childNode.setExpanded(true); + + childNode.expandSubTreeNodes(tree); + } + } + } + + public void addChildTreeNodes(ExpandMutableTreeNode[] newChildNodes) { + for (int i = 0; i < newChildNodes.length; i ++) { + this.add(newChildNodes[i]); + } + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java b/designer-base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java new file mode 100644 index 0000000000..841a25d26f --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTree.java @@ -0,0 +1,283 @@ +package com.fr.design.gui.itree.refreshabletree; + +import com.fr.design.constants.UIConstants; +import com.fr.design.gui.itooltip.UIToolTip; +import com.fr.design.gui.itree.checkboxtree.CheckBoxTree; +import com.fr.general.ComparatorUtils; +import com.fr.general.Inter; +import com.fr.general.NameObject; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import javax.swing.event.TreeExpansionEvent; +import javax.swing.event.TreeExpansionListener; +import javax.swing.event.TreeWillExpandListener; +import javax.swing.tree.*; +import java.awt.*; +import java.awt.event.MouseEvent; + +public abstract class RefreshableJTree extends CheckBoxTree { + private static final int WIDTH_BETWEEN_NODES = 20; //tree父子节点之间最左侧横向像素的差 + private Icon icon; + + public static final Object PENDING = new Object() { + + @Override + public String toString() { + return Inter.getLocText("Loading") + "..."; + } + }; + + public RefreshableJTree() { + this(null); + } + public boolean isCheckBoxVisible(TreePath path) { + return false; + } + public RefreshableJTree(Object rootObj) { + super(new DefaultTreeModel(new ExpandMutableTreeNode(rootObj))); + DefaultTreeModel model = (DefaultTreeModel) getModel(); + ExpandMutableTreeNode root = (ExpandMutableTreeNode) model.getRoot(); + root.setExpanded(true); + this.setRootVisible(false); + this.setBackground(UIConstants.TREE_BACKGROUND); + this.addTreeExpansionListener(expansion); + this.addTreeWillExpandListener(willExpand); + } + + private TreeExpansionListener expansion = new TreeExpansionListener() { + + @Override + public void treeCollapsed(TreeExpansionEvent event) { + TreePath treePath = event.getPath(); + if (treePath == null) { + return; + } + + ExpandMutableTreeNode treeNode = ((ExpandMutableTreeNode) treePath.getLastPathComponent()); + treeNode.setExpanded(false); + } + + @Override + public void treeExpanded(TreeExpansionEvent event) { + TreePath treePath = event.getPath(); + if (treePath == null) { + return; + } + + ExpandMutableTreeNode treeNode = ((ExpandMutableTreeNode) treePath.getLastPathComponent()); + treeNode.setExpanded(true); + } + }; + private TreeWillExpandListener willExpand = new TreeWillExpandListener() { + + @Override + public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException { + } + + @Override + public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException { + TreePath treePath = event.getPath(); + if (treePath == null) { + return; + } + + final ExpandMutableTreeNode treeNode = ((ExpandMutableTreeNode) treePath.getLastPathComponent()); + + if (treeNode.getChildCount() == 1 && ((ExpandMutableTreeNode) treeNode.getFirstChild()).getUserObject() == PENDING) { + //如果空文件夹是只有一个默认增加的正在加载的子节点,则不显示正在加载,就是空就行了 + new SwingWorker() { + + @Override + protected Long doInBackground() throws Exception { + long startTime = System.currentTimeMillis(); + ExpandMutableTreeNode[] nodes = RefreshableJTree.this.loadChildTreeNodes(treeNode); + for (int i = 0; i < nodes.length; i++) { + treeNode.add(nodes[i]); + } + DefaultTreeModel treeModel = (DefaultTreeModel) RefreshableJTree.this.getModel(); + // 主要耗时是用在了treeUI的渲染上了,所以把这个放到工作线程里面 + if (treeNode.getChildCount() >= 1 && ((ExpandMutableTreeNode) treeNode.getFirstChild()).getUserObject() == PENDING) { + treeNode.remove(0); + } + treeModel.nodeStructureChanged(treeNode); + long usedTime = System.currentTimeMillis() - startTime; + return usedTime; + } + + @Override + protected void done() { + RefreshableJTree.this.updateUI(); + // 恢复Tree的可用性 + RefreshableJTree.this.setEnabled(true); + } + + }.execute(); + } + } + }; + + /** + * @return + */ + public boolean isTemplateShowing() { + return ((ExpandMutableTreeNode) this.getModel().getRoot()).getChildCount() == 0 ? false : true; + } + + /* + * 刷新 + */ + public void refresh() { + refresh((ExpandMutableTreeNode) this.getModel().getRoot(), StringUtils.EMPTY); + } + + public void refreshChildByName(String childName) { + refresh((ExpandMutableTreeNode) this.getModel().getRoot(), childName); + } + + /* + * 刷新expandRoot节点下所有已打开的节点的UserObject,并打开isExpanded为true的TreeNode + */ + private void refresh(ExpandMutableTreeNode expandRoot, String childName) { + if (expandRoot == null) { + return; + } + refreshTreeNode(expandRoot, childName); + + // model.reload, then do expand treenode that isExpanded is true + ((DefaultTreeModel) this.getModel()).reload(expandRoot); + + // 展开所有isExpanded为true的TreeNode + expandRoot.expandCurrentTreeNode(this); + } + + /* + * 刷新eTreeNode下面所有的已完成过取数的非叶子节点的子叶内容UserObject + */ + protected void refreshTreeNode(ExpandMutableTreeNode eTreeNode, String childName) { + // 如果eTreeNode是未取数状态,不用expand + if (interceptRefresh(eTreeNode)) { + return; + } + + // 刷新当前eTreeNode下面的子节点的UserObject的数组 + ExpandMutableTreeNode[] new_nodes = loadChildTreeNodes(eTreeNode); + + /* + * 保存下当前eTreeNode下的ChildTreeNode于childTreeNodeList 移除所有ChildTreeNode + * 根据childUserObjects与childTreeNodeList的比对,重新构建eTreeNode + */ + java.util.List childTreeNodeList = new java.util.ArrayList(); + for (int i = 0, len = eTreeNode.getChildCount(); i < len; i++) { + if (eTreeNode.getChildAt(i) instanceof ExpandMutableTreeNode) { + childTreeNodeList.add((ExpandMutableTreeNode) eTreeNode.getChildAt(i)); + } else { + childTreeNodeList.add((DefaultMutableTreeNode) eTreeNode.getChildAt(i)); + } + } + + eTreeNode.removeAllChildren(); + + for (int ci = 0; ci < new_nodes.length; ci++) { + Object cUserObject = new_nodes[ci].getUserObject(); + + for (int ni = 0, nlen = childTreeNodeList.size(); ni < nlen; ni++) { + ExpandMutableTreeNode cTreeNode = (ExpandMutableTreeNode) childTreeNodeList.get(ni); + if (ComparatorUtils.equals(cTreeNode.getUserObject(), cUserObject)) { + new_nodes[ci].setExpanded(cTreeNode.isExpanded()); + break; + } + } + + eTreeNode.add(new_nodes[ci]); + } + } + + /* + * 判断eTreeNode是否需要Refresh,可提前中止,返回true则表示提前中止,不需要Refresh + */ + protected abstract boolean interceptRefresh(ExpandMutableTreeNode eTreeNode); + + /* + * 得到treeNode的子节点ExpandMutableTreeNode的数组 + */ + protected abstract ExpandMutableTreeNode[] loadChildTreeNodes(ExpandMutableTreeNode treeNode); + + public NameObject getSelectedNameObject() { + TreePath selectedTreePath = this.getSelectionPath(); + if (selectedTreePath == null) { + return null; + } + + ExpandMutableTreeNode selectedTreeNode = (ExpandMutableTreeNode) selectedTreePath.getLastPathComponent(); + Object selectedUserObject = selectedTreeNode.getUserObject(); + if (selectedUserObject instanceof NameObject) { + return (NameObject) selectedUserObject; + } + + selectedTreeNode = (ExpandMutableTreeNode) selectedTreeNode.getParent(); + selectedUserObject = selectedTreeNode.getUserObject(); + if (selectedUserObject instanceof NameObject) { + return (NameObject) selectedUserObject; + } + return null; + } + + public String getToolTipText(MouseEvent event) { + String tip = null; + icon = new ImageIcon(); + + if (event != null) { + Point p = event.getPoint(); + int selRow = getRowForLocation(p.x, p.y); + TreeCellRenderer r = getCellRenderer(); + + if (selRow != -1 && r != null) { + int i = 0; //tree节点的级数 + TreePath path = getPathForRow(selRow); + Object lastPath = path.getLastPathComponent(); + if (lastPath instanceof TreeNode) { + TreeNode treeNode = (TreeNode) lastPath; + while (treeNode.getParent() instanceof TreeNode) { + i++; + treeNode = treeNode.getParent(); + } + } + Component rComponent = r.getTreeCellRendererComponent + (this, lastPath, isRowSelected(selRow), + isExpanded(selRow), getModel().isLeaf(lastPath), selRow, + true); + + if (r instanceof DefaultTreeCellRenderer && rComponent instanceof JComponent && rComponent.getPreferredSize().getWidth() + i * WIDTH_BETWEEN_NODES > getVisibleRect().getWidth()) { + tip = ((DefaultTreeCellRenderer) r).getText(); + icon = ((DefaultTreeCellRenderer) r).getIcon(); + } + } + } + if (tip == null) { + tip = getToolTipText(); + } + return tip; + } + + public Point getToolTipLocation(MouseEvent event) { + if (event != null) { + Point p = event.getPoint(); + int selRow = getRowForLocation(p.x, p.y); + TreeCellRenderer r = getCellRenderer(); + if (selRow != -1 && r != null) { + TreePath path = getPathForRow(selRow); + Rectangle pathBounds = getPathBounds(path); + return new Point(pathBounds.x - 2, pathBounds.y - 1); + } + } + return null; + } + + public JToolTip createToolTip() { + UIToolTip tip = new UIToolTip(icon); + tip.setComponent(this); + tip.setOpaque(false); + return tip; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTreeTest.java b/designer-base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTreeTest.java new file mode 100644 index 0000000000..36c18db7df --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/refreshabletree/RefreshableJTreeTest.java @@ -0,0 +1,85 @@ +package com.fr.design.gui.itree.refreshabletree; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Random; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.WindowConstants; +import javax.swing.tree.DefaultTreeModel; + +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.utils.gui.GUICoreUtils; + +public class RefreshableJTreeTest { + private static final Integer[][] ii = new Integer[][] { + new Integer[] {new Integer(0), new Integer(1), new Integer(2)}, + new Integer[] {new Integer(0), new Integer(2), new Integer(3)}, + new Integer[] {new Integer(6), new Integer(7), new Integer(1)}, + new Integer[] {new Integer(3), new Integer(4), new Integer(2)}, + new Integer[] {new Integer(4), new Integer(2), new Integer(3)} + }; + + public static void main(String[] args) { + JFrame frm = new JFrame("LOADING..."); + JPanel contentPane = (JPanel)frm.getContentPane(); + contentPane.setLayout(FRGUIPaneFactory.createBorderLayout()); + + final RefreshableJTree tree = new RefreshableJTree() { + + protected boolean interceptRefresh(ExpandMutableTreeNode eTreeNode) { + return eTreeNode.getChildCount() == 0 + || ((ExpandMutableTreeNode)eTreeNode.getFirstChild()).getUserObject() == PENDING; + } + + protected ExpandMutableTreeNode[] loadChildTreeNodes(ExpandMutableTreeNode treeNode) { + Object[] os = ii[new Random().nextInt(5)]; + ExpandMutableTreeNode[] res = new ExpandMutableTreeNode[os.length]; + for(int i = 0; i < os.length; i++) { + res[i] = new ExpandMutableTreeNode(os[i]); + } + + return res; + } + + }; + contentPane.add(new JScrollPane(tree), BorderLayout.CENTER); + + DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); + ExpandMutableTreeNode root = (ExpandMutableTreeNode)model.getRoot(); + root.removeAllChildren(); + + ExpandMutableTreeNode node001 = new ExpandMutableTreeNode(new Integer(0)); + root.add(node001); + node001.add(new ExpandMutableTreeNode("NODE0011")); + node001.add(new ExpandMutableTreeNode("NODE0012")); + node001.add(new ExpandMutableTreeNode("NODE0013")); + + ExpandMutableTreeNode node002 = new ExpandMutableTreeNode(new Integer(1)); + root.add(node002); + node002.add(new ExpandMutableTreeNode(RefreshableJTree.PENDING)); + + ExpandMutableTreeNode node003 = new ExpandMutableTreeNode(new Integer(2)); + root.add(node003); + + model.reload(root); + + UIButton btn = new UIButton("refresh"); + contentPane.add(GUICoreUtils.createFlowPane(btn, FlowLayout.LEFT), BorderLayout.NORTH); + btn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + tree.refresh(); + } + }); + + frm.setSize(600, 400); + frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + frm.setVisible(true); + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeDataCardPane.java b/designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeDataCardPane.java new file mode 100644 index 0000000000..51a3e03453 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeDataCardPane.java @@ -0,0 +1,55 @@ +package com.fr.design.gui.itree.refreshabletree; + +import java.awt.BorderLayout; + +import com.fr.general.NameObject; +import com.fr.data.impl.TreeAttr; +import com.fr.data.impl.TreeNodeAttr; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.layout.FRGUIPaneFactory; + + +public class TreeDataCardPane extends BasicBeanPane { + private NameObject no; + private TreeNodeAttr treeNodeAttr; + private TreeNodePane treeNodePane; + + public TreeDataCardPane() { + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + treeNodePane = new TreeNodePane(); + + } + + @Override + protected String title4PopupWindow() { + return "treedata"; + } + + @Override + public void populateBean(Object object) { + this.remove(treeNodePane); + if (object instanceof NameObject){ + this.no = (NameObject)object; + Object ob = this.no.getObject(); + if (ob instanceof TreeNodeAttr) { + this.treeNodeAttr = (TreeNodeAttr)ob; + this.add(treeNodePane, BorderLayout.CENTER); + treeNodePane.populateBean(treeNodeAttr); + } + } + validate(); + repaint(); + revalidate(); + } + + @Override + public Object updateBean() { + if (treeNodeAttr != null) { + if (this.isAncestorOf(treeNodePane) && treeNodePane.isVisible() && !(this.no.getObject() instanceof TreeAttr)) { + treeNodeAttr = treeNodePane.updateBean(); + this.no.setObject(treeNodeAttr); + } + } + return null; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeNodePane.java b/designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeNodePane.java new file mode 100644 index 0000000000..51f1fda7a0 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeNodePane.java @@ -0,0 +1,46 @@ +package com.fr.design.gui.itree.refreshabletree; + +import com.fr.data.Dictionary; +import com.fr.data.impl.TreeNodeAttr; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.present.dict.DictionaryPane; + +import java.awt.*; + +public class TreeNodePane extends BasicBeanPane { + + private DictionaryPane dataRadioPane; + + /* + * richer:树支节点数据设置面板 + */ + public TreeNodePane(){ + this.initComponents(); + } + + private void initComponents(){ + this.setLayout(FRGUIPaneFactory.createBorderLayout()); + dataRadioPane = new DictionaryPane(); + this.add(dataRadioPane, BorderLayout.CENTER); + + } + + @Override + protected String title4PopupWindow() { + return "tree"; + } + + public void populateBean(TreeNodeAttr treeNodeAttr){ + Dictionary dict = treeNodeAttr.getDictionary(); + dataRadioPane.populateBean(dict); + } + + public TreeNodeAttr updateBean(){ + TreeNodeAttr treeNodeAttr = new TreeNodeAttr(); + Dictionary mvList = this.dataRadioPane.updateBean(); + treeNodeAttr.setDictionary(mvList); + + return treeNodeAttr; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeRootPane.java b/designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeRootPane.java new file mode 100644 index 0000000000..d63db70cf5 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/refreshabletree/TreeRootPane.java @@ -0,0 +1,85 @@ +package com.fr.design.gui.itree.refreshabletree; + +import java.awt.Color; + +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import com.fr.design.gui.ilable.UILabel; +import javax.swing.JPanel; + +import com.fr.data.impl.TreeAttr; +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.dialog.BasicPane; +import com.fr.general.Inter; + +public class TreeRootPane extends BasicPane { + + // 是否支持多选(checkBoxTree) + //private JCheckBox multipleSelection; + private UICheckBox checkTypeCheckBox; + + // richer:加载的方式,支持异步加载和完全加载 + private UICheckBox loadTypeCheckBox; + + private UICheckBox layerTypeCheckBox; + + private UICheckBox returnFullPathCheckBox ; + + public TreeRootPane() { + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + JPanel checkTypePane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane_First0(); + checkTypePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + checkTypeCheckBox = new UICheckBox(Inter.getLocText("Tree-Mutiple_Selection_Or_Not")); + checkTypeCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + + checkTypePane.add(checkTypeCheckBox); + this.add(checkTypePane); + + JPanel loadTypePane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane_First0(); + checkTypePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + loadTypeCheckBox = new UICheckBox(Inter.getLocText("Widget-Load_By_Async")); + loadTypeCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + + loadTypePane.add(loadTypeCheckBox); + this.add(loadTypePane); + + JPanel leafSelectPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane_First0(); + checkTypePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + leafSelectPane.add(layerTypeCheckBox = new UICheckBox(Inter.getLocText("Tree-Select_Leaf_Only"))); + layerTypeCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + + this.add(leafSelectPane); + + JPanel returnFullPathPane = FRGUIPaneFactory.createBoxFlowInnerContainer_S_Pane_First0(); + checkTypePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + returnFullPathPane.add(returnFullPathCheckBox = new UICheckBox(Inter.getLocText("Tree-Return_Full_Path"))); + returnFullPathCheckBox.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + + this.add(returnFullPathPane); + + } + + @Override + protected String title4PopupWindow() { + return "tree"; + } + + public void populate(TreeAttr treeAttr) { + checkTypeCheckBox.setSelected(treeAttr.isMultipleSelection()); + loadTypeCheckBox.setSelected(treeAttr.isAjax()); + layerTypeCheckBox.setSelected(treeAttr.isSelectLeafOnly()); + returnFullPathCheckBox.setSelected(treeAttr.isReturnFullPath()); + } + + public TreeAttr update() { + TreeAttr treeAttr = new TreeAttr(); + treeAttr.setMultipleSelection(checkTypeCheckBox.isSelected()); + treeAttr.setAjax(loadTypeCheckBox.isSelected()); + treeAttr.setSelectLeafOnly(layerTypeCheckBox.isSelected()); + treeAttr.setReturnFullPath(returnFullPathCheckBox.isSelected()); + + return treeAttr; + } +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/refreshabletree/UserObjectOP.java b/designer-base/src/com/fr/design/gui/itree/refreshabletree/UserObjectOP.java new file mode 100644 index 0000000000..9747277483 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/refreshabletree/UserObjectOP.java @@ -0,0 +1,33 @@ +package com.fr.design.gui.itree.refreshabletree; + +import java.util.List; +import java.util.Map; + +import com.fr.design.gui.itree.refreshabletree.loader.ChildrenNodesLoader; + + +/** + * UserObjectRefreshJTree的操作 + * + * @editor zhou + * @since 2012-3-28下午9:49:31 + */ + +public interface UserObjectOP extends ChildrenNodesLoader { + + /* + * 初始化返回name, T键值对 + */ + public List> init(); + + /* + * ButtonEnabled intercept + */ + public boolean interceptButtonEnabled(); + + /* + * 移除名字是name的TableData + */ + public void removeAction(String name); + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/refreshabletree/UserObjectRefreshJTree.java b/designer-base/src/com/fr/design/gui/itree/refreshabletree/UserObjectRefreshJTree.java new file mode 100644 index 0000000000..bf0ca09335 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/refreshabletree/UserObjectRefreshJTree.java @@ -0,0 +1,168 @@ +package com.fr.design.gui.itree.refreshabletree; + +import com.fr.common.inputevent.InputEventBaseOnOS; +import com.fr.general.NameObject; +import com.fr.design.gui.itree.refreshabletree.loader.ChildrenLoaderFactory; +import com.fr.general.ComparatorUtils; +import com.fr.design.utils.gui.GUICoreUtils; + +import javax.swing.*; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +public abstract class UserObjectRefreshJTree> extends RefreshableJTree { + private static final long serialVersionUID = 8824111110910126977L; + private TreePath[] oldPaths; + private boolean isFind; + + public UserObjectRefreshJTree() { + super(); + this.putClientProperty("JTree.lineStyle", "Angled"); + this.setShowsRootHandles(true); + this.setRootVisible(false); + + // 改变选择模式是为了能拖动多个数据列 + this.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); + + // alex:选中多个节点的时候,当左键点击其中某节点时,还必须选中那多个节点 + this.addMouseListener(treeMouseListener); + } + + /* + * 判断eTreeNode是否需要Refresh,可提前中止,返回true则表示提前中止,不需要Refresh + */ + @Override + protected boolean interceptRefresh(ExpandMutableTreeNode eTreeNode) { + if (eTreeNode.getUserObject() instanceof UserObjectOP) { + return false; + } + return eTreeNode.getChildCount() == 0 || ((ExpandMutableTreeNode) eTreeNode.getFirstChild()).getUserObject() == PENDING; + } + + /** + * Populate + */ + public void populate(T userObject) { + DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel(); + ExpandMutableTreeNode root = (ExpandMutableTreeNode) treeModel.getRoot(); + root.setUserObject(userObject); + root.removeAllChildren(); + + ExpandMutableTreeNode[] children = loadChildTreeNodes(root); + for (int i = 0; i < children.length; i++) { + root.add(children[i]); + } + treeModel.reload(root); + root.expandCurrentTreeNode(this); + } + + @Override + protected ExpandMutableTreeNode[] loadChildTreeNodes(ExpandMutableTreeNode selectedTreeNode) { + Object userObj = selectedTreeNode.getUserObject(); + return ChildrenLoaderFactory.createChildNodesLoader(userObj).load(); + } + + /** + * 移掉根目录下的 + */ + public void removeNameObject(NameObject no) { + DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel(); + ExpandMutableTreeNode root = (ExpandMutableTreeNode) treeModel.getRoot(); + + for (int i = 0, len = root.getChildCount(); i < len; i++) { + ExpandMutableTreeNode childTreeNode = (ExpandMutableTreeNode) root.getChildAt(i); + + if (ComparatorUtils.equals(childTreeNode.getUserObject(), no)) { + root.remove(childTreeNode); + treeModel.reload(root); + break; + } + } + } + + /* + * 根据NameObject取TreePath + */ + public TreePath getTreePathByNameObject(NameObject nameObject) { + if (nameObject == null) { + return null; + } + + DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel(); + + // 新建一个放着NameObject的newChildTreeNode,加到Root下面 + ExpandMutableTreeNode root = (ExpandMutableTreeNode) treeModel.getRoot(); + + for (int i = 0, len = root.getChildCount(); i < len; i++) { + ExpandMutableTreeNode childTreeNode = (ExpandMutableTreeNode) root.getChildAt(i); + if (ComparatorUtils.equals(nameObject, childTreeNode.getUserObject())) { + return GUICoreUtils.getTreePath(childTreeNode); + } + } + + return null; + } + + /** + * 看一下名字是否重复 + */ + public boolean isNameRepeated(String name) { + DefaultTreeModel treeModel = (DefaultTreeModel) this.getModel(); + ExpandMutableTreeNode root = (ExpandMutableTreeNode) treeModel.getRoot(); + + for (int i = 0, len = root.getChildCount(); i < len; i++) { + ExpandMutableTreeNode childTreeNode = (ExpandMutableTreeNode) root.getChildAt(i); + Object userObject = childTreeNode.getUserObject(); + if (userObject instanceof NameObject && ((NameObject) userObject).getName().endsWith(name)) { + return true; + } + + } + + + return false; + } + + public void setSelectionPath(TreePath treePath) { + if (isFind) { + return; + } + super.setSelectionPath(treePath); + } + + protected MouseListener treeMouseListener = new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if (SwingUtilities.isLeftMouseButton(e)) { + TreePath path = getPathForLocation(e.getX(), e.getY()); + isFind = false; + if (path != null && oldPaths != null) { + for (int i = 0; i < oldPaths.length; i++) { + if (ComparatorUtils.equals(path, oldPaths[i])) { + isFind = true; + break; + } + } + } + // marks:鼠标在上次选中的paths上,则将上次的paths设为的树的路径,否则将鼠标所在的节点设为选中的节点 + if (!(e.isShiftDown() || InputEventBaseOnOS.isControlDown(e))) { + if (isFind) { + setSelectionPaths(oldPaths); + } else { + setSelectionPath(path); + } + } + } + } + + @Override + public void mouseReleased(MouseEvent e) { + if (SwingUtilities.isLeftMouseButton(e)) { + oldPaths = getSelectionPaths(); + } + } + }; +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenLoaderFactory.java b/designer-base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenLoaderFactory.java new file mode 100644 index 0000000000..e98d5c469d --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenLoaderFactory.java @@ -0,0 +1,17 @@ +package com.fr.design.gui.itree.refreshabletree.loader; + +import com.fr.general.NameObject; + +public abstract class ChildrenLoaderFactory { + + public static ChildrenNodesLoader createChildNodesLoader(Object obj) { + if (obj instanceof ChildrenNodesLoader) { + return (ChildrenNodesLoader) obj; + } else if (obj instanceof NameObject) { + return createChildNodesLoader(((NameObject) obj).getObject()); + } else { + return ChildrenNodesLoader.NULL; + } + } + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenNodesLoader.java b/designer-base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenNodesLoader.java new file mode 100644 index 0000000000..1961bf2999 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/itree/refreshabletree/loader/ChildrenNodesLoader.java @@ -0,0 +1,29 @@ +package com.fr.design.gui.itree.refreshabletree.loader; + +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; + + +/** + * 生成树上的子节点 + * + * @editor zhou + * @since 2012-3-28下午9:57:40 + */ +public interface ChildrenNodesLoader { + + /** + * 生成子节点 + * + * @return + */ + ExpandMutableTreeNode[] load(); + + public static ChildrenNodesLoader NULL = new ChildrenNodesLoader() { + + @Override + public ExpandMutableTreeNode[] load() { + return new ExpandMutableTreeNode[0]; + } + }; + +} \ No newline at end of file diff --git a/designer-base/src/com/fr/design/gui/style/AbstractBasicStylePane.java b/designer-base/src/com/fr/design/gui/style/AbstractBasicStylePane.java new file mode 100644 index 0000000000..3a7e491a96 --- /dev/null +++ b/designer-base/src/com/fr/design/gui/style/AbstractBasicStylePane.java @@ -0,0 +1,29 @@ +package com.fr.design.gui.style; + +import com.fr.base.Style; +import com.fr.design.beans.BasicBeanPane; + +/** + * + * @author zhou + * @since 2012-5-24下午1:42:53 + */ +public abstract class AbstractBasicStylePane extends BasicBeanPane